Professional Documents
Culture Documents
PHP 24 Ora Alatt PDF
PHP 24 Ora Alatt PDF
Matt Zandstra
Tanuljuk meg a PHP4 hasznlatt 24 ra alatt
000cimnegyed.qxd 8/3/2001 6:09 PM Page iii
Matt Zandstra
a
PHP4
hasznlatt
000cimnegyed.qxd 8/3/2001 6:09 PM Page iv
A szerzrl
Matt Zandstra (matt@corrosive.co.uk) a Corrosive Web Design cget vezeti
(http://www.corrosive.co.uk/) zleti partnervel, Max Guglielminval.
Mint a parancsnyelvekrt rajong programoz, PHP, Java, JavaScript, Perl, Lingo s
AppleScript nyelveken fejlesztett klnbz programokat. Elszr blcsszdiplomt
szerzett, majd gy tanulta ki mestersgt, hogy jra feltallta a kereket s kiele-
mezte, mirt nem halad egyenesen. HTML, JavaScript, Perl s PHP tanfolyamokon
oktatott, majd szerzknt kzremkdtt a Dynamic HTML Unleashed cm knyv-
ben. Amikor nem kdot r, Matt elktelezett vrosi biciklista, Guinness-iv, megszl-
lott olvas s novellista, aki kiadhatatlan trtneteket alkot. Azt lltja, egyszer taln
mg regnyt is fog rni.
000cimnegyed.qxd 8/3/2001 6:09 PM Page ix
Ksznetnyilvnts
A nylt forrskd programoknak ksznhetem karrieremet s e knyv ltrejttt
is. Szeretnm megksznni mindazoknak, akiknek nzetlen segtkszsge
mindig fellmlja a kapott elismerst.
ttekints
Bevezet
Trgymutat
002tartalom.qxd 8/3/2001 6:09 PM Page xiii
Tartalomjegyzk
Bevezet
2. ra A PHP teleptse . . . . . . . . . . . . . . . . . . . . 11
Opercis rendszerek, kiszolglk, adatbzisok . . . . . . . . . . . . . . 12
A PHP beszerzse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
A PHP 4 teleptse Apache webkiszolglt
hasznl Linuxra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
A configure nhny paramtere . . . . . . . . . . . . . . . . . . . . . . . . . . 14
--enable-track-vars . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
--with-gd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
--with-mysql . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Az Apache belltsa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
php.ini . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
002tartalom.qxd 8/3/2001 6:09 PM Page xiv
xiv
short_open_tag . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Hibajelentsek belltsai . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Vltozkra vonatkoz belltsok . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Segtsg! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
sszefoglals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
Krdsek s vlaszok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
Mhely . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Kvz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Feladatok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
4. ra Az alkotelemek . . . . . . . . . . . . . . . . . . . . 35
Vltozk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Dinamikus vltozk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Hivatkozsok a vltozkra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Adattpusok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Tpus mdostsa a settype() segtsgvel . . . . . . . . . . . . . . . . . . . . . 43
Tpus mdostsa tpustalaktssal . . . . . . . . . . . . . . . . . . . . . . . . . . 44
Mveletjelek s kifejezsek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Hozzrendels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
Aritmetikai mveletek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
sszefzs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
Tovbbi hozzrendel mveletek . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
sszehasonlts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
Bonyolultabb sszehasonlt kifejezsek ltrehozsa
logikai mveletek segtsgvel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
002tartalom.qxd 8/3/2001 6:09 PM Page xv
xv
5. ra Vezrlsi szerkezetek . . . . . . . . . . . . . . . . 57
Elgazsok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
Az if utasts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
Az if utasts else ga . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Az if utasts elseif ga . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
A switch utasts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
Ciklusok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
A while ciklus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
A do..while ciklus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
A for ciklus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
Ciklus elhagysa a break utasts segtsgvel . . . . . . . . . . . . . . . . . . 69
Kvetkez ismtls azonnali elkezdse
a continue utasts segtsgvel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
Egymsba gyazott ciklusok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
sszegzs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Krdsek s vlaszok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Mhely . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
Kvz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
Feladatok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
6. ra Fggvnyek . . . . . . . . . . . . . . . . . . . . . . . 75
Mit neveznk fggvnynek? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
Fggvnyek hvsa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
Fggvnyek ltrehozsa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
Fggvnyek visszatrsi rtke . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
Dinamikus fggvnyhvsok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
Vltozk hatkre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
Hozzfrs vltozkhoz a global kulcssz segtsgvel . . . . . . . . . . . 84
llapot megrzse a fggvnyhvsok kztt
a static kulcssz segtsgvel . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
Paramterek tovbbi tulajdonsgai . . . . . . . . . . . . . . . . . . . . . . . . 89
Paramterek alaprtelmezett rtke . . . . . . . . . . . . . . . . . . . . . . . . . . 89
002tartalom.qxd 8/3/2001 6:09 PM Page xvi
xvi
7. ra Tmbk . . . . . . . . . . . . . . . . . . . . . . . . . . 97
Mit neveznk tmbnek? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
Tmbk ltrehozsa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
Tmbk ltrehozsa az array() fggvny segtsgvel . . . . . . . . . . . . 99
Tmb ltrehozsa vagy elem hozzadsa a tmbhz
szgletes zrjel segtsgvel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
Asszociatv tmbk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
Asszociatv tmbk ltrehozsa
az array() fggvny segtsgvel . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
Asszociatv tmbk ltrehozsa
s elrse kzvetlen rtkadssal . . . . . . . . . . . . . . . . . . . . . . . . . . 101
Tbbdimenzis tmbk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
Tmbk elrse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
Tmb mretnek lekrdezse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
Tmb bejrsa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
Asszociatv tmb bejrsa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
Tbbdimenzis tmb bejrsa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
Mveletek tmbkkel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
Kt tmb egyestse az array_merge() fggvny segtsgvel . . . . . 110
Egyszerre tbb elem hozzadsa egy tmbhz
az array_push() fggvny segtsgvel . . . . . . . . . . . . . . . . . . . . . . 110
Az els elem eltvoltsa
az array_shift() fggvny segtsgvel . . . . . . . . . . . . . . . . . . . . . . . 112
Tmb rsznek kinyerse
az array_slice() fggvny segtsgvel . . . . . . . . . . . . . . . . . . . . . . . 113
Tmbk rendezse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
Szmmal indexelt tmb rendezse
a sort() fggvny segtsgvel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
Asszociatv tmb rendezse rtk szerint
az asort() fggvny segtsgvel . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
Asszociatv tmb rendezse kulcs szerint
a ksort() fggvny segtsgvel . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
sszegzs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
Krdsek s vlaszok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
Mhely . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
Kvz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
Feladatok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
002tartalom.qxd 8/3/2001 6:09 PM Page xvii
xvii
8. ra Objektumok . . . . . . . . . . . . . . . . . . . . . . 119
Mit neveznk objektumnak? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
Objektum ltrehozsa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
Objektumtulajdonsgok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
Az objektumok tagfggvnyei . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
Egy bonyolultabb plda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
Az osztly tulajdonsgai . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
A konstruktor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
Az ujSor() tagfggvny . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
Az ujNevesSor() tagfggvny . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
A kiir() tagfggvny . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
sszell a kp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
Ami mg hinyzik... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
Mirt hasznljunk osztlyt? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
rkls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
A szl tagfggvnyeinek fellrsa . . . . . . . . . . . . . . . . . . . . . . . . . 134
A fellrt tagfggvny meghvsa . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
Egy plda az rklsre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
A HTMLTablazat sajt tulajdonsgai . . . . . . . . . . . . . . . . . . . . . . . . . 137
A konstruktor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
A cellaMargoAllit() tagfggvny . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
A kiir() tagfggvny . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
A Tablazat s a HTMLTablazat osztlyok
a maguk teljessgben . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
Mirt alkalmazzunk rklst? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
sszegzs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
Krdsek s vlaszok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
Mhely . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
Kvz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
Feladatok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
9. ra rlapok . . . . . . . . . . . . . . . . . . . . . . . . . . 149
Globlis s krnyezeti vltozk . . . . . . . . . . . . . . . . . . . . . . . . . . 150
Adatok bekrse a felhasznltl . . . . . . . . . . . . . . . . . . . . . . . . 152
Tbb elem kivlasztsa a SELECT elemmel . . . . . . . . . . . . . . . . 153
Az rlap minden mezjnek
hozzrendelse egy tmbhz . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
Klnbsgek a GET s a POST tovbbts kztt . . . . . . . . . . . . 157
002tartalom.qxd 8/3/2001 6:09 PM Page xviii
xviii
xix
xx
xxi
xxii
xxiii
xxiv
xxv
Mhely . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 467
Kvz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 467
Feladatok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 467
Trgymutat
003bevezeto.qxd 8/3/2001 6:10 PM Page xxvii
Bevezet
Ez a knyv egy nylt forrskd webes parancsnyelvrl (szkriptrl), a PHP-rl
szl, amely csatlakozott a Perl-hz, az ASP-hez s a Javhoz a dinamikus webes
alkalmazsok ksztshez rendelkezsre ll nyelvek palettjn. A ktet progra-
mozsi ismeretekkel is foglalkozik. A rendelkezsre ll lapokon nem jut elg
hely egy teljes PHP programozsi tmutat kzlsre vagy a PHP sszes lehets-
gnek s eljrsnak ismertetsre, mindazonltal a knyvben tallhat lpsek
elg informcit adnak ahhoz, hogy hasznlni kezdhessk a PHP-t, akr rendel-
keznk programozi tapasztalttal, akr jak vagyunk a parancsnyelvek vilgban.
A PHP 4 webes programozsi nyelv. Ahhoz, hogy a lehet legtbb hasznt ve-
gyk a knyvnek, clszer nmi ismerettel rendelkezni a Vilghlval s a HTML-
lel kapcsolatban. Ha nem rendelkeznk ilyen ismeretekkel, akkor is hasznos lehet
e knyv, m meggondoland egy HTML ismertet beszerzse. Ha knyelmesen
ltre tudunk hozni egyszer HTML dokumentumokat tblzatokkal, akkor ele-
gend tudssal rendelkeznk.
Knyvnk szerkezete
Ktetnk ngy f rszbl ll:
Az els rsz az elstl a harmadik rig tart s egy egyszer parancsfjl futtatsig
vezeti el az olvast:
Bevezet xxix
I. RSZ
Az els lpsek
1. ra PHP: szemlyes honlaptl a portlig
2. ra A PHP teleptse
3. ra Els PHP oldalunk
01_ora.qxd 8/3/2001 6:10 PM Page 2
01_ora.qxd 8/3/2001 6:10 PM Page 3
1. RA
PHP: szemlyes honlaptl
a portlig
dvzlet a PHP vilgban! Ebben a knyvben vgigtekintjk a PHP nyelv majd-
nem minden elemt. Mieltt azonban rszletesebben megnznnk, mire lehetnk
kpesek segtsgvel, trjuk fel mltjt, fbb tulajdonsgait s jvjt.
Mi a PHP?
4 1. ra
Mi a PHP?
A PHP nyelv tlntt eredeti jelentsgn. Szletsekor csupn egy makrkszlet
volt, amely szemlyes honlapok karbantartsra kszlt. Innen ered neve is:
Personal Home Page Tools. Ksbb a PHP kpessgei kibvltek, gy egy nl-
lan hasznlhat programozsi nyelv alakult ki, amely kpes nagymret webes
adatbzis-alap alkalmazsok mkdtetsre is.
A PHP fejldse
A PHP els vltozatt amely nhny webalkalmazs-ksztst segt makrt tar-
talmazott Rasmus Lerdorf ksztette 1994-ben. Ezen eszkzket egyttesen
a Personal Home Page Tools nvvel azonostottk. Ksbb, a kd jrarsa utn,
egy friss elem kerlt a csomagba, a Form Interpreter (rlapfeldolgoz), gy
PHP/FI nven vlt ismertebb. A felhasznlk szemszgbl a PHP/FI nagyon
hasznos segdeszkz volt, gy npszersge tretlenl ntt. Tbb fejleszt is felfi-
gyelt r, gy 1997-re mr szmos programoz dolgozott rajta.
A PHP 4 jdonsgai
A PHP 4-es vltozata szmos a programozk lett megknnyt j szolglta-
tssal rendelkezik. Nzzk ezek kzl a legfontosabbakat:
6 1. ra
A Zend Engine
A PHP 3 ksztsekor az alapoktl indulva teljesen j feldolgozegysget rtak
a nyelvhez. A PHP 4-esben hasonl vltozs figyelhet meg a programokat futtat
magban, ez azonban jelentsebb.
A Zend Engine a PHP modulok mgtt tallhat, a programokat futtat mag elne-
vezse. Kifejezetten a teljestmny jelents nvelsre fejlesztettk ki.
Mirt a PHP?
Van nhny megcfolhatatlan rv, amirt a PHP 4-est rdemes vlasztani. Ha ms 1
programnyelveket is ismernk, szmos alkalmazs fejlesztse sorn szlelni fog-
juk, hogy a programozsi szakasz rezheten gyorsabb, mint vrnnk. A PHP,
mint nylt forrskd termk j tmogatssal rendelkezik, amit a kpzett fejleszti
grda s az elktelezett kzssg nyjt szmunkra. Radsul a PHP a legfontosabb
opercis rendszerek brmelyikn kpes futni, a legtbb kiszolglprogrammal
egyttmkdve.
A fejleszts sebessge
Mivel a PHP lehetsget ad a HTML elemek s a programkdok elklntsre,
az alkalmazsok fejlesztsekor lehetsg van elvlasztani a kdolsi, tervezsi, s
sszelltsi szakaszt. Ez jelentsen megknnyti a programozk lett, azzal, hogy
elmozdtja az akadlyokat a hatkony s rugalmas alkalmazsok kialaktsnak
tjbl.
8 1. ra
Teljestmny
A hatkony Zend Engine-nek ksznheten a PHP 4-es jl vizsgzik az ASP-vel
szemben vgzett mrseken, nhnyban megelzve azt. A lefordtott PHP messze
maga mgtt hagyja az ASP-t.
Hordozhatsg
A PHP-t alapveten gy terveztk, hogy alkalmas legyen szmos opercis rend-
szeren val hasznlatra, egyttmkdve klnbz kiszolglkkal s adatbzis-
kezelkkel. Fejleszthetnk UNIX rendszerre s ttrhetnk NT alapokra minden
problma nlkl. A PHP alkalmazsokat kiprblhatjuk Personal Web Serverrel s
ksbb telepthetjk azokat egy UNIX rendszerre, ahol a PHP-t Apache modulknt
hasznljuk.
sszefoglals
Ebben az rban bemutattuk a PHP-t. Lttuk, hogyan alakult t a nyelv egyszer
makrkszletbl hatkony programnyelvv. Megismertk a Zend Engine-t, s
megnztk, milyen j lehetsgeket teremt a PHP 4-es vltozatban. Vgl tte-
kintettnk nhny tulajdonsgot, amelyek ellenllhatatlann teszik a PHP-t.
Krdsek s vlaszok
Knny megtanulni a PHP nyelvet?
Rviden: igen! Valban meg lehet tanulni a PHP alapjait 24 rban! A PHP meg-
szmllhatatlanul sok fggvnyt bocst rendelkezsnkre, melyek megvalsts-
hoz ms nyelvekben sajt kdot kellene rni. A PHP automatikusan kezeli a kln-
bz adattpusokat s memriafoglalsokat (hasonlan a Perl-hz).
Mhely
A mhelyben kvzkrdsek tallhatk, melyek segtenek megszilrdtani az rban 1
szerzett tudst. A vlaszokat az A fggelkben helyeztk el.
Kvz
1. Mit jelentett eredetileg a PHP betsz?
Feladatok
1. A knyvet tlapozva annak felptse alaposabban szemgyre vehet.
Gondolkozzunk el a tmkon, s azon, hogyan segthetnek jvbeni
alkalmazsaink elksztsben.
02_ora.qxd 8/3/2001 6:10 PM Page 11
2.RA
A PHP teleptse
Mieltt megkezdennk az ismerkedst a PHP nyelvvel, be kell szereznnk, telep-
tennk s belltanunk a PHP-rtelmezt. A feldolgozprogram szmos opercis
rendszerre elrhet s tbb kiszolglval is kpes egyttmkdni.
12 2. ra
A PHP teleptse 13
A PHP beszerzse
A PHP 4-es vltozata a http://www.php.net/ cmrl tlthet le. Mivel a PHP
nylt forrskd, nem kell a bankkrtynkat kznl tartanunk, amikor letltjk
az rtelmezt. Magyarorszgon a http://hu.php.net/ tkrkiszolglt rde-
mes megltogatni.
A PHP 4 teleptse
Apache webkiszolglt hasznl Linuxra
Ebben a rszben vgigvezetnk egy PHP teleptst egy Apache webkiszolglt
hasznl Linux rendszeren. A folyamat tbb-kevsb ugyanez ms UNIX platfor-
mokon is. Elkpzelhet, hogy az ltalunk hasznlt rendszerre kszlt elre fordtott
vltozat is, gy mg egyszerbben telepthetnnk az rtelmezt, a PHP fordtsa
azonban nagyobb szabadsgot ad a feldolgozba kerl szolgltatsokat illeten.
/www/bin/httpd -l
02_ora.qxd 8/3/2001 6:10 PM Page 14
14 2. ra
Ha mg nem tettk meg, le kell tltennk a PHP legfrissebb vltozatt. A tar fjl
gzip-pel tmrtett, gy els lpsben ki kell csomagolnunk:
cd ../php-4.x.x
./configure --enable-track-vars \
--with-gd \
--with-mysql \
--with-apxs=/www/bin/apxs
make
make install
A PHP teleptse 15
./configure --help
Annak ellenre, hogy a fenti parancs kimenete elgg rthet, nhny fontos lehe-
tsget meg kell emltennk mgpedig azokat, amelyek a knyv szempontjbl
2
szmunkra rdekesek.
--enable-track-vars
Ez a szolgltats automatikusan ellltja szmunkra a PHP oldalakon kvlrl rke-
z adatokhoz tartoz asszociatv tmbket. Ezek a GET vagy POST krssel rkezett
adatok, a visszarkez sti-rtkek, a kiszolgli s krnyezeti vltozk. A tmbk-
kel a hetedik rban foglalkozunk bvebben, a HTTP kapcsolatokat a tizenharma-
dik rban rszletezzk. A fenti rendkvl gyakran hasznlt configure paramter,
mivel nagyon kellemes lehetsg a berkez adatok kvetsre. A PHP 4.0.2-es
vltozattl kezdve mindig be van kapcsolva, gy nem kell kln megadni.
--with-gd
A --with-gd paramter engedlyezi a GD knyvtr tmogatst. Amennyiben
a GD knyvtr teleptve van a rendszeren, ez a paramter lehetsget ad dinamikus
GIF, JPEG vagy PNG kpek ksztsre a PHP programokbl. A dinamikus kpek
ellltsrl a tizennegyedik rban runk. Ha a GD-t korbban nem az alapbell-
ts knyvtrba teleptettk, megadhat a szoksostl eltr elrsi t is:
--with-gd=/eleresi/ut/a/megfelelo/konyvtarhoz
--with-mysql
A --with-mysql engedlyezi a MySQL adatbzisok tmogatst. Ha a rendszeren
a MySQL nem az alapbellts knyvtrban tallhat, megadhat a szoksostl
eltr elrsi t is:
--with-mysql=/eleresi/ut/a/megfelelo/konyvtarhoz
16 2. ra
Az Apache belltsa
Miutn sikeresen lefordtottuk az Apache-t s a PHP-t, mdostanunk kell
az Apache belltsait tartalmaz httpd.conf fjlt. Ez az Apache knyvtrnak
conf alknyvtrban tallhat.
A kvetkez sorok hozzadsa szksges:
A PHP teleptse 17
php.ini
A PHP mkdst a fordts vagy telepts utn is befolysolhatjuk, a php.ini hasz-
nlatval. UNIX rendszereken az alapbellts knyvtr a php.ini fjl szmra
a /usr/local/lib, Windows rendszereken a Windows knyvtra. Emellett
a feldolgozsra kerl PHP oldal knyvtrban a munkaknyvtrban elhelye-
zett php.ini fjlban fellbrlhatjuk a korbban belltott rtkeket, gy akr
knyvtranknt klnbz belltsokat adhatunk meg.
A letlttt PHP csomag knyvtrban tallhat egy minta php.ini fjl, amely
a gyri belltsokat tartalmazza. Ezek az rtkek lpnek rvnybe akkor, ha
a PHP nem tall egy php.ini fjlt sem.
A php.ini fjl belltsai egy nvbl, egy egyenlsgjelbl s egy rtkbl ll-
nak. A szkzket a feldolgoz figyelmen kvl hagyja.
18 2. ra
short_open_tag
A short_open_tag bellts hatrozza meg, hogy hasznlhatjuk-e a rvid <?
kd ?> formt a PHP kdblokkok rsra. Ha ez ki van kapcsolva, az albbi sorok
valamelyikt lthatjuk:
short_open_tag = Off
short_open_tag = False
short_open_tag = No
short_open_tag = On
short_open_tag = True
short_open_tag = Yes
Hibajelentsek belltsai
Ha hibkat keresnk programjainkban, hasznos a hibazenetek kirsa a HTML
oldalba a bngsz szmra. Ez alapbelltsban bekapcsolt:
display_errors = On
Bellthatjuk a hibajelentsi szintet is. Ez azt jelenti, hogy mivel tbbfle hibazenet-
tpus is rendelkezsre ll, letilthatjuk egyik vagy msik tpust, amennyiben nem
szeretnnk PHP oldalaink kimenetben ltni az abba a csoportba tartoz hibkat.
A hibakezels belltsval alaposabban a huszonkettedik rban foglalkozunk,
addig az albbi rtkads tkletesen megfelel:
Ezzel a PHP minden hibt jelezni fog a lehetsges problmkat jell figyelmezte-
tsek kivtelvel. Ezek a figyelmeztetsek megakadlyoznk nhny szoksos
PHP mdszer alkalmazst, ezrt ez az alapbellts.
02_ora.qxd 8/3/2001 6:10 PM Page 19
A PHP teleptse 19
register_globals = On
Segtsg!
A segtsg mindig kznl van az Interneten, klnsen a nylt forrskd progra-
mokkal kapcsolatos problmk esetn. Ezrt mieltt a levelezprogramunk Klds
gombjt megnyomnnk, gondolkozzunk el egy kicsit. Akrmennyire is mkds-
kptelennek tnhet a teleptett rtelmeznk, belltsunk vagy programozsi megol-
dsunk, j eslynk van r, hogy nem vagyunk ezzel egyedl. Valaki taln mr
megvlaszolta krdsnket.
Ha falba tkznk, az els hely, ahol segtsget kereshetnk, a PHP hivatalos hon-
lapja a http://www.php.net/ cmen, klnsen az ott tallhat, olvasi kiegsz-
tsekkel elltott kziknyv: http://www.php.net/manual/. Sok segtsget s
informcit tallhatunk a Zend webhelyn is: http://www.zend.com/. A magyar
PHP fejlesztk a weblabor.hu webmester honlapon tallhatnak rengeteg informcit:
http://weblabor.hu/php/. Itt ksztjk a magyar PHP dokumentcit is.
Ha nem sikerlt megtallni a megoldst, hasznos segtsg lehet, hogy a PHP hivatalos
webhelyn keresst is vgezhetnk. A tancs, ami utn kutatunk, taln egy sajtkz-
lemnyben, vagy egy FAQ-fjlban rejtzik. Egy msik kitn forrs a PHP
Knowledge Base: http://www.faqts.com/knowledge-base/index.phtml.
Keress itt is vgezhet.
02_ora.qxd 8/3/2001 6:10 PM Page 20
20 2. ra
Amennyiben ezek utn is meg vagyunk gyzdve arrl, hogy problmnk mg nem
merlt fel korbban, j szolglatot tehetnk a PHP kzssgnek, ha felhvjuk r
a figyelmet.
Mirt kell ilyen sok szempontot figyelembe vennnk, mieltt egy levelezlistra
postznnk krdsnket? Elszr is a fejlesztsi problmk megoldsban szerzett
tapasztalat elnys lehet a ksbbi munka sorn. Egy tapasztalt programoz lta-
lban gyorsan s hatkonyan tud problmkat megoldani. Egy alapvet krds
feltevse technikai jelleg listn tbbnyire egy-kt olyan vlaszt eredmnyez,
amelyben felhvjk figyelmnket, hogy erre a krdsre az archvumban megtall-
hat a vlasz.
02_ora.qxd 8/3/2001 6:10 PM Page 21
A PHP teleptse 21
sszefoglals
A PHP 4 nylt forrskd. Nylt abban az rtelemben is, hogy nem szksges egy
meghatrozott kiszolglt, opercis rendszert vagy adatbzist hasznlnunk
a fejlesztshez. Ebben az rban lttuk, honnan szerezhet be a PHP s ms
a webhelyek szolgltatsaiban segt nylt forrskd programok. Megnztk,
hogyan fordthat le a PHP Apache modulknt Linux rendszeren. Ha nem a for-
rskdot tltjk le a hlzatrl, hanem egy lefordtott vltozatot, akkor a csomag-
ban rszletes informcikat tallunk a teleptssel kapcsolatban. ttekintettnk
nhny configure paramtert, melyekkel a feldolgoz kpessgeit befolysol-
hatjuk. Tanultunk a php.ini fjlrl s nhny belltsi lehetsgrl, amit meg-
adhatunk benne. Vgl megnztk, hol tallhatunk segtsget, ha problmink
akadnak. Ezzel kszen llunk arra, hogy megbirkzzunk a PHP nyelvvel.
Krdsek s vlaszok
A teleptst Apache webkiszolglt hasznl Linux opercis rendszeren
vezettk vgig. Ez azt jelenti, hogy a knyv nem megfelel ms rendszer
vagy kiszolglprogram hasznlata esetn?
A PHP egyik nagy erssge, hogy tbb rendszeren is kpes futni. Ha problmk
addnak az adott rendszeren a PHP teleptsvel, olvassuk el a csomagban tall-
hat dokumentcit s a PHP kziknyv megfelel fejezett. ltalban szles kr
lpsrl-lpsre lert utastsokat kapunk a teleptshez. Ha tovbbra sem sikerl
megoldani a problmt, a Segtsg! cm rszben ismertetett mdszerek clrave-
zetk lehetnek.
02_ora.qxd 8/3/2001 6:10 PM Page 22
22 2. ra
Mhely
A mhelyben kvzkrdsek tallhatk, melyek segtenek megszilrdtani az rban
szerzett tudst. A vlaszokat az A fggelkben helyeztk el.
Kvz
1. Hol rhet el a PHP kziknyv?
Feladatok
1. Teleptsk a PHP-t. Ha sikerlt, nzzk t a PHP belltfjlt s ellenrizzk
a telepts helyessgt.
03_ora.qxd 8/3/2001 6:10 PM Page 23
3.RA
Els PHP oldalunk
A PHP teleptse s belltsa utn eljtt az ideje, hogy elkezdjnk vele dolgozni.
Ebben az rban elksztjk az els programunkat s elemezzk a kdot. Az ra
vgre kpesek lesznk olyan oldalak ksztsre, amelyek HTML s PHP kdot is
tartalmaznak.
24 3. ra
Els programunk
Vgjunk a kzepbe s kezdjk egy ksz PHP oldallal! A kezdshez nyissuk meg
kedvenc szvegfjl-szerkesztnket! A HTML dokumentumokhoz hasonlan a PHP
llomnyok is formzs nlkliek, tisztn szvegfjlok. Ez azt jelenti, hogy brmi-
lyen szvegfjl szerkesztsre rdott programmal kszthetnk PHP llomnyokat.
Ilyenek pldul a Windows Jegyzettmbje, a Simple Text vagy a BBEdit MacOS
alatt, vagy a VI s az Emacs UNIX esetben. A legnpszerbb HTML-szerkesztk
ltalban nyjtanak valamilyen klnleges tmogatst PHP-szerkesztshez is.
Ilyenek pldul a kdsznezs, a kifejezsszerkeszt vagy a tesztel.
3.1. bra
Els PHP oldalunk
begpelve a KEdit
programban
A kiterjeszts igen fontos, mivel ez jelzi a kiszolgl szmra, hogy a fjl PHP k-
dot tartalmaz s futtatshoz meg kell hvni a feldolgozt. Az alapbellts PHP
kiterjeszts a .php, ez azonban a kiszolgl belltsainak mdostsval megvl-
toztathat. Ezzel az elz rban rszletesen foglalkoztunk.
3.2. bra
Siker: a 3.1. program
kimenete
3.3. bra
Kudarc: a kiterjeszts
nem azonosthat
26 3. ra
short_open_tag = On
asp_tags = On
Ez akkor lehet hasznos, ha olyan termkkel ksztnk PHP oldalakat, amely trli
a PHP blokkokat, de az ASP rszeket rintetlenl hagyja.
Nzzk meg, hogyan fest egy PHP fjl, amely a fent emltett formkat hasznlja az
elz program kibvtseknt. Ha engedlyeztk, brmely ngy kezd- s
zrelemet hasznlhatjuk a programban:
<?
print ("Hello Web!");
?>
<?php
print ("Hello Web!");
?>
<%
print ("Hello Web!");
%>
3
<SCRIPT LANGUAGE="PHP">
print ("Hello Web!");
</SCRIPT>
Ha PHP-ben egysoros kdot runk, nem kell kln sorba tennnk a kezd- s
zrelemeket, illetve a programsort:
A print() fggvny
A print() fggvny kirja a kapott adatokat. A legtbb esetben minden,
ami a print() fggvny kimenetn megjelenik, a bngszhz kerl. A fggv-
nyek olyan parancsok, amelyek valamilyen mveletet vgeznek, tbbnyire attl
fggen, hogy milyen adatokat kapnak. A fggvnyeknek tadott adatokat majd-
nem mindig zrjelbe kell tennnk a fggvny neve utn. Ebben az esetben
a print() fggvnynek egy karakterlncot adtunk t. A karakterlncokat mindig
(egyes vagy ketts) idzjelbe kell tenni.
28 3. ra
Mivel a 3.1. programban az egyetlen megadott utasts a blokk vgn ll, a pon-
tosvessz elhagyhat.
3.4. bra
Ha a 3.2 programot
megnzzk bng-
szvel, a Hello Web!
szveget ltjuk
vastagon
3
3.5. bra
Ha a dokumentum
forrst nzzk, a
kd hagyomnyos
HTML dokumen-
tumnak tnik
03_ora.qxd 8/3/2001 6:10 PM Page 30
30 3. ra
// Ez megjegyzs
# Ez is megjegyzs
/*
Ez egy megjegyzs.
A PHP-rtelmez
ezen sorok egyikt
sem fogja feldolgozni.
*/
sszefoglals
Mostanra rendelkezsnkre llnak azok az eszkzk, melyekkel kpesek vagyunk
egy egyszer PHP program futtatsra egy megfelelen belltott kiszolgln.
Krdsek s vlaszok
Melyik a legjobb kezd- s zrelem?
Ez nagyrszt sajt dntsnkn mlik. A hordozhatsg szem eltt tartsval
a hagyomnyos <?php ?> megolds a legjobb dnts. A rvid kezdelemek alap-
esetben engedlyezettek s rendelkeznek a tmrsg elnys tulajdonsgval.
Mhely
A mhelyben kvzkrdsek tallhatk, melyek segtenek megszilrdtani az rban
szerzett tudst. A vlaszokat az A fggelkben helyeztk el.
Kvz
1. A felhasznl bngszjvel elolvashatja-e a PHP kdot?
Feladatok
1. Gyakoroljuk a PHP oldalak elksztst, feltltst s futtatst!
04_ora.qxd 8/3/2001 6:10 PM Page 33
II. RSZ
A PHP nyelv
4. ra Az alkotelemek
5. ra Vezrlsi szerkezetek
6. ra Fggvnyek
7. ra Tmbk
8. ra Objektumok
04_ora.qxd 8/3/2001 6:10 PM Page 34
04_ora.qxd 8/3/2001 6:10 PM Page 35
4. RA
Az alkotelemek
Ebben az rban mr mlyebben elmerlnk a nyelv rejtelmeiben. Az alapokkal
kezdnk, gy a kezd programoznak rengeteg j informcit kell majd feldol-
goznia. Aggodalomra azonban semmi ok, brmikor vissza lehet lapozni a knyv-
ben. A lnyeg, hogy a fejezetben lertak megrtsre trekedjnk, ne csupn
a memorizlsra.
A gyakorlott programozknak is ajnlatos legalbbis tlapozniuk ezen ra anya-
gt. Az rban a kvetkezket tanuljuk meg:
36 4. ra
Vltozk
A vltozk klnleges trolk, amiket abbl a clbl hozunk ltre, hogy rtket he-
lyezznk el bennk. A vltozk egy dollrjelbl ($) s egy tetszlegesen vlasztott
nvbl tevdnek ssze. A nv betket, szmokat s alhzs karaktereket (_) tartal-
mazhat (szmmal azonban nem kezddhet!), szkzket s ms olyan karaktereket,
amelyek nem szmok vagy betk, nem. me nhny rvnyes vltoznv:
$a;
$egy_hosszabb_valtozonev;
$elalszom_zzzzzzzzzzzzzz;
$szam1 = 8;
$szam2 = 23;
print $szam1;
hatsa megegyezik a
print 8;
Az alkotelemek 37
Dinamikus vltozk
Vltozt teht gy hozunk ltre, hogy egy dollrjel utn rjuk a vltoz nevt. Szo-
katlan, m hasznos, hogy a vltoz nevt is trolhatjuk vltozban. Teht ha az
albbi mdon rtket rendelnk egy vltozhoz
$felhasznalo = "Anna";
$tarolo = "felhasznalo";
$$tarolo = "Anna";
$felhasznalo = "Anna";
print $felhasznalo;
azonos a
$felhasznalo = "Anna";
$tarolo = "felhasznalo";
print $$tarolo;
kddal, eltekintve termszetesen attl, hogy itt ltrehoztunk egy $tarolo nev
vltozt, melynek rtke "felhasznalo".
04_ora.qxd 8/3/2001 6:10 PM Page 38
38 4. ra
$felhasznalo = "Anna";
$tarolo = "felhasznalo";
print "$$tarolo";
a bngsz nem az "Anna" szveget jelenti meg, mint ahogy vrnnk, hanem
kirja a dollrjelet, majd a "felhasznalo" szveget, vagyis sszessgben azt,
hogy "$felhasznalo".
$felhasznalo = "Anna";
$tarolo = "felhasznalo";
print "${$tarolo}";
Az alkotelemek 39
Hivatkozsok a vltozkra
A PHP alaprtelmezs szerint rtkadskor a vltozk rtkeit hasznlja. Ez azt jele-
nti, hogy ha az $egyikValtozo-t hozzrendeljk egy $masikValtozo-hoz,
akkor a $masikValtozo-ba az $egyikValtozo rtknek msolata kerl.
Az $egyikValtozo tartalmnak ksbbi mdostsa nincs semmifle hatssal 4
a $masikValtozo-ra. A 4.2. pldaprogram ezt mutatja be.
40 4. ra
Az alkotelemek 41
Adattpusok
A klnfle tpus adatok tbb-kevesebb helyet foglalnak a memriban, a nyelv
pedig mindegyiket nmileg ms mdon kezeli. Ezrt nhny programozsi nyelv
megkveteli, hogy a programoz elre meghatrozza a vltoztpust. A PHP 4
gyengn tpusos, ami azt jelenti, hogy az adattpusokat gy kezeli, mintha a tpus
az adathoz rendelt kiegszt informci lenne. A PHP vegyes megkzeltst hasz-
nl. Egyfell ez azt jelenti, hogy a vltozk rugalmasan hasznlhatk: egyszer
karakterlnc, msszor esetleg szm lehet bennk. Msfell, nagyobb mret prog-
ramokban zavar forrsa lehet, ha egy adott tpus vltozt vrunk egy vltozban,
mikzben valami teljesen ms van benne.
A 4.1. tblzat a PHP 4-ben elrhet hat fontosabb adattpust tartalmazza, rvid le-
rssal s pldval.
42 4. ra
integer
string
double
boolean
Az integer egsz szm, vagyis olyan szm, amelyben nincs tizedesjegy (tizedes-
pont).
Az alkotelemek 43
44 4. ra
Az alkotelemek 45
Mveletjelek s kifejezsek
Most mr kpesek vagyunk adatokat helyezni vltozinkba, meghatrozhatjuk,
st meg is vltoztathatjuk egy vltoz tpust. Egy programozsi nyelv azonban
nem tl hasznos, ha a trolt adatokkal nem vgezhetnk mveleteket. A mvelet-
jelek (opertorok) olyan jelek, amelyek azon mveleteket jelzik, melyek lehetv
teszik, hogy egy vagy tbb rtkbl egy j rtket hozzunk ltre. Az rtket,
amellyel a mveletet vgezzk, operandusnak hvjuk.
46 4. ra
4 + 5
Hozzrendels
Mr tallkoztunk a hozzrendel mveletjellel, valahnyszor rtket adtunk vlto-
zinknak. A hozzrendel opertor egyetlen karakterbl ll, az egyenlsgjelbl
(=). Jelentse: a mveletjel jobb oldaln ll kifejezs rtkt hozzrendeljk a bal
oldali operandushoz.
Az alkotelemek 47
Aritmetikai mveletek
Az aritmetikai mveletek pontosan azt teszik, amit elvrunk tlk. A 4.2. tblzat
a megfelel mveletjeleket sorolja fel. Az sszead mveletjel hozzadja a jobb
oldali operandust a bal oldalihoz, a kivon mveletjel a jobb oldali operandust
kivonja a bal oldalibl, az oszt mveletjel a bal oldali operandust elosztja a jobb
oldalival, a szorz mveletjel pedig sszeszorozza a bal s a jobb oldali
operandusokat. A maradkkpz (modulus) mveletjel a bal s a jobb operandus
egsz osztsnak maradkt adja.
sszefzs
Az sszefzs jele a pont (.). Mindkt operandust karakterlncnak tekintve,
a jobb oldali elemet hozzfzi a bal oldalihoz. Vagyis a
kifejezs rtke:
"Para Zita"
48 4. ra
$x = 4;
$x += 4; // $x most 8
$x = 4;
$x = $x + 4; // $x most 8
A 4.3. tblzat minden pldjban a $x vltoz rtke vltozik meg, a jobb oldali
operandusnak megfelelen.
sszehasonlts
Az sszehasonlt mveletek az operandusokon vizsglatokat vgeznek. Logikai
rtkkel trnek vissza, vagyis rtkk true lesz, ha a felttelezett viszony fennll,
s false, ha nem. Ez a tpus kifejezs az olyan vezrlsi szerkezetekben hasz-
nos, mint az if s while utastsok. Ezekkel az tdik rban tallkozunk majd.
Ha meg szeretnnk vizsglni, hogy az $x-ben trolt rtk kisebb-e 5-nl, a kisebb,
mint jelet hasznlhatjuk:
$x < 5
04_ora.qxd 8/3/2001 6:10 PM Page 49
Az alkotelemek 49
true || false
50 4. ra
Az alkotelemek 51
$x = $x + 1; // $x rtke eggyel n
$x += 1; // $x rtke eggyel n
$x = 3;
$x++ < 4; // igaz
52 4. ra
$x = 3;
++$x < 4; // hamis
4 + 5
4 + 5 * 2
Itt mr egy problmval tallkozunk szembe: a kifejezs azt jelenti, hogy vedd
a ngyet s az tt, add ssze ket, majd az eredmnyt szorozd meg kettvel,
vagyis 18 az rtke? Esetleg azt, hogy add hozz a ngyhez az t s a kett
szorzatt, vagyis az eredmny 14? Ha egyszeren balrl jobbra olvasnnk, akkor
az els vltozatot kellene elfogadnunk. A PHP-ben azonban minden mveletjelhez
tartozik egy elsbbsgi tnyez (priorits). Mivel a szorzs elsbbsget lvez az
sszeadssal szemben, gy (iskolai tanulmnyainkkal sszhangban) a msodik v-
lasz a helyes megolds.
( 4 + 5 ) * 2
Az alkotelemek 53
$x || $y and $z
( $x || $y ) && $z
llandk
A vltozk rugalmas adattrolsi lehetsget nyjtanak szmunkra. Megvltoztat-
hatjuk rtkket, st tpusukat is, brmely pillanatban. Ha azonban azt szeretnnk,
hogy egy adott nv alatt trolt rtk ne vltozzon a program futsa sorn, ltrehoz-
hatunk llandkat (konstansokat) is. Ezt a PHP beptett define() fggvnye
segtsgvel tehetjk meg. Miutn az llandt ltrehoztuk, annak rtkt nem
szabad (nem tudjuk) megvltoztatni. Az lland nevt, mint karakterlncot s
az rtket vesszvel elvlasztva a zrjeleken bellre kell rnunk.
Az lland rtke termszetesen lehet szm, karakterlnc vagy logikai tpus is.
Az a szoks, hogy az llandk neve CSUPA NAGYBETBL ll. Az llandk neve
nem tartalmaz dollrjelet, gy az llandk elrse csupn a nv lersbl ll.
04_ora.qxd 8/3/2001 6:10 PM Page 54
54 4. ra
sszefoglals
Ebben az rban vgigvettk a PHP nyelv nhny alapvet tulajdonsgt. Tanul-
tunk a vltozkrl s arrl, hogyan rendelhetnk hozzjuk rtket. Hallottunk
a dinamikus, vagyis vltoz vltozkrl. Megtanultuk azt is, hogyan kell a vlto-
z rtknek msolata helyett a vltozkra hivatkozni. j mveletjeleket ismer-
tnk meg s megtanultuk, hogyan kell azokat sszetettebb kifejezsekk ssze-
gyrni. Vgl megtanultuk, hogyan kell llandkat ltrehozni s hasznlni.
04_ora.qxd 8/3/2001 6:10 PM Page 55
Az alkotelemek 55
Krdsek s vlaszok
Mikor kell tudnunk egy vltoz tpust?
Elfordul, hogy a vltoz tpusa behatrolja, milyen mveleteket vgezhetnk vele.
Pldul mieltt egy matematikai kifejezsben hasznlunk egy vltozt, megnzhet-
jk, hogy egyltaln egsz vagy lebegpontos szmot tartalmaz-e. Az ehhez hason-
l krdsekkel kicsit ksbb, a tizenhatodik fejezetben foglalkozunk.
Mhely
A mhelyben kvzkrdsek tallhatk, melyek segtenek megszilrdtani az rban
szerzett tudst. A vlaszokat az A fggelkben helyeztk el.
Kvz
1. Az albbiak kzl melyek NEM lehetnek vltoznevek?
$egy_felhasznalo_altal_elkuldott_ertek
$44444444444xyz
$xyz44444444444
$______________szamlalo______________
$az elso
$fajl-nev
56 4. ra
Feladatok
1. Ksztsnk programot, amely legalbb t klnbz vltozt tartalmaz.
Adjunk nekik klnbz tpus rtkeket, majd hasznljuk a gettype()
fggvnyt a vltozk tpusainak meghatrozsra.
5. RA
Vezrlsi szerkezetek
Az elz rban ltrehozott programok minden futtatskor ugyanazt az eredmnyt
adtk, mindig ugyanazok az utastsok hajtdtak vgre ugyanabban a sorrendben.
Ez nem biztost tl nagy teret a rugalmassgnak.
58 5. ra
Elgazsok
A legtbb program feltteleket rtkel ki s azok eredmnynek megfelelen
vltoztatja viselkedst. A lehetsget, hogy a PHP oldalak tartalma dinamikuss
vljk, az teszi lehetv, hogy a programok kimenete bizonyos felttelektl
fgghet. A legtbb programozsi nyelvhez hasonlan a PHP 4-es vltozata is
biztostja erre a clra az if utastst.
Az if utasts
Az if utasts kirtkeli a zrjelek kztti kifejezst. Ha a kifejezs rtke igaz,
az utastshoz tartoz programrsz vgrehajtdik. Ha a kifejezs hamis, a blokk
egyszeren figyelmen kvl marad. Ez teszi lehetv a programoknak, hogy
dntseket hozzanak.
if ( kifejezs )
{
// ha a kifejezs rtke igaz,
// ez a blokk vgrehajtdik
}
Vezrlsi szerkezetek 59
if ( $hangulat == "boldog" )
print "Hurr, j kedvem van!";
Az if utasts else ga
Amikor az if utastst hasznljuk, gyakran szeretnnk, hogy legyen egy olyan
alternatv programrsz, amely akkor hajtdik vgre, ha a vizsglt felttel nem igaz.
Ezt gy rhetjk el, hogy az if utasts programrsze utn kirjuk az else kulcs-
szt, majd az alternatv programrszt. A sma a kvetkez:
if (felttel)
{
// itt kvetkezik az a programrsz, amely akkor kerl
// vgrehajtsra, ha a felttel rtke igaz
}
5
else
{
// itt pedig az a programrsz tallhat, amely akkor fut le,
// ha a felttel rtke hamis
}
60 5. ra
Az if utasts elseif ga
Mieltt az else gban alternatv kdrszt adnnk meg, tbb kifejezs rtktl
fggen az if - elseif - else szerkezet segtsgvel a programmal mst s
mst vgeztethetnk. A hasznland utastsforma a kvetkez:
if ( felttel )
{
// ez a rsz akkor fut le, ha a felttel igaz
}
elseif ( msik felttel )
{
// ez a rsz akkor fut le, ha a msik felttel igaz,
// s minden elz felttel hamis
}
// itt mg tetszleges szm elseif rsz kvetkezhet
05_ora.qxd 8/3/2001 6:11 PM Page 61
Vezrlsi szerkezetek 61
else
{
// ez a rsz akkor kerl vgrehajtsra, ha egyik
// felttel sem volt igaz
}
Ha az els felttel rtke hamis, a hozz tartoz programrsz nem kerl vgre-
hajtsra. Ezutn a PHP megvizsglja az elseif kifejezs rtkt. Ha a kifejezs
igaz, a hozz tartoz programblokk fut le. Vgl, ha egyik felttel sem igaz,
az else utni rsz kerl vgrehajtsra. Annyi elseif-et rhatunk a programba,
amennyi csak jlesik. St, ha nincs szksgnk else gra, vagyis olyan program-
rszre, amely akkor hajtdik vgre, ha egyik felttel sem igaz, akr el is hagyhatjuk.
62 5. ra
A switch utasts
A switch utasts egy lehetsges mdja annak, hogy egy kdrszletet egy kifeje-
zs rtktl fggen hajtsunk vgre. Van azonban nhny klnbsg az imnt
tanult if s a switch kztt. Az if-et az elseif-fel hasznlva tbb kifejezs
rtktl tehetjk fggv, hogy mi trtnjen. A switch esetben a program
csak egy kifejezst vizsgl meg s annak rtktl fggen klnbz sorokat
futtat. A kifejezsnek egyszer tpusnak kell lennie (szm, karakterlnc vagy
logikai rtk). Az if felttele csak igaz vagy hamis lehet, a switch kifejezst
akrhny rtkkel sszehasonlthatjuk. De nzzk inkbb az ltalnos szerkezetet:
switch ( kifejezs )
{
case rtk1:
// ez trtnjen, ha kifejezs rtke rtk1
break;
case rtk2:
// ez trtnjen, ha kifejezs rtke rtk2
break;
default:
// ez trtnjen, ha a kifejezs rtke
// egyik felsorolt rtkkel sem egyezett meg
break;
// az rdg nem alszik, jobban jrunk, ha kitesszk
// ezt a felesleges break utastst
}
Vezrlsi szerkezetek 63
switch( $hetnapja )
{
case "Pntek":
print "Kikapcsolni a vekkert, holnap nem kell
dolgozni!<br>";
case "Htf":
case "Szerda":
print "Ma dleltt dolgozom<br>";
break;
case "Kedd":
case "Cstrtk":
print "Ma dlutn dolgozom<br>";
break;
case "Vasrnap":
print "Bekapcsolni a vekkert!<br>";
case "Szombat":
print "Hurr, szabadnap!<br>";
break;
default:
print "Azt hiszem ideje lenne egy j programo-
5
zt s/vagy egy jobb naptrat
kerteni<br>";
break;
}
A fenti kis program azt kzli, mikor kell mennnk dolgozni s az bresztra keze-
lsben is segt. A programot gy ptettk fel, hogy tbb esetben is ugyanazt a k-
dot kelljen vgrehajtani, gy hasznos, hogy nem adtuk meg minden case cmknl
a break utastst. Elg gyakori azonban, hogy a kezd programoz elfelejti meg-
adni a break utastst. Hasonl helyzetekben jusson esznkbe ez a plda.
64 5. ra
A ?: mveletjel
A ?: ternlis (hromoperandus) mveletjel egy olyan if utastshoz hasonlt,
amely rtket is kpes visszaadni. A visszaadott rtket a vizsglt felttel
hatrozza meg:
Vezrlsi szerkezetek 65
Ciklusok
Most mr lttuk, hogyan kell dntsek eredmnytl fggen klnbz program-
rszleteket futtatni. PHP programokkal arra is kpesek vagyunk, hogy megmond-
juk, hnyszor kell lefuttatni egy adott programrszt. Erre valk a ciklusok. Segts-
gkkel elrhetjk, hogy egyes programrszletek ismtldjenek. Szinte kivtel
nlkl igaz, hogy egy ciklus addig fut, amg egy felttel teljesl, vagy meg nem
mondjuk, hogy fejezdjn be az ismtls.
05_ora.qxd 8/3/2001 6:11 PM Page 66
66 5. ra
A while ciklus
A while ciklus szerkezete rendkvl hasonlt az if elgazshoz:
while ( felttel )
{
// valamilyen tevkenysg
}
Amg a while felttele igaz, a hozz tartoz programrsz jbl s jbl vgrehaj-
tdik. A programrszen bell ltalban megvltoztatunk valamit, ami hatssal lesz
a while felttelre; ha ezt nem tesszk meg, a ciklusunk a vgtelensgig futni
fog. Az 5.6. pldaprogram a while ciklus segtsgvel rja ki a kettes szorztblt.
Vezrlsi szerkezetek 67
A do..while ciklus
A do..while ciklus kicsit hasonlt a while-hoz. A lnyegi klnbsg abban van,
hogy ebben a szerkezetben elszr hajtdik vgre a kd s csak azutn rtkeldik
ki a felttel:
do
{
// vgrehajtand programrsz
} while ( felttel );
A do..while ciklus megnzi, hogy a $szam vltoz rtke 200 s 400 kztt
van-e. Mivel a $szam vltoznak az 1 kezdeti rtket adtuk, gy a felttel hamis.
Ennek ellenre a programblokk egyszer vgrehajtdik, mgpedig a felttel kirt-
kelse eltt, ezrt a bngszben egy sor kirsra kerl.
05_ora.qxd 8/3/2001 6:11 PM Page 68
68 5. ra
A for ciklus
A for semmi jat nem nyjt a while ciklushoz kpest. A for ciklus hasznlatval
azonban sokszor takarosabb, biztonsgosabb mdon kzelthetjk meg ugyanazt
a problmt. Korbban az 5.6. pldaprogramban ltrehoztunk egy vltozt
a while cikluson kvl, majd a while kifejezse megvizsglta ennek a vltoznak
az rtkt. Vgl a vltoz rtkt a ciklus vgn eggyel nveltk. A for ciklus
mindezt egyetlen sorban teszi lehetv. Ez tmrebb programot eredmnyez s rit-
kbban fordulhat el, hogy a vltozt elfelejtjk nvelni, ami vgtelen ciklust okoz.
vltoz_hozzrendelse;
while ( felttel )
{
// a vgrehajtand programblokk
szmll_nvelse;
}
Vezrlsi szerkezetek 69
70 5. ra
Vezrlsi szerkezetek 71
72 5. ra
Vezrlsi szerkezetek 73
A kls for ciklus az $y vltoznak az 1 kezdeti rtket adja. A ciklus addig fog
futni, amg a vltoz nem nagyobb 12-nl, az utols kifejezs pedig biztostja,
hogy $y rtke minden ismtls utn eggyel njn. A ciklus trzse minden ismt-
ls sorn kir egy tr (table row tblzatsor) HTML elemet, majd egy jabb
for ciklus kezddik. A bels ciklus az $x vltoz rtkt a kls ciklushoz
hasonlan vgigfuttatja 1-tl 12-ig. A ciklus trzsben egy td (table data
tblzatcella) elemet r ki, amelybe az $x*$y rtk kerl. Az eredmny egy
zlsesen formzott szorztbla lesz.
sszefoglals
Ebben az rban a vezrlsi szerkezetekrl tanultunk s arrl, hogyan segtenek
minket programjaink vltozatosabb s rugalmasabb ttelben. A legtbb megta-
nult szerkezet jbl s jbl meg fog jelenni a knyv htralev rszben.
Megtanultuk, hogyan hozzunk ltre if utastsokat, hogyan egsztsk ki azokat
elseif s else gakkal. Hallottunk arrl, hogyan hasznljuk a switch utastst,
hogy egy kifejezs adott rtkei esetn ms s ms trtnjen. Tanultunk a ciklusok-
rl, pontosabban a while s a for ciklusokrl, s arrl, hogy a break s
5
a continue utastsok segtsgvel hogyan lphetnk ki vgleg a ciklusbl, illetve
hogyan hagyhatunk ki egy-egy ismtlst. Vgl megtanultuk, hogyan kell cikluso-
kat egymsba gyazni s erre gyakorlati pldt is lttunk.
Krdsek s vlaszok
A vezrlsi szerkezetek feltteles kifejezseinek mindenkppen logikai
rtket kell adniuk?
Vgs soron igen, br a feltteles kifejezseknl a kirtkels szempontjbl min-
den, ami nulla, res karakterlnc vagy nem meghatrozott vltoz, false-nak,
minden egyb true-nak szmt.
74 5. ra
Mhely
A mhelyben kvzkrdsek tallhatk, melyek segtenek megszilrdtani az rban
szerzett tudst. A vlaszokat az A fggelkben helyeztk el.
Kvz
1. Hogyan hasznlnnk az if vezrlsi szerkezetet olyan program rsra, hogy
ha az $eletkor vltoz rtke 18 s 35 kztt van, az
"zenet fiataloknak" szveget rja ki? Ha az $eletkor rtke
brmi ms, az "ltalnos zenet" szveg jelenjen meg a bngszben.
Feladatok
1. Nzzk vgig a vezrlsi szerkezetek utastsformjt! Gondoljuk vgig,
hogyan lehetnek ezek a szerkezetek a segtsgnkre!
6. RA
Fggvnyek
A fggvny a jl szervezett program lelke, mert a programot knnyen olvashatv s
jrahasznosthatv teszi. Fggvnyek nlkl a nagy programok kezelhetetlenek len-
nnek. Ebben az rban a fggvnyeket tanulmnyozzuk s mutatunk r nhny
pldt, hogyan kmlhetnek meg minket az ismtldsekbl add pluszmunk-
tl. Az rban a kvetkezket tanuljuk meg:
76 6. ra
Ha a kedves Olvasnak egy stemnyt kell csinlnia, maga sti meg. De ha tbb
ezret, akkor esetleg kszt vagy beszerez egy stemnyst gpezetet. Hasonl-
kpp, amikor elhatrozzuk, hogy fggvnyt runk, a legfontosabb szempont, amit
mrlegelnnk kell, az, hogy az ismtldsek cskkentsvel akkorv zsugorodik-
e a program, hogy rvidebb lesz a fggvny hasznlatval.
Fggvnyek hvsa
Ktfle fggvny ltezik: a nyelvbe beptett fggvny s az ltalunk ltrehozott
fggvny. A PHP 4-ben rengeteg beptett fggvny van. A knyv legels
PHP oldala egyetlen fggvnyhvsbl llt:
Fggvnyek 77
78 6. ra
Fggvnyek ltrehozsa
Fggvnyt a function kulcssz segtsgvel hozhatunk ltre:
Fggvnyek 79
A fenti program egyszeren kirja a "HELLO" szveget egy <H1> HTML elemben.
A programban egy olyan nagyHello() nev fggvnyt hoztunk ltre, amely
nem vesz t paramtereket. Ezrt hagytuk resen a zrjelprt. Br a nagyHello()
mkd fggvny, mgsem tl hasznos. A 6.3. pldaprogramban olyan fggvnyt
lthatunk, amely egy paramtert fogad s valami hasznosat csinl vele.
6.1. bra
6
Fggvny, amely egy
karakterlncot, majd
egy <br> HTML
elemet r ki.
06_ora.qxd 8/3/2001 6:11 PM Page 80
80 6. ra
Fggvnyek 81
return 4;
return ( $a / $b );
Dinamikus fggvnyhvsok
Lehetsgnk van r, hogy karakterlncba tegyk egy fggvny nevt s ezt a vl-
tozt pontosan gy tekintsk, mint ha maga a fggvny neve lenne. Ezt a 6.5. pl-
daprogramon keresztl prblhatjuk ki.
6
6.5. program Dinamikus fggvnyhvs
1: <html>
2: <head>
3: <title>6.5. program Dinamikus fggvnyhvs</title>
4: </head>
5: <body>
6: <?php
06_ora.qxd 8/3/2001 6:11 PM Page 82
82 6. ra
Mirt j ez? A fenti pldban csak mg tbb munkt csinltunk magunknak azzal,
hogy a "koszon" karakterlncot rendeltk a $fuggveny_tarolo nev vlto-
zhoz. A dinamikus fggvnyhvs akkor igazn hasznos, ha a program folyst
bizonyos krlmnyektl fggen vltoztatni szeretnnk. Pldul szeretnnk mst
s mst csinlni egy URL-krs paramtertl fggen. Ezt a paramtert feldolgoz-
hatjuk s rtktl fggen ms s ms fggvnyt hvhatunk meg.
Vltozk hatkre
A fggvnyben hasznlt vltozk az adott fggvnyre nzve helyiek maradnak.
Ms szavakkal: a vltoz a fggvnyen kvlrl vagy ms fggvnyekbl nem lesz
elrhet. Nagyobb projektek esetn ez megvhat minket attl, hogy vletlenl kt
fggvny fellrja azonos nev vltozik tartalmt.
Fggvnyek 83
6.2 bra
Ksrlet fggvnyen
belli vltozra
hivatkozsra.
84 6. ra
6.3. bra
Globlis vltoz
elrsi ksrlete
fggvnyen bellrl
06_ora.qxd 8/3/2001 6:11 PM Page 85
Fggvnyek 85
86 6. ra
Tegyk fel pldul, hogy tudni szeretnnk, hnyszor fut le egy adott fggvny.
Mirt? Pldnkban a fggvny clja szmozott cmsor ksztse, ami egy dinami-
kusan ltrejv dokumentcit eredmnyez.
Fggvnyek 87
6.5. bra
A fggvnyhvsok
szmnak nyomon
kvetse a global
kulcssz hasznla-
tval
88 6. ra
Fggvnyek 89
90 6. ra
6.6. bra
Fggvny, amely
formzott karakter-
lncokat r ki a bn-
gszbe
Fggvnyek 91
92 6. ra
Lehetsgnk van arra is, hogy ne a vltoz rtkt, hanem arra mutat hivatko-
zst adjunk t. (Ezt cm szerinti paramtertadsnak is hvjk.) Ez azt jelenti, hogy
a vltozra mutat hivatkozssal dolgozunk a fggvnyben s nem a vltoz rt-
knek msolatval. A paramteren vgzett brmilyen mvelet megvltoztatja az
eredeti vltoz rtkt is. Hivatkozsokat fggvnyeknek gy adhatunk t, hogy
az tadand vltoz vagy a paramter neve el egy & jelet tesznk. A 6.14. s
a 6.15. pldaprogram az elz problmra mutatja be a kt elbb emltett
mdszert.
Fggvnyek 93
94 6. ra
Krdsek s vlaszok
A global kulcsszn kvl van ms md arra, hogy egy fggvny hozz
tudjon frni vagy mdostani tudjon egy globlis vltozt?
A globlis vltozkat a programon bell brhonnan elrhetjk a $GLOBALS nev
asszociatv tmb segtsgvel. A $proba nev globlis vltozt pldul
$GLOBALS["proba"]-knt rhetjk el. Az asszociatv tmbkrl a kvetkez
rban tanulunk.
Mhely
A mhelyben kvzkrdsek tallhatk, melyek segtenek megszilrdtani az rban
szerzett tudst. A vlaszokat az A fggelkben helyeztk el.
Kvz
1. Igaz-e, hogy ha egy fggvnynek nem kell paramtert tadni, akkor a fgg-
vny neve utn nem szksges kitenni a zrjelprt?
function tizszer()
{
$szam = $szam * 10;
}
tizszer();
print $szam;
06_ora.qxd 8/3/2001 6:11 PM Page 95
Fggvnyek 95
function tizszer()
{
global $szam;
$szam = $szam * 10;
}
tizszer();
print $szam;
function tizszer($sz)
{
$sz = $sz * 10;
}
tizszer($szam);
print $szam;
function tizszer(&$sz)
{
$sz = $sz * 10;
}
$tizszer($szam);
6
print $szam;
Feladatok
1. rjunk fggvnyt, amely ngy karakterlnc tpus rtket fogad s olyan karak-
terlnccal tr vissza, amely paramtereit HTML cellaelemekbe (TD) zrja!
06_ora.qxd 8/3/2001 6:11 PM Page 96
07_ora.qxd 8/3/2001 6:16 PM Page 97
7. RA
Tmbk
A tmbk s a kezelsket segt eszkzk nagy mrtkben nvelik a PHP 4
programok rugalmassgt. Ha jl rtnk a tmbkhz, kpesek vagyunk nagy
mret, sszetett adatokat trolni s kezelni.
98 7. ra
Tmbk 99
Tmbk ltrehozsa
A tmbk alaprtelmezs szerint rtkek szmmal indexelt listi. rtket egy
tmbhz ktflekppen is rendelhetnk: Az egyik md az array() fggvny,
a msik a tmbazonost hasznlata szgletes zrjelekkel ([]). A kvetkez kt
rszben mind a ktfle vltozattal tallkozni fogunk.
print $felhasznalok[2];
7
Tmb ltrehozsa vagy elem hozzadsa a tmbhz
szgletes zrjel segtsgvel
Tmbket gy is ltrehozhatunk, illetve meglev tmbkhz j elemeket adha-
tunk, ha a tmb neve utn olyan szgletes zrjelprt runk, amelynek belsejben
nincs index.
07_ora.qxd 8/3/2001 6:16 PM Page 100
100 7. ra
$felhasznalok[] = "Berci";
$felhasznalok[] = "Mariska";
$felhasznalok[] = "Aladr";
$felhasznalok[] = "Eleonra";
Figyeljk meg, hogy nem kellett szmot rnunk a szgletes zrjelbe. A PHP 4
automatikusan meghatrozza az indexrtket, gy nem kell neknk bajldni azzal,
hogy kiszmtsuk a kvetkez olyan indexet, amelyben mg nincs rtk.
$felhasznalok[0] = "Berci";
$felhasznalok[200] = "Mariska";
Asszociatv tmbk
A szmmal indexelt tmbk akkor hasznosak, ha abban a sorrendben szeretnnk
trolni az elemeket, amilyen sorrendben a tmbbe kerltek. Nha azonban j lenne,
ha a tmb elemeit meg tudnnk nevezni. Az asszociatv tmb egy karakterlncokkal
indexelt tmb. Kpzeljnk el egy telefonknyvet: melyik a jobb megolds: a nv
mezt a 4-gyel vagy a nv-vel indexelni?
Tmbk 101
$karakter = array
(
"nev" => "Jnos",
"tevekenyseg" => "szuperhs",
"eletkor" => 30,
"kulonleges kepesseg" => "rntgenszem"
);
print $karakter["eletkor"];
7
ha egyszeren a megnevezett elemhez (mezhz) j rtket adunk. Az albbiak-
ban jra ltrehozzuk a $karakter nev tmbt, gy, hogy az egyes kulcsokhoz
egyenknt rendelnk rtkeket.
07_ora.qxd 8/3/2001 6:16 PM Page 102
102 7. ra
Tbbdimenzis tmbk
Eddig azt mondtuk, hogy a tmbk elemei rtkek. A $karakter tmbnkben
az elemek kzl hrom karakterlncot tartalmaz, egy pedig egy egsz szmot.
A valsg ennl egy kicsit bonyolultabb. Egy tmbelem valjban lehet rtk, ob-
jektum vagy akr egy msik tmb is. A tbbdimenzis tmb valjban tmbk
tmbje. Kpzeljk el, hogy van egy tmbnk, amelynek tmbk az elemei. Ha el
akarjuk rni a msodik elem harmadik elemt, kt indexet kell hasznlnunk:
$tomb[1][2]
A tny, hogy egy tmbelem lehet tmb is, lehetsget biztost arra, hogy kifino-
multabb adatszerkezeteket kezeljnk viszonylag egyszeren. A 7.1. pldaprogram
egy tmbt r le, amelynek elemei asszociatv tmbk.
Tmbk 103
7
07_ora.qxd 8/3/2001 6:16 PM Page 104
104 7. ra
Tmbk elrse
Eddig azt lttuk, hogyan kell tmbket ltrehozni s elemeket adni azokhoz.
Most vgignznk nhny lehetsget, amit a PHP 4 a tmbk elrsre biztost.
print $felhasznalo[4];
A tmbk rugalmassga miatt nem mindig egyszer feladat kiderteni, hny elem
van a tmbben. A PHP a count() fggvnyt biztostja erre a feladatra.
A count() a tmbben lev elemek szmval tr vissza. Az albbi programrsz-
ben egy szmokkal indexelt tmbt hozunk ltre, majd a count() fggvnyt
hasznljuk a tmb utols elemnek elrsre.
Figyeljk meg, hogy egyet ki kellett vonnunk a count() ltal visszaadott rtkbl.
Ez azrt van gy, mert a count() nem az utols elem indext adja vissza, hanem
a tmbelemek szmt.
A fenti kdot futtatva azt tapasztaljuk, hogy az "Az utols elem: " szveg
utn semmi nem rdik ki. Ez azrt van, mert a tmbnek nincs 1 index eleme.
Az els elem a 0 indexen tallhat, a msodik a 2 indexen, mivel az rtkadskor
az indexet kzvetlenl hatroztuk meg.
A tmbk indexelse alaprtelmezs szerint nulltl indul, de ezt meg lehet
vltoztatni. Ha azonban vilgos s kvetkezetes programokat szeretnnk rni,
ne ljnk ezzel a lehetsggel.
Tmb bejrsa
Tbb mdja van annak, hogy egy tmb minden elemt vgigjrjuk. Mi most a PHP 4
igen hatkony foreach szerkezett hasznljuk, de a tizenhatodik rban tovbbi
mdszereket is megvizsglunk.
07_ora.qxd 8/3/2001 6:16 PM Page 105
Tmbk 105
foreach($tombnev as $atmeneti)
{
}
7.1. bra
Tmb bejrsa
106 7. ra
Figyeljk meg, hogy annak ellenre, hogy a tmb lyukas, a program a foreach
szerkezet segtsgvel bejrt tmb minden elemt kirta s az utols sor eltt nem
jelentek meg res sorok, teht a 3 s 9 indexek kztti tmbelemeket (melyek
nem meghatrozottak, vagyis res karakterlncok) nem rja ki a program.
ahol $tomb a tmb neve, amin vgig szeretnnk menni, $kulcs a vltoz,
amelyben az elem kulcsa jelenik meg, a $ertek pedig a kulcshoz tartoz tmb-
elem rtke.
Tmbk 107
7.2. bra
Asszociatv tmb
bejrsa
7
07_ora.qxd 8/3/2001 6:16 PM Page 108
108 7. ra
Tmbk 109
110 7. ra
Mveletek tmbkkel
Most mr fel tudunk tlteni tmbket elemekkel, elrhetjk azokat, de a PHP ren-
geteg fggvnnyel segti a tmbk feldolgozst is. A Perlben jrtas olvas bizo-
nyra ismersnek fogja tallni ezen fggvnyek nagy rszt.
Tmbk 111
112 7. ra
<?php
$egy_tomb = array( "a", "b", "c" );
7.4. bra
A tmb egyes elemei-
nek trlse s kirat-
sa az array_shift()
fggvny segtsgvel
Az array_shift() akkor lehet hasznos, amikor egy sor elemein kell valamilyen
tevkenysget vgezni, amg a sor ki nem rl.
Tmbk 113
Az albbi pldban ltrehozunk egy tmbt, majd egy j, hrom elem tmbt l-
ltunk el belle:
A fenti plda a "c", "d" s "e" elemeket rja ki, a <br> kdelemmel elvlasztva.
Mivel kezdpozciknt a kettt adtuk meg, gy az els elem, ami a $masodik
tmbbe kerl, az $elso[2].
7
Tmbk rendezse
Taln a rendezs a legnagyszerbb mvelet, amit egy tmbn el lehet vgezni.
A PHP 4 fggvnyeinek ksznheten egykettre rendet teremthetnk a kosz-
ban. A kvetkez rsz nhny olyan fggvnyt mutat be, amelyek szmmal s ka-
rakterlnccal indexelt tmbket rendeznek.
07_ora.qxd 8/3/2001 6:16 PM Page 114
114 7. ra
Tmbk 115
asort( $a_tomb );
foreach( $a_tomb as $kulcs => $ertek )
{
print "$kulcs = $ertek<br>";
}
7
Ennek a programocsknak a kimenett a 7.5. brn lthatjuk.
07_ora.qxd 8/3/2001 6:16 PM Page 116
116 7. ra
7.5. bra
Asszociatv tmb
rtk szerinti rende-
zse az asort() fgg-
vny segtsgvel
ksort( $tomb );
7.6. bra
Asszociatv tmb
rendezse kulcs
szerint a ksort() fgg-
vny segtsgvel
07_ora.qxd 8/3/2001 6:16 PM Page 117
Tmbk 117
sszefoglals
Ebben az rban a tmbkrl s a hozzjuk kapcsold eszkzkrl tanultunk,
melyeket a PHP 4 a rajtuk vgzett mveletekhez nyjt. Most mr tudunk norml
(szmmal indexelt) s asszociatv (karakterlnccal indexelt) tmbket is ltrehozni,
illetve tmbket bejrni a foreach ciklus segtsgvel.
Tbbdimenzis tmbket is ltre tudunk hozni, a bennk lev informcit pedig
ki tudjuk nyerni egymsba gyazott foreach ciklusokkal. A tmbkhz egyszerre
tbb elemet is adhatunk, illetve onnan kivehetnk. Vgl megtanultuk, hogy
a PHP 4-es vltozata milyen lehetsgeket nyjt a tmbk rendezsre.
Krdsek s vlaszok
Ha a foreach ciklus csak a PHP 4-esben kerlt a nyelvbe, akkor a PHP 3-as
vltozatt hasznl programozk hogyan jrtak vgig egy tmbt?
A PHP 3-asban az each() fggvnyt hasznltk egy while() ciklusban.
Errl bvebben a tizenhatodik rban olvashatunk.
Mhely
7
A mhelyben kvzkrdsek tallhatk, melyek segtenek megszilrdtani az rban
szerzett tudst. A vlaszokat az A fggelkben helyeztk el.
Kvz
1. Melyik fggvnnyel hozhatunk ltre tmbket?
118 7. ra
Feladatok
1. Hozzunk ltre egy tbbdimenzis tmbt, amely filmeket tartalmaz, zsner
szerint rendezve! Pontosabban hozzunk ltre egy asszociatv tmbt, amelynek
kulcsai filmtpusok ("Scifi", "Akci", "Romantikus")! A tmb elemei
legyenek tmbk, amelyek filmcmeket tartalmaznak ("2001", "Alien",
"Terminator",...)!
8. RA
Objektumok
Az objektumkzpont programozs veszlyes. Megvltoztatja a programozsrl val
gondolkodsmdunkat s ha egyszer a hatalmba kert, nem tudunk tle szabadul-
ni. A PHP a Perlhz hasonlan fokozatosan ptette be az objektumkzpontsgot
a nyelvtanba. A PHP 4-es vltozatnak megjelensvel kpess vltunk arra, hogy
programjainkat teljes mrtkben objektumkzpont szemlletmdban rjuk.
120 8. ra
Objektumok 121
Objektum ltrehozsa
Ahhoz, hogy ltre tudjunk hozni egy objektumot, elszr ltre kell hozni
a sablont, amelyre pl. Ezt a sablont hvjuk osztlynak. A PHP 4-es vltozatban
ilyen sablont a class kulcsszval hozhatunk ltre:
class elso_osztaly
{
// ez egy nagyon buta osztly
}
Objektumtulajdonsgok
Az objektumok a tulajdonsg nven emltett klnleges vltozk rvn mkd-
nek. Ezek az osztlyban brhol ltrehozhatk, de az tlthatsg kedvrt
az osztlymeghatrozs elejre clszer kigyjteni azokat, gy mi is ezt tesszk.
A tulajdonsgok lehetnek rtkek, tmbk, de ms objektumok is:
class elso_osztaly
{
var $nev = "Gizike"; 8
}
08_ora.qxd 8/3/2001 6:19 PM Page 122
122 8. ra
Figyeljk meg, hogy a vltozt a var kulcssz segtsgvel hoztuk ltre; ha ezt egy
osztlyon bell nem rjuk ki, rtelmezsi hibt (parse error) kapunk. Most, hogy ezt
a vltozt ltrehoztuk, minden elso_osztaly tpus objektumnak lesz egy nev
tulajdonsga, melynek "Gizike" lesz a kezdeti rtke. Ehhez a tulajdonsghoz az
objektumon kvlrl is hozz lehet frni, st meg is lehet vltoztatni:
class elso_osztaly
{
var $nev = "Gizike";
}
$obj1 = new elso_osztaly();
$obj2 = new elso_osztaly();
$obj1->nev = "Bonifc";
print "$obj1->nev<br>";
print "$obj1->nev<br>";
A -> mveletjel teszi lehetv, hogy egy objektum tulajdonsgait elrhessk vagy
mdosthassuk. Br az $obj1 s az $obj2 objektumokat "Gizike" nvvel
hoztuk ltre, rbrtuk az $obj2 objektumot, hogy meggondolja magt, a nev
tulajdonsghoz a "Bonifc" rtket rendelve, mieltt a -> jelet ismt hasznlva
kituk volna mindkt objektum nev tulajdonsgnak rtkt.
Az objektumok tagfggvnyei
A tagfggvny olyan fggvny, amelyet egy osztlyon bell hozunk ltre. Minden
objektumpldny kpes meghvni osztlya tagfggvnyeit. A 8.1. pldaprogram
az elso_osztaly nev osztlyt egy tagfggvnnyel egszti ki.
08_ora.qxd 8/3/2001 6:19 PM Page 123
Objektumok 123
124 8. ra
Objektumok 125
Mg mindig van egy fogs, amit nem ismertnk meg. Ha egy metdusnak ppen
azt a nevet adjuk, mint az osztlynak (az elz pldban ez az elso_osztaly),
akkor a metdus automatikusan meghvdik, amikor egy j objektumpldny
ltrejn. E mdszer segtsgvel mr szletskkor testreszabhatjuk objektuma-
inkat. A ltrejv pldny az ezen fggvnynek tadott paramterek vagy ms
tnyezk alapjn hozhatja magt alapllapotba. Ezeket a klnleges metdusokat
konstruktoroknak (ltrehoz fggvnyeknek) hvjuk. A 8.4. pldaprogramban
az elso_osztaly objektumtpus konstruktorral kiegsztett vltozatt lthatjuk.
126 8. ra
Az osztly tulajdonsgai
Elszr is el kell dntennk, hogy milyen tulajdonsgokat troljunk az objektumban.
Az oszlopok neveit egy tmbben troljuk, a sorokat pedig egy ktdimenzis tmb-
ben. A tblzat oszlopainak szmt kln, egy egsz tpus vltozba helyezzk.
08_ora.qxd 8/3/2001 6:19 PM Page 127
Objektumok 127
class Tablazat
{
var $tablazatSorok = array();
var $oszlopNevek = array();
var $oszlopszam;
}
A konstruktor
A tblzat ltrehozsakor a programnak mr tudnia kell, mik lesznek a feldolgo-
zand oszlopok nevei. Ez az informci az objektumhoz a konstruktor egy karak-
terlnc tpus tmbparamtere segtsgvel fog eljutni. Ha az oszlopok neveit
a konstruktor mr ismeri, knnyszerrel meghatrozhatja az oszlopok szmt s
berhatja az $oszlopszam tulajdonsgba:
Az ujSor() tagfggvny
A Tablazat osztly a sorokat tmbk formjban kapja meg. Ez persze csak
akkor mkdik helyesen, ha a tmbben s a fejlcben az oszlopok sorrendje
azonos:
Az ujSor() tagfggvny egy tmbt vr, amit a $sor nev vltozban kap meg.
A tblzat oszlopainak szmt mr az $oszlopszam tulajdonsgba helyeztk,
gy most a count() fggvnnyel ellenrizhetjk, hogy a kapott $sor paramter
megfelel szm oszlopot tartalmaz-e. Ha nem, akkor a fggvny false rtket 8
ad vissza.
08_ora.qxd 8/3/2001 6:19 PM Page 128
128 8. ra
Az ujNevesSor() tagfggvny
Az ujSor() tagfggvny csak akkor hasznlhat knyelmesen, ha a tmbknt
tadott paramterben az elemek sorrendje megfelel. Az ujNevesSor()
tagfggvny ennl tbb szabadsgot ad. A metdus egy asszociatv tmbt vr,
ahol az egyes elemek kulcsa az oszlopok neve. Ha olyan kulcs elem kerl
a paramterbe, amely a Tablazat objektum $oszlopNevek tulajdonsgban nem
szerepel, az adott elem egyszeren nem kerl bele a tblzatba. Ha egy oszlopnv
nem jelenik meg a paramterben kulcsknt, akkor az adott oszlopba egy res
karakterlnc kerl.
Objektumok 129
A kiir() tagfggvny
A kiir() tagfggvny kirja a bngszbe a tblzat fejlct s
a $tablazatSorok tmbt. A fggvny csak nyomkvetsi clokat szolgl.
Az ra ksbbi rszben egy sokkal szebb megoldst fogunk ltni.
function kiir()
{
print "<pre>";
foreach ( $this->oszlopNevek as $oszlopNev )
print "<B>$oszlopNev</B> ";
print "\n";
foreach ( $this->tablazatSorok as $y )
{
foreach ( $y as $xcella )
print "$xcella ";
print "\n";
}
print "</pre>";
}
sszell a kp
A 8.5. pldaprogram eddigi munknk gymlcst, a Tablazat osztlyt tartalmazza,
majd a program vgn ltrehoz egy Tablazat tpus objektumot s meghvja
valamennyi tagfggvnyt.
8
08_ora.qxd 8/3/2001 6:19 PM Page 130
130 8. ra
Objektumok 131
8.5. program (folytats)
40: function kiir()
41: {
42: print "<pre>";
43: foreach ( $this->oszlopNevek as $oszlopNev )
44: print "<B>$oszlopNev</B> ";
45: print "\n";
46: foreach ( $this->tablazatSorok as $y )
47: {
48: foreach ( $y as $xcella )
49: print "$xcella ";
50: print "\n";
51: }
52: print "</pre>";
53: }
54: }
55:
56: $proba = new Tablazat( array("a","b","c"));
57: $proba->ujSor( array(1,2,3));
58: $proba->ujSor( array(4,5,6));
59: $proba->ujNevesSor( array ( "b"=>0, "a"=>6, "c"=>3 ));
60: $proba->kiir();
61: ?>
62: </body>
63: </html>
8.1. bra
Egy Tablazat tpus
objektum kimenete
8
08_ora.qxd 8/3/2001 6:19 PM Page 132
132 8. ra
A kimenet csak akkor jelenik meg helyesen, ha az egy oszlopban lev elemek
egyforma hosszak.
Ami mg hinyzik...
Br az osztly hatkonyan elvgzi a munkt, amit neki szntunk, ha tbb idnk s
helynk lenne, kibvthetnnk nhny tovbbi szolgltatssal s adatvdelmi
lehetsggel.
Elszr is a kdot jra fel lehet hasznlni. Ennek clja jl meghatrozott: bizonyos
ltalnos adatkezelst tesz lehetv, amelyet ezutn beilleszthetnk brmely prog-
ramba, melynek arra van szksge, hogy ilyen tpus adatokat kezeljen s kirjon.
Msodszor, a Tablazat osztly tevkeny: megkrhetjk arra, hogy adatokat rjon ki,
anlkl, hogy bajldnunk kellene azzal, hogy vgigjrjuk a $tablazatSorok
elemeit.
Objektumok 133
rkls
Ahhoz, hogy olyan osztlyt hozzunk ltre, amely szolgltatsait szljtl rkli,
egy kicsit mdostanunk kell az osztly meghatrozst. A 8.6. pldaprogram
ismt a fejezet els felben lev tmakrbl mutat egy pldt.
8
08_ora.qxd 8/3/2001 6:19 PM Page 134
134 8. ra
Objektumok 135
8
08_ora.qxd 8/3/2001 6:19 PM Page 136
136 8. ra
szuloOsztalyNeve::tagfuggvenyNeve()
Objektumok 137
A konstruktor
Mr lthattuk, hogy a szl konstruktora hvdik meg, ha a gyermekosztlyban
nem hozunk ltre konstruktort. Most azonban azt szeretnnk, hogy konstruktorunk
tbbre legyen kpes, mint amennyit a Tablazat osztly konstruktora tett, ezrt
azt fell kell rnunk.
138 8. ra
A cellaMargoAllit() tagfggvny
A szrmaztatott osztly sajt, j tagfggvnyeket is ltrehozhat.
A cellaMargoAllit() tagfggvny segtsgvel a felhasznl a tblzat
szvege s a tblzat kztti res rs nagysgt llthatja be. Persze megtehetn
ezt a cellaMargo tulajdonsg kzvetlen elrsvel is ,de ez nem tl j tlet.
Alapszably, hogy az objektumot hasznl szemly rdekben legjobb tagfgg-
vnyeket ltrehozni erre a clra. Az osztlyok bonyolultabb leszrmazottaiban
a cellaMargoAllit() tagfggvny esetleg ms tulajdonsgokat is knytelen
mdostani, hogy megvltoztathassa a marg mrett. Sajnos nincs elegns md
ennek a kiknyszertsre.
A kiir() tagfggvny
A kiir() tagfggvny fellrja a Tablazat osztly azonos nev tagfggvnyt.
Ez a fggvny a szl osztly logikjval azonos mdon rja ki a tblzatot, de
a HTML table elemt hasznlja a tblzat formzsra.
function kiir()
{
print "<table cellPadding=\"$this->cellaMargo\"
border=1>\n";
print "<tr>\n";
foreach ( $this->oszlopNevek as $oszlopNev )
print "<th bgColor=\"$this
->hatterSzin\>$oszlopNev</th>;
print "</tr>\n";
08_ora.qxd 8/3/2001 6:19 PM Page 139
Objektumok 139
8
08_ora.qxd 8/3/2001 6:19 PM Page 140
140 8. ra
Objektumok 141
142 8. ra
8.2. bra
Egy HTMLTablazat
tpus objektum
kimenete
Kpzeljk el, hogy egy gyfl azt a megbzst adja neknk, hogy hozzunk ltre egy
osztlyt, amely olyan tblzatok kezelsre kpes, ahol a tblzat oszlopainak neve
van. Ha egyetlen rszbl ll osztlyt hozunk ltre, amelybe minden szolgltatst
(a HTML megjelents minden apr rszletvel) beleptnk, els ltsra minden
szpnek s jnak tnhet. De ha visszajn az gyfl, hogy szeretn, ha a program
zlsesen formzott szveges kimenetet eredmnyezne, valsznleg jabb tagfgg-
vnyeket kellene megprblnunk felvenni, melyek megoldjk a problmt.
08_ora.qxd 8/3/2001 6:19 PM Page 143
Objektumok 143
8.3. bra
Kapcsolatok
a Tablazat osztly s
gyermekei kztt
sszefoglals
Sajnos nincs r md, hogy az objektumkzpont programozst minden szempontbl
megvizsgljuk egy rvidke ra alatt, de remlem, hogy a fontosabb lehetsgeket
sikerlt bemutatni.
144 8. ra
Krdsek s vlaszok
Ebben az rban nhny bartsgtalan fogalommal tallkoztunk. Val-
ban szksges az objektumkzpontsgot megrteni ahhoz, hogy j
PHP programoz vlhasson az emberbl?
Erre a rvid vlasz: nem. A legtbb PHP programoz alig vagy egyltaln nem r
objektumkzpont programot. Az objektumkzpont megkzelts nem tesz
szmunkra olyan dolgokat lehetv, amelyek eddig elrhetetlenek voltak. A dolog
lnyege a programok szervezsben, az egyszer megrt programrszek jrahasz-
nostsban s a knny fejleszthetsgben rejlik. Mg ha el is hatroznnk, hogy
soha nem fogunk objektumkzpont programot rni, elfordulhat, hogy bele kell
javtanunk msok ltal rt programokba, amelyekben osztlyok vannak, ezrt rte-
nnk kell a szemllet alapjait. Ez az ra ebben is segtsget nyjthat.
Mhely
A mhelyben kvzkrdsek tallhatk, melyek segtenek megszilrdtani az rban
szerzett tudst. A vlaszokat az A fggelkben helyeztk el.
Kvz
1. Hogyan hoznnk ltre egy uresOsztaly nev osztlyt, amelynek nincsenek
tagfggvnyei s tulajdonsgai?
2. Adott egy uresOsztaly nev osztly. Hogyan hoznnk ltre egy pldnyt?
Objektumok 145
Feladatok
1. Hozzuk ltre a Szamolo nev osztlyt, amely kt egsz szmot trol.
rjunk hozz egy kiszamol() nev tagfggvnyt, amely kirja a kt szmot
a bngszbe!
8
08_ora.qxd 8/3/2001 6:19 PM Page 146
09_ora.qxd 8/3/2001 6:20 PM Page 147
III. RSZ
Munka a PHP-vel
9. ra rlapok
10. ra Fjlok hasznlata
11. ra A DBM fggvnyek hasznlata
12. ra Adatbzisok kezelse MySQL
13. ra Kapcsolat a klvilggal
14. ra Dinamikus kpek kezelse
15. ra Dtumok kezelse
16. ra Az adatok kezelse
17. ra Karakterlncok kezelse
18. ra A szablyos kifejezsek hasznlata
19. ra llapotok trolsa stikkel s GET tpus lekrdezsekkel
20. ra llapotok trolsa munkamenet-fggvnyekkel
21. ra Munka kiszolgli krnyezetben
22. ra Hibakeress
09_ora.qxd 8/3/2001 6:20 PM Page 148
09_ora.qxd 8/3/2001 6:20 PM Page 149
9. RA
rlapok
A knyv eddigi pldiban egy nagyon fontos dolgot nem lttunk. Ltrehoztunk
vltozkat s tmbket, ksztettnk s meghvtunk klnbz fggvnyeket,
klnfle objektumokkal dolgoztunk, eddigi ismereteink azonban rtelmetlenek,
amg a felhasznl ltal megadott adatokat kezelni nem tudjuk. Ebben az rban
ezt a tmakrt tekintjk t.
150 9. ra
rlapok 151
/php-konyv/urlapok/9.1.program.php
09_ora.qxd 8/3/2001 6:20 PM Page 152
152 9. ra
Egy HTML rlapot hoztunk ltre, amely egy "felhasznalo" nev szvegmezt,
egy "cim" nev szvegterletet, s egy gombot tartalmaz. Knyvnk nem fogla-
kozik rszletesen a HTML ismertetsvel, ha mgis nehznek talljuk a pldkat,
olvassunk el egy, a HTML nyelvvel foglalkoz ktetet vagy szmtgpes lerst.
A FORM elem ACTION paramtere a 9.3.program.php fjlra mutat, amely
feldolgozza az rlapon megadott adatokat. Mivel az ACTION csak a fjl nevt adja
meg, a HTML s PHP kdot tartalmaz fjloknak egy knyvtrban kell lennik.
rlapok 153
Ez a knyv els olyan programja, amelyet nem hivatkozson keresztl hvunk meg
s nem kzvetlenl a bngszbe rjuk be a cmt. A 9.3. pldban tallhat kdot
az 9.3.program.php fjlban troljuk. A fjlban lv kdot akkor hvjuk meg,
amikor a felhasznl kitlti a 9.2. pldban tallhat rlapot. A program
a $felhasznalo s a $cim vltozk rtkt rja ki, amelyek a HTML rlap
"felhasznalo" szvegmezjnek s "cim" terletnek rtkt tartalmazzk.
Lthat, hogy a PHP 4 segtsgvel milyen egyszeren kezelhetek az rlapok.
Brmilyen megadott informci globlis vltozknt hozzfrhet s a vltozk ne-
ve megegyezik a megfelel HTML elem nevvel.
154 9. ra
rlapok 155
Nem csak a SELECT elem engedlyezi tbb elem kivlasztst. Ha tbb jell-
ngyzetnek ugyanazt a nevet adjuk, ahol a felhasznl tbb elemet is kivlaszthat,
csak az utols kivlasztott rtket kapjuk meg, de ha a nevet res szgletes zrje-
lek kvetik, az adott nev elemeket a PHP tmbknt kezeli. A 9.4. plda SELECT
elemt jellngyzetekre cserlhetjk s ugyanazt a hatst rjk el:
156 9. ra
A fenti kd a GET krelmen keresztl rkezett paramterek neveit s rtkeit rja ki.
Termszetesen itt mg nem kezeltk azt az esetet, amikor valamelyik tadott para-
mter tmb. Ha a 9.4. pldaprogrammal olyan HTML rlaprl rkez adatok feldol-
gozst vgeztetjk, amelyben tbb elem kivlasztst engedlyez SELECT mez
szerepel, valami hasonlt olvashatunk:
rlapok 157
158 9. ra
rlapok 159
A fenti rlap sajt magt hvja meg, mert a FORM elem ACTION paramternek
a $PHP_SELF rtket adtunk. Vegyk szre, hogy nem ksztettnk gombot,
amely elkldi a bert szmot. Az jabb bngszk a szvegmez kitltse s
az ENTER lenyomsa utn automatikusan elkldik a megadott adatot, viszont
nhny rgebbi bngsz ezt nem teszi meg.
A 9.9. pldban lv program nem dinamikus, hiszen nem r ki semmit, ami a fel-
hasznltl fgg. A 9.10. pldban tovbbi PHP kdot ptnk az oldalba. Elszr
meg kell adnunk a szmot, amit a felhasznlnak ki kell tallnia. A teljes vltozatban
valsznleg vletlenszmot lltannk el, most azonban egyszeren megadjuk,
mondjuk a 42-t. Ezutn megnzzk, hogy az rlapot kitltttk-e mr, klnben
09_ora.qxd 8/3/2001 6:20 PM Page 160
160 9. ra
rlapok 161
162 9. ra
rlapok 163
A felhasznl tirnytsa
Programunknak van egy nagy htultje. Az rlap mindig jratltdik, akr kita-
llta a felhasznl a szmot, akr nem. A HTML nyelvben sajnos elkerlhetetlen
az egsz oldal jratltse, a felhasznlt azonban tirnythatjuk egy gratull
oldalra, ha kitallta a szmot.
164 9. ra
rlapok 165
Elszr ltre kell hoznunk egy HTML rlapot, amely tartalmazza a fjlfeltlt me-
zt, melynek egyik paramtere ktelezen a kvetkez:
ENCTYPE="multipart/form-data"
A feltlt mez eltt meg kell adnunk egy rejtett mezt is. Ennek neve
MAX_FILE_SIZE kell, hogy legyen, s a fogadand fjl lehetsges legnagyobb
mrett adja meg, bjtban. Nem lehet nagyobb, mint a php.ini fjlban megadott
09_ora.qxd 8/3/2001 6:20 PM Page 166
166 9. ra
Vegyk szre, hogy a program meghvja az oldalt, amely tartalmazza, hogy PHP
kddal kezeljk a fjlt. A legnagyobb fjlmretet 50 kilobjtban adjuk meg s
"fajl"-nak nevezzk el.
rlapok 167
168 9. ra
rlapok 169
lnv alatt futnak, ezrt mieltt msolatot ksztennk a fjlrl, ellenriznnk kell,
hogy a mvelet engedlyezett-e. Az or mvelettel a die() fggvnyt hasznljuk,
ha a msols sikertelen. Ezt a mdszert a tizedik, a fjlokkal foglalkoz rban rszle- 9
tesebben ttekintjk.
Msols utn az eredeti fjlt nem kell trlnnk, a PHP ezt megteszi helyettnk.
Ha nem msoljuk vagy helyezzk t a feltlttt llomnyt, a fjl elvsz, mivel az
a PHP kd vgrehajtsa utn trldik az ideiglenes knyvtrbl.
sszefoglals
Eddig olyan dolgokat tanultunk, amelyek segtsgvel igazi interaktv krnyezetet
hozhatunk ltre. Van azonban mg nhny tanulnival. A felhasznlrl kpesek
vagyunk informcikat szerezni, de mit tegynk ezekkel? Pldul fjlba rhatjuk.
Ez lesz a kvetkez ra tmja.
Krdsek s vlaszok
Ltre lehet hozni tmbt olyan elemek trolsra is, amelyek nem
vlasztmezvel vagy jellngyzetekkel megadottak?
Igen. Minden elem, amely nevnek vgn res szgletes zrjel van, tmbknt t-
roldik, gy az elemek csoportba rendezhetk.
170 9. ra
Mhely
A mhelyben kvzkrdsek tallhatk, melyek segtenek megszilrdtani az rban
szerzett tudst. A vlaszokat az A fggelkben helyeztk el.
Kvz
1. Melyik krnyezeti vltoz tartalmazza a felhasznl IP cmt?
Feladatok
1. Ksztsnk szmolgp-programot, amelyben a felhasznl megadhat kt
szmot s a rajtuk vgrehajtand mveletet (sszeads, kivons, szorzs vagy
oszts ezeket ismerje a program).
10. RA
Fjlok hasznlata
A programozsi nyelvek egyik legfontosabb lehetsge, hogy fjlokat lehet ltre-
hozni, olvasni, rni velk. A PHP-nek szintn megvannak ezek a tulajdonsgai.
Ebben a fejezetben ezeket a lehetsgeket fogjuk ttekinteni:
172 10. ra
Eddig, ha olyan kdot rtunk, amelyet tbbszr is fel akartunk hasznlni, minden
egyes helyre be kellett msolnunk azt. Ha hibt talltunk benne vagy lehetsgeit
tovbb akartuk bvteni, mindentt t kellett rnunk. Ezekre a problmkra megol-
ds az include() fggvny. Gyakran hasznlt fggvnyeinket kls fjlba ment-
hetjk s az include() fggvnnyel futsi idben tlthetjk be programunkba.
Az include() fggvny paramtere a fjl elrsi tja. A 10.1. pldban lthat,
hogyan gyazhat be egy fjl a PHP kdba az include() fggvny segtsgvel.
174 10. ra
$proba = false;
if ( $proba )
{
include( "egy_fajl.txt" ); //nem gyazza be
}
10
15: </body>
16: </html>
A 10.7. programban tallhat kd futs kzben hrom klnbz fjlt gyaz be,
ezek az "incfajl1.txt", "incfajl2.txt" s "incfajl3.txt".
Mindegyik fjl tartalmazza a nevt s azt a szveget, hogy begyaztk:
Fjlok vizsglata
Mieltt elkezdnk ismerkedni a fjlokkal s knyvtrakkal, fussunk t nhny
velk kapcsolatos tudnivalt. A PHP 4 igen sok lehetsget ad arra, hogy a rend-
szernkben tallhat fjlokon klnbz mveleteket hajtsunk vgre. A kvetkez
bekezdsekben ezeket a fggvnyeket tekintjk t.
176 10. ra
if ( file_exists("proba.txt") )
print("A fjl ltezik!");
if ( is_file( "proba.txt" ) )
print("a proba.txt egy fjl");
if ( is_dir( "/tmp" ) )
print "a /tmp egy knyvtr";
if ( is_readable( "proba.txt" ) )
print "a proba.txt olvashat";
if ( is_writeable( "proba.txt" ) )
print "a proba.txt rhat";
if ( is_executable( "proba.txt" )
print "a proba.txt futtathat";
Klnfle fjlinformcik
Szksgnk lehet r, hogy tudjuk, mikor hoztk ltre a fjlt vagy mikor hasznltk
utoljra. A PHP-vel ezeket az informcikat is megszerezhetjk.
178 10. ra
if ( is_file( $f ) )
print "$f fjl<br>";
else
print "$f nem fjl<br>";
180 10. ra
touch("sajat_fajl.txt");
unlink("sajat_fajl.txt");
A ltrehozs, trls, rs, olvass, mdosts csak akkor lehetsges egy fjlon,
ha a megfelel jogosultsgokkal rendelkeznk.
Amikor befejeztk a munkt egy fjllal, mindig be kell zrnunk azt. Ezt az fclose()
fggvnnyel tehetjk meg, amelynek paramterben azt a fjlazonostt kell megad-
10
nunk, amelyet egy sikeres fopen() vgrehajtsa sorn kaptunk:
fclose( $fa );
Olvass fjlbl
A PHP-ben egy fjlbl klnbz fggvnyek segtsgvel bjtonknt, soronknt
vagy karakterenknt olvashatunk.
Tudnunk kell teht, mikor rnk a fjl vgre. Ezt az feof() fggvny adja meg,
melynek visszatrsi rtke true, ha a fjl vgre rtnk, egybknt false.
A fggvny paramterben egy fjlazonostt kell megadni.
A 10.9. pldban lthatjuk, hogyan kell egy fjlt sorrl sorra beolvasni.
10_ora.qxd 8/3/2001 6:20 PM Page 182
182 10. ra
4: </head>
fggvnnyel</title> 10
5: <body>
6: <?php
7: $fajlnev = "proba.txt";
8: $fa = fopen( $fajlnev, "r" ) or die("$fajlnev nem
nyithat meg");
9: while ( ! feof( $fa ) )
10: {
11: $reszlet = fread( $fa, 16 );
12: print "$reszlet<br>";
13: }
14: fclose($fa);
15: ?>
16: </body>
17: </html>
Br az fread() fggvnynek megadjuk, mennyi adatot olvasson ki, azt nem tudjuk
meghatrozni, hogy honnan kezdje az olvasst. Erre az fseek() ad lehetsget,
ezzel a fggvnnyel llthat be az olvass helye. Paramterknt egy fjlazonostt
s egy egsz szmot kell megadnunk, amely a fjl elejtl bjtban mrve meghat-
rozza az j olvassi helyet:
fseek( $fa, 64 );
184 10. ra
Fjlba rs s hozzfzs
A fjlba rs s a hozzfzs nagyon hasonltanak egymshoz. Az egyetlen klnbsg
az fopen() hvsban rejlik. Amikor rsra nyitjuk meg a fjlt, akkor az fopen()
msodik paramtereknt a "w" karaktert kell megadnunk:
Minden rsi prblkozs a fjl elejn trtnik. Ha a fjl mg nem ltezne, a rend-
szer ltrehozza azt. Ha a fjl ltezik, tartalma fellrdik a megadott adatokkal.
186 10. ra
Munka knyvtrakkal
Az elzekben ttekintettk, hogyan kezelhetjk a fjlokat, most megnzzk,
hogyan hozhatunk ltre, trlhetnk s olvashatunk knyvtrakat a PHP-ben.
188 10. ra
rmdir( "proba_konyvtar" );
10
10: {
11: if ( is_dir( "$kvtnev/$fajl" ) )
12: print "(D)";
13: print "$fajl<br>";
14: }
15: closedir( $kvt );
16: ?>
17: </body>
18: </html>
.
..
Amikor a ciklus elri a "0" nev fjlt, a readdir() false rtknek veszi s
a ciklus lell. A 10.14. pldban a readdir() fggvny visszatrsi rtknek
tpust vizsgljuk s ezzel oldjuk meg a problmt.
10_ora.qxd 8/3/2001 6:20 PM Page 190
190 10. ra
sszefoglals
Ebben az rban megtanultuk, hogyan gyazhatunk be a dokumentumokba kls
fjlban trolt PHP kdot. ttekintettk a fjlok klnbz tulajdonsgainak ellen-
rzst, megnztnk, hogyan olvashatunk fjlokat sorrl sorra, karakterenknt,
vagy meghatrozott rszletekben. Megtanultuk, hogyan rhatunk fjlba s hogyan
fzhetnk karakterlncokat hozz. Vgl ttekintettk, hogyan hozhatunk ltre,
trlhetnk, vagy listzhatunk ki knyvtrakat.
Krdsek s vlaszok
Az include() fggvny lasstja a programok futst?
Mivel a begyazott fjlt meg kell nyitni s a tartalmt be kell olvasni, ezrt azt kell
mondjuk, hogy igen, a lassuls azonban nem szmottev.
Mhely
A mhelyben kvzkrdsek tallhatk, melyek segtenek megszilrdtani az rban
szerzett tudst. A vlaszokat az A fggelkben helyeztk el.
Kvz
1. Melyik fggvnnyel adhat programunkhoz kls kdot tartalmaz fjl?
Feladatok 10
1. Ksztsnk egy oldalt, amely bekri a felhasznl vezetk- s keresztnevt.
Ksztsnk programot, amely ezen adatokat fjlba menti.
11. RA
A DBM fggvnyek hasznlata
Ha nem is frnk hozz valamilyen SQL adatbziskezelhz (mint a MySQL vagy
az Oracle), majdnem biztos, hogy valamilyen DBM-szer adatbzisrendszer ren-
delkezsnkre ll. Ha mgsem, a PHP akkor is kpes utnozni szmunkra egy
ilyen rendszer mkdst. A DBM fggvnyek segtsgvel lnyegben nvrtk
prokat trolhatunk s kezelhetnk.
Noha ezek a fggvnyek nem biztostjk szmunkra egy SQL adatbzis erejt, ru-
galmasak s knnyen hasznlhatk. Mivel a formtum igen elterjedt, az e fggv-
nyekre pl kd ltalban hordozhat, noha maguk a DBM adatokat tartalmaz
llomnyok nem azok.
194 11. ra
dbmclose ( $dbm );
11_ora.qxd 8/3/2001 6:20 PM Page 195
196 11. ra
198 11. ra
11.1. bra
A DBM adatbzis
sszes bejegyzsnek
lekrdezse.
11_ora.qxd 8/3/2001 6:20 PM Page 199
$tomb = array( 1, 2, 3, 4 );
$dbm = dbmopen( "./adat/proba", "c" ) or
die("Nem lehet megnyitni a DBM adatbzist.");
dbminsert( $dbm, "tombproba", $tomb );
print gettype( dbmfetch( $dbm, "tombproba" ) );
// A kimenet: "string"
200 11. ra
$tomb = array( 1, 2, 3, 4 );
print serialize( $tomb );
// A kimenet: "a:4:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;}"
202 11. ra
11.2. bra
sszetett adatszerke-
zetek visszaolvassa
DBM adatbzisbl
11_ora.qxd 8/3/2001 6:20 PM Page 203
Egy plda
Mr eleget tudunk ahhoz, hogy elksztsnk egy mkdkpes programot
az ebben az rban tanult mdszerekkel. A feladat a kvetkez: ksztsnk egy
karbantart oldalt, ahol a webhely szerkesztje megvltoztathatja a 11.2. plda-
program ltal ltrehozott adatbzis termkeinek rt. Tegyk lehetv a rendszer-
gazda szmra, hogy j elemekkel bvtse az adatbzist, illetve hogy a rgi eleme-
ket trlje. Az oldalt nem tesszk nyilvnos kiszolgln elrhetv, ezrt
a biztonsgi krdsekkel most nem foglalkozunk.
204 11. ra
A tblzat els mezje minden sorban egy jellngyzetet tartalmaz. Vegyk sz-
re, hogy mindegyik jellngyzet neve "torles[]". Ennek hatsra a PHP ltre-
hozza a $torles tmbt, amely az sszes bejellt elemet tartalmazza. A jell-
ngyzetekhez tartoz rtkek, gy a $torles tmb elemei is azok az azonostk
lesznek, amelyekkel a DBM adatbzis az adott termket nyilvntartja (ezt az rt-
ket a $kulcs vltozban troljuk). gy, miutn a rendszergazda kitlttte s
elkldte az rlapot, a program $torles tmbje azon adatbzis-elemek kulcsait
fogja trolni, amelyeket trlnnk kell.
11_ora.qxd 8/3/2001 6:20 PM Page 205
11.3. bra
HTML rlap ksztse
DBM adatbzis
alapjn
11
Miutn elksztettk az rlapot, meg kell rnunk a kdot, amely a felhasznl ltal
megadott adatokat kezeli. A feladat nem olyan nehz, mint amilyennek ltszik.
Elszr trljk a kijellt elemeket az adatbzisbl, majd mdostjuk az rakat,
vgl felvesszk az j elemet az adatbzisba.
if ( isset ( $torles ) )
{
foreach ( $torles as $kulcs => $ertek )
{
unset( $arak[$ertek]);
dbmdelete( $dbm, $ertek );
}
}
11_ora.qxd 8/3/2001 6:20 PM Page 206
206 11. ra
if ( isset ( $arak ) )
{
foreach ( $arak as $kulcs => $ertek )
dbmreplace( $dbm, $kulcs, $ertek );
}
208 11. ra
sszefoglals
Ebben az rban megtanultuk, hogyan hasznljuk a PHP hatkony DBM fggvnye-
it adatok trolsra s visszaolvassra. Megtanultuk a dbmopen() hasznlatt egy
j DBM azonost ltrehozsra. Ezt az azonostt hasznltuk az sszes tbbi DBM
fggvnynl is. j adatokat adtunk az adatbzishoz a dbminsert() fggvnnyel,
mdostottunk meglevket a dbmreplace()-szel s trltnk a dbmdelete()
hasznlatval. Megtanultuk, hogyan hasznlhatjuk a dbmfetch() fggvnyt
az adatok visszaolvassra. A serialize() s unserialize() fggvnyekkel
sszetett adatszerkezeteket troltunk DBM adatbzisban, vgl egy gyakorlati
pldn keresztl megnztk, hogyan is hasznlhatk fel e mdszerek a vals
problmk megoldsra.
11
Krdsek s vlaszok
Mikor hasznljak DBM adatbzist SQL adatbzis helyett?
A DBM j vlaszts, ha kis mennyisg s viszonylag egyszer szerkezet adatot sze-
retnnk trolni (nvrtk prokat). A DBM adatbzist hasznl programok rendel-
keznek a hordozhatsg nagyon fontos elnyvel, de ha nagyobb mennyisg ada-
tot kell trolnunk, vlasszunk inkbb egy SQL adatbziskezelt, pldul a MySQL-t.
Mhely
A mhelyben kvzkrdsek tallhatk, melyek segtenek megszilrdtani az rban
szerzett tudst. A vlaszokat az A fggelkben helyeztk el.
Kvz
1. Melyik fggvnyt hasznlhatjuk egy DBM adatbzis megnyitshoz?
210 11. ra
Feladatok
1 Hozzunk ltre egy DBM adatbzist a felhasznlk azonostinak s jelszavai-
nak trolsra. Ksztsnk egy programot, amellyel a felhasznlk ltrehoz-
hatjk a rjuk vonatkoz bejegyzst. Ne feledjk, hogy kt azonos nev elem
nem kerlhet az adatbzisba.
12. RA
Adatbzisok kezelse MySQL
A PHP nyelv egyik meghatroz tulajdonsga, hogy nagyon knnyen kpes adat-
bzisokhoz csatlakozni s azokat kezelni. Ebben az rban elssorban a MySQL
adatbzisokkal foglalkozunk, de amint majd szre fogjuk venni, a PHP ltal tmo-
gatott sszes adatbzist hasonl fggvnyek segtsgvel rhetjk el. Mirt esett
a vlaszts ppen a MySQL-re? Mert ingyenes, ugyanakkor nagyon hatkony
eszkz, amely kpes megfelelni a vals feladatok ltal tmasztott ignyeknek is.
Az sem elhanyagolhat szempont, hogy tbbfle rendszerhez is elrhet.
A MySQL adatbziskiszolglt a http://www.mysql.com cmrl tlthetjk le.
Ebben az rban a kvetkez tmkkal foglalkozunk:
Tanulunk a hibakezelsrl.
212 12. ra
Ez az utasts csak azokat a sorokat rja ki, amelyekben a keresztnev mez rtke
"Gbor".
Csatlakozs a kiszolglhoz
Mieltt elkezdhetnnk dolgozni az adatbzissal, csatlakoznunk kell a kiszolgl-
hoz. A PHP-ben erre a mysql_connect() fggvny szolgl. A fggvny hrom
karakterlncot vr paramterknt: a gazdagp nevt, a felhasznl nevt s
a jelszt. Ha ezek egyikt sem adjuk meg, a fggvny felttelezi, hogy a krs
a localhost-ra (azaz a helyi gpre) vonatkozik s felhasznlknt a PHP-t futta-
t felhasznlt, jelszknt pedig egy res karakterlncot ad t. Az alaprtelmezs
12_ora.qxd 8/3/2001 6:20 PM Page 214
214 12. ra
Az adatbzis kivlasztsa
Miutn kialaktottuk a kapcsolatot a MySQL dmonnal, ki kell vlasztanunk, melyik
adatbzissal szeretnnk dolgozni. Erre a clra a mysql_select_db() fggvny
szolgl, amelynek meg kell adnunk a kivlasztott adatbzis nevt s szksg szerint
egy kapcsolatazonost rtket. Ha ez utbbit elhagyjuk, automatikusan a legutolj-
ra ltrehozott kapcsolat helyettestdik be. A mysql_select_db() fggvny igaz
rtket ad vissza, ha az adatbzis ltezik s jogunk van a hasznlatra. A kvetkez
kdrszlet a pelda nev adatbzist vlasztja ki.
$adatbazis = "pelda";
mysql_select_db( $adatbazis ) or die ( "Nem lehet
megnyitni a kvetkez adatbzist: $adatbazis" );
12_ora.qxd 8/3/2001 6:20 PM Page 215
Hibakezels
Eddig ellenriztk a MySQL fggvnyek visszatrsi rtkt s hiba esetn a die()
fggvnnyel kilptnk a programbl. A hibakezelshez azonban hasznosabb lenne,
ha a hibazenetek valamivel tbb informcit tartalmaznnak. Ha valamilyen mve-
let nem sikerl, a MySQL bellt egy hibakdot s egy hibazenetet. A hibakdhoz
a mysql_errno(), mg a hibazenethez a mysql_error() fggvnnyel frhe-
tnk hozz. A 12.1 plda az eddigi kdrszleteinket teljes programm kapcsolja
ssze, amely kapcsoldik az adatbziskezelhz s kivlasztja az adatbzist. A hiba-
zenetet a mysql_error() fggvnnyel tesszk hasznlhatbb.
216 12. ra
Az adatok felvitelhez ssze kell lltanunk s le kell futtatnunk egy SQL parancsot,
erre a clra a PHP-ben a mysql_query() fggvny szolgl. A fggvny param-
terknt egy SQL parancsot tartalmaz karakterlncot s szksg szerint egy kapcso-
latazonostt vr. Ha ez utbbit elhagyjuk, a fggvny automatikusan az utoljra
megnyitott kapcsolaton keresztl prblja meg kiadni az SQL parancsot. Ha a prog-
ram sikeresen lefutott, a mysql_query()pozitv rtket ad vissza, ha azonban
formai hibt tartalmaz vagy nincs jogunk elrni a kvnt adatbzist, a visszatrsi
rtk hamis lesz. Meg kell jegyeznnk, hogy egy sikeresen lefutott SQL program
nem felttlenl okoz vltozst az adatbzisban vagy tr vissza valamilyen ered-
mnnyel. A 12.2 pldban kibvtjk a korbbi programot s a mysql_query()
fggvnnyel kiadunk egy INSERT utastst a pelda adatbzis tartomanyok
tbljn.
12_ora.qxd 8/3/2001 6:20 PM Page 217
Vegyk szre, hogy nem adtunk rtket az azonosito meznek. A mez rtke
automatikusan nvekszik az INSERT hatsra.
218 12. ra
12.3.program (folytats)
35: return false;
36: }
37: $parancs = "INSERT INTO tartomanyok ( tartomany,
nem, email )
38: VALUES ( '$tartomany', '$nem', '$email' )";
39: if ( ! mysql_query( $parancs, $kapcsolat ) )
40: {
41: $dbhiba = mysql_error();
42: return false;
43: }
44: return true;
45: }
46:
47: function urlap_keszit()
48: {
49: global $PHP_SELF;
12
50: print "<form action=\"$PHP_SELF\"
method=\"POST\">\n";
51: print "A kvnt tartomny<p>\n";
52: print "<input type=\"text\" name=\"tartomany\"> ";
53: print "Email cm<p>\n";
54: print "<input type=\"text\" name=\"email\"> ";
55: print "<select name=\"nem\">\n";
56: print "\t<option value=\"N\"> N\n";
57: print "\t<option value=\"F\"> Frfi\n";
58: print "</select>\n";
59: print "<input type=\"submit\"
value=\"Elkld\">\n</form>\n";
60: }
61: ?>
62: </body>
63: </html>
220 12. ra
Adatok lekrdezse
Miutn adatainkat mr kpesek vagyunk az adatbzisban trolni, megismerkedhe-
tnk azokkal a mdszerekkel, amelyek az adatok visszanyersre szolglnak. Mint
bizonyra mr nyilvnval, a mysql_query() fggvny hasznlatval ki kell 12
adnunk egy SELECT utastst. Az azonban mr korntsem ilyen egyszer, hogyan
jutunk hozz a lekrdezs eredmnyhez. Nos, miutn vgrehajtottunk egy sikeres
SELECT-et, a mysql_query() visszaad egy gynevezett eredmnyazonostt,
melynek felhasznlsval elrhetjk az eredmnytblt s informcikat nyerhe-
tnk rla.
222 12. ra
Az eredmnytbla elrse
Miutn vgrehajtottuk a SELECT lekrdezst s az eredmnyazonostt troltuk,
egy ciklus segtsgvel frhetnk hozz az eredmnytbla soraihoz. A PHP egy
bels mutat segtsgvel tartja nyilvn, hogy melyik sort olvastuk utoljra.
Ha kiolvasunk egy eredmnysort, a program automatikusan a kvetkezre ugrik.
224 12. ra
Adatok frisstse
Az adatokat az UPDATE utastssal frissthetjk, amelyet termszetesen
a mysql_query() fggvnnyel kell tadnunk az adatbzis kiszolgljnak.
Itt is igazak a korbban elmondottak, azaz egy sikeres UPDATE utasts nem
felttlenl jelent vltozst az adatokban. A megvltozott sorok szmt
a mysql_affected_rows() fggvnnyel krdezhetjk le, amelynek szksg
szerint egy kapcsolatazonostt kell tadnunk. Ennek hinyban a fggvny
mint azt mr megszokhattuk a legfrissebb kapcsolatra rtelmezi a mveletet.
A mysql_affected_rows() fggvnyt brmely olyan SQL lekrdezs utn
hasznlhatjuk, amely felteheten mdostott egy vagy tbb sort az adattblban.
A 12.6. plda egy olyan programot tartalmaz, amely lehetv teszi az adatbzis
karbantartja szmra, hogy brmelyik sor tartomany mezjt megvltoztassa.
226 12. ra
Informcik az adatbzisokrl
Mindezidig egyetlen adatbzisra sszpontostottunk, megtanulva, hogyan lehet
adatokkal feltlteni egy tblt s az adatokat lekrdezni. A PHP azonban szmos
olyan eszkzzel szolgl, amelyek segtsgvel megllapthatjuk, hny adatbzis
hozzfrhet az adott kapcsolaton keresztl s milyen ezek szerkezete.
228 12. ra
12.1. bra
Az elrhet adatb-
zisok listja
12_ora.qxd 8/3/2001 6:20 PM Page 229
Adatbzistblk listzsa
A mysql_list_tables() fggvnnyel egy adott adatbzis tblinak nevt sorol-
tathatjuk fel. A fggvny paramterei az adatbzis neve s szksg szerint a kapcso-
lat azonostja. A visszatrsi rtk egy eredmnyazonost, ha az adatbzis ltezik
s jogunk van hozzfrni. Az eredmnyazonostt mysql_tablename() vagy
mysql_fetch_row() hvsokhoz hasznlhatjuk fel, a fent ltott mdon.
230 12. ra
232 12. ra
12.2. bra
Az sszes elrhet
adatbzis, tbla s
mez listja
sszefoglals 12
Ebben az rban a MySQL adatbziskezels alapjait tanultuk meg: az adatok
trolst s visszanyerst.
234 12. ra
Krdsek s vlaszok
Ez az ra szigoran a MySQL-re vonatkozik. Hogyan ltethetjk t ezeket
a fogalmakat ms adatbzissal mkd rendszerekre?
Az mSQL-kezel fggvnyek pldul szinte teljesen megegyeznek a MySQL fgg-
vnyekkel, de ms SQL kiszolglknak is megvannak a sajt PHP fggvnyeik.
SQL utastsokat minden adatbziskiszolglnak kldhetnk. Ha szabvnyos ANSI
SQL-lel dolgozunk, nem lesz klnsebb problmnk az adatbziskiszolglk k-
ztti tllskor.
Mhely
A mhelyben kvzkrdsek tallhatk, melyek segtenek megszilrdtani az rban
szerzett tudst. A vlaszokat az A fggelkben helyeztk el.
Kvz
1. Hogyan kell csatlakozni a MySQL adatbziskiszolglhoz?
Feladatok
1. Hozzunk ltre egy adattblt hrom mezvel: email (legfeljebb 70 karakter),
uzenet (legfeljebb 250 karakter) s datum (a UNIX idblyegzt tartalmaz
egsz szm). Tegyk lehetv a felhasznlknak, hogy feltltsk az adat-
bzist.
12
12_ora.qxd 8/3/2001 6:20 PM Page 236
13_ora.qxd 8/3/2001 6:21 PM Page 237
13. RA
Kapcsolat a klvilggal
Ezen az rn olyan fggvnyekkel ismerkednk meg, amelyek a klvilggal val
rintkezst teszik lehetv. Az ra sorn a kvetkezkrl tanulunk:
Levlklds programbl
13_ora.qxd 8/3/2001 6:21 PM Page 238
238 13. ra
Krnyezeti vltozk
Mr tallkoztunk nhny krnyezeti vltozval; ezeket a PHP a kiszolgl segtsg-
vel bocstotta rendelkezsnkre. Nhny ilyen vltozval tbb dolgot is megtudha-
tunk weboldalunk ltogatirl, arra azonban gondoljunk, hogy lehet, hogy ezek
a vltozk a mi rendszernkn nem elrhetk, esetleg a kiszolglprogram nem
tmogatja azokat, gy hasznlatuk eltt rdemes ezt ellenrizni. A 13.1. tblzat ezek
kzl a vltozk kzl mutat be nhnyat.
<A HREF='13.1.program.php/tovabbi/utvonal?nev=ertek'>gyernk</A>
13.1. bra 13
Nhny krnyezeti
vltoz kiratsa
a bngszben
240 13. ra
A krs
Az gyfl szigor szablyok szerint krhet adatokat a kiszolgltl. A krs legfel-
jebb hrom rszbl llhat:
A krs sora
13
Fejlc
Trzs
A legfontosabb a krs sora. Itt hatrozzuk meg a krs fajtjt (GET, HEAD vagy
POST), a krt dokumentum cmt s az tviteli protokoll vltozatszmt
(HTTP/1.0 vagy HTTP/1.1). Egy jellemz krs a kvetkezkppen nz ki:
Ekkor az gyfl egy GET krst kezdemnyez. Ms szval lekr egy dokumentumot,
de adatokat nem kld. (Valjban kisebb mennyisg adat kldsre a GET krs
alkalmazsakor is van lehetsg, ha azt lekrdez karakterlnc formjban hozzr-
juk az URL vghez.) A HEAD mdszer akkor alkalmazand, ha nem magra
a dokumentumra, csak annak tulajdonsgaira vagyunk kvncsiak, vgl a POST
krs arra szolgl, hogy adatokat kldjnk az gyfltl a kiszolglnak. Ez legtbb-
szr HTML rlapok esetben hasznlatos.
13_ora.qxd 8/3/2001 6:21 PM Page 242
242 13. ra
A 13.2 pldban egy jellemz, mindennapos krst mutatunk be, melyet egy
Netscape 4.7 kezdemnyezett.
13_ora.qxd 8/3/2001 6:21 PM Page 243
A vlasz
Miutn a kiszolgl fogadta az gyfl krst, vlaszt kld. A vlasz ltalban
a kvetkez hrom rszbl tevdik ssze:
llapot
Fejlc
Trzs
Amint ltjuk, a krs s a vlasz szerkezete igen hasonl. A fejlc bizonyos sorai
13
tulajdonkppen gyfl s kiszolgl ltal kldve egyarnt meglljk helyket,
nevezetesen azok, amelyek a trzsre vonatkoznak.
244 13. ra
HTTP/1.1 200 OK
246 13. ra
Ha megnzzk ezt az oldalt, akkor a PHP honlapjt kell ltnunk, azzal a kis
klnbsggel, hogy a kpek nem jelennek meg. Ennek oka, hogy az oldalon tall-
hat IMG hivatkozsok ltalban relatvak, gy az oldal megjelentsekor a bng-
sz a mi kiszolglnkon keresi azokat. Ezen gy segthetnk, hogy a HEAD HTML
elemet az albbi sorral bvtjk:
<base href="http://www.php.net/index.php">
248 13. ra
Vannak esetek, amikor meg kell hamistani a fejlceket. Szksgnk lehet pldul
olyan adatokra, amelyeket a kiszolgl csak Netscape bngsznek kld el.
Ezek elrsnek egyetlen mdja, ha a User-Agent fejlcsorban egy Netscape
bngszre jellemz karakterlncot kldnk. Ennek a webmesterek nem igazn
rlnek, hiszen dntseiket a kiszolgl gyjttte statisztikk alapjn kell meghoz-
niuk. Hogy segthessnk ebben nekik, lehetleg ne hamistsuk meg adatainkat,
hacsak felttlenl nem szksges.
250 13. ra
13.2. bra
Kiszolglk vlaszt
megjelent program
13
NNTP kapcsolat ltrehozsa az fsockopen()-nel
Az fsockopen() fggvny tetszleges internetkiszolglval kpes kapcsolatot
teremteni. A 13.8. pldban egy NNTP (Usenet) kiszolglhoz kapcsoldunk:
kivlasztunk egy hrcsoportot, majd megjelentjk els zenetnek fejlct.
252 13. ra
A 13.8. program egy kicsit tbbet mutat annl, hogyan nyissunk az fsockopen()-
nel NNTP kapcsolatot. Vals alkalmazs esetn a visszakapott sorok elemzst
clszer egy fggvnnyel vgezni, egyrszt azrt, hogy megszabaduljunk az ismt-
lsektl, msrszt azrt, hogy tbb adatot is kinyerhessnk a vlaszbl. Mieltt
azonban jra feltallnnk a kereket, clszer, ha megismerkednk a PHP IMAP
fggvnyeivel, amelyekkel mindez a munka automatizlhat.
254 13. ra
13.3. bra
NNTP kapcsolat
megteremtse
$cimzett = "valaki@tartomany.hu";
$targy = "dvzlet";
$uzenet = "ez csak egy prba zenet! ";
mail( $cimzett, $targy, $uzenet ) or
print "A levl elkldse sikertelen";
13_ora.qxd 8/3/2001 6:21 PM Page 255
$cimzett = "valaki@tartomany.hu";
$felado = "masvalaki@masiktartomany.hu";
$targy = "dvzlet ";
$uzenet = "ez csak egy proba zenet! ";
mail( $cimzett, $targy, $uzenet,
"From: $felado\r\nX-Priority: 1 (Highest)" )
or print "A levl elkldse sikertelen";
sszefoglals
Ezen az rn megtudhattuk, hogyan vethetjk be a krnyezeti vltozkat, ha tbb
adatot szeretnnk megtudni ltogatinkrl. Ha nem tudjuk a ltogat gpnek
nevt, a gethostbyaddr() fggvnnyel kiderthetjk.
13
Lthattuk miknt zajlik egy HTTP kapcsolat megteremtse a kiszolgl s
az gyfl kztt, megtanultuk, hogyan tltsnk le egy dokumentumot a webrl
az fopen() segtsgvel s hogyan ptsk ki sajt HTTP kapcsolatunkat
az fsockopen() fggvny felhasznlsval. Az fsockopen()-nel ms hlzati
szolgltatsokhoz is kapcsoldtunk, vgl pedig elektronikus levelet kldtnk
a programbl a mail() fggvny egyszer meghvsval.
Krdsek s vlaszok
A HTTP meglehetsen misztikusnak tnik. Tnyleg szksg van az ismere-
tre, ha j PHP kdot szeretnnk rni?
Nem. Kitn programok kszthetk a kiszolgl-gyfl prbeszd rszletes isme-
rete nlkl is. Msfell azonban szksg van ilyen alapvet ismeretekre, ha kicsit
bonyolultabb feladatokat szeretnnk programozottan vgrehajtani, pldul
weboldalakat letlteni.
13_ora.qxd 8/3/2001 6:21 PM Page 256
256 13. ra
Mhely
A mhelyben kvzkrdsek tallhatk, melyek segtenek megszilrdtani az rban
szerzett tudst. A vlaszokat az A fggelkben helyeztk el.
Kvz
1. Mely krnyezeti vltoz rulja el neknk annak a lapnak a cmt, amely
a programunkra hivatkozott?
Feladatok
1. Ksztsnk egy programot, amely egy webcmet kr be (pldul
http://www.kiskapu.hu/) a felhasznltl, majd egy HEAD krst
kldve felveszi a kapcsolatot azzal. Jelentsk meg a kapott vlaszt a bng-
szben. Ne feledkezznk meg arrl, hogy a kapcsolat nem mindig jn ltre.
13
13_ora.qxd 8/3/2001 6:21 PM Page 258
14_ora.qxd 8/3/2001 6:21 PM Page 259
14. RA
Dinamikus kpek kezelse
Az ezen az rn vett fggvnyek a GD nev nylt forrskd programknyvtron
alapulnak.
260 14. ra
Egy tglalapot hoztunk ltre, de egyelre nem tudjuk annak sznt belltani.
14_ora.qxd 8/3/2001 6:21 PM Page 261
14.1. bra
Dinamikusan ltre-
hozott alakzat
A szn belltsa
A szn belltshoz egy sznazonostra van szksgnk. Ezt
az imagecolorallocate() fggvnnyel kaphatjuk meg, amelynek paramtere
a kpazonost, illetve hrom 0 s 255 kztti egsz szm, amelyek a vrs, zld
s kk sznsszetevket jelentik. Egy sznazonostt kapunk vissza, amellyel k-
sbb alakzatok, kitltsek vagy szvegek sznt hatrozhatjuk meg.
Vonalak rajzolsa
Mieltt egy kpre vonalat rajzolhatnnk, meg kell adnunk annak kt vgpontjt.
262 14. ra
14.2. bra
Egyenes rajzolsa
az imageline()
fggvnnyel
14_ora.qxd 8/3/2001 6:21 PM Page 263
Alakzatok kitltse
A PHP segtsgvel ugyangy kisznezhetnk alakzatokat, mint kedvenc grafikai
programunkkal. Az imagefill() fggvny bemenete egy kpazonost,
a kitlts kezdkoordinti, valamint egy sznazonost. A fggvny a kezd
kpponttal megegyez szn szomszdos kppontokat a kijellt sznre lltja.
A 14.3. program a kpet az imagefill() fggvny meghvsval teszi egy kicsit
rdekesebb.
14.3. bra
Az imagefill() fgg-
vny hasznlata
14
14_ora.qxd 8/3/2001 6:21 PM Page 264
264 14. ra
Krv rajzolsa
Az imagearc() fggvny segtsgvel krveket rajzolhatunk. Bemenete
egy kpazonost, a kzppont koordintja, a szlessget meghatroz egsz
szm, a magassgot meghatroz egsz szm, egy kezd- s egy vgpont
(fokban mrve), valamint egy sznazonost. A krveket az ramutat jrsnak
megfelelen, 3 rtl kezdve rajzoljuk. A kvetkez kdrszlet egy negyed krvet
rajzol ki:
Ez egy olyan krvrszletet jelent meg, melynek kzppontja a (99, 99) koordin-
tj pontban van. A teljes magassg s szlessg 200-200 kppontnyi. A krv 3
rnl kezddik s 90 fokot rajzolunk (azaz 6 rig).
14.4. bra
Kr rajzolsa
az imagearc() fgg-
vnnyel
Tglalap rajzolsa
A PHP imagerectangle() fggvnyvel tglalapot rajzolhatunk.
Az imagerectangle() bemenete egy kpazonost, a tglalap bal fels s jobb
als sarknak koordintja, valamint egy sznazonost. A kvetkez kdrszlet
olyan tglalapot rajzol, melynek bal fels s jobb als koordinti rendre (19, 19)
s (179, 179):
266 14. ra
14.5. bra
Tglalap rajzolsa az
imagefilledrectangle()
fggvnnyel
Sokszg rajzolsa
Az imagepolygon() fggvny segtsgvel kifinomultabb alakzatokat is rajzol-
hatunk. E fggvny bemenete egy kpazonost, a pontok koordintibl ll
tmb, az alakzat pontjainak szmt jelz egsz szm s egy sznazonost.
Az imagepolygon() bemenett kpez tmbnek szmmal indexeltnek kell
lennie. Az els kt elem az els pont koordintit adja meg, a msodik kett
a msodik pontt s gy tovbb. Az imagepolygon() fggvny megrajzolja
a pontok kztti vonalakat s az utols pontot automatikusan sszekti
az elsvel. Az imagefilledpolygon() fggvny segtsgvel sznnel kitlttt
sokszgek hozhatk ltre.
14_ora.qxd 8/3/2001 6:21 PM Page 267
14.6. bra
Sokszg rajzolsa az
imagefilledpolygon()
fggvnnyel
14
14_ora.qxd 8/3/2001 6:21 PM Page 268
268 14. ra
14.7. bra
A sznek tltszv
ttele az image-
colortransparent()
fggvnnyel
Szvegek kezelse
Ha rendszernkn vannak TrueType betk, a kpekre rhatunk is. A GD program-
knyvtr mellett szksgnk lesz a FreeType programknyvtr teleptsre is. Ha
ezek rendelkezsnkre llnak, egy kpben megjelen diagramokat s navigcis
elemeket is ltrehozhatunk. A PHP biztost szmunkra egy olyan eszkzt is, amellyel
ellenrizhetjk, hogy a berand szveg elfr-e a rendelkezsre ll helyen.
270 14. ra
Ltrehozunk egy 400 kppontnyi szles s 200 kppontnyi magas vsznat, meg-
adunk kt sznt s a $betukeszlet vltozban troljuk a TrueType bettpus el-
rsi tjt. Ezutn rrjuk az brra a dvzljk! szveget. Figyelem, a bett-
pusok a kiszolgln feltehetleg ms knyvtrban tallhatk! Ha nem vagyunk
biztosak a helyben, keressk a .ttf kiterjeszts fjlokat.
14.8. bra
Szveg rsa az
imageTTFtext() fgg-
vnnyel
14_ora.qxd 8/3/2001 6:21 PM Page 271
Persze most mg csak tallgatunk, hov tegyk a szveget. A betmret nem rul
el sokat a szveg magassgrl, a szlessgrl mg kevesebbet.
Az imageTTFtext() fggvny persze visszaad informcit a szveg kiterjeds-
rl, de akkorra mr minden eldlt. Szerencsre a PHP lehetsget nyjt arra, hogy
prblkozzunk, mieltt mg lesben elvgeznnk a mveletet.
272 14. ra
az alapvonal al. Lehetsges, hogy a 7-es elem 10 lesz, mivel a szveg 10 kp-
ponttal van az alapvonal fl emelve. A pontos rtkek bettpustl s betmret-
tl fggnek.
274 14. ra
Ezt a kdot egy msik oldal is meghvhatja, egy IMG elem rszeknt. A kvetkez
rszlet egy olyan programot hoz ltre, amely lehetv teszi az egyes felhasznlknak,
hogy sajt szveget jelentsenek meg az brn:
1: <?php
2: if ( ! isset( $szoveg ) )
3: $szoveg = "Dinamikus szveg!";
4: ?>
5: <form action="<? print $PHP_SELF ?>" method="POST">
6: <input type="text" name="szoveg">
7: </form>
8: <p>
9: <img src="14.9.program.php?<? print
"szoveg=".urlencode($szoveg) ?>">
14.9. bra
Szveg elhelyezse az
imageTTFbox() fgg-
vny hasznlatval
14_ora.qxd 8/3/2001 6:21 PM Page 275
$teljesszelesseg = 400;
$teljesmagassag = 200;
$xmargo = 20; // jobb s bal marg
$ymargo = 20; // fels s als marg
$oszlopkoz = 5; // az oszlopok kztti hely
$alsokeret = 40; // az bra aljn kimarad hely
(a margt nem szmolva)
$betukeszlet = "/usr/local/office52/share/fonts/
/TrueType/arial.ttf";
14
gyfelnk a vltozk mdostsval meghatrozhatja az bra magassgt s szles-
sgt. Az $xmargo s $ymargo a grafikon krli margvastagsgot adja meg.
Az $oszlopkoz az oszlopok kztti tvolsgot hatrozza meg, az $alsokeret
vltoz pedig az oszlopok alatti cmkknek sznt hely nagysgt.
276 14. ra
278 14. ra
280 14. ra
14.10. bra
Egy dinamikus osz-
lopdiagram
sszefoglals
A GD programknyvtr PHP-s tmogatsa lehetv teszi, hogy dinamikus oszlop-
diagramokat s navigcis elemeket hozhassunk ltre, viszonylag knnyen.
Krdsek s vlaszok
Fellpnek-e teljestmnybeli problmk dinamikus kpek hasznlata
esetn?
Egy dinamikusan ltrehozott kp lassabban tltdik be a bngszbe, mint egy
mr ltez fjl. A program hatkonysgtl fggen ezt a felhasznl nem felttle-
nl veszi szre, de azrt a dinamikus kpeket mdjval hasznljuk.
14_ora.qxd 8/3/2001 6:21 PM Page 281
Mhely
A mhelyben kvzkrdsek tallhatk, melyek segtenek megszilrdtani az rban
szerzett tudst. A vlaszokat az A fggelkben helyeztk el.
Kvz
1. Milyen fejlcsort kell a bngsznek kldennk a GIF kp ltrehozsa s
megjelentse eltt?
Feladatok 14
1. rjunk egy programot, amely egy folyamatjelzt hoz ltre, amely mutatja,
mennyi pnz folyt be egy gyjts alkalmval az adott clra szksges pnzbl.
2. rjunk egy programot, amely egy fcmet brzol kpet r ki egy bejv r-
lap vagy lekrdezs adataibl. Tegyk lehetv, hogy a felhasznl hatroz-
za meg a rajzterletet, az eltr s a httr sznt, valamint az rnyk meglt-
t s annak mrett.
14_ora.qxd 8/3/2001 6:21 PM Page 282
15_ora.qxd 8/3/2001 6:21 PM Page 283
15. RA
Dtumok kezelse
A dtumok annyira mindennapjaink rszt kpezik, hogy nem is gondolkodunk,
amikor velk dolgozunk, naptrunk fortlyainak helyes kezelse azonban a prog-
ramokat meglehetsen bonyolultt teheti. Szerencsre a PHP hatkony eszkzket
biztost a dtumszmtshoz, amely megknnyti a feladatot.
284 15. ra
A time() ltal visszaadott egsz szm a greenwichi kzpid szerinti 1970. janur 1.
jfl ta eltelt msodpercek szmt adja meg. Ez a dtum a UNIX kor kezdete
nven ismeretes, az azta eltelt msodpercek szmt pedig idblyegnek (nha id-
blyegz, time stamp) nevezik. Az idblyeget a PHP eszkzeivel emberi fogyasz-
tsra alkalmasabb formra hozhatjuk, de felmerl a krds: mg ha ilyen nagyszer
eszkzk is llnak rendelkezsnkre, az idblyeg nem feleslegesen tlbonyoltott
mdja a dtum trolsnak? Nem, ppen ellenkezleg: egyetlen szmbl rengeteg
informcit szerezhetnk. s ami mg ennl is jobb, az idblyeggel sokkalta
knnyebben lehet szmtsokat vgezni, mint azt gondolnnk.
286 15. ra
15.1. bra
A getdate() fggvny
hasznlata
288 15. ra
ra
perc
msodperc
hnap
hnap napja
v
15
dtumszmtsokhoz lehet hasznos.
290 15. ra
checkdate( 4, 4, 1066 )
Egy plda
Prbljunk meg ezen fggvnyek kzl egyetlen pldn bell minl tbbet
hasznlni. Ksztsnk naptrat, amely egy 1980 s 2010 kztti tetszleges hnap
napjait mutatja. A felhasznl lenyl menvel vlaszthatja ki a hnapot s az vet.
A program kimenetben az adott hnap dtumai a ht napjainak megfelelen ke-
rlnek elrendezsre. Kt globlis vltozt hasznlunk, a $honap s az $ev vlto-
zkat, melyek adatait a felhasznl adja meg. A kt vltoz segtsgvel elkszt-
jk a meghatrozott hnap els napjnak idblyegt. Ha nem adtuk meg az vet
vagy a hnapot, vagy megadtuk, de a bevitt adat nem rvnyes, a program beme-
netnek alapbelltsknt a foly v aktulis hnapjnak els napjt tekintjk.
292 15. ra
15
15_ora.qxd 8/3/2001 6:21 PM Page 294
294 15. ra
15.2. bra
A naptr rlapja
296 15. ra
Ha ltjuk, hogy mg a ciklus els lefutsban vagy egy cellasor vgnl vagyunk,
elvgznk mg egy ellenrzst: megvizsgljuk, hogy a $napTomb mon (hnap-
szm) eleme nem egyenl-e a $honap vltozval. Ha nem egyenl, a ciklust befe-
jezhetjk. Emlkezznk vissza, hogy a $napTomb-ben ugyanaz az idpont van,
mint ami a $kezdet-ben, ami viszont a hnapnak pontosan az a rsze, amelyet
megjelentnk. Ha a $kezdet tljut az aktulis hnapon, a $napTomb[mon] ms
szmot fog tartalmazni, mint a felhasznl ltal megadott $honap szm. A mara-
dkoszts igazolta, hogy ppen egy sor vgn llunk: ha j hnapban jrunk,
elhagyhatjuk a ciklust, ha viszont a sor vgre rtnk s mg mindig ugyanabban
a hnapban vagyunk, befejezzk a sort s jat kezdnk.
15
15_ora.qxd 8/3/2001 6:21 PM Page 298
298 15. ra
15.3. bra
A naptrprogram
sszefoglals
Ezen az rn megtanultuk, hogyan hasznljuk a time() fggvnyt az aktulis
idblyeg megszerzsre. Megtanultuk, hogyan hasznljuk az idblyegbl
a dtum rszeinek kinyersre a getdate() fggvnyt s az idblyeget form-
zott szvegg alakt date() fggvnyt. Arrl is tanultunk, hogyan hozzunk ltre
idblyeget az mktime() fggvnnyel. Megtanultuk ellenrizni a dtum rv-
nyessgt a checkdate() fggvnnyel, magyar elvrsok szerint formztunk
dtumokat, vgl tanulmnyoztunk egy pldaprogramot, amely az emltett
fggvnyeket alkalmazta.
Krdsek s vlaszok
Vannak olyan fggvnyek, amelyekkel a klnbz naptrak kztt
vltogatni lehet?
Igen, a PHP naptrak teljes sorozatt biztostja. Ezekrl a hivatalos
PHP kziknyvben olvashatunk,
a http://www.php.net/manual/ref.calendar.php cmen.
15_ora.qxd 8/3/2001 6:21 PM Page 299
Mhely
A mhelyben kvzkrdsek tallhatk, melyek segtenek megszilrdtani az rban
szerzett tudst. A vlaszokat az A fggelkben helyeztk el.
Kvz
1. Hogyan kapunk meg egy UNIX idblyeget, amely a pontos dtumot s
idt jelli?
Feladatok
1. Ksztsnk egy szletsnapig visszaszmll programot. rlappal lehessen
megadni az v, h s nap rtkeit, kimenete pedig egy zenet legyen, amely
kzli a felhasznlval, hogy hny nap, ra, perc, msodperc van mg htra
a nagy napig.
15
15_ora.qxd 8/3/2001 6:21 PM Page 300
16_ora.qxd 8/3/2001 6:21 PM Page 301
16. RA
Az adatok kezelse
Ezen az rn az adatellenrzsben s az adatmveletekben fogunk egy kicsit
elmlyedni. jra ttekintjk az adattpusokat. A PHP ugyan automatikusan kezeli
ezeket, de elengedhetetlen, hogy rtsk az adatkezelst, ha nagy, megbzhat
hlzati alkalmazsokat kell rnunk. Visszatrnk a tmbkhz is s vgl megis-
merkednk a PHP fejlettebb adatkezelsi, adatosztlyozsi eljrsaival.
302 16. ra
jra az adattpusokrl
A negyedik rban mr tanultunk nhny dolgot a PHP adattpusairl. Van azonban
mg valami, ami eddig kimaradt. Ebben a rszben a vltozk adattpusnak ellenr-
zsre hasznlt fggvnyek kzl ismerkednk meg nhnnyal, majd sorra vesszk
azokat a feltteleket, amelyek mellett a PHP automatikusan elvgzi helyettnk
az adattpus-talaktsokat.
$adat = 454;
print gettype( $adat );
// azt rja ki, hogy "integer", azaz egsz szm
$adat = 4.333;
print ( integer ) $adat;
// "4"-et r ki
$adat = 4.333;
settype( $adat, "integer" );
print $adat;
// "4"-et r ki
Amikor egy egyszer adattpust tmbb alaktunk, olyan tmb jn ltre, melynek
els eleme az eredeti rtk lesz:
Fordtott esetben, egy objektum tmbb alaktsakor, olyan tmb jn ltre, amely-
ben minden objektum tulajdonsgnak megfelel egy tmbelem. A metdusokat
az talakts figyelmen kvl hagyja.
class Pont
{
var $x;
var $y;
function Pont( $x, $y )
{
$this->x = $x; 16
$this->y = $y;
16_ora.qxd 8/3/2001 6:21 PM Page 304
304 16. ra
}
}
$pont = new Pont( 5, 7 );
$tomb_pont = (array) $pont;
print $tomb_pont["x"];
// azt rja ki, hogy "5"
$orak = "15"
if ($orak > 15)
print "Ilyen gyakori felhasznlnak akr rengedmny
is jrhatna";
4 * "20mb"
4 * "krlbell 20mb"
4 * "1.2"
16_ora.qxd 8/3/2001 6:21 PM Page 305
$szoveg = "4";
$szoveg++;
print $szoveg; // kirja az 5-t
print gettype( $szoveg ); // azt rja ki, hogy "string"
$szoveg = "alszol";
$szoveg++;
print $szoveg; // azt rja ki, hogy "alszom"
$szoveg = "alszol";
$szoveg += 1;
print $szoveg; // 1-et r ki
print gettype( $szoveg ); // azt rja ki, hogy "integer",
azaz egsz szm
Az elz pldban a $szoveg vltoz elszr 0-v (egsz szmm) alakul, aztn
adjuk hozz az 1-et. Ennek a mveletnek az eredmnye 1, amelyet jra a $szoveg
vltozba helyeznk. A vltoz most mr egy egsz szmot fog tartalmazni.
$eredmeny = ( 1 + 20.0);
print gettype( $eredmeny );
// azt rja ki, hogy "double", azaz lebegpontos
16
16_ora.qxd 8/3/2001 6:21 PM Page 306
306 16. ra
Az adattpusok ellenrzse
Mr le tudunk krdezni adattpusokat a gettype() fggvnnyel, ami a hibakere-
ssnl jl jhet, hiszen minden vltozrl meg tudjuk mondani, hogy milyen tpus.
Gyakran viszont csak azt szeretnnk megnzni, hogy a vltoz egy bizonyos adatt-
pus rtket tartalmaz-e. A PHP ehhez az egyes adattpusoknak megfelel fggv-
nyeket biztost, amelyek bemenete egy vltoz vagy egy rtk, visszatrsi rtke
pedig logikai. A fggvnyek listjt a 16.1. tblzat tartalmazza.
megegyezik a
if ( is_array( $valtozo ) )
print "ez egy tmb";
tombKiir ( 4 );
// Warning: Non array argument supplied for foreach() in
// /home/httpd/htdocs/proba2.php on line 5
// azaz "Figyelmeztets: a foreach() fggvnynek nem tmb
paramtert adtunk t
// a /home/httpd/htdocs/proba2.php program 5.
sorban"
16
16_ora.qxd 8/3/2001 6:21 PM Page 308
308 16. ra
Erre lttunk egy pldt a tizedik rban. A readdir() fggvny hamis (false)
rtket ad vissza, amikor elri a beolvasott knyvtr vgt, minden ms esetben
viszont a knyvtr egyik elemnek nevt tartalmaz karakterlncot. Hagyomnyo-
san a kvetkezhz hasonl szerkezetet hasznlnnk, ha egy knyvtr elemeit
szeretnnk beolvastatni:
$nincsertek;
if ( isset( $nincsertek ) )
print "a \$nincsertek vltoznak van rtke";
else
print "a \$nincsertek vltoznak nincs rtke";
// kirja, hogy "a $nincsertek vltoznak nincs rtke"
Egy veszlyre azonban hadd hvjuk fel a figyelmet: ha 0-t vagy res karakterlncot
rendelnk egy vltozhoz, a fggvny azt mr belltottknt, rtkkel rendelke-
znek fogja tekinteni:
$nincsertek = "";
if ( isset( $nincsertek ) )
print "a \$nincsertek vltoznak van rtke";
else
print " a \$nincsertek vltoznak nincs rtke ";
// kirja, hogy "a $nincsertek vltoznak van rtke"
Azok a vltozk, amelyeket a bejv rlapok tltenek fel rtkkel, mindig bell-
tottknt fognak szerepelni, mg akkor is, ha a felhasznl egyetlen mezt sem
tlttt ki adattal. Hogy az ilyen helyzetekkel megbirkzhassunk, elszr ellenriz- 16
nnk kell, hogy res-e a vltoz. Az empty() fggvny bemenete egy vltoz,
16_ora.qxd 8/3/2001 6:21 PM Page 310
310 16. ra
kimenete pedig true (igaz), ha a vltoz nincs belltva vagy olyan adatot tartal-
maz, mint a 0 vagy egy res karakterlnc. Akkor is igaz rtket ad vissza,
ha a vltoz res tmbt tartalmaz:
$nincsertek = "";
if ( empty( $nincsertek ) )
print "a \$nincsertek vltoz res";
else
print " a \$nincsertek vltoz adatot tartalmaz";
// kirja, hogy "a $nincsertek vltoz res"
Tmb ltrehozsakor a PHP egy bels mutatt alkalmaz, amely a tmb els
elemre mutat. Ennek az elemnek a kulcshoz s rtkhez az each()
fggvnnyel frhetnk hozz. Az each() fggvny bemenete egy tmbvltoz,
kimenete pedig egy ngyelem tmb. Ezek kzl az elemek kzl kett szmmal
indexelt, kett pedig a "key" (kulcs) s az "value" (rtk) cmkt viseli.
A fggvny meghvsa utn a bels mutat a vizsglt tmb kvetkez elemre fog
mutatni, kivve, ha elrte a tmb vgt, ilyenkor false (hamis) rtket ad vissza.
Hozzunk ltre egy tmbt s prbljuk ki az each() fggvnyt:
egyenrtk a kvetkezvel:
reset( $reszletek );
while ( list( $kulcs, $ertek ) = each( $reszletek ) )
print "$kulcs: $ertek<BR>";
16
16_ora.qxd 8/3/2001 6:21 PM Page 312
312 16. ra
unset( $proba["cim"] );
unset( $szamok[1] );
$szamok[0]
$szamok[2]
$szamok[3]
Vegynk egy pldt. Van egy adatbzisbl kinyert rtmbnk, de mieltt munkhoz
kezdennk vele, az sszes rhoz hozz kell adnunk a forgalmi adt.
Elszr azt a fggvnyt hozzuk ltre, amely hozzadja az adt:
314 16. ra
316 16. ra
sszefoglals
Az ra sorn a tmbkkel s adattpusokkal kapcsolatos ismeretekben mlyedtnk
el. Megtanultuk, mi trtnik, ha sszetett adattpust skalriss alaktunk s fordtva.
Megtudtuk, hogyan kezeli a PHP a klnbz adattpusokat egy kifejezsben,
hogyan hatrozza meg automatikusan az eredmny adattpust helyettnk. Megis-
merkedtnk szmos fggvnnyel; pldul az is_array()-jel, amely klnfle
adattpusokat ellenriz, vagy az intval()-lal, amely az adatot egsz rtkv
alaktja t. Megtanultuk, hogyan lehet a PHP-ben hagyomnyos mdon tmbt be-
jrni, az each() s a list() fggvnnyel. Az in_array() fggvnnyel kpe-
sek vagyunk ellenrizni, hogy ltezik-e egy adott rtk egy tmbben, s el tudunk
tvoltani egy elemet egy tmbbl az unset() fggvnnyel. Az array_walk()
fggvnnyel mr egy tmb sszes elemn is vgezhetnk mveleteket, vgl azt is
tudjuk, hogyan hasznljuk az usort(), az uasort() s az uksort() fggv-
nyeket arra, hogy a tmbk egyni rendezst vgezzk.
Krdsek s vlaszok
A PHP minden tmbkezel fggvnyvel megismerkedtnk?
Nem, az egsz knyv sem lenne elg az sszes tmbkezel fggvny bemutatshoz.
Teljes listjukat s lersukat a http://www.php.net/manual/ref.array.php
weboldalon tallhatjuk.
16
16_ora.qxd 8/3/2001 6:21 PM Page 318
318 16. ra
Mhely
A mhelyben kvzkrdsek tallhatk, melyek segtenek megszilrdtani az rban
szerzett tudst. A vlaszokat az A fggelkben helyeztk el.
Kvz
1. Melyik az a fggvny, amellyel adattpusokat tetszleges ms adattpuss ala-
kthatunk?
7. Hogyan ellenrizzk, hogy egy vltoz res rtket (pldul 0-t vagy res
karakterlncot) tartalmaz?
Feladatok
1. Nzzk vgig mg egyszer a knyv sorn megoldott feladatokat. Alaktsunk
t minden foreach utastst gy, hogy az megfeleljen a PHP 3 kvetelmnyei-
nek is.
17. RA
Karakterlncok kezelse
A Vilghl valjban szveges fjlokra pl krnyezet, s igazbl nem szmt,
mivel gazdagodik a jvben a tartalma, a mlyn mindig szveges llomnyokat
fogunk tallni. gy nem meglep, hogy a PHP 4 sok olyan fggvnyt biztost,
amellyel szvegmveletek vgezhetk.
320 17. ra
Karakterlncok formzsa
A megjelenteni kvnt karakterlncot eddig egyszeren kirattuk a bngszbe.
A PHP kt olyan fggvnyt tartalmaz, amely lehetv teszi az elzetes formzst,
fggetlenl attl, hogy tizedestrteket kell valahny tizedes pontossgra kerekte-
ni, egy mezn bell kell jobbra vagy balra igaztani valamit, vagy egy szmot kell
klnbz szmrendszerekben megjelenteni. Ebben a rszben a printf() s
az sprintf() fggvnyek ltal biztostott formzsi lehetsgekkel ismerkednk
meg.
A printf() s a tpusparamterek
Egy tpusparamterrel mr tallkoztunk, ez volt a d, amely az adatot decimlis 17
formtumban jelenti meg. A tbbi tpusparamtert a 17.1. tblzatban lthatjuk.
322 17. ra
17.1. bra
Nhny tpusparam-
ter hasznlatnak
bemutatsa
$piros = 204;
$zold = 204;
$kek = 204;
printf( "#%X%X%X", $piros, $zold, $kek );
// azt rja ki, hogy "#CCCCCC"
17_ora.qxd 8/3/2001 6:21 PM Page 323
A kitlt paramter
Bellthatjuk, hogy a kimenet bizonyos karakterekkel megfelel szlessgre
tltdjn ki. A kitlt paramter kzvetlenl az talakt paramtert kezd szza-
lkjelet kveti. Ha a kimenetet bevezet nullkkal szeretnnk kitlteni, a kitlt
paramterben a 0 karaktert az a szm kveti, ahny karakteresre szeretnnk
a kimenetet bvteni. Ha a kimenet hossza ennl a szmnl kisebb lenne, a klnb-
sg nullkkal kerl kitltsre, ha nagyobb, a kitlt paramternek nincs hatsa:
printf( "%04d", 36 )
// a kimenet "0036" lesz
printf( "%04d", 12345 )
// a kimenet "12345" lesz
324 17. ra
printf( "%'x4d", 36 )
// azt rja ki "xx36"
$piros = 1;
$zold = 1;
$kek = 1;
printf( "#%02X%02X%02X", $piros, $zold, $kek );
// azt rja ki, hogy "#010101"
A mezszlessg meghatrozsa
Meghatrozhatjuk a kimenet ltal elfoglalt mez szlessgt is. A mezszlessg 17
paramtere egy olyan egsz szm, amely a szzalkjel utn kvetkezik az talakt
paramterben (feltve, hogy nem hasznlunk helykitlt karaktereket). A kvet-
kez kdrszlet kimenete egy ngyelem felsorols, amelynek mezszlessge
20 karakternyi. A szkzk lthatv ttelhez a kimenetet egy PRE elembe
gyazzuk.
print "<pre>";
printf("%20s\n", "Knyvek");
printf("%20s\n", "CDk");
printf("%20s\n", "Jtkok");
printf("%20s\n", "Magazinok");
print "</pre>";
17.2. bra
Igazts a mezsz-
lessghez
326 17. ra
A pontossg meghatrozsa
Ha az adatot lebegpontos formban szeretnnk megjelenteni, meghatrozhatjuk
a kerekts pontossgt. Ez fleg a pnznem tvltsakor szokott fontos lenni.
A pontossgot meghatroz paramter egy pontbl s egy szmbl ll, s kzvet-
lenl a tpusparamter el kell rni. A megadott szm hatrozza meg, hny tize-
desre szeretnnk kerekteni. Ez a paramter csak akkor rvnyes, ha a kimenet
f tpusparamter:
17
17.2. program Termkrlista formzsa a printf() fggvnnyel
1: <html>
2: <head>
3: <title>17.2. program Termkrlista formzsa
a printf() fggvnnyel</title>
4: </head>
5: <body>
6: <?php
7: $termekek = Array("Zld karosszk"=>"222.4",
8: "Gyertyatart" => "4",
9: "Kvzasztal" => "80.6"
10: );
11: print "<pre>";
12: printf("%-20s%23s\n", "Nv", "r");
13: printf("%'-43s\n", "");
14: foreach ( $termekek as $kulcs=>$ertek )
15: printf( "%-20s%20.2f\n", $kulcs, $ertek );
16: print "</pre>";
17: ?>
18: </body>
19: </html>
Elszr a termkek nevt s rt tartalmaz tmbt adjuk meg. Egy PRE elemmel
jelezzk a bngsznek, hogy a szkzket s a soremelseket rtelmezze.
A printf() els meghvsa a kvetkez formz karakterlncot adja meg:
"%-20s%23s\n"
328 17. ra
Az els ("%-20s") a termk nevt rja ki egy 20 karakteres mezbe, balra igazt-
va. A msik ("%20.2f") a mezszlessg paramterrel azt biztostja, hogy
az eredmny egy 20 karakteres mezben jobbra igaztva jelenjen meg, a pontoss-
gi paramterrel pedig azt, hogy a megjelentett ktszeres pontossg rtk kt
tizedesre legyen kerektve.
17.3. bra
Termkrlista form-
zsa a printf() fgg-
vnnyel
Rszletesebben a karakterlncokrl
Nem minden esetben tudunk mindent azokrl az adatokrl, amelyekkel dolgo- 17
zunk. A karakterlncok tbbfle forrsbl is rkezhetnek, beviheti a felhasznl,
rkezhetnek adatbzisokbl, fjlokbl s weboldalakrl. A PHP 4 tbb fggvnye
segtsgnkre lehet abban, hogy ezekrl a kls forrsbl rkez adatokrl tbbet
tudjunk meg.
Szvegek indexelse
A karakterlncokkal kapcsolatban gyakran hasznljuk az indexels szt, de
a tmbknl mg gyakrabban tallkozhatunk vele. Valjban a karakterlncok s
a tmbk nem llnak olyan messze egymstl, mint azt gondolnnk. Egy karakter-
lncot elkpzelhetnk egy karakterekbl ll tmbknt is. Ennek megfelelen
a karakterlncok egyes karaktereihez ugyangy frhetnk hozz, mint egy tmb
elemeihez:
$proba = "gazfick";
print $proba[0]; // azt rja ki, hogy "g"
print $proba[2]; // azt rja ki, hogy "z"
Ne felejtsk el, hogy amikor egy karakterlncon belli karakter indexrl vagy
helyrl beszlnk, akkor a karaktereket ugyangy, mint a tmb elemeit 0-tl
kezdve szmozzuk. A tmbkkel kapcsolatos flrertsek elkerlse rdekben
a PHP 4 bevezette a $proba{0} formt is erre a clra.
if ( strlen( $tagazonosito ) == 4)
print "Ksznm!";
else
print "Az azonostnak ngykarakteresnek kell lennie<P>";
330 17. ra
$tagazonosito = "pAB7";
if ( strstr( $tagazonosito, "AB" ) )
print "Ksznm. Ne feledje, hogy tagsga hamarosan
lejr!";
else
print "Ksznm!";
$tagazonosito = "mz00xyz";
if ( strpos($tagazonosito, "mz") === 0 )
print "dv, mz.";
17_ora.qxd 8/3/2001 6:21 PM Page 331
$proba = "gazfick";
print substr($proba,3); // azt rja ki "fick"
print substr($proba,3,4); // azt rja ki "fick"
$cim = "felhasznalo@szolgaltato.hu"
if ( substr( $cim, -3 ) == ".hu" )
print "Ne felejtse el magyar vsrlinknak jr
specilis ajnlatainkat!";
else
print "dvzljk zletnkben!";
332 17. ra
Azrt ellenrizzk a visszaadott rtk tpust, mert ha egy karakterlnc egy sor-
ban kt hatroljel van, az strtok() az els hatroljel elrsekor res karakter-
lncot ad vissza. gy, ha a $szo egy res karakterlnc, az albbi pldban lthat
szokvnyosabb prblkozs sikertelen lesz, mg akkor is, ha a fggvny mg
nem rte el a forrslnc vgt, mivel a while felttele hamiss vlik:
while ( $szo )
{
$szo = strtok( $hatarolo );
}
17_ora.qxd 8/3/2001 6:21 PM Page 333
A karakterlncok kezelse
A PHP 4 a karakterlnc paramterek kisebb-nagyobb talaktshoz szmos
fggvnyt biztost.
334 17. ra
<?
$tagazonosito = "mz99xyz";
$tagazonosito = substr_replace( $tagazonosito, "00", 2, 2 );
print "Az j tagnyilvntart azonost: $tagazonosito<p>";
// azt rja ki, hogy "Az j tagnyilvntart azonost:
mz00xyz"
?>
$tagazonosito = "mz00xyz";
$tagazonosito = strtoupper( $tagazonosito );
print "$tagazonosito<P>"; // azt rja ki, hogy "MZ00XYZ"
$honlap_url = "WWW.KISKAPU.HU";
$honlap_url = strtolower( $honlap_url );
if ( ! ( strpos ( $honlap_url, http:// ) === 0 ) )
$honlap_url = "http://$honlap_url";
print $honlap_url; // azt rja ki, hogy
"http://www.kiskapu.hu"
336 17. ra
Fel kell, hogy hvjuk a kedves olvas figyelmt arra, hogy a magyar szvegekkel
az kezetes betk miatt alapbelltsban problmink akadhatnak. A nemzeti be-
lltsok testreszabsra hasznlhat setlocale() fggvnyt kell alkalmaznunk,
hogy a kvnt eredmnyt elrjk.
$kezdet = "2000.12.01";
$datum_tomb = explode(".", $kezdet);
// $datum_tomb[0] == "2000"
// $datum_tomb[1] == "12"
// $datum_tomb[2] == "00"
sszefoglals
A PHP klvilggal val kapcsolattartsa s adattrolsa leginkbb karakterlncokon
keresztl valsul meg. Az rn a programjainkban lev karakterlncok kezelsvel
ismerkedtnk meg.
Krdsek s vlaszok
Vannak mg egyb hasznos karakterlnc-fggvnyek?
Vannak. A PHP tbb mint 60 ilyen fggvnnyel rendelkezik! Ezekrl a PHP 4
kziknyvben olvashatunk, amelynek megfelel rsze
a http://php.net/manual/ref.strings.php cmen tallhat.
Header("Content-type: text/plain");
Mhely
A mhelyben kvzkrdsek tallhatk, melyek segtenek megszilrdtani az rban
szerzett tudst. A vlaszokat az A fggelkben helyeztk el.
Kvz
1. Milyen talakt paramtert hasznlnnk a printf() fggvnyben
egy egsz szm lebegpontos szmknt val megformzsra?
338 17. ra
Feladatok
1. Hozzunk ltre egy olyan vlemny-visszajelz rlapot, amely a felhasznl
nevt s e-mail cmt kri be. Hasznljuk a kis- s nagybetket talakt
fggvnyeket a nevek els betjnek nagybetstsre, majd jelentsk meg
az eredmnyt a bngszben. Ellenrizzk, hogy a cm tartalmaz-e @-jelet,
ha nem, figyelmeztessk a felhasznlt.
18. RA
A szablyos kifejezsek
hasznlata
A szvegek vizsglatnak s elemzsnek nagyszer mdja a szablyos kifejezsek
(regular expressions) hasznlata. Ezek lehetv teszik, hogy egy karakterlncon
bell mintkat keressnk, a tallatokat pedig rugalmasan s pontosan kapjuk
vissza. Mivel hatkonyabbak az elz rban tanult karakterlnc-kezel fggv-
nyeknl, lassabbak is azoknl. gy azt tancsoljuk, hogy ha nincs klnsebb
szksgnk a szablyos kifejezsek ltal biztostott hatkonysgra, inkbb hasz-
nljuk a hagyomnyos karakterlnc-kezel fggvnyeket.
340 18. ra
if ( ereg("a+","aaaa", $tomb) )
print $tomb[0];
// azt rja ki, hogy "aaaa";
342 18. ra
Vegynk egy pldt. Egy klub tagsgi azonostval jelli tagjait. Egy rvnyes azo-
nostban egy s ngy kztti alkalommal fordul el a "t", ezt tetszleges szm
szm vagy bet karakter kveti, majd a 99-es szm zrja. A klub arra krt fel
bennnket, hogy a tennivalkat tartalmaz naplbl emeljk ki a tagazonostkat.
Ez azrt van, mert a minta vgn egy szkzt vrunk el, amely alapjn meggy-
zdhetnk, hogy elrtk az azonost vgt. gy ha egy szvegben az azonost
zrjelek kzt van, ktjel vagy vessz kveti, a minta nem illeszkedik r. Kze-
lebb visz a megoldshoz, ha gy javtunk a szablyos kifejezsen, hogy mindenre
illeszkedjk, csak szm s bet karakterekre nem:
18_ora.qxd 8/3/2001 6:22 PM Page 344
344 18. ra
Az atomok kezelse
Az atom egy zrjelek kz rt minta (gyakran hivatkoznak r rszmin-
JDONSG
taknt is). Meghatrozsa utn az atomot ugyangy kezelhetjk, mintha
maga is egy karakter vagy karakterosztly lenne. Ms szval ugyanazt a 18.1. tbl-
zatban bemutatott rendszer alapjn felptett mintt annyiszor kereshetjk, ahny-
szor csak akarjuk.
$proba = "abbaxaabaxabbax";
if ( ereg( "([ab]+x){2}", $proba, $tomb ) )
print "$tomb[0]";
// azt rja ki, hogy "abbaxaabax"
$ipcim = "158.152.55.35";
if ( ereg( "([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)", $ipcim,
$tomb ) )
{
foreach ( $tomb as $ertek )
print "$ertek<BR>";
}
// Az eredmny:
// 158.152.55.35
18
// 158
// 152
// 55
// 35
Elgazsok
A szrkarakter (|) segtsgvel mintkat sszektve a szablyos kifejezseken
bell elgazsokat hozhatunk ltre. Egy ktg szablyos kifejezs vagy az els
mintra, vagy a msodik mintra illeszked karakterlncokat keresi meg. Ettl lesz
a szablyos kifejezsek nyelvtana mg rugalmasabb. A kvetkez kdrszletben
a .com, a .de vagy a .hu karakterlncot keressk:
$domain = "www.egydomain.hu";
if ( ereg( "\.com|\.de|\.hu", $domain, $tomb ) )
print "ez egy $tomb[0] tartomny<BR>";
// azt rja ki, hogy "ez egy .hu tartomny"
346 18. ra
Amint lthatjuk, a szablyos kifejezsek elsre egy kicsit riasztk, de miutn kisebb
egysgekre bontjuk azokat, ltalban egsz knnyen rtelmezhetk. Elrtk, hogy
mintnk egy szhatrra illeszkedjen (pontosan gy, ahogy azt a feladat megkve-
telte). Mivel nem vagyunk kvncsiak semmilyen, a mintt megelz vagy kvet
szvegre, a minta szmunkra hasznos rszt zrjelek kz rjuk. Az eredmnyt
a $tomb tmb harmadik (2-es index) elemben tallhatjuk meg.
$datumt = "12/25/2000";
print ereg_replace("([0-9]+)/([0-9]+)/([0-9]+)",
"\\3.\\1.\\2.", $datum);
// azt rja ki, hogy "2000.12.25"
348 18. ra
$szoveg = "veghz";
if ( preg_match( "/h.*z/", $szoveg, $tomb ) )
print $tomb[0];
// azt rja ki, hogy "hz"
"/h.*z/"
"h.*z"
"h.*?z"
350 18. ra
ereg ( "(^|[^a-zA-Z0-9_])(y{1,4}[a-zA-Z0-9_]*99)
([^a-zA-Z0-9_]|$)", $szoveg, $tomb );
preg_match( "\bt{1,4}\w*99\b", $szoveg, $tomb );
352 18. ra
Fel kell, hogy hvjuk a kedves olvas figyelmt arra, hogy a magyar szvegekre
az kezetes betk miatt alapbelltsban nem alkalmazhat a fentihez hasonl
egyszer szablyos kifejezs. A nemzeti belltsok testreszabsra hasznlhat
setlocale() fggvnyt kell alkalmaznunk, hogy a kvnt eredmnyt elrjk.
6: <?php
7: $szoveg = "barackot, bannt, bort, bzt s
bkkat rulok";
8: if ( preg_match_all( "/\bb\w+t\b/", $szoveg, $tomb ) )
9:
10:
{
for ( $x=0; $x< count( $tomb ); $x++ )
18
11: {
12: for ( $y=0; $y< count( $tomb[$x] ); $y++ )
13: print "\$tomb[$x][$y]:
".$tomb[$x][$y]."<br>\n";
14: }
15: }
16: // A kimenet:
17: // $tomb[0][0]: barackot
18: // $tomb[0][1]: bannt
19: // $tomb[0][2]: bort
20: // $tomb[0][3]: bzt
21: // $tomb[0][4]: bkkat
22: ?>
23: </body>
24: </html>
A $tomb vltoznak a preg_match_all() fggvnynek trtn tadskor
csak az els eleme ltezik s ez karakterlncok egy tmbjbl ll. Ez a tmb tartal-
mazza a szveg minden olyan szavt, amely b-vel kezddik s t betre vgzdik.
354 18. ra
$tomb[1][1]: 01
$tomb[1][2]: 01
A $tomb[2] a msodik rszminta rtkeinek tmbjt trolja:
$tomb[2][0]: 05
$tomb[2][1]: 10
$tomb[2][2]: 03
s gy tovbb.
Mdost paramterek
A Perl tpus szablyos kifejezsek lehetv teszik, hogy mdost paramterek
segtsgvel pontostsuk a minta illesztsi mdjt.
356 18. ra
Az m paramter akkor jhet jl, ha egy szveg tbb sorban szeretnnk hivatkozsi
pontos mintra illeszteni. A ^ s $ mintk alaprtelmezs szerint a teljes karakter-
lnc elejt s vgt jelzik. A kvetkez kdrszletben az m paramterrel mdostjuk
a $^ viselkedst:
Egy olyan szablyos kifejezst hozunk ltre, amely olyan mintra illeszkedik,
amelyben brmely szalkot karaktert vessz s tetszleges szm szkz kvet.
Ezutn tetszleges szm karaktert kvet karakterlnc vge karakterre ($)
illesztnk. Az m paramter miatt a $ az egyes sorok vgre illeszkedik a teljes
karakterlnc vge helyett.
18_ora.qxd 8/3/2001 6:22 PM Page 357
<?php
function datumAtalakito( $honap, $nap, $ev )
{
$ev = ($ev < 70 )?$ev+2000:$ev;
$ido = ( mktime( 0,0,0,$honap,$nap,$ev) );
return date("Y. m. j. ", $ido);
}
$datumok = "3/18/99<br>\n7/22/00";
$datumok = preg_replace( "/([0-9]+)\/([0-9]+)\/([0-9]+)/e",
"datumAtalakito(\\1,\\2,\\3)",
$datumok);
print $datumok;
358 18. ra
sszefoglals
A szablyos kifejezsek hatalmas tmakrt alkotnak, mi csak felletesen ismerked-
tnk meg velk ezen ra sorn. Arra viszont mr biztosan kpesek lesznk, hogy
bonyolult karakterlncokat talljunk meg s cserljnk le egy szvegben.
Krdsek s vlaszok
A Perl tpus szablyos kifejezsek nagyon hatkonynak tnnek.
Hol tallhat rluk bvebb informci?
A szablyos kifejezsekrl a PHP weboldaln (http://www.php.net) tallha-
tunk nmi felvilgostst. Emellett mg a http://www.perl.com oldalain tall-
hatunk informcit, a Perl tpus szablyos kifejezsekhez pedig
a http://www.perl.com/pub/doc/manual/html/pod/perlre.htm
cmen s Tom Christiansen cikkben,
a http://www.perl.com/pub/doc/manual/html/pod/perlfaq6.html
cmen tallhatunk bevezetst.
18_ora.qxd 8/3/2001 6:22 PM Page 359
Mhely
A mhelyben kvzkrdsek tallhatk, melyek segtenek megszilrdtani az rban
szerzett tudst. A vlaszokat az A fggelkben helyeztk el.
Kvz
1. Melyik fggvnyt hasznlnnk egy karakterlncban minta illesztsre,
ha POSIX szablyos kifejezssel szeretnnk a mintt meghatrozni?
18
2. Milyen szablyos kifejezst hasznlnnk, ha a "b" bet legalbb egyszeri,
de hatnl nem tbbszri elfordulsra szeretnnk keresni?
Feladatok
1. Gyjtsk ki az e-mail cmeket egy fjlbl. A cmeket troljuk egy tmbben s
jelentsk meg az eredmnyt a bngszben. Nagy mennyisg adattal fino-
mtsuk szablyos kifejezseinket.
18_ora.qxd 8/3/2001 6:22 PM Page 360
19_ora.qxd 8/3/2001 6:22 PM Page 361
19. RA
llapotok trolsa stikkel s
GET tpus lekrdezsekkel
A HTTP llapot nlkli protokoll. Ez azt jelenti, hogy ahny oldalt a felhasznl
letlt kiszolglnkrl, annyi nll kapcsolat ltesl, radsul az egyes oldalakon
bell a kpek, kls fjlok letltsre is kln kapcsolatok nylnak. Msrszt
viszont a felhasznlk s a weboldalak kszti krnyezetknt, azaz olyan trknt
rzkelik a weboldalakat, amelyben egyetlen oldal is egy nagyobb egsz rsze.
gy viszont nem meglep, hogy az oldalrl oldalra val informcitads mdsze-
rei egyidsek magval a Vilghlval.
362 19. ra
Hogyan rjunk olyan fggvnyt, amely egy asszociatv tmbt egy lekrdez
karakterlncc alakt t?
Stik
A Netscape munkatrsai ltal kitlt csodasti (magic cookie) kifejezs mg
a Netscape 1 aranykorbl szrmazik. A kifejezs pontos eredete mindmig vitk
trgya, br meglehetsen valsznnek tnik, hogy a szerencsestinek valami
kze lehetett hozz. Azta viszont mr ms bngszk is alkalmazzk
ezt a szabvnyt.
Mindezekkel egytt a stik kivlan alkalmasak arra, hogy kis mennyisg infor-
mcit troljunk velk, mialatt a felhasznl oldalrl-oldalra lpdel, vagy akr
hosszabb tvon is, a webhely egyes ltogatsai kztt.
A stik felptse
A stik ltrehozsa ltalban a HTTP fejlcben trtnik (br a JavaScript kzvetle-
nl a bngszvel is ltre tudja hozni a stiket). Egy stibellt PHP program
ilyesfle HTTP fejlcelemet kell, hogy ltrehozzon:
Mint ahogy azt lthatjuk, a Set-Cookie fejlc egy nvrtk prt, egy greenwichi
kzpid szerinti lejrati idpontot (expires), egy elrsi utat (path) s egy tarto-
mnyt (domain) tartalmaz. A nv s az rtk URL felpts kell, hogy legyen. A lej-
rat mez (expires) arra ad utastst a bngsznek, hogy mikor felejtse el a stit.
Az elrsi t a weboldalon azt a helyet jelli, amelynek elrsekor a stit vissza kell
kldeni a kiszolglra. A tartomny mez azokat az internetes tartomnyokat jelli ki,
ahov a stit el kell kldeni. A tartomny nem klnbzhet attl, ahonnan a stit
kldtk, viszont egy bizonyos szint rugalmassgot is meghatrozhat. Az elz pl-
dnl a bngsz a www.kiskapu.hu s a leeloo.kiskapu.hu kiszolglknak
egyarnt hajland elkldeni a stit. A HTTP fejlcrl a tizenharmadik ra anyagban
tbbet is olvashattunk.
Cookie: zoldseg=articsoka
364 19. ra
Br ez a mdszer nem tl bonyolult, mgis rnunk kell egy olyan fggvnyt, amely
ellltja a fejlc szvegt. Ez persze nem tl rzs feladat, hiszen csak a megfelel
formtum dtumot, illetve az URL formtum nvrtk prt kell ellltanunk.
Kr azonban ezzel veszdnnk, mert ltezik egy olyan PHP fggvny, amely pon-
tosan ezt vgzi el helyettnk.
Sti trlse
A stik trlsnek hivatalos mdja az, hogy a setcookie() fggvnyt egyetlen
paramterrel, mgpedig a trlend sti nevvel hvjuk meg:
setcookie( "zoldseg" );
Ebben a megoldsban nem bzhatunk meg teljesen, mert nem minden esetben
mkdik kifogstalanul. Ezrt clszerbb, ha egy mltbeli dtummal j rtket
adunk a stinek:
366 19. ra
Munkamenet-azonost stik
Ha olyan stit szeretnnk ltrehozni, amely csak addig ltezik, amg a felhasznl
be nem zrja a bngszt, csak annyi a teendnk, hogy a sti lettartamt nullra
lltjuk. Amg ki nem lpnk a bngszbl, az gy ksztett stiket a kiszolgl
gond nlkl megkapja, m ha bezrjuk a programot, a stik megsznnek,
gy hiba indtjuk jra a bngszt, mr nem rjk el azokat.
Most, hogy elksztettk a tblt, amivel dolgozhatunk, rnunk kell egy programot,
amely megnyit egy adatbzis-kapcsolatot s kpes ellenrizni a sti jelenltt.
Ha a sti nem ltezik, j sort hoz ltre a tblban s feltlti az j ltogat adataival.
Ennek megvalstsa lthat a 19.2. pldban.
19_ora.qxd 8/3/2001 6:22 PM Page 368
368 19. ra
370 19. ra
372 19. ra
Tegyk fel, hogy talltunk egy megfelel sort, melynek azonostja egyezik a sti rt-
kvel. Ezt a sort a mysql_fetch_array() fggvnnyel emelhetjk t egy PHP
tmbbe (esetnkben a $vendeg_adatok nevbe). A program mostani futsa egy ol-
dal letltsnek kvetkezmnye, teht a $vendeg_adatok["ossz_letoltes"]
vltoz rtkt eggyel nvelnnk kell, hogy rgztsk ezt a tnyt.
Most, hogy a feladaton tl vagyunk, rhatunk egy kis programot, hogy ellen-
rizzk, az elmlet valban mkdik-e a gyakorlatban. Elksztjk
az allapotMegjelenites() fggvnyt, amely kiszmolja a lekr felhasznl
tlagrtkeit s megjelenti azokat a bngszben. A valsgban persze komo-
lyabb megjelens, tfogbb kpet kell adnunk a ltogatkrl, de a lnyeg megr-
tshez ez a plda is bven elegend. A fggvny megvalstst a 19.4. pldban
talljuk. A korbbi pldk kdjhoz az include() fggvny alkalmazsval
frhetnk hozz.
19_ora.qxd 8/3/2001 6:22 PM Page 373
374 19. ra
19.1. kp
A hasznlati statisz-
tika megjelentse
Ha egy rlapot a GET eljrssal kldnk el, akkor annak mezit s azok rtkeit
URL kdolsban hozzillesztjk ahhoz a cmhez (URL-hez), ahov az rlapot kld-
jk. Az rtkek ekkor elrhetk lesznek a kiszolgl, illetve az ltala futtatott prog-
ramok szmra. Vegynk pldaknt egy olyan rlapot, amely egy felhasznalo
s egy nev mezt tartalmaz. Ekkor a lekrs a kvetkezkpp fog festeni:
http://php.kiskapu.hu/proba5.php?nev=
344343&felhasznalo=Szy+Gyorgy
19_ora.qxd 8/3/2001 6:22 PM Page 375
Minden mez nevt egy egyenlsgjel (=) vlasztja el annak rtktl; ezeket
a nvrtk prokat pedig S jelek (&) hatroljk. A PHP visszafejti a jeleket,
a tallt adatokat a $HTTP_GET_VARS asszociatv tmbben teszi elrhetv
a program szmra, s emellett a mezk nevvel azonos nev globlis vltozkat
is ltrehoz, a megfelel tartalommal. A felhasznalo nev GET vltozhoz gy
az albbi kt mdon frhetnk hozz:
$HTTP_GET_VARS["felhasznalo"];
$felhasznalo;
print urlencode("http://www.kiskapu.hu");
// azt rja ki, hogy http%3A%2F%2Fwww.kiskapu.hu
Az URL kdols szvegek ellltsa gy nem okoz gondot, akr sajt GET lek-
rseket is sszerakhatunk. A kvetkez kdrszlet kt vltozbl pt fel
egy lekrdez karakterlncot:
<?php
$erdeklodes = "sport";
$honlap = "http://www.kiskapu.hu";
$lekerdezes = "honlap=".urlencode( $honlap );
$lekerdezes .= "&erdeklodes=".urlencode( $erdeklodes );
?>
<A HREF="masiklap.php?<?print $lekerdezes ?>">Gyernk!</A>
masiklap.php?honlap=http%3A%2F%2Fwww.kiskapu.hu&
erdeklodes=sport
19_ora.qxd 8/3/2001 6:22 PM Page 376
376 19. ra
A foreach segtsgvel sorra vesszk a tmb elemeit, gy, hogy azok a $kulcs s
$ertek vltozkon keresztl legyenek elrhetk.
A kulcsrtk prokat & jellel kell elvlasztanunk, gy ha nem a ciklus els lefut-
snl tartunk azaz az $lsztring vltoz mr nem res , ezt a karaktert is
hozztesszk a lekrdez karakterlnchoz.
378 19. ra
sszefoglals
Ezen az rn a weblapok kzti informcitads kt mdjval ismerkedhettnk
meg. Segtsgkkel tbb oldalbl ll webes alkalmazsok alakthatk ki, melyek
a felhasznlk ignyeit is figyelembe veszik.
Krdsek s vlaszok
Van e valamifle komoly biztonsgot vagy szemlyisgi jogokat srt
velejrja a stik hasznlatnak?
A kiszolgl csak a sajt tartomnyn bell lev gpek stijeihez frhet hozz.
Azon tl, hogy a sti a felhasznl fjlrendszerben troldik, azzal semmifle
tovbbi kapcsolatba nem kerl. Lehetsg van azonban arra, hogy stit lltsunk be
egy kp letltsnek vlaszaknt. Teht ha sok webhely jelentet meg egy kls
reklmszolgltat vagy szmll programot oldalain, ezek szolgltatja kpes lehet
a ltogatk kvetsre klnbz webhelyek kztt is.
Mhely
A mhelyben kvzkrdsek tallhatk, melyek segtenek megszilrdtani az rban
szerzett tudst. A vlaszokat az A fggelkben helyeztk el.
Kvz
1. Milyen fggvnnyel vehetjk r a weboldalunkat letlt felhasznl bng-
szjt, hogy ltrehozzon egy stit s trolja azt?
Feladatok
1. Tegyk lehetv, hogy a webhelynket megltogat felhasznl bellthassa
a weboldalak httrsznt, valamint hogy megadhassa, milyen nven
kszntsk a webhely oldalai. Oldjuk meg stikkel, hogy minden oldal
ksznjn, illetve a megfelel httrsznnel jelenjen meg.
19
19_ora.qxd 8/3/2001 6:22 PM Page 380
20_ora.qxd 8/3/2001 6:22 PM Page 381
20. RA
llapotok trolsa
munkamenet-fggvnyekkel
Az elz rban ttekintettk, hogy hogyan lehet sti vagy lekrdez karaktersoro-
zat hasznlatval menteni az oldalak llapott. A PHP 4 ezeken kvl tovbbi lehet-
sgeket is nyjt, klnbz fggvnyei vannak a felhasznl llapotnak mentsre
is. Ezen fggvnyek hasznlata nagyon hasonl az elz rban tanultakhoz, de
mivel kzvetlenl a nyelvbe vannak ptve, az llapot mentse egyszer fggvny-
hvsokkal vgezhet el.
382 20. ra
session.auto_start = 0
HTTP/1.1 200 OK
Date: Sun, 07 Jan 2001 13:50:36 GMT
Server: Apache/1.3.9 (Unix) PHP/4.0.3
Set-cookie: PHPSESSID=2638864e9216fee10fcb8a61db382909; path=/
Connection: close
Content-Type: text/html
384 20. ra
Munkamenet-vltozk
A munkamenet-azonost hozzrendelse a felhasznlhoz csak az els lps.
Egy munkamenet sorn tetszleges szm globlis vltozt vezethetnk be,
amelyeket ksbb brmelyik, a munkameneteket tmogat oldalunkrl elrhetnk.
A 20.2. pldban lthat kdnak nincs tl sok rtelme, amg a felhasznl be nem
tlt egy j oldalt. A 20.3. pldban egy olyan PHP program lthat, amely a 20.2.
pldban bejegyzett vltozkat hasznlja.
20_ora.qxd 8/3/2001 6:22 PM Page 385
A 20.3. program eredmnye a 20.1. brn lthat. Ltjuk, hogy az oldalrl hozzf- 20
rnk a msik programban bejegyzett $termek1 s $termek2 vltozkhoz.
20.1. bra
Bejegyzett vltozk
hasznlata
386 20. ra
print session_save_path();
sess_2638864e9216fee10fcb8a61db382909
sess_76cae8ac1231b11afa2c69935c11dd95
sess_bb50771a769c605ab77424d59c784ea0
Amikor megnyitjuk azt a fjlt, melynek neve a 20.1. pldban visszaadott munka-
menet-azonostt tartalmazza, lthatjuk, hogyan troldnak a bejegyzett vltozk:
388 20. ra
session_start();
session_destroy();
Amikor olyan oldalt tltnk be, amely egy munkamenetet vr, az mr nem ltja
a korbban trlt munkamenetet, ezrt ltre kell hoznia egy jat. Minden korb-
ban bejegyzett vltoz elvsz.
session_start();
session_register( proba );
$proba = 5;
session_unset();
session_destroy();
print $proba; // nem r ki semmit. a $proba vltoz
mr nem ltezik.
390 20. ra
session_start();
print session_encode()."<br>";
// minta eredmny: termekek|a:2:{i:0;s:8:
"HAL 2000";i:1;s:8:"Targonca";}
session_start();
session_unset(); // nem szabad, hogy ltezzenek
munkamenet-vltozk
session_decode( "termekek|a:2:{i:0;s:8:\HAL 2000\";
i:1;s:8:\"Targonca\";}" );
foreach ( $termekek as $egytermek )
{
print "$egytermek<br>\n";
}
// Kimenet:
// HAL 2000
// Targonca
if ( session_is_registered ( "termekek" ) )
print "A 'termekek' vltoz bejegyzett!";
Ez akkor lehet hasznos, ha biztosak akarunk lenni a vltoz forrsban, azaz, hogy
a vltoz tnyleg a munkamenet bejegyzett vltozja vagy csak egy GET krelem
eredmnyeknt kaptuk.
20_ora.qxd 8/3/2001 6:22 PM Page 392
392 20. ra
sszefoglals
Ebben s az elz rban ttekintettk, hogyan menthetjk az llapotokat
egy llapot nlkli protokollban. Klnfle mdszereket alkalmaztunk: stiket s
lekrdez karakterlncokat hasznltunk, nha ezeket fjlokkal s adatbzisokkal
tvztk. Mindegyik megkzeltsi mdnak megvannak a maga elnyei s
htrnyai.
A sti nem igazn megbzhat s nem trolhat sok informcit. Ezzel szemben
hossz ideig fennmaradhat.
Krdsek s vlaszok
Van valamilyen veszlye a munkamenet-fggvnyek hasznlatnak,
amirl mg nem tudunk?
A munkamenet-fggvnyek alapveten megbzhatk. De emlkezznk r, hogy
a stik hasznlata nem lehetsges tbb tartomnyon keresztl. Ezrt, ha tbb tarto-
mnynevet hasznlunk ugyanazon a kiszolgln (elektronikus kereskedelemi alkal-
mazsoknl ez gyakori), tiltsuk le a stik hasznlatt a session.use_cookies 0-
ra lltsval a php.ini fjlban.
20_ora.qxd 8/3/2001 6:22 PM Page 393
Mhely
A mhelyben kvzkrdsek tallhatk, melyek segtenek megszilrdtani az rban
szerzett tudst. A vlaszokat az A fggelkben helyeztk el.
Kvz
1. Melyik fggvnyt hasznljuk egy munkamenet elindtsra?
Feladatok
1. Az elz ra Feladatok rszben ksztettnk egy programot, amely stit
vagy lekrdez karakterlncot hasznl, hogy oldalrl oldalra vigye tovbb
a felhasznl vlaszait. Ezutn a krnyezet minden oldala a belltott httr-
sznnel indult s nv szerint dvzlte a felhasznlt. Ksztsk el ezt a prog-
ramot a PHP 4 munkamenet-fggvnyeivel.
21. RA
Munka kiszolgli krnyezetben
A korbbi fejezetekben ttekintettk, hogyan trsaloghatunk tvoli szmtgpek-
kel s hogyan vehetnk t adatokat a felhasznltl. Ebben a fejezetben ismt ki-
tekintnk, olyan eljrsokat tanulunk meg, amelyek kls programok sajt gpn-
kn val futtatsra hasznlhatk. A fejezet pldi Linux opercis rendszerre
kszltek, de a legtbb alapelv felhasznlhat Microsoft Windows rendszerben is.
396 21. ra
A popen() hasznlata akkor javasolt, amikor egy folyamat kimenett sorrl sorra
szeretnnk elemezni. A 21.1-es pldban a GNU who parancs kimenett elemezzk,
s a kapott felhasznlneveket mailto hivatkozsokban hasznljuk fel.
21.1. bra
A who UNIX parancs
kimenetnek olvassa
21
398 21. ra
21
Parancsok vgrehajtsa az exec() fggvnnyel
Az exec() egyike azoknak a fggvnyeknek, amelyekkel parancsokat adhatunk ki
a hjnak. A fggvny paramterben meg kell adni a futtatand program elrsi
tjt. Ezen kvl megadhat mg egy tmb, mely a parancs kimenetnek sorait fogja
tartalmazni s egy vltoz, amelybl a parancs visszatrsi rtke tudhat meg.
400 21. ra
21.2. bra
A knyvtrlista betl-
tse a bngszbe
az exec() fggvny
segtsgvel
21_ora.qxd 8/3/2001 6:22 PM Page 401
<?php
print "<pre>";
system( "man man | col -b", $vissza );
print "</pre>";
?>
A PRE HTML elemet azrt adtuk meg, hogy a bngsz megtartsa a kimenet
eredeti formtumt. A system() fggvnyt hasznltuk, hogy meghvjuk a man
parancsot, ennek kimenett hozzkapcsoltuk a col parancshoz, amely ASCII-knt
jraformzza a megjelen szveget. A visszatrsi rtket a $vissza vltozba
mentjk. A system() kzvetlenl a bngszbe rja a kimenetet.
print "<pre>";
print `man man | col -b`;
print "</pre>";
402 21. ra
21.3. bra
A man program
meghvsa
21_ora.qxd 8/3/2001 6:22 PM Page 403
Vagyis meg kell jelentenie az xxx parancshoz tartoz sgoldalt, ami termsze-
tesen nem ltezik. Ebben az esetben a col parancs bemenete a teljes knyvtrlista
lesz. Ezzel a tmad kirathatja a rendszer brmelyik olvashat knyvtrnak tartal-
mt. A kvetkez utastssal pldul a /etc/passwd tartalmt kapja meg:
404 21. ra
<img src="21.6.program.php?kep=<?php
print urlencode("/utvonal/kep.gif") ?>">
406 21. ra
rjunk egy Perl CGI programot! Ne aggdjunk, ha nem ismerjk a Perlt. Ez a prog-
ram egyszeren egy HTTP fejlcet r ki s minden rendelkezsre ll krnyezeti
vltozt felsorol:
#!/usr/bin/perl -w
print "Content-type: text/html\n\n";
foreach ( keys %ENV ){
print "$_: $ENV{$_}<br>\n";
}
<?php
virtual("/cgi-bin/proba.pl");
?>
sszefoglals
Ebben a fejezetben ttekintettk, hogyan mkdhetnk egytt a hjjal s rajta
keresztl a kls alkalmazsokkal. A PHP sok mindenre hasznlhat, de lehet,
hogy kls programok hasznlatval az adott problma elegnsabb megold-
shoz jutunk.
Krdsek s vlaszok
Sokat emlegettk a biztonsgot ebben a fejezetben. Honnan tudhatunk
meg tbbet a szksges biztonsgi vintzkedsekrl?
A legbvebb szmtgpes biztonsggal foglalkoz forrs Lincoln Stein (a hres
Perl modul, a CGI.pm szerzje) ltal fenntartott FAQ. Megtallhat
a http://www.w3.org/Security/Faq/ cmen. rdemes a PHP kziknyv
biztonsgrl szl rszt is tanulmnyozni.
Mhely
A mhelyben kvzkrdsek tallhatk, melyek segtenek megszilrdtani az rban
szerzett tudst. A vlaszokat az A fggelkben helyeztk el.
21
Kvz
1. Melyik fggvnyt hasznljuk alkalmazsok sszekapcsolsra?
408 21. ra
Feladatok
1. rjunk programot, amely a UNIX ps parancsnak segtsgvel megjelenti
a bngszben a fut folyamatokat! (Megjegyezzk, hogy nem biztonsgos,
ha a felhasznlk futtathatjk a programot!).
22. RA
Hibakeress
E knyv rsakor a PHP 4 semmilyen hibakeres eszkzt nem tartalmazott.
A fejlesztk gretet tettek hibakeres szolgltatsok beptsre, pldul hogy
a verem tartalmt nyomon kvethessk, ezrt elkpzelhet, hogy mire e knyv az
Olvas kezbe kerl, a legfrissebb kiads mr tartalmaz valamilyen fejlettebb hiba-
keres eszkzt. Ebben a fejezetben a kdban rejl hibk feldertsnek nhny
egyszer mdjt mutatjuk be.
410 22. ra
A phpinfo()
A phpinfo() fggvny az egyik leghasznosabb hibakeres eszkz: rszletes
informcikkal szolgl magrl a PHP-rl, a kiszolgli krnyezetrl s a fut
program vltozirl. A fggvnynek nem kell tadnunk semmilyen paramtert s
csak egy logikai rtket ad vissza, viszont egy csinos HTML oldalt kld a bng-
sznek. A phpinfo() kimenett a 22.1. brn lthatjuk.
22.1. bra
PHP informcik
megjelentse
track_vars On
register_globals Off
22_ora.qxd 8/3/2001 6:22 PM Page 411
Hibakeress 411
session.cookie_lifetime 0
session.use_cookies 0
412 22. ra
Hibakeress 413
22.2. bra
Globlis vltozk
elrse
414 22. ra
22.3. bra
Sznkiemels
hasznlata
Hibakeress 415
Egy msik gyakori problma, hogy elg nehz nyomon kvetni egy flig nyitott
idzjel-prt. Mivel a PHP az idzjel utni szveget karakterlncknt rtelmezi,
gyakran rossz helyen jelzi a hibt. Az idzjelben lv karakterlncok szintn ms
sznnel jelltek, gy ez a tpus hiba nagyon knnyen szrevehet.
PHP hibazenetek 22
Mikzben e knyv segtsgvel elsajttottuk a PHP programozs alapjait, bizonyra
elfordult, hogy hibazeneteket kaptunk a vrt eredmny helyett. Pldul elfelejtet-
tnk zrjelbe tenni egy kifejezst vagy elgpeltk egy fggvny nevt. A hibaze-
netek nagyon fontosak a hibakeress sorn. lltsuk a php.ini fjlban
a display_errors bejegyzst "On"-ra, ezzel biztosthatjuk, hogy a PHP elkldje
a hibazeneteket a bngsznek. Ne feledjk, hogy a phpinfo() fggvny segt-
sgvel megnzhetjk, hogy be van-e kapcsolva ez a lehetsg.
416 22. ra
error_reporting = E_ERROR|E_WARNING
22_ora.qxd 8/3/2001 6:22 PM Page 417
Hibakeress 417
Mint lthat, a $flag vltoz rtkt akarjuk vizsglni, de elgpeltk. Nincs vgze-
tes hiba a programban, gy minden tovbbi nlkl lefut s
az E_ERROR|E_WARNING|E_PARSE hibakezelsi bellts mellett mg csak ze-
netet sem kld a bngsznek. A kd bekerl a programba s a lehet legrosszabb
pillanatban mkdsbe lp. Ha azonban az error_reporting() fggvnynek
az E_ERROR|E_WARNING|E_PARSE|E_NOTICE rtket adnnk t (ez magban
foglalja a megjegyzsek elkldst is), a program a kvetkez kimenetet klden:
22_ora.qxd 8/3/2001 6:22 PM Page 418
418 22. ra
Azaz:
Itt azt hasznljuk ki, hogy ha egy nem meghatrozott vltoz rtkt ratjuk ki,
akkor annak hasonl a hatsa ahhoz, mintha egy res karakterlncot jelentennk
meg (tulajdonkppen semmilyen hatsa nincs). A "felhasznalo" mez
egy elzleg elkldtt rtket vagy semmit sem tartalmaz. Ha a megjegyzsek
elkldst is engedlyeztk, hibazenetet kapunk.
Hibakeress 419
error_log = /home/httpd/logs/php_errors
/home/httpd/htdocs/proba5.php, 4. sor:
Nem lehet megnyitni a kvetkez fjlt: ./fontos.txt
420 22. ra
Ha 3-as tpus hibazenetet hozunk ltre, egy harmadik paramterben azt is meg
kell adnunk az error_log() fggvnynek, hogy hov kerljn a hibazenet.
if ( ! file_exists( "kritikus.txt" ) )
or error_log( ", nem! kritikus.txt-nek vge van!",
1, "veszeset@kritikus.hu" );
A hibazenet elfogsa
Ha hibazeneteket runk egy fjlba vagy elektronikus levlben kldjk el azokat,
hasznos lehet, ha hozzfrnk a PHP ltal ellltott hibazenethez.
Ehhez a php.ini fjlban a track_errors bejegyzst "On"-ra kell lltanunk
ennek hatsra a legutols PHP hibazenet bekerl a $php_errormsg vltozba
(hasonlan a Perl $! vltozjhoz).
Hibakeress 421
Kzi hibakeress
Mindig nagyon nehz azonban az olyan hibk kijavtsa, amelyek nem vltanak ki
hibazenetet.
422 22. ra
22.4. bra
A debug() fggvny
hasznlata
22_ora.qxd 8/3/2001 6:22 PM Page 423
Hibakeress 423
Gyakori hibk
Mindannyian kvetnk el hibkat, klnsen akkor, ha vszesen kzeledik
a leadsi hatrid. Vannak olyan csapdk, amelyekbe elbb-utbb minden progra-
moz beleesik.
$valtozo=0;
while ( $valtozo < 42 );
{
print "$valtozo<BR>";
$valtozo++;
}
$ertek = 1;
while ( $ertek != 50 )
{
print $ertek;
$ertek+=2;
}
if ( $proba = 4 )
{
print "<P>A \$proba rtke 4</P>\n";
}
22_ora.qxd 8/3/2001 6:22 PM Page 424
424 22. ra
Ha idzjelet akarunk kiratni, jeleznnk kell az rtelmeznek, hogy itt nem kln-
leges karakterknt kell kezelnie. Az elbbi kdrszlet a kvetkezkppen fest
helyesen:
Hibakeress 425
sszefoglals
A fejleszts taln egyik leghltlanabb rsze a hibakeress. A megfelel mdsze-
rekkel azonban megknnythetjk az letnket.
Krdsek s vlaszok
Ltezik mdszer, amellyel cskkenthetjk a kdba kerl hibkat?
Legynk szemflesek! Tulajdonkppen szinte lehetetlen egy olyan nagyobb lleg-
zet programot ltrehozni, amely elsre tkletesen mkdik. Hasznljunk modu-
lris tervezst, hogy gyorsan elklnthessk a hibt tartalmaz kdrszletet. Olyan
gyakran ellenrizzk a kdot, amilyen gyakran csak lehetsges. Rossz megkzel-
ts, ha megrjuk a programot, elindtjuk, azutn vrjuk, mi trtnik. Oldjunk meg
egy rszfeladatot (lehetleg fggvnyek formjban), majd prbljuk ki az elk-
szlt kdot. Ha tkletesen mkdik, mehetnk a kvetkez rszfeladatra. Prbl-
junk bolondbiztos kdot kszteni s ellenrizzk mkdst szlssges krl-
mnyek kztt. Ha az egyik leglnyegesebb lps pldul az adatok kirsa egy
megadott fjlba, nzzk meg, mi trtnik, ha a fjl hinyzik.
Mhely 22
A mhelyben kvzkrdsek tallhatk, melyek segtenek megszilrdtani az rban
szerzett tudst. A vlaszokat az A fggelkben helyeztk el.
Kvz
1. Melyik fggvnnyel kaphatunk hasznos informcikat a PHP-rl s a rend-
szernkrl?
426 22. ra
Feladatok
1. Vizsgljuk meg eddig elkszlt programjaink kdjt s felptst az ebben
az rban tanult mdszerek segtsgvel.
23_ora.qxd 8/3/2001 6:23 PM Page 427
IV. RSZ
sszefoglal plda
23. ra Teljes plda (els rsz)
24. ra Teljes plda (msodik rsz)
23_ora.qxd 8/3/2001 6:23 PM Page 428
23_ora.qxd 8/3/2001 6:23 PM Page 429
23. RA
Teljes plda (els rsz)
Ha figyelmesen kvettk az egyes rk anyagt, j alapokkal rendelkeznk a PHP
programozshoz. Ebben s a kvetkez rban egy teljes, mkd programot
ksztnk, amely az elz rkban trgyalt eljrsokbl ptkezik.
430 23. ra
Az oldalak felptse
Mieltt akr egy sor kdot is rnnk, el kell dntennk, hogyan fog mkdni
programunk. Milyen mdon fogjk elrni a felhasznlk a rendszer klnbz
elemeit? Milyen oldalakra van szksgnk?
23.1. bra
Az alkalmazs
felptse
23_ora.qxd 8/3/2001 6:23 PM Page 431
Az adatbzis kialaktsa
Az alkalmazs adatainak trolshoz ltre kell hoznunk a szervezo adatbzist s
ebben ngy tblt: klubok, esemenyek, teruletek, tipusok. Nyilvnval,
hogy a klubok s rendezvnyek adatait kln tblkban kell trolnunk, hiszen
egy klubhoz tbb rendezvny is tartozhat. A terletek s tpusok szmra kiala-
ktott tblk jelentsen megknnytik a listzshoz s adatbevitelhez szksges
lenyl menk kialaktst. A tblkat SQL parancsokkal hozzuk ltre, kzi ton.
A klubok tbla a kvetkezkppen hozhat ltre:
23
azonosito INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
klubnev VARCHAR(50),
tipus CHAR(3),
terulet CHAR(3),
email VARCHAR(50),
ismerteto BLOB,
nev VARCHAR(8),
jelszo VARCHAR(8)
);
23_ora.qxd 8/3/2001 6:23 PM Page 432
432 23. ra
A tagok szmra nem adunk lehetsget ezen tblk mdostsra, inkbb elre
meghatrozott csoportokat alaktunk ki, melyeket INSERT SQL parancsokkal
adunk a tblkhoz. A tagok ezekbl a listkbl vlaszthatnak majd.
Tervezsi dntsnk
Az elz bekezdsekben mr lttuk, milyen szerkezet alkalmazst ksztnk.
gy dntttnk, hogy a klnbz szolgltatsokhoz klnbz PHP programokat
ksztnk, ahelyett, hogy egyetlen hatalmas programot ptennk fel, amely a krl-
mnyeknek megfelelen ms-ms oldalakat szolgltat. Ennek a dntsnek term-
szetesen vannak elnyei s htrnyai is.
Ha egy ilyen dinamikus krnyezetet tbb oldalbl ptnk fel, a kdok ismtlsnek
hibjba eshetnk s a program nvekedsvel megnehezthetjk a fejlesztk dolgt.
Msrszt viszont a befejezett prototpust tadhatjuk grafikusainknak, akik majdnem
gy kezelhetik azt, mintha pusztn HTML kdot tartalmazna.
434 23. ra
csatlakozas.php s adatbazis.inc
A csatlakozas.php tartalmazza azt az rlapot, amelyen keresztl az j tagok
egy nv s jelsz segtsgvel bejegyeztethetik klubjukat a rendszerbe. Ahhoz, hogy
felvehessk az adatokat s kiszrhessk az ismtldseket, elszr meg kell
nyitnunk egy kapcsolatot az adatbzis fel. Ez az ilyen alkalmazsoknak annyira
jellemz eleme, hogy clszer kln fggvnyt kszteni erre a clra, melyet jelen
esetben egy kls llomnyban fogunk trolni. Ezt a kls fjlt ksbb minden
oldalon az include() nyelvi elemmel illesztjk a kdba. Tulajdonkppen minden
adatbzissal kapcsolatos fggvnyt ebben trolunk majd, ezrt az adatbazis.inc
nevet kapja, szerepe s a beilleszts mdja utn. Ezzel a fjllal a tovbbi PHP olda-
lakat mindennem SQL parancstl mentestjk.
Emlkezznk r, hogy minden PHP kd, amit ezen kls fjlokba runk, PHP blokk
kezd (<?php) s zr (?>) elemek kztt kell, hogy legyen. rtelmetlen bonyol-
tsnak tnhet, hogy a klnbz szolgltatsokat kls llomnyokba helyezzk,
de ez rengeteg kdismtlstl kml majd meg bennnket, amikor oldalainkat elk-
sztjk. Most mr kszen llunk a csatlakozas.php oldal megrsra.
13:
mezt!<br>\n";
23
14: if ( $urlap["jelszo"] != $urlap["jelszo2"] )
15: $uzenet .= "A jelszavak nem
egyeznek!<br>\n";
16:
23_ora.qxd 8/3/2001 6:23 PM Page 436
436 23. ra
438 23. ra
Egyelre ugorjunk a HTML rsz trgyalsra. A body HTML elemen bell elszr
egy jabb kls fjlt illesztnk be, amely a klnbz oldalakra mutat hivatkoz-
sokat tartalmazza. Clszer mr a kezdetektl beilleszteni a navigcis svot, mivel
ez megknnyti az alkalmazs ellenrzst, ahogy folyamatosan fejlesztjk azt.
A navigcis elemeket a kozosnav.inc nev llomnyban helyezzk el.
Egyelre ez a fjl csak a ltogatk szmra is elrhet oldalakra mutat hivatko-
zsokat tartalmazza.
A HTML rlap elemei kztt hrom lthat mezt hoztunk ltre, az urlap[nev],
urlap[jelszo] s urlap[jelszo2] mezket. Azrt hasznljuk ezeket
az elsre esetleg furcsnak ltsz elnevezseket, mert a PHP az gy megadott
nevekkel rkez rtkeket egy asszociatv tmbbe rendezi, amit $urlap nven
rhetnk majd el. Ez megv bennnket attl, hogy a globlis vltozk krnyezett
beszennyezzk, azaz feleslegesen sok globlis vltozt hozzunk ltre. Program-
jainkban gy minden munkamenet-rtk a $munkamenet asszociatv tmbben,
az rlaprtkek pedig az $urlap asszociatv tmbben rhetk el. Ez megvd
bennnket a vltozk tkzstl. Clszer a lehet legkevesebbre cskkenteni
a globlis vltozk szmt egy ilyen mret programban, hogy megelzzk
a kavarodst. A tovbbiakban minden rlapot tartalmaz oldalon az $urlap
tmbbel fogunk tallkozni.
Most, hogy megnztk a HTML rlapot, rtrhetnk arra a kdra, amely a bemen
adatok ellenrzst vgzi. Elszr meg kell bizonyosodnunk rla, hogy a leend
23
tag valban kitlttte-e az sszes mezt s hogy egyik mez hossza sem haladja
meg a nyolc karaktert. Ezutn meghvjuk az j sorLekeres() fggvnyt.
Ez azon fggvnyek egyike, amelyek az adatbazis.inc fjlban tallhatk.
Els paramtere egy tblanv, a msodik egy meznv, a harmadik egy rtk.
Ezen adatok alapjn a fggvny egy illeszked sort keres az adatbzisban,
visszaadva azt egy tmbben.
23_ora.qxd 8/3/2001 6:23 PM Page 440
440 23. ra
A fggvny egy nv s egy jelsz paramtert vr, majd ezeket j sorknt felveszi
a klubok tbljba. A fggvny a mysql_insert_id()-t hasznlja, hogy
megkapja a felvett j tag azonostjt.
23_ora.qxd 8/3/2001 6:23 PM Page 441
23.2. bra
A csatlakozas.php
kimenete
23
23_ora.qxd 8/3/2001 6:23 PM Page 442
442 23. ra
klubfrissites.php
Ez az oldal ketts clt szolgl. Egyrszt az j tagoknak itt kell megadniuk a klub
rszletes adatait, a bejegyzett tagok pedig itt mdosthatjk ezeket.
444 23. ra
munkamenet%5Bbelepett%5D=1&munkamenet%5Bazonosito%5D=1
446 23. ra
23
egy e-mail cmet s egy ismertett vr a klubok tbla szmra.
23_ora.qxd 8/3/2001 6:23 PM Page 448
448 23. ra
23.3. bra
A klubfrissites.php
kimenete
23_ora.qxd 8/3/2001 6:23 PM Page 449
tagmenu.php
A tagmenu.php a tagok terletnek kzpontja. Alapveten hivatkozsok listjbl
ll, de a tagok szmra fontos hrek s ajnlatok is helyet foglalhatnak az oldalon.
23
25: </body>
26: </html>
450 23. ra
belepes.php
Mieltt tovbblpnk a rendezvnyeket kezel oldalakra, el kell ksztennk
a belepes.php programot. Ez az oldal ad lehetsget a bejegyzett tagoknak,
hogy a ksbbiekben belpjenek a rendszerbe.
48:
value="belepes">
<input type="hidden" name="<?php
23
print session_name() ?>"
49: value="<?php print session_id() ?>">
50: </p><p>
51: Tagsgi nv: <br>
52: <input type="text" name="urlap[nev]"
53: value="<?php print $urlap["nev"] ?>">
23_ora.qxd 8/3/2001 6:23 PM Page 452
452 23. ra
esemenyfrissites.php
Most, hogy a tagok mr kpesek csatlakozni s belpni a rendszerbe, valamint
mdostani is tudjk az adataikat, lehetsget kell adnunk a rendezvnyek bevitelre
s mdostsra. A teljes esemenyfrissites.php oldal a 23.17. programban
lthat.
454 23. ra
456 23. ra
458 23. ra
460 23. ra
Minden fggvny egy idblyeget vr s HTML OPTION elemek listjt rja ki.
A getDate() PHP fggvnyt hasznljk arra, hogy az idblyeg megfelel
23
elemnek indext megllaptsk (v, hnap, hnap napja, ra, perc). Ezutn
a kapott szmot sszehasonltjk az alkalmazott tartomny rtkeivel (a tartomny
a hnap napjainl 1-tl 31-ig, a perceknl 0-tl 59-ig terjed). Ha egyezst szlel-
nek, a SELECTED jelzt adjk az OPTION elemhez, gy vlasztjk ki a megfelel
sort.
462 23. ra
23.4. bra
Az esemenyfrissites.php
kimenete
esemenylista.php
Vgl biztostanunk kell a tagoknak egy oldalt, ahol minden ltaluk bevitt ese-
mnyt vgigtekinthetnek. Ennek az oldalnak lehetsget kell adnia arra is, hogy
a tagok az esemnyeket szerkeszthessk vagy trlhessenek egyet.
Az esemenylista.php az eddigiek ismeretben egyszer program.
40: }
megtrtnt!<br>";
23
41:
42: ?>
43: <html>
44: <head>
45: <title>Esemnyek listja</title>
46: </head>
23_ora.qxd 8/3/2001 6:23 PM Page 464
464 23. ra
A date() PHP fggvnynek tadva minden tmb edatum elemt, formzott dtu-
mokat runk ki. A dtum mellett minden esemny szmra egy hivatkozst hozunk
ltre, felhasznlva az esemny azonostjt s az enev rtket. Az tadand
eazonosito vltoz mellett szerepeltetjk a SID llandt, gy biztostva, hogy
a munkamenet rvnyes marad az j oldalon is. A hivatkozs
az esemenyfrissites.php oldalra mutat, amely gy meg tudja jelenteni az ese-
mny adatait a szerkeszts szmra. Vgl minden rendezvny sorban egy erre
az oldalra visszamutat hivatkozst is szerepeltetnk. Ehhez az eazonosito mellett
egy esemenyTorles rtk mitkelltenni paramtert is meghatrozunk.
Ez az adott esemny trlsre szolgl majd, ezrt egy JavaScript esemnykezelt is
adunk a hivatkozshoz, hogy ne lehessen vletlenl trlni egy rendezvnyt sem.
23
23_ora.qxd 8/3/2001 6:23 PM Page 466
466 23. ra
23.5. bra
Az esemenylista.php
kimenete
sszefoglals
Az ra vgre elkszltnk a teljesen mkd, tagok szmra kszlt krnyezettel
a rendezvnyeket nyilvntart rendszerhez. Lehetsget teremtettnk grafikusa-
inknak az oldalak j kialaktsra, azzal, hogy a lehet legtbb kdot kls llo-
mnyokban helyeztk el. Gyakran hasznltuk a header() fggvnyt, hogy
j oldalra irnytsuk a tagot, ha adatokat vrunk tle. A belpsi informcik tro-
lshoz munkamenet-kezel fggvnyeket, a tagok azonostshoz adatbzis-
lekrdezseket hasznltunk minden oldalon.
Krdsek s vlaszok
A tbb oldalbl ll alkalmazsok megtervezse s karbantartsa bonyo-
lultnak tnik. Van valami titok emgtt?
A pldaalkalmazs elksztse sorn majdnem minden oldalon egyszer mintt
kvettnk. Ahogy alkalmazsaink nagyobb vlnak, a teljes krnyezetrl egyetlen
programknt kell gondolkodnunk. A klnll oldalak csak a ltogat csatlakoz-
si pontjai az egsz alkalmazshoz. Tartsuk az sszes egynl tbb oldalon ismtl-
d kdot kln llomnyban!
23_ora.qxd 8/3/2001 6:23 PM Page 467
Mhely
A mhelyben kvzkrdsek tallhatk, melyek segtenek megszilrdtani az rban
szerzett tudst. A vlaszokat az A fggelkben helyeztk el.
Kvz
1. Melyik PHP fggvnyt hasznljuk arra, hogy MySQL adatbzishoz
csatlakozzunk?
Feladatok
1. Tekintsnk vgig az rban trgyalt forrskdokon. Tallunk olyan megold- 23
sokat, amelyeket sajt programjainkban is tudunk majd hasznostani?
23_ora.qxd 8/3/2001 6:23 PM Page 468
24_ora.qxd 8/3/2001 6:23 PM Page 469
24. RA
Teljes plda (msodik rsz)
Az elz rban felptettk a klubok szmra a bejegyz s karbantart felletet,
amivel j klubok s rendezvnyek kerlhetnek a rendszerbe. Most az tlagos
felhasznlk szmra elrhet programokat kell elksztennk, melyek lehetv
teszik a listk bngszst.
470 24. ra
Ebben az rban ngy oldalt ksztnk el, amelyek lehetsget adnak a felhaszn-
lnak, hogy kirassa egy adott terlet vagy tma rendezvnyeit, brmilyen idpont
szerinti szrssel prostva.
esemenyekinfo.php
Az esemenyekinfo.php oldal lehetsget ad a rendszerben lv rendezvnyek
bngszsre. Bizonyos szempontbl hasonlt az esemenylista.php oldalra,
amit az elz rban trgyaltunk, de nagyobb rugalmassgot s tbb informcit
nyjt a felhasznlnak.
472 24. ra
session_start();
session_register( "munkamenet" );
474 24. ra
A fggvny lnyegben egy SQL krst llt ssze a paramterek alapjn. A lekrs
alapveten sszekapcsolja az adatbzisban lv tblkat, ezzel biztostva, hogy
a klubnv, terletnv s tpusnv mezk is elrhetk legyenek az eredmnytb-
lban.
476 24. ra
Taln feltnt az elz rban, hogy egy html() nev fggvnyt hasznltunk arra,
hogy szveges adatokat rjunk ki a bngszbe. Az esemenyLista() fggvny-
ben, ahogy az esemnyek informciin vgiglpkednk, ismt a html() fgg-
vnyt hvjuk meg. Ez az ltalunk rt fggvny a kozosfv.inc llomnyban tall-
hat. Egy karakterlncot vr s annak bngszbe rshoz alkalmass tett,
talaktott vltozatval tr vissza. A klnleges karakterek HTML elemekk alakul-
nak, az jsor karakterek pldul <br>-.
Lthat, hogy ez valjban nem egy, hanem kt fggvny. A html() egy karak-
terlncot vagy egy tmbt vr paramterl. Ha tmbt kap, vgiglpked rajta,
talaktva minden elemet, egyb esetben magt a kapott karakterlncot alaktja t.
A tnyleges talakts egy msik fggvnyben, a htmlszoveg()-ben valsul
meg, amely kt beptett fggvnyt alkalmaz a kapott karakterlncra.
A htmlspecialchars() minden karaktert, ami nem jelenne meg helyesen
a HTML kdban, a hozz tartoz HTML elemre cserl. Az nl2br() minden jsor
karaktert <br> sortrssel helyettest.
24.1. bra
Az esemenyekinfo.php
kimenete
24
24_ora.qxd 8/3/2001 6:23 PM Page 478
478 24. ra
klubokinfo.php
A felhasznl jogos ignnyel nem csak rendezvnyek, hanem klubok szerint is
ki szeretn ratni az adatbzis adatait, tpus vagy terlet szerint szktve azokat.
A klubokinfo.php oldal ezt az ignyt elgti ki.
480 24. ra
klubinfo.php
A klubinfo.php oldal lehetsget ad egyetlen klub minden adatnak megte-
kintsre. Hivatkozsok segtsgvel juthat ide a felhasznl, akr
az esemenyekinfo.php, az esemenyinfo.php vagy a klubokinfo.php
oldalakrl is. Az oldalt az eddig megismert megoldsok s fggvnyek segts-
gvel pthetjk fel, amint az albbi kd mutatja.
24
10: $klub["email"] = "<A HREF=\"mailto:$klub[email]\
">".$klub["email"]."</A>";
24_ora.qxd 8/3/2001 6:23 PM Page 482
482 24. ra
A program egy $azonosito paramtert vr, amely egy klub azonostszmt kell,
hogy tartalmazza. Ha az oldal nem kapott ilyen paramtert, a felhasznlt
a klubokinfo.php oldalra kldjk. A klub adatainak kidertsre egy j
adatbazis.inc fggvnyt, a klubLekeres()-t alkalmazzuk. Ez a fggvny
egy klubazonostt vr s egy tmbt ad vissza:
484 24. ra
24.2. bra
A klubinfo.php kime-
nete
esemenyinfo.php
Az esemenyinfo.php az utols oldal, amit az alkalmazshoz el kell kszte-
nnk. Erre az oldalra brmely esemnyinformcikat ad laprl el lehet jutni
egy hivatkozs segtsgvel. Az oldal minden informcit megad
az $eazonosito segtsgvel kivlasztott esemnyrl.
24_ora.qxd 8/3/2001 6:23 PM Page 485
486 24. ra
A jv
Mostanra elkszltnk a teljes rendezvnynaptrral. Remlem sikerlt rzkeltetni
ezzel a vals letbeli kisalkalmazsok dinamikus kialaktsnak lehetsgeit s
a PHP szertegaz kpessgeit.
Valsznleg feltnt mr, hogy programjaink kimenete elgg sprtai. Vgl t kell
adnunk a munkt egy grafikus terveznek, aki gyes vezrlsvot, komoly grafi-
kt s ms elemeket ad az oldalhoz. Szerencsre a legtbb PHP kd kls llom-
nyokban tallhat, a HTML-tl fggetlenl, de elkpzelhet, hogy szksg lesz
rnk is a ciklusok jrarsnl.
sszefoglals
Ebben s az elz rban elksztettnk egy teljesen mkd tbboldalas PHP
alkalmazst. Gyakoroltuk az llapot mentsnek, a felhasznli azonostsnak,
az adatbzis-adatok mdostsnak s megjelentsnek mdjait s sok ms
krdst is rintettnk.
24
24_ora.qxd 8/3/2001 6:23 PM Page 488
488 24. ra
Krdsek s vlaszok
Ennyi volt. Hogyan tovbb?
Ez mr nem a knyvn mlik. Elg informcit tallhatunk ebben a knyvben
ahhoz, hogy sajt kifinomult alkalmazsainkat el tudjuk kszteni. Ezzel s
a Vilghln elrhet rengeteg informcival nincs, ami megllthatna brkit is
a fejldsben!
Mhely
A mhelyben kvzkrdsek tallhatk, melyek segtenek megszilrdtani az rban
szerzett tudst. A vlaszokat az A fggelkben helyeztk el.
Kvz
1. Melyik fggvny hasznlhat j elem tmb vgre val beszrshoz?
2. Lehetsges egy j elem felvtele a tmb vgre fggvny hasznlata nlkl is?
Feladatok
1. Tekintsnk vgig az rban trgyalt forrskdokon. Tallunk olyan megold-
sokat, amiket fel tudunk hasznlni sajt programjainkban?