Vous êtes sur la page 1sur 811

Agytornztat tanfolyam

A gy hullm:

Fedezd fel a dinamikus, adatbzis-vezrelt webhelyek mgtt rejl titkokat!

Tltsd be a kulcsfontossg nyelvtani szablyokat kz vetlenl az agyadba!

Kerld el a knos hibkat a webes rlapokon!

Kapcsold ssze a PHP s MySQL ___ L___kdot!

Erstsd meg parancsfjl ksztsi tudsodat gya korlatok tucatjaival!

O R E IL L Y

Lynn Beighley, Michael Morrison

Az Agyhullm: PHP & MySQL-rl rtk


A PHP s a MySQL napjaink legnpszerbb webfejlesztsi technolgii kz tartoznak - ebbl a knyv bl kiderl, hogy mirt. Az, hogy nlklk ptsnk fel egy w ebhelyet, ma mr ugyanannyira elkpzelhe tetlen, mint a w ebtervezs a CSS nlkl. Ez a ktet nagyszer bevezetst nyjt a tm ba, s hihetetlenl szrakoztat. Brcsak n is ebbl a knyvbl tanultam volna! - Harvey Quamen, a z angol nyelv s a hum n inform atika adjunktusa, University ofAlberta Ez a knyv elvet mindent, ami szrazz s unalmass teszi a mszaki oktatst, s szokatlanul szrakoztat mdjt nyjtja a tanulsnak. Teljes bizonyossggal llthatom, hogy az Agyhullm sorozat ktetei forradal mastani fogjk a szakknyvkiadst, s a bennk kvetett m dszerek vlnak majd az j szabvnny. Lefo gadom, hogy ha ezt a knyvet egyszer vgigolvasn, a m inden mszaki dologtl irtz nagymamm is meg tudn tanulni a PHP s a MySQL hasznlatt - s mg lvezn is! - Will Harris, adatbzis-rendszergazda, Powered by Geek Ezt a knyvet olyan olvasni, mintha egy igazn j fej tanrtl tanulnnk. Az em ber alig vrja az rkat! - Stephanie Liese, webfejleszt A kpeknek s a hum ornak ksznheten knnyen emszthet, ugyanakkor valdi mszaki tudst nyjt ktet. - Jereme Alln, webfejleszt Miutn egy lt helyem ben vgigolvastam a knyvet, s vgigcsinltam az olyan bizarr feladatokat, mint a kutymat elraboltk az idegenek vagy az ssze nem ill prok prkeres gynksge, alig vrom, hogy a PHP erejvel ruhzzam fel a w ebhelyeim et. - Dvid Briggs, szoftvermrnk, szakknyinm

Agyhullm: PHP & MySQL ?


Nem lenne m eseszp, ha lenne egy knyv a P H P -r1 5 a M yS Q L-ro), amib<51 gy t n n e , m in th a az a d a tb z is o k a t s a k iszo lg l o ld a ll w e b p ro g ra m o z s t az g is e g ym sn a k te r e m te tte volna? Ez persze c s a k lo m ...

Lynn Beighley Michael Morrison

K IS K

OREILLY

<> S

B e ijin g B u d a p e s t C a m b rid g e K ln S e b a s to p o l T a ip e i 7/ryo

A kiadvny a kvetkez angol eredeti alapjn kszlt:


Head First PHP & MySQL
C opyright 2009 by O'Reilly M edia, Inc. All rights reserved! K iskapu Kft. 2009 A uthorized translation of th e English edition o f HEAD FIRST PHP & MYSQL ISBN 9^80596006303 2009 O'Reilly M edia, Inc. This translation is p u b lish e d an d sold by p erm issio n o f O'Reilly M edia, Inc., th e o w n e r o f all rights to p u b lish a n d sell th e sam e. N o p art o f this b o o k , in clu d in g interio r d esig n , co v e r design, a n d icons, m ay b e re p ro d u c e d o r transm itted in an y form , by an y m ea n s (electro n ic, p h o to co p y in g , recording, o r o th erw ise ) w ith o u t th e p rio r w ritten p erm issio n o f th e publisher. T rad em ark ed n am e s a p p e a r th ro u g h o u t this b o o k . R ather th a n list th e n am e s a n d entities th a t o w n th e trad em ark s o r insert a trad e m a rk sym bol w ith ea ch m en tio n o f th e tra d e m a rk e d nam e, th e p u b lish e r states that it is using the n a m e s for editorial p u rp o se s only a n d to th e b en efit o f th e trad em ark ow ner, w ith n o intention o f infringing u p o n th at tradem ark.

Series Creators: K athy Sierra, Bert Bates Series Editor: Brett D. M cLaughlin Editor: S anders K leinfeld Design Editor: Louise Barr Cover Designers: Louise Barr, Steve F ehler Production Editor: Brittany Smith Proofreader: C olleen G orm an Indexer: Julie H aw ks Page Viewers: Ju lien a n d D rew Printing History: D ecem b er 2008: First Edition.

hum

Wi*\ I T
Drew ebben a pillanatban j konyht s z e re l fel Lynn feljtott rgi hzban.

segtsen a knyv m e la b a n .

Fordts s m agyar vltozat 2009 K iskapu Kft. M inden jog fenntartva! A szerz k s a k iad a leh et leg n ag y o b b k rltekintssel jrt el e kiadvny elksztsekor. Sem a szerz, se m a k iad n em vllal sem m in em felelssget vagy garancit a knyv tartalm val, teljessgvel kapcsolatban. Sem a szerz, sem a k iad nem v o n h a t felelssgre brm ilyen b aleset vagy k resem n y miatt, m ely kzvetve vagy kzvetlenl k a p c so latba h o z h a t e kiadvnnyal.

Lektor: Rzmves Lszl Fordts: G ilicze Blint, R zm ves Lszl, Varga P ter Mszaki szerkeszt: C sutak H offm ann L evente
Felels k iad a K iskapu Kft. g y v ezet igazgatja 2009 K iskapu Kft. 1134 B udapest, C sng u. 8.; Fax: (+36-1) 303-1619; h ttp ://w w w .k isk a p u k ia d o .h u /; e-m ail: kiado@ kiskapu.hu

ISBN: 978 963 9637 63 4


Kszlt a d eb recen i Kinizsi N yom dban Felels vezet: B rds Jn o s

Szleimnek, akik gyakran hasznlnak webes alkalmazsokat, s akikre m indig szmthatok. - Lynn Beighley

Rasmus Lerdorfnak, akinek a fejbl kipattant a nyelv, amelyet ma PHP-knt ismernk, m aradand bizonytkaknt annak, hogy tnyleg elg egyetlen ember, aki j, felvilgosultabb tra vezet bennnket. - Michael Morrison

a szerzk

Az Agyhullm: PHP & MySQL szerzi

Mfetoel M c^so r,

Lynn Beighley egy szakknyvr testbe zrt szpr, de amikor felfedezte, hogy a szakknyvek rsval valdi pnzt lehet keresni, elfogadta s m egkedvelte a mszaki knyveket is. Miutn visszatrt az iskol ba, hogy megszerezze szmtstechnikai diplomjt, az NRL s LANL betszavaknl dolgozott. Aztn felfe dezte a Flash-t, s megrta az els sikerknyvt. Katasztroflis idztssel ppen az eltt kltztt a Szilcium-vlgybe, hogy az internetes lufi kipuk kadt. Nhny vig a Yahoo!-nak dolgozott, knyve ket n s tanfolyamokat vezetett, de vgl nem tud vn megtagadni szpri vnjt New Yorkba klt ztt, hogy kreatv ri diplom t szerezzen. Az Agy hullm (H ead First) sorozat stlusban megrt szakdolgozatt egy tanrokkal s diktrsakkal zsfolt te rem ben vdte meg. A m nagyon j fogadtatsban rszeslt, Lynn m egkapta a diplomjt, megrta a Head First SQL-1, s mr itt is az jabb mve, az Agyhullm: PHP & MySQL.
Lynn imd utazni s rni, s bonyolult httrtrtne teket kanyartani teljesen ismeretlen em berek kr. Az ufktl viszont fl egy kicsit.

Michael Morrison azta lelkes rsztvevje a hlzat vi lgnak, hogy elektronikus falijsgot m kdtetett a Com m odore 64-esn, akkor, am ikor kockafejnek lenni mg m essze nem volt olyan divatos dolog, mint m anapsg. Ma, nhny ezer bauddal ksbb, Michael mg mindig mul azon, hogy milyen gyor san milyen messzire jutottunk. Ma mr nem m kd tet elektronikus falijsgot, de a m odern megfeleli vel s az ptskhz szksges eszkzkkel ma is sok idt tlt. Hivatalos m unkaidejnek' nagy rszt a w ebes technolgikrl szl m vek rsa teszi ki: tbb mint tven knyvnek volt szerzje vagy trs szerzje, am elyek tmja a mobiljtkok program o zstl az XML-ig terjed. Az Agyhullm sorozatba a Head First JavaSc?ipt-te\ kapcsoldott be, s azta sem nzett vissza.
Michael egyben a Stalefish Labs (www. s t a l e f i s h l a b s . com) nev, jtkokra s interaktv mdira szakosodott szrakoztatipari cg alaptja, emellett pedig kztudott rla, hogy nha a hlzaton kvl is tlt nmi idt (ugye elllt a llegzetnk?): grdeszkzik, jghokizik, vagy a japn pontyokat nzi a kis ha lastava partjrl a felesgvel, M asheeddel. Egyszer egyszer mg aludni is szokott!

Tartalomjegyzk (ttekints)
Hogyan hasznld ezt a knyvet 1. 2. 3. 4. 5. 6. 7. 8. 9. Keltsd letre a statikus oldalakat! Kapcsolds a MySQL-hez Adatbzis ltrehozsa s feltltse Valszer, gyakorlati alkalmazsok Fjlokban trolt adatok kezelse Az alkalmazs biztonsgoss ttele Szemlyre szabott w ebalkalm azsok ptse Urald az adataidat, s uralni fogod a vilgot! Karakterlncok kezelse s egyni fggvnyek xxvii 1 59 103 159 223 295 345 417 427 501 561 605 657 713 731 749 755

lm . A tbbszr szerepl kdok kikszblse

10. Szablyos kifejezsek 11. Az adatok m egjelentse... s mg annl is tbb! 12. Tartalomsugrzs s webszolglta tsok i. ii. M aradkok Fejleszti krnyezet kialaktsa T rgymutat

iii. A php bvtse

Tartalomjegyzk (a rszletes)
Hogyan hasznljuk ezt a knyvet?
Kinek szl ez a k n y v ? ................................................................. xxviii Tudjuk, mire gondolsz? ................................................................. xxix Metakognci: gondolkods a g o n d o lk o d sr l..........................xxxi Ezt teheted TE, hogy engedelm essgre brd az a g y a d :......... xxxiii F o n to s !..............................................................................................xxxiv A szakmai lektorok csapata ........................................................ xxxvi K sznetnyilvnts...................................................................... xxxvii

a tartalom jegyzk

Keltsd letre a statikus oldalakat!


Nagyszer weboldalakat ksztesz a HTML s egy csipet CSS segtsgvel, de rjttl. hogy a ltogatid az oldalak passzv nzegetsre vannak krhoztatva. A kom munikci egyirny, s ezen vltoztatni szeretnl. Elszr is tudni szeretnd, hogy mire gondol a kznsged. Ehhez azonban lehetv kell tenned, hogy a fel hasznlk informcikat adjanak meg egy w ebes rlapon keresztl, hozz kell jut nod ezekhez az informcikhoz, majd fel kell tudnod dolgozni azokat. Nos, gy tnik, hogy a HTML-nl tbbre lesz szksged ahhoz, hogy a w ebhelyedet m agasabb szintre emeld. A HTML statikus s u n a lm a s ............................................................... 2 A PHP letre kelti a w e b o ld a la k a t......................................................3 Kutyk az rben .................................................................................... 4 O w en rlappal nyom oz ...................................................................... 5 Az rlapok HTML-bl lln a k ............................................................... 6 A HTML-rlappal gondok v a n n a k ......................................................8 A HTML az GYFLEN m kdik ................................................... 10 A PHP a KISZOLGLN m kdik ................................................. 11 A PHP-parancsfjlok a kiszolgln f u tn a k ..................................... 12 Az rlapadatok elrse a PHP se g ts g v e l................................... 16 A PHP-parancsfjloknak a kiszolgln kell lakniuk! ...................18 Tltsd fel a PHP-parancsfjlokat a kiszolglra! ..........................19 A kiszolgl HTML-l alaktja a P H P -t............................................ 22 O w en PHP-parancsfjlja rszekre bontva ..................................... 24 Nhny PHP-szably a k d o l s h o z ................................................. 25 Megtallni a tkletes v lto z n ev e t................................................. 26 A vltozk a parancsfjlok adatainak trolsra szolglnak . . . . 31 A S_POST egy klnleges vltoz, ami rlapadatokat trol . . . 33 A S_POST szlltja az rlapadatokat a parancsfjlodnak ............34 Az e-mail zenettrzsnek ltrehozsa a PHP segtsgvel . . . . 44 Mg a sima szveg is form zhat...egy k i c s i t .............................. 46 Az jsor karaktereket ketts idzjelek kz kell z r n i..............47 O w en levelnek sszelltsa .......................................................... 48 Az e-mail rszeit vltozk t ro lj k ................................................... 49 E-mail kldse a PHP segtsgvel ................................................. 50 O w enhez dlni kezdenek a levelek ...............................................53 O w en elveszt nhny l e v e l e t .......................................................... 54

Tartalomjegyzk

Tartalom jegyzk

Kapcsolds a MySQL-hez
Nem rt, ha tudod, hogyan llnak ssze a dolgok, mieltt ptkezni kezdesz. Elksztetted az els PHP-parancsfjlodat, s a program jl is mkdik. Az rlapadatok elkl dse levlben azonban mr nem elg j megolds. Az rlap adatait mentened kell valahogy, hogy megrizhesd, amg szksged nem lesz rjuk, s ha eljn az id, kinyerhesd kt. Az adataid biztonsgos trolsban egy iMySQL-adatbzis segt het - ahhoz azonban, hogy ez mkdjn, a PHP-parancsfjlt hozz kell kapcsol ni a MySQL-adatbzishoz.

O w en PHP-rlapja jl mkdik. Tl jl........................................... 60 A MySQL kivlan alkalmas adatok trolsra ............................ 61 O w ennek egy MySQL-adatbzisra van s z k s g e ..........................62 MySQL-adatbzis s -tbla ltrehozsa .......................................... 64 Az INSERT utasts m kds kzben ............................................ 67 Tbla adatainak kiolvassa a SELECT u ta s t s s a l..........................70 Hagyd a PHP-re az unalm as S Q L -t!................................................. 73 A PHP rvn az adatok vezrlik O wen w ebes r la p j t.............. 74 Kapcsolds az adatbzishoz a PHP se g ts g v e l....................... 76 Adatok beszrsa PHP-parancsfjl segtsgvel ..........................77 Trsalgs az adatbzissal P H P-fggvnyekkel.............................. 78 Csatlakozs a mysqli_connect() seg tsg v el.................................80 Az INSERT lekrdezs felptse a P H P -b e n .................................85 A MySQL-adatbzis lekrdezse ......................................................86 A kapcsolat bezrsa a mysqli_closeO fggvnnyel ...................87 Az rlapadatokat a SJPOST adja m e g ............................................ 91 O w ennek segtsgre van szksge az adatok tvizsglshoz . 96
Kla&ez ez az j bejelenti rlap, de most meg tdl &ok levelet kapok. Nem tudok annyi koffeint elfogyasztani, hogy mindet el tudjam olvasni, amint megrkeznek.

O wen j ton jr, hogy megtallja A g y a r t..................................... 98

/ i

m ost rtt vagy

xi

Adatbzis ltrehozsa s feltltse


A szksges adatok nem mindig llnak rendelkezsre. Nha ltre kell hoznod az adatokat, mieltt hasznlhatnd ket. Az adatok tro lshoz pedig nha tblkat kell ltrehoznod. Az is elfordulhat, hogy ltre kell hozjiod a z adatbzist , amely majd azokat az adatokat trolja, am elyeket ltre kell hoznod, mieltt hasznlhatnd ket. Elvesztetted a fonalat? Majd megtal lod. Kszlj fel: most meg fogod tanulni, hogy miknt hozhatod ltre a sajt adatbzisaidat s tblidat. s ha ez mg nem lenne elg, kzben felpted a legels PHP/MySQL-alkalmazsodat. Az Elvis-bolt m e g n y ito tt!........................................................ 104 Elmernek egy alkalmazsra van s z k s g e ..........................105 Rajzold le Elmer alkalmazsnak sze rk e z e t t!...................106 Minden egy tblval kezddik ............................................ 109 Lpj kapcsolatba a MySQL-kiszolglval! ..........................110 Hozd ltre az Elmer e-mail cmeit trol adatbzist! . . . . 111 Hozz ltre egy tblt az adatbzison b e l l! ....................... 112 Meg kell hatroznod az adatokat ........................................113 Ismerkedj meg a MySQL nhny adattpusval! Ksd a tblt az adatbzishoz! .............. 114 Hozd ltre a tblt egy lek rd e zssel!.................................117 ............................................ 119 Vedd hasznlatba az adatbzist, m ieltt...hasznlnd . . . 120 A DESCR1BE felfedi a tblk sz e rk e z e t t............................ 123 Elmer kszen ll az adatok t r o l s r a .................................125 Hozd ltre az Add Email parancsfjlt! .................................126
Ez tl tok* lg i s r t. Jobbnn szeretnm EMe utnzsval tKcn\ az idmet, mint a levelek tMjit kez , __

Elmer alkalmazsnak msik fele ........................................133 A Send Email parancsfjlt sszetart csavarok ................ 134 Elszr fogjuk az adatokat...................................................... 135 A mysqli_fetch_arrayO kiolvassa a lekrdezs eredmnyt 136 Ismteld, am g............................................................................ 139 Adatok bejrsa a w hile segtsgvel .................................140 Az em ber nha szabadsgra vgyik ................................... 146 Trls a DELETE se g ts g v e l...............................................147

k Uz Cevi QQte

B19 sl* thi* hm* t


C c o jin e * a o r *

s i a r f w r c . 20% o t t

atx2 aon't fc*xq*c tb* iAy


fre* *' a ia u r c c c ly

9 **
tfc r-* 6 * ys

W t*

Meghatrozott adatok trlse a DELETE s a WHERE zradk seg tsg v el....................................... 148 Cskkentsd a minimumra a vletlen trls kockzatt! . . 149 A MakeMeElvis.com egy webalkalm azs ..........................154

xii

Tartalom jegyzk

Tartalom jegyzk

Valszeru, gyakorlati alkalmazsok


Nha szembe kell nzned a valsggal, s jra kell gondolnod a terveidet. Vagy mr az elejn gondosabban kell tervezned. Amint az alkalmazsod kikerl a Webre, rjssz majd, hogy nem tervezted m eg elg krltekinten. Amirl azt hitted, hogy m kdni fog, a val vilgban nem elg j. Ebben a fejezetben olyan vals problmkkal foglalkozunk, am elyekbe beletkzhetsz, amikor az alkalm azsodat a tesztgpedrl les krnyezetbe viszed t, kzben pedig jabb fontos PHP- s SQL-kdokat mutatunk.

Elmer egyes vsrli e l g e d e tle n e k ...............................................160 Vdd meg Elmert...Elmertl .......................................................... 163 ftOO M a^M eEtVs.coi
E r r y o u r f c * " a r * . ^ 10

Kvetelj meg helyes rlap ad ato k at!...............................................164 A levlkld rlap ellenrzse mgtti logika ..........................165 Dntshozatal a kdban az IF se g ts g v e l.................................166 Az igazsgot k e r e s v e .........................................................................167 Az IF nem csak az egyenlsget tudja vizsglni ....................... 168

r* Matt V*

rm*l Q f>

Fr.*i

A levlklds ellenrzse mgtti logika ................................... 171 PHP-fggvnyek vltozk e lle n rz s re ..................................... 172 Tbb felttel vizsglata az AND s az OR segtsgvel ............179 Az rlap felhasznljnak visszajelzsre van s z k s g e ............183 Akkor kapd el a PHP-t, ha szksges ........................................193
Mk M Sb - Send txr-.i:

Ma^MeELvrs.coM
Pr*vat*; Fr Fihi*- s
acC

Hasznlj jelzt a tbbszr szerepl kdok e lk e r l s re !......... 194 A HTML-rlap kdjt csak egyszer add m e g !.............................. 195 Egy rlap, amely nm agra h iv a tk o z ik ........................................199 Irnytsd az rlapm veletet a parancsfjlra!.................................200 Ellenrizd, hogy az rlap be lett-e n y jtv a !.................................202 Mg most is vannak m orgold fe lh a s z n l k ............................ 206 A tblk sorainak egyedileg azonosthatnak kell lennik . . . 208 Az elsdleges kulcsok kiknyszertik az egyedisget .............. 210 A jellngyzetektl a v srlazonostkig.................................215 Tmb bejrsa a foreach s e g ts g v e l.......................................... 216 Uw t

ONLY
u*

r ar!^ c

E x o md KJyfe a B - 2C ff! %

....

WCel r*he^

* < - C ftvw tfcy Vty uT n>y

'**9 ? ' <*

MakMtLVf.ecw
a rrf

Dn yBb <tD e n uD* n


O h-m* Vtortitz

) rcm ve . o a
cen

Elt^r Ktpi,# .0 *1 Don O rapfdrsorC*^rtirg<ooper ar.

<= 5

most itt vagy xiii

a tartalom jegyzk

Fjlokban trolt adatok kezelse

5
.uliar War - High Scores Administration
Ktom> %rpma >4

Ne dlj be a felhajtsnak...mrmint ami az adatbzisokat illeti. Tny, hogy kitnen alkalmasak mindenfle szveges adat trolsra, de mi a hely zet a binris adatokkal' Tudod, az olyanokkal, mint a JPEG-kpek s a PDF-dokumentumok? Tnyleg van rtelme az rtkes gitrpenget-gyjtemnyedrl kszlt kpe ket egy adatbzis-tblban trolni? Nos, ltalban nincs. Az ilyesfajta adatokat jel lemzen fjlok troljk, s ott is fogjuk hagyni ket. Mindazonltal van r md, hogy a virtulis kecske is jllakjon, s a virtulis kposzta is megmaradjon - ebben a fejezetben megmutatjuk, hogy a fjlokat s adatbzisokat egytt hasznlva olyan PHPalkalmazsokat pthetsz, amelyek binris adatokkal vannak tele. A virtulis gitrosok szeretnek v e rse n y e z n i.................................224 A kp a bizonytk ...........................................................................225 Az alkalmazsnak trolnia kell a kpeket ................................... 226 A kpfjlok feltltsnek megtervezse a Guitar Wars alk alm azsb an ...........................................................231 A rekordadatbzist mdostani kell az ALTR paranccsal . . . . 232 Hogyan szerezznk kpeket a felhasznlktl?..........................236 A kp fjlnevnek beszrsa az a d a tb z is b a .............................. 238 A feltlttt fjl nevnek k id e rt s e ................................................. 239 Hov tnt a feltlttt fjl?..................................................................244 pts hzat a feltlttt kpfjloknak! ............................................ 248 A kzsen hasznlt adatokat megosztva kell h a s z n ln i............254

t M r V I i .l

M lilknj

^1)114V ct ^ 1 ltDx
OtUJ411**0 ftatpr; 4

1 / -----1 r**

**r? Urta

Guitar W a n kcmot e a liifch Score A > j ** & Ate* de Mi*! >? **> S*. Aw Srpm IW 3**44.^
V w V A I2 T

Megosztott adatok ignylse a require p a ra n c c sa l..................... 255 Gondolj gy a require_once-ra, mint egy beszrsra ............256 A rekordoknl a sorrend a l n y e g ................................................. 258 A legjobb gitrhs elismerse ........................................................ 261 A legmagasabb pontszm formzsa HTML s CSS segtsgvel . 262 Csak a kis kpek en g ed ly ezettek ................................................. 267 Tervezz felgyeleti oldalt! ............................................................... 272
11c w
smih: K li: C. we T

* Yo O ># GujUr Wars - Remove u Hlfth Jkort

a> O

i* "t

Guitar W an - Hi^h Scotch


w r-c . W utvx. Wm i h a *

Top Score: 389740


3**740 'me: J ^ v b ^ r K y w D * r. .M >

A rekordeltvolt hivatkozsok ltrehozsa a felgyeleti oldalon ........................................................................ 275 A parancsfjlok kpesek trsalogni egymssal ..........................276 GET-ek s P O S T -ok...........................................................................278 A GET, a POST s a rekordok e lt v o lt sa ................................... 280 A trlend rekord e lk l n t s e ......................................................283 A trls szablyozsa a LIMIT z ra d k k a l................................... 284

G ui ta r

S c o re

.N lH * 3 (J A i IM .*a4xK24 * lJJ.I*

Hant:

nini

xiv

Tartalomjegyzk

Tartalom jegyzk

Az alkalmazs biztonsgoss ttele

6
Guitar Wars - High Scores Administration
Jacoh Scorctocnon 2008-05-01 20:36:45 389740 Remove Hefcu Che*}' 2008-05-01 20:36:07 282470 Remove Jean Paul Jooes 20WM)5-01 20:3;23 243260 Remove Phi/ Ia ir* o n Pc Jas lurius Nev Johansson Kenny I.avltz 20CS-05-01 20:37:40 1865) & m * fia 2008-05 01 20:37:23 1276J0 &roov 2008-0501 20:37:02 98430 Remove 200*^ * To v>ew this p*ge. Y&- *<*10 lc 3 in 10 Guitar or ov' c - t t

A szleid igazat mondtak: ne llj szba idegenekkel! Vagy legalbbis ne bzz bennk. Ha pedig m inden ktl szakad, akkor se adj nekik kulcsot a z alkalm azsaid adataihoz , abban bzva, hogy nem lnek vissza vele. A vilg kegyetlen, s nem bzhatsz abban, hogy m indenki becsletes. Webalkalmazs-fejlesztknt valjban rszben cinikusnak kell lenned, rszben olyasvalakinek, aki hisz az sszeeskvs-elm letekben. Igen, az em berek tbb sge rossz, s valban rd feni a fogt! Na j, lehet, hogy egy kicsit tloztunk, de nagyon fontos, hogy komolyan vedd a biztonsgot, s az alkalmazsaidat gy ter vezd meg, hogy vdve legyenek brkivel szem ben, aki rtani akar nekik. A nap, amikor m eghalt a z e n e ........................................................ 296 Hov tntek a re k o rd o k ? ................................................................. 297 Kerts a vad hordk e ll e n ............................................................... 299 A Guitar Wars felgyeleti oldalnak vdelm e ............................ 300 A HTTP-hitelests fejlceket ig n y e l............................................ 302 A fejlcek vezrlse a PHP segtsgvel ..................................... 305 Hitelests fejlcekkel ...................................................................... 306 A hitelest parancsfjl ltrehozsa ...............................................314 Guitar Wars - II. rsz: A kinok t m a d s a ................................... 318 Kivons hozzadssal ...................................................................... 319 A biztonsg em bert k v e te l.............................................................320 Az em beri felgyelet megtervezse a Guitar Wars alk alm azsb an .......................................................... 321 Csinlj helyet a jvhagysnak az ALTR se g ts g v e l!............322 A jv nem hagyott rekordok nem s z m ta n a k ..........................327

Bclo* it a lta o f all Guiar Wars high scores. Use thii page to renvc sc<xc> a* needed

H*rr*
Password

, -------------------- (

n Remember thii password hi my k*r<Mr>

C e* f-'tog } an
fcjjtam aztn nem k e re tzt# j ham\6 dokumen tum ok... . rekordok. Alspoe vagyok, s ritkn hibizom.

A milli pontos c s a l s ...................................................................... 330 A m oderls m indent megold? ......................................................331 Pontosan hogyan csinlta?............................................................... 333 A MySQL tverse megjegyzsekkel ............................................ 334 Az Add Score rlap SQL-befecskendezs ldozata lett ............335 Az adatok vdelm e az SQL-befecskendezssel s z e m b e n ......... 336 Egy biztonsgosabb INSERT (p a ra m te re k k e l)..........................337 Az rlapellenrzs soha nem lehet elg in te llig e n s...................339 Tzel szntess! ..................................................................................341

most itt vagy >

xv

a tartalom jegyzk

Szemlyre szabott webalkalmazsok ptse


Senki sem szereti, ha elfelejtik - a webalkalmazsok felhasznli klnsen nem. Ha egy alkalmazs ismeri a tagsg fogalmt, teht a felhasznlk szemlyre sza bottan hasznlhatjk az alkalmazst, akkor az alkalmazsnak emlkeznie kell a fel hasznlkra. Szrny lenne, ha minden alkalommal be kellene mutatkoznunk a csaldunknak, amikor hazarkezve belpnk az ajtn. Erre azrt nincs szksg, mert az em bereket egy csodlatos dolog segti: a memrijuk. A webalkalmazsok azonban nem emlkeznek automatikusan az emberre - egy gyes webfejlesztnek kell a rendelkezsre ll eszkzkkel olyan szemlyre szabhat wrebalkalmazst ksztenie, amely kpes megjegyezni a felhasznlit. Azt mondjk, az ellenttek vonzzk egymst ............................ 346 A Misma teli a szemlyes adatokra tm aszkodik ....................... 347 A Mismatch alkalmazsban bejelentkezsre van szksg . . . . 348 A felhasznli bejelentkezs m e g te rv e z se .................................349 Az adatbzis felksztse a b e je le n tk e z se k re ............................ 351 A bejelentkezsi fellet kialaktsa ..................... ......................... 353
' V _____ ---------------------------------------------------------------- ------------

A jelszavak titkostsa az SHAO se g tsg v el.............................. 354 A jelszavak visszafejtse ................................................................. 355 A felhasznlk hitelestse a HTTP segtsgvel ....................... 358 A felhasznlk belptetse a HTTP-hitelests segtsgvel . . . 361 Feliratkozsi rlap az j felhasznlk szmra . . ..................... 365

Mismatch - W here oppositcs attrart!

To r>cw thJl po*. you M.iTuitb- ^

to lop n 0 a r c

Adj eslyt a felhasznlknak a feliratkozsra! ............................ 370 Nha kell egy sti ............................................................................. 374 Mi van a s tik b e n ? .......................................................... .................. 375 Stgets a PHP segtsgvel ................ ....................................... 376 A bejelentkezs m enetnek jragondolsa .................................379 Stivezrelt b e je le n tk e z s ............................................................... 380 Mozgs a Mismatch a lk a lm a z sb a n ...............................................382

W SiVwcrd m

int ,

Pln.woid.

You ere

r u r jn en b s.

M ixm atch - E d it P r o fik


PcrvKial In/orroitior. MH'.rtfKh
You c rt U 9# ed in jjn e o k l, > M is m a t c h - V i c * P r o f i l t

A kijelentkezs a stik trlst jelenti .......................................... 385 A m unkam enetek nem fggnek az g y f lt l.............................. 389 A m unkam enetek lete s k o r a ......................................................390 A m unkam enet-adatok nyom on k v e t s e ................................... 391 A Mismatch alkalmazs feljtsa m unkam enetekkel .............. 392 Kijelentkezs m unkam enetek segtsgvel .................................393 A m unkam enetekre val ttrs teljess ttele ..........................398 A felhasznlk gy rzik, kvl t g a sa b b ..................................... 404 A m unkam enetek rvid let ek .......................................................406 ...d e a stik rkk ta rth a tn a k !......................................................407 M unkam enetek + stik = A legm aradandbb bejelentkezsi adatok ...................................................................... 409

Flr* oame:
Ijw x n a ia e :

K**r

m*?. Btrthdate: 5Ti.

GcMk r z

C ky:

l Hrrnaov: Ca
First niuni: Johuc O tt! L 4 naic: Ncaki

StM r:
P ic lu rt:

(ieader: Mk Birthdatt:
LotAun: A cn *, GA

2*0
Picttirc:

xvi

Tartalomjegyzk

Tartalom jegyzk

A tbbszr szerepl kdok kikszblse


Nem csak esernyn lehet osztozni. Brmely w ebalkalm azs esetben trvnyszeren tallkozol majd olyan helyzet tel, ahol ugyanaz a kdrszlet tbb helyen is elfordul Ez pedig azon fell, hogy pocskols, mg meg is fjdtja a programkd karbantartsval foglalatoskod szemly fejt - hiszen a kdban elkerlhetetlenl szksg lesz vltoztatsokra, s ezeket a vltoztatsokat tbb klnbz helyen kell majd megejteni. A helyzet megoldsa az, ha a krdses kdrszleteket megosztva egyszeren megsznteted a kd rszletek tbbszri elfordulst. Ms szval, a tbbszr elfordul kdrszt egyet len helyen hagyod meg, s erre az egyetlen msolatra hivatkozol ott, ahol szk sges. A kdrszletek tbbszri elfordulsnak kikszblsvel hatkonyabb, egyszerbben karbantarthat s szilrdabb alkalmazs szletik. Darabokra szedjk a Mismateh alkalmazst ....................... A Mismateh alkalmazs jraptse s a b lo n b l..................... A Mismateh alkalmazs jraptse s a b lo n o k k a l................ A Mismatch-alkalmazs ismt teljes... s a felptse most mr sokkal jo b b ...........................................................................
A fejlc a Mismateh alkal mazs minden oldal tetejn megjelenik, s az alkalma zs nevt, valamint az adott oldal cmt jelenti meg.

421 422 424 426

J
^^startsession.php header, php

A Mismateh alkalmazs minden, az egyes felhasznlkhoz sze mlyre szabott oldaln olyan bejelentkezs-kezel' programkd szksges, amely nyomon kveti a felhasznlkat.

navmenu.php

A lblc a Mismatch alkalma zs minden oldaln megjelenti a szerzi jogi informcit.

A navigcis men kzvetlenl a fejlc al kerl, s a Mismateh alkalmazs minden oldaln egys ges ment jelent meg, amellyel lehetsges a fbb oldalak bejrsa.

Most, hogy oly sok egyb parancsfjl segti, az index.php feladata egyedl a felhasznlk listjnak megjelentse maradt; csak erre kell figyelnie.

most itt vagy xvii

a tartalom jegyzk

Urald az adataidat, s uralni fogod a vilgot!


Semmi sem rhet fel az adatok szi learatsval. Bsges informcik, amelyek csak arra vrnak, hogy megvizsgld, rendezd , sszehasonltsd s kom binld ket, illetve ltalban vve azt csinlj velk, amire csak a kirly w ebalkalm azsodnak szksge van - jl hangzik? Persze. De a va ldi aratshoz hasonlan az adatok kzben tartsa egy MySQL-adatbzisban kem ny m unkt s jelents szakrtelmet ignyel. A w ebes felhasznlk tbbre vgynak rgi, megfradt, unalmas, rdektelen adatoknl. Olyan adatokat akarnak, am e lyek gazdagtjk s elgedett teszik ket...olyan adatokat, amelyek jelentsg gel brnak. Mire vrsz ht? Bgesd fel a MySQL-traktorodat, s m unkra fel! Tkletes ellenttek ........................................................................ 428

A flreprosts az adatokon m l i k ...............................................429


Utalom okt!
c

Adatbzis m odellezse s m v a l......................................................431 Tbb tbla sszedrtozsa .............................................................436 Az idegen kulcsok m kds k z b e n ............................................ 437 Soronknti illeszkeds a t b l k b a n ...............................................438
Szeretem

Horrorfilmek

0
Ellenttpr!

Sidney horrorfilmek irnt rzett utlata e l lenttprt eredmnyez.

Amikor egy sorhoz tbb sor kapcsoldik ................................... 439 Amikor tbb sorhoz tbb sor illeszk ed ik ..................................... 440 A Mismatch-krdv felptse ......................................................445 A vlem nyek bevitele az adatbzisba ........................................446 Egy rlapot adatokkal is v ez re lh e t n k ........................................450 A Mismatch-krdvet tartalmaz rlap ltrehozsa ................ 456 Csinld n o rm lisan !...........................................................................462 Normalizlskor gondolkodj atomokban! ................................... 463 Hrom lps a normalizlt adatbzis fel ................................... 465 A Mismateh adatbzis m d o s t s a ................................................. 469 A Mismateh adatbzis most mr tnyleg normalizlt? .............. 470 Lekrdezsen belli lekrdezsen belli lekrdezs.................. 472 Kapcsoljuk ssze a tblkat! .......................................................... 473 Ksd ssze a pontokat ....................................................................474 A bels sszekapcsols ennl biztosan tbbre is kpes ......... 475

\
Horrorfilmek

ket!

mismatch

u*er

id

Becenevek a tblk s oszlopok szmra ................................... 477 M egmentnk, az sszek ap cso ls................................................... 478 A sikeres flreprosts t l p s e ................................................... 485
m ahM fem op
topic_id
nam t

u sern a m e

paw word
*join_date first n am e lo s L n a m e gender

Felkszls az ellenttprok keressre ..................................... 486 A felhasznlk ellenttessgnek v iz sg la ta ............................ 487 Csak egy FR ciklusra van sz k s g ...............................................488

birthdate city

category

picture

xviii Tartalom jegyzk

Tartalom jegyzk

Karakterlncok kezelse s egyni fggvnyek

A fggvnyekkel jabb szintre emelheted az alkalmazsaidat. A PHP beptett fggvnyeit a korbbiakban is hasznltad klnfle clok elrs re, most pedig m egism erkedhetsz egy valban hasznos fggvnycsalddal. Ha ezen tlestl, m egtanulod, hogyan kszts egyni fggvnyeket, amelyekkel t lpheted a kpzeleted hatrait - ha nem is segtenek a lzercpk kikpzs ben, a kdjaidat m indenkppen ttekinthetbb s egyes rszeit jrahasznosthatv teheted a segtsgkkel.

M unkakeress - csak merszen! ................................................... 502 A keress, ahol nem h ib z h a tu n k ................................................. 504

^ : .. . wskyJ9te- S y e%h
J j s ,

Rugalmasabb SQL-lekrdezsek a LIKE seg tsg v el................ 505 Karakterlncok sztdarabolsa s z a v a k k ..................................... 510 Karakterlncok egyestse az im plodeO fggvnnyel ..............513 A kereskifejezs el feld o lg o zsa................................................. 519 A nem kvnatos kereskarakterek c s e r je ................................... 520 A lekrdezsben valdi kereskifejezsekre van szksg . . . . 524 A nem res elem ek tmsolsa egy j tm bbe ..........................525 Megeshet, hogy a karakterlncnak csak egy rszre van s z k s g .........................................................................................528 Karakterlncok elejnek s vgnek kiolvassa ....................... 529

R l s k f

D a n g e r! Y o u r r e a m jo b I * o u t th e re , O o y o u h a v * th e g u t * to 9 0 fin d H t

R isky J o b s - S earch
Fir.d your riskyjob:
{ Submit '

R is k *

Ju.b

A tallatok tbb lekrdezssel rendezhetk .............................. 532 jrahasznosthat kd - fggvnyekkel ..................................... 536 Lekrdezs felptse egyni fggvnnyel
^
t t f tfccoc 1
!l a w m

I Y o u ' d / w m jo b i% o t Oo * o * rw ve th e g u t s to g o f* \4 t% 7

R is k y J o b s - S e a r c h R e s u lts

Job Te
Custard W ilkct SKiA ltu .e e V c i:i* e C taxW i

.................................537

D ucnaon
We ceed people * i'!;** *vc
* lk on u n e . ic

Ha az IF nem elg - itt a SWITCH! ...............................................542 Rendezs a build_query() fggvnyben ..................................... 545 A keress eredm nye oldalakra b o n th a t ................................... 548 A kvnt sorok kiolvassa a LIMIT se g ts g v e l..........................549 Oldalhivatkozsok meghatrozsa a LIMIT se g ts g v e l......... 550 Az oldalak adatainak nyomon kvetse ..................................... 551 Az oldalakra bontshoz szksges vltozk meghatrozsa . . 552 A lekrdezs m dostsa az oldalakra bontshoz ..................... 553 Az oldalnavigcis hivatkozsok ellltsa
e* v fee*. M l fcJ

AD

vm ailre

R is k !
D tn g o f! Y our joto i s eu e ch f t O o you fcavo th e 1 Io p o iln o u t

R is k y J o b s - S e a r c h R e s u lts
Job Tick

I>C -TipK K ior ** o .

Clam

R is k *
T vpC W tfchU lltc-c
I nxnei .lr D in g or] Your re a rc jo b * o u f the* Do y o u n a v e th e g u t? t o o o Hud if?

Risky Jolw Search Results jot> iid e IXscrfpfcor


^ ***: w w M
ao * itw B p r v x t a i . M um rove M -

.............................. 554 557

A teljes Search parancsfjl ssze lltsa.............................. ..

/V 1 Food TcMCf :o S n t

'*> 4c o m t h v j o n ) n v g o o J o u r p< Now * o u jr rx*p U o<.- >W joci> < L ovely h n r * * t for you* u ifc n , <ape v * v ,c 5 tfcOb. Jkfuu pom M tlc bu*

U ccuk 8l* ftro.ter

, Mank> Tc*k w i , r. e ip e jv * ;
f c p t u * F r m i t e i t o + t t y o u fix . 0 *

<12340.

T V C ity o f Dac*vUe cifw eocec vo* u iU b e rx A

most /fr vagy xix

a tartalom jegyzk

Szablyos kifejezsek
A karakterlnc-kezel fggvnyek szeretetre mltak - a kpessgeik azonban ugyanakkor korltozottak. Persze el tudjk rulni neked egy karakterlnc hosszt, le tudjk vgni a vgt, s bizonyos karaktereket ms karakterekre tudnak cserlni benne. Nha azon ban ki kell szabadulnod a ketreckbl, hogy sszetettebb szvegkezelsi felada tokat hajthass vgre. Ebben segthetnek a szablyos kifejezsek (regular expression), amelyekkel preczen m dosthatsz karakterlncokat, m gpedig nem egyetlen felttel, hanem szablyok halmaza alapjn.

A R iskyjobs oldal lehetv teszi a felhasznlknak az nletrajzuk feltltst ............................................................... 562 Dntsd el, hogy milyen formtum adatokat szeretnl kapni! . . 566 A telefonszm ok mintjnak m eg h a t ro z sa .............................. 569 Mintailleszts szablyos kifejezsek seg tsg v el....................... 570 Mintapts m etakarakterek seg tsg v el..................................... 572 A mintk finomhangolsa karakterosztlyok segtsgvel . . . . 579 Mintakeress a preg_match() seg tsg v el................................... 584 A telefonszmok e g y s g e st se ......................................................591
First Name: Jimm y Last Name: Swift Email: JS@ sim -u-duck.com Phone: 636 4652 Desired Job: Ninja

Szabadulj meg a nemkvnatos k arak terek t l!............................ 592 Az e-mail cmek illesztse nem felttlenl egyszer ................ 596 Tartomnynv-uttagok m in d e n tt...............................................598 A tartomny ellenrzse a PHP s e g ts g v e l.............................. 599 Az e-mail cm rvnyessgnek ellenrzse - sszefoglals . . 600

Hibazenetet kaptam, aztn bertam a teljes telefonszmomat, & llst kaptam nln^izsatntl

First Name: Jimmy Last Name: Swift Email: JS@slm-u-duck.com Phone: (555) 636 4652 Desired Job: Ninja

XX

Tartalomjegyzk

Tartalom jegyzk

Az adatok megjelentse... s mg anna'l is tbb!


. I I | I I | . Mindnyjan tudjuk, hogy micsoda hatalma van egy j lekrdezsnek s egy halom szaftos eredmnynek. A lekrdezsek eredm nye ugyanakkor nem mindig beszl nmagrt. Nha segt, ha az adatokat ms, lthatbb fnyben nzed. A PHP lehetv teszi, hogy egy adatbzis adatait kpi brzolssal jelentsd meg: tortadiagramon, oszlopdiagramon, Venn-diagramon, Rorschach-brn, vagy ahogy akarod. Brmi megteszi, ami segt a felhasznlknak, hogy jobban m egrtsk az alkalm azson tfoly adatok jelen tst. A PHP-alkalmazsoknak azonban nem m inden lnyeges grafikja ered a te adatbzisodbl. Tudtad pldul, hogy dinamikusan ltrehozott kpekkel megakadlyoz hatod az rlapkitlt reklmrobotok mkdst? Guitar Wars jratltve: A gpek l z a d sa ................................. . . 606 Egyetlen beviteli rlap sincs biztonsgban ............................ . . 607 Vlaszd el az em bert a g p t l!................................................... . . 608 Az automatizlst automatizlssal gyzheted l e ................... . . 611 A CAPTCHA-jelsz ellltsa .................................................... . . 613 A CAPTCHA-kp megrajzolsa ................................................. . . 614 A GD knyvtr grafikai fggvnyeinek bels m kdse . . . . .616 A GD knyvtr grafikai fggvnyei - folytats ..................... . . 618 Szvegrajzols adott bettpussal ............................................ . . 620 Vletlenszer CAPTCHA-kp ellltsa ................................. . . 623 Vess vget az rletnek a Guitar Wars alkalmazsban!
G u ita r W ars - Add Y our H igh Score G u itar W a r s . Add Y our His
H a * A tor addin* > w r e h i ^ A ed adfcd to high sew Um w _

. . 625 . . 627

A CAPTCHA hozzadsa az Add Score parancsfjlhoz

2KBXE5Kr s s s r-- II
etc 1 W ps>< c* b\

Az ellenkezs t s z in tje ............................................................... . . 630 Az ellenkezs b r z o l sa ............................................................. . .631 Az oszlopdiagram adatainak t ro l sa ........................................ . .632 Tmbbl t m b b e ........................................................................... . . 636 Az ellenttes vlemnyt kivlt tmk tm bjnek felptse . . 638 Az oszlopdiagram felptsnek m e g te rv e z s e ..................... . . 639 A kategrik megrgsa ............................................................. . . 640 A kategrik sszegzse ............................................................. . . 641

*MK W W tM O W ftM PI.C a Score:

G u ita r W ars Add Your H igh Score


T b*nU fee Id. y o n e w h *

Urc.^*

srf a d d1 *e de 0

Smut: wwwA ncyccnlr<im Sc^r. 9W99W

G d fear

I . H R 1 S c o r e * A d i n i n i s

i Ez novctsgce. Lehetetlen ^ meQ*rumi az &t*ze* b e n y ito tt MdMtot. aminek a naqy rfcze riuieul j ezemt. Azt Mm tudom, mi az m m frc*neyl S
A<tl

Az oszlopdiagram ok a la p ja i........................................................ . . 644 Az oszlopdiagram megrajzolsa s megjelentse ................ . . 647 Kln oszlopdiagram ot m indenkinek!..................................... . . 650 A Mismatch felhasznli cspik az oszlopdiagram okat . . . . . . 653

xM*13 '-M1w iW N 5 JWT* WWW 1 , XM&.ZV.M- {laiW V

jortii. I* 1:4*12 1 A**-' 2aa*/ j ., ; lStt -WyWS*'AW

m ost itt vagy

>

xxi

a tartalom jegyzk

Tartalomsugrzs s webszolgltatsok
A vilg risi, s ezt a te webalkalmazsaid sem hagyhatjk figyelmen kvl. Ami pedig taln m g ennl is fontosabb: nyilvn nem szeretnd, ha a vilg hagyn figyelmen kvl a te webalkalmazsaidat. Az egyik legkitnbb mdja annak, hogy a vilgot a webalkalmazsaidra hangold, ha az adataidat sugrzsra alkalmass teszed, ami azt jelenti, hogy a felhasznlk elfizethetnek a w ebhelyed tartalmra, gy nem kell mindig megltogatniuk a w ebhelyet, ha j inform cikat szeretnnek. Az alkalmazs emellett w ebszolgltatsokon keresztl ms alkalmazsokkal is kapcsolatot tarthat, s msok adatait felhasznlva gazdagabb lm nyt nyjthat a felhasznlknak. O wen mindenkivel tudatni szeretn, hogy mi trtnt Agyarral . . 658 Az idegenekkel kapcsolatos adatok eljuttatsa az emberekhez . . 659 Webes tartalom sugrzsa az RSS seg tsg v el............................ 660 Az RSS valjban X M L...................................................................... 661 Az adatbzistl a h ro lv a s ig .......................................................... 666 Az XML felptsnek kpi brzolsa
-fincL
Altns Abducted Mt

........................................669

WtmtfM M M fc

RSS-hrfolyam dinamikus ellltsa ............................................ 672 Hivatkozs az RSS-hrfolyamra ......................................................676 Egy kp ezer szval f e l r ................................................................. 678

*11; Btff f W kokNj/cn.hA lr 2*** v 12 JMMMJ:** % * ^ A** *ai^ta **** 1*I4M4 rv\M ucM fr \h k 4 M o trtta a :

Webes tartalom lehvsa m so k t l................................................. 680 YouTube-videk s u g r z s a .............................................................681 YouTube-videkrelem kiadsa ................................................... 682 O w en kszen ll, hogy felptsen egy REST-krelm et..............686 A YouTube az XML nyelvn b e s z l ...............................................690 A YouTube XML-vlasznak megfejtse ......................................694 Az XML-videadatok kpi brzolsa .......................................... 695 XML-adatok elrse objektum ok se g ts g v e l............................ 696 Az XML-elemektl a P H P -o b jek tu m o k ig..................................... 697 Az XML-adatok kinyerse objektum ok segtsgvel ................ 698 Nvtr nlkl s o h a ! ...........................................................................699 Egyre tbben ltjk Agyart .............................................................701 A videk elrendezse a m eg jelen tsh ez..................................... 702 A videadatok formzsa a m eg jelen tsh ez.............................. 703

< m it TV/ *4 :*co ^ , ? l * W ) > : K K * Mi. xtoa

xxii Tartalom jegyzk

Tartalom jegyzk

fggelk: maradkok
Ha az eddigieket megrgtad s lenyelted, akkor jhet a desszert. Van m g pr dolog, amit rdem es lehet tudnod. Olyan tmkrl van sz, amiket helytelen lenne kihagynunk, mg akkor is, ha elg pp csak rintennk ket. Szval, mg mieltt letennd a knyvet, fussuk t a PHP-rl s a MySQL-rl sz l albbi rvid, m de tanulsgos nyencsgeket. Biztatsul meggrjk, hogy ha ezt is elolvastad, akkor mr csak pr tovbbi fggelk van... meg a szszedet... esetleg egy-kt hirdets... aztn vge. Komolyan!

#1. A knyv hasznlata a PHP 4-es vltozatval s a m ysql-fggvnyekkel........................................................ 714 #2. Felhasznli jogosultsgok a MySQL-ben ............................ 716 #3. Hibk jelzse a M ySQ L -ben......................................................718 #4. Kivtelkezels P H P -m dra........................................................ 719 #5. O bjektum kzpont PHP .......................................................... 721 #6. A PHP-alkalmazsok biztonsgoss t t e l e ............................ 723 #7. vd meg az alkalmazsodat az idegen parancsfjloktl! . . 725 *8. Mveleti sorrend ........................................................................ 727

#9. Klnbsgek a PHP 5 s a PHP 6 k z tt.............................. 728


#10. Msok PHP-kdjnak h a s z n la ta .......................................... 730

m o s t itt va g y

xxiii

a tartalom jegyzk

fggelk: fejleszti krnyezet kialaktsa


Szksged lesz egy olyan helyre, ahol jstet PHP- s MySQL-ismereteidet kiprblhatod, anlkl, hogy az adataidat kitennd a webes tmadsok veszlynek. Mindig hasznos, ha egy PHP-alkalmazst biztonsgos helyen fejlesztesz s tesz telsz, mieltt elrhetv tennd az egsz vilgon (vilghln). Ez a fggelk se gt bezem elni a webkiszolglt s telepteni a MySQL-t s a PHP-t, vagyis egy biztonsgos sarkot kialaktani, ahol dolgozhatsz s gyakorolhatsz.

Teremts PHP-fejleszti krnyezetet!


Kiszolgl szmtgp

............................................ 732

Milyen opercis rendszered v a n ? ................................................. 732 Van webkiszolgl a gpeden? ......................................................733 Van PHP a gpeden? Melyik vltozat? .......................................... 733 Van MySQL a gpeden? Melyik v lto z a t? ..................................... 734 Kezdd a webkiszolglval! .............................................................735 A PHP teleptse ............................................................................... 736 A MySQL te le p t s e ...........................................................................738 A MySQL teleptsnek lpsei Windows o n .............................. 739 A PHP engedlyezse Mac OS X-en ............................................ 742 A MySQL teleptse Mac OS X -re ................................................... 742 tlls les k rn y e z e tre ....................................................................744 rasd lemezre az adataidat (m eg a tblidat i s ) ! ..........................745 Elkszletek a lemezre rt adatok felh aszn lsra...................745 A lemezre rt adatok thelyezse az les k isz o lg l ra .............. 746 Kapcsolds az les kiszolglhoz ...............................................747

X X V Tartalomjegyzk

Tartalom jegyzk

fggelk: a php bvtse


Igen, nagyszer webalkalmazsokat tudsz rni a PHP s a MySQL segtsgvel, de azrt rzed, hogy nem ennyibl ll a vilg - s igazad is van. Ez a nylfarknyi fgge lk a mysqli bvtmny s a GD grafikusknyvtr-bvtmny teleptst mutatja be. Lteznek tovbbi PHP-bvtmnyek is - vannak ugyanis olyan helyzetek, amikor hasznos, ha elgedetlenkedsz.

A PHP b v t s e .................................................................................. 750 Ha Maced v an ...................................................................................... 753

Oowrtfoad Connector.-PHP
PHP - ttV rtp fo r
cw w hj

Art a mysqli-vltozatot tltsd


to WY80L

le, amelyik a gf>eden PHP-vltozatnak megfelel.

Trgymutat

755
most itt vagy xxv

Hogyan hasznld ezt a knyvet?

Bevezets
Nem hiszem el, hogy ilyesmit t e t t e k egy P H P -M yS Q L knyvbe!

** fir %*?
'/
a

*?!,

" o l e z a knyv

v alja, akt /veteti ash 1. vereti!.


Pfdig nagys/

E* a knyvet brk; e& rf

kte e ht

...

M irt tettek i l y e n t egy PHP-MySUU

xxvii

hogyan hasznld ezt a knyvet?

Kinek szl ez a knyv?


Ha az albbi krdsek m indegyikre igennel felelsz... HTML- vagy XHTML-tapasztalattal rendelkez webfejleszt vagy, aki a weboldalait m agasabb szintre szeretn emelni? ( 2) Tl szeretnl lpni az egyszer HTML oldalakon, hogy megtanuld, megrtsd s megjegyezd, hogyan kszthetsz webalkalmazsokat a PHP s a MySQL segtsgvel?

Jobban szereted az inspirl beszlgetseket vacsora kzben, mint a szraz s unal mas iskolai eladsokat? .akkor ez a knyv neked szl.

Ki tartsa magt tvol ettl a knyvtl?


Ha az albbi krdsek brmelyikre igennel felelsz...

Halvny fogalmad sincs, hogy mit jelentenek az olyan programozsi kifejezsek, mint a vltoz" vagy a ciklus"? (A kulcsfogalmakat persze ebbl a knyvbl is m egtanulhatod, ha mg soha sem programoztl korbban.)

( 3)

Men PHP-webfejleszt vagy, s referenciaknyvet keresel?

Flsz attl, hogy kiprblj valami jat? Inkbb vlasztanl egy gykrkezelst, mint hogy kockshoz cskosat vegyl fel? M eggyzdsed, hogy egy szakknyv nem lehet komoly, ha pldaknt egy olyan adatbzist hozunk benne ltre, amely az idegenek ltal elrabolt szem lyeket tartalmazza?

...akkor ez a knyv nem neked szl.

\h

eladsi osztly megjegyzse; ha van hi

telkrtyd, akkor ez 3 knyv neked s z lj

xxviii Bevezets

Bevezets

Tudjuk, mire gondolsz?


Hogyan lehetne e z egy kom oly PHP-iMySQL knyv? Minek ez a sok kp? Tnyleg lehet gy tanulni ?

Tudjuk, hogyan mkdik az agyad


Az agyad jdonsgra vgyik: mindig a szokatlant keresi-ku tatja, gy pl fel, mert ez segt letben maradni. De mit csinl az agy, ha szokvnyos, mindennapi dolgokkal tall kozik? Nos, brmit, amivel megakadlyozhatja, hogy ezek a dol gok megzavarjk az igazi munkjt - a fontos dolgok rgztst. Az unalmas dolgok elraktrozsra nem pazarolja az energit; ezek nem jutnak t az ez nyilvnvalan nem fontos szrn. De honnan tudja az agyad, hogy mi fontos? Tegyk fel, hogy ki rndulsz, s egyszer csak egy tigris ugrik eld. Mi trtnik a fe jedben s a testedben? Felizzanak az idegsejtek. Felgyorsul a pulzus. Beindulnak a k m iai reakcik. Innen tudja az agyad, hogy...

Ez fontos! Jegyezd meg!


De tegyk fel, hogy otthon vagy egy knyvtrban lsz, biztons gos, meleg, tigrismentes krnyezetben, s egy vizsgra kszlsz, vagy valamilyen bonyolult mszaki tudst prblsz a fejedbe tm ni, amirl a fnkd azt hiszi, hogy egy ht, de legfeljebb tz nap alatt megtanulhat. Csakhogy van egy kis bkken. Az agyad megprbl szvessget tenni neked, s gondoskodik rla, hogy ez a nyilvnvalan nem fontos tartalom ne kssn le drga erforr sokat s trolkapacitst, amelyet igazn fontos dolgokra fordt hatnl. Pldul tigrisekre. Vagy arra, hogy milyen veszlyes a tz. Vagy hogy mi a leggyorsabb mdja annak, hogy eltntesd az rlnyes YouTube-videt a bngszablakbl, amikor jn a fnk. Az agyadnak nem m ondhatod azt egyszeren, hogy H, agy, koszi szpen, de nem szmt, milyen unalmas ez a knyv, s mennyire nem hoz lzba, akkor is m uszj elraktroznod.
frz agya
hoJ<

EZT nem rde

mes eiraWrozm*.

Egy ufs VouTube-vide nyilvnvalan rdekesebb az agyadnak, mint egy szmtgpes szakknyv.---------- >

most itt vagy xxix

hogyan hasznld ezt a knyvet?

Az Agyhulla'irT olvasirl felttelezzk, hogy tanulni szeretnnek


Mi kell ahhoz, hogy m egtanuljunk valamit? Elszr is, meg kell rtennk , aztn meg kell je gyeznnk. A tanuls nem arrl szl, hogy tnyeket tm kdnk a fejnkbe. A kognitv tudom nyok, a neurobiolgia s a tanuls pszicholgija tern folytatott kutatsok legfrissebb eredm nyei szerint tanulni sokkal tbbet jelent annl, mint hogy elolvasunk egy szveget. Mi tudjuk, hogy mi villanyozza fel az agyad.

Az Agyhullm sorozat alapelvei tbbek kztt a kvetkezk:


Vizulis lmnyt nyjtunk. A kpeket sokkal knnyebb megjegyezni, mint a szavakat nm aguk ban, s sokkal hatkonyabb teszik a tanulst (az em lkezet terletn vgzett kutatsok sze rint akr 89% lehet a javuls). A kpek emellett rthetbb is teszik a dolgokat. Ha a szveget velk kapcsolatban ll kpekbe vagy azok mell helyezzk, nem pedig a lap aljra vagy egy msik oldalra, akr a ktszeresre nhet annak a valsznsge, ^ hogy az olvas kpes lesz m egoldani a tartalomhoz kapcsold feladatokat. Htkznapi, szemlyre szabott stlust hasznlunk. A legjabb vizsglatok kimutattk, hogy a tanulk akr 40%-kal jobb eredmnyt rnek el az utlagos teszteken, ha a szveg nem hivatalos stlus, hanem htkznapi nyelven, kzvetlenl hozzjuk szl. rtekezs helyett trtnetekre s laza, trsalgsi stlusra van szksg, s nem szabad tl komolyan venni magunkat. Mikor figyelnk jobban: ha a bartainkkal beszlgetnk, vagy ha eladst hallgatunk?

Hiba! Is m e re tle n je ls z

Az olvast mlyebb gondolkodsra ksztetjk. Ha az agysejtjeinket nem tartjuk edzsben, az agyunk takarkra kapcsol. Az olvast motivlni kell, fel kell kelteni s le kell ktni a figyelmt, valamint sztnzni kell, hogy feladatokat oldjon meg, kvetkeztetseket vonjon le, s j tudst halm ozzon fel. Ehhez kihvsok, gyakorlatok, gondolatbreszt krdsek s olyan feladatok kellenek, am elyeknek a megoldsa mindkt agyflte kt s valamennyi rzkszervet ignybe veszi. Megragadjuk az olvas figyelmt. Mindnyjan ismerjk a tnyleg meg szeretnm ezt tanulni, de az els oldal utn elalszom rzst. Az agyaink csak arra figyel, ami szokat lan, rdekes, klns, feltn vagy vratlan. Egy nehz mszaki tm t boncolgat k n y v n e k sem kell unalm asnak lennie. Az agyunk sokkal gyorsabban tanul, ha nem az. Az rzelmekre hatunk. Mr tudjuk, hogy7az, hogy emlksznk-e valamire, nagyrszt az rzelmi kt dstl fgg. Arra emlksznk, ami fontos neknk, s amit trznk. Persze nem egy kutys kisfi szvfacsar trtnetre kell gondolni, hanem olyan rzelmekre, mint a meglepets, a kvncsisg, a dbbenet (Ht ez meg mi a ...?), vagy arra, amikor jl szrakozunk, vagy amikor gy rezzk, hogy istenkirlyok vagyaink, mert megoldottunk egy feladatot, amibe mindenkinek beletrt a bics kja, megtanultunk valamit, amirl mindenki gy gondolta, hogy nehz, vagy rjttnk, hogy tu dunk valamit, amit n ehhez jobban rtek Bob, a rendszergazda nem.
Kis korrekci. Valjban van egy szvfacsar trtne tnk egy firl, akinek a kutyjt elraboltk az idege nek, s segtennk kell megkeresni.

XXX

Bevezets

Bevezets

Metakognci: gondolkods a gondolkodsrl


Ha tnyleg tanulni szeretnl, m gpedig gyorsabban s alaposabban, figyelj arra, hogy hogyan figyelsz. Gondolkodj el azon, hogy hogyan gondolkodsz. Tanuld meg, hogyan tanulsz. G yerekkorunkban a legtbbnk nem vett leckket m etakogncibl vagy tanulselmletbl. Elvrtk tlnk, hogy tanuljunk, de nem igazn tantottk meg , hogyan kell tanulni.

Vajon hogy tudnm rvenni az agyam, hogy emlkezzen erre a cuccra...?

Mi azonban felttelezzk, hogy ha a kezedben tartod ezt a knyvet, akkor tnyleg meg akarod tanulni, hogyan pthetsz adatbzis-vezrelt w ebhelyeket a PHP s a MySQL segtsgvel - s valsznleg nem akarsz tl sok idt rsznni. Ha hasznt akarod venni annak, ami ebben a knyvben szerepel, emlkezned kell r, hogy mit olvastl, ehhez pedig m eg kell rtened az olvasottakat. Ahhoz, hogy a lehet legtbbet hozd ki ebbl a knyvbl - vagy brmilyen knyvbl, illetve tanrbl - , r kell venned az agyad, hogy erre sszpontostson. A trkk az, hogy az agyadat meg kell gyznd, hogy a m egtanu land anyag Tnyleg Fontos. A jltedhez elengedhetetlen. Olyan fontos, mint egy tigris. M sklnben folyamatosan harcol hatsz az agyaddal, hogy ne kvessen el m indent annak rdekben, hogy a knyv tartalma ne ragadjon meg az em kezetedben.

Hogyan vehetem r az agyamat, hogy a PHP-t s a MySQL-t egyenrangnak tekintse egy hes tigrissel?
Van egy lassabb, fraszt mdszer, s egy gyorsabb, hatkonyabb t is. A lass m dszer lnyege egyszeren az ismtls. Nyilvn tudod, hogy kpes vagy m egta nulni s megjegyezni mg a legunalm asabb anyagot is, ha jra s jra begym sz ld az agyadba. Ha elgszer ismtled, az agyad ezt mondja: Nem rzdik gy, mintha fontos lenne neki, de jra s jra s jra ugyanazt olvassa, gyhogy' biztos az. A cl gyorsabb elrst brmi segtheti, ami nveli az agytevkenysget klnsen ha az agyadat ms-ms m don dolgoztatja meg. Az elz oldalon felsorolt dolgok nagy szerepet jtszanak a megoldsban, s bizonytottan olyasmik, amik segtenek, hogy az agyad neked dolgozzon. A kutatsok azt mutatjk pldul, hogy ha egy szveget egy hozz tartoz kp belsejbe tesznek (nem pedig az oldal ms rszre, pldul egy braalrsba vagy a szvegtrzsbe), az agyad megprblja kitallni, hogy a szavak s a kp miknt kapcsoldnak ssze, ami tbb agysejtet izzt be. Tbb dolgoz agysejt = nagyobb esly az agynak, hogy megrtse, hogy figyelnie s az olvasottakat valsznleg rgztenie kell. A htkznapi nyelv is segt: a legtbb em ber jobban figyel, ha beszlget, mivel a msik el vrja, hogy kvesse, amit m ond, s reagljon r. Az agyad azonban csodlatos m don nem \ felttlenl trdik vele, hogy a beszlgets kzted s egy msik ember, vagy kzted s egy knyv kztt zajlik. Ha az olvasott szveg stlusa ezzel szem ben szraz s hivatalos, az agyad ugyangy rzkeli, mintha egy eladst hallgatnl egy teremnyi passzv hallgat kztt - brenlt nem szksges, kikapcs. A kpek s a trsalgsi stlus azonban csak a kezdet...
m ost itt vagy XXXI

hogyan hasznld ezt a knyvet?

Horrorfilmek

Ezt tettk Ml:


Kpeket hasznltunk, mert az agyad kpekre van hangolva, nem szvegre. Ami az agyat illeti, egy kp valban szz szval felr. Amikor egy szvegrszhez kpek kapcsoldtak, a szveget a kpek belsejbe gyaztuk, mert az agy hatkonyabban mkdik, ha a szveg abban van, amire vonatkozik, nem pedig egy braalrsban vagy elsva az oldal mlyn.
Ugyanazt a dolgot tbbflekppen, klnbz rzkszervekre hat mdon, tbbszr is elismteltk, hogy nveljk az eslyt annak, hogy a tartalom az agyad tbb rszn is rgzljn. A fogalmakat s a kpeket vratlan m don hasznltuk, mert az agy az jdonsgot sze reti, s nm i rzelmi tltetet is vittnk beljk, mert az agy figyel az rzelm ek biokm i jra. Amivel kapcsolatban rzseink vannak, arra valsznbb, hogy em lkezni fo gunk, mg ha csak annyirl is van sz, hogy nevettnk egy j t, meglepdtnk , vagy vala mi felkeltette az rdekldsnket. Szemlyre szabott, trsalgsi stlust hasznltunk, mert az agyad jobban figyel, ha azt hi szi, hogy beszlgetsz, mint ha gy gondolja, hogy passzvan hallgatsz egy eladst. Az agyad akkor is gy mkdik, amikor olvasol Tbb mint 80 gyakorlatot mellkeltnk, mert az agyad hatkonyabban tanul s em l kezik, ha csinlsz valamit, mint ha csak olvasol rla. A feladatokat gy terveztk meg, hogy kihvst jelentsenek, de azrt m egoldhatk legyenek, mert a legtbben az ilyen feladatokat szeretik. A tartalmat tbbfle stlusban tlaltuk, mert vannak, akik a lpsrl lpsre halad ler sokat rszestik elnyben, mg m sok elszr tfog kpet szeretnnek kapni, s olyanok is akadnak, akik csak egy pldt akarnak ltni. Attl fggetlenl azonban, hogy neked mi a kedvenc tanulsi m dszered, m indenkinek a hasznra vlik, ha ugyanazt a tartalmat tbbfle tlalsban ltja.
N e m illenek ssze!

Horrorfilmek

Prbld ki ezt!

Mindkt agyfltekre gondoltunk, mert minl jobban lektjk az agyunkat, annl val sznbb, hogy em lkezni fogunk a tanultakra, s annl hosszabb ideig tudunk ssz pontostani. iMikzben az egyik agyflteke dolgozik, a msik agyflteke gyakran pi henhet, ami meghosszabbtja a hatkony tanuls idtartamt. Trtnetekkel s tbbfle nzpontot bem utat feladatokkal is sznestettk a knyvet, mert az agyad alaposabban tanul, ha arra knyszerl, hogy elem ezzen s rtkeljen. Kihvsok el fogunk lltani, egyrszt a gyakorlatokkal, msrszt olyan krdsekkel amelyekre nincs mindig egyrtelm vlasz, mert az agyad akkor tanul, ha dolgozik. Gondolj csak bele: a testedet nem tudod form ban tartani, ha csak nzed , ahogy m sok gyrnak az edzterem ben. Ugyanakkor m indent elkvettnk, hogy az agyad csak a megfelel dolgokra fordtson energit, s ne kelljen egyetlen agysejtet sem arra ldoznia, hogy megfejtsen egy bonyolult pldt vagy egy slyos, szakzsargonnal teli, szraz szveget.
A trtnetekben, a pldkban s a kpeken emberek szerepelnek, mert te is em ber vagy7 s az agyad tbb figyelmet fordt az emberekre , mint ms dolgokra. ,

Tesztt

mm

xxxii Bevezets

* ,( U . .

B V ' S

Ezt teheted TE, hogy engedelmessgre brd az agyad:


Mi megtettk, ami tlnk telt; a tbbi rajtad ll. Az albbi tippek csak a kezdlkst adjk meg - figyeld az agyad zeneteit, s llaptsd meg, hogy mi az, ami a te esetedben is m kdik, s mi az, ami nem. s prblj ki j dolgokat!

( J ) Lassts! Minl tbbet rtesz meg, annl kevesebbet kell bemagolnod. Ne csak gy olvass. llj meg, s gondolkodj. Ha a knyv feltesz egy krdst, ne ugorj egybl a vlaszra. Kpzeld gy, mintha valaki tnyleg kr dezne tled valamit. Minl jobban rknyszerted az agyad a gondolkodsra, annl nagyobb az es lyed arra, hogy emlkezni fogsz a tanultakra. ( 2 ) Vgezd el a gyakorlatokat s jegyzetelj! A gyakorlatokat nem azrt tettk a knyvbe, hogy el is vgezzk ket helyetted, mert ez olyan len ne, mintha edzskppen valaki mssal vgeztet nd a fellseket. Ne csak n zd a gyakorlatokat, vegyl el egy ceruzt. Rengeteg dolog tanstja, hogy a tanuls kzbeni fizikai tevkenysg nveli a tanuls hatkonysgt. ( 3 ) Olvasd el a Nincsenek hlye krdsek" rszeket! gy rtjk, mindet. Nem kihagyhat lbjegyzetek, hanem a lnyegi tartalom rszei. Ne ugord t ket!

( 6 ) Beszlj rla! Hangosan! A beszd az agy egy msik rszt kapcsolja be. Ha m egrteni prblsz valamit, vagy nvelni sze retnd az eslyt annak, hogy ksbb em lkezz r, m ondd ki hangosan. Mg jobb, ha m egprb lod valakinek elmagyarzni. gy gyorsabban fogsz tanulni, s olyan dolgokat is felfedezhetsz, amik olvass kzben fel sem tntek. ^ Figyeld az agyad! gyelj r, hogy ne terheld tl az agyad. Ha azt ve szed szre, hogy- csak felsznesen futod t a sz veget, vagy elfelejted, amit p p en most olvastl, ideje pihent tartanod. Egy bizonyos ponton tl mr nem tanulsz meg tbbet, ha mg tbb infor mcit laptolsz a fejedbe, st a hats akr ellen ttes is lehet.

( ) rezz! Az agyadnak tudnia kell, hogy amit tanulsz, az fontos. Merlj el a trtnetekben. Gyrts sajt kpalrsokat a fotkhoz. Egy gyenge viccen ki akadni mg mindig jobb, mint semmit sem rezni. ( g ) rj sok kdot! A programozst csak egyflekppen lehet megta nulni: sok kdolssal - s ebben a knyvben pon tosan ezt fogod tenni. A kdols egy kszsg, amit csak gy lehet elsajttani, ha gyakoroljuk. Sok gyakorlsi lehetsged lesz: minden fejezethez tartoznak m egoldand feladatok. Ne ugord t ket, mert a legtbbet ppen a feladatok m egol dsbl tanulhatsz. A gyakorlatok megoldst ugyancsak mellkeltk - nyugodtan less, ha elakad nl (mindig akadhat valami aprsg, amin nem tudsz tlendlni), de eltte m indenkppen prbl kozz valamilyen megoldssal, s felttlenl tedd m kdkpess, mieltt folytatnd a knyvet.

Lefekvs - vagy leg albbis a eltt ez a knyv legyen az utols amit olvasol! legkevsb megterhel dolog - ,
Az agyad az utn is tanul, hogy leteszed a kny vet (pldul ekkor tlti be a tanultakat a hossz tv memriba). Az agynak a feldolgozshoz idre van szksge. Ha a feldolgozsra sznt id ben valami mst is az agyadba tmsz, az ppen m egtanult anyag egy rsze kihullik a fejedbl.

Igyl sok vizet! Az agyad akkor mkdik a legjobban, ha folya dkban lubickol. A kiszrads (ami jval azeltt bekvetkezhet, hogy szomjas lennl), cskkenti a felfogkpessget.

A PH P s a MySQL segtsgvel vals webalkalmaza'sokat kszthetsz. Ne felejtsd el feltlteni s egy igazi webkiszolgln kiprblni lcet.

m o st itt vagy xxxiii

hogyan hasznld ezt a knyvet?

Fontos!
Ezt a knyvet nem referenciaknyvnek szntuk, hanem arra, hogy tanulj belle. Sznd kosan kigyomlltunk belle mindent, ami neheztheti a tanulst a ktet adott pontjn. Amikor pedig elszr olvasod a knyvet, az elejn kell kezdened, mert a fejezetek egy msra plnek, vagyis felttelezzk, hogy a korbban olvasottakat megtanultad.

Elszr az egyszer programozsi fogalmakat s az adatbzis-kapcsolatok alapjait ta ntjuk meg, ezt kvetik a bonyolultabb PHP-fggvnyek s MySQL-utastsok, vgl pedig az sszett alkalmazsokhoz kapcsold tudnivalk.
Br a lnyeg az, hogy olyan alkalmazsokat hozz ltre, amelyek lehetv teszik a felhasz nlknak, hogy a w ebes program on keresztl adatokat vigyenek be s olvassanak ki, mie ltt ezt m egtehetnd, meg kell rtened a PHP s a MySQL nyelvtant. Ezrt elszr olyan PHP- s MySQL-utastsokat m utatunk be, amelyeket magad is kiprblhatsz. gy rgtn kezdhetsz is valamit a PHP-vel s a MySQL-lel, hogy az alkots izgalomba hozzon, a knyv ksbbi rszben pedig megismertetnk az ajnlott alkalmazs- s adatbzis-ter vezsi eljrsokkal. Addigra biztos tudssal fogsz rendelkezni a szksges nyelvtanrl, s az eljrsok, megtanulsra sszpontosthatsz.

Nem mutatjuk be a PHP s a MySQL minden utastst, fggvnyt s kulcsszavt.


A knyvben ismertethettk volna a PHP s a MySQL m inden utastst, fggvnyt s kulcsszavt, de gy gondoltuk, jobban rlnl egy knnyebben kzbe vehet ktetnek, amelybl a legfontosabb utastsokat, fggvnyeket s kulcsszavakat tanulhatod meg azokat, am elyekre tnyleg m indenkppen szksged lesz, s am elyeket az id 95 szzal kban hasznlni fogsz. Ha elolvastad a knyvet, mr m agabiztosan utnanzhetsz, hogy milyen egyb fggvnyeket kell hasznlnod ahhoz, hogy befejezd az ppen megrt tuti al kalmazsodat.
_

A knyv a PHP 5-re s a MySQL 5.0-ra tmaszkodik.

~ ~

A knyvben tanultakat a kdok apr mdostsval a PHP 4-ben is kiprblhatod. Ebben az I. fggelk 1. pontja igazt el.

Mivel sokan mg mindig a PHP 4-es vagy 5-s vltozatt hasznljk, igyekeztnk kerlni a PHP 4-re, 5-re s 6-ra jellemz kdokat. A tanulshoz a PHP 5 vagy 6, illetve a MySQL 5 vagy 6 hasznlatt javasoljuk. A knyv rsakor a PHP 5-t s a MySQL 5-t tartottuk szem eltt, m ikzben gyeltnk r, hogy a kdok a ksbbi kiadsoknak is megfeleljenek.

Szksged lesz egy webkiszolglra, amely ismeri a PHP-t.


A PHP-t egy w ebkiszolgln keresztl kell futtatni ahhoz, hogy helyesen mkdjn. Teht szksged lesz egy olyan webkiszolglra, mint az Apache, amelyet teleptened kell a sa jt szm tgpedre vagy egy ltalad legalbb rszben elrhet gpre, hogy MySQLparancsokat adhass ki az adatok kezelshez. A Pl IP s a MySQL teleptsnek s bvt snek mdjrl a II. s III. fggelk ad bvebb felvilgostst.

xxxiv Bevezets

Bevezets

Mi a MySQL nyelvet hasznljuk.


Az SQL nyelvnek ltezik szabvnyos vltozata is (Standard SQL), de mi ebben a knyvben a MySQL vltozatot vesszk alapul. A knyvben szerepl kdok nhny aprbb nyelvtani vltoztatssal hasznlhatk Oracle, MS SQL Server, PostgreSQL, DB2 s mg jnhny ms relcis adatbzis-kezel (RDBMS, Relational D atabase M anagement System) rendszeren is. Ha az emltett RDBMS-ek valamelyikt szeretnd hasznlni, nzz utna, hogy milyen PHP-fggvnyeket s -utastsformkat kell hasznlnod. Ha m inden parancs m inden utas tsformjt sorra vettk volna a ktetben, a knyv sokkal tbb oldalbl llt volna, mi vi szont szeretjk a fkat, ezrt a MySQL-re sszpontostottunk.

A gyakorlatok ktelezek.
A gyakorlatok nem tekintendk elhagyhat kiegszt anyagnak: hozztartoznak a knyv l nyeghez. Egyes feladatok a memrit edzik, msok az anyag mlyebb megrtst clozzk, s vannak olyanok is, amelyek a tanultak alkalmazsban segtenek. Ne ugord t a gyakor latokat! A keresztrejtvnyek az egyetlenek, amiket nem m uszj megcsinlnod, de ezek is j alkalmat adnak az agyadnak arra, hogy a tanult szavakat s kifejezseket ms krnyezetben is kpes legyen felidzni.

Az ismtls szndkos s lnyeges.


Az egyik legfontosabb dolog, am iben az Agyhullm sorozat ktetei klnbznek ms tan knyvektl, hogy mi azt szeretnnk, ha tnyleg megrtend a tanultakat, s az utn is em lkeznl rjuk, hogy befejezted a knyvet. A legtbb kziknyv nem arra val, hogy m eg tanuljuk, ami benne van, ezt a ktetet azonban tanulsra szntuk, ezrt egyes fogalmakat tbbszr is tismtlnk.

A pldk a lehet legkarcsbbak.


Az olvask gyakran panaszkodnak, hogy bosszant 200 sornyi kdon tevicklnik, m ikzben azt a kt sort keresik, amit meg kell rtenik. Ebben a knyvben a pldkat a lehet legrvidebb krnyez kdba gyaztuk, hogy a megjegyzen d rsz vilgos s egyszer maradjon. Senki se vrja, hogy7m inden plda masszv vagy teljes legyen - kifejezetten a tanulst szolgljk, vagyis nem feltt lenl m kdkpesek nm agukban. A pldakdokat s -alkalmazsokat megtallhatod a Weben, ahonnan lem solhatod s be illesztheted ket egy szvegszerkesztbe vagy MySQL-terminlba, illetve feltltheted a sa jt webkiszolgldra, hogy kiprbld, hogy m kdnek. A cm: http://www.headfirstlabs.com/books/hfphp/.
A pldk kzl tbb is teljes rtk webalkalmazs, amely elg komoly dolgokra kpes.

Az Agytorna gyakorlatokhoz nem tartoznak megoldsok.


Ezeknek a gyakorlatoknak az esetben elfordul, hogy nincs helyes megolds, de vannak kztk olyanok is, am elyeknek az a clja, hogy te dntsd el, hogy helyesek-e a vlaszaid. Egyes gyakorlatoknl tippeket adtunk, amelyek a helyes irnyba terelhetnek.

m o s t itt vagy x x x v

hogyan hasznld ezt a knyvet?

A szakmai lektorok csapata


Jcvcmc Alln Dvid Bviaas MII ttavris Slepham e Liese
S-tcve Milarvo

tta rv e y <$uar*en Szakmai lektorok: Jereme Alln. Tapasztalt webfejleszt, aki otthonos a cscstechnolgis webalkalmazsok ksztse tern is, s tbb mint kilenc ve hasznlja a PHP-t, a MySQL-t, a klnfle keretrendszereket, opercis rendszereket, programozsi nyelveket s fejlesztprogramokat.

C h m K ,;ic U

Dvid Briggs. Szakknyvr s szoftverhonost m rnk az angliai Birminghambl. Ha nem azzal foglalatosko dik, hogy tmutatst adjon a felhasznlknak egy k lnsen rzs szoftver hasznlathoz, semmit sem ked Steve Milano. Amikor ppen nem kdot krml a The vel jobban, mint stlni a helyi parkban a felesgvel, Day Job szmra, vagy punk-rock zenekarval, Paulette-tel s a csald kutyjval, Cleval. az O nion Flavored Ringsszel jtszik egy szellzs nl kli pincben, valsznleg otthon l a laptopjval, W ill Harris. A PASS (Professional Association fr SQL nem szmtva macskatrst, Ralphot, s emberi prjt, Server) Las Vegas-i szrnynak alelnke, akinek a ve zetse alatt ll informatikai osztly 4 kontinens 11 vl Bianct.
lalatnak nyjt szolgltatsokat. jszaka bepattan egy telefonflkbe, belebjik Web 2.0-s ruhjba, s a MySQL, valamint a Rails segtsgvel tmogatja a Pow ered By Geek tervezit s programfejlesztit, hogy az adatelrsi felleteik rugalmasak, hordozha tk, karbantarthatok s GYORSAK legyenek. Az idejt emellett felesgvel, Heatherrel, csodlatos gyerm eke ikkel, Marval s Ellie-vel, s a kutyjval, Swiperrel szereti tlteni.

Harvey Quamen. Harvey a szmtgp-programozi karri erjt adta fel a tanri lt elegns, lesifotsokkal teli, iri gyelt vilgrt. Jelenleg adjunktusknt oktat angolt s hu mn informatikt az albertai egyetemen, ahol a kiberkultrrl, a 20. szzadi irodalomrl s a webfejlesztsrl - belertve a PHP-t s a MySQL-t - tart kurzusokat. Chris Shiflett. Vezet technikus az OmniTI-nl, ahol a w ebalkalm azsok gyakorlati biztonsgval foglalko zik s webfejlesztsi projekteket irnyt. Chris a PHPvel s a webalkalm azsok biztonsgval foglalkoz k zssgek egyik szellemi vezre, akinek a w ebnapljt sokan olvassk a shiflett.org-on. Vilgszerte npszer eladja az ipargi konferenciknak, alaptja a PHP Security Consortium-nak, s olyan knyvek szerzje, mint az Essential PHP Security (O Reilly) vagy a HTTP Developer Handbook (Sams). s

Stephanie Liese. Szakoktat s webfejleszt a kaliforniai Sacramentbl. Amikor nem a szabvny kvet kdok elnyeit ecseteli, vagy egy CSS-elrendezs hibit vizs latja, jgagyakorlatokkal izzasztja magt.
o

xxxvi Bevezets

Bevezets

Ksznetnyilvnts
Szerkesztink:
Ezer ksznet Brett McLaughlinnak az elkpeszt kpes forgatknyvrt, ami a helyes irnyba terelt minket, s a kognitv tanuls irnti krlelhetetlen elktelezettsgrt. Ez a knyv nem kszlhetett volna el Sanders Kleinfeld hsies er fesztsei, trelm e s kitartsa nlkl. Neki mindig sikerlt elkapnia a labdt (vagy p p en macskt - mikor mivel zsonglrkdtnk), ha vgl leejtettnk egyet (vagy hrmat), s ezrt nagyon hlsak vagyunk. Remljk, hogy nhny napig lgathatja a lbt, mieltt egy ehhez hasonlan nehz feladatot kapna.

B veit MdLaugMi*

Az O'Reilly csapata:
Ksznet jr Lou Barrnak a fenomenlis oldalterve krt, am inek ksznheten kpileg ilyen izgalmas knyv szlethetett. Hlsak vagyunk Brittany Smith-nek is az utols pilla natokban vgzett kem ny munkjrt, valamint Caitrin McCullogh-nak, a ki m kdsre brta a pldaw ebhelyeket, s Laurie Petryckinek, aki hitt benne, hogy egy jabb nagyszer Agyhullm-ktet fog kikerlni a keznk kzl.

Sattders We'meld

Lou Ba

Tovbb:
Vgl, nagy-nagy ksznet jr Elvis Wilsonnak, aki sszerakta a 12. fejezet rlnyes YouTube-videjt. Nagyszer m unkt vgzett - klnsen ha figyelembe vesszk, hogy csak egy mezei, barlanglak mvszeti vezet.

m o st itt vagy XXXVi

hogyan hasznld ezt a knyvet?

Safari Books Online


Bo^u oniine kedvenc szakknyved bortjn felfedezed a Safari* ikont, az arra utal, hogy a knyv elrhet az O'Reilly Network Safari Bookshelf nev elektronikus knyvtrban. A Safari az e-knyveknl sznvonalasabb szolgltats: olyan virtulis knyvtr, am elyben tbb ezer kivl, mszaki tmj knyvben kereshetsz, sszeollzhatod a pldakdokat, letltheted az egyes fejezeteket, s ha a legfrissebb, legpreczebb informcira van szksged, ham ar vlaszt kaphatsz a krdseidre. A szolgl tats ingyenesen kiprblhat a http://safari.oreilly.com cmen.

XXXV iii Bevezets

Keltsd letre a statikus oldalakat!

l!
Na, m o s t m ondja, hogy u n a lm a s v a g y o k ...

w\ $

Nagyszer weboldalakat ksztesz a HTML s egy csipet CSS segtsgvel, de rjttl, hogy a ltogatid az oldalak passzv nzegetsre vannak krhoztatva. A kommunikci egyirny, s ezen vltoztatni szeretnl. Elszr is tudni szeretnd, hogy mire gondol a kznsged. Ehhez azonban lehetv kell tenned, hogy a felhasznlk informci kat adjanak meg egy w ebes rlapon keresztl, hozz kell jutnod ezekhez az informcik hoz, majd fel kell tudnod dolgozni azokat. Nos, gy tnik, hogy a HTML-nl tbbre lesz szksged ahhoz, hogy a w ebhelyedet m agasabb szintre emeld.

ez egy j fejezet

nha a HTML nmagban nem elg

A HTML statikus s unalmas


Annyit mr tudunk, hogy a HTML kivlan alkalmas w eboldalak ksztsre. De mi a helyzet akkor, ha olyan w eboldalakat szeretnl, amelyek csinlnak is valamit? Tegyk fel, hogy' egy adatbzisban kell keresned, vagy e-mailt szeret nl kldeni - hogyan teheted meg? A HTML m eglehetsen lettelen nyelv o r lvn itt mr kudarcot vall, hiszen csak olyan informcik megjelentsre terveztk, amelyek soha nem vltoznak.
A HTML klassz, ha csak meg

W
// / m ^

szeretnl osztani egy kpet

--------- az ebedrl, de ha a webhelyed ltogatival interaktv kapcsolatt akarsz kialaktani, mar nem olyan kirly* Ezek az emberek vlaszt vrnak!

Ezeknek az oldalaknak a HTML-kdjt a fejleszt hatrozza meg, amikor megrja kt. A statikus HTML-oldalak csak akkor vl toznak meg, ha a fejleszt mdostja a -html f ilt, s fe lt lti a webkiszolglra

Webkiszolgl

Az gyfl webbngszje

webkiszolgl a sta tikus HTML-oldalakat csak egyesvel tudja szolgltatni.

Az lettelen HTML-lel kapcsolatos gondok nagy rsze a webkiszolgltl ered, mivel a kiszolgl unott kzbestknt viselkedik: a bngsz kr egy oldalt, a kiszolgl tadja neki a HTML-kdot, itt a vge, fuss el vle. Ahhoz, hogy egy wrebhely interaktv webalkalmazss vltozhasson, a webkiszolglnak j, dinam ikusabb szerepet kell betltenie - ezt pedig a PHP teszi lehetv.

weboldalakhoz a kiszolgl statikus HTML-kdot szol gltat, ami csak tartalom megjelentsre alkalmas.

7. fejezet

Keltsd letre a statikus oldalakat!

* k a 'l< * S t a j !

A PHP letre kelti a weboldalakat


A PHP lehetv teszi, hogy egy w eboldal tartalmt a kiszolgln mdostsuk, mieltt az oldal a bngszprogram hoz kerlne. A dolog gy mkdik, hogy a kiszolgln egy PHP-parancsfjl fut, amely igny szerint lltja el vagy mdostja a HTML-kdot. A HTML-oldalt ugyanakkor tovbbra is a bngsznek kell elkldeni, amely nem tudja (s nem is rdekli), hogy a kiszolgln a PHP segtsgvel mdostottk a HTML-t.

A PHP seqtsqvel * *
g W ebkSZOl{)l dnlT lkuS3l1 i .. i , .__ ITlfiflfit kZDSfl kfip 6 $ 6 l0 llf ~ . i It m i |J I I *3111 H I llL ~ 0ldn3k< n

Ezeknek az oldalaknak a HTMLkdjt egy PHP-program lltja el, ezrt dinamikusan, A bngsz tovbbra is szok vnyos HTML-oldalakat kap, de a kdot a PHP lltja el dinamikusan a kiszolgln. a webalkalmazas ignyei szerint vltozhatnak. A PHP-parancsfjlokat 3 webki^ l 9l trolja s fu t-

r t ' , 3? eredmn^ M g
H L -o ld a lk n t kldi el

a bngsznek.

Webkiszolgl

Webbngsz

A dinamikus HTML-oldalak a PHP-parancsfjlok programlogikjnak megfelelen vltoz nak, ami hihetetlenl rugal mass teszi ket.

! P H P -fro9ramas,!,!ka 15

j ,

n*

hogy m it kell tenni a HTML-lel.

A PHP egy adatbzisban trolja sonnan olvassa ki az adatokat, ame

MySQL-adatbzis

lyeket bept az el llto tt HTMLkdba.

most itt vagy

Kutyk az rben
Bemutatjuk Owent. aki elvesztette a kutyjt, Fang-et (vagyis Agyart). Az eb megtallshoz azonban nem elg a krnyken kutatni, ugyanis Agyart idegenek raboltk el, ezrt O w ennek ki kell terjesztenie a keresst az egsz galaxisra. Owen konyt vala melyest a HTML-liez s a CSS-hez, s gy vli, hogy egy weboldal. amelyen lehetv teszi msoknak, hogy megosszk vele a sa jt elrablsi lmnyeiket, segthet a kutatsban. Ahhoz azonban, hogy (j sok) informcihoz jusson, Owennek egy w ebes rlapra lesz szksge, amelyet a ltogatk kilkhetnek s eljuttathatnak hozz. Gyerekjtk - a IITML-ben egy csom olyan elem van, amivel ssze lehet tni egy w ebes rlapot.

Nem l tta ezt a kutyt?

Keltsd letre a statikus oldalakat!

Owen rlappal nyomoz


O w en j webhelynek, az AliensAbductedMe.com-nak (ElraboltakAzIdegenek.com") az a clja, hogy kapcsolatot teremtsen Owen s azok kztt, akiket szintn elraboltak az idegenek, s tudhatnak valamit Agyar eltnsrl. O wen tudja, hogy a ltogatitl egy HTML-rlap segtsgvel krdezheti meg az elrablsuk trtnett, s valamikpp ki kell dertenie, hogy a csillagkzi utazsuk sorn nem futottak-e ssze Agyarral. Ebben viszont a te segtsgedre lesz szksge. Valami ilyesmit szeretne az rlapon: ^
P> O O
Aliens Abducted Me -

Elraboltak az id e g e n e k - e je le n t a p
Ossza meg velem az Idegenekkel kapcsolatom lmnyeit: keresztnv: Vezetknv: Mi az n e-mail cme? Mikor trtnt az elrabls? Mennyi ideig volt tvol? Hny Idegent lto tt? rja le az Idegeneket: M it tettek nnel? Nem ltta a kutymat. Agyart? Igen/Nem Szeretne mg hozzfzni valamit?
s vgl egy gomb:

Aliens Abducted Me - Report an Abduction


Share your story of alien abduction:

Elrabls b e je \ e n t e e

First name: Last name: What is your email address When did it happen? How long were you gone? How many did you see?
Describe them:

Ide rhatja be a ltogat az e-m ail cmt.

Owen fizikai lerst sze retne az idegenekrl.

What did they do to you? Have you seen my dog Fang?

Owen remli, Hogy erre valaki igennel felel majd, teht ltta Agyart az idegenek rhajjn.

Ide tovbbi megjegyzse ket lehet rni.

Owen egy e-m ailt szeretne kapni, amikor a ltogat kitlttte az rlapot.

Mi a vlemnyed Owen rlapjrl?


Ez az rlap tiszta, 1 0 0 % -o s , els osztly HTML!

Milyen problm kba tkzhet O w en, ha a fenti rlappal prbl adatokat szerezni az idegenek tevkenysgrl? Ide lerhatod, ami az eszedbe jut:

m ost itt vagy

Owen rlapjnak HTML-kdja

Az rlapok HTML-bol llnak

kapcsolatban fel kell frisstened n emlkezetedet, olvasd el pldul O wen Elraboltak az idegenek bejelent rlapja teljes egszben HTML-elemekbl s a p,rst H L with CSS & TM -tulajdonsgokbl ll. A legtbb krdshez egysoros szvegmezk tartoznak, a tovbbi X TM 14. fejezett, H L

megjegyzsekhez egy tbbsoros szvegmez, ahhoz a krdshez pedig, hogy lttk-e Agyart, kt vlasztgomb. Az rlap a bevitt adatokat O w en e-mail cmre kldi el.
A mailto" egy protokoll, amely lehetv teszi, hogy az rlapadatokat e-mailben kldjk el. Az rlap tartalma't Owen erre az e-mail cmre s - kldeti el magnak. Ha ki akarod prblni az rlapot, rd Owen cmnek helyre a tidet.

'N

<p>Share your story of alien abduction:</p>

/ ,, H .. . ..

<form method="post" action="mailto:owen0aJLiensabductediDe.com"> <input type="text" id=,firstnaIne, name="firstname" / x b r /> , , <label for="lastname">Last name:</label>

--------------------- ._________________ ___________________________________ c 2 a2 ^ k mondta meg a kiszolgalonak, hogy

clabel for="firstname">First name:c / l a b e l > " --

milyen formban kell elkldeni az adatokat. ^ erik , p o s t " v a g y ,get" lehet; a klnbs-

k s b magyarzzuk el. b

<input type="text" id="lastname" name=" last name" / x b r /> <label for="email">'What is your email address?</label> Az < input> elemek jelzik az rlapnak, cinputf~type="text" id="email" name="email" /xbr /> H v bevitt informcikra kell szmtania. <label for="whenithappened">VJhen did it happen?</label> <input type="text" id="whenithappened" name="whenithappened" /xbr /> <label for="howlong">How long were you gone?</label> <input type="text" id="howlong" name="howlong" / x b r /> <label for= "howmany">How many did you see?</label> ^ tyPe tulajdonsg itt 3zt jelzi a urlapmvez <input type= text" id= howmany
~

name= howmany

/ x b r />

77

ltnek, hogy szveges adatot kell vrnia.

3 7

<label for="aliendescription">Describe them:</label> cinput type="text" id="aliendescription" name="aliendescription" size="32" /xbr /> clabel for="whattheydid">VJhat did they do to you?</label> <input type="text" id="whattheydid" name="whattheydid" size="32" / x b r /> clabel for=fangspotted">Have you seen my dog Fang?</label> Yes <input id="fangspotted" name="fangspotted" type="radio" value="yes" /> No cinput id="fangspotted" name="fangspotted" type="radio" value="no" /xbr /> <img src="fang.jpg" width="100" height="175" alt="My abducted dog Fang." /xbr /> clabel for="other">Anything else you want to add?c/label> ctextarea id="other" name="other">c/textarea>cbr /> cinput type="submit" value="Report Abduction" name="submit" /> c/form> ^
Az rlapot nyit s zr < fo rm > elemek zrjk kzre.

IV
)
j

\
^ A submit gomb utastja az rlapot az rlapmvelet vgrehajtsra,

Nincs meglepets - az rlap tiszta, 100%-os HTML-kd!

7. fejezet

Keltsd letre a statikus oldalakat!

Tesztt
Prbld ki az Elraboltak az idegenek" rlapot!
Tltsd le a Report an Abduction (Elraboltak az idegenek) w eboldalt a Head First Labs w ebhelyrl, a www.headfirstlabs.com/books/hfphp cmrl. Az oldal a chapterOl knyvtrban tallhat. Itt O wen w ebes rlapja (report.html) mellett egy stluslapot (style.css) is tallsz, valamint egy kpet Agyarrl (fang. jpg). Nyisd meg a r e p o r t . htm l oldalt egy sima szveg szerkesztsre alkalmas szvegszerkesztben, s mdostsd O w en e-mail cmt a sajtodra. Ez utn nyisd meg az oldalt egy w ebbngszben, adj meg nhny elrablsi adatot az rlapon, s kattints a Report Abduction gombra.
r e p o r t .h t m l fe n g .jp g

Az rlap benyjtsa az adatok

Aliens Abducted Me - Report an Abduction


Share your story of alien abduction: First name: Last name*. W hat b your email address? When did it happen? How Ioiir were you gone? How many did you see? Describe them: What did they do to you? Have you wen my dOR Fane?
tittc yree"

elkldst eredmnyezi e -m a ilb e n ... majdnem.

A HTM L-rlap nem tudja, hogyan kell e-m ailt kldeni, ezrt ezt a feladatot a felhasznl sajt levelezprogramjra bzza.

Alt

ajf*t*<ryrilig<e*p com

m n .o
7**cd me bovT u ro

Yes O N o 0

Ptca*c vete for me.

Anything else_you warn to add'


{ Report A bduato^'

Owen nem kapja meg az urlapadatokat, hacsak a felhasznl nem kldi el sajt kezleg ezt a bizarr klsej levelet.

M it gondolsz? Megrkezett az rlapadatokat tartalmaz e-mail a leveleslddba?

m ost itt vagy

m ailto - rossz tlet

A HTML-rlappal gondok vannak


O wen Elraboltak az idegenek rlapja kszen van s m kdkpes, de a felhasznlktl nem rkeznek informcik. Agyar elrablsa valban ennyi re elszigetelt esem ny lenne? Vagy az rlappal van valami gond? Lssuk, mit gondolnak a felhasznlk:

A T rg y mezben va la m i ily e s m it l tta m : ?When=&Where=. K ic s it s s z e z a v a ro d ta m .

S em m i sem t r t n ik , m e rt a w ebbngsztnnek nincs alaprtelm ezett e-mail gyflprogramja... a k rm i is legyen az.

0 w W, p j , , amij
o

? H k tn a a tt, 3 wefefcey ltogatit.

i folyik itt? Van valamilyen tleted, hogy miknt lehetne kijavtani az rlapot?

7 fejezet .

Keltsd letre a statikus oldalakat!

Igen. A HTML-rlapkd rendben van, de a mailto nem alkalmas az rlapadatok elkldsre.


O w en rlapja addig tkletesen megfelel, amg a felhasznl a Report Abduction gombra nem kattint. Ekkor azonban a mailto -n ak kell az rlapadatokat egy levlbe csomagolnia, s a levl elkldsre nem kerl sor automatikusan - azt a felhasznl szmtgpn, az alaprtelmezett levelezprogramban kell ltrehozni. ...Az igazi h tult pedig az, hogy a felhasznlnak magnak kell elkldenie az e-mailt ahhoz, hogy az adatok a rendeltetsi helykre jussanak! Az e-mail elkldse felett teht nincs ha talmunk: az adatok vagy eljutnak sikeresen a w ebes rlaprl a bngszn s a leve lezprogramon keresztl hozznk, vagy nem - mrpedig ez gy nem lesz j. Valahogy teht tudnod kell irnytani a w ebes rlap elkldst. Egszen pontosan a PHP-re lesz szksged ahhoz, hogy az rlapadatokat egy e-mailbe csomagold, s biztostsd a levl elkldst. Ehhez pedig a figyelmedet az gyflrl (HTML, mailto stb.) a kiszolglra (PHP) kell fordtanod.

im fw m a

i_ _

AHem Abducted M e - R eport an A bduco

i Jtvr nanic:

Wta tejtxir ctfufl addrc*? itnf d boppeo?

t>*ra clh B c :

H ouavrfki ,w^ , o*
W v ,
Y<* L S o r j

How Ion* wre

"Tun did ihej dn to you?

Az rlap csods - amg a Report Abduction gombra nem kattintasz, amikor is minden trldik!

Havcjmj

t you

m ost itt vagy

gyfloldal s klszolgloldal

A HTML az GYFLEN mkdik


O w en rlapja tiszta HTML-kdot tartalmaz, am elyben egy mailto r lapm velet ksrli meg e-m ailben elkldeni az rlapadatokat. Br a report .html weboldal egy webkiszolglrl szrmazik, a kitltse s a feldolgozsa teljes egszben a felhasznl w ebbngszjben trtnik.
Owen R e p o rt an A b d u c tio n w e b o ld a l t s ze re tn m .

Itt fut Owen


webkiszolgl szoft

vre, ms nven a KISZOLGL.

A bngsz Owen weboldalt kri, amelyen az rlap tallhat.

I n fut a szmtgp bngszprogramja, ms nven az GYFL

A kiszolgl visszaadja a krt weboldal HTMLkdjt.

^
M o s t el s z e re tn e m kldeni Owen rla p j t a fe lh a s z n ld lta l b e rt a d a to k k a l.

A felhasznl kitlti az rlapot, s benyjtja.

Hm. Nekem i t t sem m i dolgom .

A <form action> elem arra utastja a bngszt, hogy krje meg a felhasznl levelezprog ramjt egy e-mail ltrehozsra.
A kiszolgl soha nem nyl a m ailto -t hasznl webes r lapokon bert adatokhoz.

A felhasznl levelezprogramja ltre hoz egy e-mailt az rlapadatokkal de azt a felhasznlra bzza, hogy va lban elkldi-e Owennek.

A kiszolgl feladata itt arra korltozdik, hogy a w eboldalt kzbestse a bngsznek. Amikor a felhasznl benyjtja az rlapot, a bngsz (az gyfl!) egyedl kell, hogy kitallja, hogyan kldje el e-mailben az rlapadatokat. Az gyfl nem kpes rlapadatok elkldsre - ez a kiszolgl feladata.

10

1. fejezet

Keltsd letre a statikus oldalakat!

A PHP a KISZOLGLN mkdik


A PHP gy teszi lehetv, hogy m egszerezd a felhasznl ltal az rlapra bert adatokat, hogy szrevtlenl elkldi neked azokat e-mailben. A fel hasznl berja az elrablsa trtnett, a Report Abduction gombra kat tint, s kszen is van! A PHP-kd ltrehozza s elkldi neked az e-mailt, majd egy megerst oldalt llt el s jelent meg a felhasznl szmra.

Owen R e p o rt an A b d u c tio n w e b o ld a l t s ze re tn m .

0 % A bngsz Owen weboldalt kri.

A kiszolgl a weboldal HTML-kdjval vlaszol.


M ajd n feldolgozom az u ria p a d a to k a t, s m agam kldm el az e -m a ilt.

A felhasznl kitlti az rlapot, s benyjtja, tadva az rlapadatokat egy a kiszolgln tallhat PHPparancsfjlnak.

A kiszolgl HTML formtum meg erstst kld a bngsznek.

A PHP-parancsfjl elllt egy megerst HTML-oldalt, s elkl di az rlapadatokat Owennek.

wen garantltan szpen

Jelld be, hogy szerinted hov tartoznak a PHP-parancsfjlok:


| | gyfl Kiszolgl [ Mindkett |
j Egyik sem

formzott e-m ailt kap.

m ost itt vagy >

11

a p h p kiszolgloldali nyelv

A PHP-parancsfjlok a kiszolgln futnak


A PHP-kdok a kiszolgln futnak, s ltalban .php fjlkiterjeszts PHP-parancsfjlok (szkriptek) troljk azokat. A PHP-parancsfjlok gyakran nagyon hasonltanak a szokvnyos HTML-weboldalakra, mivel HTML- s CSS-kdot egyarnt tartalmaznak. Valjban am ikor a kiszolgl egy PHPparancsfjlt futtat, a vgeredm ny mindig tiszta HTML s CSS lesz, teht m inden PHP-parancsfjl vgssoron HTML-l s CSS-s alakul, miutn be fejezte a m kdst a kiszolgln. Nzzk meg kzelebbrl, hogyan vltoztatja meg egy PHP-parancsfjl O wen w ebes rlapjnak feldolgozst:

A bngszgyfl egy HTML-weboldalt kr, ami esetnkben a Report an Abduction rlap.

Alin* A bducted M e s-'u.-c )M wy *>' * C 0


FMMM*

report.html

Hwl* J* o m ***
\ o md ym to u } id

A kiszolgl visszaadja a HTML-weboldalt.

A Report Abduction gombra kattints benyjtja az rlapadatokat a kiszolg ln tallhat PHP-parancsfjlnak.

A felhasznl kitlti az rlapot, s benyjtja, mire a bngsz tadja az rlapadatokat egy a kiszolgln tallhat PHP-parancsfjlnak.

Keltsd letre a statikus oldalakat!

A PHP kiszolgloldali programozsi nyelv - teht egy webkiszolglo'n fut.

O
A PHP-paranesfijl a kiszolgln fut!

A kiszolgl egy tisztn HTML-bl ll weboldalt ad vissza, amelyet a PHP-parancsfjl lltott el.
Bar az oldal nevnek vgn .php
1 a bngszben, az oldal ezen

a ponton tisztn HTML-bl ll


rep o rt.p h p

A bngsz megjelenti a megerst weboldalt.

Aiiens A bducted M e - R eport an A bduction


Y ou b o n c rd fa* N ovem ber maS n o t f a J 1 U *ux

W p 4 d o ?

y o u r a m U t a r * a i i m ibevnafcntffl -cax

rep o rt.p h p

A felhasznl egy meger'-

A kiszolgl futtatja a PHP-parancsfjlt, amely e-mailt kld, s elllt egy megerst weboldalt.

ito weboldalt lt.

o
Owen megkapja az e-m ailt.

Az e-mail megrkezik Owen levelesldjba.

m ost itt vagy

13

a form action jellem z

Az rlapot a < fo rm > elem action jellemzje kapcsolja egy PHP-parancsfjlhoz, s a parancsfjl ennek hatsra indul el, amikor az rlapot benyjtjk.
rlapot a HTML <form> elem nek hasznlatval kszthetnk, s m inden <form> elem nek van egy action (mvelet) jellemzje. A webkiszolgl azt a parancsfjlt indtja el az rlap feldolgozshoz, amelyiknek a nevt rtkl adtk az action jellemznek. Teht ha O w en PHP-parancsfjljnak a neve report: .php, akkor az ezt a parancsfjlt az rlaphoz kapcsol <form> elem gy fog kinzni:

< fo rm

a c tio n

" r e p o r t .p h p "

m e th o d

"p o s t">

Ez a PHP-parancsfjl fjlneve.

Amikor a felhasznl a Report Abduction gom bra kattint az rlapon, az rlap mvelet a report .php parancsfjlt indtja el a kiszolgln az rlapadatok fel dolgozshoz.

R e p o rt an A bductio n < /ti? .l e >

A < f o r m > elem action je l lemzje indtja el a PHPparancsfjlt a kiszolgln, amikor az rlapot benyjtjk

reportphp

14

1. fejezet

Keltsd letre a statikus oldalakat!

Nincsenek

hlye krdsek
J V M it jelent a PHP?

V !A PHP egy betsz, amely eredetileg a Personal Home


Pages (szemlyes honlapok) rvidtse volt, de a jelen tse idkzben PHP: Hypertext Processor-ra (PHP: hiperszveg-feldolgoz) vltozott. Ez persze egy nhi vatkoz betsz, hiszen a rvidtsen bell maga a PHP rvidts is szerepel. gyes? Bosszant? Dntsd el te.

Annak ellenre, hogy a webbngszm egy olyan oldalt mu tat, aminek a neve .php-re vgzdik, az oldal tiszta HTML. Hogy is van ez?

V !Ez azrt lehetsges, mert az oldal a kiszolgln eredeti


leg PHP-kdknt kezdi a plyafutst, de HTML-kdd alakul, mieltt a bngszhz kerlne. A kiszolgl te ht egy PHP-kdot futtat, am elyet HTML-l alakt, mie ltt az oldalt elklden megjelentsre a bngsznek. Ez azt jelenti, hogy br a .php fjlok PHP-kdot tartal maznak, a bngsz ezt a kdot soha nem ltja, csak azt a HTML-t, amit a PHP-kd futtatsa eredm nyez a kiszolgln. I C l De ht minden weboldal - belertve a .html fjlokban trolt tiszta HTML-oldalakat is - a kiszolglrl szrmazik, nem?

V \ De igen. A w ebhelyek minden -

.h tm l, .e s s , .php, s gy tovbb - fjljt a kiszolgl trolja, csakhogy nem mindegyiket dolgozza fel. A HTML- s CSS-llomnyokat. valamint a kpfjlokat kzvetlenl kldi el az gyfl bngsznek, anlkl, hogy foglalkozna vele, hogy mi is van bennk. A PHP-fjlok azonban msok, mert olyan kdot tartalmaznak, amelyet a webkiszolgl fut tat s feldolgoz. A bngsz nem a PHP-kdot kapja meg, hanem a PHP-kd futtatsnak eredmnyt, ami vi szont tiszta HTML s CSS.

m ost itt vagy

15

az els php-parancsfjlod

Az rlapadatok elrse a PHP segtsgvel


O w ennek teht egy olyan PHP-parancsfjlra van szksge, amely megbzha tbban el tudja juttatni hozz az idegenekkel kapcsolatos informcikat, mint a mailto. Ksztsd el neki! Ne aggdj, mg nem kell m indent rtened, k sbb m indent elmagyarzunk:
<html> A PHP-parancsfjlok
gyakran ugyangy kez ddnek, mint a H T M lwebotdalak. Teljesen normlis, hogy egy PHP-parancsfjl szok vnyos HTML-elem eket s -jellem zket tartalmazzon.
J

<head> <title>Aliens Abducted Me - Report an Abduction</title> </head>


Ez az egsz kdblokk

<boay> <h2>Aliens Abducted Me - Report an Abduction</h2>

P H P ...a parancsfjl tbbi rsze azonban norml H TM L

<?php
Na, itt kezd rdekes
lenni a dolog jff kezddik a tnyleges PHP-kd.

$when_it_happened = $_POST[1 whenithappened1];


Ez a PHP-kdrsz rgzj

$how_long = $_POST[*howlong]; $alien_description = $_POST[ description]; $fang_spotted = $_POST[fangspotted]; $email = $ POST[1email1];

ti az rlapadatokat, hoM meg lehessen jelenteni I azokat egy megerst oldal rszeknt.

echo Thanks for submitting the form.cbr />'; echo You were abducted . $when_it_happened; echo and were gone for . $how_long . <br echo Describe them: ' . $alien_description . 1<br />; echo 'Was Fang there? . $fang_spotted . 1<br />; echo Your email address is ' . $email;
Itt a PHP segtsgvel | HTML-kdot lltunk e i j az alapadatokbl. I

?>

</body> </html>
Ez a PHP-parancsfjl a norml weboldalakhoz hasonlan a megnyitott HTML-elemek bezrsval vgzdik.

16

1. fejezet

Keltsd letre a statikus oldalakat!

Tesztt
Mdostsd Owen rlapjt, hogy egy PHP-parancsfjl segtsgvel dolgozza fel az rlapadatokat!
Hozz ltre egy j szvegfjlt report .php nven, s rd bele az elz oldalon lthat kdot. Ez a parancsfjl fogja feldolgozni O w en w ebes rlapjt. A PHP-parancsfjl most mg nem kapcsoldik az rlaphoz, ezrt elszr meg kell nyitnod a r e p o r t . htm l oldalt egy szvegszerkesztben, s az rlapm ve letet a m a ilto helyett a r e p o r t .php-re kell lltanod: < fonn a c t io n = " r e p o r t . php" m ethod = " p o st" > Nyisd meg a r e p o r t .h tm l oldalt egy w ebbngszben, adj meg nhny infor mcit az idegenekkel kapcsolatban az rlapon, s kattints a Report Abduction gombra.
- Reszort ar. Aboucor

report.htm l reportphp
n9 jp g

A hasznlt bngsztl fgg en vagy egy zavaros szveget tartalmaz tveboldal jelenik meg, vagy csak a report.php parancsfjl PHP-forrskdja.

Allens Abducted Me Report an Abduction


Share your story of alien abduction:

First name: Last name: What is your email address? When did it happen? How long were you gone? How many did you see? Describe them: What did they do to you? Rave you seen my dog Fang?

Aif N t n & h w Y ' t M t g rcp tmf x o last November A lie n s A b d u a c d

Aliens Abducted Me - Report an Abduction


You were tbductcd' Swh,.,.happened; coho and were gone for

1 b i on d w* on
WM
Yes O N o
m e about UfO

---

________ Dc^cnWihcm; *. $ahcn_descriptk>n: ccho'


W S Fang

Your email address is . Scmaii, ?>


m ___________

7 r a r .s it io Q a i//g u *

lDDxcei/?/ftil
- w 3 . 0 r .............../... h t m l ' g / 1 999 x <head>

1
1l 4 n on*

0 ^ H p -o q u iv r nn
s i vote (or me

t ?ypo'
, /m

/h tn i;

< bodyN
-< h 2 > > li< a i

< /h e a d >

*ep o rt c t x o n K / t i t

le>

Anything else you want to add'


"R^oort A bortion }

A bductod Mo

f lO D o r, cport

A iO < bduct I> /h2>

Szerinted gy kell mkdnie a PHP-parancsfjlnak? rd le, hogy mirt vagy mirt nem, s hogy szerinted mi trtnik itt:

m ost itt vagy

17

php-parancsfjlok elhelyezse a kiszolgln

A PHP-parancsfjloknak a kiszolgln kell lakniuk!


Hacsak nincs vletlenl egy m kd webkiszolgl a szmtgpeden, ^ ^ en te^plM t Webkiszola report. php parancsfjl nem tud lefutni, am ikor benyjtod az 9a 0 > ami ismer? a PHP-f, kzvetlenl Elraboltak az idegenek rlapot. Emlkezz vissza, hogy a PHP egy a szmtgpeden is kiprblhatod programozsi nyelv: megfelel krnyezetre van szksge ahhoz, a PHP-parancsfjlokat hogy futhasson - ez a krnyezet pedig nem ms, mint egy PHP-tmogatssal rendelkez webkiszolgl. A PHP-parancsfjlokat s a rjuk tm aszkod w eboldalakat egy valdi webkiszolgln kell elhelyezni, nem csak megnyitni egy parancsfjlt kzvetlenl a helyi HTMl-weboldalaktI eltren, amelyek fjlrendszerbl. helyben megnyitk atk egy webbngszben,
a PHP-parancsfjlokat mindig egy URL-en keresztl, egy webkiszolglrl kell m egnyitni".

A webbngszk semmit sem tudnak a PHP-rl, ezrt nem kpesek futtatni a PHPparancsfjlokat.
Ez a PHP-parancsfjl a webbngsz szmra csak egy raks rtelmetlen kd.

A webkiszolgl viszont rti a PHP-kdot, s lefut tatja a parancsfjlt.

A PHP-t ismer webkiszolglk tudjk, hogyan kell futtatni a PHP-parancsfjlokat, s hogyan kell azokat a bngsz szmra rtelmezhet HTML-weboldalakk alaktani.

A leggyorsabban gy llapthatod meo ^


9Y egy weboldal egy webkiszolglrl

Hl?i SZaf, 3Zl(' 6' hoM me9" 6 m 'zed, hogy m - j e h ttp:"-ve i kezddik-e. A helyi
E l k e n t m egnyitott weboldalak U R L-je

A PHP-parancsfjloknak egy
webkiszolgln kell futniuk, klnben nem mkdnek.

W,ndi9 8 J i l e : " elolaggal kezddik

18

1. fejezet

Keltsd letre a statikus oldalakat!

Tltsd fel a PHP-parancsfjlokat a kiszolglra!


A PHP-parancsfjlok ltrehozsa s szerkesztse a helyi szm tgpen tkletesen rend ben van, de ahhoz, hogy futtatni lehessen ket, a fjlokat fel kell tlteni egy webkiszolglra. A PHP-fjlok gyakran HTML-fjlokkal egytt troldnak a webkiszolgln. A PHPparancsfjlok feltltse a w ebkiszolglra nem ignyel semmilyen varzslatot - csak egy olyan helyre kell tenned a fjlokat, ahol a w eboldalak elrhetik azokat. A fjlok feltltse egy webkiszolglra valamilyen segdprogram , pldul egy FTP-program segtsgvel tr tnik. (Az FTP a File Transfer Protocol - fjltviteli protokoll - rvidtse.)

A le3tSbb PHP-parancs fi!

mas fJlokkal egytt trolod,k egy mappban 3 webkiszolgln. A webkiszolgln ltal ban egy mappa trolja a legtbb (ha nem az sszes) webes f jlt.
report.html v report.php style.css fang.jpg

A kpeket rendszerezsi okok bl nha kln mappban trol jk a webkiszolgln - ebben az esetben azonban nem.

A PHP-parancsfjlok feltltse egy webkiszolglra nm agban nem elg - a webkiszol glra teleptve kell lennie a PHP-nek is. Egyes webkiszolglk alapllapotban tartalmaz zk a PHP-t. m sok azonban nem.
Nincsenek

hlye krdsek
Honnan tudhatom, hogy a webkiszolglm ismeri-e a PHP-t?
M egkrdezheted a w ebes rendszergazdt vagy a weboldalaidnak helyet ad szolgltatt, de magad is vgrehajthatsz egy r vid ellenrzst. Hozz ltre egy szvegfjlt test .php nven, s rd bele az albbi kdot:
< ? p h p

Ha a webkiszolgld nem ismeri a PHP-t, lapozd fel a II. fggelket.


A fggelkben utastsokat tallsz a PHP bezem elsre a webkiszolgln.

Ez a kd arra utastja a P H P -t, hogy informcit jelentsen meg sajt magrl.

phpinfo();
?>

Most tltsd fel a test .php-t a webkiszolglra, s rd be az URL-jt egy w ebbngszbe. Ha a kiszolglra teleptettk a PHP-t, mindenfle rszletes informci jelenik meg a PHP-rl, tbbek kztt a vltozatszma. Bing!

Ne felejtsd el trlni a phpinfo()

amikor kszen vagy, hogy senki mas ne lthassa.


m o s t itt vagy >

19

teszteld a php-parancsfjlt!

report, php

A
Nade'

Unj?t**Yr<aJlQrecn com
t*jt NovemDc^

1 hus 1 or
dozen

PHP-parancsta]I n iu iw dik, s megjelenti az r lapadatokat egy megers tn weboldalon.

0 ^ 0

M tem AbUucicd Me - Report an Afaduct.on______

Aliens Abducted Me - Report an Abduction


You were abducted last November and were gone for 11 hours Describe them: Was Fang there? no Your email address is alfc@theyreaDgrcen.corr;

Anything else you want to add


' Rep Abductior *---- i

20

1. fejezet

Keltsd letre a statikus oldalakat!

KJasszI M o s t m r c s a k nmi P H P -kdra van szksg, ami g o n d o sko d ik az rla p a d a to k e-m ailben trtn elkldsrl.

gy igaz. A report.php parancsfjlbl mg hinyzik az a kdrsz, amelyik elkldi a testrabl idegenekkel kapcsolatos informcikat Owennek.
Ez azonban nem jelent gondot, mert a PHP-nek van egy fggvnye (vagyis egy bep tett, jrahasznosthat kdelem e), amelyet elektronikus levelek kldsre hasznlhatsz. Csak azt kell kitallnod, hogy mi legyen a levlben, s a PHP segtsgvel elksztheted s elkldheted.

Idt krek1 Mg azt sem tu d ju k , hogyan m kdik az eredeti report.php p a ra n c s f jl, s m r elreszaladunk a levlkldsre? Hell! Nem lesz ez gy tl sok egyszerre?

Igazad van. Ahhoz, hogy tbbre legyl kpes a PHP-vel, tbbet is kell tudnod a PHP-rl.
Alihoz teht, hogy levlkldsi kpessggel ruhzhasd fel O w en report.php parancsfjljt, kicsit m lyebbre kell m erlnd a PHP-ben. s meg kell rtened a pa rancsfjl jelenlegi vltozatnak m kdst.

most itt vagy

21

hogyan lesz a p h p -k d b l html?

A kiszolgl HTML-l alaktja a PHP-t


A PHP-parancsfjl m kdsnek m egrtshez igen lnyeges, hogy tudd, hogy mi trtnik a parancsfjllal, am ikor lefut a kiszolgln. A legtbb PHP-parancs fjl PHP- s HTML-kdot egyarnt tartalmaz, s a PHP futtatsra s HTML-l alaktsra az eltt kerl sor, hogy a kiszolgl HTML-knt tadn az egszet az gyflbngsznek. O w en report. php parancsfjljban PHP-kd lltja el a m egerst oldal HTML-tartalmnak nagy rszt, a PHP-rszt krlfog HTML-kd pedig vltozatlan form ban kerl a bngszhz.
Ez a HTML-kd vltozatlanul kerl a bngszhz.

Ezt a PHP-kdot a kiszolgl fu tta tja , s olyan HTML-kdot llt el', amely az rlapra be rt adatokat tartalmazza.

1.

2. 3. 4. 5.

6.

ech o ech o ech o ech o echo ech o

Tovbbi statikus HTML a kiszolgl vltoztats t a bngsznek.

report.php

Keltsd letre a statikus oldalakat!

Statikus - nem vltozik

Ezt a HTML-kdot menet kzben a PHP-parancsfjl lltja el, ami lehetv teszi, hogy olyan dolgo kat foglalj bele, m int az imnt be r t rlapadatok

Thanks for submitting the form.<br /> You were abducted last November and were gone fo Describe them: <br /> Was Fang there? nocbr /> Your email address is alfn@theyreallgreen.com

rep o rt.p h p

ancsfjl

vgeredtiszta HTMLamely dinamikusan

A - Q O ___ S A)* n s Abdu c tc d Me - R eport

Abduction

_______

Aliens Abducted Me - Report an Abduction


You were abducicd Iasi November and were gone for 11 hours Describe them; Was Fang there? no Your email address is alfn thcyrcailgreen.com

a kiszolgln.

most itt vagy

23

owen php-parancsfjljnak anatmija

Owen PHP-parancsfjlja rszekre bontva


A r e p o r t .php parancsfjlt a Report an A bduction rlap indtja el, s (je le n pillanatban) az a feladata, hogy az rlapadatok felhaszn lsval egy m egerst w ebold alt hozzon ltre. Lssuk, hogyan! A kd els rsze tiszta HTML. Ez a rsz csu pn fellltja a felp ten d oldal vzt nhny olyan HTM L-elem m el, am ire m inden oldalon szksg van:
<htm l> <head> < t i t l e > A l i e n s A b d u cted Me - R e p o r t an A b d u c t i o n < / t i t l e > < /h e a d > <body> < h 2 > A lie n s A b d u cted Me - R e p o r t an A b d u c tio n < /h 2 >

re port. p h p
Igen, ez meglehetsen m ini mlis HTML-kd. idelis esetben szerepelne itt a dokumentumtpus (DOCTYPE), egy < m e ta > cmke, s gy tovbb, de igyekeztnk egyszersteni a dolgot.

Itt kezd rdekes lenni a dolog. Kszen llunk r, hogy kitrjnk a HTMLbl, s fejest ugorjunk a PH P-kdba. A <?php cm ke egy PHP-kdrszt nyit, teht minden, ami ezt a cm kt kveti, tiszta PHP.
<?php

Innen kezdve PHP-kddal lesz dolgunk, legalbbis amg a zr ? > cmkhez nem rnk.

Az albbi kd fogja az rlapadatokat, s kln-kln vltozkba rja azo kat, hogy ksbb knnyen elrhetk legyenek. A PHP-ben a vltozk teszik lehetv az rtkek trolst, legyenek azok szmok, szvegek vagy ms fajta adatok.
$ w h e n _ it_ h a p p e n e d = $ _ P 0 S T [ 1 w h e n ith a p p e n e d ] ; $h ow _lon g = $_POST[ h o w lo n g ' ] ; $ a l i e n _ d e s c r i p t i o n = $_PO ST[ ' d e s c r i p t i o n 1] ; $ f a n g _ s p o t t e d = $ _ P 0 S T [ ' f a n g s p o t t e d '] $ e m a il = $_PO ST[ 1e m a i l ] ;

Minden PHP-kdsor egy-egy urlapmezo adatait rendeli egy j vltozhoz.

Errl van sz! Az imnt ltrehozott vltozkat mr munkra foghatjuk, s beszr hatjuk a dinamikusan ellltott HTML-kdba. Az ech o parancs olyan HTMLkdot kld a kimenetre, amit kzvetlenl visszaadhatunk a w ebbngsznek:
ech o ech o ech o ech o ech o ech o Thanks f o r s u b m i t t i n g t h e f o r m .c b r / > ' ; 'Y ou w e re a b d u c te d . $ w h e n _ it_ h a p p e n e d ; ' and w ere gone f o r . $h ow _lon g . '< b r / > ' ; 'D e s c r i b e th em : ' . $ a l i e n _ d e s c r i p t i o n . 1< b r / > ' ; 'Was Fan g t h e r e ? ' - $ f a n g _ s p o t t e d . ' < b r / > ; 'Y o u r e m a il a d d r e s s i s 1 . $ e m a i l ;
Ez a PHP-kd ille szti be , vltozkat a bngsznek elkldtt HTML-kdba.

A ?> cm ke a nyit <?php prja, s egy PHP-kdrszt zr le, vagyis itt visszatrnk a szokvnyos HTML-kdhoz. ?> < -----------------

Ezzel zrjuk le a PHP-kdot - innen kezdve ismt szokvnyos HTM t-lel van dolgunk.

Most mr csak annyi van htra, hogy az oldalon bezrjuk a korbban megnyitott HTML-elemeket:
< /b o d y > < /h tm l>

N , t e lf . le jt . M i, k .S( ezrt a HTM l-kdot le kell zrnod.

24

7. fejezet

Keltsd letre a statikus oldalakat!

Nhny PHP-szably az lethez a kdolshoz


O w en r e p o r t .p h p parancsfjlja rvilgt a PHP nyelv nhny alapvet szablyra, am e lyek minden PHP-parancsfjl esetben rvnyesek. Vizsgljuk meg ket kzelebbrl!

g f

A PHP-kdokat mindig a <?php s ? > cmkk zrjk krl.


<?php

^ ^

A legtbb

PH

Ida jn a PHP-kd. -----------? > < --------

n t o U t f t a u r l PHP
9 *1 0 , h jy to(J pNp

B f Minden PHP-utastsnak pontosvesszre (;) kell vgzdnie.


echo 1 Thanks fr submitting the form.<br
Ha egy kd nem mkdne, ellenorizd, hogy nem felejtetted-e el a pontosvesszt. Gyakrabban elfordul, mint hinnd. A pontosvessz tudatja a PHP-vel, VioflV ho r az utasts, ^

e r

Ha egy weboldalon PHP-kd tallhat, clszer a webkiszolgln a fjl nevnek vgre .php-t rni .html helyett.
fa lft j|p
report.php

Nem ktelez, de j tlet a PHPparancsfjlok nevt .php kiterjesztssel elltni.

e f

A PHP-ben a vltozneveknek egy dollrjellel kell kezddnik.

^ --^ $email = $_POST [ email' ; ' ]

A dollrjel vilgosan azonost ja, hogy vltozrl van sz, ami inform cit trol a PHPA report.php parancsfjlban hasznlt vltozkat megvizsglva szreveszel ms PHP-szablyokat is, amelyek a vltozkra vonatkoznak? Ha igen, rd ide ket:

parancsfjlon bell.

most itt vagy 2 5

vltoz-elnevezsi szablyok

Megtallni a tkletes vltoznevet


Azon kvl, hogy egy dollrjellel kell kezddnik, a PH P-vltoznevekben a kis- s nagybetk klnbzsge is szmt. De ez mg nem minden: ms fontos szablyok is vannak, am elyek a vltozk elnevezsre vonatkoznak. Ezek kztt vannak nyelvtani szablyok, am elyeknek a m egszegse m k dskptelenn teszi a kdot, mg ms szablyok csak jtancsok a rgi, blcs PHP-programozktl. Kezdjk a hivatalos szablyokkal, am elyek biztosan gondot okoznak, ha fi gyelm en kvl hagyod ket, am ikor nevet adsz a vltozidnak. Ezeket a sza blyokat kell kvetned, ha rvnyes vltozneveket szeretnl adni:

A vltoz olyan trolf amelybe adatokat helyez hetsz. Minden vltoznak egyedi neve van.

S Az els karakternek dollrjelnek ($) kell lennie.

Fogtam!

N M M f * ?
_ Jen vltoev elejt, to te le n -

S A vltozneveknek legalbb ecjy karakter hosszsgnak kell lennik.


A dollrjel utni els karakter egy bet vagy egy alhzsjel (_) le het, az utna kvetkez karakterek pedig betk, alhzsjelek, illetve szmok lehetnek. e f Az _ s a $ kivtelvel semmilyen klnleges karakter, illetve szkz nem lehet a vltoznevek egyik rszben sem.
$ e m a il
Erve'nyes Nem rvnyes! A PHP-va'ltoznevek nem tartalmazhatnak kt jelet, illetve szkzt.

i s

$fang-spotted
Nem rvnyes! A ktjelek nem megengedettek a PHPvltoznevekben.

w h e n -it h ap p en ed

A
rvnyes

$ h o w _ _ lo n g

Nem rvnyes! A PHP-vltozneveknek egy dollrjellel ($) kell

Ha nem kveted ezeket a szablyokat, a kd m kdskptelenn vlik, de vannak tovbbi szablyok is, am elyek nem ktelezek ugyan, de a kdols sorn ajnlott betartani ket, mert a PHP-kdot egy sg esebb s knnyebben olvashatv teszik:

dodniiik.

/ \ P H P -b e n a v lto z k n e ve in e k egy d o lU r je l-

A vltozneveket csupa kisbetvel rd.

^ A tbb szbl ll vltoznevekben a szavakat alhzsjellel vlaszd el. 1


Az utols kt szably figyelmen kvl hagysa nem akadlyozza meg a kd m kdst, s biztosan tallkozni fogsz olyan PHP-programokkal, amelyek nem k vetik ezeket a szablyokat, mgis megfelelen mkdnek. Ennek az az oka, hogy ezek a szablyok csupn egy ajnlott kdolsi stlust hatroznak meg - a sajt vl tozid ltrehozsakor s elnevezsekor azonban j szolglatot tehetnek.

|el kell kezddni! s nem tartalmazhatnak szkzket.

26

7. fejezet

Keltsd letre a statikus oldalakat!

Nincsenek

hlye krdsek
K i Szmt, hogy a PHP-utastsokat kisbet vel vagy nagybetvel rom?

V ;igen is, meg nem is. A PHP nagyrszt

nem tesz klnbsget a kis- s nagy betk kztt, teht a legtbb utasts ban megszhatod, ha kevered a kiss nagybetket: amikor tartalmat ratsz ki, rhatod pldul azt, hogy e ch o , ECHO vagy EchO. A hagyomny azon ban az (s melegen ajnlott kvetni), hogy a parancsfjlokban kvetkezete sen hasznljk a kis- s nagybetket. A legtbb PHP-programoz a PHPkd tlnyom rszt kisbetvel rja ezrt lthatod az e ch o formt K ^ A HTML-fjlokba gyazott PHP-kdoknak a knyv sszes pldjban.

v, hogy a HTML-tartalmat menet kzben mdostsd, pldul olyan dol gokat szrj be. mint a mai dtum, egy adatbzisbl kiolvasott adatok, vagy ppen szmtott rtkek, pldul egy bevsrlkosr megrendelseinek sszege. A PHP teht lehetv teszi, hogy ne statikusan, tervezskor hat rozd meg egy weboldal HTML-kdjt, hanem menet kzben mdostsd azt. Nagyon gyakori, hogy egy oldal PHPkddal teleszrt HTML-t tartalmaz, s ezek a PHP-kdok fontos adatokat szrnak be. vagy ms programozott mdon mdostjk a HTML-kdot.

V Emlkezz vissza, hogy minden web


oldal ktirny kommunikci ered mnye: a bngsztl krelem rke zik a kiszolglhoz, a webkiszolgl pedig vlaszol a krelemre. A kre lem alapjt az URL kpezi, mg a v lasz a kiszolgltl visszarkez tarta lom. A PHP-parancsfjlokat ugyangy kell krelmezni, mint a szokvnyos HTML-weboldalakat: egy a bngsz be bert vagy egy msik oldalrl, pl dul egy rlapmveletbl hivatkozott URL-en keresztl. Ez a magyarzat ar ra. hogy a PHP-oldalak URL-je mirt a PHP-parancsfjl nevt mutatja. Az egyenlet msik oldala a kiszolgl v lasza, vagyis a PHP-parancsfjl ltal ellltott kd. Mivel a legtbb PHPparancsfjl HTML-kdot llt el, logi kus, hogy a kd nem PHP hanem HTML lesz. Nem vletlen teht, ha egy URL egy .php fjlra hivatkozik a kiszolgln, aminek a hatsra ott egy PHP-kd fut le, ami vgered mnyben tiszta HTML-tartalom vissza adst eredmnyezi a bngsznek.

K * Szval keverhetem a kis- s nagybetket a PHP-kdokban (mg ha ez rossz kdolsi szoks is)?

nll sorba kell kerlnik, vagy begyaz hatok egy HTML-kdsorba is, pldul egy HTML-elem jellemzjnek rszeknt?

V Nem egszen. A kis- s nagybetk ke-

V Azon kvl, hogy a PHP-kdokat

V V

<?php s ?> cmkk kz kell zrni, verhetsge all a nagy kivtelt a vl nincs korltozs arra nzve, hogy mi toznevek jelentik a PHP-ben, s ez knt gyazhatod be ket a HTMLa ltrehozott adattrolkat rinti. Ve kdba. Valjban gyakran szksges gyk pldul a Report an Abduction egy-egy PHP-kdrszletet a HTMLparancsfjlban hasznlt $ e m a il vlto kdba kelni, plduk amikor egy K i A PHP vltozi msfajta adatokat is trol zt. Ebben a vltoznvben szmt HTML-elem valamelyik jellemzjnek hatnak? a betlls, teht erre a vltozra nem rtkt lltod be. Ez teljesen szab hivatkozhatunk gy, hogy $ EMAIL V T erm szetesen . Vltozkban trol lyos mdja a PHP hasznlatnak. hatsz pldul Boole-fle (logikai, vagy $ e M a il. A PHP-ben minden K i Olyan PHP-kddal is tallkoztam, aminek igaz/hamis) rtkeket, a szmadatok vltoznv betlls-rzkeny, ezrt a nyitcmkje nem < ? p h p volt, hanem pedig lehetnek egsz vagy lebeg lnyeges, hogy a vltozkat krlte <?. Helyes ez a megolds? kinten nevezd el, s kvetkezetesen pontos (tizedesjegyeket tartalmaz) szmok. Lteznek gynevezett tm hivatkozz rjuk a kdban. A vltoz Nem igazn. Technikai rtelemben bk is. amelyek adatok gyjtemnyt nevekrl hamarosan tovbbi rszlete megengedett ugyan, de nem ajnlott. troljk, illetve objektumok, amelyek ket is megtudhatsz. Alihoz, hogy a rvid nyitcmke (< ? ) adatok gyjtemnyt trstjk az ada mkdjn, egy kiszolglbelltst K i Tnyleg lehet ugyanabba a fjlba HTMLtokon mveleteket vgz kdhoz. keli engedlyezni. A szokvnyos s PHP-kdot is tenni? A tmbkre a fejezet ksbbi rsz <?php cmke viszont mindig mk ben mg visszatrnk, mg az objek Totlisan, st sok esetben muszj is dik, ezrt clszerbb azt hasznlni, tumokkal a 12. fejezetben foglalko gy' tenni. mert gy biztos lehetsz benne, hogy zunk. Ltezik egy NULL nev kln a kd mkdkpes lesz. K i Mirt szksges ez? leges adattpus is. amely az rtk hi K i Ha a webkiszolgl mindig tiszta HTMLnyt jelzi. Ha egy vltozhoz teht kdot ad vissza a bngsznek, az URL-ek nem rendeltek rtket, akkor Azrt, mert a webkiszolgl lnyege, mirt a PHP-parancsfjl nevt - pldul hogy HTML-weboldalakat szolgltat az NULL-nak tekintend. weboldal.php - mutatjk? a bngszknek, s ezen a PHP sem vltoztat. A PHP csak azt teszi lehetm ost itt vagy 27

ptoljuk owen hinyz adatait

Vgy a PH P memrija nem t l

J<5, va g y a p a ra n c s f jlla l van v a lam i g o n d ...e g y s e rla p a d a to k hinyoznak.

% -

f |/> ^

Aliens Abducted Me - Repon ah Abduction

Aliens Abducted Me - Report an Abduction


Share your story of alien abduction:

First name: Last name: W hat is your email address? When did it happen? How long were you gone? How many did you see? Describe them: W hat did they do to you? Have you seen my dog Fang?

Ndr ae
lAiX Novt'nfcer

11 hours

**ed rnt about UFO regvUtons

,fl u * ik' f
lerst...

h y

afelhasznl

Yes 0 No 0

Megadta az idegenek

. . . d e a lers szreveheten
Anything etse you want to add.
Repon Abduwton^

hinyzik a megerst weboldalrl.

- k u p o n an A b d u ti.c n

Aliens Abduct/?d Me - Report an Abduction


You v.crc abducti .Mast November and were gone for 11 hours Describe them: W as Fang there? no Y our email address is alfh@thcyreailgreen.com

28

1. fejezet

Keltsd letre a statikus oldalakat!

Hegyezd ki a ceruzd!
Ow en r e p o r t .php parancsfjljban van egy kis gond az idegenek lerst tar talmaz rlapadattal. Karikzd b e azokat a kdsorokat, am elyek szerinted a problm t okozzk, s rd le, hogy mit csinlnak. Van valamilyen tleted, hogy hol lehet a hiba?
<html> <head> <title>Aliens Abducted Me - Report an Abduction</title> </head>

<boay>
<h2>AIiens Abducted Me - Report an Abduction</h2>

<?php $wnen_it._happened = $how_long =


$_PO ST

['whenithappened '];

$ _ P O S T ['howlong']; S _ P O S T ( 'descript

Salien_description = $fang_spotted -

ion'];

$ _ P O S T ['fangspotted' ]

$email $_POST [ 'email];

echo 'Thanks for submitting the fcrm.<br />'; echo 'You were abducted ' . $when_it_happened; echo ' and were gone for ' . $how_long . '<br />'; echo 'Describe them: ' . Salien_description . '<br />';

echo 'Was rang there? ' . $fang_spotted . '<br />'; echo 'Your email address is ' . $enail;

</body> </html>

report.php

m ost itt vagy 2 9

Hegyezd ki...

m egolds

an Abduct

ens Abducted

Ez a kdsor fogja az idegenek lerst a HTML-urlapmezbl, s az $alien_description nev PHP-vltozba helyezi.


POST['howlona'1

3n Abd u ctio n < /h 2 >

;tea - S_ POST [' her.ith i w

1P tio n ']

Semaii
Ez a kd sszefzi az idegenek lerst ne'mi kiegszt szveg gl s HTML-kddal, s az g szt kirja a bngszben.
ech Thanks

submitt Swhen

riPtion
r e m a il

< /b o d y >

</hLml>

^Port.php

1- fejezet

Keltsd letre a statikus oldalakat!

A vltozk a parancsfjlok adatainak trolsra szolglnak


A PHP vltozi olyan trolk, amelyek hasonlan troljk az informcikat, mint egy cssze a kvt. Mivel az $ a l i e n _ d e s c r i p t i o n vltoz res, tudjuk, hogy az rlapadat nem jut el hozz. Az $ a l i e n _ d e s c r i p t i o n vltoz teht res marad, fggetlenl a prblkozsunktl, hogy adatot rendeljnk hozz.
,k k ,

sml
ltM

Sajnos a cssznk jelenleg res.

le r*,-,,/

Ez a vltoz neve.
S a lie n d e scrip tio n S a lie n _ d e s c rip tio n

A parancsfjl kijavtsnak egyik mdja az lehetne, hogy egyszeren hozzrendeljk a vrt karakterlncot az $ a l i e n _ d e s c r i p t i o n vl tozhoz, valahogy gy: $ a lie n d e s c r ip tio n = ' l i t t l e
A z e g y e n l s g je l a rra

g reen m en ';

A PHP-ben a szvegrszieteket, ms nven ka rakterlncokat, mindig idzjelek kz kell zr ni. Az idzjelek lehetnek egyszeres idzjelek (aposztrfok) vagy ktszeres (sima) idzjelek.

utastja hozza

a P rtP -t, hogy

re n d e lje

a jobb oldalon ll rteket 3 bal oldalon ll vltozhoz.

Ez a kd annyibl m kdkpes, hogy tnyleg elraktrozza a ' i i t t l e g re e n mn ' szveget az $ a l i e n _ d e s c r i p t i o n vltozban. A problmt azonban gy oldottuk meg, hogy csinltunk egy msikat - ez a kd azt eredmnyezi, hogy az idegenek lersa mindig ugyanaz lesz, fggetle nl attl, hogy az rlapon mit rt be a felhasznl.

Agytorna

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

Az idegenek lerst tartalmaz rlapadat hozzrendelse az $ a l ie n _ d e s c r i.p t io n vltozhoz valamirt nem mkdik: $ a lie n _ d e s c r ip tio n = $ _ P O S T [ d e s c r i p t i o n 1] ;

Mit gondolsz, mit csinl rosszul a fenti kd?

m ost itt vagy

31

A problma gykere a $_P0ST-ban keresend, ami arra szolgl, hogy rlapadatokat adjunk t egy parancsfjlnak.
A $_POST elejn lthat dollrjel rulkod...a $_POST egy trol! Pontosabban egy w ebes rlap adatait trol helyek gyjtemnye. Owen esetben a r e p o r t .php parancsfjlnak elkldtt sszes ada tot trolja, miutn a felhasznl kitlttte az rlapot, s a Report Abduction gombra kattintott. Alihoz teht, hogy elrd az rlapada tokat, s csinlhass velk valamit, t kell verekedned magad a $_POST-on. Emlkszel erre a kdra?

$w hen_it__happened = $_PO ST[ w h e n ith a p p e n e d '] ; $h ow _lon g = $ _ P 0 S T [ h o w lo n g ] ; < --------------------------$ a l i e n _ d e s c r i p t i o n = $_PO ST[ d e s c r i p t i o n ' ] ; $ f a n g _ s p o t t e d = $ _ P 0 S T [ f a n g s p o t t e d 1] ; $ e m a il = $ POST[ ' e m a i l ' ] ;

Az elrabls idtartamt trol rlapadatot a $boWJ o n g vltozhoz rendeltk.

nbjggel, hogy it t az rlapra bert e-mail cmet olvassuk ki e's troljuk az $email vltozban.

Teht az rlap minden m ezjnek adatt a $_POST-on keresztl r jk el. De pontosan mi is ez a $_POST? Egy vltoz?

Keltsd letre a statikus oldalakat!

A $_POST egy klnleges vltoz, amit szupergloblisnak hvnak, mert a PHP beptett vltozja, s egy parancsfjl minden rszrl elrhet. A $_POST mr ltezik, am ikor a parancsfjlod lefut, teht nem gy hozod ltre, mint a tbbi PHP-vltozt.

an

A $__P0$T szupergiooj az rlapra bert sszes


Hd' a
afgfe*alr,nc r in!yeiQ< li N v m e t o e b r y
doxetn httc flreen m f n

$ _ P O S T [ ,h o w l o n g ,l

Anything else you want to add


I Report Abductipn '

echo echo echo echo echo ccho

inanKS tor submitting You were abducted ' . and were gone for ' Describe then: ' . $a Was Fang there? ' . S Your email address is

\h e

fo rm . < b r .

/> '; '< b r /> ' ;

$ V i e n _ 1 1 __ha p p e r . e d ; $ V > w _ lo n g i e n j d e s c r i p t i o n . '< b r /> a n g ^ tS Q O tte d . ' < b r / > * ; ' . $ e \ia il;

</body> </html>

A $_POST szupergloblis kzvetlenl kapcsoldik a HTML-rlap ltal hasznlt rlapbenyjtsi m dszerhez. Ha a hasznlt m dszer a p o s t, akkor a PHP minden rlapadatot a $_POST szupergloblisba csom agol ahonnan azok kiolvashatk s igny szerint felhasznlhatk.

report.php

A howlong" nv az urlapmez < input> elemnek name je l lemzjbl ered.

Az rlapbenyjtsi mdszer hatrozza meg, hogy az rlapadatok hogyan kerlnek a PHP-parancsfjlhoz.

Szerinted hogyan mkdik a $_POST szupergloblis? Hogyan kp es tb b rtket trolni O w en rlapjnak


report.html

szvegm ezibl?

m ost itt vagy

33

a $ _P O S T egy tmb

A $_POST szlltja az rlapadatokat a parancsfjlodnak


A $_POST eg y klnleges PH P-trol, amit tm bnek hvnak. A tm bk vltozk gyjtem nyt troljk egyetlen nv alatt. Am ikor valaki benyjtja O w en rlapjt, az ltala az rlapm ezkbe bert adatok a $_P 0S T tm bbe kerlnek, am elynek az a feladata, hogy az ad atokat tadja a parancsfjlnak A $_P 0S T tm b m inden elem e eg y -eg y rlap m ezb e bert adatnak felel m eg. Az eg y es rlapm ezk adatait gy rh eted el, h og y m egad od a m ez nevt a $_POST-tal egytt. Az elrabls idtartam a pldul $_POST[ 'h o w lo n g ' ] nven troldik. O w en rlapjnak HTML-kdja felfedi, hogyan k ap csold n ak az rlapm ezk nevei a $_POST-ban trolt adatokhoz:
<p>Share your story of alien abduction:</p>
< fo rm m e rh o d = "p o 3t a c tio n * " r e p o r t.p h p " > A
: n

***

AUens Abducted Me - Report an Abduction


S
or

yuur ory o *Jrn txlucon

F ir * n a w

L tiu n u u e:
" h f l t k t 'X r r n n t d d w w ?

W h w aw happc? How ioug M-rc you

Hdw maoy lu \ou ice?


D c r * tfcctn:

W bat din tber du to vou

H v um m <0 K n ? e o > } a g

clabel for="firstname">First name:c/label> <input type-"text" id-"firstname" name*"firstname" /xb r /> ,1 " l , " 1 <label for*"lastname">Last name:</label> Cinput type=".text" id*" last name name* "last name" /><br clabel for "email">What is your email address?</I <input type*"text" id=nemail" name-"email" / X b ^ 1 ? clabel for "when ithapperied">When did it happez^^/label > <input type*".text" id*"whenithappened" nam<^*wheni thappened" / X b r /> <label for="howlong">How long were you gone?</label> <input type*"text" id*"howlong" name*"howlong" / x b r /> <laoef for-"nowmany ">Howman y did you aee?</Tabel> <input type*"text" id"howmany" name*"llpwmany" / x b r /> <label Cor "aliendescription">Describe \hem:c/label> % cinput -type* "text" id- "a1iende s cr:p ti an name "al -endescription" size* "32" /Xb r /> . clabel for "wha tth eyd id">What did they d-Vto'you'?<7label> i <input type*"text" id="whatcheydid name* Vhattheydid" s i z d r ^ " / X b r /> clabel for-"fangspotted">Have you seen my eta Fang?c/iabel>\ Yes cinput id*"iangspotted" name*"fangspotteflff iype-"radio" vbS^ue*"yes" /> No cinput id "fangspotted" name="fangspotted"^^pe*"radio" valu^ss "non /xb r /> cimg src*"fang.jpg" width*"lQ0" height "175" alt*"My abducted dog Fang." />cbr /> clabel for*"otner"Anything else you want t o add?c^bel> . ctextarea name*"other">c/textareaxbr /> \ cinput type*"submit" value*"Report Abduction" naine*"simit" /> c/form> \ ^

Az urlapmez neve hatrozza meg, hogy: rheted el a mezt a $ POST tmbben

flrstnam e*
Hastnam e

e m a il

h o w lo n g

\ a lie n d e s c r ip tio n
h o w m a n y

w h e n i t h a p p e n e d

PO ST

Minden rlapadathoz

* $ PST tmbn keresztl trhetsz hozz . 34


7. fejezet

Keltsd letre a statikus oldalakat!

Hegyezd ki a ceruzd!
Hzd t azokat a kdrszeket a r e p o r t .php-ben, am elyek miatt resen marad az ide genek lerst tartalmaz m ez, s rd le, hogyan lehetne kijavtani ket. Tipp: a prob lma feldertshez hasznld segtsgl az elz oldalon tallhat HTML-rlapkdot.

Report an Abduction</title>

<body> Report an Abduction</h2>

$when_it_happened = $_POS?['whenithappened *J $how_long = $_POST['howlong1J; aescription = $_POST['description1]

Emlkezz vissza, hogy korbban ezt a kt kdsort azono stottuk a problma gykereknt.
hanks for submitting the forn.<br /> $wher._ t_happened ; $how_long echo Describe them

echo 'Your email address is ' . Semail

</body> </html>

report.php

m ost itt vagy 35

Hegyezd ki...

megolds

^eW

i ceruzd!------------------------------------------------------------------------ ----M e g o ld s Hzd t azokat a kdrszeket a r e p o r t .php-ben, amelyek miatt resen marad az idegenek lerst tartalmaz mez, s rd le, ho gyan lehetne kijavtani ket. Tipp: a problma feldertshez hasznld segtsgl az elz oldalon tallhat HTML-rlapkdot.

e z < 1

<input type

</head>
report.html

i2>AIiens Abducted Me - Report an Abduction</h2>

Az rlapmez neve a report.htm lben aliendescription", ami nem felel meg a $_P0ST tmbben hasznlt nvnek.
<?php $when_it_happened =
\* whenithappened1J;

$now_long = $_PQST [ 'howlorv }: | "n / 'alie^destviftion $alien_description = $_POST[ ; ---- : $fang_spotted = $_POST['fangspotted]

Mdostani kell a $_PO$T-ot, hogy az rlapmez neve helyes, teht 'aliendescription' legyen.

$email = $_POST['email'J;

Thanks for submitting the form.cbr />'

$how_Iong . '<br /> Describe them

Your email address is

</body>

rep ort.php

36

1. fejezet

Keftsd letre a statikus oldalakat!

Javtsd ki a parancsfjlt s prbld ki!


Mdostsd a hibs kdsort a r e p o r t .php-ben, majd tltsd fel a w ebkiszolglra. Nyisd meg a r e p o r t .h t m l oldalt a bngszdben, tltsd ki az rla pt az idegenekkel kapcsolatos inform cikkal, majd kattints a Report Abduction gom bra, hogy az adatokat elkldd a kijavtott parancsfjlnak.

sa dr U Nvme tl o e br
1 h^ 1 o rs
Itnfc Qteen mer w % IM ib o u t UfO ons

K irly. C sakhogy mg mindig hinyoznak egyes u rla p a d a to k ...

Y cs O No 0

Aliens Abducted Me - Report ar Abduttior.

w ant

Aliens Abducted Me - Report an Abduction


You were abducted last November and were gone for 11 _____________ Describe them: link green men ---------Was hang there? no Y our email address is aiin@thcyreaiigrecn.com

most itt vagy 3 7

javtsd ki owen php-parancsfjljt!

Hegyezd ki a ceruzd!

O w en Elraboltak az id egenek rlapjn vannak olyan adatok is, am elyeket jelenleg nem hasznlunk. Ne fe ledd azonban, hogy ezek az adatok is olyan ltfontos sg inform cikat tartalmaznak az idegenekrl, am e lyek elvezethetik O w ent az elveszett kutyjhoz, Agyar hoz. Ezrt minden adatot ki kell nyerned az rlaprl, s PHP-vltozkban kell trolnod azokat.

A liens

Aliens Abducted Me - Report an Abduction


Share your

vory o f alien abduction:


. ---------------------V JS ^ X ~ ~ _____________
Inst November 11 hours

First nam e: Last nam e: Wbj*l is vour

A report.php parancsfjl jelenleg figyelmen kvl hagy t klnbz' urlapadatot is. Megdbbent'!

When did ft t^pp OW loog werctivy How many did yob.; describe them: W hat did tbcy do to Have you seen mv d<

*^W y a rw.c m <r llg n o

CQ !n ^ 2< 73 H g nmn ttif rw e Yk ^ .N r olR

~~~ '

< o rm m e t h o d = " p c s t " a c t i o n " r e p o r t . p h p " > < l a b e l f o r = nf i r s t n a m e " > F i r s t n a m e : < / I a b e i > < i n p u t t y p e = " t e x t " i d = " i i r s t n a m e " n a m e = " f i r s t n a m e " / x b r /> < l a b e l f c r = " la s t n a m e " > L a s t n a m e :< / la b e l> < i n p u t t y p e = " t e x t " i d = " l a s t n a m e " n a m e " l a s t n a m e / > < b r /> i> s < l a b e l fo r= "e m a il"> W h a t i s y o u r e m a il a d c ir e a s ? < / la b e l> < l n p u t t y p e = " t e x t " i d = " e m a i l " n a m e - " e m a i l / x b r /> 1 C U b e l f o r = nw h e n ir h a p p e n e d " > V f h e n d i d i t h a p p e n ? < / i a b e l > < i n o u c t y p e = " t e x t " i d = " w h e n i t h a p p e n e d " n a m e w h e n i t h a p p e n e d " /> < t < l a b e l f o r = " h o w lo n g " > H o w l o n g w e r e y o u g o n e ? < / I a b e l > < i n p u t t y p e = " t e x t " i d = " h o w l o r . g " n a r a e = " h o w lo n g " / x b r /> < l a b e l f o r = " h o w m a n y " >How many d i d y ou s e e ? < / l a b e l > * < i n p u t t y p e = ' , t e x t " id = " h o w m a n y " narae="how m any" / x b r /> < i a b e 1 f o r ,,a l i e n d e s c r i p t i o n " > D e s c r i b e t h e m :< / la b e l> < in p u t t y p e " t e x t " i d = " a l i e n d e s c r i p t i o n " nam e="a1 i e n d e s c r i p t i o n " s i z e < l a b e l f o r "w h a tth e y d id " > W h a t d id th e y do t o y o u ? < / la b e i> < in p u r t y p e " t e x t " i d ^ 'w h a t t h e y d i d n a m e " w h a tth e y d id " s i z e - " 3 2 " / x b r c l a b e l f o r = " f a n g s p o t t e d >Have y ou s e e n my dog F a n g ? < / l v S ^ l > Yes < In p u t i d - " f a n g s p o t t e d n a m e = "fa n g sp o tte d " t y p e - " r a d i^ L v a lu e " y e s No < i n p u t i d " f a n g s p o t t e d " n a m e = " f a n g s p o t t e d " t y p e - " r a d i o " % l u e = " n o " < im g a r c - " f a n g . j p g " w i d t h " 1 0 0 " h e i g h t " 1 7 5 " a l t = " M y a b d u c t e d d o g F a n g . " / x b r /> < l a b e l fo r " o t h e r " > A n y th in g e l s e you w ant t o a d d ? < / ia b e i> < t e x t a r e a i d = " o t h e r " n a m e " o t h e r " X / 1 e x t a r e a > < b r /> < i n p u t t y p e = " s u b m i t " vaA ue= R e p o r t A b d u c t io n " n a m e " s u b m it" < / fo r m > </body> < / h tm l> __ N. x.

Az egyes SrlapmezVhz tartoz < in p t> ele jelentik a kulcsot ahhoz, hogy a PHP hozzfrjen az urlapadatokhoz.

/>

report.html

rd meg a PHP-kdot. am ely ltrehozza a hinyz rlapadatokat trol ngy vltozt: $name, $how_many, $ w h a t_ th e y _ d id s $ o th e r . Tipp: gy hozd ltre a Sname vltozt, hogy a felhasznl teljes nevt trolja

38

1. fejezet

Keltsd letre a statikus oldalakat!

A munkd ezzel mg nem rt vget. A megerst weboldalnak, amelyet a PHP-parancsfjl ltrehoz, fel is kell hasznlnia ezeket az j vltozkat, hogy tovbbi informcikat jelentsen meg az idegenekrl.

Innen el kell ju tn o d ...

Aliens Abducted Me - j

...id e ! Figyeld meg, mennyivel tbb informci jelenik meg.

Aliens Abducted M e - Report an Abduction


You were abductcd last November and were gone for 11 hour* Describe them; liale green men Was Fang there? no Your email address is alfni8thcyrcallgrccn.com

Aliens Abducted Me - Report an Abduction


Thanks for submitting die form. You weic abductcd last November and were gone for 11 hours Number of aliens: dozens D escribe them: Uaic green men The aliens did this: aiked me about UFO regulations Was Fang there? no Other comments: Please vote for me Your email address is alfn(Stheyreallgrccn.com

* m u . '" " / T - S a megersts oldal, de


a k I i9 1 *

U" i ^ esz Owennek az elrablsrl.


A $name kivtelvel az imnt ltrehozott valamennyi vltozt felhasznlva fe jezd be a hinyz kdot, amely informcidsabb megerst oldalt llt el:
ech o e ch o e ch o 'T h an k s f o r s u b m itt in g th e f o r m .c b r / > ; You w ere a b d u c te d ' and w ere gone f o r ' . $ w h e n _ it_ h a p p e n e d ; . $h ow _lon g . '< b r / > ' ;

e ch o

' D e s c r ib e th em :

f . $ a lie n _ d e s c rip tio n

'< b r / > * ;

e ch o

'Was Fan g t h e r e ?

1 . $ fa n g _ s p o tte d

<br / > * ;

e ch o

'Y o u r e m a il a d d r e s s i s

. $ e m a il;

most itt vagy 39

owen javtott php-parancsfjlja

Hegyezd ki a ceruzd! Megolds


O w en Elraboltak az idegenek" rlapjn vannak olyan adatok is, am elyeket jelenleg nem hasznlunk. Ne feledd azonban, hogy ezek az adatok is olyan ltfontossg in form cikat tartalmaznak az idegenekrl, am elyek elve zethetik O w ent az elveszett kutyjhoz, Agyarhoz. Ezrt minden adatot ki kell nyerned az rlaprl, s PHP-vltozkban kell trolnod azokat.

Aliens Abducted Me - Report an Abduction


Share your story of alien abduction:
H r s t n am e: L a s i n am e:
*r>$th<yreajigreen.com
last November

A report.php parancsfjl jelenleg figyelmen kvl hagy t klnbz urlapadatot is. Megdbbent'!

When did u'feappen? How long w e r t W j gone?


How many did yoii.se** -------

Describe them:

Itttie green m *n

W hat dkJ they do to you?- my dog Vang?


V ww

s td * fefljSonT ^sk *t*> fQ


Y es G NcTST---------------------

ctorra method "pose" action-"report.php"> clabel for-"firstname">First naroe:C/label> > Cinput type="text id="firstname" name*"firstname / x b r / clabel for-^lastname^Last name:c/label> cinput type="nextn id*"lastname" name"lastname" /><br /> <label for-,eJnail,>What is your email address?c/label> , , cinput type"text" id "email" narae="email" /><br / > <Iabel for"whenithappened">When did it happen?</Iabel> >> cinput type="tcxt" id-"whenithappened" name "whenithappened / < <label for"howlong">How long were you gone?</label> A n y th in g e lse y o u w an t cinput type"text" ia="howlongn name -"howlong" />cbr /> ( RprtA d n n 1 e o fa u io clabel for-"howmany">How many did you see?c/label> cinput type"text" id=,howmany" name=*nhowmany" /xbr /> r clabel for""aliendescripton">Desc3cibe thera:c/label> cinput type"text" id="aliendescription" name="aliendescript ion" s i z e " 3 2 " / > c b r /> clabel for="what theydid">Wh at did they do to you?c/label> cinput type"text" id-"what theydid" name=Mwhattheydid" size=".')2 clabel for="fangspotted">Have you seen my - o Fang?c/i lg Yes cinput id="fangspotted" name-"fangspotted" type "r No cinput id="fangspotted" name "fangspotted type^"radio" cimg src="fang.jpg" width="i00" height="175" ait="My abducted dog Fang." /Xbr /> clabel or="other">Anything else you want to add?c/iabel> ctextarea id="other" name="other">c/txtareaXbr /> cinput type"submit" value="Report Abduction" name"submit" /> c/form> ' </body> c/html>

to add '

Az egyes rlapmezkhoz tartoz < input > elemek jelentik a kulcsot ahhoz, hogy a PHP hozzfrjen az urlapadatokhoz.

A kereszt-1
rd meg a PHP-kdot, am ely ltrehozza a hinyz rlapadatokat trol ngy vltozt: $name, $how_many, $ w h a t_ th e y _ d id s $ o th e r . Tipp: jgy hozd ltre a $name vltozt, hogy a felhasznl teljes nevt trolja.

report.html

vezefkne! ez a szk I

v la s z ja e l l
A pont karakter lehetv teszi, hogy egyetlen karakterlncc fzz ssze tbb szvegrszletet. Ezt az eljrst sszegzsnek, idegen szval konkatencinak hvjk. fna> f POSTT'-fVstxame'] . 1
...................

^ 7 .......

ttfj? J?y .77 f_PSTClKo'wmanyi]; . fwha ihey did = /_P02Trwh a tiK eydicl'1
.

L P O S i r o t h e r ^ ...............................................................

40

7. fejezet

Keltsd letre a statikus oldalakat!

A munkd ezzel mg nem rt vget. A megerst weboldalnak, amelyet a PHP-parancsfjl ltrehoz, fel is kell hasznlnia ezeket az j vltozkat, hogy tovbbi informcikat jelentsen meg az idegenekrl.

Innen el kell ju tn o d ...


s

-Report ars Abtucton

...id e i Figyeld meg, mennyivel tbb informci jelenik meg.


I ~ ^

Aliens Abducted M e - Report an Abduction


You were abducied last November and were gone for 11 hour. Describe them: littic green men Was Fang there? no Y our email address is alln thcyrcaUgn.-en.com

}
A lie ti A b d JC W d M e - R e p o r n

Aliens Abducted Me - Report an Abduction


Thanks for submitting the form Y ou were abducted last November and were gone for 11 hours Number o f aliens: dozens Describe them; liuie green men The aliens did this: asked me about U FO regulations Was Fang there? no Other comments: Please vote for me. Your email addicss is aifh@thevicaUgrecn.com

ft felhasznl . . . .

, m SsH .M ai., i * k skb


desi 0 n n l
s

B i b t ! *

UaMascal

$name kivtelvel az imnt ltrehozott valamennyi vltozt felhasznlva fejezd be a hinyz kdot, amely informcidsabb megerst oldalt llt el:
A

A <br />

elemek

az informcik formz st segtik - ne felejtsd


el, hogy PHP-vel hozunk ltre HTML-t.

A bn9szben az echo paranccsal rathatsz ki HTML-tartalomknt to vbbi informcikat.

e ch o e ch o ech o

Thanks f o r s u b m itt in g th e f o r m .c b r / > ; 'Y ou w ere a b d u c te d 1 and w ere gone f o r . $ w h e n _ it_ h a p p e n e d ; 1 . $h ow _lon g . ^ .

1< b r / > * ;

tt\\0 'N u m b e r o-f al iens: ' . f K o w _ m a n y '< b jr / > ]

Itt ismt pontok segtsgvel fznk ssze karakterlncokat s vltozkat.

ech o

'D e s c r i b e th em :

. $ a lie n _ d e s c rip tio n

<br / > ;

ho 'T h e aliens d id th is ; 1 . J w K a t jt h c y _d id ; . '< b r / > y ech o 'Was F an g tr^er e ? ' . $ fa n g _ s p o tte d . 1< b r / > ;

ho 'M K c r e ch o

' . f ? t h e r . v< b r ( > j ' . $ e m a il;

'Y o u r e m a il a d d r e s s i s

most itt vagy

41

teszteld owen php-parancsfjijt!

Tesztt
Mdostsd Owen parancsfjljt, s teszteld a vltoztatsok mkdst!
Add az j vltozkat ltrehoz kdot a r e p o r t .php-hez a vltozkat a bngszben HTML-knt for mzva kir kddal egytt, majd tltsd fel a parancsfjlt a w ebkiszolglra, nyisd meg a r e p o r t . htm l oldalt a bngszdben, tltsd ki az rlapot az idegenekkel kapcsolatos adatokkal, vgl pedig kattints a Report Abduction gom bra az rlap benyjtshoz, s nzd meg az eredmnyt.

Nincsenek

hlye krdsek
! Valjban mi trtnik, amikor pontokkal tbb karakterlncot f zk ssze?
! Az sszetzs sorn tbb karakterlncbl egyetlen, telje sen j karakterlnc jn ltre. A karakterlncok sszegz snek mindig egyeen karakterlnc a vgeredmnye, fg getlenl attl, hogy hny karakterlncot hasznltunk fel. .Amikor teht egy ech o parancs rszeknt karakterlnco kat fzl ssze, a PHP elszr egybefzi a karakterlnco kat. majd ezt az j karakterlncot rja ki a bngszben.

I C i Ok, de pontosan hogyan alaktja a kiszolgl HTML- s CSS# kdd a PHP-kdot?


! Elszr is, emlkezz vissza, hogy a PHP-parancsfjlok alaprtelmezs szerint HTML-kdnak tekintendk. A PHP-programok kdjt a <?php s ?> cmkk azono stjk, amelyeket ltva a kiszolgl tudja, hogy a kztk tallhat kdot PHP-knt kell futtatnia, a cmkken kvl es sszes kdot pedig HTML-knt kell tadnia a bng sznek.

! Ha egy vltozt s egy karakterlncot szeretnnk sszefzni, a vltoznak szveget kell tartalmaznia?
! Nem. Br az sszefzs mindig karakterlncot eredm nyez, ahhoz, hogy vltozkat fzz ssze, a vltozknak nem felttlenl kell karakterlncot tartalmazniuk. Ha a vltoz mondjuk egy szmot tartalmaz, a PHP el szr karakterlncc alaktja a szmot, s ezt kveten vgzi el az sszefzst.

I C ! Rendben. De ez mg mindig nem magyarzza meg, hogy a PHP'r j kd hogyan alakul HTML/CSS-kdd. Azt mi hajtja vgre? V ! Itt lp be a kpbe az ech o parancs. Az e ch o parancsra gondolj gy, mint ami informcit r ki a <?php s ?> cmkk keretei kz zrva. Teht az e ch o parancs
a kulcs, ami kpess teszi a PHP-t arra, hogy dinamiku san llthasson el HTML/CSS-kdot. Azzal, hogy szve ges karakterlncokat fzhetsz ssze PHP-vltozk segt sgvel, menet kzben pthetsz fel HTML-kdot. amit aztn az ech o paranccsal kirathatsz az eredmnyknt kapott weboldalra a bngszben. Erre remek plda Owen r e p o r t .php parancsfjlja, ahol egy < br /> cmkt ragasztottunk egy szvegsor vgre, hogy* j sn 1 kezdjnk a HTML-oldalon. I

! Mi trtnik a PHP-kddal a bngszben?


! Semmi, mivel a PHP-kdokat a bngsz sohasem ltja. A PHP-kd mindig a kiszolgln fut, s HTML-kdd alakul, mieltt a bngszhz kerlne. A bngsz teht egyltaln nem is tud a PHP ltezsrl - a weboldalak hozz tiszta HTML-knt s CSS-knt rkeznek meg.

42

1. fejezet

Keltsd letre a statikus oldalakat!

A meqer eft o ld al h a s z n o s a fel h a szn l n a k, de nkm nem elg. En to v b b ra is a z t s ze re tn m , hogy az rla p a d a to k e-m ailben ju s s a n a k e\ hozzm .

A PHP-parancsfjlnak tovbbra is e-mailben kell elkldenie az rlapadatokat Owennek.


Jelen llapotban a r e p o r t .php parancsfjl kiolvassa az adatokat az Elraboltak az idegenek" rlaprl, s egy m egerst w eboldalt hoz ltre a felhasznl szm ra. Ez azonban mg nem oldja meg az eredeti problm t, miszerint az rlap b e nyjtsakor elektronikus levelet kell kldened O w ennek. O w en csak egy egyszer, szveges e-mailt szeretne kapni, ami valahogy gy fest:
Alf Nader was abducted last November and was gone for 11#hours.
1

Number o f aliens: dozens Alien description: little green men

Alf Uadcr elrablsnak Ideje, Ennyf Ideig volt tvol: 1 ra. 1 Hny

mlt november.

Ez a levl a megerst Weboldalhoz hasonlan statikus szveg s urlapadatok kombi ncijbl ll.

What they did: asked me about U F O regulations


s

Fang spotted: no O ther comments: Please vote for me.

Idegent l to tt: tdbb tu ca tot. A z Idegenek lersa: ki zld emberek. M it tettek: kikrdeztk az UFO-zablyzatot. L tta A gyart: nem. Egyb megjegyzsek: Szavazz rml

A fenti levelet gy llthatod el PHP-kddal, hogy sszeraksz egy karakterlncol, am ely az olyan statikus szvegrszeket, mint az "O th e r com m ents: " (Egyb m egjegyzsek) fzi ssze az rlapm ezk vltozkban trolt adataival.

rd le, hogyan raknd ssze egy e-mail karakterlnct statikus szvegbl s PHP-vltozkbl!

most itt vagy 43

az zenettrzs felptse a php-ben

Az e-mail zenettrzsnek ltrehozsa a PHP segtsgvel


Mr lttad, hogyan fzhetsz ssze tbb karakterlncot pontok segtsgvel egyetlen karakterlncc a PHP-kdban. Most ismt az sszetzst kell hasznlnod, hogy felptsd az e-mail zenettrzsnek karakterlnct a statikus sz vegben elszrt vltozk segtsgvel. A legtbb szvegszerkeszt' auto

A vltozkat s a statikus sz vegrszeket pontokkal fzheted ssze egyetlen karakterlnec a levl trzsben.

matikusan a kvetkez sorba tri a kdot, mg ha magad nem is adsz meg sortrst.

:. iT_happened . [and was gon^ f o r . 'Number o f a l i e n s : . $how maiM . ' Al i e n d e s c r i p t i o n :


$vh a t_ they_di d . 'Fang spotted:

Iona . * . '
. ' .. ~y --

. $ a l i ^ d e s c rip tio n

' . $fang_spotted . 'Other c o m m e n t ^ ' . $othe

Az ilyen hossz karakterlncok felptsvel kapcsolatban az az egyik prob lma, hogy a PHP-kdsor igen hossz, s ezrt nehezen olvashat s tte kinthet lesz. A PHP-kdot azonban tbb sorra is trdelheted, hogy knynyebben kvethetv tedd. Csak arra kell vigyznod, hogy a kdot olyan he lyeken vlaszd szt, ahol a szkzk nem szmtanak, pldul kt sszef ztt karakterlnc kztt, nem egy karakterlnc kzepn. Vgl az utols kd sor vgre egy pontosvesszt kell tenned, ami lezrja a PHP-utastst.

ho9y minden vltoz

W - H Y olyan szveg karakterZ J ar01' $ m ly e t 3 RePrf Abduction frlaprl 0iVasfunk ^

Ez valjban egyetlen bossz kdsor,

&
$msg = -$name

amit tbb sorra trdeltnk.


1 was abducted . ' . Shovmany . ' . $alien_description

n_it_happened .

' and was gone fo r

I 1

'Number of aliens: 'Alien description: 'What they 'Fang spotted:


1

A kdsort krltekinten kell felbon tanod, hogy a sortrsek ne a karak terlncok kzepre essenek.

.SBBBBBBBBIBI * $ i a n p o I t ed .

'Other comments:

Az utastst tovbbra is egy pontosvesszvel kell lezrnod.

Amikor egy PHP

kosn t b b sorra
szoktk hzni az kt, hogy jobban bogy mely sorok

kdsort szndfrdelnek, be

e/so utni soro zathat legyen,


tartoznak ssze

Egy hossz PHP-kdsor tbb sort is tfoghat, ha gyelsz arra, hogy miknt bontod fel a kdot.

3 kdban.

44

7. fejezet

Keltsd letre a statikus oldalakat!

Ez a PHP-kd elg c s in o s , de fo r m z s nlkl nem lesz a szveg egyetlen nag y k a ty v a s z a z e-m ailben?
O

De igen. Az, hogy szpen elrendezed a PHP-kdot, mg nem jelenti azt, hogy a kimenet is automatikusan jl fog kinzni.
A PHP-kd elrendezse, hogy te jobban tlsd a kdot, egszen ms, mint a fel hasznlk ltal ltott kim enet formzsa. A PHP-kdok kim enetnek formzsra ltalban HTML-elemeket hasznlnak, mivel a PHP-t a legtbb esetben w eboldalak dinamikus ltrehozsra hasznljk. Iti azonban nem ez a cl. Neked egy e-mailt kell ltrehoznod, ami sima szvegbl s nem HTML-bl ll. Azt a problm t kell m egoldanod, hogy az zenet jelenleg gy nz ki:

A lf Nader was abducted last November and was gone for 11 hours. Number of aliens: dozensAlien description: lin k green m enW hat they did: asked me about U F O regulationslang spotted: noOther comments: Please vote for me.

A! Owen NEM ilyen levelet szeretne kapni az idegenekrl

Nincsenek

hlye krdsek
Van r md, hogy HTML-formzst hasznljak egy PHPparancsfjlbl kldtt levlben?
Van, de ehhez mg egy lpst vgre kell hajtanod: be kell lltanod a tartalomtpust m eghatroz fejlcet az zenetben. A fejlcek s a tartalomtpusok nmileg tlmutatnak enn ek a knyvnek a keretein - ezrt is ra gaszkodunk ahhoz, hogy az O w ennek kldtt vlaszok sima szveges e-m ailek legyenek. A fejlcekrl ugyan akkor bvebben is sz lesz a 6. fejezetben, gyhogy k sbb m egszerezheted a tudst, ami a HTML-levelek k sztshez szksges.

Agytorna
Hogyan formznd jra a sima sz veges e-mailt, hogy knnyebben ol vashat legyen?

most itt vagy

45

szvegformzs a php segtsgvel

Mg a sima szveg is formzhat...egy kicsit


Mivel O w ennek sima szvegknt, HTML-formzs nlkl kell levelet kldennk, nem szrhatsz b e egyszeren < br /> cm kket, hogy tbb sorra trdeld a szveget, ahol sszecsszik. jsor karaktereket azonban igenis hasznlhatsz, ha \n form ban levded azokat. Ahol teht \n szerepel az e-mail szvegben, oda egy sortrs kerl, teht az utna kvetkez tartalom j sorban fog kezddni. gy nz ki az e-mail m do stott kdja az jsor karakterekkel:

A vdokarakterek a PHP-ben egy for dtott perjellel ( \ ) kezddnek.

A levlben az \ n kddal he lyezhetsz el jsor karaktereket.


-----------

$msg * $name . r was abducted 'Number of aliens: 'Alien description: 'What they did: 'Fang spotted:

$vhen it happened . ' and was gone for . . '\

$how_long . '.\n'

' . $how_rnapy . Y\ n '

1 . $a1ien_descriVtion

' . $what they did . '\nf . ' . $fang_spotted . 1\n* ' . $other; .

'Other comments:

Az jsor karakterek j t letnek t n n e k...csa k kr, hogy a kd nem mkdik.

^ f Nader was abducted lastNovem ber and was gone for 1 1 hours, lumber oi aliens: dozen(\n)Uien description: littJcjrreen men vliat they did: asked m e about U F O regulation(\nfang spotted: n<^nf)ther comments: Please vote for me.

h \n is megieleniU

beft,
U b x

k r 1
f! lM I

..

Nincsenek

hlye krdsek
K i Pontosan mi is az a vdkarakter?

V \ A vdkarakter (escape character) olyan karakter, amelyet nehz berni, vagy valamilyen zavart okozhat a PHP-

kdban. A HTML-bl mr ismersek lehetnek a vdkarakterek, de ott egy kicsit mskpp nznek ki: a copy right" jelet pldul az &# 1 6 9 ; vagy az & copy; azonostja. A PHP-ben a vdkaraktereknek csak egy kis halma za tallhat, s olyan dolgokat lehet kirni velk, amelyeket sszekeverhetnnk magnak a PHP nyelvnek az egyes elemeivel: pldul aposztrfokat (\ '), idzjeleket (\ "), vagy termszetesen jsor karaktereket (\n).
1. fejezet

46

Keltsd letre a statikus oldalakat!

Az jsor karaktereket ketts idzjelek kz kell zrni


Owen kdjval az a gond, hogy a PHP mskpp kezeli a karakterlncokat, attl fggen, hogy aposztrfok vagy (ketts) idzjelek kztt llnak. Pontosabban, az jsor karaktereket (\ n ) csak ketts idzjelekkel lehet levdeni, ezrt az Abduction Report levelet ilyen idzjelek kz zrt karakterlncokkal kell fel pteni, hogy a sortrsek mkdjenek. Az egyszeres s ktszeres idzjelek klnbsgnl azonban tbbrl van sz. Az egyszeres idzjelek (aposztrfok) kz zrt karakterlncok nyers szvegnek szmtanak, mg a PHP a ketts id zjelek kztt ll karakterlncokat feldolgozva vltozkat keres. Ha egy ketts idzjelek kztt ll karakterlncban vltozt tall, a PHP beszrja annak rt kt a karakterlncba, mintha karakterlncokat fztnk volna ssze. Teht a ket ts idzjelek kz zrt karakterlncok nem csak szksgesek ahhoz, hogy az e-m ailben mkdjenek az jsor karakterek, hanem a segtsgkkel egyszer sthetjk is a kdot a vltozk kzvetlen beszrsval a karakterlncba.

sszetzsre mr nincs szk eg, m e rta vltozkra W z w H w a , ^ kozhatunk e,y ketts idzjelek kze

zrt karakterbl.

$msg = M $name w as a b d u c te d $ w h e n _ it_ h a p p e n e d and was gone f o r $ h o w _ lo n g .\ n " "Number o f a l i e n s : "A lie n d e s c r i p t i o n : "W hat th e y d i d : "F a n g s p o t t e d : $how_many\n" . Az jsor karaktereket a ketts idz$ w h a t_ th e y _ d id \ n ", $ f a n g _ s p o tt e d \ n " $ o th e r"; . jelek kz zrt karakterlncnak k sznheten most mr helyesen rtel mezi a PHP. Az zenetet azonban tovbbra is tbb sszefztt karakterlnera keit bontani, hogy a kd knnyebben olvashat legyen.

$ a lie n _ d e s c rip tio n \ n "

" O th e r com m ents:

ST:

6 l.avan nincs szksg jsor karakterre,

Nincsenek

hlye krdsek Ha ketts idzjelek kz zrt K: dig amirt hasznltunk tbbnyire karakterlncok ilyen klasszak, ed V: aposztrfos karakterlncokat? V:
Ne feledd, hogy a PHP semmilyen mdon nem dolgozza fel az aposztrfok kz zrt karakterlncokat, ami akkor ide lis, ha olyan karakterlncokkal dolgozunk, amelyek begya zott vltozkat nem. csak sima szveget tartalmaznak. Aposztrfos karakterlncokat teht tovbbra is hasznlni fo gunk a knyvben, hacsak nincs r j okunk, hogy inkbb ketts idzjelek kztt ll karakterlncokat alkalmaz zunk. A ktfle idzjel hasznlatval kapcsolatban azon ban az a legfontosabb, hogy kvetkezetesek maradjunk.

Ilyen esetben veheted j hasznt a vdkaraktereknek. Ha egy aposztrfos karakterlncon bell aposztrfot sze retnl rni, csak annyi a dolgod, hogy \ ' formban levded, pldul gy: ' He\ ' s l o s t ! ' . Ugyanez vonatkozik a ketts idzjelek kztti karakterlncokban szerepl id zjelekre is - ezek esetl>en a \ " vdkaraktert hasznlha tod. Ha viszont a ktfle idzjel nem tkzik - pldul ha egy aposztrfot rsz egy ketts idzjelek kz zrt karak terlncba nem kell levdened ket: "He ' s l o s t !

K:

K: Vagyis az aposztrfos karakterlncokban a \ ' hasznlhat, V:

Mi trtnik, ha egy aposztrfos karakterlncon bell kell hasznl nom egy aposztrfot, pldul ha olyasmit akarok rni, hogy 'He's l o s t ! ' ?

az \ n viszont nem. Honnan tudhatom, hogy milyen vdkarakte rek hasznlhatk az aposztrfok kztt?

Az aposztrfok kz zrt karakterlncok csak a \ ' s \ \ vdkaraktereket engedlyezik - minden ms vdkarak tert csak ketts idzjelek kztt ll karakterlncokban hasznlhatsz.

m ost itt vagy >

47

lltsd ssze O w en levelt!

Owen levelnek sszelltsa


Az e-mail trzst mr ellltottad egy karakterlncknt, gyhogy tovbblphetsz, hogy sszelltsd O w en levelnek tbbi rszt. Az e-m ailek nem csak egy zenettrzsbl llnak - szm os rszk van. Ezek kzl egyesek nem ktele zek, de az albbiak lnyegben minden elektronikus levlben szerepelnek:

Ez mr megvan f

O Ai zonot trzoo.
e:

........... Ide barmi jhet; ez

Btsjt|1M

az e-mail trgya-

/y felhasznl
/

Az zenet trgya,

knt Owen leveleskent uwen ldjban.

e-ma\l cme.

A kld e-mail cme (kitl jn a levl: FROM)^..__^ 0 A cmzett e-mail cme (ki kapja a levelet: TO).
O w en rem nyei szerint egy ehhez hasonl levelet fog kapni, am ikor valaki kitlti az idegenekkel kapcsolatos elrablsbejelent rlapot:

Owen e-m ail cme

Ez lehet statikus
h a felhasznl e-m ail

tsr- A ftW

karakterlnc.'
Q Aliens ^ a ^ a in,

Vus VaraV\er\anc.

c,me, amelyet mr e/raktroztunk 3z $emai/


vltozban.

Abduction Report
-----------

T a te .

sssrA "
October 1 . 2 0 0 8 1 2 0 7 2 0 PM CDT

To: owen@ahensabductedme.com

M Nader was abducted las. November and was gone tor 11 hours.
Number of aliens: dozens

S S S S S S X
Fang spotted: no

S S io m

--

Other comments: Please vote for m .

Az zenet trzst mr telep tet* 9Y ^ " l n c c a l , amelyet az $msg vltoz trol.

Ez a levlminta mutatja, hogy a tartalom nagy' rsze az zenet trzsben tallhat, am elyet mr
befejeztnk. Csak annyi van htra, hogy megadjuk a levl trgyt, a felad, illetve a cm zett e-mail cm t... s hogy - term szetesen - a PHP segtsgvel tnylegesen elkldjk a levelet.

48

1. fejezet

Keltsd letre a statikus oldalakat!

Az e-mail rszeit vltozk troljk


Megvan teht az zenet trzse, am elyet az $msg vltoz trol, de mg hinyzik a levl tr gya, valamint a felad, illetve a cmzett e-mail cm e. A trgyat s a cm zettet megadhatod egyszeren statikus szvegknt kt j vltozban, a felad e-mail cm t pedig a korbban megrt rlapkezel kdnak ksznheten mr trolja az $ e m a il vltoz.

$ to

= 'owengaliensabductedme.com'

O
-

Aliens Abducted

- Abduction Report

In b o x

_ ---------------------- -----------------------------------------------------------------------------------------------------------------

'

From : alfnth0 yreallgreen.com Allens Abducted Me - Abduction Report Date: October 1 . 2008 12.07:20 PM C Q T To: ow en aliensaixluctedm ecom ^l M r ------

**

Alf Nader was abducted last November and was gone for 11 hours. Number of aliens: dozens Alien description: little green men What they did: asked me about UFO regulations Fang spotted no Other comments: Please vote tor me. ^
^

x ^

was gone for $how long.\n "Number of aliens: "Alien description: "What they did: $how many\n" $alien description

$what they_did\n"

Minden informcit sszegyjtttnk, s kszen llunk a levl elkldsre!

O Az zenet tresp Az zenet trgya-Q

A kld o mail cme (FROM f

O A 'cmzett o mail cme (TO).


most itt vagy

49

a levl elkldse a php segtsgvel

E-mail kldse a PHP segtsgvel


Kszen llsz lehl arra, hogy megrd a PHP-kdot, ami tnylegesen el kldi az e-mailt O w ennek. Ehhez a PHP beptett m a i l ( ) fggvnyre lesz szksged, ami a neki tadott inform cik alapjn kld zenetet.

A PHP m ail() fggvnye e-m ailt kld egy parancsfjlbl.

A cmzett e-mail cme- ^

A level trgya

mail($to, $subject, $msg);


Az zenet trzse
A mai 1 ( ) fggvnynek hrom informcira van szksge, am iket mindig meg kell adni. A felad e-mail cm t nem ktelez, de nem rt, ha azt is belefoglalod. Alihoz, hogy a m a il ( ) fggvny m eghvsakor megadhasd a from" mezt, egy fggvnyparamteri kell hasznlnod, valamint karakterlnc-sszefzst kell vgezned. ^ ^ fgtajyB<&

tozsakor

a 'From:' eltagot.

mail($to, $subject, $msg,


W

ismt egy pontot hasznaihatsz.


S to * ovren8alien3aiy3ucSfecln>g corc 1 ;

Nincsenek
Ffchow l o n g A n "

$u b 3> c ^ -

ALle n a A bd u cted Me - A b d u c tio n R e p o r t * ;

hlye krdsek
K : A felad e-mail cmn kvl van brmi

"K uraber o f a i l i s t
'A l i e n

how jaanyV nM .

d e s c r ip tio n : $ a lie n _ a e * c c ip tlo a X n " .

"W hat t h e y d L d : 5 v h a t _ t h e y _ d id \ n " " Fang s p o t t e d : S ia n g _ s p o tte d \ n " .

"O th*r c o o s w in ts i S c t h e r 1 ; *

V:

ms, amit meg lehet adni egy levl r szeknt?


igen. A feladhoz (from) hason lan azoknak a cmt is megadha tod, akiknek msolatot (copy) vagy titkos msolatot (blind copyv) szeretnl kldeni - ehhez csak annyi szksges, hogy a * F r o m : helyre Cc : -t vagy 1Bee : '-l rj. Ha feladt s msolatcmzettet is meg akarsz adni, egy kocsivissza-jsor karakterpr ral kell elvlasztanod ket, az alb bi formban (\ r\ n ):

A III)

1 lM il rszt vltozk adjk meg.

% n i , kf v d h r*kter em h ufn!

"From :" . $from . "\r\nCc: " . $cc Itt ketts idzjelekre van szksg, mert

50

1. fejezet

az \ r s az \n vdlcaraktereket hasznalod.

Keltsd letre a statikus oldalakat!

Ve hogyan kell h a szn ln i a m allQ f g g v n y t? O

Egyszeren add a mail()-t meghv kdot a parancsfjlhoz.


Csak egy a m a il (> fggvnyt meghv kdsorra van szksg az e-mail elkld shez. Gondoskodj rla, hogy ez a kdsor az e-mail vltozit ltrehoz kd utn lljon a parancsfjlban, s minden rendben lesz. m e Owen r e p o r t.p h p pa rancsfjljnak teljes kdja, a m a il () fggvnyhvssal egytt:

<html> <head> <title>Aliens Abducted Me - Report an Abduction</title> </head> <body> <h2>Aliens Abducted Me - Report an Abduction</h2> <?php $name = $JPOST('firstname' . ' ' . $_P05T['lastname']; ] $when_it_happened $_?OST['whenithappened1);

H l*

,051 k tW '

$how_long -

$ _ P O S T [ howiong *]; *

ti* *

$how_many $^POST['howmany*]; $aiien_description $ POST [a . endescription* ]; li $what_they_did = $_POST['whattheydid']; 3 fong_spotted = $_POSTI'fangspotted'); $email = $_POST['email']; Sother = $ POST[ 'other);
$ t o = 'o w e n S a l ie n 5a b d u c te d in e .c o m ;

Ne felejtsd el ezt az email cmet a sajtodra vltoztatni, hogy kipr blhasd a parancsfjlt.

W kldjk el
az e-m ailt.
(

$subject = 'Aliens Abducted Me - Abduction Report'; $msg = "$name was abducted $when_ it_happened and was gone for $how_long.\n" "Number or aliens: $how_many\n" . "Alien description: $alien_description\n" . "What they did: $what_they_did\n" . "Fang spotted: $far.g_ spotted\n" .
*<" h^ ail($tO / S su b jectf Srtt h Smsg, o r " ; ____________ . $ e m a i l ) 7^ 'From :'

Itt rakjuk ssze az Owennek elkldend' klnbz rszeit,

Menet kzben egy HTMLweboldalt lltunk el, amely megersti az rlap sikeres benyjtst.

?>

echo echo echo echo echo echo echo echo echo

'Thanks for submitting the form.cbr />'; levl 'You were abducted ' . $when_it_happened; ' and were gone for ' . $how_long . '<br />'; 'Number of aliens: . $how_many . '<br />'; 'Describe them: ' . $alien_description . '<br />'; The aliens did this: ' . Swhat_they_did . <br />'; 'Was rang there? ' . $fang_spotted . '<br />; 'Other comments: ' . Sother . '<br />'; 'Your email address is ' . $email;

</boay> </html>

report, php

most itt vagy 51

az utols te s z t t

Tesztt
Vgezd el az utols simtsokat Owen parancsfjljn, s prbld ki!
Add hozz a hrom j levlvltozt ( $ t o , $ s u b je e t s $msg), valamint a m a il () fggvny h vst a r e p o r t .php parancsfjlhoz, s gyelj r, hogy a $ t o vltozban a te e-mail cm ed, s ne O w en legyen. Tltsd fel a parancsfjlt a w ebkiszolglra, nyisd meg a bngszdben, s tltsd ki az rlapot az idegenekkel kapcsolatos inform cikkal. Kattints a Report Abduction gombra az rlap benyjtshoz, vrj nhny m sodpercet, majd ellenrizd a leveleslddat, hogy m egrkezett-e az zenet.
0 O Q A *** AbdutmdMg _ T_ ____________ H
____ ____ _ __

Aliens Abducted Me - Report an Abduction


Share yum m y o f aljcr. atxiuctioc:
* M .

Aliens Abducted Me - Report an Abduction


A it

Az rlapadatok formzsa s e-mailben val elkl dse sikerlt!

Ftrrf name: L w name:

Hi09*
WKcnnbcr
11

W lm b jo u r email address? T
Whcfl did It happen? I lo * lunt;
O cscribf ih o n :

Thanks far subnufung tiie form Ynu woe ahdutiod last November ana were p o n e far I ! hocn Numberc f aliens: dozens Detcribe them: IntJe green roca

ton gone?

r.'i.-. nnr
* 0

The ain d dti.aic iea o tUFO rglto les i hs icJ a b u eua i n WasF n tee no a g hr?
Oihcr cocnaentk: Please vote for roc
Y o u r cniail a d d ic t ts atfni'ilicm -angrccn com

H o* ra*n> did >ou *ec?


l*m#

What did U>e> do to 500? B m yoti seen ra j dog Fang?

OMfl " ftbOl? 1

*l4ui4tC*ft

Yc* 0 No

A dinamikusan ell
n c f *v *r f o t m t

lto tt megerst weboldal tovbbra is visszajelzst ad az r lap benyjtsrl.

An) thing rtoeyou want to add?


3rt M fen w

Lehet, hogy be kell lltanod a PHP-t a webkiszolgln, hogy tudja, hogyan kell e-mailt kldeni.

Vigyzat I

Ila a m ail () fggvny nlad nem mkdik, a z lehet a problm a , hogy a levlklds tmogatsa nincs rendesen belltva a PHP-ben. A w w w . p h p . n e t / m a i l cmen nzhetsz utna a rszleteknek, hogy miknt kell belltani a levlkldsi lehetsgeket a webkiszolgln.

52

1. fejezet

Keltsd letre a statikus oldalakat!

Owenhez dlni kezdenek a levelek


O w en nagyon rl, hogy egy w ebes rlapon keresztl m eghzhat inform cikhoz fog jutni az idegenek tevkenysgrl, am elyek kzvetlenl a leveSally, akit lesldjba rkeznek. Most mr nem kell aggdnia, ha azt hallja, hogy valaki n e m r g r a b o l t a k ltta a kutyjt, mert m indenkinek tudni fogja az e-mail cm t, aki kapcsolataz i d e g e n e k . ba lp vele. s ami m g jobb, a szabadidejben tnzheti a kapott vlaszokat.

Alien. Abducted Me - R ep ort , Abduction

Sally kitlti

A < fo r m > elem action jellemzjnek h a t s r a a report.php parancsfjl fe l dolgozza az rlapadatokat.

H r. r*
I MI*M:

y iV mwr sJw **

* ftmf ml I rwm'

A lien* A M uctcd Me Ti*** IsTVMJAJ f htf *.t**! YV M


* . (A M ^

m * + ** f

ka I

TWilm 1 C jr* uA*4 A W* *' > # HO W


V -^ n w t 'O

At r

A PHP-parancsfjl dinamiku
Ez lla ti Ha Ilyen in fo r m c i k a t kapok a z ide g e n e k re , biztosan meg fo g o m ta l ln i A g y a rtl

san elllt egy megerst HTML-oldalt.

A PHP-parancsfjl egy e-m ailt is elk szt, amelyet e l is kld Owennek.

Owen most mr boldog, mert az rlapjn keresztl dlnek hozz az informcik az idegenekrl.

m ost itt vagy 53

levlradat

Owen elveszt nhny levelet


O w enhez teht most mr m egrkeznek a levelek. Ez eddig a j hr. A rossz az, hogy annyi e-mailt kap, hogy alig tudja kvetni. Az elektronikus levelesldja dugig van, s mr trlt is vletlenl nhny levelet. O w ennek jobb mdszerre van szksge az idegenekkel kapcsolatos inform cik trolsra.
Alien Abduct cd Me Report mn Abduction

Aliin Abducted Mc - Report an Abduction


li3*r % metj m m

Ali c m Abducted M c K*port *n Abdoctiou

Aliens Abducted

Abduction -Me - Hrporl au Abduction

Alien* Abducted M e - Report an Abduction

V *r TW fctO tM k r

S _ L
A lkns Abducted M e - Report
ha

Abduction

M r /I*

Ez gy nem lesz j . Nzd e z t a sok \ levelet! Valahogy meg kell oldanom , ) hogy az a d a to k a t akkor kapjam meg amikor szksgem van rjuk. s biz ton sgos helyen kell ta rta n o m <5ket, hogy ne vesztsem el. ____ S

Keltsd letre a statikus oldalakat!

lltsd prba!
Az idegenek irnytjk az agyad? Rzd le ket azzal, hogy prostod az albbi HTML- s PH ?-sszetevket aszerint, hogy mire valk:

HTML

Szoftveralkalmazs weboldalak megtekintsre s az azok kal val interaktv kapcsolattartsra, amely a w ebes kommu nikci gyfloldalaknt mkdik. PHP-parancs, amellyel tartalmat, pldul sima szveget vagy HTML-kdot lehet kiratni. Ezek a cm kk zrjk kzre a PHP-kdokat, hogy a w ebki szolgl tudja, hogy fel kell dolgoznia s futtatnia kell ket. Beptett PHP-tmb, amely olyan adatokat trol, amelyeket a post mdszerrel kldtek el. Programozsi nyelv, amellyel webkiszolgln fut parancs fjlok kszthetk. Minden karakterlncot ezek kz kell zrni.

PHP

webes rlap

bngsz

<?php ? >

vltoz

idzjelek

Szoftveralkalmazs weboldalak tovbbtsra, amely a w ebes kommunikci kiszolgloldalaknt mkdik. Jellnyelv, amellyel a w ebbngszkben megtekintett weboldalak tartalmt s szerkezett lehet lerni. Olyan beptett PHP-vltoz, amelyet minden parancsfjl elrhet. Beviteli mezk gyjtemnye egy weboldalon, amellyel informcik krhetk a felhasznltl. Beptett PHP-fggvny, amely e-mailek kldsre hasznlhat. Trolhely egy7 PHP-parancsfjlban, amely sajt egyedi nvvel s adattpussal rendelkezik. Egyfajta PHP-adattrol, amely tbb informci egyetlen helyen trtn trolst teszi lehetv.

echo

$ POST

webkiszolgl

tmb

szupergloblis

mail()

m ost itt vagy >

55

lltsd prba! - megolds

lltsd prba!
Megolds
Az idegenek irnytjk az agyad? Rzd le ket azzal, hogy prostod az albbi HTML- s PH P-sszetevket aszerint, hogy mire valk:

HTML

Szoftveralkalmazs w eboldalak m egtekintsre s az azok kal val interaktv kapcsolattartsra, amely a w ebes kom m u nikci gyfioldalaknt mkdik. PHP-parancs, amellyel tartalmat, pldul sima szveget vagy HTML-kdot lehet kiratni. Ezek a cm kk zrjk kzre a PHP-kdokat, hogy a w ebki szolgl tudja, hogy fel kell dolgoznia s futtatnia kell ket. Beptett PHP-tmb, am ely olyan adatokat trol, am elyeket a post mdszerrel kldtek el. Programozsi nyelv, amellyel w ebkiszolgln fut parancs fjlok kszthetk. Minden karakterlncot ezek kz kell zrni.

PHP

webes rlap

bngsz

<?php ? >

vltoz

idzjelek

Szoftveralkalmazs w eboldalak tovbbtsra, amely a w ebes kom m unikci kiszolgloldalaknt mkdik. Jellnyelv, amellyel a w ebbn gszkben megtekintett w eboldalak tartalmt s szerkezett lehet lerni. Olyan beptett PHP-vltoz, amelyet minden parancsfjl elrhet. Beviteli m ezk gyjtem nye egy w eboldalon, amellyel inform cik krhetk a felhasznltl. Beptett PHP-fggvny, am ely e-m ailek kldsre hasznlhat. Trolhely egy PH P-parancsfjlban, am ely sajt egyedi nvvel s adattpussal rendelkezik. Egyfajta PHP-adattrol, am ely tbb inform ci egyetlen helyen trtn trolst teszi lehetv.

echo

$ POST

webkiszolgl

tmb

szupergloblis

mail()

56

1 fejezet

Keltsd letre a statikus oldalakat!

PHP & MySQL szerszmoslda


Az 1. fejezetben megtanultad, hogyan foghatod munkra a PHP-t, hogy letre keltse Owen webes rlapjt. Ismteljk t, hogy mi mindent tanultl...

vltoz
Egy-egy adatot trol elem , A PHPb en a vltozk nevnek dollrjellel kell kezddne, ilyen formban: $ v a lto z o _ n e v e .

PHP
Kiszolgloldali parancsnyelv, amely lehetv teszi a w ebol dalak tartalmnak mdostst a kiszolgln, mieltt az oldal az gyflbngszhz kerlne.

Klnleges vltoz, amely rlapadatokat trol.

PHP-parancsfjl
Szvegfjl, amely PHP-kdot tartalmaz bizonyos feladatok elvgzsre a webkiszolgln.

MySQL
Alkalmazs, amelynek segtsg vel adatbzisokban s tblkban trolhatunk adatokat, az infor mcikat pedig az SQL nyelv se gtsgvel szrhatjuk be s nyerhetjk ki.

tmb
Adatszerkezet, amely rtkek hal mazt trolja. Minden rtkhez tartozik egy index (sorszm ), am e lyen keresztl az rtk elrhet.

SQL
Lekrdeznyelv az olyan adatbzis-kezel alkalmaz sok utastsra, mint a MySQL. pk, hanem ltal rtei-

vdkarakter
Olyan karaktert jell a PHP-kdban, am elyet nehz berni, vagy am ely ms kdrszekkel sszet kzsbe kerlhet. Ilyen pldul az \n (jsor karakter).

m ost itt vagy

57

Kapcsolds a MySQL-hez

* Rakd
e kell dugnunk az interw ebet, m ie l tt kapcsoldhatnnk a webhely-konfiguratortorhoz.

A kzelbe nem engedem a webee program jaim nak

Nem rt, ha tudod, hogyan llnak ssze a dolgok, mieltt ptkezni kezdesz. El
ksztened az els Pl IP-parancsfjlodal, s a program jl is mkdik. Az rlapadatok elkldse levlben azonban mr nem elg j m egol ds. Az rlap adatait mentened kell valahogy, hogy megrizhesd, amg szksged nem lesz rjuk, s ha eljn az id, kinyerhesd ket. Az adata id biztonsgos trolsban egy MySQL-adatbzis segthet - ahhoz azonban, hogy ez m kdjn, a PH P-parancsfjlt hozz kell kapcsolni a MySQL-adatbzishoz.

ez egy j fejezet

a levlben elkldtt rlapadatok htulti

Owen PHP-rlapja jl mkdik. Tl j l...


K la s s z ez az j bejelent rlap, de m o s t meg t l sok levelet kapok. Nem tudok annyi k o ffe in t e lfo g y a s z ta n i, hogy mindet el tudjam olvasni, a m in t megrkeznek.

Owen levlkld parancsfjlja nagyszeren mkdtt, amg csak n hny vlaszt kapott, de most mr levelek tmkelege rkezik hozz - sokkal tbb, mint amennyit kezelni tud. I
O w en vletlenl trlt nhny levelet, anlkl, hogy elolvasta volna i ket. Egyes levelek pedig a levlszem t-m appjt duzzasztjk. amelyet soha nem nz meg. Valjban van egy levl, ami nagyon rdekeln, de I jelenleg is eb b en a m appban rejt zik ...O w en n ek egy olyan mdszerre van szksge a levelek trolsra, ami lehetv teszi, hogy akkor olvassa el el az e-m aileket, am ikor van r ideje, s knnyen megtallja az Agyar ral kapcsolatosakat.

Egy kvnl tbb kell ahhoz, hogy Owen lpst tudjon tartani az idegenek kel kapcsolatos le velekkel, amelyek a levelesldjba rkeznek.
elrablsnak Ideje : nappal ezeltt. Ennyi ideig vdr. tvol: 1 nap. Hny Idegent ltott: ngy. A z idegenek lersa: zldek hsr. csppal. M it tettek: Csak beszlgettnk s Jtszottunk egy kutyval l tta Agyart: igen. Egyb megjegyzsek: Lehet, ha* lttam a kutydat. rj nekem
Sally Jor.ee

inbox

Ez az elveszett beje lents emltst tesz egy kutyrl_Owen


pontosan ilyen infor mcikra vgyik.

Ez az, am iben egy MySQL-adatbzis segthet.


Owennek az ilyen leveleket biztons gosan, olyan helyen kell trolnia, ahol vgigbngszheti lcet, htha van bennk valami Agyarrl.

Ha vletlenl nem tudnd, a legtb ben gy ejtik a MySQL-t, hogy m aj-es-kii-el".

60

2 fejezet

kapcsolds a M yS Q L-hez

A MySQL kivlan alkalmas adatok trolsra


O w ennek get szksge van arra. hogy az idegenekkel kapcsolatos bejelentsek adatait ne az elektronikus levelesldjban, hanem valamilyen biztonsgos helyen trolja. Amire szksge van. az egy adatbzis, ami egyfajta csili-vili. ultra-rendszerezett, elektronikus trolszekrny. Mivel az adatbzisokban az inform cik prec zen rendszerezettek, pontosan azt az informcit olvashatod ki bellk, amit sze retnl, s akkor, am ikor akarod. Az adatbzisokat egy klnleges program kezeli, amit adatbzis-kiszolglnak hv nak: esetnkben egy MySQL adatbzis-kiszolgl. Az adatbzis-kiszolglval egy olyan nyelven rintkezhetsz, am elyet az megrt - ez az esetnkben az SQL Az adatbzis-kiszolgl jellem zen egy w ebkiszolglval prban, ugyanazon a kiszolglgpen mkdik, s egyttm kdve olvassk s rjk az adatokat, il letve szolgltatjk a w eboldalakat.
A webkiszolgl feldolgozza a weboldal-krseket, futtatja a PHP-parancsfjlokat, s HTML-tartalmat ad vissza.

A MySQL nvben az SQL" a Structured Query Language [struk turlt lekrdezonyev) rvidtse.

/
A MySQL adatbzis tblkban trolja az adatokat.

Kiszolglgp

Adatok

MySQL-adatbzis

Ugyflbngsz

^ adatbzis-kiszolgl adato kat olvas az adatbzisbl, s adatokat r oda.

M adatbzis mVm a3s ltk foriMjU trim 3 nem


szksgszer.

A MySQL-adatbzisok tblkra (table) oszlanak, am elyek kapcsold adatok sora iknt (row ) s oszlopaiknt (colum n) troljk az informcit. A legtbb w ebalkalmazs egyetlen adatbzis egy vagy tbb tbljt hasznlja, mintha klnb z mappk lennnek egy iratszekrnyben.
Egy MySQL adatbzis-kiszolgl tbb adatbzist is tartalmazhat. Egy adatbzis tbb tblbl llbat.

Az SQL az a lekrdezonyelv, amellyel utastsokat adha tunk egy MySQLHa az idegenekkel kapcsolatos adatokat biztonsgosn, egy MySQL-adatbzisban troljuk, O w en a szmra knyelm es idpontban elem ezheti a bejelentseket, hogy kik vlaszoltak igen-ne 1 az Agyarra vonatkoz krdsre. Csak egy kis SQL-kdra van szksge, s trsaloghat az adatbzis-kiszolglval.

adatbzisnak.

most itt vagy

61

a mysq/ segthet Owennek

Owennek egy MySQL-adatbzisra van szksge


Eldntetett ht: a MySQL-adatbzisok jk, s O w ennek is egy ilyenre van szksge, hogy az idegenekkel kapcsolatos adatokat trolja. Ez utn mdosthatja a r e p o r t . php parancs fjlt, hogy az adatokat ne e-mailben kldje el neki, hanem egy tblban trolja. Az idege nek ltal elraboltaktl beraml adatokat a tbla biztonsgban megrzi, s idt ad Ow en nek, hogy* tfussa kel, s kivlogassa azokat, akik esetleg lttk Agyart. De ne szaladjunk elre - els az adatbzis. Alihoz, hogy ltrehozhass egy MySQL-adatbzist, egy MySQL adatbzis-kiszolglra s egy klnleges szoftvereszkzre van szksg. Ennek az az oka, hogy a webkiszolglktl eltren az adatbzis-kiszolglkkal SQL-parancsok segtsg vel lehet kapcsolatba lpni.

A MySQL-adatbzisok s -tblk ltrehozshoz egy MySQL adatbzis kiszolglval kell kommuniklni.

M indig a z t m ondjk, hogy a z eszkzn m lik, hogy megfelel eredmnyt rjnk el. H onnan tu d h a to m , hogy m ilyen M yS Q Le s z k z t kell h a szn ln o m a z a d a tb z is o k s t b l k l tre h o z s h o z ?

A M y $ C M 6rn1in' e9V olyan pa ranesablak, amely hozzfrst nyjt a parancssorhoz, ahova hatod az SQL-utastsokat.

MySQL-termml

Owennek egy MySQleszkzre van szksge az idegenekkel kapcso latos j adatbzisa, il letve adatbzis-tblja ltrehozshoz.
K I,t e s ik ,
A grafikus phpM yAdm in eszkz
jUiT V

s !< !

! , l B b W M tl t o iW K W

A phpMyAdmin-t
PHP nyelven rtk.

2~~v>r.

s tblkat.

62

2. fejezet

A MySQL-terminl s a phpMyAdmin kett a npszer MySQLeszkzk kzl. Mindkt eszkz lehetv teszi SQL-parancsok ki adst, am elyekkel adatbzisokat s tblkat hozhatsz ltre, adatokat szrhatsz be s jellhetsz ki. s gy tovbb. A phpMyAdmin azonban ennl is tovbb m egy egy lpssel: olyan w ebes alap felletet nyjt, am ely egrkattintsokkal vezrelhet. Egyes w ebtrhelyszolgltatk a phpMyAdmin-t a MySQL-alapszolgltatsuk rszeknt biztostjk, mg a MySQL-terminllal a legtbb MySQL-telepts elrhet.

kapcsolds a M yS Q L-hez

Mieltt a kvetkez oldalra lapoznl, mindenkppen teleptened kell egy MySQL adatbzis-kiszolglt.
O w ennek nem segthetsz MySQL adatbzis-kiszolgl nlkl! Ha mr teleptettl egyet, s mkdik, tovbb olvashatsz. Ha viszont nem, ugorj a 11. fggelkhez, s kvesd az utastsokat a teleptshez. Ha olyan webtrhely-szolgltatst veszel ignybe, ahol a szolgltat MySQL-t is knl, megkrheted ket, hogy telept sk a kiszolglt. A MySQL adatbzis-kiszolglk elrshez szmos informci szksges. Ezekre ksbb is szksg lesz, gyhogy nem rt, ha kiderted ket. Miutn lertad az adatokat, pipld ki az egyes ngyzeteket.

A MySQL-kiszolglm helye (IP-cm vagy llom snv):............................................................ ^ ^ SZ/ 62 a knyv esetleg rossz

| | Az adatbzisban hasznlt felhasznlnevem:.................................... 1 1 |

| Az adatbzisban hasznlt jelszavam :.................................................. ^ ----------kezekbe kerl, nyugodtan rhatod mshov is Minden ngyzetet az adatokat, ki kell piplnod.
Ha minden inform cit m egszereztl a MySQL adatbzis-kiszolglrl, csak annyi van htra, hogy m eg gyzdj rla. hogy a kiszolgl mkdik. Ha sikeresen hozz tudsz frni a MySQL-kiszolglhoz, m eger stskppen pipld ki az albbi ngyzetek egyikt:

A MySQL-terminllal hozz tudok frni a MySQL-kiszolglhoz. | A phpMyAdmin segtsgvel hozz tudok frni a MySQL-kiszolglhoz. A MySQL-kiszolglhoz a kvetkez eszkzzel tudok hozzfrni: Ha egy s ik MySQL-eszkzt t a ^ 7 Iitl, ami mVdik, rd be ide.

Csak az egyik ngyzetet kell kipiplnod.

most itt vagy

>

63

adatbzisok s tblk ltrehozsa a m ysql-ben

MySQL-adatbzis s -tbla ltrehozsa


Egyes MySQL-teleptsek mr eleve tartalmaznak egy adatbzist. Ha a tid nem. akkor ltre kell hoznod egyet a CREATE DATABASE SQL-paranccsal a MySQL-terminlban. Elszr azonban meg kell nyitnod a terminlt egy parancsablakban - ehhez ltalban elg berni a m ysql parancsot. Ha si kerlt belpni a terminlra, ezt onnan lthatod, hogy a kszenlti jel m ysql>-re vltozik. Az idegenekkel kapcsolatos j adatbzis ltrehozshoz rd be a CREATE DATABASE aliendatabase ; parancsot az albbi mdon:
File Edit W in do w Help P h o neH om e

fi MySQL-kiszolgl ltalban vla szol, hogy rtestsen a parancs vg rehajtsnak sikeressgrl.


Mieltt ltrehozhatnd a tblt az adatbzison bell, gondoskodnod kell rla, hogy az j adatbzis legyen kivlasztva. Ehhez ezt a parancsot kell bernod:
US E a 1 iendatabase;
| Fe Edit W in do w Help P honeH om e

Ha a term inlt hasznlod, min den parancs utn pontosvesszt kell tenned.

A tblk ltrehozshoz szksges SQL-kd kicsit bonyolultabb, mivel pontosan meg kell hatroznod, hogy milyen tpus adatot szeretnl az adott tblban trolni. Vizsgljuk meg kzelebbrl a szksges SQLparancsot, mieltt bernnk a terminlba:
CREATE TABLE a l i e n s _ a b d u c t i o n ( firs t_ n a m e v a r c h a r ( 3 0 ) , la s t_ n a m e v a r c h a r ( 3 0 ) , w h e n _ it_ h a p p e n e d v a r c h a r ( 3 0 ) , h ow _lon g v a r c h a r ( 3 0 ) , how_many v a r c h a r ( 3 0 ) , a lie n _ d e s c rip tio n varchar(lOO) w h a t_ th e y _ d id v a r c h a r ( 1 0 0 ) , fa n g _ s p o tte d v a r c h a r ( 1 0 ) , o th e r v a r c h a r (100) , e m a il v a r c h a r ( 50)

Ez egy SQL-parancs, amivel j tblt hozhatsz ltre.

Minden ms rszletes Pimuou

informM m i i , H l * "

fajta adatok trolhatk a tblban.

A MySQL-terminlba bert minden SQL-parancsot pontosvesszvel kell lezrni.

64

2. fejezet

kapcsolds a M ySQ L-hez

Az j tbla ltrehozshoz gpeld be a nagybets CREATE TABI E parancsot a MySQL-terminlba. ( A teljes utasts kdjt megtallod a Weben. a w w w . h e a d f i r s t l a b s . c o m / b o o k s / h f p h p cm en.) Ha sikerl berni az utas tst, mris ltrejn a vadij, a l i e n s _ a b d u c t i o n nev tbla.
| File Edit W in do w Help P h o neH om e

/ MySQt-Vtiszolgl \

Query OK" vlasza jelzi, h o tf a tbla minden problma nlkl ltrejtt.

m y s q l > CREA TE TABLE aliens abdu ct io n first name varchar(30), last name v a r c h a r (30), when it ha ppe n e d varchar(30), h o w l o n g v a r c h a r (30), how m a n y v a r c h a r (30), alien descrip-i on v a r c h a r (100), what they di d v a r c h a r (1O C ) # f.angspotted v a rc ha r (10) , other v ar ch ar (100), email varchar(5C)

);
Query OK, 0 rows a f f e c t e d (0.14 sec)

Ha a te MySQL-vltozatod a w ebes alap phpMyAdmin eszkzt is rendelkezs re bocstja, az adatbzisokat s tblkat grafikus felleten keresztl is elrheted. A phpMyAdmin felletn az adatbzisokat s tblkat egrkattintsokkal hozha tod ltre, de berhatod kzvetlenl is az SQL-parancsokat, pontosan ugyangy, mint a MySQL-terminlban. Kattints az SQL flre a phpMyAdmin-ban. s egy olyan szvegmez trul eld, ami gy viselkedik, mint a MySQL-terminl.
> Database p aliendatabase I p Structure ,8 S Q L] g lE x p o r t | y Search Query Operations |

Ide ugyanazokat a parancsokat rha tod be, mint amiket a MySQL-terminl ba rnl. A vgre hajtsukhoz csak a Go gombra kell kattintanod.

Run S Q L query/queries on database aliendatabase.


CREATE TAEI-E li n s _ - = b d > iC tio n

Database: ^_____________ [ aliendatabase (-) Z\


aliendatabase (-) &

fifst_nan>e v a rc h a r(3 0 ) , l a s t n a o e varch ar (UO) , wher i t_happenerf v a rc h a c(3 0 ) , hov._Iong varchar (3 0 ) , how_tnany v a rch a r(3 0 >, alien_desCC i p t i o n v a rc h a r(1 0 0 ) , what_chey_dlri varchar 1100) , Show mis query here agam

Or
Location of the text file: , grow s .. ; (Max: 8.192KB) Compression, fi Autodetect

tfa bertad az SQLkdot, kattints erre

Q None

Q p ip p e d 3

3 gombra a tbla

Character set of the file: |utt8

ltrehozshoz.

A phpMyAdmin alkalmazs SQL lapjn teht ugyangy adhatsz ki SQL-paran csokat. mintha a MySQL-terminlt hasznlnd.
most itt vagy

65

bemutatkozik az IN S E R T utasts

Megvan a My5QLadatbzs ee a t b la - de hogyan tehetek beljk a d a to k a t?

Ha egy tblba adatokat szeretnl beszrni, az SQL INSERT utastst hasznlhatod.


Az SQL nyelv m indenfle klassz utastst biztost az adatbzisokkal val kapcsolattartsra. Az egyik leggyakrabban hasznlt ezek kzl az INSERT, amellyel adatokat raktrozhatsz el egy tblban. Nzd meg az albbi utastst, s figyeld meg az INSERT m kdst. Ne feledd, hogy ez az utasts nem valdi SQL-parancs, csupn egy utasts sablonja, ami az INSERT ltalnos formjt mutatja.

A kvetkez rsz az adatbzis osz


* m f a utastsi

Itt tov'bbi
lo p n e v e k

eve. O en esetben w

lopainak listja, amelyeket vesszk vlasztanak el egymstl.

J
I

aens_ai>duc#ion.

3Z INSERT H SQ lTO
kulcsszavak kezdik.

kcvJ kznek; az r j s utn ninet 1

t b la _ n e v e

(o s z l o p _ n e v e l , o s z l o p _ n e v e 2 ,
>

vessz.

/ )

' rt k 2 '
Egy msik SQL-kulcssz, ami azt jelzi, hogy az oszlo pok rtkei kvetkeznek. beszrand rA kvetkez rsz a fkek listja, amelyeket szinten vesszk vlasztanak el egymstl.

I t t tovbbi a p o s z t r f rtkek

kvetkeznek; az utols utn mncs Az aposztrfok hasznlata helyes. Amikor szveget szrsz be, min dig hasznlnod keli ket, mg ha csak egyetlen karakterrl - pl dul 'M' vagy F' - van is sz. vessz.

FONTOS: |z rikeknek ugyanabban a sorrendben kell llniuk, mint az oszlopneveknek!


A fenti utastsbl m egjegyzend egyik legfontosabb dolog, hogy a m sodik zrjelben ll rtkeknek ugyanabban a sorrendben kell lennik, m int az adatbzis oszlopneveinek, mert az INSERT utasts csak gy tudja m egfe leltetni az rtkeket az oszlopoknak az adatok beszrsakor.

66

2. fejezet

k<)pc soioda s a M yS Q L-hez

Az INSERT utasts mkds kzben


Lssuk, hogyan hasznlhatod az INSERT utastst arra, hogy az idegenekkel kapcsolatos adatokat elraktrozd O w en j a l i e n s _ a b d u c t i o n tbljban:

A sorrend szmt!
A beszrand rtkeket ponto
san ugyanabban a sorrendben kell megadni . mint a z oszlop neveket!

Ez a tbla neve amelvbe

h > " > > ' " " '


ar U M

oszlopnevek az els zr'

t alMV, ! , * i ) t | ,^

Vigyzat!

NEM az adatbzis'.

fosztja

INSERT INTO aliens_abduction (first_name, last_name, when_it happened, how_long, how many, alien_description, o ospotted, other, email) what_they_did, fang Q ~0 '3 days ago', '1 Oday', 'four', O VALUES ('Sally', 'Jones',

'green with six tentacles', 'We just talked and played with a dog',

o 'yes',

'I may have seen

o your

dog. Contact me.^


Itt mindegyik rtk szveget,

'sally@gregs-list.net' )
Az egyes oszlopok rtkei a msodik zrjelbe kerlnek, s szintn vesszk vlasztjk el okt egymstl.
ft p H P - u t a s t s o k t l

lt

s nem szmot tartalmaz, ezrt aposztrfok kz kell zrni ket.

ren a PHP-kdban hasz

nlt S Q U ta s t s o k vgen nem ll pontosvesszo.

V
first_name

Hegyezd ki a ceruzd!

Itt lthatod az a l i e n s _ a b d u c t i o n tblt, am elyben mg nin csen ek adatok. rd be a Sally elrablsval kapcsolatos adatokat a tblba! Ha nem elg a hely. a tbla fl is nyugodtan r hatsz, s benyilazhatod az rtkeket.

Ezek az oszlopnevek.

aliens abduction
lo stn am e when_H_happened how jong how m any alien_ description what_they_did fangspotted other email

most itt vagy

67

megoldsok s nem hlye krdsek

ezd ki a ceruzd!------------------------------------------------------------------------------M p/inl/lac

^ ^ a to d az al i e n s _ a b d u c t i o n tblt, am elyben mg nincsenek adatok. rd be a Sally elrablsval kapcsolatos adatokat a tb lba! Ha nem elg a hely, a tbla fl is nyugodtan rhatsz, s benyilazhatod az rtkeket.
1 just talked and He played with a d o g .^ dog. Contact me.

green with six tentacles

* " * & W/iif.wf


I may have seen your

aliens
first_nam la stn a m e w h en H ba p p en e d how long how_many

lu c tio n
tH^n description wicrt_they_did fongspotted

S a lly

Jemes

3 days a<v>

1 dav

four

Y*s

Nincsenek

hlye krde'sek
IC! Nem vagyok biztos benne, hogy rtem a klnbsget V
I C ! s mi a helyzet a phpMyAdmin-nel? Azt hol tallhatom meg? az adatbzis s a tbla kztt. Nem adatok trolsra val mind a kett?

! De igen, csak a tblk arra szolglnak, hogy az adat bzisban csoportokba szervezzk az adatokat, hogy ne egyetlen nagy adatmassznk legyen. A klnbsg nagyjbl olyan, mint amikor bedoblsz egy csom cipt egy nagy dobozba, de elbb minden pr cipt beraksz egy kisebb dobozba: a nagy doboz az adat bzis, a kisebb cipsdobozok pedig a tblk. Az ada tok teht tblkban troldnak, az adatbzisok pedig a tblkat troljk.

IC! Pontosan micsoda a MySQL-terminl, s hogyan tallom


meg a szmtgpemen?

! A MySQL-terminl egy olyan eszkz, amellyel parancssoros felleten keresztl rhetsz el egy MySQL adat bzis-kiszolglt. Sok esetben a MySQL-terminl nem nll program, hanem egy kapcsolat, amelyet egy ltalnos terminl program, pldul a Mac OS X ter minlalkalmazsnak parancssort hasznlva ltes tesz. Az. hogy a MySQL-terminlt hogyan rheted el, az ltalad hasznlt opercis rendszertl, illetve attl fggen, hogy a MySQL-kiszolgl helyi vagy tvoli (teht nem a te szmtgpeden tallhat), egszen ms lehet. A MySQL-terminl elrsrl a II. fggelk tartalmaz rszleteket.

! A MySQL-terminltl eltren a phpMyAdmin egy webes alap alkalmazs, amely hozzfrst nyjt a MySQL-adatbzisokhoz. Valjban PHP nyelv program, ezrt kell mindig egy webkiszolgln ke resztl elrni, nem pedig helyi gyflprogramknt te lepteni. A phpMyAdmin szmos webtrhely-szolgltatnl rsze a szokvnyos MySQL-csomagnak, gy hogy lehet, hogy mr teleptettk is neked. Ha nem, magad is letltheted s teleptheted. A teleptcsomag ingyenesen hozzfrhet a www. phpmyadmin . n e t cmen. Azt azonban ne felejtsd el, hogy a phpMyAdmin-t egy webkiszolgl ra kell telepteni, s ugyangy be kell lltani, hogy hozzfrjen a MySQL-adatbzisaidhoz, mint minden ms PHP- s MySQL-alkalmazst.

I C ! A MySQL-terminllal s a phpMyAdmin-nel is rendelkezem. Melyiket hasznljam az adatbzisom elrsre?

I Ez csak a te zlsedtl fgg. A phpMyAdmin elnye, hogy az adatbzisokban s tblkban grafikusan bn gszhetsz, anlkl, hogy SQL-parancsokat kellene be rnod. Ha mr jl ismered az SQL-t, s nem szeretnl minden aprsg miatt parancsokat begpelni, ez na gyon knyelmes lehet. Most azonban mg nem rt. ha arra sszpontostasz, hogy megrtsd, hogyan ke zelheted a MySQL-adatokat SQL-parancsok segtsg vel, ezrt a terminlt is rdemes hasznlnod.

68

2. fejezet

kapcsolds a M yS Q L-h e z

Tsztt
Raktrozd el egy idegenekkel kapcsolatos bejelents adatait az adatbzisodban az SQL INSERT utastsa segtsgvel!
Egy olyan MySQL-eszkz segtsgvel, mini a MySQL-terminl vagy a phpMyAdmin SQL lapja, rd b e az albbi i n s e r t utastst - pldaknt a Sally Jo n e s elrablsval kapcsolatos adatokat szrjuk be:
INSERT INTO a l i e n s _ a b d u c t i o n w h e n _ it_ h a p p e n e d , h o w _lo n g , w h a t_ th e y _ d id , VALUES fa n g _ sp o tte d , 'Jones', (firs t_ n a m e , how_many, other, la s t_ n a m e ,

a lie n _ d e s c rip tio n ,

email) fl day , 'four',

('Sally',

' 3 d a y s a g o 1,

'green with s i x t e n t a c l e s ' , 'yes',

'We j u s t t a l k e d and p la y e d w ith a d o g ' ,

' I may h av e s e e n y o u r d o g . C o n t a c t m e . ' ,

'sally@ gregs-list.net )

File Edit W in do w Help P u g sln S p a ce

ruysql> INSERT INTO a l i e n s _ a b a u c t i o n (first_name, last_namc, w h e n it happened, how_long, h o w _ m a h y , alien_description, what_they_did, fang_spotted, other, email) VA-.UES (Sally', ' J o n e s , '3 days ago', fl day', 'four', 'green wi t h six tentacles', 'We just t a l k e d and p l a y e d with n d o g , 'yes', 'I ma y h av e seen your dog. C o nt ac t me.', 'sally0gregs-list_.net') ; Q u e r y OK, 1 rows a f f e c t e d (0.0005 sec)

" o f /

* 9 ( .* ( -

gy tnik, az i n s e r t utasts sikerrel jrt. rd le, hogy miknt ersthetnnk meg, hogy az adatok bekerltek a tblba.

h o l d a s t eredmnyezi 3Z allens-*l>dU ction tblhoz II

t0W aft S

= f rintett J j .
most itt vagy

69

bemutatkozik a S E L E C T utasts

Tbla adatainak kiolvassa a SELECT utastssal


Az adatok beszrsa a tblba klassz, meg minden, de nmi nyugtalansggal tlthet el a tny, hogy mg nem erstettk meg, hogy az adatok tnyleg bekerltek a tblba. Ez olyan, mintha pnzt he lyeznl el egy megtakartsi szmln, de soha nem krdezhetnd le az egyenleget. Nos, egy adatb zisban a tblk egyenlegnek lekrdezsre val a S E L E C T utasts - pontosabban a S E L E C T azt te szi lehetv, hogy adatoszlopokat krj le egy tblbl.

A SELECT k u lcssz t a kio lva sn i k vnt adatokat ta rta lm a z oszlopok nevnek kell kvetnie. J ASELECr w n iq e a v k n ^ t - u -

nem a/ta/anossa^fcan az atlatbzisr

SELECT

o s z lo p o k

FROM

t b la _ n e v e

A SELECT az utasts FROM rsz bl tudja, Hogy melyik tblbl sze retnl adatokat kivlasztani. ^

SELECT SQL

A S E L E C T utastsnak megadott oszlopokat vesszkkel kell elvlasztani egymstl. Fggetlenl attl, hogy a tblnak hny oszlopa van, a S E L E C T csak a megadott osz lopok adatait adja vissza. Az albbi S E L E C T utasts pldul az idegenek ltal elraboltak kereszt- s vezetknevt olvassa ki az a lie n s _ a b d u c t io n tblbl:

U td S tS S sd tO SZ

lopokat nyer ki egy tblbl.

E z a S E L E C T u ta st s a k e n -

* S . ^ C T

a* ^U *0n t l b l C

nek a kt oszlopnak az adatait \ j. adja vissza. \

nY er hatokat

SELECT first name, last name FROM aliens abduction

Ahhoz, hogy egy ! N S E R T eredmnyt ellenrizhesd, valahogyan meg kell nzned a tbla sszes ada tt, nem csak nhny oszlopot. A S E L E C T utasts erre knl is egy gyors mdszert:

A csillag arra utastja a SELECT par a n c s o t,

hogy a tbla sszes oszlop-

oak adatait olvassa ki.

SELECT * FROM aliens_abduction

Az oszlopok listjra nincs szksg, mert a csillag azt jelenti, hogy sze rezd meg mindet!".

70

2. fejezet

kapcsolds a M yS Q L-h e z

Gyzdj meg rla, hogy az idegenekkel kapcsolatos adatokat beszr INSERT utasts mkdtt: olvasd ki a tbla adatait egy SELECT utastssal!
Hajts vgre egy SELECT-lekrdezst valamelyik M ySQL-eszkzzel, hogy az a l ie n s _ a b d u c t i o n tbla teljes tartalmt m egtekinthesd, s ellenrizd, hogy' az im nt beszrt j adatsor m egjelenik az eredm nyben:
SELECT * FR O M aliens abduc ti on

File Edit W in do w Help H a vcY o u S e e n H im

m ysql> SELECT * FROM a l i e n s _ a b a u c tio n ;

f irst_ na mo | Sally

| last name I Jones Jo n es

| w he n _it_happened I 3 days ago

| how_long I 1 da y

I ho w m a n y | four

I alieiwiescription I green wi t h six tent.

-------------------- +---------------------+-------------------------------- - i------------------- +------- -------+------------------------------------

1 row in s e t

(0.0005

sec)

Az egyes oszlopnevek alatt az adott oszlopban szerepl


A SELECT-lekrdezs felfedi, 9 egyetlen adatsor trol d d a tblban.

adatokat lthatod.

Hny adatsor tallhat a tbldban?

m ost itt vagy

71

SQL-parancsok automatizlsa a P H P segtsgvel

S zval a z t mondod, hogy m inden a lk a lo m m al meg kell rnom egy IN SER T u ta s t s t, a m ik o r egy e lra b l s i b e je le n t s a d a t a it hozz a k a ro m a d n i a z a d a tb z is h o z ? Ez a M y5 Q L dolog m r nem is t n ik olyan vonznak.

: i - Cr ---------------------- ---- - ---------------------------------------' y es *, l T d a . l i n 8 _ a b d u ; ' t i n ( f l r s i _ : . . i s r * . , I*sr_r.m M ?*, v a liy fl.j w hc:. i t . _ h a r y i - r . c d , ix.w_l. n g , h o w jn a n y , a !*-n d e s - ' r i r - ' r.,

O u e r y OK,

w h a t t h e y d i r i , f a n y ^ o t t e d , r,\ n e r , t m a i U VAL E ( D r.*. ' Q u r t y l e ' , b a t * ' n 1 ^ 9 1 ' , * s ^ n -n d : , * rfnn f .,- ,'. ' t h e y l o c c i i i f c e dm kfeys r,-idr- w t t c i r a t i a ^ w i t h sumo s i r i c offt f f P .f y , .f.i.i!w . ^ ^ ___

t o J ' "a'e *

*2 torS.. ^ or *w , o'

' oal of w , T

j g j f ' ' = se*. *y,..


{ 0 .0 0 0 5 sec)

r c ,,;s a f c t d

b e lit -H ^l'ccKiii.rn-i ')) ; Ouc-ry OK, 1 row s . a ; e c t c - d

<0.000-

t -t

Igaz, minden adatbeszrs egy MySQL-adatbzisba egy INSERT utastst ignyel.


Itt vlik frasztv egy MySQL-adatbzis pusztn SQL-parancsokkal val krdezgetse. Annak, hogy O w en az adatait nem a levelesl djba rkez e-m ailekben, hanem egy adatbzisban trolja, sok sok elnye van, de az adatok kzi kezelse SQL-utastsok kiads val egy M ySQL-eszkzben nem m kdkpes megolds.

Agytorna
Mit gondolsz, hogyan lehelne megoldani Ow en MySQL-adatbeszrsi problmjt?

72

2. fejezet

kapcsolds a M yS Q L-hez

Hagyd a PHP-re az unalmas SQL-t!


O w en problmjra a megoldst nem az SQL elkerlse rejti, hanem az SQLparancsok automatizlsa a PHP segtsgvel. A PHP lehetv teszi, hogy egy a kiszolgln fut parancsfjl kdjban adj ki SQL-utastsokat. vagyis egylta In nem kell ignybe venned egy xMySQL-eszkzt. Ez azt jelenti, hogy Ow en HTML-rlapja meghvhat egy PHP-parancsfjlt, am ely gondoskodik az adatok beszrsrl az adatbzisba, am ikor csak benyjtjk az rlapot - e-m ailek. SQ L-eszkzk s fradsg nlkl! _____ ___________ _______ A HTMl-rUp itt eqy emaiH
V i< . amelyet Owen m e a bp , ^
< j a j t k e z u le a V e a d a tS ~

beszfja s
adatbzisba.

0 |
r p ~

r a

.....................P la B S r r

--- ^

S i ;'

A PHP nlkl sajt kezleg kell megrnod az INSERT SQL-utastsokat, amelyek az egyes elrablsi bejelen tsek adatait elraktrozzk az adatbzisban.
.y ito * XMueted M . Rspori

H* m

A PHP segtsgvel parancsfjlt rhatsz, amely nm kden gondoskodik az adatok beszrsrl, amikor benyjtjk az rlapot.
report, html
ccm

A HTML-rlap meghvja a PHPparancsfjlt, s megkri, hogy adja az rlap adatait az adatbzishoz.

y .9 q ii_ c lo s e (Scibc)

report, php

m ost itt vagy

73

hogyan hasznlja owen alkalmazsa a p h p -t s a m ysql-t?

A PHP rvn az adatok vezrlik Owen Webes rlapjt


A PHP azzal javt O w en elrablsbejelent w eb es rlapjn, hogy lehetv teszi egy parancsfjl nak. hogy az rlapadatokat kzvetlenl egy adatbzisba rja. ne pedig levlben kldje el O w en c m re, hogy neki kelljen sajt kezleg bevinnie azokat. Nzzk meg kzelebbrl is, hogy pon tosan hogyan mkdik az alkalm azs most, hogy a PHP is belpett a kpbe!

Sally kitlti az idegenekkel kapcsolatos elrablsbejelent rlapot, s az elkldshez megnyom ja a Report Abduction gom bot. Az inform cik a w ebkiszolgln tallhat report .php parancsfjlhoz kerlnek.

0 mg min dig Sally, akit nemrg raboltak el az idegenek.


report.html

A report.html weboldalon tallhat

Egy csom ms em ber is kitlti s el kldi az rlapot.

rlap meghvja a report.php parancs* f jlt a webkiszolgln, amikor egy felhasznl benyjtja az rlapot.

74

2. fejezet

kapcsolds a M yS Q L-hez

O w en report .php parancsfjlja kapcsoldik egy MySQL-adalbzishoz, s INSERT SQL-utastsok segtsgvel beszrja az egyes bejelen tsek adatait.

A report.pbp paranesfajl kap csolatba lp a N W $Q U is*o'glval, bogy beszrja az ada tokat az adatbzis a l i e n s _abduction tbljba. Az aliens_abduction tbla adatsorok knt trolja az idegenekkel kapcsolatban bejelentett adatokat.
O w ennek nem csak ahhoz van szksge egy parancsfjlra, hogy az adatokat berakja az adatbzisba, hanem ahhoz is. hogy m egte kinthesse az adatokat, s kereshessen kzttk. Ez a w ebhelye f oldalnak alapjt is kpezheti: az in d e x .p h p parancsfjl kap csol dik az adatbzishoz, kiolvassa az idegenekkel kapcsolatos adato kat, s megmutatja O w ennek.

o
Az adatbzis-kiszolgl csak
e g y

kiszolglgpen, rendsze
index.php

rint a webkiszolglo mellett fut program. Az index.php parancsfjl kiolvassa az adatokat az aliens_abduetion tblbl, hogy formzhas sa azokat, s megmutathassa Owennek.
O w en most mr sokfle j m don elrheti az adatokat, ami lehetv teszi, hogy tnyleg elve szett kutyja, Agyar m egtal lsra sszpon tosthasson.

Az aliens^abducfion tbla
indexl p a r a n c s f j l adat forrsul szolgl.

most Itt vagy 75

mysql-kapcso/at ltestse

Kapcsolds az adatbzishoz a PHP segtsgvel


Mieltt egy PH P-parancsfjl adatokat szrhatna b e vagy olvashatna ki egy MySQLadatbzisbl, kapcsoldnia kell az adatbzishoz. Egy PH P-parancsfjlbl sok szem pontbl hasonlan kapcsoldhatunk egy MySQL-adatbzishoz, mint egy MySQLeszkzbl, s ugyanazokat az inform cikat is kell m egadnunk. Em lkszel a hrom ngyzetre, amit ki kellett piplnod a fejezet korbbi rszben? Itt vannak megint, egy jjal egytt, am elyik m ell az adatbzis nevt rhatod be. rd ht le jra az adatokat m g egyszer: ezt a w e " tudhatod m eg, vagy a webmesi^ ^ vagy ^ a m js-kiszolgld 3M ySQL a a 325 ^ hasznltaugyanazon ^ j

^ 3 ",0C3

A MySQL-kiszolglm helye (IP-cm vagy llom snv):................................................ Az adatbzisban hasznlt felhasznlnevem:.................................................................. Az adatbazisban hasznait jelszavam :....................................................
1

, lA . ,

A korbban ltrehozott adatbzis neve, ami

aliendatabase. Ha valamirt ms nevet adtai ------ az adatbzisnak, vagy gy dntttl, hogy e g y m r 1^20 adatbzist hasznlsz, rd be a' annak a nevt.

.. . , ,

'

> ji- i .

Az adatbzisom n e ve :..................................................................

Az adatbzis-kiszolgl helye, a felhasznlnv, a jelsz s az adatbzis neve mind szksges ahhoz, hogy kapcsolatot ltesthess egy MySQL-adatbzissal egy PHPparancsfjlbl. Miutn a kapcsolat ltrejtt, a parancsfjl ugyangy vgrehajthat SQLparancsokat, mintha sajt kezleg rnd be azokat egy M ySQL-eszkzben.
Az adatbzis neve aliendatabase, s ez a nv sziiks-i A te ngy kapcsolati adatod klnbzni fog ezektl. ges ahhoz, hogy a parancsig
A d a tb zis -k is zo lg l

kapcsolatba tudjon lpni az adatbzissal.

report.php

aliendatabase

Minin pH P-pe$fi),Mk; amely adatokat trol m l * . ki egy M ySQ L-adatb bl, elszr kapcsolatot kell ltestenie az adatbziss a fenti ngy informci fe l
hasznlsval.

aliens abduction index.php


z a? ltrehozott datbizis, illetve U f a

A tbla neve alien$_abduction, s addig nem lp a kpbe, amg SQL-parancsokat nem kezdesz kiadni.

76

2. fejezet

kapcsolds a M yS Q L-hez

Adatok beszrsa PHP-parancsfjl segtsgvel


Alihoz, hogy egy PHP-kdbl elindthass egy MySQL-lekrdezst, elszr kapcsola tot kell ltestened az adatbzissal. A lekrdezst ezutn egy PHP-karakterlnc form jban ptheted fel. A lekrdezs vgrehajtsra tnylegesen csak akkor kerl sor. amikor a lekrdez karakterlncot tadod az adatbzis-kiszolglnak. Vgl, amikor befejezted az adatbzis lekrdezst, be kell zrnod a kapcsolatot. Az sszes emltett feladatot egy PHP-parancsfjl kdjn keresztl fogjuk elvgezni. m e egy plda, amelynek kdja egy j sornyi idegenekkel kapcsolatos adatot szr be:

Itt a TE ngy rtkednek kell llnia, nem mennek.

<?php

"' " zr

_l dat

ensabductedme.com1, *owen,f *a iensrool1

I)

or d i e ( Error connecting to MySQL s e r v e r . );

Az adatbzis helyeknt tartomnynv helyett lehet, hogy a 'loeaihost' szt is hasznlhatod.

$ query = INSERT INTO aliens abductibn "how_many, VALUES

(f irst_name,

last_name, when_it_happened, now_iong, other, email) .

" .

alien_description, what_they_did,

fang_spotted,

(S a l l y 1, J o n e s , 3 days a g o , 1 d a y , f o u r , 'green with six t e n t a c l e s , . y e s , I may have seen your dog. Contact m e . , " .

" We just talked and played with a dog', sail y@aregs-list .net ) ;

Egy PHP-kdban az INSERTlekrdezst karakterlncknt ptheted fel.

Nagyon gyelj itt az aposztrfokra s ketts idzjelekre, valamint az elttk s utnuk allo szkzkre!

Sresult - mysqli q u e r y ($dbc, $query) or die {Error querying d a t abase.);


kiadsa

3 fyWL-adatbisban.
mysqli c l o s e ($ d b c );

?>
Ezek a fggvnyek a PHP-nek legalbb a 4.1-es vltozatt ignylik a webkiszolgln.

Agytorna
Mit gondolsz, mit csinlnak ezek a PHP/fggvnyek a parancsfjlban?
m y s q l i _ c o n n e c t () m y s q l i _ q u e r y () m y s q l i _ c l o s e () ^

most itt vagy

77

a php hrom mysqf-kapcso/ati fggvnye

Trsalgs az adatbzissal PHP-fggvnyekkel


Hrom f PHP-fggvny hasznlhat a MySQL-adatbzisokkal val kapcsolattartsra: a m y s q l i _ c o n n e c t (), a m y s q l i _ q u e r y () s a mysql i_cl se (). Ha gyansan ism tld mintzatot ltsz bennk, az nem vletlen: ma mr minden PHP-fggvny neve. am ely a MySQL-lel kom m unikl, a mysql i_ eltaggal kezddik.
t*99*l kezd:m , j r nlkl. Az i"

Sp-T
mysqli_close( )

-h m -

mysqli_connect( )
Ez a fggvny a MySQL-adatbzisokhoz val csatlakozsra szolgl, s a korbban megismert ngy adatot kell megadni neki.

mysql i__query ( )
Ezzel egy lekrdezst intzhe tnk egy MySQL-adatbzishoz, ami ltalban adatok bevitelt je lenti egy tblba, vagy azok kinyerst onnan.

Ez a fggvny lezrja a kapcsola tot a MySQL-adatbzissal.

A fenti hrom fggvny hasznlata jellem zen azonos, m egjsolhat lp sekbl ll:

Csatlakozunk egy adatbzishoz a mysqli_connect() fggvnnyel.


Ahhoz, hogy engedlyt kapj arra, hogy kapcsolatba lpj a MySQL adatbzis-kiszolglval, meg kell adnod a kiszolgl helyt, egy felhasznlnevet s egy jelszt, valamint az adatbzis nevt, mivel a csatlakozs egy konkrt adatbzishoz trtnik.

Haltl A M yS Q Lk is z o lg l t keresem. O t t van?

m y s q l i_ jc o n n e c t ()

_______ 1

I A datb zs-k iszo lg l

C s a t la k o z v a !

Ltrehozunk egy SQL-lekrdezst, s karakterlncknt troljuk egy PHP-vltozban. e


Az adatbzis-kiszolglval val trsalgshoz SQL-parancsokat kell hasznlnod. Pldul ha adatokat szeretnl adni az a 1 i e n s_ a b d u c ti.o n tblhoz, egy \NSERT utastsra lesz szksged. Az ltalunk vlasztott vltoz nevben nincs semmi klnleges, de egy olyan egyszer nv, mint a S q u ery , min dig jl mkdik.

A lekrdezst e tf karakteri* for mjban hozzuk ltre, s a Squery

vltoz trolja.

kapcsolds a M yS Q L-hez

Kiadjuk a lekrdezst a m ysq ii, q u e ry() fggvnnyel.


A MySQL adatbzis-kiszolglval val trsalgshoz s az adatok felvtelhez az al ie ns _a b d u c t i o n tblba a mysql i_query () fggvny s a $query vltoz szksges. A m y s q l i _ q u e r y () -nek az 1. lpsben ltestett kapcsolat nevt s a 2. lpsben ltrehozott, a lekrdezst tartalmaz vltoz nevt egyarnt meg kell adnod.
-----\ Ez 3 fggvny hajtja vgre a lekrde?sf' ami egy NSERT u f ff k i
a, ami adatefea* seur be

C H, INSERT-eW be e z t

a t b l b a .^/

Megvan.

m y s q l i _ q u e r y ()

Siker!

Bezrjuk az adatbzis-kapcsolatot a mysqli_close() fggvnnyel.


Az utols lps, hogy a m y s q l i _ c l o s e {) segtsgvel kzld a MySQL adatbzis-kiszolglval, hogy befejezted a trsalgst.

R szem rl ennyi, szeva.

m y s q l i _ _ c l o s e ()

E s e tle g k o s z i? M icso d a t u s t l

K a p cs o la t bezrva.

a kapcsolati vltoz neve.

Ha valami flresiklik, ezt az ze netet kapod, s a mvelet lell.

Ef " IHSIDT S Q l-l,U r* i,

<?php $dbc = mysqIi_connect('data.aliensafcductedme.com ' , 'owen1, '^'iensrool', 'aliendatabase')

$query = "INSERT INTO aliens_abduction "how_many, "VALUES

or die('Error connecting to MySQL server.');

(first_name,

_ast_name, when_it_haopened, email) " .

how_longf " .

alien_description, what_they_di.d, fang_spot:ted, other, 'Jones', r3 days a g o ' , '1 day', ' 'four*,

('Sally',

'green with six tentacles',

" . " .

"'We just talked and played with a d o g , 'yes',

may have seen your don. Contact me.',

$ resu lt. - mysqli query ($dbc, $query) or d i e ( E r r o r querying d a t a b a s e . ' )


^Jmysqli closed $dbc);

A $query valtozoban ta ro lt kod SQL s nem PHP-kod.

zrjuk b e

?>

a kapcsolatot.

Nzzk meg kzelebbrl is a PHP mindegyik adadatbziskezel fggvnyt! Kezdjk a mysqli_connect. ( )-te l...

m ost itt vagy

79

a mysqJ/ connectf) hasznlata

Csatlakozs a mysqli_connect() segtsgvel

Csatlakozunk a mysqliconnectQ fggvnnyel.


0 sszelltjuk a lekrdez karakterlncot. Vgrehajtjuk a lekrdezst a mysqli queryO fggvnnyel. O Bezrjuk a kapcsolatot a mysqli_close() fggvnnyel.

Alihoz, hogy a PHP-parancsfjlod a mysqli_connect ( ) j ________ fggvny segtsgvel kapcsolatot tudjon ltesteni az adatbzissal, szksged lesz nhny inform cira, am elyek mr ism ersek lehetnek. Igen, ugyanazokrl az adatokrl van sz, am elyeket korbban, a MySQL-terminlban hasznltl, kiegsztve az adatbzis nevvel.

A felhasznlneved s a jelszavad

Ki?

Szksged lesz az adatbzis-kiszolgldon rvnyes felhasznlnevedre s jelszavadra. Ezeket vagy te lltod be. vagy a webtrhely-szolgltat adja neked, amikor telepti a MySQL-t. Ha sajt magad zem eled b e a MySQL-t, kvesd az utastsokat, hogy bizton sgos felhasznlnevet s jelszt adj magadnak.

Az adatbzis neve
M J-4 ? 1 1 * Pldnkban az adatbzisnak az aliendatabase nevet adtuk. A te adatbzisod neve termszetesen ms lesz - brmi lehet, ami mellett az adatbzis ltrehozsakor dntttl, vagy amit a webtrhely-szolgltatd hatrozott meg, ha k hoztk ltre az adatbzist.

Az adatbzis helye (tartomnynv, IP-cm vagy localhost)

Hol?

A pldban Owen (kpzeletbeli) adatbzisnak helyt hasznljuk, neked viszont a sajt MySQL-kiszolgld cmt kell megadnod. Amennyiben az adatbzis-kiszolgl ugyanazon a gpen tallhat, mint a webkiszolgl, ez a cm ltalban a localhost (errl a webtrhely-szolgltattl krhetsz felvilgostst). Az adatbzis helyt egy IP-cmmel vagy egy O w enhez hasonl tartomnynvvel - k is z o lg a lo . s z o lg a i tato.com - is megadhatod.

A mysql i_connect ( fggvnynek megadott helyet, felhasznlnevet, ) jelszt s MySQL-adatbzisnevet egyarnt idzjelek kz kell zrnod:

A f i / / l nt\ rlCi il\ * * f i COIflCT( J T U 0 0 -

f
M to i. *

Ennek itemk a njtsi Hjth1 s- Wrtrt.t . * 0 .

vny a helyet, a felhasznlnevet, a jelszt s adatbaZIS neVet karakterlncokknt kezeli, ezrt idzjelbe kell tenned ket.
i i

$ d b c = m y s q li c o n n e c t( ' d a t a . a lie n s a b d u c t e d m e . c o m ',

' : ! u " ' ; r o o l, (~< aiien d atab a ie i ,


^ --------- Az adatbzis neve

J e|sz

A fggvny m eghvsnak eredm nyeknt ltrejn egy adatbzis-kapcsolat, valamint egy PHP-vltoz, am elynek a segtsgvel m veleteket vgezhetsz az adatbzison. A vltoz neve a pldnk ban $dbc (mint database connection", vagyis adatbzis-kapcsolat), de olyan nevet adhatsz neki. amilyet csak szeretnl.

80

2. fejezet

kapcsolds a M yS Q L-hez

Hegyezd ki a ceruzd! --------------------------------------------------------------------------------m e nhny plda adatbzis-kapcsolati karakterlncokra. Vizsgld meg mindegyiket, s rd le, hogy szerinted m kdnek-e, s ha nem, akkor ho gyan lehetne kijavtani ket. Karikzd be a problmsnak gondolt kdokat.
$dbc = m y s q l i _ c o n n e c t ('d a t a .a l i e n s a b d u c t e d m e .c o m ' , 'o w e n 1, a l i e n s r o o l ', 'a l i e n d a t a b a s e );

$dbc = m y s q l i _ c o n n e c t (d a t a . a l i e n s a b d u c t e d m e . c o m , 'owen', "aliendatabase")

' a l i e n s r o o l 1,

$ f a n g is g o n e = m y s q l i _ c o n n e c t ( d a t a . a l i e n s a b d u c t e d m e . c om , a l i e n d a t a b a s e 1) ;

'owen',

aliensrool',

$dbc = m y s q l i _ c o n n e c t (l o c a l h o s t , owen',

aliensrool',

a l i e n d a t a b a s e );

$dbc = mysq li c o n n e c t {d a t a . a l i e n s a b d u c t e d m e .c o m , o w e n , , a l i e n d a t a b a s e );

$dbc = m y s q l i _ c o n n e c t (d a t a . a l i e n s a b d u c t e d m e . c o m , o w e n , a l i e n s r o o l ); m y s q l i select db($dbc, a l i e n d a t a b a s e );

most itt vagy

81

Hegyezd ki... megolds

ezd ki aM I J ^ ceruzd!
I le g o id a s

nhny plda adatbzis-kapcsolati karakterlncokra. Vizsgld m eg mindegyiket, s rd le, hogy szerinted mkdnek-e, s ha nem, akkor hogyan lehetne kijavtani ket. Karikzd be a probl msnak gondolt kdokat.

$dbc = mysqli_connect('data.aliensabductedme.com, 'owen', aliendatabase);

aliensrool' ,

E2 a kapcsolati karakterlnc mkdni fog.


.....................................................................................................................................................................E(,be, 8 knyvben aposztrfokat hasznlunk Itt egy pontosvesszre van szksg a PH P-karakterlapokhoz, s a ketts idzjeleket /" a PHP-utasits lezrsra. az SQL-lekrdezsekhez tartjuk fenn.

$dbc = mysqli_connct (1data. aliensabductedme.com' , 'owen1, aliensrool', "aliendatabase"(T^

Ez nem mkdik, mert hinyzik a pontosvessz. A ketts idzjelek ugyanolyan jk, mint az aposztrfok.............
N tl ler jelleg nv egy em
adatbzis-kapcsolathoz.

(gfangi sgone)= mysqli_connect('data.aliensabductedme.com', 'owen', ^aliendatabase' / )

'aliensrool,

Ez mkdik,, br. a nv nem tl.j egy. adatbzisr.kapcsolatriiak..............................................................................


Ez felttelezi, hogy az adatbzis-kiszolgl ugyanazon a kiszolgo'gpen tallhat, mint a v/ebkiszolgl.

$dbc = mysqli_connect(( 1localhostJ owen, aliensrool, aliendatabase);

..... Ez. is. mkdik^, feltve.hogy. az. adatbzis-k.iszpig |p. s a. web ki.szolga; l. ugyanazon a. gpen, tallhat.............
Az res adatbzis-jelszavak hasznlata nem j tlet.

$dbc = mysqli_connect (1data.aliensabductedme.com1, ow e n ' , ( ^ ) 'aliendatabase');

......U . m k # .q c . rnMdik,. fw az .edaibftif mk. jelszt, adtl meg - m . nerc. t l j . tle t,.............................. ..... Az. adatbzi.spkhpz mindig.llts be jelszt!.................................................................................................................
A negyedik paramter elhagysa a roysqli__jelecf_db() meghvst ignyli az adatbzis kivlasztshoz.

$dbc = mysqli_connect('data.aliensabductedme.com, 'owen', mysqli_select_db($dbc, aliendatabase');

aliensrool);

Bocs, ez beugrats krds, volt. A mysqli_connect(J. esetben a negyedik elem - az adatbzis neve - nem . ktelezi..Ha kihagyod a fggvnybl^ a mysq|i_seject_db(). fggvnny! adhatod, meg.az adatbzis nevt... .Va gyis a fenti kpd. egyenrtk azzaj, mjntha mind a ngy pararnterf megadtad yojna a mysqJI_c.0nnectXl7.nek...

82

2 le/ezet

kapcsolds a M yS Q L-hez

gy t n ik , knnyen el le h e t ro n ta n i egy-egy a d a to t, am ivel egy a d a tb z is h o z k a p c s o ldunk. H onnan tu d h a to m b iz to s a n , hogy a k a p c s o la t m kdik-e?

Ebben segt a PHP die() fggvnye.


A PHP d ie () fggvnye megszaktja egy PHP-parancsfjl futst, s visszajelzst ad a kd sikertelen lefutsrl. Ugyan nem rulja el pontosan, hogy mi volt a baj, de jelzi, hogy valami nem stim melt, s hogy a hibt ki kell javtanod. Ha a hiba a m y sq li_ co n n e c t () valamelyik kapcsolati vltozjban volt, vagy ha az adat bzis-kiszolgl nem tallhat, a d ie () fggvny meglltja a PHP-parancsfjl futst, s megjelenti a szmra zrjelben megadott hibazenetet.

A die() fggvnyt akkor hvjuk meg, ha a kapcsolat nem j tt ltre.

Ha a mysqli_connect() fggvny ngy karakterln ca kzl az egyik hibs, visszajelzst kapunk.

$dbc V- mysqli_connect('data.aliensabductedme.com', 'owen' ' , aliensrool1, 'aliendatabase') or die{'Error connecting to MySQL server.'); H> * fapesol meghisul

" t L A MySQL-kiszol! m

'rill M m ,i

jelenik

W nem szksges pontosvesszo M j; mrt az or die |l - . - l) " technikai |ag ugyanannak az egyetlen utasi tsnak a folytatsa.

3 veboldslon.

most itt vagy

83

lekrdezsek felptse a php-ben

Ok, van egy PHP a d a tb z is -k a p c s o la to m . H ogyan to v b b ? U gyangy e l in d th a to k lekrdezseket, m in th a a M y 6 Q L -te rm n lb a n lennek?

Igen! Ha a mysqli_connect() segtsgvel sikeresen csatlakoztl egy adatbzishoz, a PHP-bl kzvetlenl elindthatsz SQI-lekrdezseket.
Majdnem m inden, amit m egtehetsz a MySQL-terminlban, elvgezhet PHP-kddal is a ltrehozott adatbzis-kapcsolaton keresztl. A kapcsolat kom m unikcis vonalat ltest a PHP-parancsfjlok s a MySQL-adatbzis kztt. Ow en pldul - most, hogy csatlakozott az adatbzishoz adatokat szrhat be az al iens_abduction tblba a mysqli_query ( ) fggvny s nmi SQL-lekrdezkd segtsgvel.

Ne feledd, hogy a clunk az,. hogy PHP-kddal automatizljuk


ezt az INSERT lekrdezst.
itt -

K>---n Wttb 31 -. - - r .t r - - .-

'I ttfty hv.- >e y*n < * '-'t e r. *<

--

i M i I v U - l t o i F - l i S - *rie^ ' 15

Az SQL-lekrdezst PHP-karakterlncknt adjuk t a m ysqlijjueryO fggvnynek.


A m ysql i_ q u e r y () fggvnynek egy SQL-lekrdezsre van szksge, am elyet egy PlIP-karakterlnc ($ q u e ry ) trol, hogy beszrhassa az ide genekkel kapcsolatos adatokat.

84

2. fejezet

kapcsolds a M yS Q L-hez

Az INSERT lekrdezs felptse a PHP-ben


Az SQ L-lekrdezseket a PHP-ben karakterlncok brzol jk. ezrt a lekrdezseket karakterlncokban szoktk t rolni. mieltt tadnk a m y s q li_ q u e r y {) fggvnynek. Mivel az SQ L-lekrdezsek elg hosszak lehetnek, a tbb kdsort tfog lekrdez karakterlncokat gyakran kisebb karakterlncokbl szksges felpteni. O w en INSERT le krdezse j plda erre:
Ez egy karakterlnc-vltoz a PHP-kdban, amely most az INSERT lekrdezst trolja. O X c o tlakogtink' a m ysqll oonnoot( sszelltjuk a lekrdez karakterlncot, j > Vgrehajtjuk a lekerdezst a m y s q liq u e ry fggvnnyel, Bezrjuk a kapcsolatot a m ysqli_close() fggvnnyel.

A pont arra utastja a PHP-t, hogy ragassza ezt a karakterlncot a kvetkez sorban ill \ karakterlnc elejre.
J

$ q u e r y = "IN SE R T INTO a l i e n s _ a b d u c t i o n " w h e n _ it_ h a p p e n e d , "w h a t_ th e y _ d id , "VALUES h o w _ lo n g ,

(fir s t_ n a m e ,

la s t_ n a m e , " .

"

h o w jn a n y ,

a lie n _ d e s c r ip tio n , " . 'fo u r',

fa n g _ s p o tte d / o th e r , 'Jo n es', ten ta cles',

e m a il)

( ' S a l l y 1,

' 3 days a g o ' , 'We j u s t

'1 d ay ',

"

. II

" 'g r e e n with s i x ft I y e s ' , 'I

t a l k e d an d p la y e d w ith a d o g ' , " .

may h a v e s e e n y o u r d o g .

C o n ta ct m e . ' ,

" ' sally@ gregs-list.n etf)";

A lekrdez karakterlncot tbb sorra trdelssel teheted olvashatbb - a pontok ruljk el a PHP-nek, hogy az egszet egyetlen nagy karakterlncc kell alaktania.

M l V e l e z egS7 k d e g y P H P U h 5 l , s ' I t e v e t t * ! k e l l l e z i T i Z

Most, hogy az INSERT lekrdezst egy karakterlnc trolja, kszen llsz arra, hogy tadd a m y s q li_ q u e r y () fggvnynek, s tnyle gesen vgrehajtsd az adatok beszrst.

Nincsenek

hlye krdsek
I C i M i rt hvjk lekrdezsnek az adatok beszrst? A lekrdezs" nem azt je lenti, hogy adatokat krnk az adatbzistl?

M irt nem egyetlen nagy karakterlnc- I C i Tnyleg szksges felsorolni az oszlopok nevt adatbeszrskor? knt hozzuk ltre az i n s e r t utastst?

! A lekrdezs (query) csak egy szakkifejezs, ami ebben az eset ben krelmet" jelent - arra kred az adatbzist, hogy csinljon vala mit. A MySQL adatbzis-kezel al kalmazsok a lekrdezs" szt meglehetsen ltalnos rtelemben hasznljk: brmilyen SQL-parancsra vonatkozhat, amit egy adatbzisnak adunk, belertve az adatok trolst s kinyerst is. *

! Ne feledd, hogy az INSERT utas ts valjban egyetlen nagy karak terlncknt troldik, mg akkor is, ha tbb kisebb karakterlncbl jn ltre. Idelis esetben az INSERT utastst egyetlen karak terlncknt kdolhatod, de sok ms SQL-utastshoz hasonlan az INSERT is elg hossz lehet - annyira, hogy nem fr el egyet len normlis" kdsorban. Ha a le krdez karakterlncot kisebb, pontokkal sszeragasztott karak terlncokbl pted fel, az utasts olvashatbb lesz.

! Nem. Az INSERT utastsokbl elhagyhatk az oszlopnevek. Ez esetben azonban ugyanabban a sorrendben kell megadnod az egyes oszlopok rtkeit, amely ben azok a tbla szerkezetben szerepelnek. Ezt tudva ltalban biztonsgosabb s knyelmesebb megadni az oszlopneveket.

m ost itt vagy

85

a mysq/i queryO fggvny

A MySQL-adatbzis lekrdezse
A mysql i_query () fggvnynek kl informcit kell meg adnod egy lekrdezs vgrehajtshoz: az adatbzis-kapcsolatot, valamint egy SQL lekrdez karakterlncot.

0 -satoegnk-a-fflyGqli_oonnoot() fggvnnyel.
& sszelltjuk a lokfdoz-kGfak- oflncod. t
\ V g re h a jtju k a lekrdezst a m ysqli queryQ fggvnnyel. Bezrjuk a kapcsolatot a m ysqli_close() fggvnnyel.

mysql i_queryHadatbzis_kapcsolat, lekrdezs) ;


^ -------- Ezt az SQL-lekrdezst kell vgrehajtani - ez az, amit egy kawkterlncba tettl.
^e feledd, Hogy ezek a kapcs > ^__ vltozk a te adatbzisaid ese e e msok lesznek.

12 az ---------------- .% ftiQQvnven keresztl. K eresi. Ez az ltreHoztl a m ysqlLconnnect 11 99

A mysqli_query () fggvny ltal ignyelt adatbzis-kapcsolatot a mysqli_connect {) fggvny adja vissza neked. Ha ez egy kicsit homlvos lenne, me a kd, amely ltrehozta a kapcsolatot:

$dbc = mysqli_connect('data.aliensabductedme.com, 'owen', or die('Error connecting to MySQL server.');


Az adatbzissal ltestett kapcsolatot korbban a $dbc vltozban raktroztuk el.

aliensrool',

'aliendatabase'

Az SQL-lekrdezsek olyan $QLkdknt megrt krelmek, amelye ket az adat bzis kiszolglnak
aabzskpslt dti-acoa

Van teht egy adatbzis-kapcsolatod ($dbc) s egy SQL-lekrdezsed ($query). Mr csak annyi hinyzik, hogy tadd ket a mysqli_query ( ) fggvnynek:

A lekrdezs

$result = mysqli query($dbc, $query);


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

or die('Error querying database.);


A lekrdezs eredmnye

kldnk.

Ez a kd azt mutatja, hogy a mysql i_query () fggvny meghvsa nem csupn egyirny kommunikci. A fggvny vlaszol, mgpedig azzal az informcival, amit a $result (eredmny) vltoz trol. Az l NSERT lekrdezs ugyanakkor nem ad vissza tnyleges adatokat - a $result vltoz csak azt trolja, hogy a mysqli_query () ltal kiadott lekrdezs sikeres volt-e.

A mysqli_query() fggvny egy adatbzis-kapcsolatot, valamint egy lekrdez karakterlncot ignyel egy SQL-lekrdezs vgrehajtshoz.
86 2 . fejezet

kapcsolds a M y S Q L -h e z

A kapcsolat bezrsa a mysqli_close() fggvnnyel


Mivel csak egyetlen i n s e r t lekrdezst szeretnl vgre hajtani, az adatbzissal val kommunikci ezzel vget is r. legalbbis ami a parancsfjlodat illeti. Ha viszont az adatbzis-kapcsolatra mr nincs szksg, akkor be kell zrni. Az adatbzis-kapcsolatok bezrjk nmagukat, ha a felhasznl tvozik az oldalrl, de ahhoz hasonlan, ahogy egy ajtt behzol magad mgtt, az adatbzis kapcsolatokat is j szoks bezrni, ha vgeztl velk. A MySQL adatbzis-kapcsolatok bezrsra a PHP m y s q li_ c lo s e () fggvnye szolgl.

Csatlakoflink a my6qti_-6onfK)6i(H % 9vnnyol. Q QsszoUUjuk- a4okf-doe karakterineot. & Vgrehajtjuk a lokofd( 6t-a-fnyoqli_quoryO fggvnnyol. (^B ezrjuk a kapcsolatot a mysqlicloseQ fggvnnyel^

mysqli close (adatbzis_kapcsolat);


w idd kommunikcira bzis-kapcsolati vltozt.
Owen parancsfjljnak esetben a m y s q li_ c lo s e ( )-nak az aktulis adatbzis-kapcsolatot kell tadnod, amelyet a $dbc vltoz trol:

mysqli_close( $ d b c ) ;

Ez a vltoz egy hivatkozst trol az adatbzis-kapcsolatra, amelyet a kapcsolat megnyitsakor a mysqli_connect() hozott ltre. De ha az a d a tb z is k a p c s o la to k nm kden bezrdnak, m i rt fo g la lko zz a k velk?

A MySQL adatbzis kapcsolatokat j szoks bezrni, ha vgeztl velk.

Az adatbzis-kiszolglk egyszerre csak egy bizonyos szm meg nyitott kapcsolatot kpesek kezelni, ezrt ha csak lehet, szabadd kell tenni az utat.
Amikor egy kapcsolatot bezrsz, a csatorna felszabadul, hogy j kap csolatot lehessen ltrehozni. Ha megosztott adatbzissal dolgozol, ak kor lehetsges pldul, hogy csak t kapcsolat engedlyezett a sz modra. Mikzben jabb s jabb adatbzis-vezrelt alkalmazsokat ksztesz, gondoskodnod kell a rendelkezsre ll kapcsolatok elrhe tv ttelrl.
most itt vagy

0-

87

nem hlye krdsek s jratlts

Nincsenek

hlye krdsek
lekrdezst kiad Nem K ! nl a lehet az sszes SQL-kdot egyszeren kzvetle K ! Az az eredmnnyel? kdnak kell valamit csinlnia () fggvnybe tenni,
insert

m ysql i_ g u e r y a $q u ery vltoz helyre?

\ De igen, csak macers. A kd knnyebben ke


zelhet lesz, ha a lekrdezseidet vltozkban trolod, s ezeket a vltozkat hasznlod a m y sq li_ q u e ry () fggvnyben.

V ! Esetleg igen. A d ie () fggvnyt mr hasznl

tuk, hogy lelltsuk a parancsfjlt, s zenetet kldjnk a bngsznek, ha valami flresiklana. Egy sikertelen lekrdezs esetn azonban elfordulhat, hogy ennl tbb informcit sze retnl adni a felhasznlnak, mely esetben a lekrdezs eredm nybl llapthatod meg. hogy a lekrdezs sikerrel jrt-e.

jratltve
Az adatbzis-kapcsolatok ltrehozshoz a helyet, a felhasznlnevet, a jelszt s az adatbzis nevt kell megadnod. A PHP-parancsfjlod s a MySQL adatbzis kiszolgl kztt a m ysql i_ c o r m e c t () fggvny teremt kapcsolatot. A d ie () fggvny lelltja a parancsfjlt, s visszajelzst ad, ha a kapcsolat meghisul. PHP-kdbl gy indthatsz SQL-lekrdezst, hogy egy karakterlncban felpted azt, majd vgrehajtod a mysql i_ q u e ry () meglivsval. Ha kszen vagy, hvd meg a PHP-kdbl a m y s q li_ c lo s e () fggvnyt a MySQL adat bzis-kapcsolat bezrshoz.

88

2. fejezet

kapcsolds a M yS Q L-hez

Tesztt
Cserid ki a levlkld kdot Owen report.php parancsfjljban, hogy inkbb a MySQL-adatbzisba szrja be az adatokat, s prbld ki az j fjlt!
Trld azt a kdrszt a report .php parancsfjlbl, amelyik az rlapadatokat e-mailben kldi el O w ennek, s a helyre rd be azt a kdot, amelyik csatlakozik a MySQL-adatbzishoz, PHP-karakierlncknt felpt egy SQL-lekrdezst, vgrehajtja azt az adatbzison, majd bezr ja a kapcsolatot.
<?php = mysqii_cominc: ( d ata.aliejisabd u cted m e.can *, Sdbc or d ie i'E r r o r connect m a to KySO- s e r v e r . ') ; owen , a lie n s r o a j *, '.-.i^endatcfcase')

Ez az j PHP 3<jatba'zis-kezelo kd, amelyen dolgoztai. A report.php-be ne rd be a < ?php s ? > cmkket, mert ezt a kdot egy olyan helyre fogod be szrni a parancsfjlban, ami mr ilyen cmkk kztt all.

Squery = "INSERT INTO allen3_bd u ction C a r s t nartis, iast_nam=, . "when_it^happened, how^long, howjatmy, a iien ^ d e scrip cio n . " . vftat^they^did, farig^:;p o tted , o r h e r , m ail) " . "VALUES { S a l l y ', Jo n e s ', '3 days ego , '1 d a y ', fo u r . . - gtiien with air. t n t a e ie s , W Ju st ta lk ed and played v ith a dog , " . e "y e s', I may have seen your dog; Concn^-t nw . , " . " s a i lyiiuregs- l i s t e n e r ) /jesuit ^ raysqi l_quty<$dbc, Squeryj or d i e ( r r o r querying d a t a b a s e .'* :

?>

raysqli elo ae ($dbc.i;

Tltsd fel az j report .php fjlt a webkiszolglra, s nyisd meg a report .html oldalt egy bngszben, hogy hozzfrj a Report an Abduction rlaphoz. Tltsd ki az rlapot, s kat tints a Report Abduction gombra az adatok felvitelhez az adatbzisba. Ez utn indtsd el va lamelyik MySQL-eszkzt, s hajts vgre egy SELECT lekrdezst az adatbzisban trtnt vlto zsok megtekintshez. m - HLC * F O liens afcrfu ti; y-ix S E T R M rtiu
I f i.c i o a o e i ia a c

*--------------

^ 1iy 2 I ruiiy
2 LOW ;.r. s e t S

I Jones I jw cs
O.'OlM'j & < ?

;h ^-lorv ;
3

ieS cr.r.tion
| g r t irfc I g re e n wi t h
s z

dy jgo au

ago

l . Ja y I i nay

i rc-ai i fou r

i . t e r .t .v S e s i.:iita c l* !i

| |

Helyes ez? rd le, hogy szerinted ezt kell-e csinlnia a parancsfjlnak, s hogy mirt!

m ost itt vagy

89

a $ _P O S T hasznlata az IN S E R T lekrdezsekben

Na vrjunk csak egy percet! Nem a rra megy ki a j t k , hogy fogjuk az rlap a d a ta it, s e lra k t rozzuk egy a d a tb zisb a n ? M o s t gy fe s t, m in th a a lekrdezs u g ya n a zo ka t az a d a to k a t szrn be, fggetlenl a tt l, hogy m it rta k be az rlapra. Nem l to m , hogy ez a P H P -parancsfjl hogy tu d n a b rm it is a u to m a tiz ln i.

Nos, valban komoly problmval llunk szemben. Az INSERT lekrdezsnek az rlap adatait kell beszrnia, nem statikus karakterlncokat.
Az imnt felptett lekrdezs bedrtozott karakterlncokbl ll, s nem azokra a szveges adatokra pl, amelyeket bertak az elrabls bejelent rlapra. Ahhoz, hogy a parancsfjl az rlapot vegye alapul, valahogy be kell tpllnod az rlapm ezkbe rt adatokat a lekrdez karakterlncba.

m y s q l i _ q u e r y ()

Ezeket az rlapadatokat be
Aliens Abducted Mc - Report *n Abdocboa

kell ju tta tn i a Squery karak-

te*

f "liM W W H>
V tK

hkdb Mhiw:

.f-n :

*? ** *-* TTf t!rf *

A felhasznlk ltal megadott adatok

terlncba.

At*"*

az e l r a b l s h e j e l e n t o
rlaprl szrmaznak.

Agytorna
Milyen PHP-kddal olvashatjuk ki az rtkeket Ow en rlapjrl, s tpllhatjuk be az INSERT lekrdezsbe?

90

2. fejezet

kapcsolds u M yS Q L-hez

Az rlapadatokat a $_P0ST adja meg


Szerencsre a report.php parancsfjl vltozi a $_POST szupergloblisnak ksznheten mr troljk az rlap adatait. Emlkszel erre a PHP-kdra?

$name = $ POST[1firstname' ]

$ POST[*lastname'];

$when_it_happened = $_P0ST['wheni thappened]; $how_long = $_P0ST[howlong1]; $how_many = $_POST[1howmany]/

Owk. r l * " * f J nyertk az adatokat a $ _P0 pergloblis segtsgvel, es va tozo ba rtuk azokat.

$alien_description = $_POST[aliendescription1] $what_they_did = $_P0ST[ whattheydid']; $fang_spotted = $_POST[fangspotted]/ $email = $ _ P 0 S T [email']; $other = $ POST['other];

X.

Emlkezz vissza, hogy a $_P0ST-nak megadott neveknek egyeznik kell a HTML-rlapmezok neveivel.

Az rlapadatok teht mr a kezedben vannak, csak be kell ptened azokat


az idegenekkel kapcsolatos adatokat beszr INSERT utastsba. Ehhez azonban elszr el kell vgezned egy apr mdostst. Most, hogy mr nem e-mailben kldd el az rlapadatokat, nincs szksg a $name vltoz ra. A felhasznl kereszt- s vezetknevre azonban igen, hogy hozzad hasd az adatbzishoz - csak ppen kln-kln vltozkban: $first_name = $_P0ST[*firstname]; $last name = $ POST[lastname];

A felhasznl nevnek rszeit most mr nll vltozk troljk, hogy kln oszlopokba rhasd okt az aliens abduction tblban.

Gyakorlat

rd meg a PHP-kdot, amely ltrehozza Ow en INSERT lekrdez karakterlnct a $q u ery vltozban, s gondoskodj rla. hogy vgrehajtskor a tnyleges rlapada tokat rja az aliens_abduction tblba!

m ost itt vagy >

91

aposztrfok s idzjelek a php-ben

Gyakorlat - megoldat

rd meg a PHP-kdot, amely ltrehozza Owen 1NSERT lekrdez karakterlnct a $q u ery vltozban, s gondoskodj rla, hogy vgrehajtskor a tnyleges rlapadatokat rja az a lie n s _ a b d u c t io n tblba!

Az oszlopnevek pontosan ugyangy szerepelnek az SQLutastsban, mint korbban.


W Y . . H! ! f S W T IN T 0 a l i ^ s ^ a b a u d \o * ( - f i r s t ^ a m e , la s t_* a * e , w K c i ^ _ i _ _ K a j > p c ^ c d / _ t w

W hw^m3ny, arer^clesvij>ticm, wKai_tKey^_did, fa^^spot'tcd, oiher, email) w. VAUXES V-fiv*st_jramc;, 1 flast__name,; 'fwhen^i*fc_happe*cd,i V h o ^ Jo ^ 1 fhow_many7 u ^ , w ;falien_desriptior/, lfwha*t__hey__did,# v ar\ | o-ttcdi> VcrtKcr1 'femdl1 f-C Q __sp , )^

Sally Jones elrablsnak statikus j adatai helyett most mr azokat az adatokat szrod be, amelyeket a felhasznl ppen bert az rlapra. Nincsenek

az oszlopnevek sorrendivel, h 9 , H U . 9w w ke,u 1

hlye krdsek
K:
Ltre kell hoznom az sszes vltozt a $_POST adatainak t rolsra? Nem lehet egyszeren kzvetlenl a $_POST-ada-

V: De igen. Semmi sem akadlyozza meg, hogy egy lekrde


zsbe kzvetlenl rd be a $_POST-ot. Mindazonltal kdolskor ajnlott sztvlasztani az rlapadatokat, mieltt brmit is csinlnl velk. Ennek az az oka, hogy az rlap adatokat ltalban valamilyen mrtkig fel kell dolgozni, mieltt egy adatbzisba szrhatnnk azokat. A hackerek pldul mindenfle furfangos mdon, veszlyes adatok beszrsval eltrthetik a lekrdezseket. A 6. fejezetben majd azt is megtanulod, hogy miknt vdheted ki az ilyen ksrleteket. Az egyszersg kedvrt ebben a fejezetben nem vgznk semmilyen feldolgozst az rlapadatokon, de ez nem jelenti azt. hogy ne tanuld meg mr most, hogy az rlapadatokat clszer kln-kln vltozkba rni. m ieltt eg y lekrdezsbe szrnd azokat.

tokra hivatkozni a $ q u e r y karakterlncbl?

tozkat. Ennek az az oka. hogy a PHP attl fggen klnbzkppen kezeli a karakterlncokat, hogy azok aposztrfok vagy ketts idzjelek kztt llnak. A kett kztt az a klnbsg, hogy az aposztrfok azr jelzik, hogy ami kzttk ll, azt pontosan olyan sz vegknt kell hasznlni, ahogy ott szerepel, mg az id zjelbe telt szvegek tovbbi feldolgozson esnek ke resztl. Ez a feldolgozs azt eredmnyezi, hogy a ket ts idzjelek kz zrt vltozk rtke kerl a vltoz nevnek helyre - ami nagyon jl jn. s a ketts id zjeleket ezrt rszestik ltalban elnyben az SQL nyelv lekrdez karakterlncok felptshez.

K: V : De igen. s ha sszefzst alkalmazol, ketts idzje

Nem lehet egyszeren gy felpteni egy lekrdez karakter lncot, hogy sszefzzk a vltozkat az SQL-kddal?

K:

OK. s az szmt, hogy hol hasznlok aposztrfokat s ketts idzjeleket? Tehetek aposztrfokat az egsz lekrdezs kr s idzjeleket az egyes vltozk elejre s vgre?

V: Szmt bizony - s nem, nem zrhatod aposztrfok k


92
2. fejezet

lek helyett termszetesen hasznlhatsz aposztrfokat is. A lekrdez karakterlncok azonban hajlamosak bonyolultt vlni, ezrt brmi jl jn, amivel olvasha tbb tudod tenni ket - ha a vltozkat kzvetlenl gyazod be egy ( ketts) idzjeles karakterlncba a Ivett, hogy aposztrfok kz tennd s sszefznd ket, azzal egyrtelmen ttekinthetbb teheted a le krdez karakterlncokat.

z az egsz lekrdezst s ketts idzjelek kz a vl

kapcsolds a M yS Q L-hez

Gyakorlat

Hasznlj fel mindent, amit eddig tanultl, hogy befejezd Owen rlapkezel PHP-parancsfjljt. hogy kpes legyen az idegenekkel kapcsolatos adatokat egy adatbzisban trolni. A r e p o r t .php parancsfjl elksztshez egsztsd ki az albbi PHP-kdot:

<?php

$w h e n _ it_ h a p p e n e d - $_POST[ ' w henithap pened * ] ; $how_l onq = $_POST [ h o w l n g ] ; $how many = $ POST[ rhowmany ] ; $ a l i e n d e s c r i p t i o n = 3 POST[ 1a l i e n d e s c r i p t i o n ' ] ; $ w h a t _ t h e y _ d i d = $ _ P O S T [fw h a t t h e y d i d ] ; $ a n g s p o t t e d - $ POST[ 1f a n g s p o t t e d * 3 ; $ em ail = $_POST[ ' e m a i1 '1 ; $o t.h e r = $_POSTf o t h e r '] ; $d b c =

$ q u e r y = "INSERT INTO a l i e n s _ a b d u c t i o n ( f i r s t _ n a m e , l a s t _ n a m e , w h e n _ it_ h a p p e n e d , h o w _lo n g , " uhow_many, a l i e n _ d e s c r i p t i n , w h a t _ t h e y _ d l d , f a n g _ s p o t t e d , o t h e r , e m a i l ) . "VALUES ( r $ f i r s t _ n a m e f , 1$ l a s t _ n a m e 1, ' $ w h e n _ it_ h a p p e n e d ' , $ h o w _ l n g ', ^ h w j h a n j r ' , " . " ' $ a l i e r . _ d e s c r i p t i o n ' , f$ w h a t _ t h e y _ d d 1, ' $ f a n g _ s p o t t e d 1, ' S o t h e r ' , ' S e m a i l ' ) " ; $resu lt =

e c h c Thanks f o r s u b m i t t i n g t h e f o r m . < b r / > ' ; ech o 'You were a b d u c te d . $when_ i t happened; e ch o and w ere gone f o r 1 . Show lo n g . *< br / > ' ; e c h o Number o f a l i e n s : 1 . $how many . r < br / > ; ech o ' D e s c r i b e them: 1 . $ a l i e n d e s c r i p t i o n . f< br / > ' ; e c h c 'The a l i e n s d i d t h i s : * . $ w h a t _ t h e y _ d i d . ' <br / > ' ; e ch o 'Was Fang t h e r e ? ' . $ f a n g _ s p o t t e d . '< b r / > ; ech o ' O t h e r -omments: ' . $ o t h e r . '< b r / > ' ; ech o 'Y o u r emai l a d d r e s s i s ' . $ e m a i l ;

m ost itt vagy 93

Gyakorlat

- megolds

Gyakorlat - megolds

Hasznlj fel mindent, amit eddig tanultl, hogy befejezd Owen dapkezel PHPparancsfjljt, hogy kpes legyen az idegenekkel kapcsolatos adatokat egy adatb zisban trolni. A r e p o r t .php parancsfjl elksztshez egsztsd ki az albbi PHP-kdot:

Ezek az j vltozk troljk a felhasznl kereszt es vezetknevt, abban a formban, ahogy bertk
<?php
?- f ir s t fi8 n ?

az rlapra. POSTT-f.t*amJ; |f s g u M f t t e O l h ilta t.l 9


adatbzi shoz, 8$ R c i k a t.

flds^jndme f^P S 7Tlast*am e'J;


$ w h e n _it_ h ap p e n ed = $ _ POST L'w h e n i t happen e d 1 ] ; $how_long = $_POST[ 1h o w io n g ' ] ; $how_many = $_POST( howmany' ] ; $ a l i e n d e s c r i p t i o n = $_POST[ ' a l i e n d e s c r i p t i o n ' ] ;

fAilol a l/n?ncl kell a pHP-kdbl csatlaKO adnod a m6<}T6BlO K y *

$w hat_they_did =
$ e m a il

$ _ post i 'w h a tth e y d id ' j $ f a n g s p o t t e d = $ POST [ ' f a n q s p o t t e d f J ;

;
/

/ /
/

A lekrdezst egy PHP-karakterlnc forma... f .


ja fa a n k e l f

_p o st

[ -e m

a il

];

leptened, gyelve arra, hogy

$other = $_ post i other j ;

3z adatok az urlapmezkbol szrmazzanak.

3dbe = n^ys^li dor\hcdt ( vdata.alic>\sabclud-tecli^c don\,; 'owtt\, v alic*sroof, 1 3lie^cl3t3b3s/^ or die(l rro r cmnettmg to /V]yS$L server/);
$ q u e r y - "INSERT INTO a l i e n s _ a b d u c t i o n ( f i r s t _ n a m e , l a s t _ n a m e , w h e n _ it_ h a p p e n e d , how l o n g , " "how_many, a l i e n d e s c r i p t i o n , w h a t _ t h e y _ d i d , fang s p o t t e d , o t h e r , e m a i l ) " . "VALUES ( ' $ f i r s i n a m e ', ' $ l a s t _ n a m e ' , ?$ w h e n _ it h a p p e n e d ', '$ h o w _ I o n g ', '$how _m any', n * $ a l i e n _ d e s c r i p t i o n ' , ' $ w h a t _ r h e y _ d i d ' , '$ a n g s p o t t e d ' , ' $ o t h e r ' , ' o e m a i l ' ) " ;

$ r e s u l t - mys<\li^ue*-y(/dbi, fouevy) c die('E rror ^uerymg d a a b a s mys^li losc(/dbd); ^ ....................................................


ech o echo echo e ch o e ch o e ch o ech o

Itt hajtod vgre a lekrdezst az adatbzison, vagyis itt szrod be az adatokat! Ez zrja be az adatbzis-kapcsolatot.

'Thanks f o r s u b m i t t i n g t h e f o r m . < b r / > ' ; 'You w ere a b d u c t e d 1 . $when i t _ h a p p e n e d ; ' and w ere gone f o r ' . $how l o n g . ' < b r / > ' ; 'Number o f a l i e n s : ' . $how many . '< b r / > ' ; ' D e s c r i b e them : ' . $ a l i e n d e s c r i p t i o n . ' < b r / > ' ; 'The a l i e n s d i d t h i s : ' . $ w h a t _ t h e y _ d i d . 1<br / > ' ; 'Was Fang t h e r e ? ' . S fan g s p o t t e d . '< b r / > ' ; . fcZZBi erb S^p^ 9 rlp ^ ,

?>

ech o ' O t h e r comments: ' . $ o t h e r . ' < b r / > ' ; echo 'Y o u r e m a i l a d d r e s s i s ' . $ e m a i l ;

keres elkldst, akarcsak a rgi parancsfjlban.

94

2. fejezet

kapcsolds a M yS Q L-hez

Tesztt
Mdostsd Owen parancsfjljt, hogy a tnyleges rlapadatokat szrja be egy INSERT utasts vgrehajtsakor!
Tvoltsd el a $name vltozt a r e p o r t .php parancsfjlbl, add hozz a $ fir s t_ n a m e s $ l a s t _ na me vltozkat, s mdostsd gy a $query vltozt, hogy statikus szveg helyett az rlapvltozkat hasz nlja fel az INSERT utastsban. Tltsd fel a parancsfjl j vltozatt, s prbld ki: kldd el nhnyszor a r e p o r t . ht ml oldalon tallhat rlapot, minden alkalommal ms-ms adatokkal kitltve.
Aliens Abducted M e - Report an Abduction

S wv *wty oato * c o h e rttf Ewo o

A liens .Abducted M e - R ep o rt an A bduction


Share you* cxy oi il* r aMuctioc.:

F am irtt a t: -------- I_u n io c: -r TT W bj*or l W b*


W hen

A,ip Ahduc;
ShOl? Voiw tTT.

F twnirs uc
^ L-a*t Dime: A b d u C W ud is your *tnai MMm>? alfr+rwwMfotticom
* ________

'izr FaB

*-------

***** ,h do to you-. f J Wbndidlbey


Have you **** W V * No

"T ib o rat Wyu


{**e otun/
Hwmn d , o a y id
<**> < i0

t-* l am u *;

d hpe ? id a pn How tons were you 6ne? Ilo . tnn d yue? w a v id o


U b fii it

u n c o ________ ___

&z >v

__
_

D w xlhc them: m m did tfaey do 10 you? Have you *eeo m j dog tan g?

TttTr*m,n _ - i s a t** *C Ye# No 0

W IKtom C M Aa

Most pedig valamelyik MySQL-eszkzzel hajts vgre egy SELECT lekrdezst, s tekintsd meg az a l i e n s a b d u c tio n tbla tartalmt.
Sally Jones adatai kt sor
B y a q l - * SKKTP F ? j M a 1 : e r , 3 _ a b j c c i o n ;
r u O lt 1 / . ----------

adatai most mr pontosan gy jelennek meg a tbl ban, abogy vrtuk.

laat n

w , o n _ - t hcw lo g > iY

, nw C jIl3
I r ^u r

j ^
i ?c r* n V I t h 52 t r .T A d

ban is szerepelnek, mert az INSERT lekrdezs k i ir t s a el ' sor is meg m a ra d t. Emiatt ne aggdj a kvetkez fejezetben azt is megtanulod majd, Hogy miknt trlhetsz nemk vnatos adatokat.

I Sa11 y I L'c-n i Shiil


A l:

I S a lly ,

I Jn n o s

I -Jc-noi.
; d r

I O ay u le
W tiiM

I I ^jyc ag I cw . ' 1 ck 9 I ruxia.-cc .t *> ' 1a c J emt-r -B v b

i Sayr

: I w she :*ntaci ath I 3 n a < ru c "? u io d 1 1in n I o o t o 4 i i t e . a-*rite I l>Qora ' I d n k o thtW ws B 1*. :*;ht 1 ; 4 p -* n w . | 11 lii.n i
|

I i day 1 .Jay

gi-j-u n n se

m ost itt vagy

95

W H E R E z r a d k h o z z a d s a a S E L E C T le k rd e z s h e z

Owennek segtsgre van szksge az adatok tvizsglshoz


Az j, kijavtott r e p o r t .php parancsfjl elvgzi a feladatt, s automatizlja az idegenekkel kapcsolatos adatok hozzadst az adatbzishoz. Owen htradlhet, s vrhatja a bejelentseket...eltekintve attl, hogy felmerl egy jabb problma. A tbb adat mg nem jelenti azt, hogy knnyebb megtallni az el rablsokrl szl beszm olk kztt azokat, am elyekben esetleg Agyarrl is sz esik.

Igazn fel vagyok dobva, hogy van egy a d a tb z is o m , am i nm kden fe lt lto d ik az idegenekkel ka p c so la tb a n a fe lh a szn l k lta l m e g a d o tt Inform cikkal, de ez mg nem s e g t abban, hogy m e g ta l lja m a z o k a t a bejelentseket, am elyek A g y a r nyomra vezethetnek.

Owennek valahogy tudnia kell konkrt adatokat keresni, pldul olyan elrablsokat, ahol lttk Agyart.
Azt tudjuk, hogy az adatbzisnak melyik oszlopa tartalmazza a krdses informcit: a fa n g _ s p o tte d . Ebben az oszlopban a y e s vagy a no rtk llhat, attl fggen, hogy az elrabolt szemly a beszm olja szerint ltta-e Agyart vagy sem. Amire teht szksg van, az az, hogy csak azokat a bejelentseket vlasszuk ki az a lie n s _ a b d u c t ion tblbl, amelyek a fa n g _ s p o tte d oszlopban y e s rtket tartalmaznak. Azt mr tudod, hogy az albbi SQL-lekrdezs a tbla sszes adatt visszaadja:

SELECT * FROM aliens_abduction


Az SQL SELECT utastshoz azonban egy olyan zradkot is ragaszthatsz, amellyel szablyozhatod, hogy a lekrdezs milyen adatokat adjon vissza. Ennek a zra dknak WHERE - (a)hol - a neve. s pontosan megmondhatod neki, hogy mi szerint szeretnd szrni a lekrdezs eredmnyt. Owen esetben arra van szksg, hogy csak azokat a bejelentseket vlaszd ki. amelyeknl a fa n g _ s p o tte d oszlop rtke y es:
Ne feledd bog, a WHERE radk nelku , lekerdezes . csillag miatt , Az P neV ^ A, osz| p rtkt meg kell M h y , lekrdezs T ) tudjon v|as* ani adatokat. J

SELECT * FROM aliens abduction WHERE fang spotted = 'yes'


'--------------------------------------------------------

a tbla oS e 5 adatt k M lm t j. .

A SELECT lekrdezsnek ez a rsze vltozatlan marad - az eredmnyhal maz szktsrl a WHERE zradk gondoskodik.

Ez a zradk szri meg a lekrdezs ltal visszaadott adatokat, s csak azokat adja vissza, amelyeknl a fang_spotted oszlopban yes rtk tallhat.

96

2. fejezet

kapcsolds a M yS Q L-h e z

Tsztt
Prbld ki a SELECT lekrdezst egy WHERE zradkkal knkt adatokat keresve!
Egy WHERE zradkkal elltott SELECT lekrdezs segtsgvel a vlasztott MySQL-eszkzben keresd meg azokat az idegenekkel kapcsolatos bejelentseket, amelyeknl az elrabolt szemly ltta Agyart.
R te Eoi*. Winoow Help HaveVouSeenHirp

rr.ysql> SELECT * FRO a l i e n s _ a b d u c t i o n WHERE f a n g s p o r .c e d M

! ! I

S ally Don ShiLL Mickey

' j ! ' I

3 days ago 2 days ago bach In 1991 summer o f * 69 j u s t now

! fosTr II

! .ou r ! dunno

* | 1 1

' dn' i. K now '

nd_cc_Liriting !_ hundreds

b rows in ser

< 0 .0 0 0 5 sec)

c c a f o th e
f i e y e s

ne t I yes com f com f yes n e t ! ves

most itt vagy >

97

O w en m y sq!-ad at bzisa elkszlt s mkdik

Owen j ton jr, hogy megtallja Agyart


A PHP-nek s a MySQL-adatbzisok kezelsre szolgl fggvnyeinek ksznheten Owen MySQL adatbzis-kiszolglja megkapja az elrablsbejelent HTML-rlaprl rkez, idegenek kel kapcsolatos adatokat, s egy adatbzis-tblban trolja azokat, az adatok pedig bizton sgban vrakoznak a tblban, amg Owen idt nem tud szaktani az tvizsglsukra. Ha kszen ll, csak egy egyszer SELECT lekrdezs indtsa szksges ahhoz, hogy elklntse azokat a bejelentseket, amelyek Agyar nyomra vezethetik.

Owen - UFO- s adatbzis-rajong

K la ssz! A z adatok a d a tb z is b a n t r o l s a sokkal kir lya b b a z e-m alleknl. M o s t m r t n y le g a zo k ra a z e lra b o lta k ra s s z p o n to s th a to k , a kik e s e tle g l t t k A g y a rt.

1 f n c Ed it W ' n o * t i e i p T * o D f t q l c O i * l h r *

mysql> FBTCT * FRM al t er : - abd u ction W HERE fd-.a sp cj-t-d how_long

'je-'j

I f i r s " r.aroc I l a s t nan- I when_Ic_happeried

hcw_mdny
, f OUr

! Sally

|1 ll | l | l

Tones OudyltWstrie r Mi

3 days aa: | t?dc> r, 1*51 I a uit^m r o f '5 9 e | )uZr


chf-

l _ p e c o i a ____ t _s:araeT:l7n^ i n

I 1 i -V 1 1I I^ M oU X S II S SinuLcs. . . and count ing 7 0 -^b - J _sove-rai y carv 1

|l 3 ' seconds

I dunno

-1

I on fc /.now1 | nundrets I I p io n ty I

5 rows ir | farig_spi;,.;:cJ I oi.hci. .


fn *t room icci 'net 'cofft I yer, i -r '-j | yea ( yea I yea
.

L ------- 4------------------------------ - i - . ----------------------- ----------------------------------------------------------------------------------------- ----------------------------- -- _ .|

-------- 4

--------------------4 ------------------------------------ - -

I i I I f

1 1 T was out o f gas, ao i t a pretty good ahdociion. , I'm thinXincj about designing i itelnet to thwart tutu re abductions, i T see a dog, and'-bu^ches o f b e e t l e . _____ \
T .-really do love r-.ta to s.
-- ----------------------------------------------------------------------

T ip.yy have fcen yout dog. conLadt me.

98

2 . fejezet

kapcsolds a M y S Q L-h ez

lltsd prba!
Br gy sszefoglalva mg nem tallkoztl velk, prostsd ssze az albbi HTML-, PHP- s MySQLsszetevket aszerint, hogy mire valk:

aliendatabase aliens abduction tbla

SQL-kd, amelyet a PHP-parancsfjl tad a MySQLkiszolglnak. Ez futtatja a PHP-parancsfjlokat, s adja vissza a HTMLoldalakat a bngszknek, a mvelet sorn gyakran egy adatbzissal kommuniklva. Az a l i e n s a b d u c tio n tblt tartalmaz adatbzis neve. A HTML-rlap ezt a krelem mdszert hasznlja arra, hogy az rlapadatokat elkldje egy PHP-parancsfjlnak. Vgeredmnyben it fognak troldni a r e p o r t .h t m l oldal rlapjrl szrmaz adatok. Itt gyjti ssze Owen az adatokat a felhasznlktl. Ez a PHP-fggvny zrja le a kapcsolatot a MySQLkiszolglval. Owen PHP-parancsfjljnak a neve, amely feldolgozza a fel hasznlk ltal a r e p o r t . html oldal rlapjra bevitt adatokat. Ez a PHP-fggvny egy lekrdezst kld a MySQLkiszolglnak. Ezt a HTML-elemet hasznljk a w ebhely ltogati, ha befe jeztk az rlap kitltst.

report.html

report.php

POST v/ebkiszolgl

MySQL adatbzis-kiszolgl

Submit gomb lekrdezs

mysqli_connect()
gy is hvjk azt a szoftvert, amely a MySQL-t, illetve az sszes adatbzist s azok tblit mkdteti.

mysqIi_clo$e()
Ez a nem ktelez PHP-fggvny azt mondja meg az adatb zis-kiszolglnak, hogy melyik adatbzisban keressen. Ezzel teremthetsz kapcsolatot a PHP-parancsfjl s a MySQLkiszolgl kztti kommunikcihoz.

m ysqlijjueryO

mysqli_select_db()

m ost itt vagy

99

lltsd prba!

- megolds

----------aliendatabase aliens abduction tbla

lltsd prba!
Megolds

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

Br gy sszefoglalva mg nem tallkoztl velk, prostsd ssze az albbi HTML-, PHP- s MySQLsszetevket aszerint, hogy mire valk:

SQL-kd, amelyet a PHP-parancsfjl tad a MySQLkiszolglnak. Ez futtatja a PHP-parancsfjlokat, s adja vissza a HTMLoldalakat a bngszknek, a mvelet sorn gyakran egy adatbzissal kommuniklva. Az a l i e n s a b d u c tio n tblt tartalmaz adatbzis neve.

report.html

report.php
A HTML-rlap ezt a krelemmdszert hasznlja arra, hogy az rlapadatokat elkldje egy PHP-parancsfjlnak. Vgeredmnyben it fognak troldni a r e p o r t . html oldal rlapjrl szrmaz adatok.

webkiszolgl

Itt gyjti ssze Owen az adatokat a felhasznlktl. Ez a PHP-fggvny zrja le a kapcsolatot a MySQLkiszolglval. Owen PHP-parancsfjljnak a neve, amely feldolgozza a fel hasznlk ltal a r e p o r t . htm l oldal rlapjra bevitt adatokat. Ez a PHP-fggvny egy lekrdezst kld a MySQLkiszolglnak. Ezt a HTML-elemet hasznljk a webhely ltogati, ha befe jeztk az rlap kitltst. gy is hvjk azt a szoftvert, amely a MySQL-t, illetve az sszes adatbzist s azok tblit mkdteti. Ez a nem ktelez PHP-fggvny azt mondja meg az adatb zis-kiszolglnak, hogy melyik adatbzisban keressen. Ezzel teremthetsz kapcsolatot a PHP-parancsfjl s a MySQLkiszolgl kztti kommunikcihoz.

MySQL adatbzis-kiszolgl

Submit gomb lekrdezs

mysqli_connect()

mysqli_close()

mysqli_query()

mysqli_select_db()

100 2. fejezet

k a p c s o l d s a M y S Q L -h e z

Elg klassz, hogy rtiegtanultam, hogyan szrhatok be adatokat egy MySQL-tblba, de a tbla s az azt trol adatbzis ltrehozsnak mdja mg mindig nem tiszta. Azzal mi a helyzet? , /'-y-\
l krds, mert valban rtened keli. hogyan hozhatod ltre a sajt tblidat, hogy ne csak az eld tett kdot hasznlhasd. Eddig gy hoztl ltre egy tb lt. hogy nem sokat tudtl a CREATE TABLE parancs hasznlatnak szablyai rl. Owen esetben ez mg rendben volt. mert a szmra csak egyetlen tb lt kellett ltrehoznod, de ha tbb, sajt tervezs tblra van szksged, ez rnr nem elg. Kzelebbrl meg kell vizsglnod az j Lbikban troland . adatokat, s ki keli tallnod, hogy miknt lehelne a le ro b b a n trendezni g-x

// sA'S t's'>

. *><> '* v > <

m o s t it t vagy

Adatbzis ltrehozsa s feltltse

Hozd ltre a sajt adataidat!


Jamaikai vagy?
Y * M egrlk a ja m a ik a ia k rt! J J J j Ne olyan g yo rsa n , D exter. El<5bb a d a to k ra van szksgem .

A szksges adatok nem mindig llnak rendelkezsre.


Nha ltre kell hoznod az adatokat, mieltt hasznlhatnd ket. Az adatok t rolshoz pedig nha tblkat kell ltrehoznod. Az is elfordulhat, hogy ltre kell hoznod a z adatbzist. amely majd azokat az adatokat trolja, amelyeket ltre kell hoznod, mieltt hasznlhatnd ket. Elvesztetted a fonalat? Majd megtallod. Kszlj fel: most meg fogod tanulni, hogy miknt hozhatod ltre a sajt adatbzisaidat s tblidat. s ha ez mg nem lenne elg, kzben fel pted a legels PHP/MySQL-alkalmazsodat.

ez egy uj fejezet 103

kell egy levelezlista-program!

Az Elvis-bolt megnyitott!
Elmer Priestley megnyitotta Elvis-boltjt a M akeM eElvis.com cm en. A kereslet hatalmas. Elmer mr jnhny vlltmses poliszter zakt s lbarkt adott el, s persze nap szem vegek szzait. Minden alkalommal, am ikor valaki vsrol valamit. Elmer elkri az e-mail cm t, s az e-mail cm eket arra hasznlja fel, hogy hrlevelet kldjn az akcikrl. Jele n le g Elm ernek m agnak kell vgigm ennie a cmlistn, s sajt kezleg kell lemsolnia s beillesztenie a cm eket az akcit reklm oz levelekbe. A dolog mkdik, de rengeteg idt s erfesz tst ignyel.
Joffe

Elmer eddig 328 - I t tt, s a lista mindennap bovu!.

___________________

Elmer vsrli levelezlistja:


Anderson ,on

N s ew

K evin
ed

Jiilian M ia

U ar)dersor H com
e d oinan2luv@breakneckpi22a.com 9 9 @ b 0 tl0 m s u p .c o m

n"

Elmer, az online Elvis-cuecok koronzatlan kirlya.

Ez t l so k ig t a r t . Jo bb an s z e re tn m E lvis u t n z s val t lte n i a z id o m t, m in t a levelek s a j t kezi k ld z getsvel.

o
Elmer ezt a levelet rja meg, s maga illeszt be minden e-mail cmet a To1 (C m zett") mezte.

Roundtree Jo-Ann jpjoround@breaknedcpi22a.com Bnggs Chris c b rig g s @ b o a rd s -r-u s .c o m Harte Lloyd hovercraft@breakneckpi22a.com T o th Anne A n n e To th @ le a p in iim o s .c o m Wiley Andrew a n d rQ W w ile y @ o b ie c tville .n e t Palumbo Tom palofmine@mightygumbail.net Ryan Aianna angrypirate@breakneckp122a.com McKinney Clay c la y @ s t 3 rb u 22co ffe e .c o m Meeker rs Brian Ann annmeeker@choconoiic-inc.com P o w e rs b p @ h o n e y -d o it.c o m Manson Anne Mandel Debra am 86@ objectville.net Tedesco Janis debmonster@breaknecks: Talwar Vikram janistedesrr^-' .mi0cKpi22a.com __ j - . 1.01edesco@starbu 22coffee.com vikt@starbu22coffee.com Szwed Joe ^-v^ooiectville.net s2 w edjoe@ obir * Diana '" Sheridan Diana Snow Edward snowman@tikibeanlounge.< Hartfy Glenn Otto glenn0098@objectville.net com Dea/ Anne anneh@bOttOmsup.com J agel Ann Mary nobigdeal@starbu22coffee.com M etf Jam es dreamg1ri@breakneckp122a.com O hver Lee drmelfi@bOttOmsup.com P a rk e r Anne leeoiiver@weatherorama.com Ricci Peler annep@starbu22rr.ff .. R eno , uu22coffee.com Grace ricciman@tikibeanlounc' Moss grace23@obi.c tv ille.net com Zeida __^ u o je Day Clifford 2eida@weather0rama.c0m S o lge r Joyce cliffntght@breakneckpi22a.com Anne joyce@chocohoiic-inc.com Bolling Lindy annebiunt@breakneckpi22a.com Gares Fred lin d y @ lik ib e a n io u n g e .c o m Jacobs Anne fga res@ objectville.net anne99@ objectviiie.net
s h e r id i@ m ig h t y g u m b a ll.n e t

Bn lu t

Ezek az e n U rek rajta v a s Elmer le v e i listjn, vrjk,


s

hogf I

no

T3-______ *

Wk
Subject* B ig S a lo ! Dear Fellow Elvisonians,

mer s e g ts vei E lv is -b a l mssa' v 'iH O

m ~ 4
W-

Big sale th Genuine nor Kedves Elvle-rajongkl risi vsr van ezen a hten And don'~ t a MakeMeEivi&.com-onl free" leisv Valdi lezr barkk 20% rengedmnnyel kap hatk] left!
& ne feledje az gyet fizet, kctt<5t kap zak kat eem - mr csak 3 nap maradt az akcibl!

ri si v s ri

Elm er tl sok idt tlt azzal, hogy a levelezprogram jban lemsolja s beillessze a cm eket a To m ezbe, ezrt egyszersten szeretn az i e l mail cm ek felvtelnek s a krlevelek kikldsnek feladatt.

104

fejezet

Adatbzis ltrehozsa s feltltse

Elmernek egy alkalmazsra van szksge


Az a lk a lm a z s (application) olyan szoftver, am elyet arra terveztek, hogy adott fel adatokat vgezzen el a felhasznl szmra. Elm ernek teht egy alkalmazsra van szksge, am ely karbantartja a levelezlistjt, s lehetv teszi Elm ernek, hogy egy rlapgombra trtn egyetlen kattintssal levelet kldjn a listn szerepl szem lyeknek. gy szeretn, hogy az alkalmazs m kdjn:

Megnyit egy weboldalt, s berja az zenet szvegt. B f Az oldalon tallhat elkld gombra (Submit) kattint, s az zenet mindenkihez eljut, aki szerepel a MakeMeElvis.com levelezlistjn.

A ivebalkalmazsok olyan dinamikus webhelyek, amelyeket arra tervez tek, hogy adott feladato kat vgezzenek el a fel hasznlk szmra.

gf
A

A levelezlista sajt magt bvti, mgpedig gy, hogy lehetv teszi az j vsrlknak, hogy egy Webes rlapon keresztl feliratkozzanak r.

Fz a levelezlists dolog nagyon hasonlnak tnik Owen elrablasbejejMfff 3|ka|m azsa1l0z. A klnbsg csak annyi, hogy Elmer levelezo^ |i${aja sajt magi pti fel, a leveleit pedig mindenki megkapja, aki a listn szerepel. Elmer alkalmazsnak lnyege az automatizal.as!

Az alkalm azs em e bevsrllistjt elksztve Elmer teljes pom pjban maga el kpzelheti az alkalm azst...

Agytorna
A MakeMeElvis.com w ebalkalm azs kt f sszetevbl ll: egy rlapbl, amelyen Elmer megrhatja a levelezlistn szerepl szem lyeknek elkldend zenet szvegt, s ahonnan elkldheti a levelet; s egy msik rlapbl, am ely lehetv teszi az j vsrlknak, hogy feliratkozzanak a listra. Ezt a kt rlapot szem eltt tartva vzold fel Elmer alkalm azsnak szerkezett!

most itt vagy

105

a levelezlista-alkalmazs felptse

Rajzold le Elmer alkalmazsnak szerkezett!


Ezek az emberek rajta vannak Elmer levele zlistjn, e's megkap jk a krleveleket. ^ Ez az rlap-parancsfjl ketts teszi lehetv a felhasznlknak, hogy fel iratkozzanak Elmer levelezlistjra. ez a KHH-parancsfjl kldi el az zenete ket az Elmer levele zlistjn szerepl i szemlyeknek. I

addemail.html

addemail.php

W ebkiszolgl Adatbzis-kiszolgl

sendemail.php

Az adatbzis neve sd ms lesz.

Ezt a webes rla pot t lti ki Elmer a krlevl ltre hozshoz s elkldshez.

sendemail.html

M a tth e w s W e r lit z F ra n k lin

a th a n @ w is h iw a s e lv is .c o m w w c r @ s ta r b u z z c o ffe e .c o m
2

k s d g j@ g re g s -lis t.n e t

106 3. fejezet

Adatbzis ltrehozsa s feltlts

Hol kezdjk a P H P /M y 5 Q L -a lk a lm a z a s fe l p t s t? E l s z r rjuk meg a P H P -p a ra n c s f jlt, a z t n hozzuk l tre a t b l t a z a d a to k t ro l s ra ? V agy legyen ksz e l s z r a t b la , s csa k u t n a a p a ra n c s f jl?

Joe: Szerintem mindegy. A tblra s a parancsfjlra is szksgnk lesz. mieltt


az alkalmazs mkdhetne.

Frank: Ez igaz. de n azt hiszem, hogy elszr a parancsfjlt kellene megrnunk,


hogy ellenrizhessk a PHP-kdot, mieltt az adatbzishoz kapcsolnnk. Jill: De a PHP-parancsfjl teljes mrtkben az adatbzistl fgg! Nehz lesz el lenrizni, ha nincs adatbzisunk, amihez csatlakozhatna...

Frank: Nem rhatnnk meg a parancsfjlt, de gy, hogy kihagyjuk azt a konkrt k
dot, ami az adatbzishoz csatlakozik? Mindent megcsinlhatnnk, csak ppen tnylegesen nem kapcsoldnnk az adatbzishoz. Ez is nagy segtsg lenne, nem?

Frank

Joe: Nem felttlenl. Ne feledd, hogy a parancsfjlnak az az egyetlen feladata,


hogy fogja a HTML-rlapra bert adatokat, s beszrja az adatbzisba. Ha pedig levelet kld a levelezlistra, az adatbzisbl olvas, s gy lltja el az zenete ket az egyes tagok szmra. Az adatbzis teht mindenflekppen ltfontoss g a parancsfjlnak.

Jill: Ez igaz, de a HTML-rlaprl mg sz se volt. Hol jn a kpbe az rlap? Azt hiszem, az adatbzisnak kszen
kell lennie, mieltt egyltaln a parancsfjl megrsra gondolhatnnk.

Frank: Megvan! Elszr elksztjk a HTML-rlapot, aztn kitalljuk, milyen adatokat kell az adatbzisba rni, s
ha ez mind megvan, akkor sszektjk az egszet a parancsfjllal.

Joe: Nem vagyok biztos benne, hogy ennek gy van rtelme. Hogyan tudnnk elkszteni egy HTML-rlapot, ha
nem tudjuk 100%-ig, hogy milyen adatokat kell megszereznnk a felhasznlktl?

Jill: Joe-n ak igaza van. A HTML-rlap visszavezet minket oda, hogy elszr azt kell kitallnunk, hogy az alkalma
zsnak milyen adatokra van szksge. Az adatok vezrelnek mindent, ezrt gy tnik, hogy elszr az adatbzist s a tblt kell felptennk, aztn a HTML-rlapot, s csak a vgn jn a parancsfjl, ami az rlap benyjtsra reagl.

Frank: Meggyztl. Csinljuk! Joe: Szerintem azrt elbb le kne rni, hogy konkrtan milyen lpseket kell vgrehajtanunk, hogy az alkalma
zs sszelljon...
/

rd le, hogy szerinted milyen lpsek szksgesek ahhoz, hogy a tervtl eljus sunk a MakeMeElvis.com alkalmazsnak megvalstsig:

m ost itt vagy

107

a z a lk a lm a z s m e g te rv e z s e

Szksged van lehat egy tmadsi tervre, hogy sszerakhasd Elmer alkalmazst. Bontsd fel a tervet lpsekre, hogy egyszerre egy dologra sszpontosthass, s ne terheld tl az agyad:

A levelezlistt trol adatbzis s tbla ltrehozsa.


Ez a tbla trolja majd az Elmer levelezlistjn szerepl szemlyek keresztnevt, vezetknevt s e-mail cmt.

e lv is

s to re

Az j vsrlkat a listhoz ad webes rlap s PHP-parancsfjl megrsa.


Ebben a lpsben pted fel azt az rlapot s parancsfjlt, amelyik lehetv teszi a vsrlknak, hogy egyszeren megadjk a keresztnevket, vezetknevket s e-mail cmket, amelyeket aztn a levelezlisthoz adsz. addemailphp addemail.html

A lista tagjainak krlevelet kld webes rlap s PHP-parancsfjl megrsa.


Vgl egy w ebes rlapot kell felptened, amely lehetv teszi Elmernek, hogy megrjon egy levelet, s ami mg fontosabb, rnod kell egy parancsfjlt, amely fogja az zenetet, s mindenkinek elkldi, akinek a cm e sze repel a tblban. sendem ailphp
sendemail.html

108 3. fejezet

Adatbzis ltrehozsa s feltltse

Minden egy tblval kezddik


Pontosabban, minden egy adatbzissal kezddik, ami lnyegben egy t rol, amelybe adatokat helyeznk. Ha mg emlkszel, az elz fejezetben megmutattuk, hogyan oszlanak az adatbzisok bell tovbbi trolkra, amelyeket tblknak neveznk. Ahhoz hasonlan, ahogy egy naptr hetekre s napokra oszlik, a tblk adatoszlopokbl s -sorokbl plnek fel. Az oszlopok egy adott tpus adatot - pldul keresztnv, vezetknv, e-maiT - trolnak, mg a so rok oszlopok gyjtemnyei; egy sor minden oszlopbl egyet tartalmaz. Egy sor lehet pldul a Wendy, Werlitz, www@starbuzzcoffee.conV.
calendar

Az adatbzisok adatok rendszerezett trolsra szolgl trolk.

Oszlop

fi, Ezek az adatszerkezetek egyarnt tblk.


N a p ta r V asrnap
email

J 8ob m

W*rlitz Franklin I

w e S rb rzo wr<J*ta u c ff#.c


2kjdgi<gmgt-ftsf.n*f

H tf

te M

Szerda

C eU trtk

Pntek

S zo m bat

Sor

Egy adatbzison bell a tblk ltalban valamilyen mdon kapcsoldnak egymshoz, mg ha ez a kapcsolat nha laza is. A webalkalmazsok gyak ran llnak tbb tblbl, amelyek az adataikon keresztl kapcsolatban ll nak egymssal, de minden tbla oszlopokbl s sorokbl pl fel.

A tblk az adatokat osz lopok s sorok rcsszeru mintzatban troljk.

Adatbzis, amelyet egy MySQL adatb

zis-kiszolgl trol.

Nincsenek

hlye krdsek
A ; adatbzisra gy gondolhatnk, mint egy trolra, amely ben informcik tallhatk. *
j

V \Az adatbzisok adatai jellemzen

Tnylegesen hol trolja egy adatbzis az adatokat? M eg lehet nzni a fjlokat?

Msik tbla

Mg egy tbla

a merevlemezen tallhat fjlokban troldnak. Termszetesen megnz heted ket, de nem rulnak el sokat, az adatbzisfjlok ugyanis binris fj lok, amelyeket nem lehet csak gy megnyitni s elolvasni. Ezrt van az SQL - hogy belenzhessnk egy adatbzisba, s mveleteket vgez hessnk a benne trolt adatokkal.

m ost itt vagy 109

hozd ltre az adatbzist!

Lpj kapcsolatba a MySQL-kiszolglval!


Elmer alkalmazsnak egy adatbzisra s egy adattblra van szksge. Egy adatbzis mindennapi kezelse tbbnyire tblkon vgzett mve letekbl ll, de nem ugorhatsz csak gy fejest a tblk ltrehozsba - elbb ltre kell hoznod egy' adatbzist, amely majd trolja ket. Adatbzist a CREATE DATABASE SQL-paranccsal hozhatsz ltre. Ha ez megvan, mr tovbblphetsz a tblk ltrehozsra a CREATE TABI E paranccsal. De m ieltt az emltett parancsok brmelyikt kiadhatnd, csatla koznod kell a MySQL adatbzis-kiszolglhoz. Ennek mdjt az elz fejezet ben mr megtanultad, azzal egytt, hogy milyen fontos informcikra van szksg hozz.

Ev M y S Q L .t b z is -W !# -

Z .,..
1

c s a tla k o z h a t - m ir t a M yS Q L te rm in l, s egy rv n y * W . q l e m e t, egy fe lh a s z n a b n e v e t s egy je ls z t k e ll m egadnod n e k i.

Azon kvl, hogy egy PHP-parancsfjl segtsgvel kapcsolatba lpsz egy adatbzissal, s mveleteket hajtasz vgre rajta, az adatbzis-ki szolgl helyre, egy felhasznlnvre s egy jelszra lesz szksged, amit a MySQL-terminlban vagy a phpMyAdmin-ben kell megadnod. Ezek az eszkzk nagy segtsget nyjtanak az adatbzisok s tblk ltrehozsban is egy adatbzis-kezel alkalmazs fejlesztsekor. Mivel Elmer alkalmazshoz csak egyszer kell ltrehozni egy adatbzist s egy tblt, sszer sajt kezleg, egy SQL-lekrdezs segtsgvel felpteni azokat. Indtsd ht el a vlasztott MySQL-eszkzdet, s ha marosan kipiplhatod az alkalmazs fejlesztsnek els lpst, a leve lezlistt trol adatbzis s tbla ltrehozst.

Most it t vagy.

O A levelezlistt trol adatbzis s t ltrehozsa. _ -------------- Az j vsrlkat a listhoz ad webes rlap s PHP-parancsfjl megrsa. A lista tagjainak krlevelet kld webe: rlap s PHP-parancsfjl megrsa.

110 3. fejezet

A d a tb z is l tre h o z s a s feltltse

Hozd ltre az Elmer e-mail cmeit trol adatbzist!


Ahhoz, hogy elkszthesd Elmer levelezlistjnak adatbzist s tbljt, elszr ltre kell hoznod az elvis_store adatbzist, ami majd helyet ad az email_list tblnak. Mindkett ltrehozsra SQL-parancsokat fogsz hasznlni. Az SQL-ben egy adatbzist a CREATE DATABASE paranccsal hozhatsz ltre, amelyet mr rintlegesen hasznltl az elz fejezetben is. Nzzk meg most kzelebbrl, hogyan is mkdik:

^ ------A ltrehozand j

CREATE DATABASE

a d a tb z i s_ n ev e

adatbzis neve

Az SQL j adat bzis ltrehoz sra szolgl pa rancsa a CREATE DATABASE.

A CREATE DATABASE parancs utn meg kell adnod az j adatbzis nevt, me az SQL-utasts, amellyel ltrehozhatod Elmer adatbzist:

CREATE DATABASE elvi s_store


Ha vgrehajtod ezt az utastst egy MySQL adatbzis-kiszolgln, ltrejn az adatbzis.

Ha a terminlban adsz ki SQL-parancsokat, az utastsokat mindig pontosvesszvel kell lezrnod - akkor azonban nem, ha a PHP mysql> CREATE DATABASE elvis_store;< Query OK, 1 row affected (0.01 sec) mysqli_query() fggvnyn keresztl ind tasz SQL-lekrdezst. elvis store

Az elvis_store adatbzis ltrehozsa a CREATE DATABASE paranccsal egy csilivili j adatbzist eredmnyez, amelyben azonban mg nincs tbla az adatok trolsra...

Az adatbzis ltrejtt, de tb la nlkl mg nem tud adatkt trolni.

Az SQL-utastsok vgre csak akkor kell pontosvesszt tenned, ha a terminlt hasznlod.

Vigyzatl

A PH P -kdban az S Q L-utastsoknak nem k e ll p o n to svessz ve l vgzdnik, a M yS Q L -te rm in l azonban m skpp m k d ik t s m e g k ve te li, h o g y m in d en S Q L -u ta sitst p o n to sve ssz ve l z rj le. E nnek az az oka , h o g y a te rm in l tbb S Q L -u ta sit st is kp e s fu tta tn i, m g a PHP-ben egyszerre c s a k e g y p a ra n c s o t a dhatsz ki.

m ost itt vagy 111

m o s t h o z d l tre a tblt

Hozz lire egy tblt az adatbzison bell!


Mieltt ltrehozhatnd a tblt, tudnod kell, hogy milyen adatokat akarsz trolni benne. Elmer a levelezlistjn szerepl szem lyek kereszt- s vezetknevt sze retn felhasznlni, hogy a kikldtt leveleket kicsit szem lyesebb tegye. Ha eh hez hozzvesszk az e-mail cmet, akkor azt kapjuk, hogy Elmer e m a i l _ l i s t tb ljnak minden bejegyzse hromfle adatot kell, hogy tartalmazzon. A tblkban minden adat egy-egy oszlopba kerl, amelyeknek olyan nevet kell adnunk, ami lerja, hogy milyen adatrl van sz. Legyenek ht az oszlopnevek f i r s t _ n a m e (keresztnv), la st_ n a m e (vezetknv) s emai l . A tblban minden sor egyetlen adatot tartalmaz ezekben az oszlopokban, s a sorok egy-egy bejegy zst alkotnak Elmer levelezlistjban.

Az elvis_stre adatbzisban az email J W W kvl sok

ms
i

t b l t

is

t ro lh a tn n k ,

elvis store

ig
Joh Matthews \onathaM@w \jjhjiwa$elv\s.com
Wewdy W u r l i i z ___
wwer@starbuzzcoffee Joe Bob FraNkliN ____

Elmer e-mail cmeket trtai maz rgi szvegfjlja nem ve heti fel a versenyt egy adatb zis-tbla rendszerezettsgvel s biztonsgval.

M a t th e w s W e r iit z F ra n k lin

onathan@wishiwaselvis.com w w er@ 5tarbuzzcoffee.com 2 k s d g j@ g re g 5 -lis t.n e t

2tajg@gregs-lisi*et

Ezek sorok. Mindegyikben egy Ezek oszlopok. A mi tblnk ban hrom van.
mailinglist.txt

szemly keresztneve, vezetk neve s e-mail cme tallhat.

A tblk sorai vzszintesek, az oszlopaik pe dig fgglegesek.

Most mr tudod, hogy a vsrlk keresztnevt, vezetknevt s e-mail cmt oszlopok knt kell ltrehoznod az e m a i l _ l i s t tblban. A gond csak az, hogy a MySQL-tblk ersen strukturltak, s pusztn egy adatoszlop nevnl tbb informcit vrnak tled. Az adatbzisnak azt is meg kell mondanod, hogy milyen adatot szndkozol trolni az adott oszlopban.

Elmer j e m a iljis t tbljnak adatoszlopai.

112 3. fejezet

Adatbzis ltrehozsa s feltltse

Meg kell hatroznod az adatokat


Termkek
Amikor ltrehozol egy tblt, meg kell mondanod a MySQL-kiszolglnak, hogy mi lyen tpus adatokat fognak trolni az egyes oszlopok. Az adattpust minden MySQL-oszlop esetben meg kell adni, s egy tblban minden oszlop egy adott t pus adatot trol. Ez azt jelenti, hogy egyes oszlopokban szveg, ms oszlopokban szmrtkek, megint msokban dtumok vagy idpontok lehetnek, s gy tovbb. A MySQL-ben szmos klnfle adattpus ltezik, s tudnod kell, hogy az egyes adatokhoz melyik a legm egfelelbb. Tegyk fel, hogy Elmernek van egy p ro d u c ts (term kek) nev tblja, amely a boltban rustott rucikkeket kveti nyomon:
t,
Kk artti\opb<5r cip Poliszter nadrg filterekkel Felragaszthat bark Elvie-parka

mm*
'

Eta,, M i i * * '51

Az inventory (raktrkszlet) oszlopban egy egsz szm mutatja, hogy az adott cikkbl hny darab van raktron.
inventory
24 16 93 7

products
id
1

product
B lu e S u e d e S h o e s

price
5 9 .0 0 2 3 .5 0 1 .9 9 4 8 .0 0

Egsz szm
product
B lu e S u e d e S h o e s

P o ly e s te r P ants w ith S e q u in s
2

3 4

S tic k -O n S id e b u rn s E lvis w ig

inventory
P o ly e s te r P ants w ith S eq u ir 24 S tic k -O n S id e b u rn s

Az id (azonost) oszlop egyedi azonostrtket trol Elmer boltjnak minden termkhez.

A price (r) oszlop

trtk

16 Elvis w iq 93

Szbveg

Eszreveheted, hogy a p r o d u c ts tblban a p ro d u ct (term k) az egyetlen szveges oszlop; a p r i c e oszlopban decimlis szmok, az in v e n to r y s id oszlopokban pedig egsz szmok tallhatk. A MySQL-ben minden adattpusnak sajt neve van, s tovbbi tpusok is lteznek, pldul a dtumokhoz s idpontokhoz. Amikor ltrehozod egy tbla oszlopait, fontos, hogy a megfelel adattpu sokat hasznld, mert a tblk csak gy lehetnek pontosak s hatkonyak. A szveges adatok trolshoz pldul tbb helyre van szksg, mint az egsz szm tpus adatokhoz, ezrt ha egy oszlopban csak egsz szmokat kell trolni, az a legblcsebb, ha az oszlopot egsz szm tpusknt hatrozod meg. Ezen kvl, ha a webkiszolgl tudja, hogy egy oszlopban milyen adatok tallhatk, akkor nem engedi meg, hogy vletlenl rossz tpus adatot szrj be az oszlopba. Ha egy* oszlop pldul dtumokat trol, akkor hiba zenetet kapsz, ha nem dtumot prblsz belerni.

Egsz szm

Agytorna

Egy tbla ltrehozshoz tudnod kell, hogy a tbla egyes oszlopainak milyen tpus adatot kell trolniuk.

Mit gondolsz, mirt jobb klnfle adattpusokat hasznlni ahelyett, hogy mindent szvegknt trolnnk?

most itt vagy

113

g y a k ra n h a s z n lt m y s q l-a d a ttip u s o k

Ismerkedj meg a MySQL nhny adattpusval!


Az albbiakban a leghasznosabb MySQL-adattpusok kzl ismerkedhetsz meg nhnnyal. Ne feledd, hogy egy tblban egy adott oszlop adatainak lersra brme lyiket hasznlhatod - az adattpusok feladata, hogy az adataidat a m egfelel form ban troljk.

INT vagy INTEGER. Vlemnye szerint a sz moknak egszeknek kell lennik, de nem ijed meg a negatv szmoktl. Rvid egszeket is tud trolni; ebben az esetben a neve TINYINT (kicsiegsz"). Hvd csak BLOB-nak. A nagydarab binris DEC, ami a DECIML rvid tse. Annyit tizedeshelyet ad neked, amennyit csak krsz, legalbbis amg belefer. BLOB j bartja, TEXT. A terjedelmes szvegek trolsban a legjobb - sokkal jobb, mint
OATETIME, akit TIMESTAMP

saSsS*'
amelyek mindig azonos hs

adatokat kedveli.

CHAR vagy VARCHAR.

nven is ismernek. A dtumoaf s az idpontokat tartja szmon. DATE, aki a dtumokat tartja szmon. Az idpontok viszont nem rdeklik. Van egy iker testvre is, TIME, akit viszont a dtumok nem hoznak lzba.

Ez VARCHAR, ami a VARiabie


m a r..

>wi -ww...

. ( ** f

z4s,!

";k V
h* * Az ltalad hasznlt MySQL-vltozattl fggen az adathossz (a MySQL 5 .0 .3 eltt) 255 karakter vagy (a

trol.
. . csak azt tarolja, a h i t u m t# H * <7iiksqed van, u iv e t

MySQL 5 .0.3-ban s a ksbbi k i


adsokban) 65 535 karakter lehet.

114 3. fejezet

Adatbzis ltrehozsa s feltltse

Nincsenek

! Mirt hasznlnm valaha is a CHAR-t, ha a v a r c h a r csinlja, csak rugalmasabb?

hlye krdsek ugyanazt K: Mirt van szksg az olyan szmtpusokra, mint az

int

vagy

! A vlasz a pontossgban s a hatkonysgban rejlik. Terve zsi szempontbl mindig gy clszer megalkotni a tbl kat, hogy azok a lehet legszigorbban modellezzk az adatokat. Ha minden ktsget kizran tudod, hogy egy llamokat vagy megyket trol oszlopban mindig ponto san ktbets rvidts fog szerepelni, az az sszer, ha csak kt karakternyi trolt foglalsz le a szmra a CHAR (2 ) utastssal. Ha azonban egy olyan jelszoszlopod van, amelyben akr 10 karakteres jelszavak is trolhatk, akkor a VARCHAR { 1 0 ) jobb vlaszts. Ez a dolog tervezsi olda la. A CHAR valamivel hatkonyabb a VARCHAR-nl, mert nem kell bajldnia a vltoz hosszsggal, ezrt kvnato sabb ezt hasznlnod, ha biztosan tudod egy szveges osz lopban az adatok pontos hosszsgt.

V:

a DEC?

Minden az adatbzisban szksges trhelyre s az adatb zis hatkonysgra vezethet vissza. Ha egy tbla oszlo pai szmra a legm egfelelbb adattpust vlasztod, az cskkenti a tbla mrett, s gyorsabb teszi az adato kon vgzett mveletek vgrehajtst. Ha egy szmot tny legesen szmknt (IN T , DEC stb.) trolsz, s nem szvegkarakterekknt, az ltalban hatkonyabb.

V:

K: Ennyi az egsz? sszesen ennyi adattpus van?


Nem, de ezeket hasznljk a leggyakrabban, s jelenleg ennyivel is elboldogulsz. Felesleges lenne olyan adatt pusokkal leterhelned magad, am elyekre taln soha nem lesz szksged.

Mire val?
Prostsd ssze az egyes MySQL-adattpusokat a tblban trolhat adatok lersval!

Adattpus
INT CHAR ( 1 ) DATE TIME VARCHAR(2 ) DEC( 4 , 2 ) VARCHAR ( 6 0 ) CHAR (2 ) DATET ME DEC( 1 0 , 2 )

Lers
A teljes neved Egy ktbets llamnv-rvidts Egy Elvis-parka ra: 48.99 Elvis legjobban fogy albumnak bevtele Egy UFO ltal elkvetett elrabls dtuma: 2/19/2004 A raktron lev Elvis-barkk szma: 93 Ltta Ow en kutyjt? 1 vagy N Az e-mail cmed Amikor ebdelsz Hny idegent ltott, amikor elraboltk? Elvis szletsi ideje

most itt vagy

115

Mire val? - megolds

Mire val?
Prostsd ssze az egyes MySQL-adattpusokat a tblban trolhat adatok lersval!
Nem szksges. Br az llamnv- rvidts esetben mkdne, 3 CHAR(2 ) jobb vlaszts, mert ltalban valamivel hatkonyabb. Ha egy szveges rtk Hossza vltozhat, a VAR CHAR a legjobb vlaszts, csak gondoskodj rla, hogy elg hossz legyen ahhoz, hogy brmilyen r , tk belefrjen, aminek a trolsra szksg lehet.
^

Adattpus
IN T

Lers

A teljes neved

Ha pontosan tudod, hogy \ ^ egy adott oszlopban hny \ Egy ktbets llamnv-rvidts {<ara|<terf vrsz, hasznld \

DATE T IM E

Egy Elvis-parka ra: 48.99

a C A t. HR \

Elvis legjobban fogy albumnak bevtele

Egy UFO ltal elkvetett elrabls dtuma: 2/19/2Q04 A raktron lev Elvis-barkk szma: 93
VARCHAR ( 6 0 )

j
/

Ltta Owen kutyjt? I vagy7 N


Az

e-mail cmed

DATE T M E

Amikor ebdelsz Hny idegent ltott, amikor elraboltk? Elvis szletsi ideje

A 0 EC tpust egyebek mellett rak trolsra


szoktk hasznlni

Ez a kt szm adja meg, nogy az adatbzis hny szmjegyre szmtson a tizedespont eltt, letve utn.

Ehhez lehet, hogy a DATE tpust v lasztottad, de az igazi Elvis-rajongk a dtumot s az idpontot is tudjk. Egy igen/nem rtket ms (esetleg jobb) mdon is lehet brzolni 3 MySQL-ben, mint a CHAR(1)-gyd, de ez egyszerbb s kellen hatkony.

116 3. fejezet

Adatbzis ltrehozsa s feltltse


Igen, mg mindig itt tartunk...de

Hozd ltre a tblt egy lekrdezssel!


Minden rszlet megvan, ami a tbla ltrehozshoz szksges; mg egy j nevet ( e r n a i l _ l i s t ) is talltunk. Az adatoszlopok nevt ugyancsak meghatroztuk: f i r s t _ n a m e , la st_ n a m e s emai l . Mr csak az egyes oszlopok adattpusa hinyzik, valamint egy SQL-utasts, amivel mindezt sszektjk s ltrehozzuk a tblt. A tbla ltrehozsra szolgl SQLparancs a CREATE TABLE. Az utasts a CREATE TABLE kulcsszavakkal kezddik, majd a tbla ne ve kvetkezik. Az oszlopneveket, amelyeket az adattpus kvet, zrjel ben, vesszkkel elvlasztva kell megadni. A parancs teht gy nz ki:

CREATE TABLE tbla neve


(

A tbla neve

A z oszlop neve

oszlop_nevel oszlop_tpusal, oszlop_neve2 oszlop_tpusa2,


Az oszlop djattfp tisa

)
Tovbbi oszlopok , ha szksg van r

A M , - s o s z lo p n e v e k b e n nem m -

Egy adatbzisban j tblt a CREATE TABLE SQLparanccsal hozhatsz ltre.

j aUUtM hasznain, a
ve z se k e g ys g e se k.

.au. **irt- '

most itt vagy 117

teszteld a CREATE-lekrdezst

Hegyezd ki a ceruzd! Megolds


Ez az SQL-parancs hozza ltre

rj egy SQL-lekrdezst, amely ltrehozza Elmer e m a i l _ l i s t tbljt a hrom szksges adatoszloppal (first_name, last_name s email)!

a tblt. Figyeld meg a nagybetket!

A tbla nevnek kisbetsnek kell lennie, s szkz helyett alhzst kell hasznlnod benne.

CREATE TABLE email list


A ltrehozand oszlopok lis t ju k elejt a nyit zrjel Jaln.

V h R C m d O ), r ~ last_ame VARCHARZO), mail l/ARCHARto)


)

A ltrehozand oszlopokat a vesszk

w .|mtj.k6j

Ez azt mondja a MySQL-nek, Hogy az email oszlop adattpusa VARCHAR. A (6 0 ) azt jelenti, hogy az ebben az oszlopban trolt szveg legfeljebb 6 0 karakter hossz lehet.

A[ os^

ok iM q tu k vgt
zrjel je h i.

1.

Az e-mail cmet trol oszlop neve.

Tesztt
Hozd ltre Elmer adatbzist s tbljt!
Hajtsd vgre a CREATE D A T A B A S E s CREATE TABLE lekrdezseket valamelyik MySQL-eszkz segt sgvel az e l v i s _ s t o r adatbzis s benne az e m a i l _ l i s t tbla ltrehozshoz! CREATE DATABASE elvis_store CREATE TABLE email_list (first_name VARCHAJR(20) , last_name VARCHAR(20) , email VARCHAR(60)

Mindkt lekrdezs zkkenmentesen mkdtt? Ha nem, rd le, hogy szerinted mi nem stimmelt.

118 3. fejezet

Adatbzis ltrehozsa s feltltse

lljo n meg a menet, itt vala m i nince rend benI P o n to s a n gy rta m be a t b l t ltre hoz kdot, ahogy m eg be szlt k, m gis va la m i fu rc s a h ib a z e n e t je le n ik meg.

A CREATE TABLE utasts rendben van, de a MySQL-terminl nem tudja,

hogy a tblt melyik adatbzisban kell letrehozni...Ez gy nem lesz j.

Filc Edit W in d o w Help O o ps

mysql> CREATE TABLE email_list ^ 5 = = ^

(
first_name VARCHAR(20), last_name VARCHAR(20), email VARCHAR<60)

); ERROR 1046 (3D000): No database selected

A CREATE TABLE utasts valamirt nem mkdik a MySQL-terminlban.

tblt az adatbzishoz Ksd a lovat a szekr t!


Elmer jogos problmja abbl ered, hogy7 a MySQL-terminl nem tudja automatikusan, hogy melyik adatbzisra gondolunk, amikor parancsokat adunk ki. Azt termszetesen tudja, hogy most hoztad ltre az e l v i s _ s t o r e adatbzist, de az adott kiszolgln mr rengeteg egyb adatbzis lehet, ezrt nem ttelezheti fel egyszeren, hogy az imnt lt rehozott adatbzisrl beszlsz. Szerencsre ltezik egy egyszer megolds, ami annyibl ll, hogy megmondod a MySQL-terminlnak. hogy a kvetkez utastsok melyik adatbzisra vonatkoznak...

cmer most nem a cspjt


rzza, mert ' M T E TABU r t u n * . hanew 3

Nincsenek

------------K

hlye krdsek --------------

lT 'la":

" iS Q l- lm m l

Mgis hibt jelent.

i Mi az a fura - > jel, ami nha megjelenik a MySQL-terminlban?

V ! A - > jel azt jelzi, hogy egyetlen utastst rsz be tbb sorban.

A MySQL teht lnyegben arrl rtest, hogy tudja, hogy mg mindig ugyanazt az utastst gpeled, mg ha a R e t u r n letsvel egynl tbb sorra trdelted is. Ha befejezed az utastst, s a v gre pontosvesszt teszel, a MySQL vgrehajtja.

most itt vagy

119

n e fe le d d a U S E parancsot!

Vedd hasznlatba az adatbzist, mieltt...hasznlnd


Alihoz teht, hogy a CREATE TABLE utasts mkdjn. Elmernek ki kell vlasztania az adatbzist a MySQL-terminlban, hogy a terminl tudja, melyik adatbzishoz tartozik az j tbla. A USE parancs alapr telmezett adatbzisknt vlaszt k i egy adatbzist a terminlban, ami azt jelenti, hogy a kvetkez parancsok erre az adatbzisra fognak vonatkozni. Az utasts formja gy fest:

A USE parancs ralja el a MySQL-nek, hogy melyik adatbzist szeretnd hasznlni.

A USE parancs a kvetke zo SQL-utastsok alapr telmezett adatbzisaknt vlaszt ki egy adatbzist.

USE adatbzis neve

Elmernek teht egy USE utastsban m eg kell adnia az adatbzisa ne vt ( e l v i s _ s t o r e ) , hogy kivlassza az adatbzist, s hozzfrjen az j tblhoz:

A hasznlni kvnt adatbzis neve.

USE elvis store


A USE parancs vlasztja ki az adatbzist, amelyen mve leteket szeretnl vgrehajtani.

elvis_sightings

elvis__fans

elvis_lyrics

Ha kivlasztottl egy adatbzist a USE paranccsal, a terminl figyelmen kvl hagyja az adatbzis-kiszolgln tallhat tbbi adatbzist...amg egy msikat nem vlasztasz egy jabb USE utastssal.

120 3. fejezet

Adatbzis ltrehozsa s feltltse

CREATE TABLE email list(first name VARCHAR (20) , last_name VARCHAR (20) , email VARCHAR( 60) )

A USE utasts nem szksges, ha egy olyan grafikus SQL-eszkzt hasznlsz, mint a phpMyAdmin, mert az ilyen programokban grafikusan vlaszthatod ki az adatbzist, mi ltt SQL-parancsokat adnl ki.
File Edit W in d o vl / ^ e i p s a Mart

tblt ltrehoz kd rjinaz, mint korb - csak ahhoz,

firstjname VARCHAR(20) last_name VARCHAR(20)J emailJVARCHAR(60) I Your SQL query has been executed successfully (Query took 0.4481 sec)

kellett vlasztani c adatbzist.


Most, hogy a USE parancsnak ksznheten kivlasztottuk az adatbzist, a tbla ltreho zsa mr gond nlkl mVdik.

m ost itt vagy

>

121

a D ES C R IB E parancs

H o p p cska - elgpeltem a CREATE T A B LE u ta s t s t, de gy is v g re h a jt d o tt. A z SQ L-ben van v is s z a v o n s i lehetsg?

Visszavonsi lehetsg ppensggel nincs az SQL-ben, de a hibkat termszetesen ki lehet javtani.


Ahhoz azonban, hogy kijavtsd a hibt, elszr ki kell dertened, hogy pontosan milyen hiba trtnt. Tegyk fel, hogy az e m a i l _ l i s t tbla gy nz ki:

e m a il s t
first_naem lasf_name email

Karikzd be, hogy szerinted hol a hiba ebben a tblban! Van valamilyen tleted, hogy miknt lehetne kijavtani a hibt?

122

3. fejezet

Adatbzis ltrehozsa s fe/tltese

A DESCRIBE felfedi a tblk szerkezett


Egy hiba kijavtsa egy tblban elszr is a hiba megtallst ignyli. Mg ha nem is gyanakodsz hibra, akkor sem rt. ha mindig ellenrzd a munkdat. Az SQL DESCRIBE parancsval elem ezheted egy tbla szerkezett, s m egjele ntheted az oszlopnevek listjt, az adattpusokat s egyb informcikat.

DESCRIBE tbla neve


Ha a parancsnak teht Elmer tbljt adod meg, a kvetkez SQL-utastst kapod:

DESCRIBE email_list

zr

Ez annak a tblnak a neve, amelyikrl

|f) s|!

h L

File Edit W in d o w Help G raccland

A Field" (Mez) oszlopban az egyes oszlopok neve lthat.

I Field +I first__naem I last_name I email

I Type

I Null I Key 1 uerai + 1 NULL 1 I varchar(30) I Y ES 1 NULL 1 I varchar(30) I Y ES 1 NULL 1 I varchar.(60) I YES
X . T -----------T A rv

A //Tjfpe (Tpus) sztopban az egyes oszlo pokra belltott adatt


pusok szerepelnek.

A MySQL a fenntartott szavakban, pldul az adatt pusok nevben nem klnbzteti meg a kis- s nagy bet1<et, ezrt nha kisbetkkel rva lthatod ot<et. Nincsenek

hlye krdsek
K K V A MySQL-ben szmos belltst le V het megadni a tblk oszlopaira.
A tbbi oszlop (Null, Key, Default, Extra) mire szolgl? Vagyis ha tnyleg lennnek adatok a tblmban, azok megjelennnek itt? Nem. A DESCRIBE csak a tbla szerkezett mulatja meg, a benne trolt adatokat nem. De ne aggdj, hamarosan ltni fogod a tblban lev adatokat... Elszr azonban meg kell tanulnod, hogy miknt te hetsz adatokat egy tblba.

K V

Ezekkel olyan dolgok szablyozha tk. mint hogy egy oszlop res ma radhat-e, vagy hogy tartozik-e hoz z valamilyen alaprtelmezett nk. Ezekkel egy kicsit ksbb foglalko zunk. amikor fontoss vlnak az al kalmazs szmra.

A phpMyAdmin segtsgvel is meg le het nzni ugyanezt a tblaszerkezetet? Igen. Az olyan grafikus adatbzis kezel eszkzk, mint a phpMy Admin, szintn lehetv teszik a tblk szerkezetnek megjelent st a DESCRIBE utastssal, vagy gy, hogy egy kattintssal kpi megjelentst krsz a kvnt tblrl. Az, hogy milyen eszkzzel elemzed a tblidat, csak tled fgg.

most rtt vagy

123

vesd el a tblt

K ija v to tta m a z e lr s t, s m e g p r b l ta m Is m t le fu tta tn i a CREATE TA & LE le k rd e z st, de nem m k d tt, b iz to s nem kne elcbb t r ln m a hibs t b l t?

Kis malr: a firs t Jtame oszlo pot vletlenl first_naem-nek rtu k ...
File E dit W in do w Help Ty p o ?

IM

I Field
v ~

I Type

I Null I Key | Default | Extra |


------------------------------ + ------------------------- + --------------------------------------------- + ----------------------------------- ^

--- ------------------------- ---------------------------------------------------------------------------------------+

R^first naemjj)| varchar(30) I xas-cname j varchar(30) I email | varchar(60)

| YES | YES | YES

| | I

| NULL | NULL I NULL

| j I

| j I

De igen. Ha egy tbla mr ltrejtt, a CREATE TABLE utastssal nem hoz hatod ltre jra.
Miutn ltrehoztl egy tblt, teht a tbla mr ltezik, nem rhatod fel l egy j CREATE TABLE lekrdezssel. Ha jra ltre szerelnd hozni a tblt, elszr t rlnd kell a meglevt, aztn ellrl kezdened. Az SQL-ben egy tblt a DROP TABLE (tbla elvetse) paranccsal trlhetsz egy adatbzisbl. A parancs trli a tblt, s vele egytt mindent, amit a tblban troltl. Mivel a te j tbldban mg nincsenek adatok, nem vesztesz semmit a tbla elvetsvel s egy j, a f irs t_ n a m e oszlopot helyesen meghatroz j tbla ltrehozsval.

Az adatbzisbl trlni kvnt

DROP TABLE email s t

tbla neve.

A DROP TABLE paranes egy tblt az sszes adatval EGYTT trl az adatbzisbl.

1 2 4 3. fejezet

Adatbzis ltrehozsa s feltltse

Elmer kszen ll az adatok trolsra


A CREATE DATABASE, USE s CREATE TABLE SQL-parancsokkal sike resen ltrehoztad az Elmer levelezlistjnak trolsra szolgl adat bzist s tblt. Elmer nem is lehetne elgedettebb - legfeljebb akkor, ha a tbla mr fel is lenne tltve a lelkes vsrlk adataival. Ez a PHP feladata lesz...

Klassz. Most, hogy megvan az adatbzis s a tbla, kszen llok r, hogy komoly adatokkal tltsem fel a levelezlistt. O o

e lv is

s to re

Az elvis_$tore adatbzis egyetlen tblt email_list tartalmaz.

first_name

lasf_name

email

h
W l li. * '

**' u
' k t l* "

, f" 't /
'

tjnak adatait fogjk trim. Nincsenek

K V

Nekem megvan a Head First SQL (egybknt klassz knyv), amiben minden SQL-utasts kdja pontosvesszre vgzdik. Itt mirt nem? rlnk, hogy tetszett a H ea d First SQL. Az ott ltottak hoz kpest az a klnbsg, hogy amikor a PHP-ben a m y s q li_ q u e r y () fggvnyt hasznlod, akkor egy szerre csak egyetlen SQL-parancsot hajtasz vgre, ezrt nincs szksg a pontosvesszre. Ezzel szemben amikor kzvetlenl trsalogsz a MySQL-lel, egyszerre tbb uta stst is adhatsz neki, ezrt tudatnod kell vele, hogy hol vgzdnek az egyes utastsok - erre szolgl a pontosvessz. Azt azonban nem szabad elfelejtened, hogy a PHP-utastsok vgre mindig kell pontosvessz!

hlye krdsek K V gy igaz, vagyis csak vatosan a tblk trlsvel!

! Szval ha egy tblban adatok vannak, s elvetem a tblt, akkor az sszes adatom is trldik?

K V ! Senki sem lehet tkletes. Mindenki kvet cl hibkat,


az SQL azonban az ALTR utastssal lehetv teszi, hogy megvltoztasd a meglev tblkat. Errl a pa rancsrl a knyv ksbbi rszben mg lesz sz.

! Vagyis ha egy olyan tblt kell mdostanom, amiben mr van nak adatok, akkor nincs szerencsm?

most itt vagy 125

az addemail.php parancsfjl

Hozd ltre az Add Email parancsfjlt!


Elmernek egy HTML-rlapra van szksge, amely sszegyjti a vsrlk nevt s e-mail cmt. Ha ezek megvannak, egy PHP-parancsfjllal fog hatja ket s elraktrozhatja az e m a i l _ l i s t tblban. A w ebes rlapon (addem ai 1 . h tm l) hrom beviteli m eznek s egy gombnak kell lennie. Az rlap kdjnak legfontosabb rsze az rlapmvelet, mivel ennek a feladata az rlapadatok tadsa a ltrehozand addemai 1 .php parancsfjlnak.

O A lovologlis t tlfol-aafogie 'Qfr tbla


............ ......................

ltfohogsch
,,

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

0 Az j vsrlkat a listhoz ad w e b e s \ y jjr la p s PHP-parancsfjl megrsa.

A lista tagjainak krlevelet kld webes rlap s PHP-parancsfjl megrsa.

Az urlapmVelet kapcsolja ssze a webes HTML-urlapot az annak adatait feldolgoz PHP-parancs fjllal (addemail.php). ^

Enter your Urat naroe, lasi nama, and mail tne Maka M Elvi maiUng fi First name Last name: Enaii,

Az addemail.php parancs fjl az rlap benyjtstl fut le, s a feladata az rlapadatok feldolgozd sa, illetve a vsrl hoz zadsa a levelezlistt trol adatbzistblhez.}

/ x b r />

addemail.html addemail.php
W ebkiszolgl

Az j vsrlk egyszeren fe l iratkozhatnak Elmer levelez listjra (vagyis bekerlhetnek az adatbzisba): ehhez csak ki kell tltenik a webes rlapot.

Adatbzis-kiszolgl

126 3. fejezet

Adatbzis ltrehozsa s feltlte se

Gyakorlat

Az Add Email rlap adatait az addemail .php parancsfjl dolgozza fel. A parancsfjlnak ki kell olvasnia az adatokat az rlaprl, csatlakoznia kell az elvis_stor adatbzis hoz, s egy INSERT utastssal he kell szrnia az adatokat az email_list tblba. Se gts Elmernek: rj elszr egy SQL-mintalekrdezst, amely beszr egy j vsrlt, majd ennek a lekrdezsnek a felhasznlsval fejezd be a PHP-parancsfjl kdjt!

rj ide egy mintalekrdezst, amely adatok szr be Elmer tbljba.

addemail.php

m ost itt vagy > 127

Gyakorlat

- megolds

Gyakorlat - megolds

Az Add Email rlap adatainak feldolgozshoz az addemail .php parancsfjlt kell meghvni. A parancsfjlnak ki kell olvasnia az adatokat az rlaprl, csatlakoznia kell az elvis_store adatbzishoz, s egy INSERT utastssal be kell szrnia az adatokat az email_list tblba. Segts Elmernek: rj elszr egy SQL-mintalekrdezst, amely beszr egy j vsrlt, majd ennek a lekrdezsnek a felhaszn lsval fejezd b e a PHP-parancsfjl kdjt!
INSERT INTO e a i M i s t -Piret. Y\drr\Z, l3st__rt9me,

VALUES ('Julian', 'Oates', 'julian^breaknedkpia.tom')

Ezek a $ _ P 0 S T tmbrtkek tartalmazzk 3 benyjtott in


formcikat.

Az INSERT mintalekrdezst egy olyan PHP-karakterlncc kell alaktani, amely a beszrshoz az rlapadatokra tmaszkodik.

r- m

y s \ l i :^kcdvi.fco' ,. el'.
. fe ? . t o & l r . W f f / A .....................................

d ,e ('B rro r

;firs t_ n a m e = 5_P0STr f i r s t n a m e 1

/la s t nae f 1~u~ jastae3 ;...... POSTC .......... ,.* J


f email = f J W f e m a A .........................

e r y = "IN S E R T INTO email^ J is t ( f > t _ n a m e , l a s t ^ a m e , ema V A LU ES ( fi'rst^name1) flast_j[>ame < femail) , ..............................

m y s q l i _ q u e r y ( f\>C, J . W ' t . . . . . ov dieCErvov [^e r Y " r'^


-

| dloseffdb t ) ] i

Ha nagyon villogni szeretnl, egy < a > HTML-emkvel tehetnl ide egy hivatkozst is, ami visszavisz az rlapra.

addemail.php

128 3. fejezet

Adatbzis ltrehozsa s feltltse

Tesztt
Prbld ki az Add Email rlapot!
Tltsd le az Add Email weboldal kdjt a Head First Labs webhelyrl, a www.headf irstlabs.com/books/hfphp cmrl. A kdot, amely Elmer w ebes rlapjbl (addemail.html), egy stluslapbl (style.css) s kt kpbl (elvislogo.gif s blankface.jpg) ll, a chapter03 mappban tallod. Most hozz ltre egy j szvegfjlt addemail .php nven, s rd bele az elz oldalon szerepl teljes kdot. Ez a parancsfjl fogja feldolgozni El mer w ebes rlapjt, s hozzadni a vsrlkat az e m a i l _ l i s t tblhoz. Tltsd fel az sszes fjlt a webkiszolgldra, s nyisd meg az addemail .html oldalt egy w ebbngszben. Add meg egy j vsrl adatait az rlapon, s kattints a Submit gombra.

Ne felejtsd el a sajt jaidra mdostani az adatbzis-kapcsolati vltozkat.

mm
FtTatnat^:
L a s m a rrw Oate Enatl-

V.rfka Me .EMs - Add Cma

Az addemail.php pa rancsfjl megersti az j vsrl beszr st a levelezlistba.

Enttr your first n a r e. lasi r ame and email to be aodea io

tr.e MaKe Ms E^vls niattnfl l.& t

M Mjcfa - A dm gte e tt aii


Customer aaded

u^ SbH

Valamelyik MySQL-eszkzben ellenrizd egy SELECT lekrdezssel, hogy sikerlt-e hozzadni a vsrlt az adatbzishoz.
akyqi> SELECT * PRCW cn i l _ l : 3t;
I ti.rn t_n ate | iasr_raroe | t-m a:l

............ j u l i 3 n g b c e a k n e c k p i7 2 3 .cc.ro

1 rew in oc-t < .nrj 05 ?ect 0

m ost itt vagy

129

teszteld a SELECT-tel kapcsolatos tudsodat!

Nincsenek

hlye krdsek
! A s e l e c t SQL-parancsban a csillag ugyanaz a csillag karakter, amit eddig is hasznltunk?

K ! Vannak ms karakterek is az SQL-ben, amelyek ugyan


-c r gy klnleges jelentssel brnak, mint a csillag?

I Igen, a billentyzeten ugyanott tallod (angol billentyzeten a 8-as szmbillentyt s a Sinrr-et, magyaron a plusz-mnusz s a jobb oldali Alt billentynjt lenyomva rhatod b e).

\ Az SQL-nek vannak ms klnleges vagy fenn-

tartott karakterei is, de a csillag az egyetlen, amelyrl jelenleg tudnod kell, mert csak ezt hasznljk az SQL-utastsok SELECT rszben.

Hegyezd ki a ceruzd!
Most, hogy Elmer levelezlistja kezd feltltdni, rj neki nhny SQL-lekrdezst, am elyekkel m egkereshet bizonyos vsrli adatokat!

Vlaszd ki az sszes adatt azoknak a vsrlknak, akiknek a keresztneve Martin:

Vlaszd ki a vezetknevt azoknak a vsrlknak, akiknek a keresztneve Bbba:

Vlaszd ki a kereszt- s vezetknevt annak a vsrlnak, akinek az e-mail cme ls@ objectville.net:

Vlaszd ki az sszes oszlopt azoknak a vsrlknak, akiknek a keresztneve Amber, a vezetkneve pedig McCarthy:

130 3. fejezet

Adatbzis ltrehozsa s feltltse

File Edit W in d o w H e lp Elvisrules

last^name + -----------------11 Oates Julian | Jones Kevin | Sanchez Amanda | Wallace Bo | McCarthy Amber | Hurst Cormac | Harper Joyce | Meyer Stephen J Wilson Martin | Perala Walt 1 -Munvon ,ino N agyon lla t! M o s t, hogy a fe l h a szn l k fe lira tk o z h a tn a k a levelez- , lis t m ra egy w eboldalon k e re s z t l, * a lis ta lnyegben n m a g t p ti fel. | first__name _ffe | Shaffer | Shakespeare | Doe

| Louis | Bbba | John

julian0breakneckpizza.com jones0simuduck.com sunshine@breakneckpizza.com bo@bOttOmsup.com amberbreakneckpizza.com churst0boards-r-us.com joyceharper@breakneckpizza.com meyers@leapinlimos.com martybaby@objectville.net walt@mightygumball.net craftsman0breakneckpizza.com joe_m@starbuzzcoffee.com bruce@chocoholic-inc.com pr@honey-doit.com bertiehobjectville.net gregeck@breakneckpizza.com wilmawu@starbuzzcoffee.com samjaffe0starbuzzcoffee.com ls@objectville.net bshakes@mightygumball.net johndoetikibeanlounge.com

Ez nem a vge a tblban lev adatoknak... Elmer levelez listja gyorsan n1

Csakhogy a levelezlista nmaga nem tudja elkldeni a leveleket...


Elmer webalkalmazsnak mg mindig hinyzik a msik fele: az, am e lyik lehetv teszi, hogy megrjon egy levelet, s mindenkinek elkldje, aki szerepel a levelezlistn. Ehhez Elmernek egy j HTML-rlapra s PHP-parancsfjlra van szksge...

jfrohogQQQ;

A 2. lps ksz!

&-Ai j vorlkQt a liothoz ad vvoboo


rlop PHP pofam
) A lista tagjainak krlevelet kld webes rlap s PHP-parancsfjl megrsa.

m ost itt vagy >

131

Hegyezd ki... megolds

ki a ceruzd! -------------------------------------------------------------------Megolds
Most, hogy Elmer levelezlistja kezd feltltdni, rj neki nhny SQL-lekrdezst, amelyekkel megke reshet bizonyos vsrli adatokat!

Vlaszd ki az sszes adatt azoknak a vsrlknak, akiknek a keresztneve Martin: S E LE C T FRO/V) emdiMsfc WttERE -Pirst_*ame 'M a rti*

A csillag a tbla sszes oszlopt kivlasztja.

Ez a W/HERE zradk a lekrdezs eredmnyt azokra a vsrlkra sz kti, akiknek a keresztneve Martin.

Vlaszd ki a vezetknevt azoknak a vsrlknak, akiknek a keresztneve Bbba: S E LE C T last_*dme PRO/V] c mai M is t WttERE *fi\rst_*ame 'Bbba'
........................................7 .................................................. m ...........

A lekrdezs eredmnyben csak a last_name oszlop jelenik meg.

Vlaszd ki a kereszt- s vezetknevt annak a vsrlnak, akinek az e-mail cme ls@ objectville.net:

SSUBCT -fi rst_*ar*e> last_r>ame FRO/VI emai M is t IVHERE email 'ls@ objetvill^^*t,

............ ....v " Ha az eredmnyben tbb osz .............


lopot szeretnl ltni, az osz lopneveket vesszvel kell elv lasztanod.
Vlaszd ki az sszes oszlopt azoknak a vsrlknak, akiknek a keresztneve Amber, a vezetkneve pedig McCarthy: S E LE C T * FROA'l Cmai M is t VttERE i\rst_r>ame 'Amber' ANP Iast_h 3mc 'AldCartKy

A 1A/HERE zradk tbb informcira is tmaszkodhat: ebben az esetben a keresztnvre S a vezetknvre.

132 3. fejezet

Adatbzis ltrehozsa s feftltse

Az Hlmer levelezlistjn szerepl szem lyeknek bizonyos szempontbl hason lan kldhetsz levelet, mint ahogy felvetted ket a listra, mivel egy w ebes HTML-rlapra s egy PHP-parancsfjlra van szksg. Lnyeges klnbsg azon bn. hogy a levlklds a lista tagjainak az e m a i l _ l i s t tbla teljes tartalmt ignyli, mg az ad d em ail .php parancsfjl csak egy adatsorral dolgozik.

>end Email Webes rlap l v teszi Elmernek, hogy rja a levl trgyt s szvet, majd elkldje az zenetet levelezlista sszes tagjnak

M4ke Me Jvis

O A lo v o te lictt trol adatbzis-s-tbte lfreho- sa. g 0 A? j1vorJ kat-a liothoz ad woboe rlap s PHP paf'8fto^ t-ffK?^fear A lista tagjainak krlevelet kld webes rlap s PHP-parancsfjl megrsa. J

Nzd mr, csak nem az utols lpsnl tartunk?

rm i p -ri^ cL vy S.O X
Privt*: Fo* ElmWs use ONLY
Wnte and send an email mailing i*st mam&ers Subject ofamail

Body of email

A sendemail.php parancsfjl kiolvassa a vsrlkat az adat bzistblbl, s mindegyiknek elkldi Elmer levelt.
sendemail.html
W ebkiszolgl Adatbzis-kiszolgl

sendemail.php

O a te s K e v in A m ando Jones Snchez


5

ju iia n @ b r e a c k n e c k p iz z a .c o m jo n e s @ 5 im u d u c k .c o m

u n h in e @ b r e a k n e c k p iz z a .c o m
5

most itt vagy

133

a sendemail.php parancsfjl

A Send Email parancsfjlt sszetart csavarok


A sendemail.php parancsfjlnak kt klnbz forrsbl kell sszekombinlnia az adatokat a levelek ellltshoz s elkldshez. A parancsfjlnak egyrszt ki kell olvasnia a cmzettek nevt s e-mail cmt az elvis_store adatbzis email_list tbljbl, de hozz kell jutnia a levl trgyhoz s szveghez is, amelyet Elmer a Send Email (Levl kldse) w ebes rlapra (sendemail .huml) r be. Nzzk vgig sorban a szksges lpseket:

A $_P0ST tmb segtsgvel kiolvassuk a levl trgyt s szvegt az rlaprl.


Itt semmi jdonsg nincs. A Submit gombra kattints a sendemai 1 .html rlapon elkldi az rlapadato kat a sendemail .php parancsfjlnak, ahol a $_P0ST tmb segtsgvel vltozkba rod ket.

Egy SELECT lekrdezst futtatunk az e m a iljis t tbln.


A mysqli_query () PHP-fggvny lefuttat egy SELECT lekrdezst a levelezlista adatainak kiolvassara. iMivel a tbla sszes adatra szksged van, a SELECT * utastst hasznlhatod.

Kiolvassuk az adatokat a lekrdezs eredmnybl.


A lekrdezs futtatsa nmagban nem ad hozzfrst az adatokhoz. Ki is kell olvasnod az eredmnykn: kapott adatsorokat, hogy7 hozzfrj az egyes vsrlk keresztnevhez, vezetknevhez s e-mail cmhez.

A mail() fggvny meghvsval elkldjk a levelet a vsrlknak.


A levlkldshez egy ciklussal vgig kell menned minden vsrln a levelezlistban, vagyis a lekrdezs eredmnynek egyes adatsorain. A ltrehozand ciklus az els adatsorral kezdi, majd a msodik sorra lp, s szp sorban vgigmegy a SELECT lekrdezssel megszerzett fennmarad adatsorokon. Ha elrte az adatok vgt, a ciklus befejezdik.

A parancsfjlnak szksge van az e m a ijis t tbla adataira.

134 3. fejezet

Adatbzis ltrehozsa s feltltse

Elszr fogjuk az adatokat...


A PHP-ben mr elg jl megy az adatok kinyerse rlapokrl, ezrt az els lpsben nem lesz semmi j - a $_POST szupergloblis segts gvel egyszeren vltozkba rod a levl trgyt s szvegt. Ha mr itt tartunk, nem rt, ha most elraktrozod Elmer e-mail cm t is egy vltoz ban, mivel ksbb, a levelek elkldsekor szksg lesz r:

fr; $from = elmer@makemeelvis .com1 $subject = $_POST[1subjectf]; $text = $ POST[felvismai1 ];

e '

a i 1

-.a

1 k ,m

" 'S M m

V to ,

A levl adatait az rlaprl szintn vltozk troljk.

A tbbi adat, am elyre a senemail .php parancsfjlnak szksge van. Elmer M ySQL-adatbzisbl szrmazik. Ahhoz, hogy a vsrlk adatait az email_list tblbl beolvasd a parancsfjlba, egy SELECT lekrde zs szksges. Ezt most nem gy fogod elvgezni, mint korbban, am i kor a MySQL-terminlban adtad ki a SELECT parancsot, s nzted meg - tbla adatait - ezttal a sendemail .php parancsfjlbl indtod el a le krdezst a mysqli_query () fggvnnyel. r

A $query vltoz szveges karakterlncknt trolja az SQL-lekrdezst.

me a lekrdezs, amely kiv|3Sztj a az s $ m ow(opof

az email list tblbl.

$query = "SELECT * FROM email_list"; $result = mysqli query($dbc, $query);


A mys<{li_query egy kapcsolati vltoz ($dbc)
s egy lekrdez karakterlnc ($query) segts gvel hajtja vgre a lekrdezst.
T e h t c s a k annyi a dolgom , hogy vgigm egyek a lekrdezs eredm nyn a $ re s u lt v lto z b a n , lg az?

A lekrdezs elindtshoz e^y adatba


z is -k a p c s o la t

szksges. A kapcs

rszleteit a $dbc vltoz t a r o lj

Nem. A $result vltoz valjban semmilyen adatot nem trol a lekrdezsbl.


Ha kzvetlenl prblod kiratni a $result vltozt, valami ilyesmit fogsz ltni: R e so u rc e id #3 A $result vltoz egy MySQL-erforrs azonostszm t trolja, nem a lekrdezs ltal tnylegesen visszaadott adatokat. A MySQL-kiszolgl ideiglenesen trolja a lekrdezs eredm nyt, s egy erforrsszm ot ad neki, hogy azonosthassa. Ezt az erforrssz mot kell m egadnod a mysqii_fetch_array () PHP-fggvnynek, hogy soronknt kiolvasd az adatokat.
most itt vagy

135

a lekrdezs eredmnynek kiolvassa a m y s q liJe tc h array() fggvnnyel

A mysqli_fetch_array() kiolvassa a lekrdezs eredmnyt


Miutn a lekrdezs vgrehajtdott, az eredmnyt a S r e s u l t vltoz rgzti. Ezt a vltozt adod t a mysql i _ f e t c h _ a r r a y () Fggvnynek, hogy soronknt kiolvasd a tbla adatait. Mindent adatsort egy tmbknt kapsz vissza, amelyet egy j, $row (sor) nev vltozban trolsz majd.

Ez a fggvny egy adatsort olvas ki a lekrde zs eredmnybl, s egy tmbbe rja azt.

$row = mysqli fetch array($result);


A $row vltoz egy tmb, amely kezdetben az eredmny els adatsort trolja.
Minden SQL-lekrdezsnek sajt erforrs-azono st szma van, amelynek a segtsgvel elrhet jk az eredmnyknt kapott adatokat.

Minden alkalommal, amikor ezt a kdot vgrehajtja a webkiszolgl, a lekrdezs eredm nybl egy adatsor kerl a $row tmbbe. Az ered mnyhalmaz sorain a m y s q l i _ f e t c h _ a r r a y () fggvny ismtelt hvs val lpkedhetsz vgig. A m y s q l i _ f e t c h _ a r r a y () fggvny els hrom hvsa teht a tbla els hrom adatsort olvassa ki, s azok oszlopait a $row tmb egy-egy elem eknt trolja.

A my$qli_fetch_array() fggvny egy adatsort tr i II egy tmbben.

$row = mysqli fetch array($reslt);


$row = mysql i_fetch__array ($ re slt) ; $row = mysql i_fetch__array ($ re slt) ;

firsfjnoni
J u lia n K e v in Am anda O a te s J o n es Sanchez \ 1

iu lio n @ b r e a c k n e c k p iz z a .c o I r.n e s @ s im u d o c k .c o m /

Minden adatoszlop a $row tmb e9y-egy elemeknt troldik.

,u n $ h in e @ b r e a k n e c k p iz z o fc I 5'

$row va'lf egy tmb, ely itt hrom elemet tartalzdafoszlop szmra. ~

1* 1

3
b

'

$row

$row

$row

136

3. fejezet

Adatbzis ltrehozsa s feltltse

Hegyezd ki a ceruzd!
Ellenrizd, hogy tnyleg ki tudod-e olvasni soronknt a vsrlk adata it: fejezd be a PHP-kdot, amely kirja az e m a i ] _ l i s t tblban szerep l egyes vsrlk keresztnevt, vezetknevt s e-mail cmt!

$query = SELECT * FROM email_list"; $result = mysqli_query($dbc, $query); $row = mysqli fetch array($result);

m ost itt vagy

> 137

nem a legjobb megolds

^ H

Ellenrizd, hogy tnyleg ki tudod-e olvasni soronknt a vsrlk adatait: fejezd be a PHP-kdot, amely kirja az email_li st tblban szerepl egyes vsrlk keresztnevt, vezetknevt s e-mail cmt! $query = "SELECT * FR0M email_list"; $result = mysqli_query($dbc, $query); $row = mysqli_fetch_array($result);
' a * r f 1 * in ". *

ezd ki a ceruzd! Megolds

Cdbo /rowC'-firsfc name'J . ' ' . frowC'lsst frow rnys^li^e^b^anrayfresul;

f r o w t ' e . '<br />';

Cdbo frov/C'irs*t r\a cl3 . ' *. frowOayfc ^a^cJ 1: 1 fvowC'cmafJ <br />'; rw
( ( t i

frow

rnys^li^fctd^arrayfrcsul-;
frowC'crvNairJ '< b v / > \

Cdbo fvo>/C'-piv-s-t *ame '3 . ' ' . fro w /T la s t hamc J

frow = mys^|i^ct^K^arrayf'rcsul*t); Cdbo frowC^irsi, namc'J . ' ' . frov/C'lasf^n^mc J


. ......................... 1 . r r % ................................ r*-? . , Y

*^^C'cmai|,J '<br />';

frow mvs^li & b avr; , fVow mvs^li -fc-Ub S , a m t


cdbo

M o s t t u t / r a viccelsz. K t k d s o rt is m te lg e tn i a le g o s to b b b dolog, l tta m . B iz to s van jo b b m d s z e r is.


^ ......

frow ^B^^HJt^b_a\rrayf>rcsu|-t); cdbo frow


cd

amc'3 11 fro^riasi namc'3 . ' : ' . frowrcmairJ '<br />'; t^array(frcsul*;


'3

. 1 1 . fr o v /D a s t narwc J . 1 : 1 fro w C 'e m a ifJ . '< b r / > ';

Tnyleg van jobb mdszer - egy ciklus hasznlata.


A ciklus egy olyan szerkezet a PHP nyelvben, amely addig is mtel egy kdrszletet, amg egy adott felttel nem teljesl, pldul amg el nem fogynak az adatok. Egy ciklus teht v gig tud menni egy lekrdezs eredm nynek minden adatso rn, s kzben el mdja vgezni rajtuk a kvnt mveleteket.

138 3. fejezet

Adatbzis ltrehozsa s feltltse

Ismteld, amg...
A w h ile (amg) ciklus olyan ciklus, amely kifejezetten addig ismtel egy kdot, amg egy adott felttel teljesl. Tegyk fel pldul, hogy egy gyflszolglati alkalm azsban van egy $ g o t_ c u s to m e r s nev vltoz, amely azt tartja szm on, hogy vannak-e segtsgre vr gyfelek. Ha a $ g o t_ c u s to m e r s rtke t r u e , akkor tudjuk, hogy tovbbi gyfe.ek vrakoznak, gy meghvhatjuk a n e x t_ c u s to m e r (> (kvetkez gy f l') fggvnyt. Ennek a forgatknyvnek a kvetkez w h ile ciklust hasznl kd felel meg:

A while ciklus addig ismtel egy kdrszletet, amg egy felttel teljesl.

Amg vannak gyfelek, folytatjuk a ciklust.

while ($got customers) next cus tomer ( ; )

Ez a kd hajtdik vgre a ciklus minden ismtlsekor.

Ha a ciklus kdjt kapcsos zrjelek kz teszed, annyi kdsort hajthatsz vgre, amennyit csak akarsz.
Amikor arra vagyaink kvncsiak, hogy vannak-e mg gyfelek, egy flt sit ellenrznk. A felttel a zrjelben lev kd, ami mindig e g y eldnten d (igennel vagy nem m el m egvlaszolhat) krdst tesz fel. Ha a vlasz ,:en vagy true, a mvelet vgrehajtdik. Ila nem vagy false, akkor ki lpnk a ciklusbl. Amikor meghvjuk a n e x t._ cu sto m e r () fggvnyt, hogy segtsnk a k vetkez gyflnek, egy m veletet hajtunk vgre. A m velet a kapcsos zr jelek kztt ll kd, ami addig ismtldik, amg a felttel igaz ( t r u e ) marad. Ha a felttel hamiss ( f a l s ) vlik, a ciklus vget r, teht a m velet nem ismtldik tbbszr. m e a w h ile ciklus ltalnos alakja:

Egy while ciklussal sorban vgigmehetnk az gyfele ken, amg egy sem marad.

A tesztfelttel mindig igaz vagy hamis eredmnyt ad. Ha igaz, akkor folytatjuk a ciklust, ha hamis, akkor lelltjuk.

Agytorna
Szerinted hogyan lehetne egy w h i l e ciklussal vgigm enni az Elm er e m a i l _ l i s t tbljban sze repl vsrlkon?

while ( tesztfelttel) { mvelet


}
A ciklusmvelet minden is. ntle'skor vgrehajtdik.

m ost itt vagy

139

hogyan mkdik a while?

arasa a

w h i l e ($row echo

= m y s q l i _ f e t c h _ a r r a y ($ r e s u l t )) n am e']

{ n am e']

$ ro w ['f i r s t

$ r o w [ fl a s t

$ r o w [ e m a i l *]

A ciklusmuvelet a ciklus minden ismtlsekor lefut

A ciklusmuvelet egy echo uta sfsbl ll, amely sszera gasztja a sor adatait, s egy sortrst tesz a vgkre.

e ls le fu t sa ko r mb az em ail J i s * , sort t r t a li*

Jones Am anda

A ciklus msodik ismlsekor a $row tmb az e m a iH is t tbla msodik sort tartalmazza...Mintha lenne itt valamilyen trvnyszersg, nem?

140 3. fejezet

Adatbzis ltrehozsa s feltltse

A HTML-sortrs gondoskodik rla, hogy az egyes adatsorok kln sorba kerljenek 32 eredmnyknt kapott oldalon.

$row[last name]

$row['email']

A tmbelem elrshez hasznlt kulcsnak meg kell egyeznie az oszlop nevvel.

com

A while ciklus sorrl sorra bejrja a tbla adatait, s ha kifogy a sorokbl, vget r.

a.com

A ciklus msodik lefutsakor az echo utasts egy jabb szvegsort r ki, de ezttal a tbla msodik sorban szerepl adatokat hasznlja fel.

$row[rfirst name']

$row[ email]

A $row tmbben trolt rtkek a ciklus minden ismtlsekor meg


Vltoznak, hogy az aktulis adatsort

A karakterlncok sszegzshez valjban nem a pluszjelet, hanem a pont mveleti jelet hasznljuk.

tkrzzk. A tmbben lev rtkek elrshez oszlopneveket hasznlunk.

most itt vagy 141

nem hlye krdsek a while-rl

Nincsenek

hlye krdsek
K: Pontosan honnan tudja a w h i l e ciklus, hogy ismtldnie kell?
gy rtem, a w h i l e ciklust egy t r u e / f a l s e felttel vezrli, a m y s q l i _ f e t c h _ a r r a y ( ) pedig valamilyen erforrs-azo nostt ad vissza, ami a $row tmbben troldik...Ez tutira nem gy fest, mint egy t r u e / f a l s e tesztfelttel.

jratltve
Az adatbzis egy olyan trol, amely adatok magas fokon rendszerezett trolsra szolgl. A tblk oszlopok s sorok rcssze r mintzatban troljk az adatb zis adatait. j adatbzis a CREATE DATABASE SQL-paranccsal hozhat ltre. Egy tbla egy adatbzisban a CREATE TABLK SQL-paranccsal hozhat ltre, amelynek rszletes informcikat kell adni a tbla adatoszlopairl. Egy tblt egy adatbzisbl a DROP t a b l e SQL-paranccsal lehet trlni. A m y s q l i _ f e t c h _ a r r a y () fgg vny egy adatsort olvas ki egy adat bzis-lekrdezs eredm nybl. A w h i l e ciklusok addig ismtelnek egy PHP-kdrszletet, amg egy tesztfelttel teljesl.

V:

J m egfigyels. A PHP valjban m eglehetsen en g ed keny, am ikor az igaz rtelm ezsrl van sz. Rviden, m inden n k et, am i nem nulla ( 0 ) vagy f a l s e , t r u e - n a k tekint egy tesztfelttel esetb en . Teht am ikor a m y s q l i _ f e t c h _ a r r a y () fggvny visszaad egy adat sort, a $ r o w tm bt a PHP t r u e - n a k veszi, mivel az rt ke nem 0 vagy f a l s e . Mivel pedig a tesztfelttel t r u e , a ciklus folyam atosan ism tldik. Ami rdekes, az az, hogy' mi trtnik, ha nincs tbb adat a m y s q l i _ f e t c h _ a r r a y () fggvny f a l s e - t ad vis sza, ami vget vet a ciklusnak.

K: Teht egy w h i l e ciklust brmilyen adattal vezrelhetek, nem


V :
csak t r u e / f a l s e rtkekkel? gy igaz, de n e felejtsd el, hogy a w h i l e ciklus vgs
soron t r u e - k n t vagy f a l s e - k n t rtelm ezi az adatokat. A lnyeg teht az. hogy rtsd, mi szmt t r u e - n a k vagy f a l s e - n a k , am ikor ms tpus adatok rtelm ezsrl van sz. Az egyszer vlasz pedig az, hogy m inden, ami nem 0 vagy f a l s e , mindig t r u e - n a k szmt.

K: Mi trtnik a w h i l e ciklussal, ha
V :

a m y s q l i _ f e t c h _ a r r a y ( ) fggvny nem ad vissza sem milyen adatot? A levelezlistt trol adatbz+ o tabl 6 ltrehozsa. G Az j vsrlkat a listhoz adw ebo6 rlap o PHP poranosfjl megrsa.

Ha a lekrdezs nem ad vissza sem m ilyen adatot, akkor a m y s q l i _ f e t c h _ a r r a y { ) fggvny visszatrsi rtke

f a l s e lesz, ami azt eredm nyezi, hogy a w h i l e ciklus soha, egyetlen egyszer sem hajtja vgre a mvelet kdjt.

K: Vagyis ltezhet olyan ciklus, ami soha nem ismtldik?


V :
Igen, st olyan is. am i soha nem hagyja abba az ism tl dst. Nzd m eg pldul ezt a w h i l e ciklust:

) A lista tagjainak krlevelet kld webes rlap s PHP-parancsfjl megrsa.

w hile

(tru e)

He

l i f !

Az ilyen ciklust vgtelen ciklusnak hvjk, mert a tesztfelttel mindig igaz lesz, s ezrt a ciklus soha nem r vget. A vgtelen ciklusok nagyon rosszak.

htravan

142 3. fejezet

Adatbzis ltrehozsa s feltltse

PHP- & MySQL-mgnesek


A lap aljn tallhat mgnesek segtsgvel fejezd be a Send Email parancsfjl kdjt, hogy Elmer nekilthasson leveleket rni a vsrlinak. Emlkeztetl lljon itt mg egyszer, hogy miknt m kdik a mai 1 () fggvny:

mail (c m z e t t ,

trgy,

zen et,

'Front:'

fela d );

$dbc - mysqli_connect ('data.makemeelvis or die('Error connecting to MySQL ser $query = "SELECT * FROM emaii_iist"; $resuit = mysqii_query($abc, $query) or die('Error querying database.') while ($row * i y s q l i _ f e t c h _ a r r a y ( $ r e s u i t ) ) *m $first_name ~ $ r o w [ ' f i r s t _ n a m e ' ] ; $last name ~ $row [' last_naine ' ] ; Dear $first name $iast_name, \n

theking

mail (

rom

mysqii_close($dbc)

sendem ail.php

m ost itt vagy

143

a ksz sendemail.php parancsfjl

PHP- & MySQL-mgnesek


A lap aljn tallhat mgnesek segtsgvel fejezd be a Send Email parancsfjl kdjt, hogy Elmer nekilthasson leveleket rni a vsrlinak. Emlkeztetl lljon itt mg egyszer, hogy miknt m kdik a m a il () fggvny:

mail ( c m z e t t ,
Ne felejtsd el ezt a sajt e-mail cmedre vltoztatni!

trgy,

zen et,

'From:

'

fela d );

<? php

Srom * elmer@makemeelvis.com'; = $sub'ect =


$ te x t

A Trgy urlapmez" neve subject", ami meg egyezik azzal a nvvel, amellyel a mezt el red a $_P0$T tmbben.

$dbc - mysqli_connect('data.makemeelvis.com', 'elmer', or die{'Error connecting to MySQL server.'}; $query "SELECT * FROM emaii_list"; $result = mysqli_query($dbc, $query) or d i e ('Error querying database.'); while ($row = mysqli_fetch_array ($result)) { $first_name = $ row['first_name'1; $last_name = $row['last_name'1; $msg "Dear $first_name $last_naroe, \n

'theking',

'elvis_store' )

Az e-mail szvegt az elvism ail" nev urlapmezobe kell berni. A levl zenettrzse a vsrl nev bl s a levl szvegt trol rla pmez1)1 pl fel.

$to = r $

mail( I $ echo 'Email sent to: '


V

from

A m ail() fggvnynek az e-mail cmzett


m y sq li_ c lo se ($ d b c )

jt, a levl trgyt, az zenet trzst, valamint Elmer (a felad) cmt adod t

Az adatbzis email oszlopa trolja azoknak a vsrlknak az e-mail c mt, akiknek a levelet cmzed. Az oldalon egy megerst zenetet rsz ki azoknak a vsrlknak az e-mail c mvel, akik megkapjk a levelet.

sendem ail.php

A biztonsg szempontjbl ltalfe nem j tlet a felhasznl ltal b*- I takat kzvetlenl, ellenrzs nlkS tadni a mail () fggvnynek. Enne* a problmnak 3 megoldsra a 6. I

144 3. fejezet

fejezet mutat nhny mdszert.

Adatbzis ltrehozsa s feltltse

Tesztt
Kldj egy levelet a levelezlista tagjainak a Send Email rlap segtsgvel!
Tltsd le a Send Email weboldal kdjt a Head First Labs webhelyrl, a www.headf i r s t l a b s . com/books/hfphp cmrl. A kdot, amely a korb ban ltott Add Email oldalhoz hasonlan egy w ebes rlapbl ( s e n d e m a i l . htm l), egy stluslapbl ( s t y l e . c s s ) s kt kpbl ( e l v i s l o g o . g i f s b l a n k f a c e . j p g ) ll, a c h a p t e r 0 3 mappban tallod. Most hozz ltre egy j szvegfjlt s e n d e m a i l . p h p nven, s rd bele az elz oldalon szerepl teljes kdot. Tltsd fel az sszes emltett fjlt a webkiszolgldra, s nyisd meg a sendemail .html oldalt egy w ebbngszben. rj b e egy zenetet az rlapra, s kattints a Submit gombra.

Ne feledd, hogy a te e-tnail cmednek is rajta kell lennie a levelezlistn ah hoz, hogy megkapd az zenetet.

Leveled jtt...E lm ertl!


Elmer vgre mindenkinek, aki szerepel a levelezlistjn, elkldheti a MakeMeElvis.com akciirl rtest leveleket az j Send Email webes rlapja s PHP-parancsfjlja segtsgvel. A parancsfjl kimenett felhasznlva ezenk vl megerstheti, hogy minden levelet sikerlt-e elkldenie: minden alka lommal, amikor a parancsfjl while ciklusnak kdja lefut, megjelenik az Email sent to: someone somewhere.com (E-mail elkldve a valaki@valahol.com cmre) zenet egy vsrl cmvel az adatbzisbl. Vg eredmnyben teht Elmer szlesebb krben reklmozhatja az rujt, ami mg tbb Elvis-hasonmst jelent (br arrl megoszlanak a vlemnyek, hogy ez j-e).
E la d ta m a z eezee kk a n tilo p b o r c ip t., G azdag vagyok!

-mai/ parancs fa' j l tnyleg elkldi a le veteket az adatbzisba


t ro lt cmekre, gyhogy vatosan bnj vele!

m o s t rtt vagy

az alkalmazsnak trlsi lehetsgre is szksge van

Az ember nha szabadsgra vgyik


Minden virgz j zlet esetben vannak bukkanok az ton. gy tnik, nhny Elvis-rajong kibrndult a Kirlybl, s le szeretne kerlni El mer levelezlistjrl. Elmer eleget szeretne tenni a krsknek, de ez azt jelenti, hogy valahogy el kell tvoltania az emltett vsrlkat az adatbzisbl. K *edve& Elmeri
N e m s z e r e tn k t b b a k c i s a j n la t o t k a p n i a z E M s - b o ltb o l. M g m in d ig ra jo n g o k E lv is e r t d e m r n e m s z e r e tn k h a s o n lta n i r . K rle k , v e g y l le a l i s t a d r o . A z e -m a il c m e m

cbriggs@boarde-r-us.com.
Koszi.

Egy ex-haoflmas
T is z t e / t U ra m ! M iu t n t b b s z r is a lle r g i s r o . a m o t k a p t a m a z e r e d e ti \szrb a r k o /to , g y d n t t t e m , h o g y n e m b iz to s , h o g y n e k e m va\, h o g y g y n z z e * ki. m in t E lv ig . E g y k la s s z p a r k a m g re n d b e n va n . de a b a rk m r s o k . Krem, veg y e n le a levelezlietjrl.

dvzlettel, Brian P o ive rs bp@honey-doi t.com

Elmer nem ti boldog, hogy vsrlkat veszt, de tisztelet ben szeretn tartani a krs ket, hogy vegye le ol<et a leve lezlistrl.

Mindez hozztartozik a MySQL lethez - nha trlnd kell egyes adatokat az adatbzisodbl. Elmernek teht gy kell bvtenie az alkal mazst. hogy trlhessen is felhasznlkat az email_list tblbl.

rd le, hogy szerinted milyen j sszetevkre lesz szksge Elmernek az alkalma zsban, hogy megvalstsa a cmtrlsi kpessget:

146 3. fejezet

Adatbzis ltrehozsa s feltltse

Trls a DELETE segtsgvel


Alihoz, hogy adatokat trlhess egy tblbl, egy j SQL-parancsra. a DELETE-re lesz szksged. Ezt a parancsot egy j. Remove Email (Email cm trlse) nev parancsfjlban fogod hasznlni, amely trli egyes vsrlk adatait Elmer levelezlistjrl. Valjban egy j parancsfjlra s egy j w ebes rlapra lesz szksg - elszr azonban meg kell ismerned a DELETE parancsot. A DELETE SQL-parancs adatsorokat tvolt el egy tblbl. Emiatt aztn na gyon krltekinten kell hasznlnod, mert egy szempillants alatt kpes tisztra trlni egy adatokkal teli tblt. Ennek fnyben vedd szemgyre a DELETE legveszlyesebb formjt, ami egy tbla minden sort trli:
O A lovolozolistt tfol odatb a S'-tbla frebegsa.

^Ag"[-vsrikot-a-4isthee"Qd"Webes rl ap c PHP pafanosfjl mogfea.


0 A lista tagjainak' krlevelet kld wobes nr-tep-fr PHP -paf aflosfjJ-raeflfear 0 Egy webes rlap s PHP-parancsfjl lt rehozsa, amellyel trlni lehet egyes ^vsrlk e-mail cmt a listrl.

D ELETE

FRO M

t b la

neve

Ide annak a tblnak a nevt kell rnod, ame lyikbl sorokat szeretnl trlni.

gy fest, mg egy lpsre szksg lesz...a tervek nha menet kzben vltoznak!

Egyb minstk nlkl a DELETE parancs minden adatot kidob az adott tblbl

V a g yis s e m m it sem t r l h e t n k egy t b l b l anlkl, hogy m in d e n t t r ln n k ?

Nem, dehogy. A DELETE-nek pontosan megmondhatod, hogy melyik sort, illetve sorokat szeretnd trlni.
Ahho z, h o g y po n to s an m e g c l o z h a s d a DELETE-tel trlni kvnt sort vagy sor oka t, az utastshoz e g y v / h e r e z r ad k ot kell h o z z c s a p n o d .

Ha m g emlkszel r, ezt a z r ad k ot mr hasznltad a SELECT p a


ranccsal, h o g y adott soro kat klnts el e g y lekrdezsbl.

Hegyezd ki a ceruzd!
Tegyk fel, hogy Elmernek 23 Anne keresztnev, 11 Parker vezetknev s egy Anne Parker nev vsrlja van. rd le. hogy az albbi lekrdezsek hny adatsort trlnek:
DELETE FROM e m a i l l i s t WHERE f i r s t name = A n n e ' ;

DELETE FROM e m a i l l i s t WHERE f i r s t

name = Anne*

OR l a s t name =

Parker ;

DELETE FROM e m a i l

list

WHERE l a s t name = P a r k e r ;

most itt vagy > 147

DELETE ptusz WHERE

ezd ki a ceruzd! Megolds


DELETE FROM e m a i l l i s t

Tegyk fel, hogy Elmernek 23 Anne kereszinev, 11 Parker vezetknev s egy Anne Parker nev vsrlja van. rd le, hogy az albbi lekrdezsek hny adatsort trlnek:
name = ' A n n e /

WHERE f i r s t

23

DELETE FROM e m a i l l i s t WHERE f i r s t

name = A n n e OR l a s t name = P a r k e r ' ;

DELETE FROM e m a i l l i s t WHERE l a s t name = P a r k e r ;

_ Beugrats krds! Ez a vezetknv nem idzjelben ll, ezrt egyetlen sor sem fog trldni - minden szveges rtket idzjelek kz kell tenni!

Meghatrozott adatok trlse a DELETE s a WHERE zradk segtsgvel


Ha a DELETE parancsot a WHERE zradkkal egytt hasznlod, nem egy teljes tblt rtesz ki, hanem konkrt adatsorokat jellhetsz ki trlsre. A WHERE zradk lehet v teszi, hogy az eltvoltani kvnt sorra sszpontosts - esetnkben Elmer egyik v srljra, aki le szeretne kerlni a levelezlistrl.

DELETE FROM email list

_ _

, .

A keresett rtk.

WHERE email = 'prhoney-doit.c o m T


A fafe/a o s z lo -y neve. ^ zradknak ez a rsze

mindent sort ellenriz, hogy megkeresse a megadott sort.

A VHERE zradkkal egy lekrdezs konk rt adatsorokra szkthet.

A WHERE zradkon belli teszt egy sszehasonltst hajt vgre a tbla minden sor val. Ebben a pldban az egyenlsgjel (=) azt vizsglja, hogy az em ail oszlop rt ke mely sorokban egyenl a "p r@ h o n e y -d o it .com" rtkkel. Ha valamelyik sor em a il oszlopnak rtke illeszkedik, a parancs trli az adott sort.

rd le, hogy szerinted mirt az e m a i l oszlopot hasznljuk a where zradkban, s mirt nem a f i r s t _ n a m e vagy a i a s t _ n a m e oszlopot:

148 3. fejezet

Adatbzis ltrehozsa s feltltse

Cskkentsd a minimumra a vletlen trls kockzatt!


Fontos, hogy megrtsd, hogy' br a w h e r e zradkban brmelyik oszlop nevet hasznlhatod sorok keressre, nagyon j oka van annak, hogy Elmer DELETE lekrdezsben az em a il oszlopot vlasztottuk. Gondold
gig: ha a WHERE z r ad k felttelnek t bb so r is megfelel, a k k o r min.

A DELETE utasts WHERE zradka len fitO V B tG S Z I 3 TOTO101


^ .

Jen illeszked sor trldni fog - ezrt lnyeges, hogy Elmer WHERE zradekban pontosan jelld ki a trlni kvnt sort. In valjban az egyedisgrl van sz. Biztonsggal felttelezheted, hogy z e m a i l _ l i s t tblban az e-mail cm ek egyediek, mg a kereszt- s ve zetknevek nem azok. I la egy olyan WHERE zradkot adnl meg egyetlen vsrl trlshez, amely a f i r s t _ n a m e oszlopban keresi a " P a t " rtket, minden Pat nev vsrl trldne - amit nyilvn nem szeretnl. Ezrt fontos, hogy Elmer WHERE zradkt gondosan hatrozd meg, s az em a il oszlopban keress egy konkrt rtket.

kvnt sor pontos ki-

jellst,

DELETE FROM email_list WHERE email = "pr@honey-doit.com'

A DELETE lekrdezs ezt a sort trli az adatbzisbl - soha tbb nem ltod!

email list
r

Az email oszlop hasznlata

j\rs\_nom9 \
J o e ____I I Bruce I

la tn a m

email_________ 1

a WHERE zradkban segt, hogy egy egyedi rtket ke ress, s cskkenti egy sor v letlen trlsnek a kockzatt.

joe _ m @ s t a r b o z z c o f f e e . c o m --------1 Milano 1 h r v jc e @ c h o c o h o lic -i n c .c o m S p e n c e ____ | _ r' * Henderson Eckstein VA/ii YV U Jaffe Shaffer I Q , _ ' ' 1 V I d _

h.-rtie h @ o b ied v ille .n e t


Bertie Greg _ W ilm a

\
I 1 1 1 I

areQ e c k @ b r e o k n e c k p i z z a .c m _

1
I w ijm ow u @ *t'-b u z z c o tte e .co m >o m io W e>-bozzctf!e c o r n _
ls@obiedv <lle -net __

Ha a WHERE zradkban az email helyett a first_name oszlopot hasznlnd, vletlenl ezt a felhasznlt is trlnd.

S am _____ Louis Bubba John v l ? P a !

1
Tshakespeare

b sh ak e s@ m iah ty gu m b o ll.n e t _ 0 h n d 0 e @ tik ib e a n l0 u n 9 e .c 0 m _ q ro m m e tp @ 5 im uduck.com _

1
Poe

j
)1 > Gromm et

File Edit W in do w Help B

mysql> DELETE FROM email__list WHERE email = ' pr@honey-doit.com 1 row deleted_ (0^005 sec)_ _ _ _ _ _ J

most itt vagy > 149

teszteld a DELETE parancsot

Tesztt
Prbld ki a DELETE parancsot Elmer adatbzisn!
Indtsd el valamelyik MySQL-eszkzt, s prblj ki nhny DELETE parancsot egyes adatsorok trlsre az e m a i l _ l i s t tblbl a vsrlk e-mail cm e alapjn. Ne felejtsd el megadni a WHERE zradkot minden DELETE utastsban, nehogy vletlenl az egsz tbla tartalmt trld!

A DELETE parancs j l jn, de erede tileg egy webes rlap e egy PHP-parancef jl segtsgvel akartunk adatsorokat t rlni, nem?

De igen. Egy levelezlista semmikppen sem kezelhet gy, hogy sajt kezleg, kln-kln lekrdezsekkel trlsz felhasznlkat.
Mivel elkerlhetetlen, hogy Elmer olyan felhasznlkkal tallkozzon, akik a jvben nem szeretnnek szerepelni a levelezlistjn, sszer a vsrlk eltvoltsra egy w ebes felhasznli felletet kialaktani. Egy w ebes HTML-rlappal s egy PHP-parancsfjllal, no meg egy WHERE zradkkal megtmogatott DELETE FROM lekrdezssel mindez tutira m egoldhat...

150 3. fejezet

Adatbzis ltrehozsa es feltltse

Gyakorlat

Elmer elksztett egy w ebes rlapot ( r e m o v e e m a i l . h t m l ) , amellyel egy-egy vsr lt trlhet a levelezlistjrl. Az rlapra csak egy e-mail cmet kell berni, m gpe dig az e m a i l nev HTML-rlapmezbe. Egsztsd ki Elmer r e m o v e e m a i l . p h p pa rancsfjljnak kdjt, amelyet az rlap meghv az egyes vsrlk trlsnek vgre hajtsra!

f\ n o Ennek az urlapmezonek a neve email".

M ake M e ESv.s - R e m o v e mai

A Remove gombra kattintas POST-krelernknt elkldi az r lapot a pHP-parancsfjlnak.

rem oveem ail.htm l


<?php $dbc nrysqli_ connect('data.makemeeivis.com, elmer1, thekinq, e!vis_store') or die('Error connecting to MySQL server.')

mysqli close($dbc);

rem oveem ail. php

?>

m ost itt vagy

151

a ksz removeemail.php parancsfjl

Gyakorlat - megold*

Elmer elkszteti egy w ebes rlapot (removeemail .html), amellyel egy-egy vsr lt trlhet a levelezlistjrl. Az rlapra csak egy e-mail cmet kell berni, m gpe dig az email nev HTML-rlapmezbe. Egsztsd ki Elmer removeemail.php pa rancsfjljnak kdjt, amelyet az rlap meghv az egyes vsrlk trlsnek vgre hajtsra!
pi

n o

km

Make Me EMs - Remove

Ennek az rlapmeznek a neve email".

M a \ c ^ M ^ u v i s x m
Enter an email address to ren ov e

A Remove gombra kattints POST-krelemknt elkldi az r lapot a PHP-parancsfjlnak.

Az email rlapmez adatait a pOST tmbbl e y valtozoba g rjuk, majd ezt a vltozt hasznl juk a DELETE lekrdezesben.
rem oveem ail.htm l
<?php $dbc = mysqli_connect( data.makemeelvis.com1, 'elmer', or die(Error connecting to MySQL server.1) theking, 1elvis_store)

gyelj az aposztrfokra s a ketts id.................................................................... zjelekre! A teljes SQL-lekrdezst ket...............................................................................................................ts idzjelek, mg az $email vltozban f\ue*-y = "D E l-E T E FR OtA em aiM ist WHERE email = '/email'"; trolt e-mail cmet aposztrfok kz
/email - f'_PO STremain;
mys[lI_<\uevy(fdbd, f^ u e ry ) or dieCEr\r-o*- ^uev-yin^ database-1 );

kell zrnod.

Soha nem rt, ha megersted, hogy mi tftnt' k,nsefl ha arfl wn sz, hogy trlsz valamit egy adatbzisbl.
rem oveem ail.php

edKo 'Customer moved: ' . /email;


mysqIi_c.lose ($dbc);

?>

Me felejts el kitakartani magad utn az adatbzis-kapcsolat bezrsv!.

152 3. fejezet

Adatbzis ltrehozsa s feltltse

O -A-lovolozlistt trol -adatbzis s tbla ltfohozaar ^ Ag-f vsrlkat a listhoz ad wobos rlap s PHP parancsfjl megrsa: O A lista tagjainak -krlovelot kld wobos rlap e PHP parancsfjl mogrsa.

Vgre kszen vagyunk!

O -Egy wobos - flaft-s PMP paranosfjl-ltrohozsa, amotiyol- trlni-lohot ogyos vsrlk o mail im t a listrl.

Tesztt
Trlj egy vsrlt a levelezlistrl a Remove Email rlap segtsgvel!
Ez mr egy kicsit kezd ismers lenni, nem? Tltsd le a Remove Email weboldal kdjt a Head First Labs webhelyrl, a w w w . h e a d f i r s t la b s . c o m / b o o k s / h f p h p cmrl. A kdot, amely egy w ebes rlapbl (rem o ve e m a il . h t m l ) , egy stluslap bl ( s t y l e . e s s ) s kt kpbl ( e l v i s l o g o . g i f s b l a n k f a c e . j p g ) ll, a c h a p t e r 0 3 mappban tallod. Most hozz ltre egy j szvegfjlt r e m o v e e m a il .php nven, s rd bele az elz oldalon szerepl teljes kdot. Tltsd fel az sszes fjlt a webkiszolgldra, s nyisd meg a rem oveem ail .h tm l oldalt egy w ebbngszben. rd be egy vsr l e-mail cmt az rlapra, s kattints a Remove (Eltvolts) gombra, hogy t rld az illett az adatbzisbl. UttHH
M*ke Me tvs -

R oe emv
-

:------------- --------

__________ ______

Earern *a w ren ne a d -w ov.


Em ail a a o re M

A parancsfjl elvgzi a DELETE lekrdezs kiad snak piszkos munka'jt, majd megersti a trlst.

c5ag sgooartls-7-^ O, u tCf T

most itt vagy 153

a levelezlista-alkalmazs ksz!

Ez mr hivatalos. A PHP-nek s a MySQL-nek ksznheten Elmer MakeiMeElvis.com w ebhelye most mr rdemes arra, hogy alkalmazsnak hvjuk. Elmer most mr maradandan trolhat adatokat egy MySQL-adatbzisban, s w ebes rlapokon keresztl mveleteket is vgezhet az ada tokon. A HTML-oldalak, PHP-parancsfjlok s begyazott SQL-lekrdezsek kom bincija lehetv teszi Elmernek, hogy vsrlkat adjon a le velezlistjhoz (ezt a vsrlk maguk is megtehetik), illetve eltvoltson onnan egyeseket, valamint hogy leveleket kldjn mindenkinek, aki a listn szerepel. ... ....

ljen a PHP e a M y5Q L! Na ez m r * w ebalkalm azsl F elpthetem a levelez<51 is t m a t, e -m a ilt kldhetek az ssze s vsrlm nak, s mg ki is ta k a rth a to m a lis t t.. .e s m in d e z t a webbngsz<5mb<51l }

A z A d d E m a il o ld a l j v s r l k a t ad E lm e r le v e le z lis t j h o z .

a d d em a a d d e m a il.p h p

A S e n d E m a il o ld a l U e g y e tle n k a ttin t s r a le v e le t k ld m in d e n k in e k aki a lis t n s z e re p e l.

s e n d e m a il.p h p

V issza a feladnak! Kerlek, t r lj az E lvis-levelezolistrll

rem oveen re m o ve e m a il.p h p


A R e m o v e E m a il o ld a l t r l e g y v s r l t a le v e le z lis t r l.

Adatbzis ltrehozsa s feltltse

PHP & MySQL keresztrejtvny


Ha mr tkletesen tudod utnozni Elmer tnclpseit, prbld meg egytt ddolni vele a dalokat, s tltsd ki az albbi keresztrejtvnyt.

Vzszintes
3. A MySQL-adatbzisok ezekre oszlanak (angolul, tbbesszmban). 5 Maradand, magas fokon rendszerezett adatszerkezet, amely jellemzen egy fjlban troldik a merevlemezen (angolul). 6. Ha ezt a feltteles zradkot egy SQL-utastshoz adod, szablyozhatod, hogy az utasts mely sorokra hasson. 9. Ezt az SQL-parancsot hasznlhatod, hogy sorokat v lassz ki egy tblbl. 10. Ezt a MySQL-adattpust hasznlhatod klnbz mennyisg szvegek trolsra. 12. Egy MySQL-tbln bell ez egy adott tpus adatot t rol (angolul). 13. Ez a kulcssz addig csinltat valamit, amg egy adott tesztfelttel igaz.

Fggleges
1 . MySQL-adattpus, amely tizedesjegy nlkli szmok
trolsra hasznlhat. 2. Ezzel az SQL-paranccsal vizsglhatod meg egy tbla szerkezett. 4. Ha egy w ebhelyet dinamikus kpessgekkel bvtesz a PHP s a MySQL segtsgvel, ez lesz belle (angolul). 5. Ezzel az SQL-paranccsal semmisthetsz meg sorokat egy tbln bell. 7. Miutn ltrehoztl egy j adatbzist a MySQL-terminlban, ezt a parancsot kell kiadnod, mieltt brmit csinlhatnl az adatbzissal. 11. Adatok gyjtemnye egy tblban, amely minden oszlopbl egyet-egyet tartalmaz (angolul).

most itt vagy 155

PHP & M ySQL keresztrejtvny - megolds

PHP & MySQL keresztrejtvny - megolds

156 3. fejezet

Adatbzis ltrehozsa s feltltse

PHP & MySQL szerszmoslda


Ebben a fejezetben nem csak segtettl Elmernek, hogy elindthasson egy webalkalmazst, hanem rtkes PHP- s MySQL-ismereteket is szereztl. Pldul...

m ysqli_fetch_array()
Ez a beptett PHP-fggvny egyetlen adatsort olvas ki egy adatbzis-lekrdezs eredm ny bl Ha egyms utn tbb adat sort szeretnl kinyerni, ismtelten meghvhatod ezt a fggvnyt.

w hile
Ciklusszerkezet a PHP-ben, amely lehetv teszi, hogy egy kdrszt addig ismtelj, amg egy adott felttel teljesl. A while ciklus egyik klnsen hasznos felhasznlsi terlete az adatsorok bejrsa egy SQLlekrdezs eredm nyben.

DO T BE t b &l _ n e v e RP AL

2
b

El f Z SQL' utas'ts egy teljes

*
T

w
F -

S5EL
a

benne tarolt sszes adattal egytt trldik.


e n n e h

describe t b a___neve l
Ha egy taba szerkezetre vagy kivncsi, erre 17

r - K s s s r
DELETE FROM tbla_neve
Ezt az SQL-utastst hasznlhatod sorok trlsre egy' tblbl. Attl fggen, hogy hogyan hasznlod az utastst, egy vagy tbb sort is trlhetsz. npVe SELEc t * fk o m t a b la _ n e v e c n r Utasts sorokat vlaszt Ez az SQ L' az utastsban megmutatja az oszlopok vet es adattpust.

WHERE
Ezt az SQL-zradkot ms SQLparancsokkal egytt hasznlhatod olyan utastsok felptsre, amelyek adott sorokat vesznek clba egy tblban. Elklnthe ted vele pldul azokat a sorokat, amelyeknek az egyik oszlopa egy adott rtket tartalmaz.

* V issz-,-.

" S S - r lz *
y -s a lekrde-

m nyt szere^ szef oszlop adatt zstl nem _ a * helyett so szeretnd m eg ^ k neveit. rold fel az egyes oszlopo

most itt vagy

157

4 Valszeru, gyakorlati alkalmazsok

A z alkalmazsod a Weben
f
Ha b a n n t dugok a ta n m ? kipufog. csvbe, a kocsija nem fog elindulni, s nem runk d o g t. Persze j h e t h e ly e t t e s t ta n r is, gyhogy neki is nyom ok egy b a n n t, w De ha a h e ly e tte s t t a n r t V is h e ly e tte s tik ...

Nha szembe kell nzned a valsggal, s jra kell gondolnod a terveidet.


Vagy mr az elejn gondosabban kell tervezned. Amint az alkalmazsod kike rl a Webre, rjssz majd. hogy nem tervezted meg elg krltekinten. Ami rl azt hitted, hogy mkdni fog, a val vilgban nem elg j. Ebben a feje zetben olyan vals problmkkal foglalkozunk, am elyekbe beletkzhetsz, amikor az alkalmazsodat a tesztgpedrl les krnyezetbe viszed t, kzben pedig jabb fontos PHP- s SQL-kdokat mutatunk.

ez egy j fejezet 159

Elmernek jobb levelezlista-alkalmazsra van szksge!

Elmer egyes vsrli elgedetlenek


Elmer vsrlinak levelezlistja jelentsen megntt, de a levelekre sokan panaszkodnak. A panaszok nmileg klnbznek, de gy t nik, kzs bennk, hogy a vsrlk res leveleket kapnak, esetleg tbb levelet egyszerre - egyik sem tl j jel. Elmernek ki kell derte nie, hogy mi a hiba, s hogyan javthatja ki, hiszen ezen ll vagy bu kik az zlet sikere.
Elmer, Krlek, llj le a levlszemt-kldzgetssel. Cs pem az akcis ajnlatokat, de lgyszi, ne kldj egynl tbbet. Minden alkalommal, amikor rte stesz egy akcirl, hrom levelet kapok. Hey Elmer, iVe received several Wank email m essa g es from you. D o es that m ean you d o m want m e to buy anything from your store? Im confused. -denny Hsges, de bosszankod vsrld, Elbert
----------------------------- --------

h LCJu O

Spam? Inbox

From : Elbert Krestee <elbertkresleesprockets tnz> S u b je ct: S p a m ? D ate: October 2 4 .2 0 0 8 1 2 2 3 :3 3 PM CDT To Elmer Priestley <elm er@makemeelvis com> Elmer, P le a s e stop it with the spam. I like getting the sa le s em ails but p lease don't send me more than one. I dont need to get three messages every time you want to tell me about a sale Your Loyal But Annoyed Customer. Elbert ___

__________________ WWED - Inbox

Su *jom WWEDSimons o fis im s O starbuzzcoftee com> bre t Aitson c


Date October 24.2008 12:1850 PM C D T To: Elmer Priestley <elmermakemeelv!s.corn> Dear Elmer, j i ,

Why do you keep sending me emails with no subject and n o t h i n ^ B S ^ f f o ^ S ^ Elvis would do? I think not Please take me off your mailing list Thankyouverymuch. Afison

Hem te ts z ik ez nekem, lehet, hogy a 5end Em ail oldal okozza a p ro b l m t?

P-8. The sideburns you sold me are giving me a rash.

Kedves Elmeri

Mirt kldzgetsz nekem olyan leveleket, amelyeknek ninos se trgya, se szvege? Szerint ed Elvls helyeseln ezt? M e rt szerintem nem. Kr lek, vegyl le a levelezlstdrl.
Nagyonszpenksznm Alison ui: A nlad vsrolt barktl kitseket kaptam

Elmer tudja, hogy gond van, de segtsgre van szksge, hogy kidertse, pontosan hol a hiba.

160 4. fejezet

Valszer, gyakorlati alkalmazsok

A feladatod, hogy elja'tszd Elmert, s kitalld, hogy mirt mennek ki res levelek. Elmer azt gyantja, hogy a sendemail.html rlap lehet a ludas.
rd ide, hogy szerinted m it 9<>ndol Elmer arrl, hogy mi lehef 3 problma.

Wake M e Elvis - S e n d Em ail

Private: For Elmer's use O N LY Write and send an email to mailing list members Subject of email:

Body of email

sendem ail.htm l

most itt vagy

161

lgy elmer... megolds

Lgy Elmer, a levelezlista-kezel! - megolds


A feladatod, hogy eljtszd Elmert, s kitalld, hogy mirt mennek ki res levelek. Elmer azt gyantja, hogy a sendemail.html rlap lehet a ludas. rd ide, hogy szerinted mit gondol Elmer arrl, hogy mi lehet a problma.

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

0 ^ 0

............-

---------

Make V e Eivis - Send Email'


. V . r J

Ha gy kattintok a Submit gombra, hogy nem rok be zenetet, egy res levl fog kimenni.
O

Private: For Elmers use O N LY Write and send an email to mailing list members Subject of emailBody of email:

f
A

%
1mS

m m

sendem ail.htm l

Ha az rlap Submit gombjra gy kattintunk, hogy semmi nincs a Body mezben, a program egy res levelet kld el. s ha mr itt tartunk, ugyanez a problma akkor is, ha a Subject mez res...

162 4. fejezet

Valszer, gyakorlati alkalmazsok

Vdd meg Elmert...Elmertl


Szval a hiba Elmer kszlkben van - ha vletlenl i Submit gombra kattint, mieltt bern a levl szvegt, i lista minden tagja kap egy res levelet. Soha ne ttelezd fel, hogy egy w ebes rlapot pontosan gy fognak hasznlni, hogy eredetileg tervezted! Neked, a lelkes PHP-programoznak kell kezelned az ilyen problmkat, szmtva arra, hogy egyes felhasznlk helytelenl hasznljk majd az rlapjaidat. Nzd m eg mg egyszer a sen d e m a il .php parancsfjl lelenlegi kdjt, hogy lsd, hogyan jnnek ltre Elmer res levelei:
^ O r\ Make Me E h fc .~ S f^ | p * * L |

SXOM
S Su b ject o f emailr * m enDers.

<?php $from = $subject $ t e x t = $ POST[ 1e l v i s m a i l 1 ] ;

A Send Email parancsfjl az rlapra bert sz veget hasznlja a levl sszelltshoz, akkor is, ha a felhasznl semmit sem rt be. Az rlapra bert szveget a $ POSTCsubject'] s a $ POST['elvismail'] vltozkbl olvassuk 'elm er@ m ak em eelvis.com '; "s a $subject, illetve a $text vltozkba = $_P0ST[ ' s u b j e c t ' ] ;

mentjk...
1t h e k i n g , ' e l v i s _ s t o r e ')

$dbc = m y s q l i _ c o n n e c t ( d a t a , m akem eelvis . com , ' e l m e r ' , o r d i e ( ' E r r o r c o n n e c t i n g t o MySQL s e r v e r . 1 ) ; $ q u e r y = "SELECT * FROM e m a i l _ l i s t " ; $ r e s u l t = m y s q li_ q u e ry ($ d b c , $query) o r d i e ( E r r o r querying d a t a b a s e . ' ) ; w h ile ($row = m y s q l i _ f e t c h _ a r r a y ( $ r e s u l t ) ) { $to = $row [ ' e m a il' ] ; $first_n am e = $row [' first_ n a m e ' ] ; $ l a s t _ n a m e = $ r o w [ ' l a s t _ n a m e 1] ; $msg = " D e a r $ f i r s t _ n a m e $ l a s t _ n a m e , \ n $ t e x t " ; m a i l ( $ t o , $ s u b j e c t , $msg, ' F r o m : ' . $ f r o m ) ; echo 'Em ail s e n t t o : 1 . $ t o . '< b r / > ' ;

A problma csak az, hogy a $text vltozt akkor is fel hasznljuk az zenetben, ha nem tartalmaz szveget...

)
m ysq li_close($d b c);

...s ugyanez a Helyzet a $subject vltozval is.

?>

rd le, hogy szerinted m it kell megvltoztatni a s e n d e m a il .p h p parancsfjl ban, hogy kijavtsuk az res levelek problmjt:

most itt vagy > 163

ellenrizni kell a sendemail.php parancsfjlt

Kvetelj meg helyes rlapadatokat!


Elmer Send Email rlapjnak get szksge van az ellenrzsre, vagyis arra, hogy biztostsa, hogy az rlapra bert adatok megfelelnek, mieltt brmit csinlna ve lk. Elmer mr alkalmaz ellenrzst, mg ha nem is gy hvja: amikor rendelst kap valamelyik Elvis-kellkre, nem kldi el azonnal az rut - elszr ellenrzi a rendelst! A rendelsek esetben Elmer elszr azt nzi meg, hogy a vsrl hi telkrtyja rvnyes-e. Ha igen, akkor iktatja a rendelst, s elkszti szlltsra. Ezt kveten azonban azt is ellenriznie kell, hogy a vsrl szlltsi cm e rend ben van-e. Ha igen, Elmer folytatja a rendels teljestst, s tjra bocstja az rut. Elmer boltja teht csak akkor tud egy rendelst sikeresen teljesteni, ha a rendels adatai rendben vannak.
A szlltsi cmnek Elmernek ellen- -v. riznie kell minden vsrl hitel krtyjt, mieltt teljesthetn a rendelsket. ^ rendben kell lennie.

Az ellenrzs azt jelenti, hogy meg bizonyosodsz rla, hogy a kapott ada tok megfelelnek-e a vrakozsoknak.
Az ru szlltsra ess k akkor kerl sor, ha a hitelkr tya s a szlltsi cm is rvnyes.

Alihoz, hogy* megoldhasd Elmer res leveleinek problmjt, ellenrizned kell a sendemail .php parancsfjlhoz kerl rlapadatokat. Ez azt jelenti, hogy az gy floldalon lev weboldalrl (sendemai 1 .ht.ml) az rlapadatok a kiszolglhoz ke rlnek, a kiszolgloldal (sendemai 1 .php) pedig ellenrzi, hogy megvan-e min den adat. Ehhez ki kell egsztened a sendemai 1 .php kdjt, hogy megvizsglja a szvegmezkben lev rtkeket, s megbizonyosodjon rla, hogy a mezk nem resek. Ha mindent rendben tall, a parancsfjl elkldheti a levelet.

Ha az adatokkal minden ok, elkldm a levelet.

E lm e r k it lti s b e n y jtja a S e n d E m a il rla p o t.

A z r la p a d a to k a s e n d e m a il.p h p p a ra n c s f jlh o z k e r ln e k a k is z o lg l n .

Tessk, kedves kiszo l gl: i t t kldm Elm er

r\apadata\t.

A PH P -parancss| ellen rzi az a c ^ to k t, s ha r e b en ta l lja azo k a t, elk ld i a kap leve le t. H a nerr. a k k o r h ib a z e n t e t kld az gy fln ek.

o
164 4. fejezet

A k is z o lg l H T M L - v la s z t ad a b n g s z n e k : v a g y a z t, h o g y a le v e le k e lk ld s e m e g t r t n t , v a g y a z t, h o g y az r la p a d a to k n e m rv n y e s e k .

Valszer, gyakorlati alkalmazsok

A levlkld rlap ellenrzse mgtti logika


Elmernek teht ellenriznie kell a sen d em ail .h tm l rlaptl kapott adatokat, mieltt egyetlen levelet is elkldhetne. A levlkldsnek valjban teljesen az adatellenrzstl kell fggnie. Amire szksg van, az az, hogy a PHP egy dntst hozzon a sen d em ail .php parancsfjlhoz befut rlapadatok rvnyessge alapjn. Olyan kdra van szksg, ami ezt mondja: ,,/?a az adatok rvnyesek, elkldheted a leveleket".

Ennek a kt felttelnek teljeslnie kell ahhoz, hogy az adatokat rvnyesnek lehessen tekinteni.

IF a Trgy tartalmaz szveget AND a Trzs tartalmaz szveget THEN kldd el a leveleket
Ha mindkt felttel teljesl, akkor minden rendben van, s el lehet kldeni a leveleket. MH T ' f l i M M i

Eddig gy kldtk el a leveleket, hogy nem foglalkoztunk azzal, hogy van- e valami ezekben az ffrlapmezokben. Az ellenrzs rvn gondoskodhatunk rla, hogy csak akkor kldjnk levelet, ha mind kt rlapmezotoen szerepelnek adatok.
Nincsenek se n d e m a il.h tm l

hlye krdsek M irt jobb K . ! gy tudom, az gyflen is lehet ellenrizni az adatokat, K: ellenrzs? a kiszolgloldali ellenrzs, mint az gyfloldali nem csak a kiszolgln. Az ilyen ellenrzs hogy mkdik? V Az
! gyfl a webbngsz, ezrt minden olyan vizs glat gyfloldali ellenrzs, ami az eltt trtnik, hogy az adatokat elkldennk a PHPparancsfjlnak. Az olyan nyelv kdok, mint a JavaScript, kpesek gyfloldali ellenrzst vgez ni. Ha tbbet szeretnl tudni a tmrl, olvasd el a H ead First JavaScript cm knyvet, amely rszle tesen trgyalja az gyfloldali ellenrzst. ! Ha az ellenrzst az gyflen hajtjuk vgre, azzal csak a problma egyik felt oldjuk meg. Megeshet, hogy Elmer kzvetlenl a s e n d e m a i l . php-t tlti be. s gy tovbbra is kpes res levelet kldeni. Ha az ellenrzst azonban a kiszolgln vgezzk cl, ez nem trtnhet meg: az rlapon resen ha gyott mezket ugyangy szrevesszk, mint a PHPparancsfjltl kzvetlenl kapott res adatmezket. Ezzel nem azt mondjuk, hogy az gyflen nem r demes ellenrizni - nagyon is rdemes. A kiszolg l azonban a vdelem utols vonala, ezrt a helyte len rlapadatok elfogsban a kiszolgloldali el lenrzs nem mellzhet.

most itt vagy 165

az if utasts

Dntshozatal a kdban az IF segtsgvel


A PHP i f utastsnak segtsgvel a kdban dntseket hozhatsz attl fggen, hogy valami igaz-e vagy sem. Vegyk ismt Elmer rendelseinek esett: mieltt teljestene
egy rendelst, Elmernek meg kell kapnia az ru ellenrtkt, vagyis meg kell terhel nie a vsrl hitelkrtyjt. Ha a vsrl rossz krtyaszmot adott meg Elmernek, a rendels nem teljesthet. Elmer teht minden rendelsen egyfajta vals ellenrzst vgez, aminek a lnyege a kvetkez:

Ha a vsrl hitelkrtyja rendben van, folytathatod a rendels teljestst.


Ezt a forgatknyvet az i f utasts segtsgvel fordthatjuk PHP-kdd - ez az utas ts ppen arra szolgl, hogy ilyen dntseket hozzunk:

A legegyszerbb i f utasts hrom rszbl ll:

Az i f kulcssz Ez jelzi az utasts kezdett. A tesztfelttel A tesztfelttel vagy feltteles kifejezs rgtn az 1 f kulcssz utn ll, zrjelben. Ide kell rnod azt az utastst, amelynek az rvny essgt vagy igazsgt meg szeretnd llaptani. A mvelet Az i f utasts mvelete kzvetlenl a tesztfelttelt kveti, s kapcsos zrjelek kztt ll. Ide kell tenned azt a PHP-kdot, amelyet vgre szeretnl hajtatni, ha a felttel igaznak ( t r u e ) bizonyul.

Az utasts kezdett f elzi

Ez 3 M l f i i . Egy fggvnyt hv meg, amely ellenrZ*' 3 $cre<^ - car<L nu,n (hitelkrtyszm) vltoz tartalma rvnyes-e.
{

A mvelet kezdett a kapcsos zrjel jelzi-

i f O
}

( i s V a l i d ($e r e d it_ c a r d _ n u m ) ) f illO r d e r ();


A

Ez a kitallt fggvny true vagy false rtket ad vissza a hitelkrtya rvnyessgtol fggen.

z 7 Ez zrja le a mveletet

s az if utastst.

166 4. fejezet

Valszer, gyakorlati alkalmazsok

Az igazsgot keresve
Az i f utasts szve a tesztfelttel, amelynek a kirtkelse mindig vagy t r u e (igaz), vagy f a l s e (hamis) rtket ad. A tesztfelttel lehet egy vltoz, egy fggvnyhvs, de akr egy sszehasonlts is, hogy csak nhny pldt emltsnk. Elmer hitelkrtya-ellenrz kdja tesztfelttelknt egy fggvny hvsra tmaszkodik, ami azt jelenti, hogy az emltett fggvny ltal vissza adott rtk t r u e vagy f a l s e lehet.

A tesztfelttel oaz vagy hamis lehet.

IF a hitelkrtya rvnyes THEN teljestsd a rendelst "

if

(is V a i i d ( $ c r e d i t c a rd num )) M fillO r d e r ();


H 3 ^ f e l t t e l ig,

3 mVle t

vgrehajtdik.

Tesztfelttelknt nagyon gyakran hasznlnak sszehasonltst, ami jellemz en egy vltoz s egy rtk sszevetst foglalja magban. Ha Elmer pldul rengedmnyt szeretne adni azoknak a vsrlknak, akik Nevada llamban laknak, egy olyan i f utastst rhat, amely a szlltsi cm alapjn vgzi el az sszehasonltst: ____ z akkor igaz, ha a $shipping_state vltoz

S '
IF 3

a Nevada1 szveget tartalmazza.


'N e v a d a ') {

vsrl Nevadban l

{ $ s h i p p i n g _ s t a t e == $ to ta i = $ to ta i

THEN engedj az rbl

* 0 .9 ;

----------- A mvelet 10% -os renEz a tesztfelttel egyenlsgi sszehasonltst vgez - ezt jelzi a kt egyenlsgjel (==). Egyenlsgi sszehasonlts azonban nem csak vltozk s karakterlncok kztt vgezhet - vltozkat szmokkal vagy vltozkat vl tozkkal is sszevethetnk, st szmtsokat is vgrehajthatunk.

gedmnyt alkalmaz, ha a tesztfelttel igaz.

Ellenrizheted, hogy az egyik vltoz tar talma megegyezik-e egy msik vltoz tartalmval.

A szmrtkeket ne

($num ite m s == 10)

tedd idzjelbe.

($ s h ip p in g _ a d d re s s == $ b illin g _ a d d r e s s )
A tesztfelttelekben matematikai m veleteket is vgezhetsz.
most itt vagy 167

rtkek sszehasonltsa a php-ben

Az IF nem csak az egyenlsget tudja vizsglni


Az if utasts tbbre is kpes az egyenlsg vizsglatnl. Az if utastsban le v tesztfelttellel azt is ellenrizheted, hogy egy7 rtk nagyobb-e egy msiknl. Ha igen, a felttel eredm nye true lesz, s a mvelet kdja vgrehajtdik. me nhny tovbbi teszt, amelyekkel vezrelheted egy i f utasts dntst:
$ s m a l l number = 2 ;

Az if utastst nyugodtan rhatod teljes egszben egy sorba, ha a mvelet viszonylag egyszer.

z a kt kiindul

Vltoz.
Azt, hogy kt dolog nem egyenl-e, ktfle kppen lehet ellenrizni: a <> s a != segt sgvel. Ezek ppen ellenkez eredmnyt adnak, mint az == egyenlsgvizsglat. A nagyobb, mint" jel (>) azt vizsglja, hogy a bal oldalon ll rtk nagyobb-e a jobb oldalon llnl. Ha igen, a felttel eredm nye true lesz, ha nem , akkor pedig false. A kisebb, m int jel (>) a bal oldalon ll r tket sszeveti a jobb oldalon llval. Ha a bal oldali rtk kisebb a jobb oldali nl, a felttel eredmnye true lesz. A nagyobb vagy egyenl mvelet (>=) ha sonlan mkdik a nagyobb, mint" (>) mvelethez, de akkor is true eredmnyt ad, ha a kt rtk egyenl. A kisebb vagy egyenl mvelet (<=) a ki sebb, mint (>) mvelethez hasonlt, de ak kor is true eredmnyt ad, ha az nkek egyenlek.

$big_number = 9 8 0 6 5 ; ^ if if

Mindkt fe| tte| jgaz. { echo { echo 'T ru e '; 'T ru e '; ) }

($sm all_num ber < > $big_number) ( $ s m a l l number != $ b i g number)

^
if

Ez a felttel hamis.
{ echo 'T ru e '; }

( $ s m a l l number > $ b i g number)

if

( $ s m a l l _num ber < $ b i g _ n u m b e r )

Ez a felttel igaz.
{ echo 'T ru e '; }

Ez a felttel hamis.
if ($sm all_num ber >= $big_number) { echo 'T ru e '; }

if

Ez a felttel igaz.
{ echo 'T ru e ';

( $ s m a l l number < = $ b i g _ n u m b e r )

s mi a he lyze t a kara kte rl n c o k k a l? M kdik pldul egy olyan kd, m in t a ("dog" > "c a t")?

Igen, az i f tesztfelttelben karakterlncokat is sszehasonlthat:


A karakterlncok sszehasonltsa az bc alapjn trtnik, teht a z a ki sebbnek szmt, mint a 2:. A nagyobb, mint s kisebb, mint ffiirtfeletek pldul akkor segthetnek, ha bcsorrendben kell informcikat megje lentened.

168 4. fejezet

Valszer, gyakorlati alkalmazsok

a tesztfelttel egy if utastsban!


A feladatod, hogy eljtszd egy if utasts tesztfelttelt, s eldntsd, hogy az albbi vltozk esetben igaz vagy-e vagy hamis.

$my_name = $a_num ber $a_d ecim al =

' B u ster ; 3; = 4.6; = 'T ro u b le '; = 0;

$fav o rite_so n g $another_nu m b er $your_nam e

= $my_name;

($a number

3)

ig a z v a g y h a m is ig a z v a g y h a m is ig a z v a g y h a m is ig a z v a g y h a m is ig a z v a g y h a m is ig a z v a g y h a m is ig a z v a g y h a m is ig a z v a g y h a m is

($another number ($favorite_song == "Trouble") ($my name 1$your n a m e 1)

($my_name == "$your_name") ($your name == $my name) ($f avorite__song ($a number > 9) ($favorite food = 'hamburger)

ig a z v a g y h a m is

most itt vagy

169

lgy a tesztfelttel... megolds

Lgy a tesztfelttel egy if utastsban!


A feladatod, hogy eljtszd egy if utasts tesztfelttelt, s eldntsd, hogy az albbi vltozk esetben igaz vagy-e vagy hamis.

$my_name = $a_num ber $a_d ecim al

B u ster ; = 3; = 4.6; = T ro u b le ; = 0;

$fav o rite_so n g $another_num ber $your

n a m e = $my n a m e ;

($a number

3)

igaz v a g y ham is

* 0 ts
($another number ($favorite_song = ($my_name = MTrouble)
( igaz V a g y ham is ig az y a g y ham is igaz v a g y ham is igazyv a g y ham is ( j g a z v a g y h am is igaz v a g y h am is igaz vg

kankferlne >*

Az aposztrfok miatt a felttel v & J jban azt vizsglja, hogy a Buster karakterlnc a $your_name karsiterinccal egyezik-e meg, nem azt, hogy a $your_name vltozbif trolt e'rtkkel.

$your_name1)

($my_name == 1$your_name ") 1 ($your_name = $my_name) Trouble')

($favorite song == ($a_number > 9) ($favorite food Q=


Ha ezt sszehasonltsnak szntuk, akkor itt = = kellene, Hogy lljon.

$3- num*>er rtke 3. 3mi nem nsWobb, minf 9.

T)

( j g a z y a g y ham is

Ok ez b e u g r krds volt. Mivel ^

Nincsenek

hlye krdsek

sszehasonlitast ( Az eredmny azrt lesz true, m a pHP mindent, arm "m 0, m * * fals, true-nak tekint.

K i A tesztfelttel nem ugyanaz, mint amivel w h i l e ciklusokat vezreltnk a 3. fejezetben?

V ! De. pontosan ugyanaz. A 3. fejezetben ugyan arra hasznltuk, hogy megmondja neknk, hogy van
170 4. fejezet

nak-e mg htra sorok egy lekrdezsbl, de klnfle sszehasonltsokkal rdekesebb tesztfeltte leket is sszellthatunk a w h i l e ciklusok szmra. Erre a knyv ksbbi rszben mg visszatrnk.

Valszer, gyakorlati alkalmazsok

A levlklds ellenrzse mgtti logika


Elmernek ellenriznie kell a s e n d e m a i l . h t m l rlaptl kapott adatokat, mieltt egyetlen levelet is eikldhetne. A levlkldsnek valjban teljesen az adatellenrzstl kell fggnie. Amire szksg van, az az, hogy a Pl IP egy dntst hozzon a s e n d e m a i l .p h p parancsfjlhoz befut rlapadatok rrvnyessge alapjn. Olyan kdra van szksg, ami ezt mondja: ha az adatok rvnyesek. elkldheted a leveleket. Ehhez azonban elszr meg kell szerezned az rlapadatokat, s vltozkba kell rnod azokat:
M ake M e Elvis .r Sen d Ernig

$subject = $ _ P 0 S T ['s u b j e c t ]; $text = $ P O S T [elvi s m a i l ];

sszesen ezeket az rlapadatokat kell ellenrizned, s megvizsgl nod. hogy van-e adat a kt rlapmezben. A programlogika valahogy gy fest:
F $subject

For Elm ers use ONLY rj send an email to mailing list members if email

tartalmaz szveget AND

$body

tartalmaz szveget

THEN kldd el a leveleket


De az ellenkez irnybl is megkzeltheted a krdst, s vizsglha tod azt, hogy a kt rlapmez nem res-e, mely esetben figyelmez tetst jelenthetsz meg a felhasznlnak:
W $subject
' Subm it

sendem ail.htm l

res AND

$body

res

THEN rj ki hibazenetet
A fenti kt plda logikja egyarnt tartalmaz egy nehzsget: kt sszehasonltst kellene vgezned egyetlen i f utastson bell. Ennek egyik lehetsges megoldsa, ha kt i f utastst hasznlsz...

ezd ki a ceruzd!
rj kt i f utastst, amelyek ellenrzik, hogy nem res-e Elmer Send Email rlapjnak trgy- s zenetm ezje, s rj ki figyelmeztet zenetet, ha azok!

m o st itt vagy >

171

az isset() s az emptyO fggvny

Hegyezd ki a ceruzd! ----------------------------------------------------------------M ft fiM a c 9 kt utastst, amelyek ellenrzik, hogy nem res-e Elmer Send Email rlapjnak trgy- s zenetm ezje, s rj ki figyel meztet zenetet, ha azok!
Ez kt aposztrf, ami res i-f ( /s u b je d t karakterincot jelent.
...............................................................................................

j .l HaAzzal, hogy a msod,k if * J itW a: elsbe 9K o i, a *

echo 'Elfelejtetted berni a levl trgyt s szvegt< br / > ' ; ............................ J ............................................................ * ...................... } .................................................................................................................... / ^ behzs segt, hogy jobban ltszdjon, hogy hol vgzdik a bels' s hol a kls' if utasts.

ondd . Vdban, ho9y . * feHte\nek gaznak keU lennie ahhoz, hogy a* utasts kirja az zene

PHP-fggvnyek vltozk ellenrzsre


Az = - hasznlata annak ellenrzsre, hogy vannak-e res karakterlncok, mkdkpes mdszer, de a PHP bep tett fggvnyei mg jobb megoldst knlnak. Az i s s e t () fggvnnyel azt vizsglhatod, hogy egy vltoz l t e z ik -e , vagyis hogy kapott-e rtket, mg az em ptyO fggvnnyel mg egy lpssel tovbbmehetsz, s megllapthatod hogy a vltoz res rtket tartalmaz-e, amit a PHP az res karakterlncokkal ( ' vagy " " ) , a 0, a f a l s e , illetve a NULL rtkkel azonost. Az i s s e t () teht csak akkor ad vissza tru e -t, ha a vltoz kapott rtket, mg az empty () akkor, ha a vltoz rtke 0, res karakterlnc, f a l s e vagy NULL. Nzzk meg, hogyan mkdnek az emltett fggvnyek:

A $v1 vltoz egy rtkt tartalmaz.

Mind a $\ri, mind a tozo lteznek tekintend, br csak a $vl-nek van rtke.

A $v2 vltoz egy iires karakterlnc. A $v2 vltoz be van lltva, csak egy res
d e a z

Csak a szrke httri echo parancs hajtdik vgre!


A $v1 vltoz nem iires,

if if if if if

( i s s e t ($ v l)) (e m p ty ($ v l)) (ls s e t($ v 2 )) (em p ty ($v 2)) (is s e t($ v 3 ))

{ echo '$ v l i s s e t< b r /> ; }


{ echo ' $ v l i s em ptycbr / > '; }

r t k e

{ echo *$v2 i s s e t c b r /> ; )


{ echo ' $v2 i s em ptycbr / > '; { echo ' $v3 i s s e t< b r / > '; } }

hanem szveget tartal maz, vagyis ez az if fe l ttel hamis. A $v2 vltoz res, mert a benne lev ka rakterlnc is res.

karakterlnc.

A $v3 vltoz nem ltezik.

* f

(e m p ty ($ v 3 ))

( ech o $v3 i s e m p ty < b r / > , ;

$*3 vltoz iirese


ieklnten<ti, mg h3 nem ltezik.

172 4. fejezet

Valszergyakorlati alkalmazsok

Vilgos. Teht az \eeet() s e m p ty () fggvnyekkel ellenrizhetem a $ s u b je c t e $ te x t

rlapadatokat.

Ez csak flig igaz. Itt valjban csak azt ellenrizzk, hogy az rlapmezk nem resek-e, teht az e m p ty ( ) -re van szksg.
A $ s u b je c t s a $ t e x t vltoz a $_POST [ s u b j e c t ' ] s a $_POST[ * e l v i s m a i l ' ] szupergloblisokbl kap rtket. Ha ezeket a vltozkat az i s s e t () -tel vizsglod, mindig tr u e -t kapsz, fggetlenl attl, hogy tnylege sen van-e bennk szveg. Ms szavakkal, az i s s e t () nem tesz klnbsget egy res rlapmez s egy kitlttt kztt. Az empty () fggvny ellenrzi, hogy a vltozk valjban resek-e - s az rlap ellenrzshez erre van szksg.

Nincsenek

Az isset() fggvny azt vizsglja, hogy i vltoz ltezik-e s kapott-e rtket. Az empty() fggvny azt vizsglja, hogy a vltoz trol-e valamilyen tartalmat. Hegyezd ki a ceruzd!

hlye krdsek
K i Akkor mi rtelme van az i s s e t ( ) hasznlatnak?

V ! Az i s s e t ()

fggvny rendkvl hasznos, ha azt kell tudnod, hogy egy adat ltezik-e. Az i s s e t () nek a $_PO ST-ot tadva ellenrizheted pldul, hogy egy rlapot a POST mdszerrel kldtek-e el. Ahogy a fejezet ksbbi rszben majd ltni fogod, ennek igen-igen nagy hasznt veheted.

rd t a kt i f utastst, amely ellenrzi, hogy Elmer Send Email rlapjn nem res-e a trgy- s az zenetmez, mgpedig gy, hogy ezttal az em p ty () fggvnyt hasznlod az == helyett a tesztfelttelekben!

most itt vagy 173

a ! mveleti jel

Hegyezd ki a ceruzd! Meqolds

a kt ^ Utastst, amely ellenrzi, hogy Elmer Send Email rlapjn nem res-e a trgy- s az zenetmez, mgpedig gy, hogy ezttal az em p ty () fggvnyt hasznlod az == helyett a tesztfelttelekben!

i cmpiyfsubjcdi)) {
M in d k t te s z tfe lt te lb e n _ {

empty() fggvny megh! vsa Vltja fel az egyenlsg. . , \ vizsgalatot ( )

ec|J0 '(fe|ej f ef f e(j berni a levl trgyt s szvegtcbr / > ' ; ....................... ................................................................... i A kod tbbi resze .......................................................... } ugyanaz, mint korabban.

Ml a h e lyze t akkor, ha csak abban az esetben szeretnek v g re h a jta tn i egy m ve le te t, ha egy urlapm ezo nem res? Van n o te m p ty Q fggvny is?

Nincs, de brmilyen tesztfelttel logikjt knnyen megfordthatod - a tagads mveletvel.


Mr tudod, hogy egy i f utastst vezrl tesztfelttel mindig t r u e vagy f a l s e rt ket ad. De mi a helyzet akkor, ha a logika azt kveteli meg, hogy a felttelben sze repl lltsnak az ellenkezjt vizsgljuk? Nem rt pldul, ha tudod, hogy Elmer rlapmezi nem resek-e, mieltt elkldenl egy csom levelet az rlapadatokkal. ' A gond csak az, hogy notem pty () fggvny nem ltezik. Nos, a megoldst a taga ds mveleti jele 0 ) knlja, amellyel a tru e -b l f a ls e - t , a f a ls e - b l pedig tru e-t csinlhatsz. A ! empty () utasts teht meghvja az empty () fggvnyt, s megfordt ja annak eredmnyt, valahogy gy:

A NT vagy ! mvelet a true-bl false-t, a false-bl pedig true-t csinl. \


if ( ! em pty($ s u b j e c t )) {

I fl

Ez a felttel ezt krdezi: A Subject mez nem res?". Vagyis: vannak benne adatok?
174 4. fejezet

Valszer, gyakorlati alkalmazsok

6yakorlat

Egsztsd ki Elmer s e n d e m a il .p h p kdjt gy, hogy a parancsfjl csak akkor kldje el a leveleket, ha sem a $ s u b j e c t , sem a $ t e x t vltoz nem res! Hasznlj i f utastso kat, s alkalmazd az em p ty () fggvnyt!
H U W&Sffik Make Me Send Ema [ i

M inden mezmben lennie kell rteknek.

O 0

and n

" n

___ _

* _____

Subject of email:

Body of email:

Subm it

<?php
$ f r o m = 'elmer0makemeelvis.com'; $ s ubject = $ _ P 0 S T ['s u b j e c t ']; $text = $ P O S T ['e l v i s m a i l '];

sendem ail.htm l

if if $dbc = mysqli_connect (data .makemeelvis.com', 'elmer', or d i e { Error connecting to MySQL server.'); $query = "SELECT * FROM email_list"; $result = mysqli_query($dbc, $query) or die('Error querying database.'); 'theking', 'elvis_store' )

while ($row = mysqli_fetch_array($result)) { $to = $row['email']; $first_name = $row['first_name']; $last_name = $ r o w ['last_name']; $msg = "Dear $first_name $last_name,\n$text"; mail($to, $subject, $msg, 'From:' . $from) ; echo 'Email sent to ' . $to . '<br />';

}
mysqli close($dbc);

?>

m ost itt vagy

175

Gyakorlat - megolds

Gyakorlat Megolds

Egsztsd ki Elmer sen d e m a il .php kdjt gy, hogy a parancsfjl csak akkor kldje el a leveleket, ha sem a $ s u b je c t , sem a $ t e x t vltoz nem res! Hasznlj i f utastsokat, s alkalmazd az empty () fggvnyt!
M ake M e Elvis - Send Email

Minden mezmben lennie kell rteknek.


Subject ofema: ___ _______________
Body of email

A felkiltjel megfordt ja a? emptyI) fggvny logikjt.

Az eso felttel azt vizsglja, hogy a subject nem res-e...

Subm it

<?php
$from = elm er@ m akem eelvis.com ;

J
J

|
.ha
n e m

|| . |
az, akkor 0 .
0

sendemail.html

$ s u b j e c t = $_PO ST [ ! s u b j e c t ] / t e x t = $ _ P O S T [ 1e l v i s m a i l ] ;

a2f nzzk meg, nem res-e.


J

3 brmelyik urlapadat-vltoz res, legalabb az egyik if uta-

........ sts false-t ad vissza, s az itt tallhat kdbl semmi sem fog lefutni, ami azt jelenti, hogy nem mennek ki res levelek __ _________________________________________ _____ - pont ahogy akartuk! th e k in g , e lv is _ s to r e $ d b c = m y s q li_ c o n n e c t ( ' d a ta .m a k e m e e lv is . co m ' , e lm e r , o r d i e ( ' E r r o r c o n n e c t i n g t o M yS Q L s e r v e r . ' ) ;
$ q u e r y = "SELECT * FROM e m a i l _ l i s t " ; $ r e s u l t = m y s q li_ q u e ry ($ d b c , $query) or d i e ( E r r o r querying d a t a b a s e . ) ;

Mindkt if utasta's mveletrszt be kell zrni. Az els kapcsos zrjel a bels; a msodik kapcsos zrjel pe dig a kls if utasts vgt jelzi.

w h i l e ( $ ro w = m y s q l i _ f e t c h _ a r r a y ( $ r e s u l t ) ) { $to = $row [ em ail ] ; $first_n am e = $row [ f ir s t_ n a m e ] ; $last_nam e = $ ro w [ la s t_ n a m e ] ; $msg = " D e a r $ f i r s t _ n a m e $ l a s t _ n a m e , \ n $ t e x t " ; m a i l ( $ t o , $ s u b j e c t , $msg, F r o m : . $ f r o m ) ; echo Email s e n t t o . $ t o . <br / > ;

}
m ysq lin close($d b c);

Az egyik if utastst a msik belsejbe kel! tenni ahhoz, hogy a kd mkdjn. Ezt .............................. begyazsnak hvjk.

176 4. fejezet

Valszer, gyakorlati alkalmazsok

Prbld ki, hogy az res rlapmezket ellenrz kd mkdik-e!


Mdostsd a sen d em a il .php kdjt gy, hogy i f utastsokkal ellenrizze az rlapmezk adatait, mieltt leveleket kldene. Tltsd fel a parancsfjl j vltozatt a webkiszolglra, s nyisd meg a sen d em a il .h tm l oldalt egy w ebbngszben. Hagyd legalbb az egyik rlap mezt resen, s kattints a Submit gombra.

Az zenet trzse res, gy az urla| adatok elbuknak az ellenrzsen.


Private: For Elmer's use O N LY Wrtte and send an email to mailing list members Subject of email:
Blue Suede Clearance!

Body of email:

Submit 1

M ake Me Elvis - S en d Email

Ahogy szerettk volna, nem r kezik megersts elkldtt le-__ v lrl. Valamilyen figyelmeztet zenet azonban hasznosabb len ne, mint az res oldal.

most itt vagy 177

irodai eszmecsere

Mi van, ha az rlapon egy csom mezei van? E5e kell gyaznunk egy vagon if u ta s t s t, hogy m in d e t m egvizsgljuk?

A liens Abducted M e - R e p o rt an A bduction


Shiue youriw y of
First name: W talfc jo u r M i adm ? Wbcn Jid rt happen?
r r i - ou W *0* 7 v How raaovlid > U O we?

btucoon:

Mow lonp w

Dttcribe than: WttM didthti doUj.tMi?

H jm*nmd cF R j j o * ?

Owen rlapja a knyv korbbi rszbl j plda arra, hogy ha sok rlapmezhk van, akkor kuszn egymsba gyazott if utastsokat kaphatunk.

if

( ! em pty($first_n am e)) if (! empty ( $ l a s t _ n a m e ) ) if

{ { (

( ! em pty($w hen_it_happened)) if { ! em pty($how _long)) if { {

Ez a csom begyazs alig kvethetv teszi a kapcsos zrjeleket.

( ! e m p t y ( $how_many) )

Joe: Azt hiszem, igazad van. Ha biztosak akarunk lenni abban, hogy egyik
sem res, minden mezhz be kell gyaznunk egy i f utastst.

rtiez

Frank: Az nem elg, ha behzzuk minden i f utasts kdsort?


Jill: Technikailag igen. gy rtem, a kd attl fggetlenl mkdni fog, hogy hny i f - e t gyazunk be, de n amiatt
aggdom, hogy a sok begyazs miatt az egsz ttekinthetetlenn vlik. Mr a kapcsos zrjelprok egyeztetse is gondot jelenthet.

Frank: Ez igaz. Radsul megszenvednnk a mveleti kd behzsval...Lssuk csak, van tz rlapmeznk, tfggy-fS tlz
begyazott i f-nk tz szintnyi behzssal. Ha csak kl szkzzel tolunk el minden if - e t , mr az is 20 sz k r minden mveleti kdsor eltt. Hoppcska!
je | nt e

Joe: De ha tabultorral csinljuk a behzst, akkor csak feleannyi. 10 tab 20 szkz helyett nem olyan rossz.
Jill: Srcok, itt nem az a krds, hogy milyen mdszerrel hzzuk be a begyazott if-e k e t. hanem az, hogy ner:
h e

lyes programozsi megolds ilyen mlyen egymsba gyazni i f utastsokat. Fogalmazzuk t az egszet: valjban egyetlen logikai tesztfelttelrl van sz - arrl, hogy nem res-e egyik rlapmez sem"? A gond csak az, hogy a tesztfelttel tz klnbz adatot kell, hogy vizsgljon, ezrt tz nll i f utastsra kell bontanunk.

Frank: A, rtem mr! Vagyis egy olyan megoldst kellene tallnunk, amivel mind a tz rlapadatot egyetlen
tellel ellenrizhetnnk, igaz?

tessztfelt-

Jill: Aha. Joe: Akkor rjunk egy nagy tesztfelttelt, ami egyszerre ellenrzi az sszes rlapmezt! llat!
1 : Persze, csak ppen nem tudjuk, hogyan egyesthetnk tbb vizsglatot egyetlen tesztfelttelben... 1

178 4. fejezet

Valszerf gyakorlati alkalmazsok

Tbb felttel vizsglata az AND s az OR segtsgvel


Egy i f utasts tesztfelttelt tbb vizsglatbl is felptheted, ha sszekapcsolod azokat egy logikai mvelettel. Nzzk meg kt ismers felttelen - ! empty ($ s u b je c t ) s ! empty ( $ t e x t ) - , hogyan mkdik mindez! Az els pldban a kt kifejezst a logikai S mvelettel (opertorral) kapcsoljuk ssze, amit a kdban az & jell: &

, . Sm'ttVelet.
J r

A bels zrjelezs vilgoss teszi, h9y a ta9adas m V8,ete csak az empty() fggvnyre vonatkozik.

A PHP logikai mveletei lehetv teszik, hogy ele gnsabb if utas tsokat alkoss.

if ({!empty($subject)) && (!empty($text))) (

Ez

tesztfelttel csak akkor igaz, ha sem

a $subject, sem a $text nem res.


Az S mvelet kt igaz/hamis ( t r u e / f a l s e ) rtket vesz, s csak akkor ad vissza -rue-t, ha mindkt rtk true - minden ms esetben false lesz az eredmny. Eb ben az esetben teht ahhoz, hogy a tesztfelttel igaz legyen, s az i f utasts mve leti kdja lefusson, egyik rlapmeznek sem szabad resnek lennie. A logikai VAGY mvelet, ami a I I jell, az S-hez hasonlan mkdik, de akkor is t rue-t ad vissza, ha csak az egyik rtk true. m e egy plda:

A logikai S kdja az &&, mg a logikai VAGY mvelet a

if ({!empty($subject)) |f (!empty($text))) {

Ez a tesztfelttel akkor igaz, ha vagy ^ a $subject, VA6Y a $text nem res.


Ennek az i f utastsnak a mveleti kdja teht akkor hajtdik vgre, ha legalbb az rlapmezk egyike nem res. Mg rdekesebb a helyzet, ha az egyik rlapmez esetben azt vizsgljuk, hogy res-e, mg a msiknl azt, hogy van-e benne adat: if ( empty($subject) && (!empty($text))) {

Ez nem a lf-es szm, hanem kt fggleges cs' karakter, amit a billentyzeten a fo rd to tt perjel ( \ ) mellett tallsz.

A $subject-nek resnek, a $text-nek viszont nem resnek kell lennie ahhoz, hogy ez a tesztfelttel igaz legyen.

Mivel ez a tesztfelttel az S mveletet hasznlja, a benne lev mindkt kifejezs nek igaznak kell lennie ahhoz, hogy a mveleti kd vgrehajtdjon. Ez azt jelenti, hogy a Subject rlapmeznek resnek kell lennie, a Bodv m ezben azonban ada tokat kell talljunk. A vizsglatot meg is fordthatod, ha a tagads mvelett ( ) a msik empty () fggvny el helyezed: if ((!empty($subject)) && empty($text)) {

Ez csak akkor igaz, ha a $subject nem res, de a $text igen.

A logikai S (AND, &&), illetve VAGY (OR. I |) mveletek lehetv teszik, hogy olyan, sokkal hatkonyabb tesztfeltteleket hatrozz meg, amelyek msklnben tovbbi, gyakran sszekuszld i f utastsokat ignyelnnek.

most itt vagy 179

a begyazott if utastsok kikszblse

rd t a s e n d e m a i l . p h p parancsfjl kiemelt rszeit gy, hogy a kd begyazott i f utastsok helyett egyetlen, logikai mveletekkel sszekapcsolt i f tesztfelttelt hasznljon!

Gyakorlat

<?php $from = ' elmerQmakemeelvis . c o m '; $ s u b j e c t = $_POST[ ' s u b j e c t ' ] ; $ t e x t = $ P O S T [ 1e l v i s m a i l 1 ] ; if { em pty($s u b j e c t )) { i f ( ! em p ty($ t e x t )) {

Itt vannak a begyazott if utas tsaink. Cserld le okt egyet len, logikai mveletekkel ssze kapcsolt if utastsra!

$dbc = m y s q l i_ c o n n e c t ( d a t a .m a k e m e e l v i s . com , e l m e r ' , o r d i e ( ' E r r o r c o n n e c t i n g t o MySQL s e r v e r . ' ) ; $ q u e r y = "SELECT * FROM e m a i l _ l i s t " ; $ r e s u l t = m y s q li_ q u e ry ($ d b c , $query) or d i e ( ' E r r o r querying d a t a b a s e . ' ) ;

' th e k in g ',

' e l v i s _ s t o r e ')

w h i l e ( $ ro w = m y s q l i _ f e t c h _ a r r a y ( $ r e s u l t ) ) { $ t o = $ r o w [ ' e m a i l 1] ; $first_ n a m e = $row[ ' f ir s t_ n a m e ' ] ; $last_nam e = $row [ ' la s t_ n a m e ' ] ; $msg = " D e a r $ f i r s t _ n a m e $ l a s t _ n a m e , \ n $ t e x t " ; m a i l ( $ t o , $ s u b j e c t , $msg, ' F r o m : ' . $ f r o m ) ; echo 'E m a il s e n t t o ' . $ t o . ' <br / > ' ;

}
m ysq li_close($d b c);

A kt if utastst ezek a kapcsos zrjelek zrjk le.

?>

180 4. fejezet

Valszerr gyakorlati alkalmazsok

Tesztt
Gondoskodj rla, hogy a Send Email parancsfjl logikai mveletei ugyanazt a feladatot vgezzk el, mint a begyazott if utastsok!
Mdostsd a se n d e m a il .php kdjt gy, hogy egyetlen, a logikai mveletek elnyeit kihasz nl i f utastst alkalmazzon az rlapadatok ellenrzsre a levelek elkldse eltt! A kvet kez oldalon belekukkanthatsz a megoldsba, ha nem tudod biztosan, hogy milyen vltozta tsokra van szksg. Tltsd fel a parancsfjl j vltozatt a webkiszolglra, s nyisd meg a sen d em ail .h tm l oldalt egy webbngszben. Hagyd legalbb az egyik rlapmezt resen, s kattints a Submit gomb ra. Most is megakadlyozza a parancsfjl a levelek elkldst, ha valamelyik rlapmez res?

Nincsenek

hlye krdsek
Szmt, hogy milyen sorrendben helyezek el kt, && vagy I I mvelettel sszekapcsolt felttelt egy i f utastsban?
Igen. Ennek az az oka, hogy amikor csak le hetsges, a PHP rvidre zrt kirtkelst hajt vgre ezen a kt mveleten. Ez azt jelenti, hogy ha a kifejezs eredm nynek meghat rozshoz elg az els tnyez, a PHP figyel m en kvl hagyja a msodik tnyezt. Ha egy S kifejezsben pldul az els tnyez ha mis, akkor biztos, hogy - a msodik tnyez tl fggetlenl - az egsz kifejezs hamis lesz, ezrt a msodik tnyez kirtkelsre mr nem is kerl sor. Ugyanez a szably rvnyes akkor is, ha egy VAGY kifejezs els tnyez je igaz.
K
l.!

Olyan PHP-kdokkal is tallkozni, amelyekben a n d s o r szerepel && s | | helyett. Ezek hogyan mkdnek?

V: Lnyegben ugyangy, mint az &&, illetve


a l l . Ms mveletekhez viszonytva kiss k lnbzik a kirtkelsk mdja, de ha zrjelezssel vilgoss teszed a tesztfeltteleidet, nem fogsz klnbsget tapasztalni.

m ost itt vagy

131

sendemail.php - begyazott if utastsok nlkl!

rd l a se n d e m a il .php parancsfjl kiemelt rszeit gy. hogy a kd begyazott i f utastsok helyett egyetlen, logikai mveletekkel sszekapcsolt i f tesztfelttelt hasznljon!

Gyakorlat - magolds
<?php $from = ' elm er6m ak em eelv is. c o m ';

$ s u b je c t = $ _ P 0 S T [' s u b j e c t - ] ;
$ t e x t = $ POST[ ' e l v i s m a i l 1] ;

Annaie vizsglatra, hogy az rlapmezk nem resek-e, a tagads mvelett (NOT vagy 1) hasznljuk. Az S mvelet segtsgvel a kt felttelt egyetlen if utastsban vizsglhatod. Ne feledd, a logikai E$ mveletet a kdban az && jelli.

if

( !om pty(j s u b j e c t ) ) (

$dbc = m y s q l i _ c o n n e c t ( ' d a t a . m a k e m e e l v i s . c o m ', ' e l m e r ' , o r d i e ( E r r o r c o n n e c t i n g t o MySQL s e r v e r . ' ) ; $ q u e r y = "SELECT * FROM e m a i l _ l i s t " ; $ r e s u l t = m y s q li_ q u e ry ($ d b c , $query) or d i e ( ' E r r o r querying d a t a b a s e . ') ;

'th e k in g ',

' elvis_store

w h i l e ( $ ro w = m y s q l i _ f e t c h _ a r r a y ( $ r e s u l t ) ) { $to = $row [ ' e m a il' ] ; $first_nam e = $row [' firs t_ n a m e ' ] ; $last_nam e = $row [ ' la st_ n a m e ' ] ; $msg = " D e a r $ f i r s t _ n a m e $ l a s t _ n a m e , \ n $ t e x t " ; m a i l ( $ t o , $ s u b j e c t , $msg, ' F r o m : ' . $ f r o m ) ; echo 'Em ail s e n t t o ' . $ t o . ' <br / > ;

}
m ysq li_close($d b c);

Az if utastson belli kdot most mr nem kell behzni egy szint tel, mert az egsz egyetlen if utastsban tallhat.

Az egyetlen if utasts azt jelenti, hogy csak egy zr kapcsos zrjelre van szksg.

?>

182 4. fejezet

Valszer, gyakorlati alkalmazsok

Az rlap felhasznljnak visszajelzsre van szksge


Az rlapadatok ellenrzst tekintve a sendem ai 1 .php kdja nagyszer munkt vgez, s gon doskodik rla, hogy ne menjen ki levl, ha akr a Subject, akr a Body mezt resen hagyjk. Ha az rlap azonban fennakad az ellenrzsen, s nem kerl sor levlkldsre, a parancsfjl nem rulja el Elmernek, hogy mi trtnt, csak egy res oldalt jelent meg. ^ -------- Elmer ezt 32 U

65

sincs , m irt.

J Mi trtnt? M e g p r b lta m
hasznlni az j rla p o t, de csak egy res o ld a lt kaptam .

A problma az, hogy a kd csak a sikeres ellenrzsre reagl - a levelek elkl dsvel. Ha az i f utasts azonban f a l s e eredmnyt ad (vagyis az rlapada:okat rvnytelennek tallja), a kd nem csinl semmit, s gy Elmer sttben '.apogatzik - nem tudja, hogy akkor most kimentek-e a levelek, vagy hogy mi volt a gond. m e a parancsfjl rvidtett kdja, amely felfedi az res oldal problmjt:
<?p h p $from = 'elm e r0 m a k e m e e lv is.co m ; $ s u b j e c t = $_POST[ s u b j e c t ] ; $ t e x t = $ POST[ e l v i s m a i l ] ; if ( ( ! em pty($s u b j e c t )) & ( ! e m p t y ( $ t e x t ) )) { & $dbc = m y s q l i _ c o n n e c t ( d a t a . m a k e m e e l v i s . com ,

e l m e r theking',

1e l v i s _ s t o r e ' )

m ysqli_close ($d b c);

az f uf asfts nem hajtja vgre a mveleti kdot, semmi sem trtnik, ezrt hinyz rlap adatok esetn egy res oldal jn ltre.

Teht tudatnod kell Elmerrel, hogy problma merlt fel - idelis esetben azt is elrulod neki, hogy melyik rlapmez maradt resen, hogy jra prblkozhasson a levl megrsval.

most itt vagy > 183

az e/se zradk

Sem m i gond. Csak egy echo u ta s t s t kell te n n i az If u ta s t s z r kapcsos zrjele u t n .

Ez nem fog mkdni, mert az i f utasts utn ll kd mindig vgrehajtdik.


Ha az if utasts utn teszel egy echo utastst, az csak annyit jelent, hogy az i f utn fog lefutni - de mindenkppen lefut, az if eredmnytl fgget lenl. Nem erre van szksg. Azt kell elrned, hogy az echo utasts csak ak kor jelentsen meg egy hibazenetet, ha az if utasts tesztfelttele hamisnak bizonyul. A logika valahogy gy fejezhet ki:

IF a trgy tartalmaz szveget AND a trzs tartalmaz szveget THEN kldd el a leveleket X ELSE rj ki hibazenetet

Az if utastshoz megadhatsz egy else zradkot, amely abban az esetben futtat le egy kdrszt, ha a tesztfelttel false eredmnyt ad. A hibazenetet kir echo kdjt teht egy else zradkba kell tenned, hogy csak akkor haj tdjon vgre, ha valamelyik rlapmezt resen hagytk. Csak rd az else szt az i f utasts utn, majd szrd be utna a mveleti kdot kapcsos zr jelek kztt: |

Az else zradk kz vetlenl az if utas ts zr kapcsos z rjele utn kezd'dik.

if

( ( ! e m p t y ( $ s u b j e c t ))

&& ( ! e m p t y ( $ t e x t ) ) )

Ez csak a leveleket elkldi) kd helyt jelzi.


e ls e {
'Y ou forgot th e em ail su b ject an d /o r body te x t.c b r />*;

echo

i f mveleti kdjhoz ha-

sonan az else kdjt is kapss zrjelek fogjk kzre.

Az itt ll kd csak akkor fut le, ha az if utasts false eredmnyt ad. I

Az else zradk kdja akkor hajtdik vgre, ha az if tesztfelttele false eredmnyt ad.
184 4. fejezet

Valszer, gyakorlati alkalmazsok

m e Elmer sendemail .php parancsfjljnak j kdja, amely if utastsok s else zrad kok hasznlatval visszajelzst ad? de a kd egyes rszei hinyoznak. A mgnesek segtsg vel ptold a hinyz kdokat!

Gyakorlat
<?p h p $from = 'elm er@ m ak em eelv is.co m '; $ s u b j e c t = $_ PO ST [ s u b j e c t ' ] ; $ t e x t = $ POST[ e l v i s m a i l ' ] ;

else

// Tudjuk, hogy vagy a $subject, VAGY a $text tartalma hinyzik // - dertsk ki, melyik!

echo 'You f o r g o t th e em ail s u b je c t .< b r /> ; } e ls e {

echo

' Y o u f o r g o t t h e e m a i l body t e x t . c b r

/>';

} }
else {

w h ile ($row = m y s q l i _ f e t c h _ a r r a y ( $ r e s u l t ) ) { $to = $row [' em ailf] ; $first_n am e = $ro w [' fir s t_ n a m e '] ; $ l a s t _ n a m e = $ r o w [ f la st__nam e ' ] / $msg = " D e a r $ f i r s t _ n a m e $ l a s t _ n a m e , \ n $ t e x t " ; m a i l ( $ t o , $ s u b j e c t , $msg, ' F r o m : ' . $ f r o m ) ; echo 'Em ail s e n t t o ' . $ t o . ' <br / > ;

empty($subject)

m ysqli_close($d bc) ;

} }

empty {$sub ;ect- ) empty($subject)

most itt vagy 1B5

Gyakorlat - megolds

m e Elmer s e n d e m a i 1 . p h p parancsfjljnak j kdja, amely i f utastsok s e l s e zradkok hasznlatval visszajelzst ad, de a kd egyes rszei hinyoz nak. A mgnesek segtsgvel ptold a hinyz kdokat!

Gyakorlat - megolds
<?p h p $ f rom = 1 e l m e r @ m a k e m e e l v i s . c o m ; $ su b je ct = $_P0ST[ ' s u b j e c t ] ; $ t e x t = $ _PO ST [ e l v i s m a i l ] ; if I ( J e m p ty ($su b je ct) I & &

A kls f utasts azt vizsglja, hogy a trgy- s az zenetmez egyarnt res-e. Ha nem, akkor csak hrom eset lehetsges: mindkettt kitltttk, trgy hinyzik, vagy az zenet szvege nincs meg.
| em p ty($t.ext) i s res 1) 1

H Tudjuk, hogy a $ s u b j e c t S a $ t e x t

}
else (

/ / We know we a r e m i s s i n g $ s u b j e c t OR $ t e x t if 1 ( I empty ( $ s u b j e c t ) f ) {

l e t s f i n d o u t w h i c h one

I/ A $ s u b j e c t r e s
echo 'You f o r g o t t h e e m a il su b je ct.< b r />';

}
else {

echo

You f o r g o t t h e e m a i l body t e x t . < b r

/>';

else

// Minden rendben, mehetnek a l e v e l e k | ,,......... . jI i ip mwmvmmm 1 W1W M W Wf *

w h i l e ( $ ro w = m y s q l i _ f e t c h _ a r r a y ( $ r e s u l t ) ) { $to = $row[' em ail' ] ; $first_nam e = $ro w [' first_n am e' ] ; $last_nam e = $row[ ' la st_ n a m e ' ] / $msg = " D e a r $ f i r s t _ n a m e $ l a s t _ n a m e , \ n $ t e x t " ; m a i l ( $ t o / $ s u b j e c t , $msg, ' F r o m : ' . $ f r o m ) / ech o 'Em ail s e n t t o ' . $ t o . ' <br / > ;

Ezen a ponton mr minden lehe tsget megvizsgltunk, s tud juk, hogy mindkt urlapmezoben van rtk.

}
m ysq li_close($d b c);

?>

186 4. fejezet

Valszer, gyakorlati alkalmazsok

A b e g y a z o tt if s else u ta s t s o k m ia tt nehz kvetni a p a ra n c s f jlt. Nem szere tn m , ha egy ilyen p a ra n c sf jlb a kellene nylnom . Nem rta n a egyszersteni, m ie l tt valaki m egsrl.

V ig y z a t! R o n d a k d a l th a t r o n !

Minden kdot rdemes egyszersteni, ha van r md, k lnsen ha mlyen begyazott kdrszek vannak benne.
Ha tl sok e l s e zradkod s begyazott i f utastsod van, a kd nehezen ttekinthetv vlhat. Ez lehet, hogy nem sz mt, ha soha tbbet nem kell rnzned, de ez felettbb val szntlen. Ha az rlap mdostsra szorul, mondjuk mert ki kell egszteni egy jabb mezvel, az ellenrzse a szks gesnl nehezebb lehet, mert nem tudod majd elolvasni a k dot, s gy nehz lesz kitallni, hogy hol kell vltoztatni rajta.

most h t vagy

187

az if kd megtiszttsa

a tisztbb Lgy az IF kd
A feladatod az, hogy eljtszd az IF kdot, s kipucold a zavaros begyazott IF-eket s ELSE-eket. rd t a kdot gy, hogy megszabadulj a be gyazstl, de gyelj r, hogy a kd tovbbra is helyesen mkdjn! Tipp: Lehet, hogy egyetlen else-re sincs szksg!

if

(em pty( $ s u b j e c t ) & e m p t y ( $ t e x t )) { & e c h o You f o r g o t t h e e m a i l s u b j e c t and b o d y t e x t . c b r / > ' ; } else { i f ( e m p t y ($ s u b j e c t ) | | em pty ( $ t e x t ) ) { a kodot i f (em pty($s u b je c t) { , e c h o You f o r g o t t h e e m a i l s u b j e c t . < b r / > ; ne legy&n echo 'You f o r g o t t h e e m a il body t e x t . c b r />;

kell U(JV ^ * rn0 ' ^


beaqyazas.

}
} else { / / Everything i s fin e, send t h e em ail

188 4. fejezet

Valszer, gyakorlati alkalmazsok

Teszft
Prbld ki a tisztbb i f kdot, hogy meggyzdj rla, hogy az elvrt mdon mkdik!
Mdostsd a sen d em ail .php kdjt gy, hogy az imnt megrt, a begyazst egyszerst i f utastsokat hasznlja! Ha nem tudod, milyen vltoztatsokat kell vgrehajtanod, pillants r a kvetkez oldalon tallhat megoldsra. Tltsd fel a parancsfjl j vltozatt a webkiszolglra, s nyisd meg a sendem ai 1 . htm l ol dalt egy w ebbngszben. Ksrletezz a parancsfjllal: nyjtsd be gy az rlapot, hogy mind kt mezt kitltd, s gy is, hogy mindkettt resen hagyod. Megjelenti a parancsfjl a hiba zeneteket?

Nincsenek

hlye krdsek
Nhny szintnyi begyazs tnyleg ilyen fontos?
Attl fgg. Ha olyan kdot rsz, amit csak te fogsz ltni, s gy gondolod, hogy hat hnap mlva, amikor valamit vltoztatnod kell rajta, akkor is pontosan emlkezni fogsz r, hogy mit csinlnak az egyes sorok, hasznlj csak nyugodtan begyazst. Ha azonban azt szeretnd, hogy a kd a lehe t legtisztbb s leglogikusabb legyen, rde m esebb a megismert logikai mveletekre t maszkodni.

K: Hogyan mkdik az e ls e ?
V: Az i f . . . e l s e utastsokban az e l s e foglalko
zik mindazzal, amivel az i f rsz nem.

K ! Hm. Ok. Ez azt jelenti, hogy egy i f ...e ls e utas


V . Nos, megteheted, de a begyazsok miatt
a kd hamar tl bonyolultt vlhat, s mi p pen azon igyeksznk, hogy elkerljk a b e gyazst.

tsba tovbbi if - e k e t s e ls e -e k e t is begyazha tok?

most itt vagy > 189

a kitiszttott if kd

a tisztbb Lgy az IF kd - megolds


A feladatod az, hogy eljtszd az IF kdot, s kipucold a zavaros begyazott IF-eket s ELSE-eket. rd t a kdot gy, hogy megszabadulj a begyazstl, de gyelj r, hogy a kd tovbbra is helyesen mkdjn!

if (empty($subject) && empty($text)) { echo You forgot the email subject and body text.cbr />'; } else { if (empty($subject) | empty($text)) { | if (empty($subject) { echo 'You forgot the email subject.<br />'; ) else { echo 'You forgot the email body text.cbr />'; } } else ( // Everything is fine, send the email

Itt azt vizsgljuk, hogy } a $subject s a $text * vltoz is res-e. ^ ----- > i-f (emfty/subje- && e m fty f-te ^ l)) { tk o You -fortyj-fc -fcke email subject and body ,i<,'*!t-.<b'' Itt azt vizsgljuk, hogy a $text res-e, illetve hogy a ^subject vltozban van-e valami. ] ..................................... ................. ' &&

I I I I 1 Ez a kd azt vizsglja, hogy a $subject res- ^ ^^ vltozban van-e valam; 1 31 I 1 1 1 I I

ecbo yu o ^ o t the email s u b je c t ^ /> ; Ha nem hasznlnnk az S-t (& & ), hogy j _______ __________ elklntsk a nem res trgy- s az res ...................... "................................................... " .................zenetmezl, mg egy visszajelz' zenetet e m ^ y (/ie .x t))..{................kapnnk. Ugyanez rvnyes a nem res ecbo 'yu fo'r^otthe email body , i ^ t <b'r / > j
}

^subject s az res $text esetre is.

Itt pedig azt vizs gljuk, hogy sem a $subject, sem a $text vltoz nem ures-e.

k .'.f ( ^ p ty ( /u b je c t) ) .& & . . . / / . Ev.cryth'm^ .is.

.... A

mvelet ( !) azt vizsglja, hogy

t t t d .b& .email.................. ^ suH ec s a $text nem res-e.

. } . .................................................................................................................................................................................................................................................................

190 4. fejezet

Valszer, gyakorlati alkalmazsok

M e g in t ss z e z a v a ro d ta m . E lfe le jte tte m m egadni a levl t r g y t az rlapon, es ez az oldal je le n t meg, de amikor a V issza gom bra k a t t in t o t t a m / az z e n e te t is jra be k e lle tt rnom.

Ez az oldal elrulja Elmernek, hogy mi hinyzik, de ezen kvl nem sok mindenre j.

Az ellenrzs Elmer Send Email parancsfjljban mkdik, de adhatna tbb segtsget.


Amikor a sen d em ail .php parancsfjl hinyz rlapadatokat sz lel, egy zenetet jelent meg, miszerint hinyzik egy informci, de ennl tbbet nem tesz. Nem vezet vissza pldul hivatkozs az eredeti rlapra, s ami mg rosszabb, amikor Elmer visszatr oda, a korbban bert informcit sem tallja, ezrt a levl trgyt s szvegt is jra be kell rnia.

Agytorna

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

Te mit tennl, hogy segtkszebb tedd a levlkld parancsfjl hibakezelst?

most itt vagy 191

a HTML-rlapkd jbli ellltsa

K lassz Ienne, ha a h ib a ze n e tte l e g y tt jra megjelenne az lrlap. Nem lehetne sim n az echo-val jra m egjelenteni az rla p o t, ha a levl t r g y - s zenetm ezJje res?

Az rlap megjelentse egyrtelmen segtene, mivel gy Elmernek nem kellene visszalpnie a bngszben.
Azon kvl teht, hogy kirsz egy hibazenetet, ha valamelyik rlapmez res, a HTML rlap kdjt is jra el kell lltatnod a PHP-kddal, s kirni a bng szbe. Az albbiak azt mutatjk, hogy a PHP kpes m eglehetsen bonyolult HTML-kdot is ellltani:

Ez a PHP-kd a < fo r m > cmkvel kezdve a teljes HTML-rlapot ltrehozza.


echo ' <form m eth o d = "p ost" a c tio n = " s e n d e m a il. p h p "> 1; echo *
echo

< la b e l f o r = " s u b je c t " > S u b je c t o f e m a il: < / l a b e l x b r /> ;


cinput i d = " s u b j e c t " nam e="sub;)ect" />; /> * t y p e = " t e x t ff
I

size= "30" echo echo '

/x b r

<label

for="elvism ail">B ody of em a il: < / l a b e l x b r id = "elvism ail" /> ' ; nam e="elvism ail"

ctextarea

rows="8"

Ez a behzs nem fe l ttlenl szksges, de gy jobban ltni az eredeti HTML-kd szerkezett.

'co ls= "4 0 "x /te x ta re a x b r

echo

< in p u t ty p e = "su b m it" nam e="subm it" v a lu e = "S u b m it" / > '; ,
k ,l . H T M L -W k

ech o ' </form>

* ' *
m W 1* ' 9 , ! ! e _______

. s r t r M c k ri

pW -u

Ha gy gondolod, hogy a fenti kd kiss kaotikus, akkor igazad van. Csak azrt, mert megtehetsz valamit a PHP-ben, mg nem muszj tnyleg megtenned. Ebben az esetben az a problma, hogy a jkora HTML-kd kirsa ech o utas tsokkal bonyolult. A kd tl nagy ahhoz, hogy az egszet a PHP-ben lltsd e l ...

192 4 fejezet

Valszer, gyakorlati alkalmazsok

Akkor kapd el a PHP-t, ha szksges


Knny megfeledkezni rla, hogy a PHP-parancsfjl valjban csak egy HTMLweboldal, amelyen PHP-kd is tallhat. A fjlban minden, ami nem a < ? p h p s a ?> cmkk kztt ll, HTML-nek tekintend. Ez azt jelenti, hogy szksg sze rint bezrhatsz egy PHP-kdblokkot, s visszatrhetsz a HTML-hez, aztn nyit hatsz egy j PHP-kdblokkot. Ez rendkvl hasznos, ha olyan, nagyobb mret HTML-kdot szeretnl kirni, amelyet tl nehzkes lenne e c h o PHP-Hastsokon keresztl ellltani...ppen gy, mint a Send Email rlap kdj nak esetben.
<?php $from = elm er@ m akem eelvis.com ; $ s u b j e c t = $ _ P 0 S T [ ' s b j e c t 1] / $ t e x t = $ POST[ 1e l v i s m a i l 1] ; if (e mp ty ( $ s u b j e c t )
&& e m p t y ( $ t e x t ) ) { />';

Ez a ?> cmke bezrja a

Ha nagyobb HTMLkdrszleteket sze retnl kirni egy PHP-parancsfjlban, igny szerint zrhatsz be s nyithatsz jabb PHP-kdblokkokat.
Az rlap kdja szokvnyos HTML, mivel kvl esik a PHP-cmkken.

blokkot,2* V '9S?1 visz a ^M L-hez.

/ / T u d j u k , h o g y a $ s u b j e c t S a $ t e x t i s r e s e c h o ' Y o u f o r g o t t h e e m a i l s u b j e c t and b o d y t e x t . < b r

?>
<fonn m ethod="post" a c tio n = "s e n d e m a il.p h p " > < la b e l f o r= " s u b je c t"> S u b je c t o f em ail : < / l a b e l x b r /> < i n p u t i d = " s u b j e c t " nam e= s u b j e c t " t v p e = " t e x t " s i z e = " 3 0 " / x b r / > c l a b e l f o r= " e lv is m a il" > B o d y of e m a i l : < / l a b e l x b r /> <textarea id="elvismail" name="elvismail" rows="8 tv c o l s = " 4 0 " x / t e x t a r e a x b r < input type="submit name-"submit" value= "Submit" /> </form>

/>

<?php^ j

* cml< j PHP-blokkot ke?d. Mivel mg mindig i f mveletn bell vagy, be kell zrnod s* if utastst, mieltt folytathatnd. i f (em pty($ s u b j e c t ) & ( ! e m p t y ( $ t e x t ) )) { & e c h o You f o r g o t t h e e m a i l s u b j e c t . < b r / > ;

Mg mindig az if mveletn bell vagy, ezrt a HTMl-kd csak akkor rdik ki, ha mindkt urlapmezo res.

}
if ( ( ! e m p t y ( $s u b j e c t )) & e m p t y ( $ t e x t ) ) { & e c h o You f o r g o t t h e e m a i l bod y t e x t . c b r

/>;

}
if ( ( lempty($s u b j e c t ) ) & ( ! empty($text) ) ) & // A levelek et elkld kd (

} ?>

Ha tallsz valamit a fenti kdban, ami szkti a mozgsternket, rd ide. Hogyan javtand ki?

most itt vagy 193

a tbbszr szerepl kdok elkerlse jelzk segtsgvel

Hasznlj jelzt a tbbszr szerepl kdok elkerlsre!


Az elz kddal az a gond, hogy hrom klnbz helyen kell kilpned a PHP-bl, s megismtelni az r lap kdjt (minden rvnyessgi hiba esetn egyszer-egyszer). Azt viszont, hogy ki kell-e rni az rlapk dol, egy logikai vltozval, egy gynevezett jelzvel is nyomon kvetheted. Hvjuk ezt a vltozi $ou tp u t_form -n ak. s vizsgljuk meg az rtkt a kd ksbbi rszben: ha az rtke tr u e , az rlapot meg kell jelenteni. A parancsfjlnak teht azzal kell kezddnie, hogy az $o u tp u t_ fo rm vltozt f a ls e - r a lltod, s csak ak kor mdostod az rtki tru e-ra , ha valamelyik rlapmez res, s emiatt meg kell jelentened az rlapot:

lltsd az $ o u t p u t _ f o rm kezdrtkt f a ls e - r a

Az $output_form false kezdrtkre lltsa azt jelenti, hogy az rlap csak akkor jelenik meg, ha olyan rvnyessgi problma lp fel, aminek a hatsra megvltozik a vltoz rtke.

IF a trgymez res AND az zenetmez res


Ezek a hibaze netek kiss k lnbznek, hogy jelezzk, hogy melyik urlapmez res.

THEN rj ki hibazenetet, s lltsd az $ o u t p u t _ f o r m - o t t r u e - r a


Ha valamelyik rlapmez* resen maradt, az $output_form vltoz true rtket kap, de az rlap nem jelenik meg... egyelre!

IF a trgymez res AND az zenetmez NT res THEN rj ki hibazenetet, s lltsd az $output_form-ot true-ra

IF a trgymez NT res AND az zenetmez res THEN rj ki hibazenetet, s lltsd az $ o u t p u t _ f o r m - o t t r u e - r a

IF a trgymez NOT res AND az zenetmez NOT res THEN kldd el a leveleket
Ha mindkt rlapmezlien van adat, mehetnek a levelek. J ,

I I
Az utols lps az $output fro m vltoz ellenrzse, hogy m g e , jelentem az ~ i , kell-e rlapot.

az $output form erteke true THEN jelentsd


IF

A H TM U lM b, ir_ I
Jenkppen csak egy pldny szksges. I

meg az ur apt

194 4 fejezet

Valszer, gyakorlati alkalmazsok

A HTML-rlap kdjt csak egyszer add meg


A z j ellenrz logika PHP-kdd alaktshoz az szksges, hogy ltrehozd s Lij

kezdrtkkel lsd el az $ o u tp u t_ fo rm vltozt, majd gondoskodj rla, hogy z ellenrz kdban mindenhol megfelel rtket kapjon. A legfontosabb a kd vgn ll j i f utasts, ami csak akkor jelenti meg az rlapot, ha z $o u tp u t_fo rm rtke tr u e .
<?php $from - e lm e r0 m a k e m e e lv is.co m '; $ s u b j e c t = $ _ P 0 S T [ 1s u b j e c t ] ; $ t X t = $ _ P O S T [ 1e l v i s m a i 1 1 ] ; $o u tp u t form = f a l s e ; ------if (em pty($ s u b j e c t )

lft hozd ltre az i vltozt s adod neki


3 f^ ls e k e z d r t k e t.
(

Ha a HTML-kdot egy IF utaststl teszed fggv, a parancsfjlban el kerlheted a kdis mtlst.

& empty( $ t e x t ) ) &

}
if

/ / T u d j u k , h o g y a $ s u b j e c t S a $ t e x t i s r e s e c h o ' Y o u f o r g o t t h e e m a i l s u b j e c t and b o d y t e x t . c b r / > ; $output_form = t r u e ; Ha a ^ s u b je c t s $ te t e , * . r i n t

ie, rs

. a vltozt true.-n
(e mp ty ( $ s u b j e c t ) && ( ! e m p t y ( $ t e x t ) ) ) { _ rla p o t az e c h o 'You f o r g o t t h e e m a i l s u b j e c t . < b r / > ' ; $output_form = t r u e ; ____________________

k9 me9!'8

}
if ( ( ! e m p t y ( $s u b j e c t )) & e m p t y ( $ t e x t ) ) { & e c h o ' Y o u f o r g o t t h e e m a i l body t e x t . < b r

Es a vltozt akkor is true-ra lltod, ha a $text res.


/>';

} $ o u tp u t- forTO = t r u e ;
if ( ( ! e mp t y ( $s u b j e c t ))

------------------ - s a vltozt akkor is true-ra lltod, ha a $text res.


& ( ! empty( $t e x t ) )) & kd {

//
}
if

levelek et

elk id

Ez az if utasts vizsglja meg az $output_form Vltozt, s ha az er($output_form ) {

Itt kilpsz a PHP-kdbl, de minden, ^ # ^ m _ ebben az esetHTML-kdja


^ m I<(|etnek (jO T .

tovbbra is

?>
;:< f o r m m e t h o d = " p o s t "

l k, t r ,. akkor m ^ M I
actio n = "sen d em ail.p h p ">

clabel for="subject">Subject of email :</labelxbr /> cinput id=subject" name=subjectn type="text" size="30 / x b r />
clabel f o r = e lv ism a il''> B o d y o f e m a i l : < / l a b e l x b r />

<textarea id=" elvi smai 1 name="elvi smai 1" rcws="8" cols="4"x/textareaxbr /> <input type=submic" name=fsubmit" value="Submit" /> l : </form> ,
<?php

?>

Ne felejts el visszalpni a PHP-kdba, s lezrni az if utastst.

A HTML-kod csak egyszer szerepel, mivel az rlap megjelen,lsnek logikjt egyetlen vltozba ISotputJorm ) gymszlted.

most itt vagy 195

az r/apadatok tovbbra is eltnnek

A z j rlap m r jo bb, de to v b b ra is jra be kell gpelnem az eredetileg helyesen k it lt t t mezk ta r ta lm t, am i nagyon b o ssza n t .

A HTML nmagban nem kpes megrizni az rlapadatokat.


Amikor Elmer gy nyjtja be a Send Email rlapot, hogy valamelyik m ez res, a sendem a.il .php parancsfjl elfogja a hibt, s j rlapot llt el. Az j rlap azonban tiszta HTML-kdbl ll, ami semmit sem tud az Elmer ltal korbban bert adatokrl. Az ellenrzs rszeknt te ht egy olyan j, tiszta rlapot lltunk el, ami minden adatot trl, amit Elmer esetleg bert.

Ez a hibazenet tudatja

Elmer ltal bert rapadatok.

Elroerrel, hogy az egyik rlapmezt resen hagyta.

Benyjtva!

Elmer vletlenl resen hagyta ezt a mezt.

sendem ail.htm l

Most minden mez res, mert ez egy


vadij uftap*

sendem ail.php

Amikor Elmer a Submit gombra kattint, az rlap a sendemail.php parancs fjlhoz kerl.

Hm. Azt a tnyt nem tudjuk megkerlni, hogy az j rlapot a PHPparancsfjlban kell ellltani, valahogy azonban em lkeznnk kell azokra az adatokra, amelyeket Elmer mr bert, s vissza kell tltennk ket az j rlapra, hogy Elmernek kizrlag azt az rlapmezt kelljen kitltenie, amelyet vletlenl resen hagyott...

196 4. fejezet

Valszerr gyakorlati alkalmazsok

ki a ceruzd! -------------------------------------------------------------------Rajzold le, hogyan kell kinznie Elmer rlapjnak benyjts utn, ha csak az els rlapmezt tlttte ki, majd rd le, hogy szerinted hogyan kellene trni a kt (HTML- s PHP-) fjlt, hogy kpesek legyenek emlkezni!

sendem ail.php

most itt vagy 197

tedd ragadss" az rlapot!

Hegyezd ki a ceruzd! Megolds

Rajzold le, hogyan kell kinznie Elmer rlapjnak benyjts utn. ha csak az els rlapmezt tlttte ki, majd rd le, hogy szerinted hogyan kellene trni a kt (HTML- s PHP-) fjlt, hogy kpesek legyenek emlkezni!

A hibazenet ...de a parancsfjl mr em lkszik az adatokra, amelye ket Elmer bert, s visszatl ti azokat az rlapra.

sen d e m ail.p h p

sen d e m ail.h tm l

A PHP-farancsfjl ve^zi t az.rlap, megjelentsnek

Ha az rlapot teljes egszbe* a. PHP-parancsfjl jele nti meg, a HTM.l-.o(daJr.a mr nem. is. lesz. szksg, mivel, az rlap megjelentst, s feldolgozst, egy-.... arnt a PHP-parancsfjl vgzi. A PHP-parancsfjl mindenhez hozzfrhet, s minden adatot felhasznl hat, amit az rlapra bertak, mg egy tiszta HTML-kd erre. nem kpes..................... ...................................... .

. feladatt mind .az rlap, benyjtsa, eltt,, mind.........


az ufn. Miyel pedig.a parancsfjl.minden rlapadafhoz hozzfr, amit bertak, vissza js tpllhatja azokat az rlapra, amikor ellltja. Ez megoldja Elmer prob lmjt, s tbb nem kell majd jra kitltenie azokat a mezkef, amelyekre mr bert valamit.......................

198 4. fejezet

Valszer, gyakorlati alkalmazsok

Egy rlap, amely nmagra hivatkozik


Hogyan lehet eltvoltani a s e n d e m a i l . h tm l-t a levlkld rlap egyenletbl? Ss. a vlasz az, hogy valjban nem trlnk semmilyen HTML-kdot, csak tt^ziik a PHP-parancsfjlba. Ezt az a tny teszi lehetv, hogy a PHPcsfjlok ugyangy tartalmazhatnak HTML-kdot, mint a norml ldalak. A parancsfjlodat teht gy ptheted fel, hogy ne csak feldolgozza rlapot annak benyjtsakor, hanem az rlap kezdeti megjelentsrl is gon:odjont ami eddig a s e n d e m a i l .h t m l feladata volt. k a kulcsa, hogy a s e n d e m a i l .p h p parancsfjl kpes betlteni sen d em a i 1 . html szerept is, az rlapmveletben rejlik. Mivel most mr maga parancsfjl tartalmazza a HTML-rlapot, az rlapmvelet visszavezet a parancsoz - vagyis egy nhivatkoz rlap jn ltre.

Az olyan HTMLurlapot, amely az t feldolgoz PHPparancsfjl rsze, nhivatkoz rlapnak hvjk.

A je n d e m a il.h tm l-re tbb nincs triksg; a felhasznlk kozvetle l a P H P -p a ra n cs f jit tltik be az rlap hasznlathoz. Az rapadatok ugyanahhoz a pa rancsfjlhoz kerlnek, amely fel dolgozza azokat, s jra megje lenti az rlapot, de ezttal mr emlkezve a mr bert adatokra.
sen d e m ail.p h p

A parancsfjl megjelenti az rlapot, majd a benyjtsa utn feldolgozza azt. Az rlap feldolgozsa vagy a levelek el kldst eredmnyezi, vagy az rlap j bli megjelentst egy hibazenettel egytt.

Ahhoz, hogy megrtsd a fentiek mkdst, gondold vgig, hogy mi trtnik, nikor Elmer elszr tlti be az oldalt ( vagyis a parancsfjlt): egy res rlap jn lire HTML-kdknt, amelyet a parancsfjl megjelent, Elmer kitlti az egyik rezt, s a Submit gombra kattint. A parancsfjl feldolgozza az rlapot, s hi bazenetet jelent meg, ha valamelyik adat hinyzik. Ennl is fontosabb azonban, b :gy a parancsfjl jra megjelenti az rlapot, de ezttal azokkal az adatokkal egytt, amelyeket Elmer mr bert. Azokat az rlapokat, amelyek elg intelligen sek ahhoz, hogy emlkezzenek a benyjtsuk eltt bert adatokra, ragads rlapok nak nevezik, mert az adatok ragadnak hozzjuk.

Agytorna
A ragads rlapok emlkez nek a felhasznl ltal he lyesen megadott adatokra.
Szerinted hogyan lehetne Elmer alkalmazst mdos tani. hogy az rlapmezk ragadsak legyenek?

m ost it t vagy

>

199

az rlapmvelet nhivatkozv ttele

Irnytsd az rlapmveletet a parancsfjlra!


Ahogy mr tbbszr is lthattad, a < fo rm > elem a c t i o n jellemzje kapcsolja az rlapot az t feldolgoz PHP-parancsfjlhoz. Az, hogy Elmer rlapjnak m velete a s e n d e m a i l .php-re mutat, lehetv teszi, hogy az rlap feldolgozza sa jt magt, ami az els lps a ragads rlap fel. Valjban az rlap a c t i o n tu lajdonsga mr a parancsfjlra mutat:

A < fo rm > elem action jellemzje kapcsolja az rlapot az 6t feldolgoz parancsfjlhoz, ami ebben az esetben maga az rlapot trol sendemail.php fjl.
< fo rm a c t i o n = " s e n d e m a i l .p h p " m e th o d = " p o s t">

Ez egy szabvnyos < fo rm > elem, amely a POST segtsgvel kldi el az urlapadatokat a parancsfjlnak.

Ez a kd mkdik, feltve, hogy' nem nevezed t a parancsfjlt, s soha nem mdostod a kdot. Van viszont egy jobb mdszer is, ami mindentl fggetle nl mkdkpes, mivel nem egy konkrt parancsfjlnvre tmaszkodik: a PHP beptett $ _ s e r v e r [ ' p h p _ s e l f ' ] szupergloblis vltozjnak haszn lata, amely az adott parancsfjl nevt trolja. Ha az rlapmveletben a parancs fjl URL-jt $_SERVER [ ' PH P_SELF' ] -re vltoztatod, soha nem kell aggdnod a mdostsok miatt, ha valamikor t kellene nevezned a parancsfjlt. Az egyetlen htult csak az, h ogy a $ _ S E R V E R [ ' PH P_SE L F 1 PHP-kd, ami azt jelenti, hogy az e c h o paranccsal ki kell ratnod az rtkt, hogy a HTMLkimenet rsze legyen: rtPV/pnek bedrtozsa helyett

n s S w S . "
< fo rm a c t i o n = "< ?p h p e c h o $_SERV ER[ ' PH P_SELF' ] ;

nhivatkozst hozhatsz ltre.

? > " m e th o d = f,p o s t M >

Ok, a $ _ S E R V E R [ ' PH P_SELF ' ] hasznlata a parancsfjl neve helyett nem va lami eget renget jts, de egyike annak a sok kis dolognak, amivel a parancs fjljaidat knnyebben karbantarthatv teheted.

A $_$ERVER['PHP_$ELF] min az adott parancsfjl nevt trolja.


2 0 0 4. fejezet

Valszer, gyakorlati alkalmazsok

Tesztt
Prbld ki az j, nhivatkoz parancsfjlt a tovbbfejlesztett rlapellenrzsi logikval!
Mdostsd gy a s e n d e m a i l .p h p fjlban tallhat kdot, hogy az $ o u t p u t _ f o r m vltoz segtsgvel, igny szerint jelentse meg az rlapot, ahogy nhny oldallal korbban lttad. Ezen kvl vltoztasd meg a < fo rm > elem a c t i o n jellemzjt is, hogy az rlap nhivatkoz legyen. A webkiszolgln tbb nincs szksg a s e n d e m a i l . h tm l oldalra, gyhogy nyugodtan trlheted. Ez utn tltsd fel a s e n d e m a i l .p h p parancsfjl j vltozatt a webkiszolglra, s nyisd meg a parancs fjlt egy webbngszben. Tetszik?

A paracsfjl valamirt most is megjelent egy hifeazeEm#


<rV/

" t Z Z ?
p7 f/iii n/>ivi g y nem fe sz JO. \

MdteM*avfcM
Privt: Fr Elmefs use ONLY yvrite and send an email to mailing st memers

(Jou forgi tneem subjecl and boytett) ail


S 3U1W4 of cmait'------- T Body of email: ___ ___ _

Radsul az rlap tovbbra sem ragads. Ezek szerint mg lesz vele munka!

Submit

" e a!dunk e,*>e - a ragaS39 is hamarosan sorra kerl.

rd le, hogy szerinted mirt jelent meg hibazenetet a parancsfjl az rlap els megjelentsekor:

m ost i t t vagy

201

az $ POS TCsu b m it'] ellenrzse

Ellenrizd, hogy az rlap be lett-e nyjtva!


A gond az, hogy a parancsfjl nem tud klnbsget tenni az rlap els megjelentse, il letve az rlap hinyos adatokkal trtn benyjtsa kztt, gy aztn akkor is hinyz adatokat jelez, amikor az rlapot elszr rajzolja a kpernyre, ami igencsak sszezavarja a felhasznlt. A krds az. hogy miknt lehetne megtudni, hogy rlapbenyjtsrl van-e sz? Ha ugyanis ezt tudod, gondoskodhatsz rla, hogy csak benyjtskor ellenrizd az adatokat. Emlkszel mg, hogy amikor egy rlap adatait a POST-on keresztl elkldik, az adatok a $_POST tmbbe kerlnek? Ha az rlapot mg nem nyjtottk be, a $_POST tmb mg nem tltdtt fel adatokkal, mskpp fogalmazva a tmb mg nincs belltva. Ki tudod ta llni, hogy melyik fggvnyt hvhatjuk meg annak vizsglatra, hogy a $_P0ST tmb be lett-e lltva?

Az is$et() fggvny azt vizsglja, hogy egy vltozt belltottak-e.

_ Ennel< meg kell egyeznie a Submit gomb < input> elemnek nv jellemzjvel.
{

i f

(is s e t($ _ P O S T [

s u b m i t 1] ) )

Az itt ll kd csak akkor hajtdik vgre, ha az rlapot benyjtottk.

Mivel minden rlapnak van Submit gombja, egy rlap benyjtsnak megtrtntt gy ellenrizheted a legknnyebben, ha megnzed, hogy tartozik-e $_P0S'I -adat a Submit gombhoz. Maga az adat csak a gomb cmkje, ami nem fontos - ami l nyeges, az a $_P0ST[ subm it ] puszta lte, ami elrulja, hogy az rlapot benyj tottk-e. (A subm it '-nak persze a Submit gombnak az rlap kdjban tallhat id jellemzjvel kell megegyeznie.)

A $_P0$T szupergloblis le hetv teszi, hog.f megvizsgld, hogy egy rlapot be nyjtottak-e.

Nincsenek

hlye krdsek

K
V

! Hogyan akadlyozza meg a hibazenetek tves megjele ntst az, hogy tudjuk, hogy az rlapot benyjtottk-e?
! A hibazenet azrt jelenik meg, mert a pa rancsfjl nem tud klnbsget tenni az rlap els megjelentse, illetve az rlap hinyos adatokkal trtn benyjtsa kztt, ezrt vala honnan tudnunk kell, hogy ez az rlap els megjelentse-e, hiszen ez esetben nincs sem mi baj az res rlapmezkkel - ha resek, az nem hiba. Csak akkor kell ellenrizni az r lapmezket. ha az rlapot benyjtottk, ezrt a benyjts szlelse nagyon fontos.

K
V

! De mirt nem az rlapadatok megadst ellenrizzk a Submit gomb helyett?


! A $ _ P O S T [ ' s u b j e c t ' ] vagy a $_PO ST [ ' e l v i s m a i l 1 ] ellenrzse is t kletesen megfelelne, de csak ennek a konkrt rlapnak az esetben. Mivel minden rlapnak van elkld gombja, s ezek egysgesen a s u b m it nevet kaphatjk, a $_PO ST[ * s u b m it ' ] ellenrzse minden parancsfjlban megbzhat mdszer az rlap benyjtsnak vizsglatra.

202 4. fejezet

Valszer, gyakorlati alkalmazsok

Nagyt alatt:
<?php i f (is s e t ( $ _ P O S T [ s u b m it ] ) ) { " $from = e lm e r@ m a k em e e lv is.co m ; $ s u b j e c t = $_POST[ ' s u b j e c t ] ; $ t e x t = $ _ P O S T [ 1e l v i s m a i l ] ; $ou tp u t_form = f a l s e ; if (em p ty ( $ s u b je c t ) & em p ty ( $ t e x t ) ) & {

a levlkld parancsfjl

------------------------------------- 1

// T u d ju k , h o g y a S s u b j e c t S a $ t e x t i s r e s e c h o You f o r g o t t h e e m a i l s u b j e c t and bod y t e x t . c b r $ou tp u t_form = tr u e ;

/> ;

}
if (em p ty ($ s u b j e c t ) & ( ! e m p t y ( $ t e x t ) )) ( & e c h o 'Y o u f o r g o t t h e e m a i l s u b j e c t . < b r / > ; $ou tp u t_form = t r u e ;

}
if ( ( ! em p ty ( $ s u b j e c t )) & e m p t y ( $ t e x t ) ) { & e c h o You f o r g o t t h e e m a i l bod y t e x t . < b r $ou tp u t_form = t r u e ;

/> ;

}
if ( ( ! em p ty ($ s u b j e c t )) // A l e v e l e k e t & ( ! e m p t y ( $ t e x t ) )) & kd {

e lk ld

e lse { $ou tp u t_form = t r u e ;

Ez a zrjel zrja le az els' if utastst, ami azt vizsglja, hogy az rlapot benyjtottk-e. Ha az rlapot me'g nem nyjtottk be, mindenkp pen meg kell jelentened!

if

($ou tp u t_form )

?>

< fo r m m e t h o d = " p o s t " a c t i o n = " < ? p h p e c h o $_SERV ER[ PHP_SELF ] ; ? > " > < l a b e l f o r = s u b j e c t " > S u b j e c t o f e m a i l : < / l a b e l x b r /> < i n p u t i d = s u b j e c t " n a m e = " s u b j e c t t y p e = " t e x t s i z e = 3 0 / x b r /> < l a b e l f o r = ?,e l v i s m a i l " > B o d y o f e m a i l : < / l a b e l x b r /> c t e x t a r e a id = e l v i s m a i l n a m e = " e lv is m a il" row s=8 c o l s = 4 0 x / t e x t a r e a x b r < i n p u t t y p e = " s u b m i t " name= s u b m i t " v a l u e = " S u b m i t " /> </form> <?php

/>

} ?>

m ost it t vagy

203

az rlapmezk ragadss " ttele

K lassz. Szval m o s t m r megllapt hatom, hogy az rla p o t b e n y jto tt k -e , ( e helyesen je le n th e te m meg a hibazeneteket. De az rlapm ezok ezzel mg nem le tte k ra ga d sa k, nem Igaz?

gy van. Az rlap benyjtsnak szlelse fontos, de az rlapadatokat mg vissza kell tltened az rlapra.
Az rlap benyjtsnak szlelse fontos szerepet jtszik az rlap ragadss tte lben, de nem ez az egyetlen, amirl gondoskodnod kell. A korbban mr bert rlapadatokat vissza is kell tltened az rlapra, amikor megjelented azt. A bevi teli rlapmezk rtkt az <in p u t> HTML-elem v a lu e jellemzjvel llthatod be: az albbi kd pldul gy adja meg egy beviteli mez rtkt:

Ez az rfk (szi kirusts!") bedrto zott, vagyis a mezoten az rlap minden megjelentsekor ugyanaz jelenik meg.
< in p u t n a m e = " s u b je c t ,T t y p e = " t e x t " v a l u e = " F a l l C l e a r a n c e ! w >

Mi azonban nem egy konkrt rtket akarunk bedrtozni, hanem az adatot egy PHP-vltozbl szeretnnk kiolvasni. Hogyan lehetsges ez? Emlkezz vissza, hogy korbban az echo paranccsal lltottunk el dinamikusan HTML-kdot egy PHP-blokkban. Ebben az esetben az echo segtsgvel gy lltjuk el a v a lu e jellemz rtkt egy PHP-vltozbl:

Mivel a vltoz kirshoz PHP-re vltunk, a <?php cmkt kell hasznlnod. C

A vltozt a mr ismers echo utastssal rhatod kL


?>

c i n p u t n a m e = " s u b je c t " t y p e = " t e x t " v a lu e = " < ? p h p e c h o $ s u b j e c t ;

A HTML-hez gy trsz vissza, hogy lezrod a PHP-kdot a ? > cmkvel, Egy tbbsoros szvegme zben a ragads adatokat a value jellemz' helyett a < te xta re a > s a < /textarea > cmkk kztt kell kirnod.
Elmer rlapjt ezutn hasonl mdon mdosthatod a ragads adatok hasznlathoz: < fo r m m e t h o d = " p o s t " a c t i o n = " < ? p h p e c h o $_SERV ER[ PHP_SELF ] ; ?>
< l a b e l f o r = " s u b j e c t M S u b j e c t o f e m a i l : < / l a b e l x b r /> > < i n p u t i d = " s u b j e c t " name=f,s u b ] e c t t y p e = " t e x t " s i z e = " 3 0 " value="<?php echo $ s u b je c t; ? > " / > < b r /> < l a b e l f o r = " e l v i s m a i l " > B o d y o f e m a i l : < / l a b e l x b r /> < t e x t a r e a i d = " e l v i s m a i l " n a m e = " e lv is m a il" row s= "8" c o ls = " 4 0 " > <?php echo $ t e x t ; ? X / t e x t a r e a x b r /> < i n p u t t y p e = " s u b m i t " n a m e = " s u b m it " v a l u e = " S u b m i t " /> </form>

204 4. fejezet

Valszer, gyakorlati alkalmazsok

Tesztt
Ellenrizd, mennyire ragadsak valjban Elmer adatai!
Mdostsd a s e n d e m a i l .p h p kdjt gy. hogy a $ _ P 0 S T segtsgvel ellenrizze az rlap benyjt st, valamint egsztsd ki e c h o utastsokkal az rlapot, hogy a mezi ragadsak legyenek. Tltsd fel a parancsfjl j vltozatt a webkiszolglra, s nyisd meg a fjlt egy webbngszben. Ksrletezz klnbz nekekkel az rlapmezkben, belertve az egyik vagy mindkt mez resen hagyst, s nyjtsd be az rlapot nhny alkalommal.

Elg o s to b a dolog v o lt kihagyni a levl szvegt, de m o s t, hogy az rla p ilyen ppec, t b b e t b iz to s nem fogom elfelejteni. R adsul a korbban m r b e rt a d a to k a t sem kell jra begpelnem.

MakeMeELvfe.coM
Private: For Elmers use ONLY Wnte and send an email to mailing list members. You forgot the email body text Subject ofemail:
Fall C earanee!

Bodyofemaii:

A Send Email parancsfjl m0st hibazenetet je le n j meg, ha Elmer resen hagyja valamelyik rlapme zt, de a korbban bert adatokra is emlkszik.
most itt vagy 205

amikor egy DELETE rossz tra tved

Mg most is vannak morgold felhasznlk


Az rlap ellenrzsvel nagy lpst tettl Elmer bosszankod vsrlinak - kln sen azoknak, akik res leveleket kapnak - a lecsillaptsa fel. De nem mindenki boldog. gy tnik, nhnyan tbb pldnyban kapjk meg a leveleket. Emlkszel mg erre a fickra a fejezet elejrl? n o n
S p a m 7 Inbox
__________ M M

Elmer, Kiriek, llj le a levlszemt-kldzgetssel. Cspem az akcis ajnlatokat, de lgyezi, ne kldj egynl tbbet. Min den alkalommal, amikor rtestesz egy akcirl, hrom levelet kapok. Hsges, de bosszankod vsrid. Elbert

From Elbert Krestee! <elbert@kresleesprockelsi)iz> I Subject. Spam? Date: October 24.2008 12:2333 PM CDT To: Elmer PtVestley <e<mer@makemeeWrs com> Elmer. Please stop it with the spam. I tike getting the sales emails but please don't send me more than one. I dont need to get three messages every time you want to tell me about
a sale. Your Loyal But Annoyed Customer,

Elbert

Ez a vsrl azrt bosszankodik, mert mindig tbb pldnyt kap Elmer leveleibl.

Elmer tudja, hogy egyetlen zenetet sem kldtt el tbbszr, ezrt azt gyantja, hogy egyes felhasznlk vletlenl tbbszr iratkoztak fel a levelezlistjra. Sem mi gond, a Remove Email oldal, illetve parancsfjl az elz fejezetbl majd meg oldja a problmt, s trli a felhasznlt, nem igaz? Sajnos a dolog nem ilyen egyszer. Ha Elbertet az e-mail cme alapjn trld, ak kor teljesen el fog tnni az e m a i l _ l i s t tblbl, vagyis egyetlen zenetet sem fog kapni Elmeitl. Arra kell mdot tallnod, hogy Elbertnek csak a felesleges sorait t rld a tblbl, de egyet azrt meghagyj.

n on

Make Me Efvis - Remove Email

Az elbY o fejezet Remove Email oldal nak segtsgvel teljesen eltvoltannk a m rl t Elmer adatbzisbl - de mi nem ezt akarjuk.

M a ^ M t L V fc .C O M
Enter an email address to remove Email address:
lb e rt > k re s ie e s p ro c k e t5 .

Remove

Hogyan trlhet Elmer egy kivtelvel minden pldnyt egy a tblban tbbszr szerepl, azonos e-mail cmeket tartalma z sorbl?

206 4. fejezet

Valszer, gyakorlati alkalm azsok

Hm. A problma az, hogy t b b s z r szere p l so ro k vannak a t b l b a n , de nincs r md, hogy m egklnbztessk a zo k a t. Ha nem tu d ju k elklnteni ket, minden DELETE parancs az sszes e g y e z i s o r t t r ln i fo ^ja .

Joe: Lehet, hogy az Add Email rlapunknak ellenriznie kellene a tbbszr szerep
l e-mail cmeket, mieltt felvenne egy j felhasznlt. Ez elhrtan a hibt, nem?

Frank: Kitn tlet! Jill: Igen, ez a jvre nzve megoldan a problmt, de nem segtene azokon
a tbbszr szerepl e-mail cmeken, amelyek mr az adatbzisban vannak.

Frank: Ez igaz. De mi lenne, ha a tblban egy msik oszlopot hasznlnnk a fe


lesleges sorok trlsre, pldul a l a s t _ n a m e - e t ?

Jill: n is gondoltam erre, de a vezetknv hasznlata mg lehet, hogy rosszabb


lenne, mint az e-mail cm. Mi trtnik, ha egy Jolin Smith nev vsrlt szeret nnk trlni a levelezlistrl, s ezt az SQL-kdot futtatjuk?
DELETE FROM e m a i l _ l i s t WHERE l a s t _ n a m e = 'S m ith '

Joe: Ezzel nem csak John Smith trldne a tblbl, hanem Will Smith, Maggie Smith, Emmith Smith stb. is. Frank: Ht az nem lenne j. A vezetknv valsznleg tbbszr azonos a sorokban, mint az e-mail cm, azonos
keresztnvbl meg mg annl is tbb van. Egyetlen egyszer lekrdezssel sorok tucatjait vesztennk el.

Jill: Pontosan. Nem kockztathatunk meg egy WHERE zradkot, ami olyan sorokat is trl, amelyeket meg sze'etnnk tartani. Biztosnak kell lennnk benne, hogy pontosan ki tudjuk jellni azokat sorokat, amelyeket tny leg trlni szeretnnk. Joe: Akkor mi a fent csinlhatunk? Ha nem hasznlhatjuk sem az e m a i l , sem a l a s t _ n a m e , sem a f i r s t _ n a m e oszlopot a WHERE zradkban...

Rank: ...akkor kifogyunk a tbla oszlopaibl. gy fest, nincs szerencsnk. Jill: Nem felttlenl. Valjban arra van szksgnk, hogy a tbla minden sort egyediv tegyk. Ha gy tesznk,
kkor gond nlkl kijellhetjk a kvnt sorokat. Az, hogy most nincs olyan oszlopunk, ami minden sorban egyedi rtket tartalmaz, mg nem jelenti azt, hogy nem is adhatunk a tblhoz egyet.

Joe: Egy j oszlop? De ht mr kialaktottuk a tbla szerkezett! zrank: Igen, de a jelenlegi szerkezet nem felel meg az ignyeinknek. Igazad van, tnyleg jobb lett volna ezt ko
rbban felismerni, hogy ennek megfelelen tervezzk meg a tblt, de mg mindig nem ks kijavtani.

Joe: Ok. de mi legyen az j oszlop neve? s milyen adatokat tegynk bele? Jill: Nos, mivel a szerepe az, hogy egyedileg azonostsa a tbla egyes sorait, hvhatnnk mondjuk i d e n t i f i e r nek (vagyis azonostnak), vagy rviden id-nek. ^rank: Ez tetszik. Az i d oszlopot aztn feltlthetnnk klnbz azonostszmokkal az egyes sorokhoz, hogy mikor vgrehajtjuk a DELETE utastsunkat, az e-mail cm vagy a keresztnv helyett ennek az egyedi szmnak z alapjn trljk a sorokat.

Joe: Pontosan. Ez m az tlet, nem igaz? Zseni vagyok!


m ost it t vagy

207

elsd/egesku/cs-oszlop hozzadsa egy tblhoz

A tblk sorainak egyedileg azonosthatnak kell lennik


Rszben azrt rdemes dolgokat egy adatbzisban trolni, hogy ksbb megkereshessk ket, s mveleteket hajtsunk vgre rajtuk. Ezt figyelembe vve hihetetlenl fontos, hogy egy tblban min den sor egyedileg azonosthat legyen, vagyis hogy kpesek legynk egy konkrt sort (s csak azt!) elrni. Elmer e i n a i l _ l i s t tblja azzal a veszlyes elfelttelezssel l, hogy minden e-mail cm egyedi. Ez a felttelezs azonban csak addig mkdik, amg senki nem iratkozik fel vletlenl kt szer a levelezlistra - amint ez mgis bekvetkezik (s biztosan be fog kvetkezni!), a tbla kt szer fogja trolni ugyanazt az e-mail cmet, s az egyedisgnek annyi.

Ennek a tblnak a szerke zetben semmi sem garan tlja a sorok egyedisgt.

Elmer tblja most ezt tartalmazza:


first_nam e
Denny Irm a Elbert Irm a

last_nam e
Bubbleton W e rlitz Kreslee Kreslee \

m a il
d enny@ m ightygum ball.net w er@ aliensabductedm e.com elbert@ kresleesprockets.biz elbert@ kresleesprockets.biz

( *

A keresztneve tbb szemly nek is azonos lehet, ezrt a keresztnv nem alkalmas egyedi oszlopnak.

\ a helyzet; Itt ugyanaz


a vezetknevek egyedisgre sem szmthatunk.

Az e-mail cm a legtbb esetben egyedi, de arra nem alapozhatunk, hogy ez mindig gy lesz.

Ha egy tblban nincs olyan oszlopod, ami valban egyedi rtkekei tartalmaz, ltre kell hoznod egyet. A MySQL mdot ad r, hogy egy egyedi egsz rtkeket tartalmaz oszlopot - egy gyneve zett elsdleges kulcsot - adj a sorokhoz.

Elmer tbljnak ezt kellene tartalmaznia:


Egy olyan j oszlopra van szksg, amelynek az rtke a tb la minden sorban egyedi.
firt_nam e
\ 2 3
4

iast_nam e
B ubbleton W e rlitz Kreslee Kreslee

email
d enny@ m ightygum ball.net iw er@ aliensabductedm e.com elbert@ kresleesprockets.biz elbert@ kresleesprockets.biz

Denny Irm a

Elbert Irm a

Most, hogy ez az oszlop egyedi rtkeket tartalmaz, biztos lehetsz benne, hogy a tblban minden sor egyedi.

A ms oszlopokban ismt ld adatok nem befoly soljk a sorok egyedis gt, mert arrl az j id oszlop gondoskodik.

208 4. fejezet

Valszer, gyakorlati alkalmazsok

H, zsenkem l Ha mdostani a k a rju k

a t b la s z e rk e z e t t, e g y PROP TAE5LE p a r a n c s o t kell kia d nu nk, a z t n jra l tr e kell h oznunk a t b l t a se m m ib l. E lm e r c m lis t ja f s tb e fo g m ennil

A d r o p t a b l e valban megsemmisten Elmer adatait. Az SQL-nek azonban van egy msik parancsa is, ami lehetv teszi, hogy adatveszts nlkl vltoztass meg egy meglev tblt.
Ennek a parancsnak a neve ALTR TABLE, s arra hasznlhatod, hogy anlkl hozz ltre egy j oszlopot, hogy el kellene vetned a tblt a benne trolt ada tokkal egytt. Az ALTR TABLE utasts ltalnos alakja, amellyel j oszlopot adhatsz egy tblhoz, gy fest:

ALTR TABLE

r tbla_neve ADD

A tbla neve.

IM a t
~ oszlop neve.
0 8

k M n ( aj

zi 0 p__neve oszlop_tpusa

Az j oszlop adattpusa.
Az ALTR TABLE paranccsal teht egy j oszlopot adhatunk az emai 1_1 i s t tblhoz, amelynek az i d nevet adjuk. Az i d oszlop adattpusa INT lesz, mivel egsz rtkekkel nagyszeren lehet biztostani az egyedisget. Ahogy az albbi kdbl ltszik, nhny tovbbi informcira is szksg lesz:

Ez arra utastja a MySQL-kiszolglot, hogy A mdostani kvnt tbla neve.------ n


r

Az id nev j oszlop hozzadsa.

minden jonnan beszrt sor esetben 1-gyel nvelje az oszlopban trolt rtket.

ALTER TABLE email_list ADD id INT NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (id)
.......................... Az oszlop adattpusa INTeger.

,^

A FIRST arra utastja a MySQL-t, hogy a tablaban tegye az els helyre az oszlopot. Ez nem ktelez, de clszer az azonost oszlopot az els helyre tenni.

. .

p , a kis kdrsz rulja al a MySQL-nek, hogy

B j id oszlop a tbla elsdleges kulcsa. Ezt 'marosan bvebben is kifejtjk.

A fenti ALTR TABLE utasts elg sr, mert az elsdleges kulcsokat meghat rozott jellemzkkel kell ltrehozni. A NT n u l l pldul azt mondja a MySQLnek, hogy az i d oszlopban muszj rtknek lennie, vagyis soha nem maradhat resen. Az AUTO_lNCREMENT egy jabb jellemzvel bvti az i d oszlop lerst: a hatsra az oszlop minden j sor beszrsakor automatikusan egyedi szmr tket kap. Ahogy a neve (automatikus nvels) is sugallja, az AUTO_lNCREMENT parancs automatikusan hozzad 1-et az i d oszlopnak az elz sorban szerepl rtkhez, s ezt az j rtket rja az i d oszlopba, amikor az INSERT paranccsal j sort szrsz be a tblba. Vgl, a PRIMARY KEY (elsdleges kulcs) arrl rtesti a MySQL-t, hogy az i d oszlop minden rt ke egyedi - br az egyedisgnl tbbrl van itt sz...
m ost i t t vagy

> 209

minden, amit tudni kell az elsdleges kulcsokrl

Az elsdleges kulcsok kiknyszertik az egyedisget


Az elsdleges kulcs egy olyan oszlop egy tblban, amely m egklnbz teti s egyediv teszi az adott tbla sorait. A szokvnyos oszlopokat is meghatrozhatod egyediknt, de csak egy kzs oszlop lehet elsdle ges kulcs. Ez tiszta helyzetet teremt abbl a szempontbl, hogy melyik oszlopot kell hasznlnod az olyan lekrdezsekben, amelyeknek konk rt sorokat kell kijellnik. Az elsdleges kulcsok egyedisgnek biztostsra a MySQL szm os korlto zst juttat rvnyre a PRIMARY KEY-knt meghatrozott oszlopra. Ezeket a korltozsokat foglaljk ssze az albbi szablyok:

Az elsdleges kulcs egy olyan oszlop egy tblban, amely min den sort egyediv tesz.

Az elsdleges kulcsok t szablya:


Az elsdleges kulcsban szerepl adatok nem ismtldhetnek.
Kt sor soha nem tartalmazhatja ugyanazt az adatot az elsdlegeskulcs-oszlopban. Ez all nincs kivtel: az elsdleges kulcs rtknek mindig egyedinek kell lennie az adott tblban.

Az elsdleges kulcs oszlopban mindig llnia kell valamilyen rtknek.


Ha az elsdlegeskules-oszlop res (n ull . rtk), akkor nem biztos, hogy egyedi, hiszen az oszlop ms sorokban is res lehet. Az elsdleges kulcsot mindig egyedi rtkre kell lltani!

Az elsdleges kulcsot minden j sor beszrsakor be kell lltani.


Ha beszrhatnl elsdleges kulcs nlkli sort is, akkor fennllna a kockzat, hogy ismtld sorok keletkeznek a tblban NULL elsdleges kulccsal, ami ellentmond az elsdleges kulcs szerepnek.

Az elsdleges kulcsnak a lehet leghatkonyabbnak kell lennie.


Az elsdleges kulcsban csak annyi informci legyen, amennyi felttlenl szks ges az egyedisghez, semmi tbb. Ezrt jk az egsz rtkek elsdleges kulcsnak - biztostjk az egyedisget, de nem ignyelnek nagy trhelyet.

Az elsdleges kulcsok rtke nem vltoztathat meg.


Ha megvltoztathatnd a kulcsok rtkt, akkor elfordulhatna, hogy vletlenl olyan rtket adsz nekik, amit mr hasznltl. Ne feledd, az elsdleges kulcsnak brmi ron egyedinek kell maradnia.

Elmer tbljnak id oszlopa nem tartalmaz ismtld" adatokat; minden sorban van rtke; az tket automatikusan kapja az i sorok beszrsakor; tmr; s nem vltozik. Tkletes!
210

'

id
1 2 ^

firtt_nam e
Denny Irm a

last_nam e
Bubbleton W e rlitz

email
d enny@ m ightygum ball.net iw er@ aliensabductedm e.com

4 fejezet

Valszer; gyakorlati a/ka/mazasok

Tesztt
Mdostsd Elmer tbljt, s prblj egy j adatsort beszrni egy elsdleges kulccsal!
Egy olyan MySQL-eszkz segtsgvel, mini a MySQL-terminl vagy a plipMyAdmin SQL lapja, rd be az albbi ALTR TABLE utastsi az i d nev elsdlegeskulcs-oszlop hozzadshoz:
ALTR TABLE e m a i l _ l i s t ADD i d INT NT NULL AUTO_INCREMENT F IR S T , ADD PRIMARY KEY ( i d )

Most pedig szrj be egy j vsrlt az adatbzisba, hogy kiderljn, hogy az i d oszlop auto matikusan rtket kap-e az j sorban. Ezt az albbihoz hasonl INSERT utastssal hajthatod vgre (vedd szre, hogy az elsdleges kulcsrl nem trtnik emlts):
INSERT INT e m a i l _ i i s t VALUES ('D o n ', (first_ n a m e, last_n am e, em ail)

'D r a p e r ',

'd r a p e r @ s te r lin g -c o o p e r.c o m )

Vgl adj ki egy SELECT utastst a tbla tartalmnak megtekintshez, s lsd az elsdleges kulcsot teljes pompjban. Ha esetleg elfelejtetted volna, me a SELECT utasts:

SELECT * FR0M e m a i l l i s t

File Edit Window Help Email

m y sq l> SELECT * FROM e m a i l _ l i s t ;

A* j id oszlop rtke ^omafikusan nvektfik, hogy minden j Mrban egyedi maradjon.

+---------I id f --------I 1 1 1 1 2 3 4 I f i r s t _name +--------- * ----- | Denny I Irm a I E lb ert. | 1 rma 1 Don | last_n am e
| ^

| em ail | I I | I d e :in y 3 m ig h ty g u m b a ll. n e t i w c r @ a l i e n s a b d u c t e d m o . com e lb e rt@ k re s le e s p r o c k e ts .b iz e lb e rt@ k re s le e s p r o c k e ts .b iz drap& r8 s t e r l i n g - c o o p e r . c o m

| | | 1 |

B u b b leto n W e rlitz K reslee K reslee D raper

rows i n

set

(0-0005 sec)

most itt vagy 211

irodai eszmecsere

Ok, szval m o s t a t b la minden sor n a k van egy egyedi elsdleges kulcsa. De m it s e g t ez? Elm er to v b b ra is az e-m ail cm a la pjn t r li

Joe: A problma az, hogy a felhasznlnak az e-mail cm helyett az elsdleges


kulcs alapjn kell kijellnie az adatsorokat.
V

Frank: gy van! Vagyis csak annyit kell vltoztatnunk az rlapon, hogy a fel
hasznl egy vsrl azonostjt rja be az e-mail cm helyett. No problemo!

Jill: Ez valjban elg nagy problemo. A felhasznl nem tudhatja a vsrlk


azonostjt, legfeljebb csak akkor, ha valahogy megkeresi az adatbzisban. Csakhogy a felhasznl az adatbzis szerkezetrl sem tud semmit. Lehet, hogy inkbb t kellene dolgoznunk az rlapot, hogy felsorolja az sszes ne vet az e-mail cmekkel egytt, s mindegyik mellett legyen egy jellngyzet. Csinltam nektek egy vzlatot:

A jellongyzet r tke kveti nyomon az id rtkt.

Frank: Csinos rajz, de hogyan segt ez Elmernek, hogy az azonost alapjn ki


vlaszthassa a trlend vsrlkat?

Joe: Hm. Mi lenne, ha a vsrl azonostjt a jellngyzet rtkben trol


nnk? gy nem lenne lthat, de a parancsfjl elrhetn.

Jill: Nagyszer tlet! Egy ciklussal, ami egy SELECT segtsgvel kiolvassa
az adatokat, automatikusan ltrehozhatnnk az rlapot, a jellngyzetek be viteli mezi pedig a lekrdezs ltal visszaadott sorokbl jnnnek ltre.

Joe: Klassz. De mi trtnik, amikor a felhasznl a Submit gombra kattint? Mi


lesz a szerepe a $_P0ST-nak?

Frank: Nyugi, Jo e, mindjrt odarnk. Elszr rjuk meg a parancsfjlnak azt


a rszt, amelyik megjelenti az adatokat a tblbl, s kirja a jellngyzeteket...

212 4. fejezet

Valszer, gyakorlati alkalmazsok

PHP- & MySQL-mgnesek


Az albbi mgnesek segtsgvel ptold a hinyz kdot a Remove Email parancsfjlbl

g src~"blankface. jpg" width^"161" heig'nt="350" ait"" style="float:right" /> name="elvislogo" src^"elvislcgo.gif" width="229" height^"32" border="0" alt="Make Me Elvis" /> >Please select the email addresses to delete from the email list and click Remove.</p>
f o r m method-"post" action= If

echo $_SERVER['PHP_SELF'];

<?php
$dbc = mysqii_conriect ('data. makemeelvis.com', 'elmer', or die('Error connecting to MySQL server.'); 'theking', 'elvis_store )

L // A v s r l k

so ra in a k m e g je le n t s e

t rl si

je l l n g y z e te k k e l

$query = "SELECT * FROM email_Iist"; $resuit - mysqli_query($dbc, $query); while ( = mysqli_fetch_array($result)) {

echo 'cinput type-"checkbox" value: echo echo ' ' echo ' ' echo '<br />';

. '" name="todelete[]" />';

}
mysqIi_close($dbc);

?>
<input type="submit" name=" </form> " value"Remove />

re m o v e e m a il.p h p

m o st it t vagy

213

php- ft mysql-mgnesek - megolds

PHP- & MySQL-mgnesek megolds


Az albbi mgnesek segtsgvel ptold a hinyz kdot a Remove Email parancsfjlbl s iele - 5 e? f r |L olonep zetet az Elmer adatbzisban szerepl vsrlk szmra. Ne feledd e_ l 32 U JetrellOZast S2olglia, a DELETE-et vgrehajt kddal egyelre ne foglalkozz

<imq src^'blankf a c e .jpg" width-="161" height="350" alt-*"" style="float.-right" /> <img name="elvislcgo" src="elvislogo.gif" width="229" height*"32" border-"0" al-t-"Make Me Elvis" /> <p>Piease select the email addresses to delete from the email list and click Remove.</p> <form method="post" action-" | <?php

echo $_SERVER[, PHP_SELc'];

mmm
Ez az rlap nhivatkoz!
<?php $dbc - mysqli_connect (data .makerneelvis.com , 'elmer*, 'theking', or d i e ( Error connecting to MySQL server.');

A bels' PHP-kdokat tovbbra is a <?phf> s a ? > cmkk kztt kell elhelyezned.


1elvis_store ' )

// A v s r l k s o r a i n a k m e g j e l e n t s e
$query = "SELECT * FROM email_st";

t rl si

je l l n g y z e te k k e l

S r e s u lt = m y s q li_ q u e r y (S d b c, S q u e r y ) ;
while ( mysqli_fetch_array(Sresult)) {

Itt hasznlod fel az elsdleges kulcsot , je|5|(l^ tben _ ks5ib ennek ^ jn trlheted a megjellt vsrlkat.
" name-"todelete[]M /> ;

echo 1cinput type^"chcckbox" valuc$

Minden jellongyzet beviteli mezje egy vsrl adatsorbl jn ltre.


mysqli_close($dbc);

?>
<input type="submit" name=" | submit " value "Remove" /> </form>

A parancsfjl egyelre mg sem milyen trlst nem vgez, csak megjelenti a jellngyzeteket.

re m o v e e m a il.p h c

L ? -

*,

" * . / ellenrzd fiapof benyjtottk-.

214 4. fejezet

Valszer, gyakorlati alkalmazsok

A jellngyzetektl a vsrlazonostkig
A jellngyzeteknek a Remove Email parancsfjl ltal ellltott kdja egyszer HTML, amelyben az <input> elem v a lu e jellemzjbe belegymszltk az el sdleges kulcsot (id ). Van azonban egy apr, de annl jelentsebb klnbsg a jeilngyzetek szokvnyos HTML-kdjhoz kpest. Bizonyra szrevetted a szgle tes zrjeleket a jellngyzet nevnek vgn - a szerepk ltfontossg.
echo cin p u t ty p e= "ch eck b o x v a lu e = "1 . $ r o w [ 'id '] . nam e=M o d e l e t e [ ] " > 1; t

A szgletes zrjelek egy tmbt eredmnyeznek a $_POST tmbn bell, amely z rlap bejellt jellngyzeteihez tartoz v a lu e jellemzk tartalmt trolja. Mivel a lellngyzetek v a lu e jellemzi az elsdleges kulcsot tartalmazzk, a to d e le te Tmbben minden rtk egy-egy a tblbl trlend sor azonostja lesz. Ez lehetv teszi,
hogy egy ciklussal vgigmenj a t o d e le t e tmbn, s egy SQL-lekrdezssel trld az rlapon megjellt vsrlkat.
-M jke Me-

A jellngyzet nevnek vgn ll szgletes zrjelek a jellngyzet rtkt automatiku san egy todelete" nev tmb be helyezik.
.Remove

M d k M E L V fo O )

Minden jellngyzet-rlapmez egy vsrl azonostjt trolja, amelyet a $_P0$T szupergloblison keresztl rhetsz el.

5 !5
O 0 * , - BuDtiaror,

*
w

ma Wur.jtz weraiier?saxuctedme co*

- ,rr K 5 f,*er v *>o p ck > r,a re 8e '' e 3 'o e sJ,a D o n frap tr ^ rap e^ stD rt.ngcoopefcom . R o r) tmv
rtem. E g ysze r e n egy w hile c ik lu s s a l vgigmegynk a to d e le te t m b n , s

E'fcan KreaJee Oef^TO*fewpT ca.D O

a z a z o n o s t ju k a la p j n t r lj k a z egyes v s rl k a t.

Hasznlhatnl w h i l e ciklust is, de egy msik fajta ciklus elegnsabb megoldst nyjt.
A fo rea ch egy klnleges ciklusfajta, amelyet kifejezetten egy tmb rtkeinek bejrsra szntak. Csak annyit kell tenned, hogy megadod a bejrni kvnt tm bt, illetve egy vltozt, amelyben az rtkeket trolni szeretnd, s a PHP gon doskodik a tmb elemeinek egyenknti bejrsrl - mg tesztfelttelre sincs szksg!

rd le, hogy szerinted egy foreach ciklus hogyan haladna vgig Elmer vsrlazonostinak tmbjn:

m o st i t t vagy

215

a foreach ciklus anatmija

Tmb bejrsa a foreach segtsgvel


A f o r e a c h ciklus fog egy tmbt, s vgigmegy annak elemein, anlkl, hogy ehhez egy tesztfelttelre vagy ciklusszmllra lenne szksge. Ahogy a ciklus vgiglpked a tmb elemein, az adott elem rtkt ideiglenesen egy vltozba r ja. Az albbi kd pldul a $ c u s t o m e r s vltozban trolt tmbt jrja be:

Az els* helyen a bejrni kvnt tmb ll.

fo reach echo

($cu sto m ers $cu sto m er;

as

$cu sto m er)

Ahogy a ciklus vgighalad a tmb egyes elemein, ideiglenesen egy ilyen nev vltozba rja azokat.
{

A ciklus belsejben minden elemet az imnt megadott vltoznvvel rhetsz el.

Teht ha a Remove Email parancsfjlban vgig szeretnl menni a $_POST tmb ben trolt vsrlazonostkon, a kvetkez f o r e a c h kdol hasznlhatod:

Itt a tmb a $_P0$T szupergloblisban troldik, s a todelete" a zo n o stja .^s^


fo reach // S o r ($ P O S T [ 1t o d e l e t e 1 ] a t b l bDO l 1 as $ d e le te id ) {

A tmb elemei a $delete_id vltozn keresztl rhetk el.

t rl se

};

A vsrlkat a $delete_id vl toz segtsgvel trlheted.

Ezzel a VltOZVal

rh e te d

Ahogy a ciklus egyenknt vgighalad a tmbelemeken, azok rtkt a $ d e l e t e _ _ i d vltoz trolja.


Make Me - Remove

el az egyes vsrlk a z o n o stjt, majd trlhetai ke+ a tblbl.


$delete

M a te M L v is .e a M
p le a se select the e m a il ^ d r e s s e s to Oelcie from tne maJ list a n a * Rem ove V f D enny BJbDleion <Jenny@rmghtygumbai> net

irm W , e a e t> u < oenr a jn.u ^fe i^n a d cwJm


r Libert KresJen e K > rt6 w o 5 ie e s?ro cke tt b a M irm a Kre$iee e!bori *Te5aeesprtt*ats.t)*z ty? D on D rap e r d ra p or@ srhng-cooper com

^ e oe Rmv

$_POSTrtodeletel

A tmbt gy alk ottu k


m eg, hogy

csak azokat

Most, hogy a f o r e a c h ciklus vgigjrja a bejellt jellngyzeteket a Remove Email rlapon, csak hozz kell adnod azt a kdot a ciklus belsejhez, ami elindt ja a DELETE lekrdezst, s tnylegesen trli az egyes sorokat az emai l _ _ l i s t tblbl.

a vsrlkat tartalmaz akiket bejelltek ^ I a Remove Email rla H

216 4. fejezet

Valszerf gyakorlati alkalmazsok

Gyakorlat
$dbc = mysqli_connect('data.makemeelvis.c o m 1, elmer1, 'theking', or die'Error connecting to MySQL server.'}; 'elvis store1)

// A v s r l k
if (

so ra in a k

t rl se

(csak

akkor,

ha az r l a p o t

b e n y jto tt k )

) {
{

foreach ($ POST[*todeiete'] as $delete id)

echo 'Customer<s) removed.<br />';

// A v s r l k

so ra in a k m e g je le n t s e

a t rl si

je l l n g y z e te k k e l

$query = "SELECT * FR0M mail_list"; $resu]t - mysqli_query($dbc, Squery); while ($row - mysqli_fetch_array($result)) {

echo 'cinput type="checkbox" value="' . $row['id']


echo $row['f i rst_name1J; echo ' ' . $row[1last_name'J ; echo 1 ' . $row[*email'1; echo '<br />';

. '" name="todelete[J" />';

mysqli_close($dbc) ;

?>

<input type="submit" name="submit" value= 'Remove" /> </form>

re m o v ee m ail.p h p

m ost it t vagy > 217

a javtott removeemail.php parancsfjl

Egsztsd ki Elmer j, tovbbfejlesztett removeemai 1 .php parancsfjljnak kdjt gy, hogy trlje azokat a vsrlkat, akiknek a nevt bejelltk az rlap benyjtsa eltt!

Gyakorlat - megolds

$dbc = mysqli connect ( 'dats .makemeeivis. crn', 'elmer1, 'Lheking', 'e l v i s s L .r e ) or die(*Error connectinq to MySQL server.');

Csak akkor trlje a V- / / A v s r l k s o r a i n a k t r l s e sarlkat, ha az rlapot benyjtti f * * ^ f _ P S T


as

(csak akkor,

ha a z r l a p o t

b e n y jto tt k )

) { $deiete_id> {
\d

A trlni kvnt vsrlt


^
jd t\tit

foreach (s_posTf

to d e ie te 1]
ftuery)

a $delete_id vlasztja ki.

s "p E L E T E FRO/V) c m a iljis t

Jd " ; .......................................................

or d icO E iriro r ^ucv*yi d a t 3 b a s e . ,)|

echo Customer(s) removed.<br / > ;

// A v s r l k

so ra in a k m e g je le n t s e

a t rl si

je l l n g y z e te k k e l

Squery - "SELECT * FROM erriailj st" ; $?-esuIt - mysqli_query ($dbc, $query};


while ($row - mysqli_fetch_array($result)) { . 1" name="todeiete[l" />;

echo '<input type=checkbox" value-"* . $row['id'j echo $row[ ' first_name'' ; echo * 1 . $row[*last_name*]; echo ' 1 . $row[1emailfJ; echo <br / > ;

A vsrlk jellngyzeteit elllt kd ugyanaz, mint korbban.


mysqli close($dbc);

?>

Cinput t ype="submit.M naine-"subniiL'' value=f kemove" /> , </form>

re m o v e e m a il.p h p

218 4. fejezet

Valszer, gyakorlati alkalmazsok

Tesztt
Vidd el Elmer felturbzott Remove Email parancsfjljt egy krre!
Mdostsd a r e m o v e e m a i l .p h p parancsfjl kdjt gy, hogy a rgi e-mail cmmez helyett je llngyzeteket jelentsen meg a vsrlk nevvel, majd add hozz az rlap benyjtsakor a megjellt vsrlkat trl kdot, s vltoztasd meg a < fo rm > elem a c t i o n jellemzjt is, hogy az rlap nmagra hivatkozzon! Most, hogy a r e m o v e e m a i l .p h p egy nhivatkoz rlapot hasznl, a webkiszolgln mr nincs szksg a r e m o v e e m a i l . h t m l oldalra, gyhogy nyugodtan trlheted. Ezt kveten tltsd fel a r e m o v e e m a i l .p h p j vltozatt a webkiszolglra, s nyisd meg a parancsfjlt egy webbngszben. Jellj be nhny vsrlt, s kattints a Submit gombra. Az rlap nyomban megvltozik, hogy a vsrlk trlse utni llapotot tkrzze.

n o n

Make Me Elvis r Remove- Email ___

M aV ^M ^Lv,s x o m
Please select the email addresses to delete from the email list and click Remove. P Denny Bubbleton denny@mightygumball.net r Irma Wuriitz iwer@aliensabductedme.com 0 Elbert Kresiee elbert@kresleesprockets biz Irma Kresiee elbert@kresleesprockets.biz Don Draper draper@sterl1n3 -cooper.com
Remove

M a k e / ie E i.
the email sus?omer(s) removed.

Ha bejellsz egy vsrlt, s a Submit gombra kattintasz, a vsrl trl'dik az adatbzisbl.

niJIIfH r 6nfjv liinW 4


, ,u n a e n n y m lg h fy g u m b a l/.n e t

ir r v i

irma Wurtitz wer@aiensabductedme.com D Elberr Kresiee elben@kresleesprockets.blz Don Draper draper@s1eriin9-cooper.com ( Remove

A parancsfjl megersti a v srl trlst, s a listt is fris sti, vagyis a trlt vsrlk el tnnek a listrl.

m ost i t t vagy

219

w v a makemeelvis.com!

w -x:' 7. -/ *

4
-

s. /

> ;;

tf-yy-'ss ../y,, !'

IS & Elmernek most mr egy tkletesen mkdkpes alkalmazsa van: vsr lkat vehet fel a listjra, rtestst kldhet a fantasztikus akcikrl, mghc z csak azoknak a vsrlknak, akik szeretnnek ilyet kapni* s trlheti azokat a vsrlkat, akik a stt oldalra tvedtek, vagy csak le szeretnnek kerlni a listrl. Az let nem is lehetne szebb!

MateMeEi-vs.coi
E i
j w OM.V

tJT'-AT fnar-^KJ kCI n> rc w i

SoVctoftmi.T
Boyof wraih____
b5 **>!.!* m i m

-------

M M aki* ---------------EJvts -

m *i4

M a k e M e E u v s .c y M
h,H anrt cfa* ftwn&v at

i lX > 23* C? | v'M 4

[ p fate Me.EK* - M

Ma^MgELVt^CH
PnfM
t * UaM W Etm ?*.

Mr .# . a _ ^ tfIT * 1 D *****. ----ftffi v- '-**'* ifid -W.. ^* *3C031 s? 3

..........

S C S S S U ^ - .
m W i*tr **ra*'<*nuCuG'-*.a>^ J i i^
&D*nKntim

fSbmiF;

#<lwVMi*>>n>e*eB*a

nti Dmv*r c'tw ttirtf^-cccoe con

Fiftinanfr
LJ* Oat

E a.* /jiotfSie*x/vcpux* ' rn fr w S fU uP T

Valszer, gyakorlati alkalmazsok

PHP & MySQL szerszmoslda


Mikzben Elmer webalkalmazst magasabb szint re emelted, jnhny j PHP- s MySQL-elemet is mertl meg:

if, else
A PHP if utastsa annak alapjn hoz dntseket, hogy valami igaz-e. Egy igaz/hamis tesztfelt tellel s nmi mveleti kddal el ltva az if utasts mindenfle gyes dntst tesz lehetv. Ha az if utastst egy alternatv mvelettel is el szeretnd ltni, egy else zradkot adhatsz hozz.

ALTR

TABLE

A tagads (negci) mvelete (ms nven NT) megfordt egy igaz/hamis rtket, vagyis a true false lesz, a false pedig true.

Ez az SQL-utasts egy tbla szerkezett vltoztatja meg, pldul egy j adatoszlopot vesz fel. Ez lehetv teszi, hogy anlkl mdostsd egy tbla szerkezett, hogy trl nd kellene a tblt, s jra lt re kellene hoznod a semmibl.

=i

^t

foreach
PliP-ciklusszerkezet, amelynek a segtsgvel elemenknt jr hatsz be egy tmbt, anlkl, hogy egy tesztfelttelt kellene hasznlnod. A cikluson bell a tmb minden elemhez hozz frhetsz.

sszehasonlt mveletek, ame lyekkel rtkeket sszevet teszt felttelek llthatk ssze. Gyak ran hasznljk ket if utastsok s ciklusok vezrlsre.

ScSc, O R
Logikai mveletek, amelyekkel igaz/hamis rtkeket tartalmaz ki fejezsek pthetk fel. Ha kt r tket az && (AND) kapcsol ssze, akkor az eredmny csak akkor lesz igaz (taie), ha mindkt rtk igaz. A I I (OR) segtsgvel trt n sszekapcsols ezzel szemben akkor ad igaz eredmnyt, ha leg albb az egyik rtk igaz.

isset(),empty( )
A PHP beptett issetO fggvnye azt vizsglja, hogy egy vltoz l tezik-e, vagyis hogy kapott-e r tket. Az emptyO fggvny ennl mg egy lpssel tovbbmegy, s azt hatrozza meg, hogy a vlto z res rtket (0-t, res karak terlncot, false rtket vagy NULL-t) tartalmaz-e.

most itt vagy 221

Fjlokban trolt adatok kezelse

Amikor egy adatbazis x egyszeren nem eleg


J o g o s u lt vagy f lt lte n i a k a j t a szm ba, s n a finom m appban fogom e lra k t ro z n i. n meg a sska*1 m appba te szle k

Ne dlj be a felhajtsnak...m rm int ami az adatbzisokat illeti. Tny, hogy kirtnen alkalmasak mindenfle szveges adat trols ra, de mi a helyzet a binris adatokkal? Tudod, az olyanokkal, mint a JPEG-kpek s a PDF-dokumentumok? Tnyleg van rtelme az rtkes gitrpenget-gyjtemnyedrl kszlt kpeket egy adatbzis-tbl ban trolni? Nos, ltalban nincs. Az ilyesfajta adatokat jellemzen fjlok troljk, s ott is fogjuk hagyni ket. iMindazonltal van r md. hogy a virtulis kecske is jllakjon, s a virtulis kposzta is megmaradjon - ebben a fejezetben megmutatjuk, hogy a fjlokat s adatbzisokat egytt hasznlva olyan PHP-alkalmazsokat pthetsz, ame lyek binris adatokkal vannak tele.
ez egy j fejezet 223

a Gitrok hborja " kpernyfe/vte/eket kr

A virtulis gitrosok szeretnek versenyezni


Vilgos, hogy* a lart pour Pari alkots nem mindig elegend. A npszer j jtk, a Guitar Wars (Gitrok hborja) jtkosai azon fradoznak, hogy vir tulis gitrjtkukat versenykpess tegyk - olyannyira, hogy az elrt leg magasabb pontszmkat rendszeresen kzz is teszik a Guitar Wars webhelyen, amelynek a karbantartst trtnetesen rd bztk. A gond csak az, hogy jelenleg nincs md a pontszmok ellenrzsre. ^.clg Guitar Wars - High Scores
W ek u m t, Guttar Warrior, do you have wh

A Guitar Wars alkalmazs lehet v teszi a felhasznlknak, hogy felvegyk a sajt pontszmkat a dicsosgtblra.

G u ita r Ware - Rekordok


dv. gitrbl! Elg j vagy ah hoz. ho^y bekerlj a legjobbak kz# Ha ign, add a listhoz fl.g a jit pontezim i P K b l i odatl

Ez kam ui Nem ltezik, hogy ezek m ind val p o n tsz m o k b iz o n y t k o t kvetelek!

Mivel nincs md az ellenrzs re, nem tudni, kinek a pontsz ma vals, s kinek nem. Belita, a szkeptikus virtulis rocker. v

A szvegben nem lehet bzni


Jelenleg a jtkosok sima szvegknt teszik fel az eredmnyeiket, s nagy a vita, hogy kinek vals a pontszma, s kinek nem. A marakodsnak csak egyflekppen lehet vget vetni, hogy korona kerlhessen az igazi Guitar Wars-bajnok fejre...

224 5. fejezet

Fjlokban trolt adatok kezelse

a bizonytk
Az elrt poniszmok kpi megerstsre van szksg ahhoz, hogy megllapthasd, ki T als, s ki nem. A Guitar Wars alkalmazsnak teht lehetv kell tennie a felhaszn lknak, hogy feltltsenek egy kpernyfelvtelt az eredmnykrl, amikor benyjtjk a pontszmkat. Ez azt jelenti, hogy a dicssgtbla nem csupn pontszmokbl, ne vekbl s dtumokbl fog llni, hanem kpek (kpernyfelvtelek) is lesznek rajta.

A fnykpes megersts hinya elrulja, hogy Eddie csal gitros.'


H<gh Scopes

345900
Name: Eddie Vanilfi Daie: 2008-04-23 09*>6;35

Nem b izo n yto tt!

A z t m ondod, tnyleg meg kell ta n u ln o m j ts z a n i ezen a vacakon? b a s s z u s .

282470
V a n *: Bcliia Chcvy Date: 2008-04-23 09

Name: BELITAC S co re :
3 6 8 42 0
Name: Ashton Simpson D 2008-04-23 09:13:34 aze:

Belita pontszma a benyjtott kpernyfelvtelnek ksznhe ten bizonytst nyert.

Eddie, njellt rocker s Ouitar W/ars-pontszmhamist.

most Itt vagy 225

a guitar wars alkalmazs felptse

Az alkalmazsnak trolnia kell a kpeket


A Guitar Wars rekordtrol alkalmazsa jelenleg hromfle informcit trol: az jonnan felvitt pontszm dtumt s idpontjt, az eredmnyt elr szemly nevt, valamint magt a rekordot. Ezeket az informcikat egy rlapon lehet megadni, ami az alkalmazs felhasznli felletnek rszt kpezi, s az adatok egy g u i t a r w a r s nev MySQL-adatbzistblban troldnak.

G uitar W ars High Scores


Welcome. Gater Wamor. do you have wtm ft a * cajcX tbc score t? if 0. ju s iik) W i:sJLa;<i&

-A

127650
Paco Jwiimuv Du: 20CS-04-2J 14:V7:J4
Stmt-

98430
MW N evtf
Dau.- 20<8-04 22 2i:27j4

345900
Name: Eddr Y audit DJc 20S-O4-2? 0*06:35

282470
-Name: ReliuCbcvy Date: 2008-04-23 09:12:53

A Guitar Wars foldaln tallhat add your own score" hivatkozs az Add Your High Score (Add meg a rekordodat!) oldalra vezet.

368420
Ntmc: Athlon Strep*

D#ir.0K<H-23 09;l3J4

G u itar W iu s - A d d / w r,

Guitar Wars - Add Your High Score


^ 3/nc; <enrry Lorvt/
S co rc: m
930

Az Add Your High Score oldal egy rlapot jelent meg, ahov be le het rni a nevet s a pontszmot (a dtum, illetve az idpont auto matikusan a bevitel ideje lesz).

Az jonnan fe lvitt rekordot az alkal mazs megersti, hogy a felhasznl rtesljn a sikeres bevitelrl

226

5. fejezet

Fjlokban trolt adatok kezelse

Ez az azonost az adat bzis elsdleges kulcsa, e's automatikusan jn ltre minden sorhoz.

guitarwars
Itt az a pontos dtum (s id) szerepel, amikor a pontszmot felvittk a Guitar Wars alkalmazsba.
id dote nam e store

2008-04-22 14:37:34 2 3 4 5 6 2008-04-22 21:27:54 2008-04-23 09:06:35 2008-04-23 09:12:53 2008-04-23 09:13:34 2008-04-23 14:09:50

Paco Jastorius Nevil Johansson Eddie Vanilli Belita Chevy Ashton Simpson Kenny Lavitz

127650 98430 345900 282470 368420 64930

Miutn a felhasznl bert egy nevet s egy pontszmot, majd az Add (Hozzads) gombra kattintott, az alkalmazs meg ersti az j rekordot, s hoz zadja azt az adatbzis guitarwars tbljhoz.

A guitarwars tbla az adatbzis egyes rekordbejegyzseiben a pontszm mel lett a nevet is trolja.

Guitar Wars
^'elcnuie. Guitar Wat

1127650
Sama; Paca Jtsonui Date: aS<H .22 1437.-34

98430
Name: Ne* fotauttw
Dale: 200A i-22 21:27:54

345900
Xam Eddie VttflH

Az jonnan bevitt pontszm rgtn meg jelenik a G uitar Wars toldaln.

Date:20M f-0-23C^06:?3 282470


Nanw: BOna Chnry

Date: 200SW -B 09:12:53

368420
IHt*: 200*04-23 0 *1 3 M
Nao Achwir. SircpKK

64930
Name: Jecoy Lavte D ate 200UM 23 MJKSO

m o st it t vagy

227

lsd el megjegyzsekkel a k d o t!

A Guitar Wars rekordirol alkalmazst mdostanod kell. hogy helyet csinlj a rekordokat megerst kpernyfelvteleknek. Karikzd be s lsd el megjegyzsekkel az alkalmazs azon rszeit, amelyeken vltoztatni kell ahhoz, hogy az alkalmazs tmogassa a felhasznlk

Gyakorlat

ltal feltlttt kpeket!

chtmi xralns=*"http://www.w3.org/1999/xhtml" xml:lang-"en" lang="en"> <head>


<title>Guitar Wars - High Scores</title>

clink rel="stylesheet" type-"text/css" href="style.css" /> </head> <body> <h2>Guitar Wars - High S c o r e s < / h 2 > <p>Welcome, Guitar Warrior, do you nave what it takes to crack Che high score list? If so, just <a nref="addscore.php">add your own s c o r e < / a > .< / p > <hr /> <?php // Csatlakozs az adatbzishoz $dbc = mysqli_conneet<'www.guitarwars.net, 'admin', 'rockit*, 'gwdb'); / / A pontszm kiolvassa a MySQL-adatbzisbi Squery = "SELECT * FROM guitarwars"; * $data * mysqli_query ($dbc, $query); // A ponLszntok tmbjnek bejrsa ciklussal s HTML knt tormzva echo '<table>; while ($tow = mysqli_fetch_array($data)) { // A echo echo echo echo pontszmok megjelentse ctrxr.d class-,scoreinfo">; , <span class ^"score"^ . $row [*score . </span><br />'; } '<strong>Name:</strcng> ' . Srowl'name'] . r <bc />'; ,<strong>Date:</strong> . $row('date'] . f </td></tr>r;

sty/e. ess

Ezen a fjlon nem kell vltoztatni, gy hogy ne trdj vele.

echo '</table>'; mysqli_ciose($dbc);

?>
</body> </html>

index.php g u it a r w a r s

Tltsd le!
A Guitar Wars alkalmazs teljes forrskdja letlthet a Head First Labs webhelyeri, az albbi cmrl:
www. h e a d f i r s t l a b s . c o m / b o o k s / h fp h p

228 5. fejezet

Fjlokban trolt adatok kezelse

chtml xmlns-"http://www.w3.org/1999/xhtml" xml:lang="en" lana=nen"> <head> <title>Guitar Wars - Add Your High Score</title> < l m k rel="stylesheet" type="text/css" href="style.ess" /> </head> <body> <h2>Guitar Wars - Add Your High Score</hP> < ?php if (isset($_POST{submit']) < ) / / A pontszmok kinyerse a POST tmbbl $nome = S_?OST['name]; Sscore = $ POST[score]; if (!empty($name) 5 5 !empty{$score) { ) // Csatlakozs az adatbzishoz Sdbc = mysqli_ccnnect('www.guitarwars.net, admin',

'rockit', gwdb*);

// Az adatok beviLele az adatbzisba Squery - "INSERT INTO guita-wars VALUES (0, NW(), Sname, Sscore')"; mysqli_query($dbc, $query); //A echo echo echo echo mvelet sikernek megerstse a felhasznl szmra <p>Tnanks for adding your new high score- \ < / v > ; <p><strong>Name:</strong> . $name . <br />; <strcng>Score:</stror.g> . $sccre . T</p>; <p><a href="index.phpt *>4lt;&lt; Back to high scores</ax/p>;

// A por.tszm trlse az rlap alaphelyzetbo lltshoz $name = Sscore = mysqli_close($dbc);

)
el se { echo <p class="error">P?ease enter all of the .information to add 1 your high score.</p>;

<hr

/>

<form method="post " act ion="<?php echo $ SERVER [PHP_SF.LF ]; ?>"> <iabel for=' name">Name:</label><input type="text" id="name" name*"name" value="<?php if (empty($name)) echo $name; ?>" /><br /> <label for="score">Score:</label><input type="text" id="score" name-"score value-"<Vphp if (!empty(Sscore)) echo Sscore; ?>" />
<hr />

<input type-"submit" value="Add" name="submit" /> </form> </body> </html>

a d d s c o re .p h p

m o st Itt vagy

229

a megjegyzsekkel elltott g u ita r w ars-kod

'^& P

Gyakorlat megolds
<hr.ml x m L n s - " h t t p s / /vw w

A Guitar Wars rekordtrol alkalmazst mdostanod kell, hogy helyet csinlj a rekordokat megerst kpernyfelvteleknek. Karikzd be s lsd el megjegy zsekkel az alkalmazs azon rszeit, amelyeken vltoztatni kell ahhoz, hogy az s kalmazs tmogassa a felhasznlk ltal feltlttt kpeket!
1999/xhtmi

<head>

High S c o r * 3 < / t it l e > < L irle > O u ita x ara tvce-'"T.ext./C33" h <IinK r e l.- '3 ty L c sh e e t

</head> <body>
< h 2 > G u ir . a r W a rs - H ic < p >We lc c n i e , Gu i t a r Wc h ig h s c o re . 3 t? I- * 3 C o r e < / a > . < ', P > < h r />

A kpernyfelvtelt tartalmaz fjlt is ki kell nyerni az rlap POST-adataibl.

Ellenrizni kell, bog fjlneve nem res-e

<?php
/ / C onnect to $bc - m ysq U a d std n

<html xn.lns=K http://www\w3.org/1999/xhtml" xml:2an. <head> \ < t l t l e > G u i t j r Wars a\ c Your High S c o r e < / t t le > ! <Zink r e l = " s t y l e s b e t " V p = " t e x t / c s s " h r e = " s t y </bead> <body> <h2>Guitar Wars Add Your HjgW Score</h2> <?php
i f

( 2 S S t( $ _ P O S T [ s u b m i t 1 ] ) J (

- a c o r e in fo . $row i' s c o r e * ] . . $row ['name*1 < /a tro n g > < / a t r o n g > ' . $ rowi ' d a t e ' ]

2car*">'

5name = S_POST| 'r.ame' ] ; S sco re = S__POS7 [ 1s c o r e ' 1 i C (! empty (Sname) & ferapty (S sco re ) ) & m y sq li_ co rm e ct 1 ' w w w .guitjrw ars.net
/ / A r r -

Az SQL-lekrdeze'snek a kp fa'jiw vt is be kell szart * a guitarv/ars tbld

m y s q li

a foldalon

S q u e r y ^ ^ I N S E F ? IN T O g u t a r w a r s VALUES < 0 , NOW () m y s q l. i ' -i ~ -n -.-.- __________

< /b o d y >

</html>

in d e x .p h p A kpet is meg kell jelenteni a fel hasznlnak a siker megerstshez

g u it a r w a r s
2008-04-22 14:37:34 2008-04-22 21:27:54 2008-04-23 09.06.35 2008-04-23 09:12:53 2008-04-23 09.13:34
Pq c o

uwn
Jastorh

127650 98430 345900 282470 368420


lU i'W 'JS'post." act:on="<?php echo |l | i | ' I I | ' 1 1 < la b e l f o r "name">Name:</l a b e l X ir i p u t type " t e x t " Id="narae" rane^nam'*" value="<?php i f <!empty( Snarae)) echo $name; ?>" / x b r /> < ia b e l f o r = " s c o r e " > S c o r e : </l a b e l X n p u t t y p e = " t e x t " id = " s c o r e " na-ne="sc 3 . valu="<?php i i ( ! empty( $ s c o r e j > echo S s c o r e ; ?>" /> .
pm .

Novil Johans*

2008-04-23 14:09:50

A tblban egy j oszlop ra van szksg az egyes rekordokhoz tartoz kp ernyfelvtelek fjlnv nek trolsra.

<input type' </form> </body>

v a l u e - "Add" n.iixe=" submit" />

< h l> / tm
Az rlapon egy < in p u t> elemre van szksg a kp fjl kivlasztshoz.

230 5. fejeze t

Fjlokban trolt adatok kezelse

A kpfjlok feltltsnek megtervezse i Guitar Wars alkalmazsban


Br nem tnik valami nehznek megoldani, hogy a Guitar Wars alkalmazs tmogassa a kpernyfelvtelek fel t s t, a programot tbb szempontbl is mdostani kell, ezrt nem rt, ha rendelkezel valamilyen haditervvel, mieltt fejest ugranl a kdba. Elszr is tekintsk t, hogy milyen lpsek szksgesek a rekordokat megjelen t oldal tszabshoz, hogy a kpernyiivtelek is megjelenjenek rajta: Egy screenshot (kpernyfelvtel) nev oszlop

hozzadsa a tblhoz az ALTER paranccsal.


Elszr is szksg van az adatbzisban egy j oszlopra az egyes kpernyfelvtelek fjlnev nek trolshoz. Mivel a tervek szerint minden kpfjl ugyanabba a mappba fog kerlni, az adatbzisban csak magt a fjlnevet kell trolni 1 _so,e*m t fi (teht az elrsi utat nem).

Fjlfeltlt m e z T i h ^ s T a ^ ^

~ : ; ehe,vtes* *
aP n s o b v t l r e ' ^ ^ ^ 'p otzmkeiee z * " ra d s t n de yf)b 3 A a o kl m6. o a o g ]e 2 l p t el vtl mez aw b g s e iei e b n z v l Z a d s v l E abe Zaaa- z rl,hogym g e e f l l i k z s ng n o k d k a e f j l ed o o e o d s o i

t s fa s a r
Choose File

Egy INSERT-lekrdezs megrsa, amely be szrja a kpernyfelvtel fjlnevt a tbla screenshot oszlopba.
Az Add Score parancsfjlnak, amely feldolgozza a re

Screen shot:

phizsscore.gif

kordbeviteli rlapot, az j fjlfeltlt mezt is figyelem be kell vennie, s gondoskodnia kell a kpernyfelv tel fjlnevnek beszrsrl a s c r e e n s h o t oszlopba, amikor beszrja egy j rekord sort a g u i t a r w a r s tblba.
stfewtsJiot

phizsscore.flrf

A Guitar Wars foldalnak mdostsa, hogy a rekordok mellett megjelentse a kpernyfelvteleket is.
A bevsrllista utols pontja a Guitar Wars foldalnak, az in d e x . php-nek a mdostsa. Ezt az oldalt gy kell mdostanod, hogy a pontszmok mellett megjelentse a hozzjuk tartz kperny felvtelt is.

most itt vagy 231

a tbla m dostsa az ALTR paranccsal

A rekordadatbzist mdostani kell az ALTR paranccsal


A PHP-parancsfjlok klnfle csrse-csavarsa mellett a kpekkel felturb zott Guitar Wars alkalmazsnak egy j oszlopra van szksge a gui ta rw a rs tblban a kpernyfelvtelek fjlnevnek trolsra. Itt jn a kpbe az SQL, amely az ALTR nev utastst knlja: ezzel az utastssal mindenfle rdekes mdon megvltoztathatod a tblkat, pldul j adatoszlopokat adhatsz hozz juk. Az elz fejezetben Elmer e m a i l _ l i s t tbljnak mdostsra mr hasz nltad az ALTR utastst, de nem rt. ha tismteljk, hogy miknt is mkdik a parancs:

Az ALTER paranccsal egy adatbzis szerkezett mdosthatod.

ALTR TABLE guitarwars DROP COLUMN score


A DROP COLUMN utasts egy ^ teljes oszlopot trl egy tblbl.

Az ALTR utastst gyakran a TABLE kulcssz kveti, I ami azt jelzi, hogy egy tblt mdostunk. Az ALTR DATABASE paranccsal ugyanakkor egy teljes adatbzis szerkezete is mdosthat, de ez mr egy msik trtL

Na j, lehet, hogy ez veszlyes plda, mert azt mutatja be, hogy miknt trlhetsz egy teljes oszlopot egy tblbl az sszes adatval egytt. Termszetesen elfordulhatnak azonban olyan helyzetek, ami kor el kell tvoltanod egy adatoszlopot egy tblbl, br gyakoribb, hogy fel kell venned egy j adat oszlopot - ahogy a Guitar Wars esetben. Ezt az ADD COLUMN parancs teszi lehetv, amely az a l t r utastshoz adhat szmos mdost parancs egyike.

DROP COLUMN ADD COLUMN


Ez a parancs egy j oszlopot ad a tb Ihoz - csak meg kell adnod az osz lop nevt s tpust az A D D C O L U M N utn.
AFTER TABLE guitarwars

ADD COLUMN a g e TTNYINT

MODIFY COLUMN CHANGE COLUMN


Ezzel a paranccsal egy oszlop nevt s adattpust mdosthatod - csak meg kell adnod az oszlop rgi s j nevt, valamint az j adattpust a CHANGE COLUMN utn.
ALTER TABLE guitarwars
CHANGE

Ez a parancs egy oszlop adattpust vagy a tbl ban elfoglalt helyt mdostja - csak add meg az oszlop nevt s j adattpust a m o d i f y COLUMN utn. Ha az oszlop helyt szeretnd megvltoztat ni, az oszlop nevt s pontos helyt (ebben az esetben a ? r s t - els az egyetlen vlasztsi lehetsg) vagy az oszlop viszonytott helyzett (AFTER msik ltez oszlop neve - vagyis melyik oszlop utn kvetkezzen) kell megadnod.
AT.TER T A BL E g u i t a r w a r s

COLUMN s c o r e h i g h _ s c o r e

232 5. fejezet

Fjlokban trolt adatok kezelse

ki a ceruzd! ---------------------------------------------------------------------SQL-utastst, amely egy j, s c r e e n s h o t , nev oszlopot ad a g u i t a r w a r s tblhoz, s ne felejts el megadni egy megfelel MySQL-adattpust az j oszlop szmra! Ez utn rj egy jabb SQL-lekrdezst, amely ellenrzi a tbla szerkezett, hogy meggyzdhess rla, hogy az oszlop felvtele sikeresen megtrtnt!

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

id | 1 2 3 4 z, ^jr 6

iot___________ 2 0 0 8 -0 4 -2 2 1 4 :3 7 :3 4

nam e________ 1

store

screenshot

Paco J a s t o r i u s ! 1 2 7 6 5 0 H e v il Johansson Eddie V anilli Belita C h evy Ashton Simpson Kenny Lavitz | 98430 345900 1282470 [ 368420 1 64930

1 2 0 0 8 -0 4 -2 2 2 1 :2 7 -5 4 | 2 0 0 8 -0 4 -2 3 0 9 : 0 6 : 3 5 1 2 0 0 8 -0 4 -2 3 0 9 :1 2 :5 3

I
1

2 0 0 8 -0 4 -2 3 0 9 :1 3 :3 4 _ a. wv w

1 2 0 0 8 -0 4 -2 3 1 4 :0 9 :5 0

Ide rd az oszlopot a tblhoz ad utastst.

Ide Jn a msik SQL-utasts.

most itt vagy 2 3 3

Hegyezd ki a ceruzd! - megolds

r |

Hegyezd ki a ceruzd! ^ -V Megolds


rj egy SQL-utastst, amely egy j, s c r e e n s h o t nev oszlopot ad a g u i t a r w a r s tblhoz, s ne felejts el megadni egy megfelel MySQLadattpust az j oszlop szmra! Ez utn rj egy jabb SQL-lekrdezst, amely ellenrzi a tbla szerkezett,--------O/ meggyzdhess rla, hogy ----------- - " 7 hogy az oszlop felvtele sikeresen megtrtnt!

ALTER utasts hozzadja az j screenshot oszlopot a guitarwars tblhoz.

guitarwars
name
2 0 0 8 -0 4 -2 2 1 4 :3 7 :3 4 2 0 0 8 -0 4 -2 2 2 1 :2 7 :5 4 2 0 0 8 -0 4 -2 3 0 9 : 0 6 : 3 5 2 0 0 8 -0 4 -2 3 0 9 :1 2 :5 3 2 0 0 8 -0 4 -2 3 0 9 : 1 3 : 3 4 2 0 0 8 -0 4 -2 3 1 4 :0 9 :5 0 Paco Jastorius N e v il Johansson E ddie V anilli Belita C h e v y A shton Sim pson Kenny Lavitz
s<ore scraenshot

127650 98430 345900 282470 368420 64930

Mivel az oszlop j, kezdet ben res (NULL rtk) a tbla minden sorban.

Az ALTER utasts a tbla tbbi adatt nem rinti.


gui-bv-wars

Az ALTR TABLE parancsot a mdostani ki* vnt tbla neve kveti.

Az ADD COLUMN azt jelzi, hogy a tbla mdostsa egy j adatoszlop felvtelbl ll.

Az j oszlop nevt s adattpust utols knt kell megadnod az SQL-lekrdezsben. 64 karakter elg helyet biztost a legtbb kpfjl nevnek, de ennl hosszabbra is ve heted az oszlopot, ha tutira akarsz menni. D K C R IB E , ^ui-tarwa

Ez az utasts megjelenti a tbla szerkezett az osz lopnevekkel s az oszlopok adattpusval egytt.

Az els lps megvan!

Egy screenshot nev oszlop hozz adsa a tblhoz az ALTER paranccsal

234 5. fejezet

Fjlokban trolt adatok kezelse

Add a screenhot oszlopot a guitarwars tblhoz!


Valamelyik MySQL-eszkz segtsgvel hajtsd vgre a s c r e e n s h o t oszlopot a g u i t a r w a r s tblhoz ad ALTER utastst, majd add ki a DESCRI BE utastst a tblaszerkezet megtekintshez, s ellenrizd, hogy az j oszlop valban A 0f*W8 rs tbla eredeti ltrejtt-e. vltozatt gy ptheted fel
fik Fdn
\MnOC

JE 5 C S IB F

.. nvi -

. k m d 3 Guitar Wars pl' N u ll | Key D e fa u lt 1 tx tra ^ i Mm 1 KO | PP.i ; KULI I a n te -increm ent I 1 NC 1 '-URFENT TIMESTAMP 1 , NO | 1 NUT-i. 1 KO | 1 1 140 1

fcSCRlBE utas

F ie i 1

| Typein t ill) 1 tim e stamp v a r c h a r (32) 1 i n t (1 1 )

d ^ d j t , majd vgrehajtod

3 9<"t*rwm.sql fjiban
at SQL-lekrdezst.

f/l a

ts ; lfedi az j
screenshot oszlopot,

c*d t e n 'an,' score

r c r ^ e r .s h o t 1 r-archar (64)

Nincsenek

hlye krdsek
V ! Az ALTR paranccsal felvett j oszlo pokat az adatbzis-tbla vghez kell hozzadni?
V l Nem, brhov kerlhetnek, de tartsd szben, hogy az oszlopok sorrendje egy tblban nem iga zn fontos. Ms szavakkal, a le krdezsek eredmnyt tetszle gesen rendezheted, hogy az ada tok az ltalad kvnt sorrendben jelenjenek meg. Ha viszont az oszlopok adott sorrendbe ll tsa megnyugtatja a rendszeret lelkedet, az j oszlopnak megad hatod a pontos helyt; ehhez csak a F IR S T kulcsszt kell megadnod az ALTER-lekrdezsben, vagy az AFTER o s z l o p utastst, amely az j oszlopot egy msik oszlop utn helyezi: ALTER TABLE g u i t a r w a r s ADD COLUMN a g e TINYINT AFTER name Ha nem adod meg, hogy hov szeretnd beszrni az j oszlopot, az oszlop alaprtelmezs szerint a tbla vgre kerl.

! Azrt a rgebbi sorokba is be lehet szrni kpernykpek fjlneveit, nem?

I C ! Mi trtnik a rekordadatbzis meglev adatsoraival a s c r e e n s h o t oszlop hozzadsa utn?

I Mivel az ALTER utasts csak az adatbzis szerkezetre hat. az j s c r e e n s h o t oszlop min den korbban ltezett sorban res lesz. A ksbb ltrehozand so rokban fel lehet tlteni elre a s c r e e n s h o t oszlopot, a ko rbbi sorokban azonban kivtel nlkl res lesz.

! Termszetesen, s ezt az UPDATE SQL-utastssal vgezheted el. Azt semmi sem akadlyozza meg, hogy sajt kezleg kpfjlokat tlts fel a webkiszolglra, majd az UPDATE utastssal kitltsd a meglev sorok s c r e e n s h o t oszlopt. Ne feledd azonban, hogy itt a felhasznlk ltal feltl ttt kpfjlok tmogatsa a cl, ezrt lehetv kell tenned nekik, hogy feltltsk a sajt kperny felvteleiket - pontosan erre szol gl a tovbbfejlesztett, immr k pekre tmaszkod Add Score pa rancsfjl, amit most fogsz elkszteni...

most Itt vagy 2 3 5

kpek feltltse az add score rlap segtsgvel

Hogyan szerezznk kpeket a felhasznlktl?


Most, hogy hozzadtl egy j oszlopot a rekordokat trol adatbzishoz, kszen llsz arra, hogy lehetv tedd a felhasznlknak, hogy feltltsenek egy kpfjlt. De ho gyan rheted el ezt? FTP-vel? Teleptival? Nos, az Add Your High Score (rviden Add Score) parancsfjlhoz kell visszatrned, amelyen egy rlapmezvel adhatsz le hetsget a felhasznlknak, hogy kivlasszk a feltltend kpfjlt.

----------C * * - A d d

Guitar Wars - Add Your High Score


Name: PM* uiirston Score: ) 8&580

Az Add Score rlap teszi lehetv a fe l hasznlknak, hogy hozzadjk a rekordju kt a Guitar W/ars dicssgtbljhoz.

Screen shot;

^ Dhiiijiore.gif

Ennek a gombnak a mkdst a webbngsz s az opercis rendszer szablyozza. ltalban egy fjltallz prbeszdablakot nyit meg, amelynek segtsgvel a felhasznl megkeres het egy f jlt a merevlemezn.

Az rlap benyjtsakor a binris kpfjl feltltdik a kiszolglra.


IO I O
iiiiod
_________ J

O IO O I. IQ IIi IO phizsscore.gif

W e b k is z o lg a l:

Szval egy beviteli mez segt a felhasznlnak, hogy megkeres se a feltltend fjlt - de hogyan tovbb? Nos, a fjlfeltlt rlap mez arrl is gondoskodik, hogy a kivlasztott kp feltltdjn a kiszolgl egy mappjba, ahonnan aztn megjelenthet a Guitar Wars dicssgtbljnak rszeknt. Ez a fjlfeltlt rlapmez valamilyen klnleges bvtse a HTML-nek? Egyltaln nem. A HTML <input.> eleme a fjlfel tlt rlapmezket is tmogatja, s a PHP-vel egyttmkdve le hetv teszi a fjlok feltltst. Mieltt azonban elmlyednnk a PHP-kdban, nzzk meg kzelebbrl magt az rlapmezt...

A kpfjl a kiszolgln egy mappba kerl.

236 5. fejezet

Fjlokban trolt adatok kezelse

Nagyt alatt:

az Add Score parancsfjl

Ez az rlapjellemzo arra utastja az r lapot, hogy a fjlfeltltshez szksges klnleges kdolst alkalmazza, ami azt szablyozza, hogy miknt trtnjen a POST-adatok becsomagolsa s elkl dse az rlap benyjtsakor.

Ez egy nhivatkoz rlap.

<

rm |enctyp-e=,niultipai't/forin-data" method*"post" action="<?php echo j$_SERVER [ 1PHP_SELFf]; ?>"> , >

^ in p ut rype="hidden" n ame="MAX__FILE__SIZE" value="32 ?68M <label for="name">Name:</label>

<_npat type="text" id="name" name-Mname, value="<?php if (!e m p t y ($name) ) echo $name; T

?>" />

<label

for="score">Score:</labeI>

<input type-"text" id=score" name*"score" value-"<?php if (! empty{$score)) echo $scbre; ?>" /> <br /> <Iabel for="screenshot, >Screen shot:</label> T
< input t y p e * " f i l e " idwscreenshot" name="screenshct" />

<hr /> cinput type="submit" vaiue="Add" name="submit" /> < i form>

Ez maga a fa'jifeltlt' mez', ami vgeredmny ben az opercis rendszer fjltallz s -kivlaszt prbeszdablakra tmaszkodik.

Fjlfeltlt mez elhelyezse az Add Score rlapon, amely lehetv teszi a kpfjlok fel tltst.

KSZ-

most itt vagy 2 3 7

a kpek fjlneveinek trolsa az adatbzisban

fjlnevnek A kp beszrsa az adatbzisba

A kpfjl feltltse a webkiszolglra egy rlapon keresztl nmagban nem elg. A fjlnevet trolnod is kell az adatbzis j s c r e e n s h o t oszlop ban. hogy elrhesd s megjelenthesd a kpet. Az Add Score parancsfjl je lenleg mr kpes az j rekordok beszrsra a g u ita r w a r s tblba egy aktulis INSERT SQL-utasts segtsgvel, de az utasts nem szmol az j ^ MySQL N0W () fggvnye az s c r e e n s h o t, oszloppal:
^

A kpek fjlnevnek elrak trozsrl az adatbzisba az INSERT utasts egyik rsze gondoskodik.

----------------- dtum s idpont beszrsra szolsl


'$name', !$score')

INSERT INT guitarwars VALUES (0, NOW(),

Az id oszlop rtkt az AUTOINCREMENT lltja be automatikusan. A 0-t figyelmen kvl hagyja, a lekr dezsnek viszont itt meg kell adni egy rtket.
Mivel ez az SQL-utasts anlkl szr be rtkeket, hogy meghatrozn hozzjuk az oszlopneveket, minden oszlop szmra kell rtket tartalmaz nia. Az imnt azonban felvettl egy j oszlopot, ezrt a lekrdezs tbb mr nem m kdkpes - hinyzik belle egy n k az j s c r e e n s h o t osz lop szmra. Alihoz teht, hogy a kpernyfelvtel fjlnevt az adatbzis hoz adhasd egy j rekordsor rszeknt, egy j rtkkel kell bvtened az INSERT utastst:

Azzal, hogy tadod a kpernyfelvtel fjlnevt az INSERT utas tsnak, a fjlnv beke rl az adatbzisba.

INSERT INT guitarwars VALUES (0, NOW(),

$name , '$scorer, 1$screenshot' )

A screenshot oszlop hozzadsa eltt beszrt adatsorokbl hinyzik a kprnyfelvetel fjlneve.------ .


g u it a r w a r s d 1
2 3 4 5 6 7 1

date
2 0 0 8 -0 4 -2 2 1 4 :3 7 :3 4 2 0 0 8 -0 4 -2 2 2 1 :2 7 :5 4 2 0 0 8 -0 4 -2 3 0 9 : 0 6 : 3 5 2 0 0 8 -0 4 -2 3 0 9 :1 2 :5 3 2 0 0 8 -0 4 -2 3 0 9 : 1 3 : 3 4 2 0 0 8 -0 4 -2 3 1 4 :0 9 :5 0

name
Paco Jastorius N e v it Johansson E ddie V anilli Belita C h evy A shfon Simpson K enny Lavifz Phiz Lairston

ore
127650 98430 345900 282470 368420 64930

screenshot
1 11'

I , . . __ J Ezeknek az rtkeknek a sorrend i - je lnyeges, mert az iupc o t uta INSEk sts felttelezi, hogy ugi anazt 1 a sorrendet kvetik, mint a tbla oszlopai.

E gylN S E T -lelcri ______


phizsscore.gif

2008-04-24 08:13:52

186580

Az j INSERT utasts eredmnyekppen a kprnyTelvtel fjlneve bekerl a screenshot oszlopba.

megrsa, amely beszrja a kpernyfelvtel fajine vt a tbla screensha oszlopba.

238 5. fejezet

Fjlokban trolt adatok kezelse

feltlttt fjl nevnek kidertse


dezs jl nz ki, de mg mindig nem tudjuk, hogy a kpnek val mi a fjlneve. Jogosan felttelezhetjk, hogy a fjlfeltlt mez az n valamiknt hozzfrst ad a fjlnvhez, de hogyan? Nos, a vlasz $_FILES nev beptett szupergloblis vltozjban rejlik, ami na hasonlt az rlapadatok elrshez korbban mr hasznlt $_P0S? loblishoz. A $_POST-hoz hasonlan a $_F IL E S is egy tmb, 'ben a feltlttt fjl nevn kvl egyb informcik is tallhatk "1, amelyek hasznosnak bizonyulhatnak.
liutU r Wart. Add Your Hifii. Score

<input *:ype--"fi l e

"

name-^ screenshot" />

Az rlap a $_FILE$ szupergloblis vltozn keresztl hasznos informcikat ad t a fjlrl a PHP-parancsfjlnak.

$ FILES[1screenshot] [1name]
p h iz ssc o re .g if

A fe lt lt tt f jl neve.

$ _ F I L E S [ screenshot ] [ type ?]

im a g e / g if
1001

A fe lt lt tt f jl - ami ebben az esetben egy GIF kp - MIME-tpusa.

ooion

ioioiji

$ _ F I L E S [ screenshot1] [1size]

phizsscore.gif

12244

r.

A fe lt lt tt fjl mrete (bjtban)

Ezt a kpfjlt t lti fel az rlap f jlfeltlto mezje. $_FILES [screenshot ] [ tmp_name'] '
/ tmp/phpE 7 q jk y

A f jl ideiglenes trolhelye a kiszolgln.

A $_FILE$ beptett ^ o ^ __^ A fjlfeltlts hibakdja - a 0 si kert, minden ms rtk hibt jelez. szupergloblis vltoz hozzfrst nyjt a feltl Temszetesen a $ _ f i l e s vltoz ltal hozzfrhetv tett egyb infor ttt fjlokkal kapcsolatos mcik is hasznosak, de jelen pillanatban csak a kp fjlnevre van szksged, amelyet egy helyi vltozban ($ s c r e e n s h o t) trolhatsz, hogy aztn felhasznld az INSERT SQL-utastsban. informcikhoz.
^ - $ s c r e e n s h o t = $ _ F I L E S [ 1s c r e e n s h o t ' ] [ n a m e 1 ]

$ FILES['screenshot][1error1]

most itt vagy * 2 39

kls fjladatok trolsa kls fjlokban

^S

V rju n k c s a k egy p e rc e t! M i c s a k a k p f jl n e v t t r o lju k a z a d a tb z is b a n ...M i le s z m a g va l a f jlla l? !

ssEJSasafi

S ic! KU an W ly

Oftlc: 20M-C4-2J 14:09:50

U n v e rifie d f

186580
N aiw : li7 Lolrwon

Dut: 2008^4-24 08:13:32

Gui tar
Naae:
FHIZL Scora:

iEbhBQ

A kls fjlokban trolt adatok ltalban a kls fjlokban maradnak mg az adatbzis-alkalmazsokban is.
Esetnkben az adathalmaz egy kpet felpt kppontgyjtemny, amelyet egy kls - GIF. JPEG vagy PNG - fjl trol. Az adatbzisok a szveges adW tok s nem a kpekhez hasonl nyers binris adatok trolsa tern jele>keA nek, ezrt rdemesebb csak egy hivatkozst trolni az adatbzisban, ami a kpre mutat. Ez a hivatkozs a kpfjl neve. A msik ok, amirt a webalkalmazsok kpeit nem adatbzisokban s z o ta fl trolni, hogy gy sokkal nehezebb lenne HTML-kddal megjelenteni az:ifll Ne feledd, hogy a HTML-kd a fjlnven keresztl hivatkozik a kls fijfaH bn trolt kpekre, ezrt a HTML-kpelemekben a fjlnevet kell hasznl nem a nyers kpadatokat. <img s r c = " p h i z s s c o r e . jp g " a l t = " S c o r e im a g e " />

Ahhoz, hogy elhelyezz egy kpet egy weboldaA Ion, csak egy hivatkozsra <J = van szksg, ami a kp fjlra mutat.
240 5. fejezet

H fj/IL < im g > eleme a fjlnvvel hivatkozik a webkiszolgln tallha t kpre.

re .g jf

Fjlokban trolt adatok kezelse

ki a ceruzd!
A Guitar Wars foldala (in d ex .p h p ) tovbbra sem jelenti meg a rekordokhoz tartoz kpernyfelvteleket. Fejezd be a kdot, hogy megjelenjenek a kpek!

<?php // C s a t l a k o z s az a d a tb z ish o z gwdb ) ;

$ d b c = m y s q l i _ c o n n e c t ( w w w . g u i t a r w a r s . n e t , a d m in 1 , ' r o c k i t ' ,

// A p o n t s z m k i o l v a s s a $query =

a M y S Q L -ad atb zisb l

$d ata = m y sq li_ q u e ry ($ d b c, $ q u e ry ); / / A pontszm ok t m b j n e k b e j r s a // e g y c i k l u s s e g t s g v e l echo ' < t a b l e > ' ; w h ile ($row = m y s q li_ f e t c h _ a r r a y ( $ d a t a ) ) { // A p o n t s z m o k m e g j e l e n t s e echo ' < t r x t d c l a s s = " s c o r e i n f o " > ; e c h o ' < s p a n c l a s s = ns c o r e " > ' . $row [ s c o r e ] . ' < / s p a n x b r /> ; e c h o < s tr o n g > N a m e : < / s t r o n g > . $ r o w [ n a m e ] . < b r / > ' ; ech o ' < s tr o n g > D a te : < / stro n g > ' . $ r o w [ 'd a t e ] . < / td > '; i f (is file ( s HTML k n t t rtn form zsa

) > 0) {
. " a l t = " S c o r e im a g e / > < / t d x / t r > ;

echo c t d x im g s r c = " ' .

}
e lse { e c h o ' c t d x i m g s r c = " u n v e r i f i e d . g i f " a l t = U n v e r i f i e d s c o r e " / x / t d x / t r > ' ;

} }
echo '< / t a b le > ';

m y sq li_ clo se ($ d b c);

?>

m ost it t vagy >

241

Hegyezd ki a ceruzd! - megolds

ki a ceruzd! Megolds

A Guitar Wars foldala ( i n d e x . p h p ) tovbbra sem jelenti meg a rekordokhoz tartoz kpernyfelvteleket. Fejezd be a kdot, hogy megjelenjenek a kpek!

A kd egyszerstse rdekben nem szerepel it t or die() , ami hibazenetet adna, s kilpne a parancsfjlbl a mysqli-fggvny kudarca esetn. A sajt alkalmazsaidat rdemes gy tovbbfej
<?php // C s a t l a k o z s az a d a tb z is h o z

leszteni, hogy ezt a kdot is tartalmazzk, innen kezdve azonban a rvidsg kedvrt eltekintnk tle.
a d m in ', ' r o c k i t ' , g w d b ');

$ d b c = m y s q li_ c o n n e c t ( w w w .g u ita rw a rs.n e t' , // A p o n t s z m k i o l v a s s a // a M y S Q L - a d a t b z i s b l $query = * L C T


*

A pontszmokat kiolvas SQL-utasts egyltaln nem vltozik!

FRC M ju r la v W

$ d a t a = m y sq li_ q u e ry ($ d b c, $ q u e ry ); // A p o n t s z m o k t m b j n e k b e j r s a // e g y c i k l u s s e g t s g v e l ech o f< t a b le > ' ; w h ile ($row = m y s q li_ f e t c h _ a r r a y ( $ d a t a ) ) { // A p o n t s z m o k m e g j e l e n t s e e c h o rc t r x t d c l a s s = " s c o r e i n f o " > ; e c h o 1< s p a n c l a s s = " s c o r e " > . $ r o w [ ' s c o r e ' ] . ' c / s p a n x b r / e c h o 1< s tr o n g > N a m e : < / s t r o n g > ' . $ r o w [ ' n a m e ' ] . 1< b r e c h o < s t r o n g > D a t e : < / s t r o n g > ' . $row [ ' d a te j^ * < ^ 1 < / t d > ' / s HTML-knt t r t n form zsa

Ez a fggvny azt ellen> t . rzi, hogy a kpernyolelvtel fjlja ^ m ures-e.

i f ( i s _ f i l e ( fVow CsrttKshoh']

) & & file s iz e (

/v- w C V v r*sK o t'J

/ > 0 )7

< A

echo < td x im g s rc = " 1 .

............................ i..........

tr o w C s tr tt* sK o i'J

" a l t = " S c o r e im ag e / > < / t d x / t r > * ;

........................................

) e ls e |

.........................................Az egyes rekordokhoz tartoz kpernyofelvtelekt az adatbzis screenshot oszlopa trolja.

e c h o 1c t d x i m g s r c = " u n v e r i f i e d . g i f " a l t = ,,U n v e n f e d s c o r e / x / t d x / t r > ' ;

Ez a fggvny azt ellenrzi, hogy


e c h o 1< / t a b l e > ' ;

a kpernyTelvtel fjlja ltezik-e.

m y sq li_ clo se ($ d b c);

A Guitar Wars foldal nak mdostsa, hogy a rekordok mellett megjelentse a kper nyfelvteleket is.

?>

2 4 2 5. fejezet

Fjlokban trolt adatok kezelse

Tesztt
Adj egy j rekordot a Guitar Wars oldalhoz a hozz tartoz kpernyfelvtellel egytt!
Ha mg nem Letted meg, tltsd le a Guitar Wars pldakdjt a Head First Labs webhelyrl, a w w w .head firstlabs.com / books/ hfp hp cmrl. A kdot, amely a foldalbl (in d ex .p h p ), az Add Score parancsfjlbl (a d d sco re.p h p ) s egy stluslapbl ( s t y l e . c s s ) ll, a c h a p te r0 5 mappban tallod.
Elszr m dostanod kell az a d d s c o r e . php parancsfjlt, hogy az rlap tm ogassa a fjlfel tl tst. Ebbe beletartozik az j rlapm ezk hozzadsa, a <form > elem belltsa, s annak el lenrzse, hogy a $ s c r e e n s h o t vltoz nem res-e. Ezt kveten be kell ptened az j re kordbeszr INSERT-Iekrdezst a parancsfjlba.

A kvetkez lps, hogy hozzadod az i n d e x . p h p parancsfjlhoz az elz oldalon tallhat kdot, hogy a parancsfjl megjelentse a rekordok mellett a kpernyfelvteleket. Ha ez is megvan, tltsd fel az sszes fjlt a webkiszolglra, s nyisd meg az a d d s c o r e . p h p oldalt egy webbngszben. rj be egy j rekordot az rlapra, kattints a Submit gombra, majd ugorj az i n d e x . p h p oldalra, s tekintsd meg az eredmnyt.

368420
Name: Ashton Sur.pson Date: 2008-04-23 09:13:34

64930
Name: Kenny Lavuz Date: 2008-04-23 14:09:50

c 3 186580
Name: Phi/ Lairston
D a te: 2 0 0 8 -0 4 - 2 4 0 8 : 1 3 :5 2

Valami nem stimmel! A kp nem jelenik meg a rekorddal egytt, ahogy vrtad.
Szerinted mirt nem jelenik meg a kpernyfelvtel az j rekord mellett? s mi a helyzet azokkal a rekordpontszmokkal, amelyek mr korbban is az adatbzisban voltak?

m o st it t vagy >

243

a feltlttt fjlok egy ideglenes mappaban troldnak

A feltlttt fjl azrt nem jelenik meg, mert feltteleztk, hogy ugyanabba a mappba fog kerlni a webkiszolgln, mint ahol a PHP-parancsfjlok vannak. Ez a felttelezs azonban merben tves. Az Add Score rlap le hetv teszi a felhasznlnak, hogy kivlasszon egy fjlt a szmtgp rl, a fjl azonban egy ideiglenes mappba kerl a kiszolgln. Ez az ideig lenes (angolul temporary) mappa automatikusan jn ltre a kiszolgln, s ltalban valami furcsa neve van, vletlenszer betkkel s szmokkal. Ez az in d e x , php-ben lev <img> kdnak gondot okoz, mert a kd felt telezi, hogy a kp a f webmappban tallhat:

W e b k is z o lo a *

< im g

src=

. jp g " a l t = " S c o r e

i m a g e />

Ez a kd felttelezi, hogy a kp abban a fo v/ebmag; pban troldik, ahol a PHP-fjlok is - pedig nem!
gyflbngsz
WWW

Az ideiglenes mappa neve es helye minden PHP-telepts esetben ma's s ms lehet.

A kpernyofelvtelt tartalmaz kpfjl a felhasznl sz mtgpnek vala melyik mappjbl szrmazik. Az rlapot az addscore.php jelenti meg.
p h iz s c e g in d ex, p h p

p h izs sc o re .g if
'nsfr C.u5v*f * ur<, - Arid Your H

Az Add Seore parancsfjl gondoskodik a kpfjl feltltsrl a kiszolgl egy ideglenes mappjba. 244 5. fejezet

Fjlokban trolt adatok kezelse

A kpek t ro l s a egy re jt ly e s ideiglenes m appban felesleges krnek t n ik . Nem sza b lyo zh a tju k, hogy hov kerljenek a f e lt lt t t fjlok?

Dehogynem! A PHP lehetv teszi, hogy meghatrozd, hogy hov kerljenek a feltlttt fjlok.
A feltlttt fjlok kezdeti trolhelyt ugyanakkor nem szablyozhatod a PHP-vel ezrt beszlnk ideiglenes trolrl. A fjlok azonban a feltlts utn mshov he lyezhetk: erre szolgl a PHP m o v e _ u p l o a d e d _ f i le () nev fggvnye (move = mozgat, thelyez), amelynek a fjl forrshelyt s clhelyt kell megadnod:
m o v e _ u p l o a d e d _ f i l e ( $ _ F I L E S [ * s c r e e n s h o t ' ] [ * tmp n a m e ] , $ta rg e t);

Ez a kpfjl forrshelye, az ideiglenes elrsi ttal s a fjlnvvel egytt.


W e b k is z o lg l

WWW

A f jlt az ideigle nes mappbl ^ a vgleges helyre tesszk


php7aJk

in d e x .p h p

Ez egy tetszleges mappa lehet a webkiszolgln - csak arra kell gyelned, hogy jogod legyen fjlokat rni a mappba.

i ooi L m oloc ooioic IO III IO p h iz s s c o re .g if

\oo\ lm

UiOlOt O0OIC
le t lti

phizsscore.gif

most itt vagy >

nem hlye krdsek

Nincsenek

hlye krdsek
K I Nem mdosthatom a feltlttt fjlok kezdeti trolhelyt a p h p . i n i fjlban?

V: De igen. A PHP indtfjljban

(p h p . i n i ) megvltoztathatod a feltl ttt fjlok kezdeti trolhelyt, mgpedig az u p l o a d _ t m p _ d i r bell

tson keresztl. Ha az alkalmazsodnak azonban egy virtulis kiszol gl ad otthont, akkor lehet, hogy nem frhetsz hozz ehhez a fjlhoz, ami azt jelenti, hogy egy PHP-kd segtsgvel t kell tenned a fjlt a sajt knyvtradba.

K i A feltltsi kezdmappa mirt ideiglenes" mappa? A fjlok thelyezse utn ^ j eltnik?


V I Nem. Ez a mappa abban a tekintetben ideiglenes, hogy nem vgleges trolhelyeknt szolgl a feltlttt fjloknak. Tekints r gy, mint egy olyan trhelyre, ahol a feltlttt fjlok addig pihennek, amg a vgle ges helykre nem kerlnek.

K i Nem hagyhatok egyszeren egy fjlt az ideiglenes mappban?

V ! Megteheted, de ez esetben a

$_FILES

kdot kell adnod a kp elrsi tjhoz, hogy a program megtallja a fjlt az ideiglenes mappban. Ne feledd azonban, hogy a mappa ne vt s helyt ltalban nem tudod meghatrozni, s ami mg fonto sabb, egyes rendszerek idrl idre automatikusan kirtik az ideglenes mappkat. Gondot jelenthet emellett az is, hogy az ideig lenes fel tltsi mappa nem biztos, hogy nyilvnosan hozzfrhet, gy a feltlttt fjlokra nem tudsz hivatkozni a HTML-kdbl - mrpedig a Guitar Warsban s a legtbb PHP-alkalmazsban ppen ez lenne a lnyeg. Ha a feltlttt fjlokat thelyezed az ideiglenes mappbl, akkor pontosan szablyozhatod, hogy hol troldjanak, s hogyan le hessen elrni ket.

[' s e r e e n h o t ' ][' tmp_name']

246

5. fejezet

Fjlokban trolt adatok kezelse

Ok, m o s t m r tudom, hogyan helyezhetem t a f e lt lt t t f jlo k a t. Ez t nyleg klassz. A rr l v is z o n t gzm sincs, hogy hov.

Minden alkalmazsban kell egy images mappa.


Na j, a kell taln tlzs, de fontos, hogy a PHP-alkalmazsok rszeit a lehet legjobban rendszerezd, s ennek egyik mdja az, ha a klnbz sszetevk szmra mappkat hozol ltre. Mivel a feltlttt kpek a felhasznlktl szrmaznak, ltalban nincs kzvetlen befolysod rjuk, legalbbis ami a fjlneveket s a k pek mennyisgt illeti, ezrt clszer az alkalmazs egyb fjljaitl elklntve trolni ket. Mindezt figyelembe vve teht szksged van egy i m a g e s mapp ra, ahol a Guitar Wars alkalmazshoz feltlttt kpfjlokat trolha tod. Ez a mappa az alkalmazsban hasznlt egyb kpek trolja knt is szolglhat, ha szksg lenne r.

Az images mappa valjban nem nagyobb a tbbi mappnl, viszont segt a kpfjlok egy Helyre rendezsben.

m o st Itt vagy

247

hozz ltre egy mappt a feltlttt kpek szmra!

pts hzat a feltlttt kpfjloknak!


Az images ugyanolyan mappa, mint brmelyik msik a webkiszolg ln; az egyetlen klnbsg csak az, hogy valahol az alkalmazs f webmappja alatt kell elhelyezni. ltalban megfelel, ha kzvetlenl ez al a mappa al teszed, de ha szeretnd, bonyolultabb mapparend szert is kialakthatsz. Ha az im ages mappt kzvetlenl a f webmappa alatt hozod ltre a webkiszolgln, a kpfjlokra gy hivatkozhatsz a PHPparancsfjlokbl: A kpfjl nevt hozz k

Ez az alkalmazs webmappja, ahol a PHP-parancsfjlok trol*


nak, belertve az index.php-t is.

W e b k is z o lg l

f
GW UPLOADPATH

az elrsi thoz.

A Starget elrsi t a parancsfjlhoz hozzadand j GW__UPLOADPATH llandbl pl fel, amely az images map pa elsri tjt tartalmazza. A vltozkhoz hasonlan az l landk (konstansok) is adatokat trolnak, de az rtkk nem vltozik meg a kezdeti bellts utn. Az i ma g es mappa el rsi tjhoz abban a formban kell hozzfzni a kpfjl ne vt, ahogy azt az Add Score rlapon megadtk.

Az images mappa jel lemzen kzvetlenl a webmappa (www) alatt tallhat, v

images

phpE7

index.php

Ha a PHP-alkalmazsnak nem a sajt (helyi) szmtgped ad otthont, FTP-n keresztl kell lt rehoznod az images mappt.
A webhelyed fjlrendszert egy FTP-program segtsgvel rheted el, s gy hozhatod ltre az i m a g e s mappt az alkalmazs f webmappja alatt.

A feltlttt kpfjlok az images mappba ke rlnek t, ahonnan < im g > HTMLelemeken keresztl megjelenthetk.

looi I molo

00101
loioii

ooi MA !2!1S# I
p h iz ; c o r e .g if

move u p l o a d e d f i l e (

248 5. fejezet

Fjlokban t ro lt adatok kezelse

A feladatod, hogy eljtszd a fe lt lt tt kpernyfelvtel szerept, s megtervezd az utad a Guitar W/ars alkalmazson keresztl. Rajzold be az tvonalat az alkalmazs egyes rszei kztt, s ne feledkezz meg ^ az adatbzisrl sem. Gondolkodj gy, mint egy fel-

W e b k is z o lg l

t lt tt f jl!

WWW

U g y f lb n g e s z o

UPLOADPATH

mypics

I I oo\ U j
lo o l i l

\ooI U \ OO U\ C
ooio\c l fo ljj

lto io m j > 11001 U j Im o io d lo o io i l l io io tjjj p h izs sc o re .g if


HV*hScor* l witar .

p h izssco re .g if

p h izs sc o re .g if

INSERT INTO guitarwars

id

dote

name

s<ore

screenshot

1 2 3 4 5

2008-04-22 14:37:34 2008-04-22 21:27:54 2008-04-23 09:06:35 2008-04-23 09:12:53 2008-04-23 09:13:34 2008-04-23 14:09:50 2008-04-24 08:13:52

Paco Jostorius Nevii Johansson Eddie Vanilli Beiita Chavy Ashton Simpson Kenny Lavitz Phiz Lairston

127650 98430 345900 282470 368420 64930 186580 phizsscore.gif

6 7

most itt vagy * 249

Lgy a feltlttt kpfjl! - megolds

A feladatod, hogy eljtszd a fe lt lt tt kpernyfelvtel szerept, s megtervezd az utad a Guitar Wars alkalmazson keresztl. Rajzold be az tvonalat az alkalmazs egyes rszei kztt, s ne feledkezz meg _ az adatbzisrl sem. Gondolkodj gy, mint egy fe lt

W e b k is z o lg i c

t t t f jl!

WWW

A GW a Guitar Wars rvidtse, s arra utal, hogy ez az lland csak ebben az alkalmazsban rvnyes.

g y f lb n g e s z o

mypics

Krltekinten vlaszd ki ennek a mappnak a nevt s helyt, mert az egsz Guitar M/ars alkalmazs* bn hasznlni fogod a feltlttt kpfjlok trolsra s elrsre. _

Ez a mappa a felhasznld szmtgpn tallhat - ^ nincs befolysod arra, hogy mi a neve, vagy hol tall hat, s nem is kell, hogy rdekeljen.

I lo o i I A lili o i o o j 1 oil jJ 101

L,
J

oolotl M n o o .u i
liiio io d
p

p h izssco re.g if

p h iz s s r o re .g if A msodik lps a fjl thelyezse ^ J s? ideiglenes feltltsi mappbl 1 I a vgleges kpmappba. I iMiutn a fjl felt!tc d tt a kiszolglra, s a vgleges trolhelyre kerlt, bekerl az adatbzisba

poioil
l io io in j

p h izssco re.g if

IN S E R T

IN T O

g u it a r w ars

2008-04-22 14:37:34 2008-04-22 21:27:54 200&4-23 09:06:35

Pac Jastorius Nevil Johansjon

127650 98430 345900 282470

A feltlttt kpfjl thelye zse az ideiglenes feltolt si mappbl a kpek vg leges mappjba.
250 5. fejezet

2008-04-23 09:12:53 2008-04-23 09:13:34 2008-04-23 14:09:50


2008-04-24 08:13:52

Ashton Simpson
Knny lovita:

368420

64930
186580
p h iz ssco re

Phiz Lairston

Fjlokban trolt adatok kezelse

Tesztt
Biztosts lland helyet a feltlttt kpernyfelvteleknek a sajt kpmappjukban!
Mdostsd az a d d s c o r e . p h p parancsfjlt, hogy a GW_UPLOADPATH llandt hasznlja, s a feltlttt kpernyfelvteleket azon az elrsi ton trolja, ahov az lland mutat. me a kd, amit mdostani kell:
<?php , r i P u-d1u.i-- pach a n c nay.irtum l i l e ^ d e f i n e < 'GWJJPLOADPATH', ' im a g e s / ) T ^ If .s i z e c o n s t a n t s

( i s s e t (S_POST l ' s u b m i t * ] H ( // G rab t h e s c o r e dnt.a from Che POST $narae - S_POST I ' mime' ] ; S s c o r e = $_POST ?' s c o r e - ' ] ; $ sc c e e r s5 h o t = $_FT!.E S[ ' s c r e e n s h o t ' 1 I name 1 ; if ( ! empty($name> i*. e m p t y ( $ s c c r e ) >(. ! empty ( S s c r e e n s h o t . ) ) 1 // Move r h p l i l e t f i e t a r g e t u p lo a d f o l d e r $ ta rg e t (^jW^uPLOADFATR 7 ^ 6 s c r e e n s h o t ; i f (move j a p & d w w i i y ( _ T I LBS t s c r e e n s h o t ' ] [ ' trap name ] , S t a r g e t ) } f // C o nn ect t o t h e d a t a b a s e $dbc ra y s q l.S _ c o n n e c t(* w w w . g u i t a r v a r s .n e t * , 'a d m i n ', ' r c c k i t ' , 'g w d b 'f ; = // W r i t e t h e d a t a t o t h e d a t a b a s e $query "TNSERT INTO g u i t a r w a r s VALUES { 0 , HOWOr m y s q li q u e r y ( S d b c , S q u e r y ) ;

'S n a m e ',

'S s c o r e * ,

$ s c r e e n s h o r >

// C o n fir m s u c c e s s w ith t h e u s e r e c h o '<p>Thanks f o r a d d in g your new h ig h s c o r e ! < / p > * ; e c h o , < p x a tr o n g > N a m e :< / s .tro n g > * . Sname . *<br / > '; e c h o * < s tr o n g > S c o r e ^ < ^ a l1 a f t i 1 s ----- ^ s c o r e . '< b r />; e ch o '<im g s r c = " ' .GWJIPLOADFATH J s c r e e n s h o t . " a l t = " 3 c o r e '.mage" / X / p > ; e c h o < p x a h r e f " l r S t t k . pap" J i l l ; t / B a c k cc h ig h s c o r e s < / a X / p > ;

a d d s c o re .p h p A GW_UPL0ADPATH lland az in d ex.p h p parancsfjlra is hatssal van, gyhogy ne felejtsd el ezt is megvltoztatni. Miutn vgrehajtottad a vltoztatsokat, tltsd fel a parancsfjlokat a ki szolglra, s ismt prblj felvenni egy rekordot.

64930
Stm t:

-im M B lM lllU "1 1


K c b c v I p o

M k.

fonlsimoltmlt

0.1:

Unveri fled

A fe lt lt tt kpernyoTelvtel most mr lthat a foldalon.


. P U UrtM T DH--.200*04-24 08:1*52 \

185KO

most itt vagy > 251

tovbbi nem hlye krdsek Nincsenek

hlye krdsek
I C i Ha a p h p . i n i fjlban be lehet lltani, hogy hov kerljenek a feltlttt fjlok, akkor mirt kell thelyezni a fjlt?

K ! Nem fordulhat el, hogy a felhasznlk fell


rjk egyms kpemyfelvteleit, ha azonos nwel tltenek fel kpfjlokat?

K i N e m trolhatom a feltlttt kpernyfelvte lek kpadatait a Guitar Wars adatbzisban?

I Azrt, mert nincs mindig lehetsg a p h p . ini mdostsra. Pldul ha egy virtulis webkiszolgln ptesz egy PHP-a Lkai mazst, akkor nagyon valszn, hogy nem nylhatsz a p h p .ini belltsai hoz. De mg ha tudnd is mdostani a php . i n i fjlt, akkor is azt kockztatnd, hogy az alkalmazs m kdskptelenn v lik. ha egyszer t kell helyezned egy msik kiszolglra. Ms szavakkal, az alkalmazs a p h p . ini fjlban l>elltott elrsi ttl fog fggni, nem a sajt PHP-kdod ltal megha trozott tvonaltl.

!D e . sajnos igen. A problmt az okoz za, hogy a kpem yfeivtelek ponto san ugyanazon a fjlnven troldnak a webkiszolgln. mint amit a felhasznl megadott a fjlfeltlt rlapmezben. gy lia kt felhasznl ugyanazt a fjlnevet hasznl ja, az els felhasznl kpf jljt fellrja a msodik felhasznl, ami nem j. Erre az lehet az egyik megolds, hogy a kiszolg ln egyediv teszed a kpfjlok nevt. Ennek az az egyik legegyszerbb mdja, ha a fjl nv elejre beszrod a kiszolgl aktulis idejt (m sodpercben):

D e igen. Az adatbzisok nagyon mgalmasak, s binris adatok trolst is le hetv teszik, csak ebben az esetben az a nagy baj, hogy a Guitar Wars alkalmazs a HTM I-kdban hivatkozik a feltlttt k pekre. hogy megjelenthesse azokat az index.php oldalon. A IITM L <img> ele mt gy terveztk, hogy egy hivatkozssal egy a webkiszolgln trolt kpfjlra mutas son. nem pedig adatbzisban trolt binris kpadatokra. Ezrt mg ha meg is vltoztat nd a guitarwars tblt, hogy binris kp adatokat troljon, jelents kihvst jelentene ezeknek az adatoknak a visszaalaktsa egy olyan formtumba, amit m eg lehet jelenteni HTML-kddal.

K k . ! Mirt nem adhatjk meg a dtumot maguk a felhasznlk a Guitar Wars oldalon?

$t a r g e t

G W _ U PLOADPATH

. time()

Sscreenshot;

A tim e() fggvny ltal vissza adott idben nincs semmi klns, hacsak az nem, hogy egyedi sz mokat eredmnyez, hiszen az rtk folyamatosan n'.

A dtum fontos rsze a rekordoknak. liiszen ez adja meg. hogy a rekordpontszmot hivatalosan mikor tettk fel a webhelyre. Mint minden rekord esetben, itt is rvnyes, hogy az a dicssg, aki el szr rte el az adott pontszmot. Nem bzil lod teht a felhasznlra, hogy mondja meg, mikor rte el a rekordjt, csak a rekord rgztsnek hivatalos dtumt s idpontjt hasznlhatod. Ezzel kiszrheted a gyans d tumokat, s hitelesebb teheted a dicssg tbln tallliat eredm nyeket. Azokban az alkalmazsokban, ahol a felhasznlk ver senyeznek egymssal, valaki mindig megpr bl csalni, ezrt nem rt, ha erre minl keve sebb lehetsget adsz. Fontos megjegyezni, hogy a NOW {} fggvny a webkiszolgln rvnyes idt adja vissza, ami nem biztos, hogy' megegyezik a felhasznl helyi idej vel. Ez azonban nem jelent gondot, hiszen minden felhasznl ugyanannak a kiszolg lnak az rjhoz igazodik.

Ez a kd a phizsseore.gif helyett egy olyan fjlnevet eredmnyez, mint a 1221634560phizsscore.gif, ahol a 1221034560 a kiszolgl ideje, msodperc ben kifejezve.

jratltve
Az a l t r utastssal egy MySQL-adatbzistbia, szerkezete mdosthat, pldul j adatoszlop pal bvthet. Kpfjlokat feltlteni az < i n p u t > HTML-elem a MySQL s nmi PHP-kd segtsgvel lehet A feltlttt fjlokkal kapcsolatos informciii! a PHP a $_F IL E S szupergloblis vltozban trolja. A move_uploaded_f i l e {) nev szabvnyos PHP-fggvny lehetv teszi a fjlok thelye zst a webkiszolgln, s ltfontossg a feltlttt fjlok kezelsben. A legtbb webalkalmazs szmra elnys, ha az alkalmazs ltal hasznlt - klnsen a fel hasznlk ltal feltlttt - kpeket egy kln mappa (pldul egy images nev) trolja.

Az adatbzisok kitnen alkalmasak szveges adatok trolsra, de a kls fjlokban tallhat binris adatokra ltalban jobb, ha csak hivatkoznak.
252 5. fejezet

Fjlokban trolt adatok kezelse

T etszik, hogy a f jlfe l t lt s i tvonalat egy lland trolja, de mirt kell kt helyen az index.php s az addscore.php fjlban ie ltrehozni? Ml t rt n ik , ha az elrsi t m egvltozik? i

A kpernyfelvtelek fjl felfltsi tvonalt a 6IV_UPL0A0PATH lland trolja.

A* llandi'Ifr s a define(j p. a "nyel trtnik

d e f i n ( ' GW _UPLOADPATH' , ^ Az lland neve.

im a g e s / ) ;

fc lland rtke, ami soha nem vltozhat, hiszen llandrl van SZ.

Ha az elrsi t megvltozik, kt helyen kell mdostani a kdot - mrpedig az ismtld kd rossz dolog!
A GW_UPLOADPATH lland az i n d e x . p h p s az a d d s c o r e . p h p parancs fjlon bell egyarnt nagyszeren mkdik, csakhogy az lland gy kt helyen szerepel, ami azt jelenti, hogy brmilyen vltozs az elrsi tban kt parancsfjl frisstsnek a szksgt vonja maga utn. Az ilyen ismtld kd rossz tervezsre utal, s ha csak lehet, ki kell kszblni. __________________________________ _
I ., tvonalat trol lland meghatrozsa

- P o fi W O - fii" fin o ( GWJ J P L O A D P A T H ,

ar-T .
* im a g e s / ' )

Az lland kt helyen szerepel, ami azt jelenti, hogy vltozs esetn kt helyen is mdostani kell

index.php

Agytorna
// D efine, rho vn n i r4

Az ismtld kd problmjnak megol dshoz egyetlen helyen kell trolnod a GW_UPLOADPATH llandt. Az i n d e x . php vagy az a d d s e o r e . php fjlban trolnd? Mirt?

R e f i n e ( ' s w j j p l o ad path c$ZT a 1 11 . jt _ I y T 2<

a d d s c o re .p h p

m ost it t vagy

253

a parancsfjlok adatainak megosztsa beemelt fjlok segtsgvel

A kzsen hasznlt adatokat megosztva kell hasznlni


Ha olyan adatokrl van sz, amelyeket egy alkalmazs tbb parancsfjlja kzsen hasznl, tallnod kell valamilyen mdot arra, hogy egyetlen he lyen trold, majd betlthesd azokat az egyes parancsfjlokba. De ez mg mindig nem ad vlaszt arra a krdsre, hogy pontosan hov is kerljenek ezek az adatok...

Trolhatnd ket pldul csak az index.php fjlban...

I I D e f i n e t h e u p lo a d p a th c o n s t a n t d e f i n e <'GW UPLOADPATH \ ' im a g e s / * ) ;

A parancsfjlok ltal kz sen hasznlt adatoknak kdismtls nlkl elrhe tknek kell lennik az egsz alkalmazsban.

..de akkor a tbbi parancsfjl szmra elrhetetlenn vlnnak.


H, haver, hol vannak az a d a ta im ?

Teht a parancsfjlok ltal kzsen hasznlt adatok trolsa az egyik meglev pa rancsfjlban nem igazn mkdik, mert gy az adatok mr nem lesznek megosz tottak. Valahogy elrhetv kell tenned az adatokat minden parancsfjl szmra, de anlkl, hogy kzvetlenl az egyikben trolnd azokat.
GW UPLOADPATH

?>
a d d s c o re .p h p

Hogyan teheted elrhetv az adatokat mindkt parancsfjl szmra anlkl, hogy az egyikben trolnd azokat?

a d d s c o re .p h p

A megoldst az adatok megosztsra (angolul sharing) a parancsfj lok kztt a beemelt fjlok (include file) jelentik, amelyek olyan PHPforrskdot tartalmaz fjlok, amelyeket igny szerint beszrhatsz ms PHP-fjlokba.

254 5. fejezet

Fjlokban trolt adatok kezelse

Megosztott adatok ignylse a require paranccsal


A beemelt fjlok nagyon hatkonyak, mert csak egyszer kell ltrehoznod, de akr hnyszor jrahasznosthatod ket. amikor csak szksged van rjuk ms parancsfj lokban, s gy megoszthatod a bennk lev kdot. A GW_uPLOADPATH llandt teht elhelyezheted egy beemelt fjlban, s sszellthatsz egy gyjtemnyt az alkalmazsvltozkbl.

A beemelt fjlok le hetv teszik, hogy kdot ossz meg tbb parancsfjl kztt.

a d d s c o re .p h p

A require_once utasts gondosko dik a megadott parancsfjl beemel srl a msik parancsfjlba.

in d ex, p h p

Az appvars.php beemelse ms parancs fjlokba lehetv teszi a benne lev ada tok megosztst a parancsfjlok kztt.

Nincsenek

hlye krdsek

K :
V:

Vrjunk csak! Ezek az alkalmazsvltozk'' valjban nem llandk?

K
V

! A megosztott kdot beemel (include") PHP-utastst mirt hvjk r e q u ire _ o n c e -n a k ?


A2 include file* nv a PHP include (beemer, be lefoglal) utastsbl szrmazik, amely nagyon hason l a require_once-hoz. A ken kztt az a klnb sg, hogy' a require_once hibt eredmnyez, ha a megosztott fjl nem tallhat, mg az ine 1de nem. A requi re_once-ban szerepl once (egyszer) pedig annak a megakadlyozsra szolgl, hogy egy fjl beemelsre vletlenl tbbszr is sor kerljn. N ha tallkozhatsz olyan programokkal, amelyek a requi re_once helyett az include utastst hasz nljk a kevsb fontos kdok beemelsre, pldul az olyan tiszta HTML-kdokra. amelyeknek a szerepe nem ltfontossg. A PHP-ben ezenkvl ltezik

Nha igen, de nem ez a lnyeg. Most nem a vltozk s llandk kztti klnbsgen lovagolunk, hanem kzs helyet prblunk tallni a parancsfjlok ltal megosztva hasznlt adatok trolsra egy adott alkal mazsban - s ez a kzs hely az a p p v a r s . php ne v parancsfjl.

K :
V:

A megosztott parancsfjlok kdjban csak adatokat lehet trolni?

Egyltaln nem. Brmilyen PHP-kdot kln parancs fjlba tehetsz s megoszthatsz a require_once uta stssal. Az alkalmazsok valjban nagyon gyakran osztanak meg mveleti kdokat is tbb parancsfjl kztt. A megosztott parancsfjlok hasznlata nem csak elterjedt, hanem a kd szervezse szempontj bl igen dvzlend gyakorlat.

include_once s require utasts is, amelyek az include s a require_once vltozatai.


most itt vagy 255

a re q u ire o n c e utasts

Gondolj gy a require_once-ra, mint egy beszrsra"


Nem csak egyetlen PHP-fjl em elhet be, s a beem elst is brhol vgrehajthatod egy parancsfjlon bell. A r e q u ir e _ o n c e utastsra gondolhatsz gy, mintha egy beszr insert utasts lenne, amelynek a helyre a program a hivatkozott parancsfjl tartalmt helyettesti be. A Guitar Wars ese tben az adatbzis-kapcsolati vltozkat ugyancsak rdemes egy beemelt fjlba tenni, s a kt meg osztott parancsfjl tartalmt kzvetlenl azokon a pontokon beszrni a tbbi parancsfjlba, ahol szksg van rjuk.

II

Az alkalmazs llandinak meghatrozsa

require_once('appvars. php')<?php r '// Define application constants (GW_UPLOAD?ATH\ images/ );


d e f i n e

?>

Ez a globlis vltoz olyan, az alkalmazs szmra fon tos adatokat trol, amelyek re az index.pbp-nek s az addscore.pbp-nek egy arnt szksge van.
<?php

appvars.php

requi re_once('connectvars. php)

?>

// Define database connection constants define <'DB_HOST\ www.guitarwars.net-) define(*D3_USER' 'admin'); , define C D B PASSWORD*, rockif ); define(D B N A M E ' gwdb); ,

Ahelyett, hogy minden parancs fjlban megismtelnd az adatb zis-kapcsolati vltozkat, egy beemelt fjlba thelyezve meg oszthatod ket.

connectvars.php

A REQUIRE ONCE utasts megosztott szr be ms parancsfjlokba.


256 5 fejezet

Fjlokban t ro lt adatok kezelse


// Az alkalmazs llandinak meghatrozsa c ?ph p // Define application constants define('GW UPLOADPATH', images/) // Define database connection constants define{DB HOST' 'www.guitarwars.net' , ) def ine(DB_USER' 'adrnin); , defin e {DB PASS WORD ' 'ch iefroc): ej r) ; , define ( DB_NAME , 'gu ita rwarsdb' ; ' ) // Connect to the database $dbc = mysqli connect (DE HOST, DB USER, DBJ^SSWORD // Retrieve the score data from MySQL $query = SELECT * FROM guitarwars; Sdata = mysqli query(Sdbc, $query); Loop through the array of score data^-'Tormatting it as HTML echo '<table>'; while ($row mysqli_fetch_ar ray^aata)) I // Display the score data ^ echo <t:Xtd class=nscoreinfon> '; echo '<span class^"score">' . Srowl score'] . '</spanxbr /> echo '<strong>Name:</stronq> . $row[nameJ . '<br />'; echo '<strong>Date:</strong> . $row[date'] . '</td>'; if (is_flie(GW_UPLOADPATH . $row['screenshot'] ) fiiesize(GWJJPLOADPATH . $row['screenshot '1) > 0) \ echo 'ctdximg src=" . GW_UPLOADPATH . $row ['screenshot'] " ait="Score Image" /x/tdx/tr>';
if

// Az adatbzis kapcsolati llandk // meghatrozsa

pontszam kiolvasasa a MySQL adatbzisbl

/ / A pontszjnok tmbjnek bejrsa s W / HTML-knt trtn formzsa egy ciklus // segtsgvel NAME)

lla t! M o s t mr elrem a m e g o s z to tt a datokat lel

else I ocho 1ctdximq src= . GW_UfLOADPATH . unverifled.gif " alt="Unverified score /X/td></tr> ;

addscore.php | y

C fjlfeltltsi tvonal thelyezi k

echo '</table> mysqli close(dbc)

se egy beemelt fjlon keresztl megosztott llandba._______

index.php

Hopp, mg egy j lps! Bizonyos dolgokat ne hz eio>e megtervezni, ezrt kszen kell llnod r, hogy menet kzben" mdostsd a tervet.

Hozz ltre kt beemelt fjlt a Guitar Wars alkalmazs szmra, s oszd meg ket a tbbi parancsfjl kztt!
Hozz ltre kt szvegfjlt appvars .php s connectvars .php nven, rd beljk az elz ol dalon tallhat kdokat, majd adj require_once utastsokat az index.php s addscore.php parancsfjlokhoz, hogy mindkt megosztott parancsfjlt beem eljk. Tltsd fel az sszes pa rancsfjlt a webkiszolglra, s prbld ki az Add Score rlapot, illetve a foldalt, hogy meg gyzdj rla, hogy az j, beemelt fjlokkal tovbbfejlesztett szerkezetben is mkdnek-e.
m o st i t t vagy

257

az ORDER BY utasts

a sorrend A rekordoknl idzts a lnyeg


A Guitar Wars alkalmazs vgre kpekre tmaszkodik, s lehetv teszi a felhasznlk nak, hogy feltltsk a kpernyfelvteleket, amelyek megerstik az elrt rekordpontszmaikat. Ez rdemi fejlds az alkalmazsban, de egy problmt, amely miatt a fel hasznlk rgta morgoldnak, nem old meg - a rekordok sorrendjt a foldalon.

G u ita r W a r* - A d d Y o n r H ig h Score

sm* u*

A rekordok rgztshez most mr egy Upernyfelvtel feltltse is hozztartozik... ...a m i nagyszer, csak ppen a rekor dok nem sorrendben vannak!

Ca>Ur VVar* - Add Your liich Scor*

Cui t a r
Scores

PHiri

n vagyok a z egyetlen, akinek a p o n ts z m t kpernyofelvtel is b izo n ytja , de m i rt van a re ko rd o m a lis ta aljn ?

U8 Us
6* yLE 40 N t.t/M O

Phiz cspi 3 kpernyofelvteles megerstst, de egy kis s h2zs szjt amiatt, hogy a rekordlista aljra kerlt, pedig elg tisztes rekordot rt el.

N w i**

fi M

Tny, hogy a rekordok nincsenek sorrendben. gy jelennek meg, ahogy az adatbzisban troldnak - vagyis teljesen vletlenszer en. Soha ne tmaszkodj arra a sorrendre, amelyben egy adatbzis adatai troldnak, csak ha a sorrend tnyleg nem szmt! Esetnk ben azonban igenis szmt, ezrt valahogy rendezni kell a lekrde zs eredmnyt, ilyen rendezst pedig az ORDER BY SQLutastssal lehet vgrehajtani.

258 5. fejezet

Fjlokban t ro lt adatok kezelse

PHP- & MySQL-mgnesek


Prbld kitallni, hogyan mkdik az ORDER BY, s az albbi htmgnesek segtsgvel hozd ltre azokat a rendezett SELECT utastsokat, amelyek az albbi kimenetet eredmnyezik! Ezen kvl karikzd be, hogy szerinted melyik lekrdezs a legjobb a Guitar Wars oldal szmra! Tipp: az a s c az ASCending (nvekv), a d e s c pedig a DESCending (cskken) rvidtse.
Filo E dit W indow Help YYZ

\ ame

36842 | i'l 2 8 2 4 7 0 1 | 3459001 | f| 6 4 9 3 0 ! | 9 8 4 3 0 , ' i'j 1 2 7 6 5 0 ' 'l__i 8 6 5 an!

7 rows m
A lekrdezs eredmnyben a nevek az bc A lekrdezs ltal visszaadott eredmnyek pontszmok szerint cskken, majd dtum szerint nvekv sorrendben jelennek meg.
| File E dit W indow H elp YYZ

szerint nvekv sorrendben jelennek meg.

mysql>

name 2008-04-23 2008-04-23 2008-04-23 2008-04-24 2008-04-22 2008-04-22 2008-04-23 09:13:34 09:06:3b 09:12:53 08:13:52 14:37:34 21:27:54 14:09:50 Ash'on Simpson lEddle Vani'ili Beiira Chevy I Phiz Fairsvon Paco Jos'-or'.us Nevil Jononsson| |Kenny Lavi-X I I , i , I I

score 368420 345900 282470 186580 127650 98430 64930

i screensnot

7 ^ows :n set (0.0005 sec)

FROM

FROM

m ost it t vagy

259

p h p - b m ysql-m gnesek

megolds

PHP- & MySQL-mgnesek - megolds


Prbld kitallni, hogyan mkdik az ORDER BY. s az albbi htmgnesek segtsgvel hozd lt re azokat a rendezett SELECT utastsokat, amelyek az albbi kimenetet eredmnyezik! Ezen kvl karikzd be, hogy szerinted melyik lekrdezs a legjobb a Guitar Wars oldal szmra! Tipp: az a s c az ASCending (nvekv), a d e s c pedig a DESCending (cskken) rvidtse.
| F>lo Edit Wndow Het^ T T Z _____________________

mysql>

SELECT

1 * 1 FROM I guitarwars I ORDER BY I name I ASC

I d a te
i. ^

name

| score

screenshot

t------------\ 368420 I Ashton Simpson I Belita Chevy I i 282470 | Eddie Vanilli I | 345900 I Kenny Litvitz I | 64930 | Ncvil Johansson| | 98430 | Paco Jastorius | | 127650 | Phiz Lairston. | | 186580 .
....... ...................

09:13|34 09:12 53 09:06 35 1 14:09s 50 I 21:27 54 1 2008- -04-22 114:37 34 1 J I I 2008j -04-24 l iBj 13 52

,| ,1 II 1 1 l|

2008^ 04-23 2008J 04-23 2 0 08J-04-23 2008- -04-23 2008-' -04-22

1 phizsscore.gif

A lekrdezs ltal visszaadott eredmnyek pontszmok szerint cskken, majd dtum szerint nvekv sorrendben jelennek meg.
File E dit W in r^

A lekrdezs eredmny ben a nevek az bc szerint nvekv sorrend ben jelennek meg.

A Guitar Wars oldal ki javtshoz erre a lekr dezsre van szksg!

FROM
------------------------------

name

i score'
I 368420 , 345900 I 282470

1
I , |

screenshot screenshot
^ ,

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

1. b
113

I 2C P?008-C4-23 09:13:34,
i2C 12008-04-23

I. 4 |7

1 .1 |! 2
,1 6

l2d |2008-04-23 j2q ,2008-04-24 I 20 2008-04-22 , 201 '2008-04-22 |2d >2008-04-23

lAsht-on Simpson 1 09:06:35 I Pddie Vanilli i I 09:12:03' I Belita Chevy j | 08 : 3: 5 1 ^hiz rairs^on | 1 14:3:7:341 Paco Jostorius i 1 2 :27:54 | Nevxl Johanssonl I , 14 :09: 50 | K e n n y J q v i t z _ J |

i 186580 | phisscore.gif i '.27650 | I 98430 j i 64930 |


~ -------- ~ r ------- ---- -- as* i* ~ ~ t

I | I

-a fj
7 rows In #et (0.0005 sec)

A dtum szerinti rendezs msodlagos, s csak akkor kell, ha kt pontszm azonos. Erre itt nincs plda, de egy kellen nagy adathalmazban valszn, hogy elfordul. A kt rendezsi szintet vesszvel kell elvlasztani.

260 5. fejezet

Fjlokban t ro lt adatok kezelse

A legjobb gitrhs elismerse


Most, hogy a rekordok sorrendjt kijavtottad, mg egy javtst elvgez hetsz a listn: a legmagasabb pontszmot elrt gitrost kiemelheted a lis t tetejn. A legjobb gitrhs megrdemli, hogy a rekordja kln fejlcbe a kerljn, amely vilgosan jelzi, hogy ki rte el a legjobb eredm nyt...s r.ogy mi az a pontszm, amit meg kell dnteni.

Guitar W ars - High Scores

A Top Score fejlc vilgosan je l zi a legmagasabb elri pontsza\ mot, vagyis a clt az egymssal ferseng' gitrhosknek.

W dcore

. Gaiiar

to ymi hve t e o t o ra c * <6* hifc score liff? If w .ju a

Top Score: 368420


368420
Name: \sbton Si/npson

Dl:20-4219 -M *e 080-.0. 3.

345900
Nwne: Edd* Vanilli Date: 2008- 4-230906:5

Nincsenek

hlye krdsek K ! Sok pontszm tovbbra sincs megerstve. Ez nem jelent gondot? V ! Dehogynem, de nem akadlyozza meg, hogy felhvd a fi

gyelmet a legmagasabb pontszmra. csak jelzi, hogy majd meg kell tiszttanod a rekordlistt a meg nem erstett pont szmok eltvoltsval - amire rgtn rtrnk, amint befe jeztk a legmagasabb pontszm kiemelst.

m ost it t vagy

261

egy k is ess

A legmagasabb pontszm forma'za'sa HTML s CSS segtsgvel


A legmagasabb pontszmot jelz fejlccel kapcsolatban az a legfontosabb, hogy jl lthat legyen a rekordlista tbbi pontszma felett. A kpi hangslyo zs egyarnt ignyli a HTML s a CSS segtsgt. A fejlcet a HTML-tblzat egy soraknt fogjuk ltrehozni, amelyre egy klnleges CSS-stlust alkalma zunk. Ezt a stlust, amelynek a neve topseoreheader lesz, a Guitar Wars al kalmazs style.css stluslapjhoz kell hozzadnod.

Ez a stlusosztly mr hasznlat ban van, s az a szerepe, hogy ki emelje az adatbejegyzsi hibkat az Add Score parancsfjlban, i

error {

A rekordpontszmot a fej lc kzepre igaztjuk.

font-weight: bold color: IFFOOO;

topseoreheader { ^ ^text-align: center; font-size: 200%; ----^.background-color: #36407F 'color: #FFFFFF;

Stt httrsznt haszn lunk fehr szveggel, hogy a rekord valban kitnjn.

score { font-ize:150% color: #36407F

A betmretet a tbbi pontszm nl nagyobbra kell lltanod.

scoreinfo {
vertical-align: top padding-right:15px;

style.css

Ez a kt stlusosztly ugyancsak hasznlatban van mr - az egyes rekordokat formzzk a foldalon.


Az index.php parancsfjl mr ltrehozza a rekordokat tartalmaz HTMLtblzatot. Ahhoz, hogy kln fejlcet hozz ltre a legmagasabb pontszm szmra, el kell klntened az els rekordot, ami biztosan a cscspontszm lesz. hiszen a lista most mr rendezett. A pontszmokon egy while ciklus megy vgig, ezrt valahogy meg kell szmolnod a pontszmokat, s csak az els szmra ltrehozni egy fejlcet...

262 5. fejezet

F jlokban t ro lt adatok kezelse

Gyakorlat

Egsztsd ki a Guitar Wars alkalmazs index.php parancsfjljnak kdjt, hogy a leg magasabb pontszm egy a topscoreheader CSS-stlussal formzott fejlcet kapjon! Tipp: ne feledd, hogy a legmagasabb pontszm fejlce a rekordok HTML-tblzatnak rsze, ami kt oszlopbl ll.

// A pontszmok tmbjnek bejrsa s HTML-knt trtn formzsa egy ciklussal echo ' <table>'; $i - 0 ;
while ($row = rr.ysqli_fetch_array($data) ) [

II

A pontszmok megjelentse

if (

) {

1
echo *<tr><td class="scoreinfo">'; echo 1<span class="score> ' . $rowf'score'] . '</span><br />'; echo '<strong>Name:</strong> . $ row['name*J . '<br / > ;

echo 1<strong>Date:</strong> . $row[date1] . '</td>'; if (is_file(GW_UPLOADPATH . $row['screenshot'1) && filesize(GW_UPLOADPATH . $rowI'screenshot *J ) > 0) { echo ^ t d x i m q src="' . GW_UPLOADPATH . Srow [screenshot *] .

tM alt="Score image" /></td></tr>;

I
else {
echo 'ctdximg src-"' . GW UPLOADPATH . Tunverified.gif' r" alt="Unverified score" /></td></tr>; .

echo

1</La b l e > ';

m o s t i t t vagy

> 263

G yakorlat

- m egolds

Gyakorlat - megolds

Egsztsd ki a Guitar Wars alkalmazs index.php parancsfjljnak'kdjt, hogy a legmagasabb pontszm egy a topscoreheader CSS-stlussal formzott fejlcet kapjon! Tipp: ne feledd, hogy a legmagasabb pontszm fejlce a rekordok HTMLtblzatnak rsze, ami kt oszlopbl ll.

Az $i az a vltoz, amelyik megszmllja a pontszmokat. Ennek a segtsgvel klnted el az els pontszmot.


// A pontszmok tmbjnek bejrsa s HTML-knt trtn formzsa egy ciklussal
echo '< t a b i e > ;

$i = 0; while ($row = mysqli_fetch_array ($data ) ) {

// A pontszmok megjelentse
-F i

(
dKo olspanu2- t l d t r ">Top S^orc- ' .

Ha az $i rtke 0, akkor tudod, hogy ez az els' (a legmagasabb!) pontszm, ezrt ltrehozod a fejlc HTML-kdja't.

1
echo ^trXtd clss=,scoreinfon>1; , he *<span clas:s=nscore">1 . $row[ score*] . '</span><br />'; echo *<strong>Nsme:</strong> ' . $row('name'] . <br />; echo *<strng>Date:</strong> . $row[ 1date' . '</td>; ] if ( is_file(GW_UPLOADPATH . $row['screenshot'1) && filesize( GW_UPLOADPATH . $row[screenshot' ) > 0 { ] ) echo T <td><img src="*
. GW_UPLOADPATH . $ row['screenshot1J .

A topscoreheader stlusosz tlyt a style.css trolja.

I II alt="Score image" /></tdx/tr>;

else { echo c t d x i m g src=-"' . GW UPLOADPATH . 'unverified.gif'

r" alt:="Unveri ied score" /></t.d></tr> 1;

echo ,</table>';

A ciklus vgn nvelni kell a szmll rtkt. Ez a kd ugyanazt csinlja, mint az $i


= $i + 1;.
index.php

264 5. fejezet

F jlokban t ro lt adatok kezelse

Tesztt
Rendezd a rekordokat, s emeld ki a legmagasabb pontszmot!
Mdostsd az in d ex.p h p parancsfjlt gy. hogy az j, rendezett SELECT-lekrdezst hasznlja, majd add hozz a legmagasabb pontszm fejlct ltrehoz kdot. Tltsd fel az j parancsfjlt a webkiszolglra, s nyisd meg a bngszdben, hogy lsd a rivaldafnybe kerlt rekordot.
Cu.ar W - High Srores ars

Guitar Wars - High .Scores


W ckom c, G rn u, W a ro r. do you h a w tw ft u k o to crack die high score list? Ifs o .ju a t Id to u ,

frcorc.

Top Score:
368420

368420

A legmagasabb pont szm most mr vilgo san ltszik a rekordlis ta tetejn.

Name: Ashtnn Simpson Dalt-: Dote: 2008-04-23 09:13:34

v e r i f i e d !

345900
Name: Eddc V anilii Date: 2008-04-23 09:06:35

KJasez, hogy a s o rre n d rendben v a n ...d e elg gz, hogy vannak meg nem e r s te tt p o n tsz m o k .

gy igaz, a meg nem erstett pontszmokkal foglalkozni kell.


De haladjunk lpsenknt. gy fest, egy jabb problma merlt fel, ami megakadlyozza a versenyzket abban, hogy feltltsk a pont szmaikat megerst kpernyfelvteleket...

m o s t i t t vagy

265

m re tk o rl t belltsa a kpek szmra

o 0

b e rta m a pontezmomat, e megadtam a k p e rn y o fe lv te lt, de a m ik o r a z Add g o m b ra kattintok, c s a k egy lta l n o s h ib a z e n e te t kapok. Nem brok r j n n i, mi le h e t a gond.

Ez a fjl egyrszt risi (sokkal nagyobb 32 KB-nl), de mg csak nem is kp!

i
N am e: S co re: s o .io c o

G u t t e r W a rs

A d d Y o u r H ig h c c .r

to o i iiio io

Guitar Wars - Add Your High Score


Ethel Heckle

Screen shot:

- ethtWifl*eor.3df

Add

o o i

A fjl nem csak hatalmas, de nem is kp!


Az a gond, hogy az rlap visszautast egyes fjlokat, de nem mondja meg a felhasznlknak, hogy mirt. Az per sze j, hogy az rlap bizonyos fjlokat nem enged t, e b ben az esetben azrt, mert a fjl tl nagy - emlkezz vissza, hogy a fjlmretet legfeljebb 32 KB-ra korltoztuk az rlap kdjban. A felhasznlt azonban rtesteni kell a hiba okrl, s emellett azt sem szeretnnk, hogy a fel hasznlk olyan fjlokat tltsenek fel. amelyek nem k pek. A fjlok feltltst jobban szablyozhatjuk, ha ellen rzssel egsztjk ki az Add Score rlapot. A kpfjlokat feltlt rlap (addseore. php) ellenrzse teht kt fontos clt szolgl. Elszr is megersti a nagy fjlok feltltse elleni vdelmet, azzal, hogy jelzi a fel hasznlknak, hogy a fjl nem lehet nagyobb 32 KB-nl, msodszor pedig megakadlyozza, hogy olyan llom nyokat tltsenek fel, amelyek nem kpfjlok. A fjlfeltl t rlapon teht a fjlnak mind a mrett, mind a tpust ellenrizned kell.

ioioiii
ethelshugescore.pdf

Elnz&t. a Yperryytffolvtd fe\tltevel kapcsolatban problma merlt fel.

n s > r>

- A d d V o w H la h S c c r e

Guitar XVars - Add Your High Score


Sorry. (h<rt as a probfcm uploading

'

wmr

Nome: e v>i e i iki Soe 50G cr: 0C Screen shoe (owoiewC)r*> fi * rre , <T-

Ez a hibazenet nem rul e sokat a felhasznlnak arrl, hogy mi volt a gond a rekord feltltsvel. 266 5. fejezet

kis
Csak kpek engedlyezettek

F jlokban t ro lt adatok kezelse

De pontosan hogyan ellenrizheted az Add Score rlapot, s gyzdhetsz meg arrl, hogy a feltlttt kpek m egfelel mretek s tpusak? Nos, a v laszt a beptett $_FILES szupergloblis vltoz adja meg, amellyel korbban - ha mg emlkszel r - a feltlttt fjl ideiglenes trolhelyt olvastad ki. hogy a fjlt thelyezhesd az images mappba. Most arra fogod hasznlni, hogy kinyerd a fjl mrett s MIME-tpust. ^ ^ , Mg fe!ettif 3mj jelentsen

$ FILES [ ' screenshot ' ] [ 'size']

_______k il p i a 32 KB-OS korltot. (I 280 472 bjt az 1,22 MB, ami 1250 KB.)
A fjltpus POF, nern pedig egy
elfogadhat Webes kpformtum, pldul GIF, JPG vagy PNG.

1280472 .c

$_FILES['screenshot1] [ 'type' ]
appii cation/pdf

Nem csak azt szeretnnk, hogy a kpfjlok ne haladjk meg a 32 KB-os mretkorltot, hanem hogy a tpusuk is megfeleljen ahhoz, hogy w ebes kpknt meg lehessen jelenteni ket. A w ebes kpeket a leggyakrab ban az albbi MIME-tpusok jelzik:

$_FILES[1screenshot1] [ftype * ]

GIF
image/gif
phizsscore.gif

JP EG
image/jpeg
or

/\ rekordokrl kszlt kpernyfelvteleket tartalmaz kpfjlok

image/p-peg

fo o t

PNG
image/png

jeanpaulsscore.jpg

iiio io t o o io u lo io u ,

jacobsscore.png

ki a ceruzd!
*

rj egy i f utastst, amely ellenrzi, hogy a kpernyfelvtel kpfjl-e, vala mint hogy a mrete 0 bjtnl nagyobb, de a GW_MAXFILESIZE lland n ek nl kisebb! Tegyk fel, hogy a fjlmretet s a fjltpust mr elraktroztad a $screenshot_size s a $screenshot_type nev vltozkban.

if (

) {

m o s t r tt vagy

>

267

a fjlellenrzs beptse az alkalm azsba

Hegyezd ki a ceruzd! Meqolds

tgyes bngszk e2t a MIMo JPEf kpeV" s!t.rcc.hSK_y?c

rj egy i f utastst, amely ellenrzi, hogy a kpernyfelvtel kp fjl-e, valamint hogy a mrete 0 bjtnl nagyobb, de a GW_MAXFILESIZE lland rtknl kisebb! Tegyk fel, hogy a fjlmretet s a fjltpust mr elraktroztad a $ s c r e e n s h o t_ s ir s a $ s c r e e n s h o t_ ty p e nev vltozkban. / JiO.H . ( l ~

aooa znstsr. J. J k / P ? . && - - - - " i ^ _____ -____ ____________^ ~ (fsdrcchsKo-t^siz^ > 0 ) && (fs^rcchsKot^siz^ < ^ W W y iA ^ lL K ( Z - E ) ) f

appvars.php

Mivel a maximlis fjlmret most egynl tbb helyen szerepel az Add Score parancsfjlban, clszer l landknt trolni.

A fjlellenrzs megbzhatbb teszi az alkalmazst


Nmi ellenrzs beptse brmely PHP-alkalmazst jelentsen knnyebben hasznlhatv tesz, nem beszlve a nagyobb biztonsgrl. Egy informatv hibazenet teht segt a felhasznlnak, hogy pontosan tudja, milyen korltozsok vonatkoznak a feltlttt kpfjlokra.
Guitae W df; - Add Your Hgh Scor?

tn * * * * hatod, hogy 1en


ma9Varaz

fjlok feltol*.

Ez nevetsges!

Wars - Add Your High Score


The serein vhol r u t be a GIF. JPEG. or PNG image fl no *r*ier ihan 32 KB i tn^ ir r Naine: O e' H c e1 n ek Score: loooc Scrccn sbm: cnowfii ) fc e

(**>

Mi nem ltunk semmilyen problm t.

jeanpaulsscore.jpg

ethelshugescore.pdf
26 8
5. fejezet

phizsscore.gif

jacobssco re

Fjlokban t ro lt a d a to k kezelse

Mivel a parancsfjlt megbzhatbb szeretnnk tenni, az sem rt, ha ellen^ rzd a $_FILES szupergloblist, hogy nem trtnt-e hiba a feltlts sorn.

Beszdes hibazenet megje lentse, ha a fjl tl nagy, vagy nem megfelel' tpus.

if { empty ($name) && Iempty ($score> && !empty <$scVeenshot) ) { ! if {(($screenshot_type image/gif') I (Sscreenshot_type = image/jpeg') | I | ($screenshot_type == image/pjpegf) l ($screfenshot_type == image/png)) && l ($screenshot_size > 0) && ($screenshct_siz^/x= GW_MAXFLLE5IZE)) { Lf (S_FILES[7 file,ll'error'3 ==0) { / / A fjl thelyezse a eltltsi cimappba $target GW_UPLOADPATH . Sscreensnot; it (move_uploded_file($_FILES[screenshot]['tmp_name'], Starget)) ( // Csatlakozs az adatbzishoz $dbc mysqli^connect(DB_40ST, DBJJSER, DB_PASSWORD, DB_NAME);
/

Az adatok bevitele az adatbzisba Squery "INSERT INTO guitarwars VALUES (0, NOW ( ) , mysqli_query($dbc, $query); // A echo echo echo echo echo

'$name',

'$score',

'$scr$enshot' )

mvelet sikernek megerstse a felhasznl szmra '<p>Thanks for adding your new high score!</p>' ; '<p><strong>Name:</strong> ' . $name . '<br />'; '<strong>Sccre:</strong> * . $score . '<br />'; '<img src = " ' . GW_UPLOADPATH . Sscreer.shot . '" ait="Score image" /></p> I <p><a href-"index.php">&lt;&lt; Back to high scores</a></p>' ;

// A pontszm trlse az rlap aiaphelyzetbe lltshoz Sname Sscore = Sscreensnot = mysqli_clcse($dbc);

)
else { echo <p ciass="error">Sorry, there was a problem uploading your screen shot image.

} )
else { echo '<p class "error">The screen shot must be a GIF/ JPEG, or PNG image file no ' . greater than * . (GV^MAXFILESIZE / 1024) . KB in size.</p>';

}
// Ksrlet a kpernyfelvtel ideiglenes kpfjljnak trlsre @unlink(S_FILESl'screenshot'j 1'tmp_name']);

}
else { echo '<p class="error">Please enter a_l of the information to add your high score.</p>'

Az unlink() fggvny trl egy f jlt a webkiszolglrl. A @ a fggvny hibazenetnek elrejtsre szolgl, ar ra az esetre, ha a fjlfeltlts nem jrna sikerrel.

Az j, tovbbfejlesztett Add Score parancsfjl most mr ellenrzi a kpfjlokat.

addscore.php

m ost i t t vagy

269

te szte ld az addscore.php p a ra n c s f jlt!

Tesztt
Egsztsd ki a kpfjlok ellenrzsvel az Add Score parancsfjlt!
Egsztsd ki az addscore.php parancsfjlt az j kpfjl-ellenrz kddal, tltsd fel a fjlt a webkiszolglra, s prbld ki az Add Score rlapot rvnyes kpekkel s nhny rvny telen fjllal is (nagy kpekkel s nem kp tpus fjlokkal).

Nincsenek

hlye krdsek
! Mirt van kt MIME-tpus a JPEG-kpek szmra?
! Ezt inkbb a bngszk gyrtitl kellene megkrdezni, akik valamin gy dntttek, hogy ms-ms MIME-tpust hasznlnak a JPEG kpekhez. Ahhoz, hogy a JPEG-fjlok ellenr zse biztosan a lehet legtbb bngszben mkdjn, mindkt MIME-tpust ellenrizni szksges.

K. M irt az

appvars . php-be tesszk

a g w _ m a x f ile s iz e vltozt, am ikor csak az addscore .php-ben hasznljuk?

v ! Igaz, hogy az ap p v ars .php azoknak az ada

toknak a trolsra szolgl, amelyeket tbb pa rancsfjl kzsen hasznl, de brmilyen pa rancsfjl-lland trolsra kitn hely. Ha a GW_MAXFILESIZE-t az ap p v ars .php fjl ban helyezed el, knnyebben megtallod majd ezt a vltozt, ha netn magasabbra szeretnd lltani a fjlfeltltsi mretkorltot.

! M irt kell azt is ellenrizni, hogy a kpfjl nagyobb-e 0 bjtnl? Ez nem igaz minden kpre?

\ Csak elm letben. A gyakorlatban azonban le


hetsges 0 bjtos fjlt is ltrehozni a kiszolg ln, ha a felhasznl egy olyan fjlt ad meg, ami valjban nem is ltezik a szmtgpn. Az addscore.php a biztonsgra trekszik, s ellenrzi, hogy a fjl nem res-e, ha vletlenl ilyesmi trtnne.

i Hogyan mkdik a @uniink( ) fggvnyt tartalma* z kdsor?


fjlt a webkiszolglrl - esetnkben a feltl ttt ideiglenes kpfjlt. Mivel elfordulhat, hogy a feltlts meghisult, s nincs ideiglenes kpfjl, el kell vetni az unlink () ltal adott esetleges hibazeneteket, a kukac (@) jelet a fggvny neve el rva. Kukacot brmelyik PHP-fggvny el tehetsz, ha a hibazeneteit el szeretnd rejteni.

V ! A PHP beptett unlink {) fggvnye trl egy

270 5 . fejezet

F jlokban t ro lt a d a to k kezelse

e mi lesz a meg nem e r s te tt rekordokkal? M agktl nem fognak eltnni.

A rekordok listjt ki M l tiszttani.


Most, hogy a kpfjlok fel tltst - az ellenrzsnek h la - biztonsgosabb tettk, nem hagyhatjuk figyelmen kvl tbb a meg nem erstett rekordpontszmokat. Az jonnan feltlttt, kpernyfelvtelekkel megers tett rekordok nem szorulhatnak htrbb olyan rgi re kordok miatt, amelyeknek a valdisgt nem bizonytjk kpernyfelvtelek. A Guitar Wars alkalmazsban vala hogy el kell kell tvoltani a rgi rekordokat.

jelenlegi legmagasabb pont szm nincs megerstve, ami nem tl bizalomgerjeszt tbbi felhasznaid szmra.

Guitar Wars - High Scores

W ekaftK.GtC*W doyou imor,

w\w

orehi7Uto.jU M

368420

op Score: 368420

N m k : A ih w fl Sbpeoc Dk 2008-04-23 O ft 13:34

345900

guitarwars

N * n r: lidd ic V *n flt

200K )4.230Wjj
screenshot

2 0 0 8 -0 4 -2 2 1 4 :3 7 :3 4 2 0 0 8 -0 4 -2 2 2 1 :2 7 :5 4 2 0 0 8 -0 4 -2 3 0 9 :0 6 :3 5 2 0 0 8 -0 4 -2 3 0 9 :1 2 :5 3

Paco Jastorius N evil Johansson Eddie Vanilli

127650 98430 345900 282470


A kppel meg nem erstett pontszmokat el kell tvoltani az adat bzisbl, mghozz azonnal!

Ashton Simpson
2 0 0 8 -0 4 -2 3 1 4 :0 9 :5 0

368420 64930 186580

Kenny Lavitz Phiz Lairston

rd le, hogy szerinted hogyan lehetne megtiszttani a rekordlistt a meg nem erstett pontszmoktl:

m o s t i t t vagy

271

fe l g y e le ti o ld a l hozzadsa az alkalm azshoz

Tervezz felgyeleti oldalt!


Mivel csak nhny meg nem erstett rekordot kell eltvoltanod az adat bzisbl. nyugodtan beizzthatod valamelyik SQL-eszkzt, s sajt kezleg trlheted a kvnt sorokat nhny DELETE-lekrdezs segtsgvel. Ez azonban nem biztos, hogy az utols eset, hogy trlnd kell egy rekor dot, s nem szerencss, ha egy webalkalmazs karbantartsa sorn kzi vezrls SQL-lekrdezsekre kell tmaszkodnod. Olyan alkalmazst kel lene pteni, ami a lehet legkevesebb erfesztssel zemeltethet.

Amire szksg van teht, az egy olyan oldal, amit csak a webhely rend szergazdja rhet el s hasznlhat rekordok trlsre - egy felgyeleti ol dal. Vilgosan meg kell hzni azonban a hatrt, hogy a Guitar Wars alkal mazs mely rszeit rhetik el a felhasznlk, s mely rszek tartoznak a rendszergazda hatskrbe.

A webalkalmazsoknak gyakran vannak nyilvno san elrhet s csak a webhely karbantarts ra szolgl felgyeleti oldalai is.

Ezek a felhasznlknak sznt oldalak:


Guitar W ars
Nnnr
SctW .

Sro=^ : cc

A Guitar Wars foldalt s az Add Score oldalt a vgfelhasznlknak sznjuk, a rekordjaik feltltesere s megtekintsre.

64930

btr: W -WC UlW JS O

Krtiry IJ>,Q

Unveri f i e d !

S W P t T U -. W M^ C D r-.20C *04-:-*C :a

18658

Ezt az oldalt csak az alkalmazs felgyelje hasznlhatja:


rid:

PKIZl Scor* lftU S&O

tiuitar War, - High S ot Administration c


**420
U .1 VX>

W*-0*.J4o*ca.j i MTO&xjm:

A felgyeleti oldalt csak a webhely rendszergazdja hasznlhatja, mivel nem szeret nnk, ha a vgfelhasznlk is trlhetnnek rekordokat.

P *Ja** anO ^MO O 2JW M M M :), o


M -04-24MD1JI 0 0 Kccvs /
J M C tt-* H 0 0 6 3 0 ^

____

Egy adott rekordot a Remove (Eltvolts) hivatkozsra kattintva trlhetnk.

272 5 fejezet

F jlokban t ro lt a d a to k kezelse

Gyakorlat

rd le, hogy mit kell tennie a felgyeleti (Admin), illetve a rekordeltvolt (Remove Score) parancsfjlnak, hogy megvalsthassuk a rekordok trlst a Guitar Wars al kalmazsban, majd rajzold le, hogy milyen hatsai van egy rekord eltvoltsa a guitarwars tblban tallhat sorokra s a hozzjuk tartoz kpfjlokra!

adm in.php

W e b k is z o lg l

rem ovescore.php

guitarwars
id
1 2 3 4 5 6 7

dale
2008-04-22 14:37:34 2008-04-22 21:27:54 2008-04-23 09:06:35 2008-04-23 09:12:53 2008-04-23 09:13:34 2008-04^23 14:09:50 2008-04-24 08:13:52

man
Paco Jastorius Nevil Johansson Eddie Vanilli Belita Chevy Ashton Simpson Kenny Lavitz Phiz Lairston

score
127650 98430 345900 282470 368420 64930 186580

saem hol

phizsscore.gif

1001
ttO i l

ooioh loionr

m o s t i t t vagy

273

G yakorlat - m egolds

Az admin.php parancsfjl kirja az sszes rekordsort, s mindegyik mel lett megjelenti a Rempye hivatkozst,, ami informcit ad a'f a Rmve .Score. parancsfjlnak,.......................................

Vtfars - Remove a Bighjcgfg

Guitar Wars - Remove a mgn


W e b k is z o lg l
admin.php

A remoyescore.php parancsfjl gondos kodik a rekordnak az adatbzisbl, ille t ve a kpfjlnak a kiszolglrl val tny Jeges trlsrl, valamint, egy m.egers-

Naii -^

^ _______- ^u,tar

~ Remove a High Score

Dali

scor Guitar Wars - Remove a High Score


^ The high score o f 36S420 fo r Ashton Simpson was successfully removes.

>
B a c k IQadmin page

WWW

2008-04-22 14:37:34 2008-04-22 21:27:54 2008-04-23 09:06:35

Paco Jastorius Nevil Johansson

127650 98430 345900 282470

im ages

2008-04-23 09:12:53

2008-04-23 14:09:50 2008-04-24 08:13:52

Kenny Lavitz Phiz Lairston

64930 186580

Br ehhez a konkrt sorhoz nem tartozik kpernyfelvtel, a Remove Score parancsfjl a kpfjlt is trli a kiszolglrl, ha az adott rekord esetben ltezik.

274 5. fejezet

F ajiokban t ro lt adatok kezelse

A rekordeltvolt hivatkozsok ltrehozsa a felgyeleti oldalon


Br a rekordok tnyleges eltvoltsrt a Remove Score parancsfjl felel, szksged van egy felgyeleti parancs fjlra, amely lehetv teszi, hogy kivlaszd a trlend rekordot. Az admin .php parancsfjl egy listt hoz ltre a pontszmokbl, s mindegyik mellett elhelyez egy Remove hivatkozst. Ezek a hivatkozsok adatokat adnak t az adott rekordrl a removescore.php parancsfjlnak.
<?php require_once(1appvars.php*); require_once(1connectvars.php1);

// Csatlakozs az adatbzishoz
$dbc = mysqli_connect(DB_HOST, DBJJSER, DB_PASSWORD, DB_NAME) ;

admin.php

// A pontszm kiolvassa a MySQL-aatbzisbl


$query = "SELECT + FRCM guitarwars ORDER BY score DE3C, date ASC"; $data = mysqli_query($dbc, $query);

// A pontszmok tmbjnek bejrsa s HTML-knt trtn // formzsa egy ciklus segtsgvel


echo '<tab^e>l; v^rhile (Srow = mysqli fetch_array($data)) {

A Remove Score parancsfjlra mutat URL tbbet tesz annl, mint hogy kapcsolatot teremt a parancsfjllal...adatokat is tad neki!

// A pontszmok megjelentse
echo <tr class="scorerow"xtd><strong>' . $row[nameJ . *</strong></td> echo '<td> . $row['date'J . *</td>*;

echo <td>f . $rowf'score' . *</td>*; ] echo 1<td><a hre-Mremov'2 scorc .php?id= . 3-row['id'j . 1amp;da*_e-' . -?row[ *dat e . *amp;name=* . $row{ *name*] . 6arrp;score~f . $rowf1score* J . *;arrp; se > --* .

$rowf*screenshot*] . ">Reirrove</a></td></tr>*;

echo *</table>';

Ez a kd egy HTML-hivatkozst hoz ltre, ami a removescore.php parancsfjlra mutat, s informcikat ad t a trlend- rekordrl.

mysqli close(Sdbc);

?>

e=2008-04-23%2009:1 368420&screenshot="

m ost it t vagy

275

b e m u ta tko zn a k a GET~kre/mek

A parancsfjlok kpesek trsalogni egymssal


Alihoz, hogy a Remove Score parancsfjl el tudjon tvoltani egy rekordot, tudnia kell, hogy melyik rekordot kell trlnie. Ezt azonban az Admin pa rancsfjl dnti el. Felmerl ht a krds: hogyan tudatja az Admin parancs fjl a Remove Score parancsfjllal, hogy melyik az eltvoltand rekord? Nos. ez a parancsfjlok kztti kommunikci gy jn ltre, hogy az adatokat be lecsomagoljuk a felgyeleti oldalon tallhat rekordok melletti Remove hi vatkozsok URL-jbe. Ha figyelmesen megnzed valamelyik rekordhoz tar toz L'RL-t. szreve heted, hogy a rekord sszes adata szerepel benne.
< a href=removescore.php?

Egy parancsfjl URL-jn keresztl adatokat adhati: t GET-krelemknt.

Cviur W - .S, ars High cores Administration

id=5&

date=2008-04-23%2009:13:34&
n am e= A s h t o n % 20S im p s o n & score=3 6 8 4 2 0 &screenshot=">Remove</a>

Guitar Wars High Scores Administration


Rckiw is a list of all Guitar Ware high scores. Use this page to remove scores as needed.

Ashton Simpson 2008-04-23 09: 13:34 36842(fRcm osT Eddie VanSli 2008-04-23 09:06:35 345900$ n i ^ Belita Chevy 2008-04-24 08.0 2:11 282470 Rcmpvgf Phb. Lairstoo 2008 <*-24 08: 13:52 186580 Remove

Minden adathoz tartozik egy nv s egy rtk, amelyeket egy s " jel (& ) vlaszt el a tbbi nv-rtk prtl.

A Remove URL a removescore.php NevH Johansson 2008-04-24 08:02: 11 98430 Remove Kenny Laviu 2008-04-23 14:09:50 64930 Remove parancsfjlra hivatkozik, de a t r lend' sor adatait is tartalmazza. Erre a hivatkozsra kattintva nem csak elindul csak elindi a Remove Score parancsfjl, hanem adatokat is tadunk neki egy GET-krelem formjban.

Paco Jaslorius

2008-04 24 08:02:11 127650 RsmpVfi

Ok, szval egy URL-en keresztl adjuk t az adatokat, de pontosan hogyan teszi r a kezt a Remove Score parancsfjl az adatokra? Nos, a parancsfjloknak URL-en keresztl tadott adatok a $_POST-hoz nagyon hasonl $_GKT szupergloblis tmb ben rhetk el. Az adatok becsom agolsa egy hivatkozs URL-jbe ugyanolyan, mint egy GET-krelem hasznlata egy w ebes rlapon. A hagyomnyos HTML GETkrelm ekben az rlapadatok autom atikusan kerlnek az rlapot feldolgoz parancs fjlhoz a parancsfjl URL-jnek rszeknt. Itt ugyanezt hajtjuk vgre sajt kezleg egy egyedi GET-krelem URL-knt trtn felptsvel. Alihoz, hogy a $_GET tmb segtsgvel elrd a rekordok adatait, a $_POST hasznlathoz hasonlan szksg van minden adat nevre.

Az adatokat heted el a $

3 nevkkel .G ET tmbbet.

* f*>

Egy parancsfjl U R L-/' ^ jben knyelmesen ad hatsz t fontos adato kat, pldul egy adat bzis egy sornak azo nostjt.

S-GBT [ e , j nam
$ g e t [ 1s c o r e 1
g g H 'd a te 'l

276 5. fejezet

F jlokban t ro lt a d a to k kezelse

Nem rtem , mi ez a nagy fe lh a jt s a GET krl. M i rt nem adjuk t az a d a to k a t egyszeren a P 05T segtsgvi? Eddig mindig gy csinltuk.

N am e: Pni* Lairston

Score: 166S 0 B
S creen sh o e

___
p h irs*c o r* grf

A webes rlapok gyakran hasznlnak POSTkrelmeket adatok elkl dsre, amelyeket a $ POST tmb trol.

Ha az adatokat egy URL-ben szeretnd el kldeni, a GET-et hasz nlbatod, amely az ada tokat a $_GET tmb ben trolja.

m o st i t t vagy

277

GET vagy POST

OET-ek s POST-ok
A GET s a POST kztti klnbsg nem csak abban ll, hogy az egyik rlapokat,
a msik m eg URL-eket hasznl, mivel a GET-krelmek rlapadatok elkldsre is kpesek (s gyakran gy is hasznljk ket). A GET s a POST kztti valdi k lnbsget a krelem clja jelenti. A GET-et elssorban arra hasznljk, hogy adato kat olvassanak ki a kiszolglrl, anlkl, hogy o tt brmire hatssal lennnek. A p o s t ezzel szem ben jellem zen arra hasznlatos, hogy adatokat kldjenek a kiszolgl nak. ami utn a kiszolgl llapota ltalban valam ilyen mdon megvltozik a kapott adatok fggvnyben. ____
PO ST

A Webes krelmek k r tpusa, a GET s a POST szablyozza hogy az adatok bog kzlekednek a pa rancsfjlok kztt.

Arra hasznljk, ho^ s z o lg l n a k ,V ^

J r n m S i n vltozst b a n . pldul adatokat


G ET

^ i ^ f d a t b z i s b a . A v la sz ta n a d j * szr be egy FT_lel ellenttben a POS r visszaad hatok. A G - J ^ mVe le t n k ek relm ek csa k eg y s a bennk elk ld tt

Jellem zen olyan adatkinyersre hasznljk, ami nem vltoztat meg semmit a kiszolgln. Kis adatmennyisg esetn a GET arra is kiv lan megfelel, hogy kzvetlenl egy URL-ben kldjnk adatokat a kiszolglnak. A POSTtal ellenttben a GET elssorban kis m ennyi sg adat elkldsre alkalmas.

1 resztl hajthat vg , ! adatok (ugyancsak a maradnak

eltren) rejtve

Nincsenek

hlye krdsek

I C ! Tallkoztam olyan webes rlapokkal is, amelyek a G E T -e t hasznljk. Ezek hogyan mkdnek?
I Amikor w eb es rlapokrl van sz, mind a G ET-nek. mind a POST-nak m egvan a maga helye. A w eb es r

tol, semmit nem mdostva a kiszolgln. A GET teht az olyan rlapok esetben tkletes, am elyek inform cik krnek a kiszolgltl, s nem vltoztatjk m eg annak az l ^ l pott, pldul sorokat vlasztanak ki egy adatbzisbl. A POST ezzel szem ben az olyan krelm ekhez a legalkalma sabb. am elyek hatssal vannak a kiszolgl llapotra, p ld i egy IN SER T- vagy DELETE-lekrdezst indtanak, ami meg vltoztatja az adatbzist. Egy msik klnbsg a GET s a POST kztt, hogy a GET-en keresztl tadott adatok ltha tk az URL-ben. mg a POST-adatok rejtve maradnak, s e z l egy kicsit biztonsgosabbak.

lapok ltrehozsakor a < f o rm > elem m e th o d jellem zje ha trozza m eg az adatok elk ld snek m djt, m g az a c t i o n jellem z az adatokat fogad s feldolgoz parancsfjlt azo nostja: < fo rm m e th o d = " p o s t" a c t i o n - " a d d s c o r e .p h p " > Am ikor a felhasznl a Subm it gom bra kattint az rlap b e nyjtshoz. vgrehajtdik az a d d s c o r e . p h p parancsfjl, am ely m egkapja az rlapadatokat a $ _ P 0 S T tm bn keresz tl. A < f o r m > elem azonban ugyanilyen egyszeren gy is r hat, mely esetb en az adatok elk ld se a $_G E T tm bn k e resztl trtnik: < fo r r n m e t h o d - " g e t " a c tio n = " a d d s e o r e .p h p " >

Milyen jelentsge van ennek a klnbsgnek a g e t s a p o s t kztt, amikor egy URL-en keresztl adunk t adat:kat egy parancsfjlnak? 1
! Nos, elszr is csak egy G ET-krelem kpes URL-en keresztl adatokat tadni egy parancsfjlnak, teht eb-1

K V

! , szval nem szm t, hogy m elyik krelem m dszert - a G E Tet vagy a PO S T-O t - hasznlom?
Tveds, igenis szmt, s nem is kicsit. A GET-et ltal ban arra hasznljuk, hogy adatokat kapjunk a kiszolgl

ben az esetb en a POST azonnal kiesik. Tovbb, a GET-et hit zrlag olyan krelm ekhez szntk, am elyek nem vltoztat jk m eg a kiszolgl llapott, am ibl az kvetkezik, hogy nem szabad IN SE R T . DELETE FROM s hasonl, az adatba-] zist m dost utastsokat kiadnod egy olyan parancsfjlban am ely az URL-jn keresztl kap adatokat.

278 5. fejezet

F jlokban t ro lt a d a to k kezelse

Kandall melletti csevely


Ma esti vendgeink: GET s POST GET:
Azt csicseregtk a madarak, hogy azt terjeszted rlam, hogy csak arra vagyok j, hogy krdseket tegyek fel, de a vlaszokkal nem tudok mit kezdeni. Igaz ez? Nan. Nzz szem be a tnyekkel: nincs igazi hatal mad, csak krdezni tudsz a kiszolgltl. Rendben, az igaz, hogy nem arra szntak, hogy vltozst idzzek el a kiszolgln, pldul fjlokat trljek, vagy sorokat adjak egy adatbzishoz, de ez mg nem jelenti azt, hogy jelentktelen vagyok. Ha te mondod. n csak annyit mondok, hogy az olyanok nlkl, mint n, nem sok minden lenne elvgezve a kiszolgln. Ha a kiszolgl beleragadna egy adott llapotba, elg unalmas lenne a vilg. Igaz, de te meg hozz vagy ktve a cimbordhoz, Formhoz, n viszont csak fut ismeretsgben vagyok vele. Nekem vannak ms bartaim is, pldul URL. Azt hiszed, a barti krd ptolja a mveletekre va l kptelensget? Ersen ktlem. Akkor krdeznk tled valamit. Hogyan hajtasz vgre egy mveletet, ha a kis bartod, Form, nincs a kzelben? Tudod, Page nha nem rzi szksgt, hogy Form hoz forduljon. Na figyu, Form a bartom, s mg rgen meggrtem neki, hogy semmit nem csinlok nlkle. Lenzheted a hsgemet, de nem fogom elrulni a bartomat! Csigavr, haver. Csak arra szerettem volna rmutatni, hogy lehet, hogy csak olvasom az adatokat a kiszolgl rl. de elg rugalmas vagyok abban, hogy hogyan. Ezt elismerem, s nincs is vele semmi bajom. Ezt rmmel hallom. J volt beszlgetni veled ...

POST:

m o s t i t t vagy

279

a rem ovescore.php m kdse

A GET, a POST s a rekordok eltvoltsa


Ott tartunk, hogy a rekordok eltvoltsa a Guitar Wars alkalmazsban egy Remove hivatkozssal kezddik az Admin oldalon, amely kapcsolatot teremt a Remove Score parancsfjllal. Azt is tudjuk, hogy a rekord adatait a hivatkozs URL-jn keresztl ad hatjuk t a Remove Score parancsfjlnak. Azzal viszont van egy kis gond, hogy a GETkrelemnek nem szabad semmit sem megvltoztatnia a kiszolgln, pldul nem t rlhet egy rekordot. Erre az az egyik lehetsges megolds, hogy nem mdostunk semmit a kiszolgln...egyelre. Mi lenne, ha a Remove Score parancsfjl elszr egy jvhagyst kr oldalt jelentene meg, mieltt tnylegesen trlne egy rekordot az adatbzisbl?
H

G uitar Wars - Rekord

etvlts loa
B ztos, hogy t r l i a k a rja i n az a b re k o rd o t? lbi
Nv D tu m P o rtte z m Igen Nem Vl&eza a fe l g y e le t o ld a lra

& O Wm,.;:. 1 P -

---

Guitar Wars - Remove a High Score


Alt you suic you want to delete ihc fotlowmg higb M it?

Esy me9er'stflr oldal lehetv teszi


Name: Ashioo Simpscn
Date: 2008-04*23 09:13:34

felhasznlnak, hegy az azonnali trls helyett jvhagyja a rekord eltvoltst

Score: 368420 0 Ycs O No

rlubm it'
<<BackLadmfaLp

A jvhagy oldalon a trlsre kijellt rekord lthat egy egyszer Yes/N o r lapon. Ha a Yes-re kattintasz, akkor a Submit gom bot megnyomva trldik a rekord, mg ha a No-ra, akkor visszavonod a trlsi parancsot. GET-ekben s POST-okban gondolkodva, a Rem ove Score parancsfjl a jvha gy oldalt az Admin parancsfjltl rkez GET-krelemre vlaszolva jelenti meg. Mivel pedig maga a jvhagy oldal egy rlap, a benyjtsakor kiadhatja a sajt POST-krelmt. Am ennyiben az rlap nhivatkoz, ugyanaz a parancs fjl (a removescore.php) dolgozhatja fel a POST-krelmet, s hajthatja vgre a rekord trlst. Az eljrs lpsei a kvetkezk:

Teljes mrtkben le hetsges, s egyes esetekben hasznos is, ha egy parancsfjl GET- s POSTkrelmekre egyarnt kpes vlaszolni.

A felhasznl a Remove hivatkozsra kattint az Admin oldalon, ami egy GET-krelmen keresztl elindtja a Remove Score parancsfjlt. A Remove Score parancsfjl a $_GET tmbben trolt rekordadatokat fel hasznlva ltrehozza a trls jvhagyst kr rlapot. A Remove Score parancsfjl jra lefut, ezttal egy POST-krelem hatsra, amit a felhasznl a jvhagy rlap benyjtsval indt el. A Remove Score parancsfjl trli a rekordot az adatbzisbl, valamint a hoz z tartoz kpernyfelvtel kpfjljt a webkiszolglrl.

280 5. fejezet

F jlokban t ro lt a d a to k kezelse

Nzzk vgig a rekord eltvoltsnak folyaGuitar W - High .Scores Administration ars

matat lpsenknt

Guitar Wars - High Scares Administration


Below, is a list of ail Guitar Wars high scores. l/*c this page to reoovc score;, as needed

Ashton Simpson 2008-04-23 09:13:34 365420 B&Q0C Eddie VanflB 2008-04-23 09:06:35 345900 &aj&vs Belita Chevy 2008-04-24 08:02:11 282470 giQoy Phi/ Lairston 2008-04-24 08: ! 3:52 186580 EfllSiVj; Paco Jasiorius 2008-04-24 0802:11 127650 &w gv Nev Johansson 2008-04-24 0802:11 98430 BflDBK Kenny Laviu 2008-04-23 1409:50 64930 EOBDYC

A Remove Score parancsfjlt egy GET-krelem indtja el, s egy URL-en keresztl adja t a rekord adatait.

admin.php

$_GET

Ennek a rekordnak az eset ben nincs kpernyfelvtel.

A Remove score
parancsfjlt it t egy POST-krelem indtja el (ism t), s tadja a trlend rekordot.

Ez pontosan ugyanaz a parancsfjl, csak p pen mskpp reagl attl fiigg'en, hogy GET- vagy POST-krelmet kap-e.
Guit:v W - Bemove High Scor* ars

Guitar Wars - Remove a High Score


The high score o f 368420 fo r Ashton Simpson was successfully rem oved Back to admin onec

Ashton Simpson 36 420 retordpontszma sikeresen trlve.

A Remove Score parancsfjl trli a rekordot az adatbzisbl s a kpernyfelvtelt a webkiszolglrl.

m o s t i t t vagy

m g egy k is G El s POST

Nincsenek

hlye krdsek
K: Hogyan kpes ugyanaz a parancsfjl
feldolgozni?
get-

s POST-krelmeket is

V : Minden attl fgg, hogy miknt trtnik a parancsfjl m eg


hvsa. A Rem ove Score parancsfjl ktflekppen hvdik meg. Az els, hogy a felhasznl valamelyik Rem ove hivat kozsra kattint a felgyeleti oldalon, mely esetben egy URL vezet a parancsfjlhoz. Mivel az adatok az URL-be vannak csom agolva, ez egy* GET-krelemnek tekinthet. A GETkrelem hatsra a parancsfjl egy w ebes rlapot llt el, am elynek a m velete ugyancsak az emltett Remove Score parancsfjlra hivatkozik, gy aztn am ikor a felhasznl b e nyjtja az rlapot, a parancsfjl m sodszor is meghvdik. Az els alkalomtl eltren azonban ezttal nincs URL, am ibe bele lehetne csom agolni az adatokat, teht ez nem GET-krelem. A rekord adatainak tadsa ehelyett egy POST-krelmen keresztl trtnik, vagyis az adatok a $_POST tm bben rhetk el.

K i Teht a meghvs mdja dnti el, hogy a parancsfjl m it csinl?

V ! Igen! Amikor a parancsfjl egy URL-ben, GET-krelemknt

kap adatokat, akkor tudja, hogy egy jvhagy rlapot kell m egjelentenie, nem pedig trlnie valamit az adatbzisbl. A $_GET tm bben tadott adatokat teht csak a jvhagy oldalon hasznljuk fel, s nincs maradand hatsuk a ki szolglra. Ha azonban a parancsfjlhoz egy POST-krelmen keresztl rkeznek adatok, akkor a parancsfjl tudja, hogy trlheti az adatokat az adatbzisbl. Az adatok elrshez teht a $_POST tm bt hasznlja, s egy DELETE FROM lekrde zst llt el, ami trli a rekordot. Mivel pedig a legtbb re kordhoz kpernyfelvtel is tartozik a w ebkiszolgln, a parancsfjl ezt a kpfjlt is trli.

2 8 2 5. fejezet

F jlokban t ro lt a d a to k kezelse

A trlend rekord elklntse


5!ost, hogy a rekordok eltvoltsnak folyamatt tisztztuk, az adatbzis olda tra sszpontosthatunk. A Remove Score parancsfjl feladata, hogy eltvolt n egy nemkvnatos rekordot, ami egy sor trlst jelenti a pontszmok adatbzisbl. Ha mg em lkszel r, az SQL-ben a sorok trlsre a DELETE ROM utasts szolgl. Alihoz azonban, hogy trlhess egy sn, elszr meg kell tallnod. Ezt gy rheted el, hogy7 egy WHERE zradkot csatolsz a DELETE t?.OM utastst tartalmaz lekrdezshez. Az albbi SQL-lekrdezs pldul azt a sort trli, ahol a namc oszlopban az Ashton Simpson
DELETE FROM guitarwars W H E R E name = Ashton S i m p s o n 1

Ez a lekrdezs azo kat a sorokat trli, ahol a name oszlop ban az 'Ashton Simpson' rtk ll.

A tbla nevt meg kell adni a DELETE FROM-nak, hogy

guitarwars
2008-04-22 14:37:34 2008-04-22 21:27:54 2008-04-23 09:06:35 2008-04-23 09:12:53 2008-04-23 09:13:34 2008-04-23 14:09:50 2008-04-24 08:13:52 Paco Jastorius Nevil Johansson Eddie Vanilli Belita Chevy Ashton Simpson Kenny Lavitz Phiz lairston 127650 98430 345900 82470 368420 64930 186580

tudja, melyik tblbl akarsz adatokat trlni.

A trlend rekordot a felhasznl neve alap* jn keressk meg.

Ezzel a lekrdezssel azonban van egy kis gond. A millinyi gitrhs vilg ban komoly esly van r, hogy tbb Ashton Simpson is ltezik. A fenti lekr dezs gy nem csak egy sort, hanem az Ashton Simpson nevet tartalmaz sszes sort trlni fogja. A lekrdezsnek teht tbb informcira van szks ge ahhoz, hogy a m egfelel sort trlje:
DELETE FROM guitarwars WHERE name =

Ha a nv mellett a pontszmnak is egyeznie kell, a tr ls pontosabban meghatrozhat.


3 6 8 4 2 0

A s h t o n S i m p s o n A N D score =

guitarwars
ld
1 2 3 4 5 6 7

Az AND mvelet gy mdostja


SCD fC
127650 98430 345900 282470 X *< --------368420 r 64930 186580 phizsscore.gif

dote
2008-04-22 14:37:34 2008-04-22 21:27:54 2008-04-23 09:06:35 2008-04-23 09:12:53 2008-04-23 09:13:34 2008-04-23 14:09:50 2008-04-24 08:13:52

name
Paco Jastorius Nevil Johansson Eddie Vanilli Belita Chevy ^ Ashton Simpson Kenny Lav'rtz Phiz Lairston

sareemhot

a lekrdezst, hogy a nv mellett a pontszmnak is egyeznie kell.

Most, hogy a nvnek s a pontszm nak is egyeznie kell, drmaian csk ken az eslye annak, hogy vletlenl tbb rekordot is trlsz.
m ost rtt vagy >

283

a t rl s korltozsa

A trls szablyozsa a LIMIT zradkkal


Az, hogy a trlend sor kijellsre a name s a score oszlopot is haszn lod, j ...d e nem elg. Az alkalmazsfejleszts a kockzatok cskkentsrl szl, s mg mindig van r halvny esly, hogy tbb olyan sor is trldik, amelyben az adott nv s pontszm szerepel. A megolds az, hogy knysze rtjk a lekrdezst, hogy mindenkppen csak egy sort trljn. Erre a l i m i t zradk szolgl:

A maximlis bizton sg rdekben korl tozzuk a trlhet' sorok szmt.

DELETE FROM guitarwars WHERE name =

'Ashton S i m p s o n ' AND score =

'368420'

LIMIT 1

A L I M I T kulcsszt kvet szm tudatja a MySQL-lel, hogy legfeljebb hny sor trlhet - ebben az esetben egy. gy teht garantlt, hogy soha nem t rlsz egynl tbb sort ezzel a lekrdezssel. De mi trtnik, ha kt Ashton Simpson van az adatbzisban azonos pontszmmal? Ez persze valszntlen, de ha egy alkalmazst a lehet legjobban szeretnl megtervezni, akkor rde mes megvizsglnod a valszntlen forgatknyveket is.

guitarwars
name score streenshot

2008-04-22 14:37:34 2008-04-22 2 1 :27:54 2008-04-23 0 9 :0 6 :3 5

Paco Jastorius N evil Johansson Eddie Vanilli Belita Chevy

127650 98430 345900 282470 368420 64930 18 6 58 0

2008-04-23 0 9 :1 3 :3 4

Ashton Simpson Kenny Lavitz

2008-04-24 0 8 :1 3 :5 2

Phiz Lairston

Ashton Simpson

368420

ashtonsscore.jpg

A DELETE lekre z snknek gondot jelent ha kt sorban is ponto san ugyanaz a nv I pontszam szerepel. |

rd le, hogy mi trtnik ezzel a tblval a fenti DELETE utasta vgrehajtsakor! Hogyan lehetne biztostani, hogy a megfelel: Ashton Simpson rekordja trldjn?

284 5 . fejezet

F jlokban t ro lt adatok kezelse

Nem lenne jo b b a rekord a z o n o s t j t h a szn ln i a DELETE FR O M -lekrdezs WHERE z ra d k b a n ? A k k o r b iz to s a m egfe leld re k o rd o t t r ln n k , nem?

De igen! A rekord azonostjval tkletesen el lehet klnteni a trlend rekordot.


A tblkhoz ltrehozott elsdleges kulcsoknak az egyedisg az egyik f el

nye. A guitarwars tblban az id oszlop az elsdleges kulcs, am elynek az rtke minden rekord esetben egyedi. Ha ezt az oszlopot hasznlod a DELETE FROM-lekrdezs WHERE zradkban, minden ktsget eloszlat hatsz afell, hogy melyik rekord fog trldni. m e az j lekrdezs, amely az egyedisget az id oszlop segtsgvel biztostja:

DELETE FROM guitarwars WHERE id = 5

Ha az id oszlop valban elsdleges kulcs, ez a kd biztosan csak egyetlen sort fog trlni. De mi a helyzet akkor, ha nem te hoztad ltre az adatbzist, s az egyedisget nem biztostottk m egfelelen? Ebben az esetben tovbbra is hasznt veheted a LIMIT zradknak. Ha ugyanis azt szeretnd, hogy egy lekrdezs csak egyetlen sorra legyen hatssal, akkor ezt ki is mondhatod:

Ha az elsdleges kulcs lapjn tr/sz adatokat,


pontosabban klntheted el a trlend sorokat.

DELETE FROM guitarwars WHERE id = 5 LIMIT 1

Soha nem rt, ha nagyon pontosan hatrozod meg, hogy mit vrsz el egy lekrdezstl, s ebben az esetben a LIMIT nveli a DELETE-lekrdezs pontossgt.

A LIMIT zradk hatrozottan ar ra utastja a lekrdezst, hogy ne trljn egynl tbb sort.

m o s t rtt vagy >

285

a rem ovescore.php p a ra n c s f jl vglegestse

PHP- s MySQL-mgnesek
t e S Z ; , H h ' P par ' sf'' ml r k . * m g nhny fontos k d r sz l hinyzik l ,:; T inyZO t ,' ? " ' T eSek " S t e g v d . hogy a Guitar Wars alkalmazs Kcpei> legyen torolni a nemkivanatos rekordokat!
Chtmi xralns="http: //www.w3.org/1999/xhtmi" xml:iang-"en" lang-"en"> <head> <meta http-equiv="Content-Type" content-"text/html; charset=utf-8"/> <titie>Guitar Wars - Remove a High Score</titIe> <li.nlc rei="stylesheet" type="text/css" href="style.css" /> </head> <body> <h2>Guitar Wars - Remove a High Score</h2> <?php ('appvars.php'); ('connectvars.php'>; if (isset ($ GET[1id']) & , Isset ($_GET['date']) && isset($_GET['name']) && S isset ($ GET['score'] && isset($_GET[ ) ])) (

// A pontszmok kinyerse a GET tmbbl


$id = $_GET['id']; $dat:e = $_GET('date']; $name = $_GET['name']; Sscore = $ G E T ['score']; - $ G ET[ ];

else 1 1 (isset (S POSTpid'])

&& isset ($_P0ST ['narae ]) && isset ($_?OST [' score ' 1)) (

// A pontszmok kinyerse a POST tmbbl


= $ post $name = POST['name 1]; Sscore = $ POST['score' ] ];

if (isset ($ POST['submit1])) if ($ POST['confirm']

// A kpernyfelvtel trlse a kiszolglrl


0unlink(GW_UPLOADPATH . $screenshot);

// Csatlakozs az adatbzishoz
$dbc mysqli connect (DB_H0STr DBJJSER, DB_PASSW0RD, DB_NAME) ; =

F jlokban t ro lt a d a to k kezelse

guitarwars WHERE mysqli_query($dbc, $query) mysqli_close($dbc);

LIMIT

// A mvelet sikernek megerstse a felhasznl szmra


echo *<p>The high score of ' . Sscore . ' for ' . $narce . ' was successfully removed

isset (Sscore) &s isset(Sscreenshot)) ( echo '<p>Are you sure you want to delete the following high score?</p>; echo '<pxstrong>Name: </strong>' . $nanie . <br /><strong>Date: </strong>' . Sdace *<br /><strong>Score: </strong>' . Sscore . '</p>'; echo '<forrc method="post" action^"removescore.php">' ; echo '<input type="radio" name="confirm" value="Yes" /> Yes ' ; echo '<input type="radio" name"confirm" value="No" checced="checkec" /> No <br />* echo '<input type="subn;it:" value="Subrnit" name="submit" />'; cinput type*"hidden" name hidden" name="name" valuehidden" name="sccre" value

</body> </htmi>

from

m o s t i t t vagy

287

a ksz rem ovescore.php p a ra n csf jl

PHP- s MySQL-mgnesek
A removescore.php parancsfjl mr majdnem ksz, de mg nhny fontos kdrszlet hiny zik belle. Ptold a hinyz kdokat a htmgnesek segtsgvel, hogy a Guitar Wars alkal mazs kpes legyen trlni a nemkvnatos rekordokat!
< h tm l x m ln s - " h t t p : / / w w w . w 3 .o r g /1 9 9 9 /x h tm l" x m l:la n g = e n " la n g = " e n " >
<head>

cneta http-equiv~"Content-Type" content"text/htil; charset-utf-8'/>


<title>Guitar Wars - Remove a High Score</tii:le> < Link rel-"st:ylesheet" t:ype="text/css" href="style.ess" />

</head>

< b od y>

r.0<r/ h 2 > <h2>Gmtar Wars - Remove a High Scoce</h2>

A megosztott adatokat tartalmaz parancsfj* ... lk beemelese, mgpedig a require_once se gtsgvel, mert ezek az adatok ltfontossg ak a rekordok eltvoltshoz.

require_once 1( 'appvars.php');

f c jt

. . .

s s e t ( $ _ G E T { * narce' ] )

/ / A pontszmok kinyerse a GET tmbbl


$id ~ $_GET[*id']; $date = $_GT['date];

A parancsfjl ms-ms mdon re gl, attl fggen, hogy a bejv krelem GET vagy POST-e.

$name
$score

= $_G ET[*

name' ] ;

= $ GET[ ' s c o r e ' ] ;

Snam e -= $ F O S T [ ' n a m e ] ; S s c o r e = 5 _ P O S T [ 1s c o r e ' )

Ezzel a parancsfjllal br
it ( i s s j? f ( $ _ P 0 S T [ ' s u b m i t , 3 ) )
Lf /$ POSTIf c o n f i r m ' ] = (

melyik rekord trlhet, ezrt az eltvolts rsze knt a fe lt lt tt kpfjlt is trlni kell.

K A kpernyfelvtel trlse a kiszolglrl


@ unlink(G W _U P LC A D P A T H . $screenshot); ^

// Csatlakozs az adatbzishoz
$ d b c = m y s q l i _ c c > n n e c t <DB_HCST, DB_USER, DB PASSWORD, D B_N A M E );

Fjlokban t ro lt a d a to k kezelse

A DELETE-lekrdezs az id oszlop alapjn ke res egyezst, mgpedig a LIMIT zradknak megfelelen egyetlen sort.

// A rekord trlse az adatbzisbl


$ query = "

D ELETE

FROM

fcfcguitarwars WHERE

mysqli quecy($dbc, $query); mysqli close($dbc);

// A mvelet sikernek megerstse a felhasznl szmra


echo f<p>The high score o ' . $score . * for ' - $name . ' was successfully removed.';

)
eise ( echo '<p class=error">The high score was not removed.</p>1;

1
else if (isset( && isset(

isset($score) &S isset($screenshot)) { echo <p>Are you sure you want to delete the following h^gh score?</p>1; Sdate echo '<pxscrong>Name: </strong>' . Sname . '<br /><strong>Date: </strong>' '<br /><strong>Score: </strcng>' . $score . </p>'; echo '<form method="post" action^"removescore.php"> echo 'cinput type=radio name-con firm No <br /> echo 'cinput type-=radio name=confirm va echo '<input type=submit value"Submit" naAe~submit echo '<input type="hidden name= echo '<input type-hidden" name=name value-"' echo '<input type=hidden name=score value echo '</form>'; name . score

>&lti &lt; Back to admin page</a*</p>

</body> </html>

Ez a hivatkozs visszavisz az Admin oldalra, hogy knnyebb legyen naviglni. A rekord adatait nhny rejtett urlapmez trolja, hogy a POSTkrelem rszeknt el lehessen kldeni azokat.
m elyeket az

removescore.php j vltozt,
____a z o k a t az a d a to k a t is m e ll k e ln ,

URL le k rd e z k a ra k te rl n

cn k e re s z t l, G E T -k re le m k n t ta d tu n k , s m i b iz to s ta n i s ze re tn n k , hogy ez az rla p G E T -a d a to k a t ne, csa k P O S T -a d a to ka t a d jo n t.

A jvhagy rlap csak akkor jelenik meg, ha ezek kzl a rekordvlto zk kzl mindegyiket belltottk.

Nhny mgnes megmaradt.

m o st i t t vagy >

289

te szte ld a vgleges g u ita r w a rs alkalm a zst!

Tesztt
Add hozz a Remove Score s Admin parancsfjlokat a Guitar Wars alkalmazshoz, hogy kpes legyen rekordokat eltvoltani!
Hozz ltre kt j szvegfjlt removescore.php s admin.php nven, s helyezd el bennk az imnt kidolgozott kdot. Tltsd fel az j parancsfjlokat a webkiszolglra, s nyisd meg az Admin parancsfjlt a webbngszdben. Kattints annak a rekordnak a Remove hivatkozsra, amelyiktl meg szeretnl szabadulni, majd erstsd meg a trlst a Remove Score oldalon. Az Admin oldal ra visszatrve ellenrizd, hogy valban trldtt-e a rekord, majd ugorj a Guitar Wars foldalra (index.php), hogy ott is lsd a vltozst. oocb
liritv War, - High Sor*, Adminkir^th*.
H W W M

XtTJl
C u ila r W n - Remove a H ig h Scot*

A M

KM , Airtj ^ Me*

wnaittn Kurn^. ,^ v tu;-.

W . 1 QWH KHOeIfn. -

O a

\*ar: A trv ltfirttM Or yp >5

(BBH a M M H I i i i Guitar W - Rem aHl&hScor ars ove

A nemkvnatos re kordok kivlasztsi nak megerstsrt s a rekordok trl srl egyarnt az j Remove Score olrf gondoskodik.

Az j Admin oldal hi vatkozsokat biztost a meg nem erstett rekordok trlsre.

Ebben a v ro s b a n csa k egy c s c s ro c k e r s z m ra van hely, 5 az n vagyok!

A Guitar W/ars ftfdala most mr cm* megerstett rekor dokat mutat.

Little Jacob, a gitr hs csodagyerek

Az igazi gitrh'sk most mr boldogok lehetnek, mert az oldalon csak megerstett rekordok tallhatk.

G o la r W a r* - liig b Seo m ,

.c*

tailiA^crvt

iy/40

Top Score: 389740

* * * ; Jrt V . n l > w v

D*s2 0 .iV?>*r nr* 4

C u i t ar
OB.lU UI'yG S c o re : 3- MS
Nas

186*80

M A aU dM ltod fOkiJ-JJ

Gu i t ar
dnei P2 WJ tv --..

A kpernyfelvtel nlkli, meg nem erstett rekordokat eltvoltottak.

290 5. fejezet

F jlokban t ro lt a d a to k kezelse

PHP & MySQL keresztrejtvny


Unod a kpfjlok feltltgetst? Akkor tltsd fel tudssal ennek a keresztrejtvny nek a mezit!

Vzszintes
I. Az < input> elem type jellem zjnek ezt az rtket kell adnod, hogy fjlfeltlt rlapmezi hozz ltre. 4. Az alkalmazsok feltlttt kpeit ltalban j tlet egy ilyen nev mappban trolni. 8. Ezzel az SQL-utastssal mdosthatod egy7 tbla szer kezett. 10. Ezzel az SQL-utastssal a kvnt sorrendbe rendez heted egy lekrdezs eredmnyt. I I . A feltlttt fjlokkal kapcsolatos informcik a $ _ ... szupergloblis vltozban troldnak. 12. Ezzel a PHP-utastssal kdot szrhatsz be egy m sik paranesi aj 1 l. b 13. Az jonnan feltlttt fjlokkal ezt rdem es csinlni (angolul).

Fggleges
2. Ha azt szeretnd, hogy egy DELETE FROM utasts ne t rljn egynl tbb sort, ezt az SQL-utastst hasznlhatod. 3. Az rlapon keresztl feltlttt fjlok egy ilyen map pba kerlnek a webkiszolgln (angolul). 5. Egy' tbla mdostsakor ezzel az SQL-paranccsal j oszlopot hozhatsz ltre. 6. Ezzel a PHP-utastssal egy llandt hozhatsz ltre. 7. A beem elt fjlok segtsgvel ezt teheted az adatok kal tbb parancsfjl kztt (angolul). 9. Ezt az SQL-utastst egy' msik utasts rszeknt hasznljk, s arra szolgl, hogy cskken sorrendbe rendezze egy lekrdezs eredmnyt.
m ost it t vagy

291

PHP b MySQL keresztrejtvny

- m egolds

PHP & MySQL keresztrejtvny - megolds

F
.if i'iMis r<

I %

A
;'/-v < -'-:- :-' --/ .... 'Ay,y%.y,v. -:-y -v f*?<r #: v.v

E M
V-V
tf

P 0

*w
:-x-X v.v

.yyS.-/'

::>:':x:x -v,-;; > :> V ''//S. // A //> '

. v ..

- ' ':S : vX Ills :# : &>' \


* '< :< V -y

E F

.V, -

c
# ^ '<<>,!? ** #. . v > -XvX. . .
:

E L
-

*
:

L
;

N V E

;> v >

N
'

E _w f .-. f

>"-:: . .

>

--

:"

: ' : .

vr, V .v,

.:

|r

iS flk

f l

is P i

M i l l i J B r l* ^ * i f li a p * ^ g

292 5. fejezet

Fjlokban t ro lt a d a to k kezelse

PHP & MySQL szerszmoslda


Fogadd virtulis elismersnk! Nem csak a vir tulis gitrosok ldjk a nevedet szerte a vil gon, hanem a PHP- s MySQL-tudsodat is je lentsen bvtetted: a tblk szerkezetnek m dostsval, a fjlfeltlts kezelsvel, az adatok sorrendjnek szablyozsval, illetve az adatok eltvoltsval.
Ebben a mappban knyelmesen trolhatod egy alkalmazs kpeit, belertve azokat is, amelyeket a felhasznlk tltttek fel.

COLtTfcO*

include, require,

include_once require_once

Ezek a PHP-utastsok lehet v teszik, hogyTkdot ossz meg egy alkalmazs tbb pa rancsfjlja kztt, amivel elk e rlhet a kdismtls, s a kd knnyebben karbantarthatv vlik.

DELETE FROM tbla WHERE oszlop =

kereset t_oszlop LIMIT szm 14 . 1 M Ezzel az SQL-utastssal egy sort trlhetsz egy* adatbzis-tblbl. A trls pontosabb szablyozs hoz tbb rtket is megadhatsz a WHERE zradkban (ezt gyak ran rdemes is megtenned), nem beszlve arrl, hogy a trlst egyetlen sorra korltozhatod.

m o st i t t vagy

293

6 Az alkalmazs biztonsgoss' ttele

Vedd gy, hogy m indenki rd vadszik


E gy ki m s z s , a telefon drtok tk t s e , e ez p o rf sze k k is v ro s s o s e j n r, y honnan j t t a c sa p s.

A szleid igazat mondtak: ne llj szba idegenekkel!


Vagy legalbbis ne bzz bennk. Ha pedig minden ktl szakad, akkor se adj nekik kulcsot az alkalma zsaicl adataihoz, abban bzva, hogy nem lnek vissza vele. A vilg kegyetlen, s nem bzhatsz abban, hogy minden ki becsletes. W ebalkalmazs-fejlesztknt valjban rszben cinikusnak kell lenned, rszben olyasvalakinek, aki hisz az sszeeskvs-elm letekben. Igen, az em berek tbbsge rossz, s valban rd feni a fogt! Na j, lehet, hogy egy kicsit tloztunk, de nagyon fontos, hogy komolyan vedd a biztonsgot, s az alkalmazsaidat gy tervezd meg, hogy vdve legyenek brki vel szem ben, aki rtani akar nekik.

ez egy u j fejezet

295

a g u ita r w ars o ld a lt fe lt rt k

A nap, amikor meghalt a zene


*

O jaj, a virtulis rock csodagyereknek tndklse a rivaldafnyben krszlet nek bizonyult, ugyanis Ja co b Guitar Wars-rekordja eltnt, minden ms rekorddal egytt. gy tnik, valamilyen rdgi er munkl a httrben, hogy tnkretegye az alkalmazst, s megakadlyozza a gitrhsk versengsi. A boldogtalan virtu lis gitrosok boldogtalan felhasznlk lesznek, s ez csak egy boldogtalan alkalma zsfejlesztt eredmnyezhet - konkrtan rlad van s z ...

a 00

Cuitar Wars

High S to r e s _____

y.

Guitar Wars - High Scores


W elcom e. G uitar W am or. do you have w hai 1 takes 10 crack the high score lifl? I f so. ju st

Jacob, a Guitar V/ars rekord-^ tartja dhs, mert eltnt a pontszma a rekordlistrl.

Jacob vlasztott zenei fegyvere, egy eredeti 2005 Eradicaster.

296 6. fejezet

Az alkalm azs biztonsgoss ttele

Hov tntek a rekordok?


Tudjuk, hogy a Guitar Wars foldala res, de ez azt jelenti, hogy az adatbzis is az? Erre a krdsre egy SELECT-lekrdezs adhat vlaszt:
H Htfit Wirdow Help l6Was9 fe

Egy SE LECT-lekrdezs felfedi, hogy a guitarwars tbla teljesen res - minden rekord eltnt!

mysql> SELECT

ERM

Valamilyen okbl kifolylag az sszes rekord adatai trldtek a Guitar Wars adatabzisbl. Lehetsges, hogy valaki arra hasznlja a Remove Score parancsfjlt, hogy' gonoszsgot mveljen? Meg kell vdennk a rekordokat!

Hegyezd ki a ceruzd!
Karikzd be, hogy a kvetkez mdszerek kzl melyik lenne al kalmas arra, hogy megvedd a Guitar Wars rekordjait a m egkesere dett virtulisgitr-gyllktl, s rd le azt is, hogy mirt!

Az Admin oldal levdse egy jelszval, hogy csak a jelszt ismer szemly (vagyis te) tudjon rekordokat trlni.

Az Admin oldalhoz hozzfrni prbl szmtgp 1* | IP-cmnek ellenrzse, s csak bizonyos cmek (a tid) tengedse.

Felhasznl-rgzt rendszer ltrehozsa, amelyben A A rekordtrlsi kpessg teljes eltvoltsa az alcsak bizonyos felhasznlk (te) kapnak felgyeleti jo- j kalmazsbl. gokat.

m o s t i t t vagy

297

a g u ita r w ars re ko rd ja in a k vdelm e

Hegyezd ki a ceruzd! ^ Megolds


Karikzd be, hogy a kvetkez mdszerek kzl melyik lenne alkalmas arra, hogy megvdd a Guitar Wars rekordjait a m egkeseredett virtulisgitr-gyllktl, s rd le azt is, hogy mirt!

Az Admin oldal levdse egy jelszval, hogy csak a jelszt ismer szemly (vagyis te) tud jon rekordokat trlni.

Mindegyik mdszert be lehet karikzni, mert a problmt mindegyik megoldja, br egye sek jobban kivitelezhet^ m soknl

Az Admin oldal levdse e<jy jelszval megfelelen egyszer s gyors md szer. Nem tl bonyolult, s gyorsan biztonsgoss teszi a .webhelyet.

Felhasznl-rgzt rendszer ltrehozsa, amelyben csak bizonyos felhasznlk (te) kap nak felgyeleti jogokat.

.A felhasznlkat, rgzt, rendszer ltrehozsa. . . felgyeleti, jogokkal kitn megolds, de.jelents tervezst, s.sok. kdot ignyel mrpedig a.git.rAz Admin oldalhoz hozzfrni prbl szmtgp IP-cmnek ellenrzse, s csak bi zonyos cmek (a tid) tengedse.

. hsknek, most. keli .biztonsgot .nyjtanod!.........

Az. I.P-cm.ellenrzse mkdkpes megolds, de a .webhelyet fggv teszi, a szmtgped. I P-ef mtl,. . ami megvltozhat,............................
A rekordtrlsi kpessg teljes az alkalmazsbl.

A szolgltats teljes eltvoltsa az adott probl mt termszetesen megoldja, de ha mg emlk szel r, a ,tr|si kpessget azrt adtuk eredeti leg az alkalmazshoz az elz fejezetben, hogy a webhely knnyebben karbantarthat legyen.

298 6. fejezet

A z alkalm azs biztonsgoss tte le

Kerts a vad hordk ellen


Az egyik mdszer arra, hogy a Guitar Wars rekordjait gyorsan s egyszer en biztonsgoss tedd, az Admin oldal jelszavas vdelme HTTP-hitelests segtsgvel. Ez a megolds valjban egy felhasznlnevet s egy jelszt ignyel, de a lnyeg az, hogy valamilyen titkos informcit kvetelsz meg i felhasznltl, mieltt hozzfrst adnl az alkalmazs tiltott elemeihez, pldul a rekordokat eltvolt hivatkozsokhoz.

A HTTP-hitelests egy szer mdot ad egy ol dal biztonsgoss tte lre a PHP segtsgvel.

Amikor egy oldalt HTTP-hitelests vd, egy ablak ugrik el. amely a fel hasznl nevt s jelszavt kri, mieltt hozzfrhetne a vdett oldalhoz. A Guitar Wars esetben olyan kevs em berre korltozhatod az Admin ol dal elrst, amilyen kevsre csak szeretnd - akr csak magadra!

A HTTP-hitelestsi ablak kertst emel a felhasznlk s a felgyeleti oldal kz.

Ne bzz ebben a m o solyban!

Az adatbzisban lev rekordok most mr vdelem alatt llnak, mivel az Admin oldal vdett.
g u ita r w a r s
M

1g

m a* SoUlo Ch+vy Jooob Soore ta n oo

S 0T9 C 282470 389740 98430 127650 186580 64930 243360

crM fifta be&auoor*.gif jaioobioorr 0^ nriloo< grf pooouoor ^ pKtscorm-grf knnyucor. 91! l^cnpojlisoo'

u
15

200BX>W)1 20 36 07 2008*05-01 20:3645 2006-0501 20:37 02 2006-0501 20 3723 20060501 20:3740 2006-C601 2fr38 00 20064)501 20:3823

Az Admin oldalon tallhat Remove hivatkozsokat csak a Guitar Wars rend szergazdja rheti el.
i Gui r VV,. High s,*,i Administration ____ BiGittrWmWcitcm t*

16
17 18 19

bi+rH JoKontion
Pooo Jm ionus Pktx Lain>on

sin*/

Konfrf Lav
Jon PbuJ Jon*s

20

!*> 6 *

m o s t i t t vagy

299

a h ttp -h ite le s it s hasznlata

A Guitar Wars felgyeleti oldalnak vdelme


A HTTP-hitelests gy mkdik: amikor egy felhasznl egy hitelestssel vdett oldalhoz, pldul az Admin oldalunkhoz prbl hozzfrni, egy ablak jelenik meg, ami a felhasznlnevt s a jelszavt kri.

A webbngsz' egy ilyen ablakot jelent meg, ami a felhasznlnevet s a jelszt kri, mieltt engedlyezn a vdett oldal elrst.
To view this page, you need to log n to area G uitar Wars* on www gu.tarwars.net
Y o u r pa*vwoC wii> b e ie n t *n tn e ciear

A PHP-ben ez a szupergloblis vl toz trolja a hitelestsi ablakba bert felhasznlnevet. \


' $ SERVER['PHP AUTH USER']

$ SERVER ['PHP A U T H P W ]

Az egyszersg kedvrt a jelsz itt nem titkostott.

t
z a vltoz trolja a hitele

stsi ablakba bert jelszt.

A PHP a felhasznl ltal bert felhasznlnv s jelsz elrsben jtszik szere pet. Ezek a $_SERVER szupergloblis tmbben troldnak, ami hasonlan mk dik, mint az eddig megismert szupergloblisok ($_POST, $_FILES stb.) Egy PHPparancsfjllal megvizsglhatod a bert felhasznlnevet s jelszt, s eldntheted, hogy a felhasznlnak m egengeded-e a vdett oldal elrst. Tegyk fel, hogy csak akkor engedlyezzk az Admin oldal elrst, ha a felhasznlnv rock, a jelsz pedig roll". Az Admin oldal elrse eszerint gy zajlik:

Az Admin oldal csak akkor t el, ha a megfelel' felh lnevet s jelszt adtk m

G u lttr W ars. H r , .Score A dm inistr-


mms i

aoowu>tXM07 a,* ^
JltttUtftf a-**,

otcuHavnu

^ S E R V E R [ PHP_AUTH_PW 1]

***01.1 0 **4*1 j, 7}

*73313)630Blnlcw

|ft|| |

2X.0-0I MOObttH Buxtl-

$ SERVER[ PHP_AUTH_USER1]

300 6. fejezet

A z alkalm azs biztonsgoss tte le

Nincsenek

hlye krdsek
I C l Tnyleg biztonsgos a HTTP-hitelests?

V ! Igen. Vagy nem. Attl ftigg, hogy milyen biztonsgot szeretnl elrni. Semmi sem szz

szzalkig biztonsgos, ezrt mindig csak bizonyos fok biztonsgrl beszlhetnk. A Guitar Wars rekordjait a 1111 ^-hitelests elg jl vdi, de ha a vdelmet fokozni sze retnd, titkosthatod is a jelszt. Ugyanakkor a HTTP-hitelests egy rzkenyebb, pl dul pnzgyi adatokkal dolgoz alkalmazs esetben mr nem biztos, hogy elegend.

I C l Mi trtnik, ha helytelen felhasznlnevet vagy jelszt rnak be?

V ! A bngsz kisebb elektrosokkot bocst ki az egren keresztl. Nehogy komolyan

vedd, a bntets messze nem ilyen kemny. ltalban egy zenet jelenik meg, ami tudatja a felhasznlval, hogy olyan vdett oldalt prbl elrni, amihez - gy tnik semmi kze. Vgssoron tled fgg, hogy az zenet mennyire szigor.

I C l A HTTP-hitelestshez mindenkppen szksges felhasznlnv s jelsz is? Mi van, ha n csak jelszt szeretnk hasznlni?

V ! Nem ktelez felhasznlnevet s jelszt is megkvetelni. Ha csak jelszt akarsz


krni, ellenrizd csak a $_SERVER [ ' P H P _A U T H _P W ' ] globlis vltozt. (Az eml tett vltoz ellenrzsrl hamarosan bvebben is szt ejt n k ...)

i Pontosan hogyan vdhetnk meg egy oldalt HTTP-hitelestssel? Meg kell hvni egy PHPfggvnyt?
keresztl a bngsz s a kiszolgl kztt. A fejlcek a rvid zenetvlts eszkze inek tekinthetk a bngsz s a kiszolgl kztt - elg gyakran hasznljk is ket trsalgsra a PHP-n kvl. Ugyanakkor a PHP is lehetv teszi a fejlcek kldst, s pontosan gy mkdik a HTTP-hitelests. A fejlcekkel s a PHP segtsgvel vgre hajtott HTTP-hitelestsben jtszott szerepkkel bvebben is foglalkozunk majd.

V ! Igen. A HTTP-hitelestshez kommunikcis csatornt kell nyitni I-HT P-fejlceken

Agytorna
Szerinted mikor clszer az Admin oldal hitelestst elvgezni?

m o s t i t t vagy

301

h ite lests s fejlcek

A HTTP-hitelests fejlceket ignyel


A HTTP-hitelests mgtti alaptlet az, hogy a kiszolgl visszatartja a vdett weboldalt, s arra kri a bngszt, hogy krje el a felhasznltl a telhasznlnevt s a jelszavt. Ha a felhasznl ezeket helyesen adja meg, a bngsz tovbblp, s megjelenti az oldalt. A bngsz s a kiszolgl kztti prbeszd fejlceken keresztl trtnik, amelyek rvid szveges ze netek, konkrt utastsokkal arra nzve, hogy a krelem mire irnyul. Fejlcek hasznlatra valjban minden alkalommal sor kerl, amikor m egte kintesz egy weboldalt, nem csak akkor, ha hitelests szksges. Lssuk, hogyan kzbest egy szokvnyos, nem vdett weboldalt a kiszolgl a bngsznek a fejlcek segtsgvel: r

Minden weboldal kzbesrtse fejlcek segtsqvel trtnik,


^

W ebkiszolgalo
i "Tz 1J M p l

A bngsz egy oldalt kr a kiszolgltl. Ehhez elkld nhny fejlcet, amelyek azonostjk a krt fjlt s a kiszolgl llmsnevt. s

Ezekbl a fejlcekbl ll egy weboldalra irnyul krelem.

______

X lE ^E iE T ! L >

% r A kiszolgl fejlcekkel vlaszol- amelyeket a krt oldal kvet.

B I
, ,))

index.php

Ezek a fejlcek alkotjk a weboldal-krelemre adott vlaszt.

(uitar Wan *HighS och ct


Tot Score: 389740

Ugyflbngsz

Zi.ore*
Nmk rv* L i nr. 3 -1 1 *1 C#A 5 ^
1S65ts

A bngsz megkapja a fejlceket s az oldalt, s lekpezi az oldal HTML-kdjt.

Vgeredmnyben a fej lcek segtenek a krt oldalt sikeresen kzbe steni a bngsznek.

302 6. fejezet

Az alkalm azs biztonsgoss ttele

Mikroszkp alatt:
a fejlcek
A fejlcek szablyozzk, hogy pontosan milyen informcikat cserljen s hogyan a w ebbn gsz s a webkiszolgl. Egy fejlc ltalban egy nv-rtk prbl ll, amely egy adott infor mcit azonost, pldul a weboldal tartalomtpust (HTML). A kiszolgl fejlcek egy adott csoportjt kapja meg, amikor egy weboldalt krnek tle, a bngsznek adott vlasz rszeknt pedig egy msik fejlccsoport elkldsre kerl sor. Nzzk meg kzelebbrl ezeket a fejlc gyjtemnyeket, hogy lssuk, pontosan mit is kld el az gyfl s a kiszolgl, amikor trsa lognak egymssal:

A legtbb fejlc egy ket tsponttal elvlasztott nv-rtk prbl ll. Ez a fejlc azonost ja a krelmet kiad bngszt.

Az els fejlc nem nv-rtk pr, hanem az oldalra ir nyul GET-krelem.

Az els' fejlc a kiszolgl HTTP-vlasza.

Ez 3 ^ i l c rulja el a bngsznek, hogy a tartalom HTMW iJbl ll, nem


pedig - m o nd ju k - sima szvegbl.

Az oldal H U a r { a ma kzvetlenl a fejlecek utn fkeZ,k'

index.php

A fejlcek azrt fontosak a Guitar Wars esetben, mert a segtsgkkel megszakthatod az olda lak kzbestst a kiszolgltl, hogy elbb felhasznlnevet s jelszt krj a felhasznlktl. Ms szavakkal, a kiszolgltl rkez fejlceket kell mdostanod, hogy HTTP-hitelestssel vdj meg egy oldalt.

most i t t vagy 303

in te rj egy fe jl cce l

Fejlcek - lehull a lepel Heti interjnk: Fejlcek: mire ez a nagy felhajts?


Agyhullm: gy tnik, n elg nagy figyelmet kap,
amikor weboldalak hitelestsrl van sz. Megalapo zott ez a figyelem, vagy csak tizent percnyi virtulis hrnvre vgyik?

Fejlc: Pontosan errl van sz. A bngsz gy mondja


meg a kiszolglnak, hogy mit akar, hogy a krelmet fejlcekbe csomagolja s elkldi.

Agyhullm: rdekes. De gy hallottam, hogy a kiszolg


lk is tudnak fejlceket kldeni. n azt hittem, hogy a kiszolglk csak weboldalakat adnak vissza. Nem gy van?

Fejlc: Term szetesen megalapozott. Egszen biztosra

veheti, hogy minden egyes weboldal kzbestsben szerepet jtszom, ami csak ltezik. gy is mondhat nnk, hogy a Vilghl nlklem nem is mkdne. J Fejlc: J krds. n ugyanolyan fontos vagyok a kom val tovbb itt leszek tizent percnl, mg akkor is. ha munikci msik oldaln is, mert a kiszolgl nem jrszt nem ismerik el kellkppen a munkmat. csak annyit tesz, hogy rnti a krt tartalmat a bng szre. A bngsznek fogalma sem lenne, hogy mit Agyhullm: Pontosan mi is a munkja? csinljon vele, ha nem tudna egy kicsit tbbet. Fejlc: Meg kell rtenie, hogy a w ebbngszk s a wrebkiszolglk nem em berek, ezrt nem hvhatjk fel csak gy egymst telefonon, vagy kldhetnek egy msnak SMS-t.

Agyhullm: Pldul mit? Fejlc: Mondjuk a tartalom tpust. Valsznleg ez


a legfontosabb, de a kiszolgl ms dolgokat is tudat a bngszvel: pldul a tartalom mrett, a kzbes ts dtumt s idpontjt, satbbi.

Agyhullm: Dbbenet! Fejlc: Igen, tudom, hogy ez nmileg sokkol, de a g


pek egyszeren nem gy kommuniklnak, mint az emberek. Ugyanakkor a bngszknek s kiszolg lknak kapcsolatot kell tartaniuk egymssal - ebben segtek n.

Agyhullm: Mikor kerl sor magnak a weboldalnak


az elkldsre?

Fejlc: Kzvetlenl az utn, hogy a kiszolgl elkldtt


engem a bngsznek, rgtn a tnyleges tartalom kvetkezik, legyen az HTML-kd, PDF-adathalmaz vagy egy kpfjl, pldul egy GIF vagy JPEG kp.

Agyhullm: Hogyan? Fejlc: Amikor valaki ber egy IJRL-t, vagy egy hivatko
zsra kattint egy weboldalon, a bngsz sszellt egy GET-krelmet, amelyet elkld a kiszolglnak. Ezt a krelmet egy sor fejlcbe csomagolja, amelyek mind egyike valamilyen informcit tartalmaz a krelemrl. A fejlcek tartalmazzk az olyan adatokat, mint a krt oldal neve, a kiszolgl cme, a krelmet kiad bng sz tpusa, s gy tovbb.

Agyhullm: Rendben, most mr kezdem rteni, hogy


miknt mkdik n a norml weboldalak esetben. De mi a helyzet a hitelestssel?

Fejlc: A szerepem a hitelestett weboldalak esetben


ugyanaz, mint a norml weboldalaknl, azzal a k lnbsggel. hogy a bngszvel azt is tudatom, hogy az oldalt hitelesteni kell. gy a bngsz elkrheti a felhasznltl az azonost adatokat.

Agyhullm: Mg mindig nem ltom, mirt fontos ez. Fejlc: Akkor kzeltsk meg gy: n szerint fontos,

Agyhullm: gy rti, a felhasznlnevet s jelszt?

amikor bel egy kvzba, hogy megmondja a pincr Fejlc: Pontosan. Ezutn a kiszolgln lev PHP-kd nek, hogy egy gigantikus vanlis eszpresszt szeretne dolga, hogy eldntse, hogy a felhasznlnv s a jel tejsznnel? sz egyezik-e, mely esetben a kiszolgl elkldheti Agyhullm: Term szetesen, hiszen tudnia kell, hogy mit az oldal fennmarad rszt. akarok! Agyhullm: L e n y g z . Ksznm a felvilgostst.

Fejlc: Nincs mit. Ez hozztartozik a munkmhoz.

304 6. fejezet

Az alkalm azs biztonsgoss ttele

A fejlcek vezrlse a PHP segtsgvel


A PHP segtsgvel pontosan szablyozhatod a kiszolgltl a bngsznek kldtt fejlceket, ami lehetv teszi, hogy olyan fejlcvezrelt mveleteket hajts vgre, mint a HTTP-hitelests. Egy PHP-parancsfjlbl a beptett h e a d e r () fggvnnyel kldhetsz fejlceket a kiszolgltl a bngsznek:

header (1C o n t e n t - T y p e : t e x t / h t m l 1) ;

A header)) fggvny lehetv teszi, hogy fejlceket hozz ltre s kldj el egy PHP-parancsfjlbl.

A h e a d e r {) fggvny azonnal elkldi a fejlcet a kiszolgltl a bngsz nek, s a fggvnyt az eltt kell meghvnod, mieltt brmilyen tnyleges tar talmat kldenl. Ez igen szigor kvetelm ny - mg ha csak egyetlen karak ter vagy szkz rkezik is a fejlcek eltt, a bngsz visszautastja azt egy hibazenettel. Ebbl az okbl kifolylag a h e a d e r () fggvny hvsnak minden HTML-kdot meg kell elznie egy PHP-parancsfjlban:

Mg egy ksza szkz is hibt okozna ebben a pa- - v rancsfjlban, ha a < ? p b p cmke el kerlne.
<?php header{Content-Type: text/html1);
A kiszolgl ezt a fejlcet kldi el bngsznek feldolgozsra, miem az oldal HTML-tartalmbl barm it megksrelne elkldeni.

A < ? p h p s ? > cmkk k ztt ll szkzk nem jelen ?> tenek gondot, mert a bng szhz nem jutnak el.
chtml xinlns="http://www.w3.org/1999/xhtml xml:lang="en" lang="en" >

</htmi>

Ez az egsz fe jl cd o lo g nagyon izg a lm a s, de hogyan h a szn lju k a fe jl c e k e t t n yle g e se n a rra , hogy h ite le s t s s e l vdjnk meg egy o ld a lt?

m o st i t t vagy

305

a fe jl ce kke l vgzett h ite le st s m kdse

Hitelests fejlcekkel
Alihoz, hogy a Guitar Wars alkalmazs Admin oldalt fejlcek hasznlatval hitelesttethesd, kt konkrt fejlcet kell ltrehoz nod, amelyek arra utastjk a bngszt, hogy az oldal kz bestse eltt krje el a felhasznlnevet s a jelszt a felhasz nlktl. Ezt a kt fejlcet, amelyek az oldal kzbestst vezrlik a bngsz szmra, az Admin parancsfjl PHP-kdja lltja el.

Webkiszolgl

A kiszolgl elkldi a HTTP-bitelestsi fe jl ceket a bngsznek.


HTTP/l.l 401 unauthorized W W W - Authenticate:

Basic re alm = "G u ita r Wars

M ieltt kzbesten az admin.php oldal tartalmt a bngsznek, a kiszolgl feldolgozza az oldal fejlceit.

A bngsz ez utn arra kri a felhasznlt, hogy rjon be egy fe lh a szn l n e -\^ vet s jelszt.

T o view this p a g e . yo u need to lo g In to area G uitar W ars o r w w w .gu ltarw ars.n et


Y o u r potW.X.id wii b e se n t in m e ciear.

N am e Passw ord ,

rock

R e m e m b e r t h i s p a s s w o r d Jn m y k e y c h a J n

U g y f lb n g s z

C an cel

'

Log In

'

Egy weboldal hiteles tse kt konkrt fej lccel krelmezhet.

A hitelests kezdem nyezshez szksges kt fejlc kt feladatot hajt vgre:

Ez a fejlc azt tudatja


401 unauthorized

a bngszvel, hogy a fel hasznl nem jogosult az oldal megtekintsre.

Ez a fejlc arra utastja a bon gszt, hogy azonostsa a fel-.


h a s z n l t

WWW-Authenticate: Basic realm="Guitar Wars"

a f e l h a s z n l n k es A Basic realm" (tartom ny") csak egy kife jezs, ami ennek a bizonyos hitelestsnek az egyedi azonostsra szolgl, s a hiteles tsi ablakban jelenik meg.

a jelsz bekrsvel.

306 6. fejezet

Az alkalm azs biztonsgoss ttele

A hitelestsi fejlcek feldolgozsa utn a bngsz arra vr, hogy a felhasznl csinl jon valamit a hitelestsi ablakban. Attl fggen, hogy a felhasznl mit tesz, a bn gsz drmaian klnbz mveleteket hajt vgre...
_ ^ H x - . _______ Cuitar Wars High Sco^ct Admin is tra tio n _____

Guitar Wars - High Scores Administration


B elow is a list o f all Guitar Wars high scores. Use this page to remove scores as needed Jacob Scorcherson 2008-05-01 20:36:45 389740 R emove B elka C hevy Jean P aul Jones P h il L a irs to n Paco Ja sto riu s N eva Johansson K enny L a v itz 2008-05-01 20:36:07 282470 Removg 2008-05-01 20:38:23 243260 Remove 2008-05-01 20:37:40 186580 Remove 2008 -05-01 20:37:23 127650 Remove 2008-05-01 20:37:02 98430 Remove 2008-05-01 20:38:00 64930 yRentove V -" .A

Ha a felhasznl helyes felhasznlnevet s jelszt r be. majd a Lg In (B ejele n tk ez s) gom bra kattint, a kiszolgl elkldi az a d m in .p h p oldal HTMLtartalmt a bngsznek. A b n g sz m egjelenti az Admin oldalt, a felhasznl pedig ugyangy trlhet rekordokat, mint a korbbi, vdelem nlk li vltozatban.

Ha a felhasznlnevet s a jelszt helyesen adtk meg, az Admin o l dal HTML-tartalma kzbesthet'.

admin.php

Itt a tartomny"!
To View this pag. V*** C uitar W ars' on wwiv.guitarwars
Youf pjLSlWO'd vw 1

N am

____ 1

Password

Ha a felhasznlnv vagy a jelsz hely telen, a hitelestsi ablak egyszeren ismtlsre kri a felhasznlt.
Guitar Wars

n Remember th.s password n my keycha.n

rs s n O ^E )

Ha a felhasznl helytelen felhasznlnevet vagy jel szt ad meg, majd a Lg In gom bra kattint, a kiszol gl arra utastja a bngszt, hogy ism teltesse meg a berst a felhasznlval. A bngsz addig folytatja ezt. amg csak a felhasznl helytelen felhasznl nv-jelsz kom bincikat r be. Ms szavakkal, ha a felhasznl nem ismeri a felhasznlnevet vagy a jelszt, csak a Cancel gom bbal fog tudni kilpni a hitelestsi ablakbl.

S ony, you must enter a valid user came and password to access this

Ha a felhasznl a Cancel gom bra kattint, hogy kilp jen a hitelestsi ablakbl, a kiszolgl mst nem kld a bngsznek, csak egy olyan oldalt, am elyen egy zenet tallhat az oldal letiltsrl - az ad m in .p h p oldalt nem kldi el. A tilt zenetet a fejlcekkel szo rosan egyttmkd ad m in .p h p parancsfjl PHPkdja hatrozza meg. Az albbi kd a PHP e x i t () fggvnyt hvja meg, hogy m egjelentsen egy zene tet, s azonnal befejezze a parancsfjl futtatst:

Sajnlom, de r/nyee fe\haezn\6nevet e je\&zt kell megadnia az o ld a l elrteihez.

Ha a felhasznl a Cancel gombbal kilp a hitelestsi ab lakbl, az alkalmazs befejezhe ti a parancsfjl futtatst, s egyni zenetet jelenthet meg az oldal letiltsrl.

exit(f<h2>Guitar Wars</h2>Sorry, you must enter a valid user name and password to access this page.);

m o s t i t t vagy >

egsztsd k i a h ite le s t s i k d o t!

PHP-mgnesek
A Guitar Wars alkalmazs Admin parancsfjljbl hinyzik nhny fontos PHP-kdrszlet am elyek a HTTP-hitelestst biztostjk. A htmgnesek segtsgvel ptold a hinyz kt b s z H s tT h S z n ? h ^ f Va tCdd b2t nsgOSS 32 Admin oldalt! ^ P P : egyes mgneseket b

<?pbp
/ / A hitelestshez szksges felhasznlnv s jelsz

= 1rock' ;

if (!isset( !isset( ($_SEKVER[ '?HP_AUTH_USERT] != ) H ($__SERVER ['?H?_AIJTH_PW 1] !-

// A felhasznlnv, illetve a jelsz helytelen, ezrt el kell kldeni a hitelestsi fejlceket

( HTTP/1.1 401 Unauthorized'); * ('WWW-Authenticate: Basic realrn('<h2>Guitar Wars</h2>Sorry, you must enter a valid user name and password to ' 1access this page .1);

chtml xmlns="http://www.w3.org/l999/xhtrni" xml :lang="en" iang="en">

admin.php

308 S. fejezet

A z alkalm azs biztonsgoss ttele

M sf le fe jl c e k le lehet kldeni a PHP eegtegvel?

Termszetesen. A fejlcek nem csak a biztonsgot szolgljk.


Br jelenleg a hitelestshez volt szksgnk a fejlcekre, a fejlcek valjban m eglehetsen rugalmasak, s egy csom rdekes dolgot lehet velk csinlni. Csak annyit kell tenned, hogy7 meghvod a header () fggvnyt a megfelel nv-rtk prral:
<?php header ( Location: http: /7www.oruit a i r u - r s . net/tjQ.ut:. php *);

Ez a fejlc az About oldal ra irnytja t a bngszt.

?>
Ezt a fejlcet (Location) tirnyt fejlcnek livjk, s az aktulis oldal rl az about .php oldalra ugrik a Guitar Wars w ebhelyen bell. Itt pedig egy hasonl fejlcet hasznlunk, hogy t msodperc utn ir nytsuk t a felhasznlt az about .php oldalra:

a
W.i

A bngszt ez a fejlc t m sodperc utn t-., < ?pht irnytja az About oldalra. ?>

header ( Refresh: 5; ri http: //www. gu itarwa^t ' echo 'In 5 seconds youll be taken to the About page.;

);

Ezt a fejlcet (Refresh) frisstsi fejlcnek hvjk, mivel a megadott id letelte utn frissti az oldalt. Az ilyen fejlcekben az URL gyakran ugyanarra az oldalra hivatkozik, teht az oldal nmagt frissti. A fentieken kvl mg egy fejlccel, a tartalom tpus-fejlccel (ContentType) rdemes megismerkedned, mivel ez szablyozza a kiszolgl ltal kzbestett tartalom tpust. A header () fggvnyt meghvva s a kvetkez fejlcet tadva pldul HTML helyett sima szveges formra knyszertietsz egy oldalt:
<?php header('Content-Type: text/piain*); echo This <strona>text</strong> wont actually be hold.;

A PHP-fjlokban min dig a fejlcek kell le gyenek az elsk, ami Vigyzat! ket elkldesz a bng sznek.
Mivel a fejlceket minden ms tar talom eltt kell elkldeni, rendk vl fontos, hogy mg egy szkz se legyen a PHP-kdon kvl, mi eltt meghvnd a header () fgg vnyt egy PHP-parancsfjlban.

A tartalom sima szvegknt kerl a bngszhz.

?>
Ebben a pldban a bngsznek tadott szveg pontosan gy jele nik meg, ahogy az echo utastsban szerepel, mindenfle formzs nlkl. Ms szavakkal, a kiszolgl arra utastja a bngszt, hogy a kiratott tartalmat ne HTML-knt kpezze le, gy a HTML-cmkk is m egjelennek a szvegben.
m ost i t t vagy

309

a kie g szte tt h ite le s t s i k d

<?php
// A hitelestshez szksges felhasznlnv s jelsz

V k
* ii
$

usernam e

r o c k ;

''

A fefhaszntnevef s a jelszol

A felhasznl ltal a hitelestsi ablakba bert felhasznlnvhez s jelszhoz a $_$ERVER szupergloblis tmbn keresztl lehet hozzfrni.

\p a s s w o r d

m
|= ' roi i , ;

__ a parancsfjl elejn vltozkba ^ N helyezzk.

PHP AUTH USER PHP AUTH PW

| ($ SERVER['PHP AUTH PW'] |

admin.phc

310 6. fejezet

A z alkalm azs biztonsgoss t te le

Tesztt
Egsztsd ki HTTP-hitelestssel az Admin parancsfjlt!
Mdostsd az admin.php parancsfjlt gy. hogy HTTP-hitelestst hasznljon, hogy csak te rhesd el az oldalt, majd tltsd fel a parancsfjlt a webkiszolglra, s nyisd meg a webbngszdben. Elszr egy rvnytelen felhasznlnevet s jelszt rj be. hogy lsd a hozzfrs korltozst.
*. m *h fuy*. r

nr

mernemrmohBBB

A gitrhosk most mr elge dettek lehetnek: a rekordjaik biztonsgban vannak!


arx HJjh Scot***

*-Ur* *

- j -T r T

**>. y w < *.>?**** =i r< *> M I 1 T3 M OK :oi i c20jiMw i s a t iki -ii yr **** v ji

f0 * 1

iJO .-K

Top Score: 389740

A felhasznlnv s a jelsz megakad lyozza a jogosulatlan hozzfrst az Admin oldalhoz.

A rekordok jogosultsg nlkl nem trlhet^.

S r*: v:

Nincsenek

hlye krdsek
! Pontosan mikor hvdik meg az exit () fggvny a Guitar Wars alkalmazs Admin parancsfjljban?
Br az e x i t { ) fggvny a PH P-kdban kzvetlenl

T "//0 2ggg

! Van valamilyen tnyleges clja a HTTP-hitelests tartom nynak (basic realm")?


Igen. Egy olyan biztonsgi znt hatroz meg, am elyet egy bizonyos felhasznlnv s jelsz vd. Ha az adott tartom nyban rvnyes felhasznlnevet s jelszt egyszer mr sikeresen m egadtk, a b n g sz m eg jegyzi azokat, s k s bb az ugyanarra a tartomnyra vo natkoz hitelestsi fejlcek esetb en mr nem jelenti m eg a hitelestsi ablakot. Ms szavakkal, a tartom nyok lehet v teszik a bngsznek, hogy em lkezzen r, hogy a fel hasznl bizonyos oldalak esetben eleget tett a biztonsgi kvetelm nyeknek - eh hez csak ugyanazt a tartomnyt kell m eghatrozni az oldalak hitelestsi fejlceiben.

a h e a d e r () fggvny kt hvsa alatt szerepel, csak akkor hvdik m eg, ha a felhasznl a Cancel gom bra kat tintva kilp a hitelestsi ablakbl. Ha a hitelests m eghi sul. a kiszolgl nem folytatja a vgrehajtst a kt h e a d e r () -hvs utni kddal, hanem jrakldi a fejlce ket, s ismt prblkozik. A kiszolgl csak akkor jut el az e x i t ( ) fggvnyig, ha a felhasznl a Cancel gombra kattint, m ely esetben elkldi a fggvnyhvson bell sze repl tartalmat, de sem m i mst. A m ennyiben a hitelests sikerrel jr, az e x i t () m eghvsra nem kerl sor. hiszen a parancsfjl soha nem jut el az i f utasts belsejben sze repl kdig - az csak akkor hajtdik vgre, ha a felhaszn lnevet s a jelszt nem vagy helytelenl adtk meg.

m o s t i t t vagy

311

egy jabb b iz to n s g i p ro b l m a ...

gyes prblkozs, Lngszkm l Szerencsre knyvjelzbe m e n te t te m a re k o rd e lt v o lto oldal cm t, s k o z m e tik z ta m kiss a d tu m o t. L e rta m erre a jkora t b l ra is. o

ars - High Scores


Gtutar W t o r, <Jo you have u h * it

lk&s to

t. iifi :

..

'I
http://www.guitarwars.net/ | removescore.php?id=1 O&na me=Jacob%20Scorcherson&

lehet, hogy bonyolult, de a removescore.php oldalra mutat URL valban megkerli a biz tonsgos admin.php oldalt.

Ok, lehet, hogy a Guitar Wars alkalmazs NEM biztonsgos.


Ezt hvjk ml sikernek. Nem tartott sokig, hogy a gonosz jra le csapjon, s ismt eltntesse a Guitar Wars rekordjait, ktsgbeessbe tasztva szmtalan versenyzt. gy tnik, hogy az Admin oldal bizton sgoss ttele nmagban nem elg, mert a Remove Score parancsfjlt kzvetlenl is el lehet rn i...h a valaki tudja, hogy mit csinl.

n n

* W h f Wm

jo t M i B h l '* . hogyan kerlje meg a Guitar Wars biztonsgi rendszert.


rd le, hogy szerinted hogyan lehetne elhrtani ezt az jabb tm adst, s megakadlyozni a rekordok trlst:

312 6. fejezet

A z alkalm azs biztonsgoss tte le

Biztonsgoss kell te n n n k a Remove 5 c o re parancsfjlt, s b iz to s vagyok benne, hogy a H T T P -h ite le s t s e z tta l is m egfelel.

Joe: sszernek tnik. gy rtem, az Admin oldal esetben kitnen mkdtt. Frank: gy igaz. Teht csak annyit kell tennnk, hogy betesszk ugyanazt a fejl
ces hitelestsi kdot a Remove Score parancsfjlba, s meg is vagyaink, igaz?

Jill: Igen, ez biztosan mkdne, de n aggdom amiatt, hogy gy kt helyen sze


repelne ugyanaz a hitelestsi kd. Mi lesz, ha ksbb mg egy oldalt adunk az alkalmazshoz, amit meg kell vdennk? Megint lemsoljuk a kdot?

Joe: A kdismtls egyrtelmen problms, klnsen hogy a felhasznlnvnek


s a jelsznak kzsnek kell lennie az sszes parancsfjlban. Ha vltoztatni szeret nnk rajtuk, minden vdett parancsfjlban el kellene vgeznnk a mdostst.

Frank: Megvan! Mi lenne, ha kln beem elt (include) fjlba tennnk a $username
s $password vltozkat, s ezt a fjlt osztannk meg a vdett parancsfjlok k ztt? St, kerlhetnnek akr az alkalmazs vltozit tartalmaz megosztott appvars.php fjlba is.

Joe: Tetszik az irny, de ez a megolds csak egy rszt oldja meg a kdismtls
nek, mrpedig jelents mret kdrl van sz.

<htm>

admin. php Jill: Mindketttknek igaza van - n ezrt gondolom gy, hogy egy j beemelt
fjlra van szksgnk, ami az sszes hitelestsi kdot tartalmazza, nem csak a $usernaine s $password vltozkat.

Frank: Persze! s csak beem elnnk ezt a parancsfjlt azokon az oldalakon, am e


lyeket HTTP-hitelestssel szeretnnk vdeni!

Joe: gy van! Csak arra kell gyelnnk, hogy a beem els legyen az els, mivel
az egsz HTTP-hitelests a fejlcekre tmaszkodik.
m ost it t vagy

313

az authorize, php parancsfjl ltrehozsa

A hitelest' parancsfjl ltrehozsa


Mr minden kd megvan, ami az j, Authorize (hitelests) nev parancsfjlhoz szksges, csak t kell helyezned a kdot az admin. php-bl egy j fjlba (a u th o r iz e .p h p ), s a helyre egy r e q u ir e _ o n c e utastst rnod.

Ezt a kdot az admin.php bi helyezzk t egy nl t, authorize.php nev pa rancsfjlba.

<?php // A h i t e l e s t s h e z szksges felh a sz n l n v s je l s z $username = ro ck ; 5password = ' r o l l ' ; if (! i SSet (S SERVER: PHP_AUTH_USERt j > l | ! 1 s s e t ($_SERVER \PHP_AUTH_PW ] | |; (S_SEP-VER[1PHP_A17TH_USER ] } $username) II (S_SEP.VERf * PHP_A TK_PW ] != Spassword) > f J // A felh aszn l n v , i l l e t v e a je l s z h e ly te le n , e z rt jr a el k e ll kldeni a h i t e l e s t s i t e jl c e k e t h ea d er{ HTTP/1 .1 401 U nauthorized*>; h ead er( 'WWW-Authenticate: B a sic realm -"G u itar W ars" ) ; e x i t ( '<h2>Guitar Kars<i'h^>Sorry, you must e n te r a v a lid user name and password to a c c e s s t h i s p a g e .')/

?>
' <head> <meta h ttp -eq u iv -"C o n ten t-T y p e" content * ter.t/html ? c h a r s e t - u t f - 8 " /> < title > G tu ? a r tf*t5-Hj.gh Scores AdnLnistrati.on</title> " ty ^ e -" te :it ./cssH h ra ^ "sty iW css^ />
<t*>dy> . I : . JL 3, , <hL->Gitur Wars-High Sco res Adainistrat.ion< / h2> <p>3eiow $,.s a oe a l l G u ita i wars high -scares-, Use fchis p&ae to rcsvove J -hr /> ::& ,, :T 3 c?php requ xre_once( ' appvars,pftp ; ) requ ire_once <' conr.ectv.arg. php* >; //; Co&iierct to the. database idbc - ftysqU^corinect {SBJJQST, DB_OSER, DB.FASSWORT), DB_KAME) ; // R eprieve th e sepre data from MyS'bl. Squery "SELECT * FROM guitarw aro ORDER BY -core * * date A3C"; Stf-ata *. ftiyaq}.i_Ciuery (5dbc# Sqfueryj; :- " ^ ; // l^op through the arra y o f sco re d ata, format tin g i t a-s H L TM f eeho *<ta'Dle> ;

a s neetied.</ci>

hlle ircw - msq'i.i' fct;:'h_j_array 5 & : y $dat ))

I ?>

: // i>i so la y th e sco r~r dat a echo *< tr c l a $ s - *3 C o x e ro v "x td X st o n g > , . 5row r none * 1 . 's t r o n g x / t d ; echo <td>' S ro x j d a te J . : . echo *<td>* . 3ro v (s c o r e ] * *</td>*; echo < t d x a hre?^" renc-vescore.php?id . Scow i d * ! . . Srow f d a te 1i . . $rowi 'name 3 . &amp; sc o re - . $r e* ; . iam p ;screensh ot* 1 .' .Jxciw scr&onshc:?: * 1 , >si>i>er.oV&<% v//rd>*

;;

R*.y8qli_clcse !Sdbc;

<7body> </hml>

adm in.php

314 6. fejezet

Az alkalmazs biztonsgoss ttele

authorize, php

A megosztott Authorize parancsfjlt ennek a parancsfjlnak a legelejn emeljk be, mi vei a header () fggvnyt hvja meg.

<?php ~equire_once('authorize.php*);

?>

<?php require_once ( 'authorize.php )


?>
< h tm l>

A 2 Admin parancsfjl ban a hitelestsi kd helyre egyetlen sornyi PHP-kd kerl.

adm in.php

rem ovescore.php

jratltve
A PHP-parancsfjlok fejlcek segtsgvel szab lyozhatjk, hogy a kiszolgl hogyan kzbesti a w eb es tartalmat a bngsznek. A PHP beptett header {) fggvnyvel fejlce ket kldhetsz a bngsznek, am elyekkel msik oldalra irnythatod a felhasznlt, szablyozha tod egy oldal tartalmnak tpust, illetve egy ol dal hitelestst krheted. Amikor fejlceket kldesz a bngsznek a header () fggvnnyel, a header () hvsnak brmilyen tartalom elkldse eltt kell szerepelnie. Ha egy oldalt HTTP-hitelests vd, a felhasznl ltal bert felhasznlnevet s jelszt a $ _ s e r v e r szupergloblis tm b trolja. A HTTP-hitelests tartomnya egy olyan biz tonsgi zna, am elyhez egy adott felhasznlnv s jelsz trsul, s am ely lehetv teszi, hogy tbb oldalt egyttesen tegyl biztonsgoss. A PHP beptett exit () fggvnye egy PHPparancsfjlbl val kilpsre szolgl, ami meg akadlyozza a fggvny hvst kvet kd vgre hajtst, illetve elkldst a bngsznek.

m o s t i t t vagy

315

nem hlye krdsek a biztonsggal kapcsolatban

Nincsenek

hlye krdsek

K V

Mg mindig nem rtem pontosan, hogy Ethel hogyan kerlte meg a Guitar W ars alkalmazs biztonsgi rendszert. M it csinlt?
Azt a gyengesget hasznlta ki, ami abbl addott, hogy csak egyetlen oldalt (az Admin oldalt) vcdtnk. amikor a rekordeltvoltsi szolgltats valjban kt oldalra (Admin s Remove Score) tmaszkodik, hiszen az Admin oldal olyan Remove hi vatkozsokat tartalmaz, amelyek a Remove Score oldalra mutat nak. Azt. hogy melyik rekordot kell eltvoltani, az URL-ben ad juk t, s ez teszi lehetv, hogy a Remove Score parancsfjl el rje ezeket az adatokat a $_G ET szupergloblis tm bn keresz tl. Ha kpes vagy sszelltani a Remove Score oldal rvnyes URL-jt. anlkl trlhetsz rekordokat, hogy meg kellene nyit nod az Admin oldalt. Ethel pontosan ezt tette.

K V

De honnan tudta, hogyan kell felpteni az URL-t, ami a Remove Score ol dalra mutat?
Ethel elg gyes, de ehhez nem kellett zseninek lennie. Eml kezz vissza, hogy azt mondta, hogy knyvjelzbe mentette a Remove Score oldal cmt, mg akkor, am ikor egyltaln nem vdtk a webhelyei. Nos, a knyvjelz csupn egy URL, ami nek a segtsgvel simn felpthette azt az URL-t, amellyel kz vetlenl. az Admin oldal megnyitsa nlkl elrhette a Remove Score oldalt.

K
V

Ok, de a rekordokat a korbbi tmads ta jra bertk. Ez nem azt je lenti, hogy a rgi URL-ek nem mkdnek, mert a dtumok klnbznek?
Nagyon gyes szrevtel, de ne feledd, hogy Ethel igencsak fifiks. Egyszeren m egnzhette a Guitar Wars foldaln az j d tumokat. s beleilleszthette a rgi URL-be, s gy gond nlkl eltvolthatta az j rekordokat. Fontos, hogy soha ne becsld al az eltklt tmadk kpessgt arra, hogy visszafejtsk a PHPparancsfjljaidat, s kiaknzzk a gyengesgeit.

Soha ne becsld al az el tklt tmadk kpessgt arra, hogy visszafejtsk a PHP-parancsfjljaidat, s kiaknzzk a gyengesgeit!

K
V

Rendben, szval az Admin s a Remove Score oldalak egyttes vdel me akadlyozza csak meg Ethelt, de nem teszik knszenvedss a rekor dok eltvoltst a rendszergazda szmra is?
Egyltaln nem. A tartomnyok segtsge nlkl persze tnyleg m acers lenne a rekordok jogosult trlse is, mivel a felhaszn lnevet s a jelszt kiiln-kln kellene megadni az Admin s a Remove Score oldal szmra, de ha em lkszel r, olyan tarto mnyt hatroztunk meg. ami mindkt oldal esetben azonos, ami azt jelenti, hogy a kt oldal azonos biztonsgi znba tarto zik. Ha mr megadtad az azonost adataidat egy adott tarto mnyban lev oldal hitelestsi ablakban, a bngsz az egsz tartomnyban em lkezni fog a felhasznlnvre s a jelszra. Vgeredm nyben teht a felhasznlnevet s a jelszt elg egy szer sikeresen megadni, hogy mindkt oldalhoz hozzfrj.

316 6. fejezet

Az alkalmazs biztonsgoss ttele

Ksztsd el az Authorize parancsfjlt, s emeld be az Admin s a Remove Score parancsfjlokba, hogy biztonsgoss tedd azokat!
Hozz ltre egy j szvegfjlt a u t h o r i z e . php nven, rd bele az Authorize parancsfjl kd jt, majd mdostsd gy az ad m in.php parancsfjlt, hogy a tnyleges HTTP-hitelestsi kd helyett csak az Authorize parancsfjl beem elst tartalmazza. Add ugyanezt a r e q u ir e _ o n c e utastst a re m o v e s c o re .p h p parancsfjl elejhez is, hogy ezt a fjlt is HTTP-hitelests vdje. Tltsd fel az sszes parancsfjlt a w ebkiszolglra. majd prbld megnyitni a Rem ove Score parancsfjlt kzvetlenl a w ebbngszdben. Lehet, hogy trlnd kell minden korbbi HTTP-hitelestsi m unkam enetet a bngszdben, hogy ismt m egjelenjen a hitelestsi ab lak - a legtbb bngsz megjegyzi a hitelestsi tartomnyokat, hogy7 ne kelljen minden al kalommal bernod a felhasznlnevet s a jelszt. ^ a2 /^m in s a Remove
Cuita Wars - High Scores

h t t p : / /www. g u i t a r w a r s . n e t / r e r a o v e s c o r e . p h p ? id = 1 0 & n a m e = Ja c o b % 2 0 S c o r c h e r s o n & d a t e = 2 0 0 8 - 0 5 - 0 1 % 2 0 2 0 : 3 6 : 45& ^ sco re= 389740& s c r e e n s h o t = ja c o b s s c o r e . g i f

Password Remember this password in my keycham

Ez az URL megkerli az Adm'' parancsfjlt, es ri el a Remove

f _C K ) a/ et

In '>

A Remove Score oldal a hozzfrs mdjtl fu g-getlenl vdelem alatt ll.

____ I

Guitar Wars - Remove a High Score


Szerinted milyen veszlyek fenyegethetik mg a Guitar Wars rekordjait?
The high s o f 314340 fur BUT Jcclc wa* s u c c c s ^ m oved

<<

joadm 2e m

most itt vagy

317

a hamis rekordok rejtlye

rekord

Guitar W/ars II. rsz


Sajnos a Guitar Wars-univerzum boldogsga nem tartott sokig: ham is rekordok tntek fel az alkalm azsban az rvnyes rekordok helyn, ami felhborodst vl tott ki az egsz Guitar W ars-univerzumban. Ezek szerint rekordok trlse nlkl is tnkre lehet tenni a Guitar Wars dicssglistjt.. .de hogyan?

pi o n

Guitar titers - High Scory*

Guitar Wars - High Scores


OTdt the hifh scorc Bn? I f . j aid jffiurjjwnJESSSVrclcoroc

. Guitar Wamor. do you have hat it takes to

Top Score: 500000


500000
Name: Ethel Heckcl

Date: 2008-05-02

1 4 0 2 .5 4

Gu i t a r
Nam

Ethel rekordpontsza'ma meglehetsen gyans, rsz ben az gyetlenl retusait kpernyfelvtel, rszben amiatt a tny miatt, hogy pontosan 5 0 0 0 0 0 pontot sikerlt elrnie.

EtlielHeck
Score: _

389740
Name: Jacob Scorcherson
D ate: 200 8 05-01 20 :36:45

J AC OB O t t

Gui ta r f 1 f I M SU |
22 23 24 25 26 27 28 29 2008-05-01 20:36:45 2008-05-01 20:37:02 2008-05-01 20:37:23 2008-05-01 20:37:40 2008-05-01 20:38:00 2008-05-01 20:38:23 2008-05-01 21:14:56 2008-05-01 21:15:17 2008-05-02 14:02:54

It
Jacob Scorcherson Nevil Johansson Paco Jastorius Phiz Lairs ton Kenny Lavitz Jean Paul Jones Leddy Gee T-Bone Taylor Ethel Heckel

score

screenshot

282470 389740 98430 127650 186580 64930 243260 308710 354190 500000

be itasscore aif

W v' I I I M w W I W VI I 1 #

jacobsscore.gif nevilsscore.gif pacosscore.gif phizsscore.gif kennysscore.gif eanpaulsscore.gif leddysscore.gif tbonesscore.gif ethe lssco re jjy^

tis l

318 6. fejezet

Az alkalmazs biztonsgoss ttele

Kivons hozzadssal
Mostanig arra a feltevsre ptettnk, hogy minden rekord rvnyes, am i hez kpernyfelvtelt is feltltttek. Most mr kijelenthetjk, hogy ez nyil vnvalan nem igaz. s tudjuk, ki a b n s...

, igen, n v a g y o k ...b n s m indenben! Csak a n n y it k e lle tt csin ln o m , hogy fe lt lt m a h ih e te tle n l h a m is re k o rd ja im a t a r e tu s lt kpernycfelvtelekkel. J rzs a g t rh tfs k bajnoknak lennil

Ethel rjtt, hogy elg egyszeren hamis rekordokat feltltenie retuslt kpernyfelvtelekkel, s jkora kalamajkat kavarhat a Guitar W/ars vilgban.

rd le, hogy miknt oldand meg, hogy a felhasznlk ne tudjanak hamis re kordokat feltlteni a Guitar Wars alkalmazsba:

most itt vagy

319

a guitar wars alkalmazsnak emberi felgyeletre van szksge

A biztonsg embert kvetel


Mg e b b e n a m odern vilgban, am elyben lnk, sem nlklzhet nha a llegz, gondolkod em beri lny. Esetnkben egy l em ber a legalkal m asabb arra, hogy elem ezze az inform cikat, s felm rje, hogy azok r vnyesek-e vagy sem. Egy modertorra van teht szksg: egy olyan em berre, akinek az a feladata, hogy jvhagyja a w ebalkalm azsba feltlttt tartalmakat, mieltt azok elrhetv vlhatnnak a nagykznsg szmra.

Az emberi felgyelet kitn mdszer a fe l hasznlk ltal feltl ttt tartalom rvnyes sgnek vdelmre.

A moderlsnak ksznheten az j re kordok bekerlnek az adatbzisba, de addig nem lesznek nyilvnosak, amg a modertor jv nem hagyta Vet. Az Admin parancsfjl mdostsval elhelyeznk egy Approve (Jvhagys) hivatkozst a rekordok mellett, hogy felgyel jvhagyhassa azokat.
*

Score

Action

500000 Remove / Approve 389740 Remove* 11iM lb". R a jta m a z t n nem ju tn a k k e re s z t l a ham is d o k u m e n tu m o k ...# # , rekordok. A la p o s vagyok, s ritk n hibzom .

W a r s . High S c o rn Administration

- v

, Jr"7
n ,l r *

*teii ' i03tJ>HJV ..


Xt3)JI m tK -------

j>w, juhi sj3j~ ,

iw.aaM v)

i J** itat u 0; > ';; V*.> ? 4 3

Egy j rekord felvtele mr nem jelenti azt, hogy a rekord automatikusan nyil vnoss is vlik.
A Guitar Wars alkalm azsnak csak elnyre vlhat az em beri felgyelet. Persze gy is lehetsges, hogy valaki gyesen hamist egy kpernyfelv telt, s a hamis rekord elkerli a m odertor figyelmt, de a feladat nem knny, s a m oderls kell elrettent ervel br. Ne feledd, hogy egy PHP-alkalmazs biztonsgoss ttele nagyrszt a m egelzsrl szl!

A Guitar Wars rettenthetetlen mo dertora, aki mg soha nem tall kozott olyan rekorddal, amelyben valban megbzott volna.

320

6. fejezet

Az alkalm azs biztonsgoss t te le

f a emberi felgyelet megtervezse a Guitar Wars alkalmazsban


Az em beri felgyelet lehetsgnek hozzadsa a Guitar Wars alkalm azshoz b o nyolult mvelet, mert az alkalm azs tbb rszt is rinti. Mdostani kell az adatb zist, a jvhagys vgrehajtshoz j parancsfjlt kell rni. az Admin oldalon el kell helyezni egy Approve hivatkozst a rekordok mellett, s vgl gy kell mdostani a foldalt, hogy csak a jvhagyott pontszm ok jelenjenek meg rajta. Miutn ilyen sok vltoztatsrl van sz, fontos tervet kszteni, s a m dostsokat lpsenknt vgrehajtani
Egy approved (jvhagyva) nev oszlop hozzadasa a tblhoz az a l t r utastssal. Az Approve Score (Rekord jvhagysa) parancsfjl lt rehozsa, amely az j rekordok jvhagyst kezeli (va gyis 1 rtkre lltja az a p p r o v e d oszlopot).

Kezdjk az adatbzissal, am elyben egy j oszlopra van szksg, am elyben rgzthetjk, hogy az adott rekordot jvhagytk-e vagy sem.

2008*5-01 21 14*

Ucn. T y oW
2CC&05-02 l 02:54 *}.ol 5OOOO

Ha az adatbzis mr kszen ll r, hogy rgztse a rekordok jvhagyott llapott, kell egy pa rancsfjl is, ami tnylegesen vgrehajtja a rekor dok jvhagyst. Ennek az Approve Score nev parancsfjlnak lesz a eladata. hogy m egkeressen egy adott rekordot az adatbzisban, s mdostsa az ap p rov ed oszlop rtkt a rekord sorban.

irff lo.

3U 0 U
3227 tO

A jvhagysra vr rekordok mellett egy Approve hi vatkozs elhelyezse az Admin oldal mdostsval.

Az Approve Score egy httr-parancsfjl, amelyet norml esetben nem lehet kzvetlenl elrni. Erre az Admin oldalon elhelyezett Approve hivatkoz sok szolglnak, am elyek csak a mg jv nem ha gyott rekordok mellett jelennek meg.

A lekrdezs mdostsa, hogy a foldal csak a jvha gyott rekordokat mutassa.

G u itar W a n High S to re s AdrainUimtion

Az utols lps annak biztostsa, hogy a jvha gys bepljn a foldalon m egjelentett rekordlis tba. Az alkalmazs foldalt teht gy kell m do stani, hogy csak a jvhagyott rekordokat mutassa - enlkl a jvhagyshoz kapcsold tbbi vl toztats rtelm etlen lenne.
G u itar W ars High Scurcs

n m nc: ia &Lxawi a * wm v* au

Top Score: 389740


JW 740

X c o rc r

most itt vagy

321

az approved oszlop hozzadsa a g u ita rw a rs tblhoz

Csinlj helyet a jvhagysnak az ALTR segtsgvel!


Az j approved oszlop hozzadsa a g u ita rw a rs tblhoz a korbban mr hasznlt ALTR TABLE SQL-utasts egyszeri hasznlatt ignyli:

ALTER TABLE guitarwars ADD COLUMN approved TINYINT

A TINYINT helyett a MySQL B001 adattpust is hasznlhatod.

Az j approved oszlop tpusa TINYINT, s a 0 rtkkel jelzi a jv nem hagyott, illetve 1-gyel a jvhagyott rekordokat. Ez azt jelenti, hogy az oszlop rtke minden j rekord esetben 0, ami azt jelzi, hogy kezdetben egyik rekord sincs jvhagyva.

-J iS Z

Egy approved (jvhagyva) nev oszlop hozzadsa a tb lhoz az ALTR utastssal.

V rju n k c s a k egy p e rc e t! S z e rin te m az A d d Score p a ra n c s f jl m d o s t s a nlkl nem v le h e t c s a k gy h o zz a d n i egy o s z lo p o t a z a d a tb z is h o z . Nem kene a p a ra n c s f jln a k IN 5 E R T -te l b eszrnia a d a to k a t a z j oszlopba?

Igazad van, az j oszlop egyben egy j rtket is jelent az Add Score parancsfjl INSERT-Iekrdezsben.
Fontos, hogy ne vesztsd szem ell, hogy a PHP-al kai m azsok szm os gondosan sszehangolt alkatrszbl llnak: egy sorokat s oszlopokat tartalmaz adatbzisbl, PHP-kdbl, HTML-kdbl, s ltalban CSS-kdbl. Az azonban nem mindig nyilvnval azonnal, hogy az egyik rsz m dostsa egy msik rsz megvltoztatst is szksgess teszi. Ahhoz, hogy az j Approve Score parancsfjl szmra hozzadd az j approved oszlopot a g u ita r w a r s tblhoz, m dostanod kell az Add Score parancsfjlban lev INSERT-Iekrdezst is: .

I
I I I I r- korrf

Az approved oszlop rtke minden jonnan beszrt , * sorban 0, vagyis jv nem hagyott" le - ~ " V I

INSERT INT guitarwars ^ VALUES (0, N O W (), '$name1, '$score','$screenshot', 0)

30 31 32

2008-05-02 14:02:54 2008-05-02 20:32:54 2 0 0 8 0 5 0 2 20:36:38

Ethel Heckel iff Jeck Pez Law

Amikor j rekord kerl a tlba, az approved oszlopa a 0 rtke: veszi


500000 314340 322710 ethelsscore.gif biffsscore.gif pezsscore.gif

fel, teht a rekord kez detben nincs jv hagyva

322 6. fejezet

Az alkalmazs biztonsgoss ttele

V h"
<?php
?>

ezd ki a ceruzd!
Az Approve Score parancsfjl a Rem ove Score parancsfjlhoz hasonlan pl fel, csak ppen az a feladata, hogy jvhagyjon egy rekordot. Ptold az Approve Score parancsfjlbl hinyz kdol, gondoskodj az oldal biztonsgoss ttelrl, s csak azt a rekordot hagyd jv, am elyiknek az adatait megkaptad az URL-en keresztl.

<?php r e q u i r e _ o n c e ( 1ap p v ars. php1) ; r e q u i r e _ o n c e ( ' c o n n e c t v a r s . php' ) ;


if

( i s s e t ( $ _ P 0 S T [ s u b m it ] ) )

if (.................................. ) { // C s a t la k o z s az a d a tb z is h o z $dbc = m y sq li_ co n n ect (DB_H0ST, DB_USER, DB_PASSW0RD/ DB_NAME) ;

// A rekord j v h ag ysa az approved o s z lo p b e l l t s v a l az a d a tb z is b a n $query = "UPDATE g u ita rw a rs SET m ysqli_q u ery($d bc, m ysqli c l o s e ( $ d b c ) ; $ q u e r y );

// A mvelet s ik e r n e k m e g e r s t s e a f e l h a s z n l szmra echo

else

echo
} )

echo ' < p x a h r e f= "

" > & l t ; & l t ; Back t o admin p a g e< / a x / p > ' ;

most itt vagy

323

a kiegsztett approve score parancsfjl

ezd ki a ceruzd! - megolds


Az Approve Score parancsfjl a Remove Score parancsfjlhoz hasonlan pl fel, csak ppen az a feladata, hogy jvhagyjon egy rekordot. Ptold az Approve Score parancsfjlbl hiny z kdot, gondoskodj az oldal biztonsgoss ttelrl, s csak azt a rekordot hagyd jv, am elyiknek az adatait megkaptad az URL-en keresztl. rt ?> Cau-fcKori ut pKp*) 1

<?php

Ahhoz, hogy az Approve Score parancsfjlt biztonsgoss tedd egy felhasznlnvvel s jelszval, csak be kell emelned az Authorize parancsfjlt, de ennek a legels dolognak kell lennie a parancsfjlban, mivel fejlcekre tmaszkodik.
^ Az Approve Score (Rekord jvhagysa) parancsfjl ltre hozsa, amely az j rekoi jvhagyst kezeli (vg] rtkre lltja az appn oszlopot).

<?php r e q u i r e _ o n c e { 1ap p v ars. php1) ; r e q u i r e _ o n c e { ' c o n n e c t v a r s .p h p ) ;


if

( i s s e t ( $ _ P O S T [ s u b m it' ] ) )
if ( /_P0 S T C W . r m 'J

(
Y e s'

) {

// C s a t la k o z s az a d a tb z is h o z

A jvhagys vgrehaj$dbc = m y sq li_ co n n e ct (DBJHOST, DB_USER, DB_PASSWORD, DB_NAME) ; fshoz az azonost nak egyeznie kell.

// A re k o rd j v h ag y sa az approved o s z lo p b e l l t s v a l f i az a d a tb z is b a n $query = "UPDATE g u ita rw a rs SET m ysqli_q u ery($d bc, m ysqli c l o s e ( $ d b c ) ; $ q u e r y ); appvoved I WttERE id 'f id1

Az approved oszlop t-re lltsval jvhagyod a rekordot.


\l/

// A mvelet s ik e r n e k m e g e r s t s e // a f e l h a s z n l szmra echo


}

A jvhagys megerstse a felhasznl szmra a jvhagyott pontszm s a nv megjelentsvel.

'<p>TVie H sore of ' fstort . 1 -foc ' igh

fname

' was su-ddess-fulhy approved-1 ;

else

e c ilo }

d la s s ^e n rc r^S o rry , there was a pvoblcnrv appvov'mj ih c

sdore.</p>;;

Fontos, hogy jelezd, ha egy rekord jvhagysa meghisult, ugyangy, ahogy a Guitar W/ars ms parancs fjljainak hibazeneteiben.
admin.php
..........
it

echo ' <p><a h r e f ="


?>

Back t o admin page</a></p> ;

Hivatkozs, ami a knnyebb navigci r dekben visszavisz az Admin oldalra.

324 6. fejezet

Az alkalmazs biztonsgoss ttele


Nincsenek

hlye krdsek
! M irt nem szksges tadni a kpernyelvtel fjlnevt, am i kor jvhagyunk egy rekordot?
! Azrt, mert egy rekord jvhagysnak mvelethez csak annyi informci kell, aminek az alapjn meg le het tallni a rekord sort, hogy jvhagyjuk. Ez azt je lenti, hogy csak az adott sor m egkeresshez elegend adat szksges. A dtum, a nv s a pontszm elgs ges a sor m egtallshoz s az a p p r o v e d oszlop 1-re lltshoz.

IC

\ A 0 s 1 rtkek jelentse az approved oszlopban nmileg rej


tlyesnek tnhet. Mskpp nem lehet jellni ezt az informcit?
De igen. A MySQL ENUM adattpusnak segtsgvel (az EMUM az enumerated", vagyis felsorolt" rvidtse) olyan oszlop is ltrehozhat, am elyben csak bizonyos rtkek szerepelhetnek. Az a p p r o v e d oszlopot teht 0 vagy 1 rtk TINYTNT helyett ltrehozhatod ENUM tpusknt is, am elyben csak a ' y e s ' (igen) vagy a 'n o ' (nem ) rtk szerepelhet:

ALTR TABLE g u i t a r w a r s ADD COLUMN a p p r o v e d E N U M ('y e s1,

n o ')

ki a ceruzd!
Az adatokat, am elyek egy rekord jvhagyshoz szksgesek az Approve Score parancs fjlban, az Admin parancsfjlban ellltott Approve hivatkozsokon keresztl adjuk t. P told az Admin parancsfjlbl hinyz kdokat, hogy ltrejjjenek ezek a hivatkozsok.
// A p o n ts z m o k t m b j n e k b e j r s a s H T M L -kn t t rt n fo rm z sa egy c ik lu s s a l

echo ' < t a b l e > f ; echo ' < t r x t h > N a m e < / t h x t h > D a t e < / t h x t h > S c o r e < / t h x t h > A c t i o n < / t h x / t r > 1; w h ile ($row = m y s q l i _ f e t c h _ a r r a y ( $ d a t a ) ) {
// A p o n ts z m o k m e g j e l e n t s e

echo < t r c l a s s = " s c o r e r o w " x t d X s t r o n g > ' . $ ro w [ name'] echo < td > . $ ro w [ d a t e f ] . 1</td>f ; echo ' < td > . $row[ ' s c o r e 1] . </td> ;

. ' < / s t r o n g x / t d > 1/

echo 1< t d x a h r e f = rem o v esco re.p h p ?id = ' . $ r o w [ ' i d ] . &aitip;date= . $row [ d ate f ] &amp;name=' . $row [1name *] . &amp;score= . $row[ s c o r e ] . & am p;screenshot=! . $row[ 1s c r e e n s h o t ] . ">Remove</a>1; if ( .......................................................................) { echo

echo l < / t d x / t r > ;


}

echo 1< / t a b ie > ;

Tipp: Approve hivatkozsnak csak a jv nem nagyott rekordok mellett szabad lennie.

most itt vagy

325

az approve hivatkozsok ltrehozsa

Hegyezd ki a ceruzd! - megolds


Az adatokat, am elyek egy rekord jvhagyshoz szksgesek az Approve Score parancsfjl ban, az Admin parancsfjlban ellltott Approve hivatkozsokon keresztl adjuk t. Ptold az Admin parancsfjlbl hinyz kdokat, hogy ltrejjjenek ezek a hivatkozsok.

// A pontszmok tmbjnek b e j r s a s HTML-knt t r t n form zsa egy c i k l u s s a l

echo <table>f; echo 1<trxth>Name</th><th>Date</th><th>Score</th><th>Action</thx/tr>1; while ($row = mysqli_fetch_array($data)) {


// A pontszmok m e g j e l e n t s e

echo <tr class="scorerow,xtdxstrong>' , echo !<td> . $row['datef] . </td>; echo '<td> . $row[1score1] . ' </td>'; echo *<tdxa href="removescore .php?id=
' &amp;name='
1 if {

$row[id1] . &amp;date=' . $row['date']

. $row [ 'n am e ]

' &a m p ;s c o re = . $row[ - s c o r e ] EHenfrH ha9y a rekord nine.#


. "> R e m o v e < /a > f / jvhagyva, mieltt ltrehoznd az Approve hivatkozst.

&am p; s c r e e n s h o t= '

. $ r o w [ ' s c re e n s h o t ] > (

fVowC apptroyca'3 ^f=-..P '

^ ------------------ ---------------------------- ^
C id 'l

echo

1/ <a K ^ f ^approvcsorc.pK^id ;.f r c w v-

'&anp;daie ; jhrowTda^J .

' & a ^ j . frowVamc'] . '& amj>^sdorc=-; . frovCsCort'! . l &amp^sdrccrvsKo-t ' .


fro^rsdrccnsKot^ . '>Aj>{vovc</a>1 ; >

echo *</tdx/tr>';

Az Approve hivatkozst gy kell ltrehozni, hogy az URL-ben tadja az azonostt, a dtumot, a nevet, a pontszmot s a kpernyfelvtel fjlnevt.

echo '</table>;

326 6. fejezet

Az alkalmazs biztonsgoss ttele

A jv nem hagyott rekordok nem szmtanak


Most mr m inden szksges elem a helyn van ahhoz, hogy megvalsthasd a m oderlst a Guitar Wars rekordm egjelent alkalm azsban, csak a vgs lps hinyzik: a foldal m dostsa, hogy csak a jvhagyott rekordok jelenjenek meg rajta. Ehhez a SELECT SQL-lekrdezst kell m dostanod, hogy csak azokat a re kordokat mazsolzza ki, am elyeknek az ap p rov ed oszlopban az 1 (jvhagyva) n k szerepel. Ezt egy WHERE zradk segtsgvel rheted el:

Egy adott oszlop rtke alapjn a IVHERE zradk segtsgvel vlaszt hatsz ki sorokat.

SELECT * FROM guitarwars WHERE approved = 1 ORDER BY score DESC, date ASC
AW HERE zradk hozzadsa a fenti lekrdezshez kiiktat minden jv nem ha gyott rekordot - am ibe az sszes j rekord beletartozik. gy a m odertornak leh e tsge nylik r, hogy ellenrizze az j rekordokat, s eldntse, hogy melyiket kell trlni, s melyik tehet nyilvnoss a nagykznsg szmra.

Ha az approved oszlopban 1-tol eltr' rtk szerepel, a rekord nem jelenik meg.

nam e

score

screenshot

approved

2008-05-01 21:14:56 2008-05-01 21:15:17 2008-05-02 14:02:54 31 32 2008-05-02 20:32:54 2008-05-02 20:36:38

Leddy Gee T-Bone Taylor Ethel Heckel Biff Jeck Pez Law

308710 354190 500000 314340 322710 tbonesscore.gif ethelsscore.gif biffsscore.gif pezsscore.gif 1

L :v

354190

.-.T-Bo TtStoc p u e 3000-0*41 il:IW

T-6-3HC
Srnr.-*

3S*in o

3 2 2 ? 1

A foldalon (index.php) most ma'r csak a jv hagyott rekordok jelennek meg.

na1 Scor:

I
Q

*2?r,0

A lekrdezs mdostsa, hogy a foldal csak a jvhagyott rekor dokat mutassa.

3 *4 4 1 30

__: MJe fU O O S-O '^X tO l*1

m ost it t vagy

327

teszteld az approvescore.php parancsfjlt!

Tesztt
Ksztsd el az Approve parancsfjlt, s dolgozd t a Guitar Wars tbbi rszt, hogy hasz nlatba vegyk az j parancsfjlt!
Valamelyik MySQL-eszkz segtsgvel hajtsd vgre az j approved oszlopot a guitarwars tblhoz ad ALTER-lekrdezst, majd mdostsd az addscore.php parancsfjlban tallhat INSERT-lekrdezst, hogy beszrja a 0 rtket az approved oszlopba az j adatsorokban. Ezt kveten hozz ltre egy j szvegfjlt approvescore.php nven, s rd bele az Approve Score parancsfjl kdjt. Mdostsd az admin.php parancsfjlt, hogy elhelyezze az Approve hivatkozsokat a jvhagyand rekordok mellett, vgl pedig vltoztasd m eg gy a SELECTlekrdezst az index.php fjlban, hogy csak a jvhagyott rekordokat jelentse meg. Tltsd fel az sszes parancsfjlt a w ebkiszolglra, s nyisd meg a Guitar Wars oldalt a bng szdben. Figyeld meg, hogy m ely rekordok lthatk, majd nyisd meg az Admin oldalt, kattints valamelyik Approve hivatkozsra, hagyd jv a kivlasztott rekordot, s a foldalra visszatrve nzd meg, hogy m egjelenik-e a rekord.

Guitar W ars - High Scores Administration


B ek a u *

ot .11 Guitar Wars high

0* , .

U * th * p a** to n ^ o v e a * * * n c * k * J

2008-05-02 14D2SX 500000 /Aejao>J. Jaco h Scoirberson 2008-05-01 20:36:45 389740 Rspovc T-Boixr T a jlo r
Pe/ La*v

Name Kthel liccfcel

Dac

Score

Aeon

BW Jedi
Leddy Cke Beita (Jb*vy J c a c Paui Jonw Phlz LsJrson Paco Jastorius NvO Johinssoo Keun>

200805-01 21:15:17 354 iqQR c ^ 2008-05-02 20:36:28 322710

200805-02 20:32:54 314340____ __ 2008-05-01 21:14:56 308710 Remnvr 2008-05-0! 20:36.-07 282470 L cfj^ 2008-05-01 20:38:23 243260 Rapovg 2008-05-01 20:37:40 1S6580 Sill&vc 2008-05-01 20:37:23 127650 Removc 2008-05-01 20:37)2 98430 2008-05 O 20:38:00 64930 kem ov?

Az Admin oldalon tall hat j Approve hivatta zsok lehetv teszik az Approve Score oldal elrst, ahol az egyes rekordok jvhagyhatok.

Az alkalmazs biztonsgoss ttele

G u itar W a rs - A pprove a n ig n acur


Arc you sure y want d approve thc iolkwing high score' va
Nitove; Pcz Law Date: 2008-05-02 2U:36:2S Scor: 322710

A rekordok jvhagyst egy megerst zenet megjelentse kveti.

Guitar Wars - Approve a High Sow------|


The high score of 322710 for Pcz Law was successfully approved, j ) Back to admin page I

Egy egyszer rlap megero stst kr a rekordok tny leges jvhagysa elolt.
354!90
N am e: T -B on c Taykir Daw : 2008-05-01 21:15:17 Cuitar W * corr

S c o re
3 5 M1 T 0

322710

HZ ujonna jvhagyott rekord megjelenik / a Guitar W/ars foldala'

Nam : Fez Law D ale: 2C8-05-02 2 0 :3 6 2 8

314340
N am e: 3ifT Jeck D ate: 2008-0502 20:32:54

most itt vagy

329

Ethel ism t lecsap

A milli pontos csals


A Guitar Wars moderlt vltozata jelents elrelpst jelent a biztonsg te rn, de mg m essze ll attl, hogy valban bom babiztos legyen. gy t nik, hogy furfangos tmadnk ismt tallt egy gyenge pontot a rendszer ben. s valahogy kpes tljrni a m odertor eszn. Ethelt vgleg meg kell lltanod, hogy helyrelltsd a bizalmat a Guitar Wars-univerzumban.

Guiar wrs - High Scores

Guitar Wars - High Scores


W cicoroc, Guitar W am or. do you have whai it takes to crack the high score list? If so. just

Top Score: 1000000


1000000

Ez pontosan az a fajta rekord, aminek a megjelen st a modertornak rgtn meg kellene akadlyoznia - mg is itt van!

N am e: Ethel Heckel D a te: 2008-05-05 14.58:59

Gui t a r
Name:
S co re : to o o o o o

EtUelH*

szintn szlva nem tudom , melyik az lvezetesebb: harmonikzni vagy gnyt zni a G u ita r W a rs webhelybl! i

389740
N am e: Jacob Scorcbcrson D ate: 2008-05-01 20:36:45

Gui t a r
Name*-

JACOBOVNSU

Ethel tncra perdl r mben, hogy ismt megverte a rendszert.

330 6 .

fejezet

Az alkalmazs biztonsgoss ttele

A moderls mindent megold?


Br a m odertornak szem ernyi ktsge sincs afell, h o g y ^ Ethel rekordjt, a rekord tisztn lthat, es az ap p rov ed oszlopban az rtk ll Tudjuk, hogy az Add Score parancsfjl az ap p ro v e sz P minden j rekord e s S b e n o-ra lltja, hiszen ppen az tment modosrtott k az I N S E R T - I e k r d e z s t a parancsfjlban. Valami nagyon nem stimmel.

A Guitar Wars modertor nak fogalma sincs, hogy mi trtnhetett.

_ Ez meg hogy le h e ts g e s? Tudom , hogy nem h a g y ta m jv e z t a rekordot. E gym illi p o n t? l

id

date

name

score

screenshot

approved

21 22 23 24 25 26 27 28 29 31 32 1 33

2008-05-01 20:36:07 2008-05-01 20:36:45 2008-05-01 20:37:02 2008-05-01 20:37:23 2008-05-01 20:37:40 2008-05-01 20:38:00 2008-05-01 20:38:23 2008-05-01 21:14:56 2008-05-01 21:15:17 2008-05-02 20:32:54 i 2008-05-02 20:36:38 2008-05-05 14:58:59

Belita Chevy Jacob Scorcherson Nevil Johansson Paco Jastorius Phiz Lairston Kenny Lavitz Jean Paul Jones Leddy Gee T-Bone Taylor Biff Jeck Pez Law Ethel Heckel

282470 389740 98430 127650 186580 64930 243260 308710 354190 314340 322710 1000000

belitasscore.gif jacobsscore.gif nevilsscore.gif pacosscore.gif phizsscore.gif kennysscore.gif jeanpaulsscore.gif leddysscore.gif tbonesscore.gif biffsscore.gif oezsscore.gif ethelsscore2.gif

1 1 1 1 1 1 1 1 1 1 1

4.

Ezt a pontszmot a mode rtor soha nem hagyta jv,

Agytorna
Mit gondolsz, hogyan utn l lt,el ham is rekordja a modertoron?

az approved oszlopban mgis az 1 rtk ll, gy a rekord megjelenik.

m ost it t vagy > 331

prbld ki Ethel trkkjt!

> Agyragyr
Ethel milli pontos csalsnak semmi kze az Approve Score parancsfjlhoz, hanem teljes egszben az Add Score rlapra korltozdik. Albb lthatod, hogy pontosan milyen rlapadatokat adott m eg Ethel az Add Score rlapon a csals kivitelezshez, rd be ugyanezeket az adatokat a sajt rlapodon, s nyjtsd be a pontszmot. Sze rinted mi trtnik?

Ne felejts el szkzt tenni a - u t n .N ^


Ethel Heckel 1000000', ' ethelsscore2.gif, l)

ioi

Ez brmilyen GIF vagy JPEG kpfjl lehet, ami 32 KB-nl kisebb.

[ \O \\ U
Oll< IjOlOUI

ethelsscore2.gif

332 6. fejezet

Az alkalmazs biztonsgoss ttele

Pontosan hogyan csinlta?


Ahhoz, hogy megrstd, mi trtnik ennek a furfangos tmadsnak a sorn, nyom on kell kvetned az rlapadatokat, ahogy vgighaladnak az Add Score parancsfjlon.
? _ CiMd,

Ti -

Add your H,9 h icore

Guitar Wars - Add Your High Score


Nacic: Ethel Hecfce 1
Score: |l000pp0*. ^tij<o^2 s; S e r e sh o t o M K a a t ! . ------

Ethef nem csak a pontszmt rta be, hanem egy csom ms furcsa dolgot isi

$ POST[ s c o r e '3

$score = $ POST['score'];
$ POST[* name' ] $ POST[ s c r e e n s h o t ' ]

A Score rlapmez' szo katlan tartalma a $seore vltozba kerl, ami kz vetlenl utat tall az INSERT-lekrdezsbe.

INSERT INT guitarwars VALUES (0, N O W (), 1$name1, !$score',

*$screenshot1, 0)

A Score rlapm ez egyetlen szm rtket vr - pldul 1 0 0 0 0 0 0 - de ehelyett tbb, aposztrfok kz zrt rtket kap, am elyeket vesszk vlasztanak el egy mstl, majd vgl furcsa m don kt ktjel kvetkezik. Elg bizarr. Ezeket a furcsa adatokat elszr a $ s c o r e vltoz trolja, majd beplnek az INSERT-lekrdezsbe. Ez vajon csak egy rtelm etlen pontszm ot eredm nyez, vagy7 valami baljslatbb dolog trtnik itt?

Hegyezd ki a ceruzd!
Az elz oldalon szerepl rlapadatokat pontosan lemsolva rd meg a teljes Add Score SQL-lekrdezst a milli pontos csalshoz. G on doskodj rla, hogy a lekrdezsben a vltozk helyre a tnyleges rlapadatok kerljenek. rd le azt is, hogy szerinted mi trtnik.

m ost it t vagy

333

az sq-befecskendezs mkdse

Hegyezd ki a ceruzd! Meoolds

Az elz oldalon szerepl rlapadatokat pontosan lemsolva rd me > a teljes Add Score SQL-lekrdezst a milli pontos csalshoz. G on doskodj rla, hogy a lekrdezsben a %'ltozk helyre a tnyleges rlapadatok kerljenek. rd le azt is, hogy szerinted mi trtnik.

INSERT INTO. (0, HCMO, EKel ttetkel', *i0 0 0 0 0 0 ',


Ethel valahogy elksztette a sajt vltozatt a lekrdezsbl, ami fellrja az eredetit.

j ) / - \ 'ethelsstoreZ.^;, 0?
Mivel az adatbzis szerkezetben .az approved oszlop az utols, az I rtk kerl b e le ... ami olyan, mint

Ez a lekrdezs elg furcsn nz ki. A kpemyfelvtel fjlneve ktszer szerepel a kt k t je l jelentse pedig re jt ly . M kdik ez a lekrdezs?

ha a rekordot jvhagytk volna!

A MySQL tverse megjegyzsekkel


Ethel milli pontos csalsban az igazi bnsk - klns m don - az SQLm egjegyzsek. A ketts ktjel ( - - ) azt jelzi, hogy az adott SQL-kdsor fennm arad rsze m egjegyzs. Alihoz, hogy a dolog m kdjn, a ketts kt jelet egy szkznek kell kvetnie, de a szkz utn minden figyelmen kvl lesz hagyva. Most, hogy a blcsek kve a zsebedben van, vess egy pillantst Ethel teljes lekrdezsre:

A megjegyzss teszi az SQL-kdsor fennmara d rszt, amit az adatb zis figyelmen kvl hagy.

INSERT INT guitarwars VALUES (0, NOWO, 'E th e l H eckel', 1000000 , e t h e l s s c o r e 2 . g i f ' , 1)

gy mr vilgosabb? A m egjegyzs lnyegben trli a fennm arad SQLkdot, hogy ne lpjen fel hiba, s Ethel lekrdezsvltozata gond nlkl t cssszon a szrn. A vgeredm ny egy azonnal jvhagyott j rekord lesz, amelyet a m odertornak eslye sincs elfogni.

Ethel tverte a lekrde zst, hogy jvhagyja a pontszm.

334

6. fejezet

Az alkalmazs biztonsgoss ttele

Az Add Score rlap SQL-befecskendezs ldozata lett


Azt a fajta tmadst, amit Ethel vgrehajtott, SQL-befecskendezsnek nevezik, s egy rendkvl gyes trkkre pl, ami az rlapadatok felhasznlsval mdostja egy lekrdezs alapvet mkdst. Ahelyett, hogy az rlapmezk csupn inform ci kat, pldul egy nevet vagy egy pontszmot szolgltatnnak, magt a httrben te vkenyked SQL-lekrdezst mdostjk. A Guitar Wars alkalmazs esetben Ethel SQ L-befecskendezse a Score m ezt hasznlta arra, hogy a pontszmon kvl a kpernyfelvtel fjlnevt, a jvhagysi llapotot s a vgn egy m egjegyzst is bejuttasson, ami megakadlyozza, hogy az eredeti SQL-kd hibazenetet adjon.

Az urlapmezl bizton sgi rst jelentenek a webalkalmazsokban, mert lehetv teszik a felhasznlknak, hogy adatokat vigyenek be.

^ Q P

CoKar Wars - AddYoiuH.gh Score

Guitar Wars - Add Your i f

m if

INSERT INTO guitartars VALUES (0, N O W (), '$name 1, '$score1, '$screenshot1, 0)

Nincsenek

hlye krdsek

K V

Vannak msmilyen megjegyzsek is az SQL-ben a - mellett?

K V

! Ethel SQL-befecskendezses tmadsa akkor is mkd ne, ha az approved oszlop nem a tbla vgn szere pelne?

Igen. Az egysoros m egjegyzsek msik fajtjt a # jel vezeti b e a - - helyett, de ez is m egjegy zss alakt minden SQL-kdot a sor vgig, ami a # utn szerepel. Az SQL ezenkvl a tbbsoros m egjegyzseket is tmogatja, am elyek annyiban hasonltanak a PHP tbbsoros m egjegyzseire, hogy a /* s */ jelek kz kell zrni ket.

! Nem, s ez nagyon fontos. Az emltett INSERTlekrdezs az oszlopok alaprtelm ezett rendez sre tmaszkodik a tblban. Az 1 rtk hozzfzse a lekrdezs vghez azrt mkdik, mert az ap p roved az utols oszlop, ami rgtn a s c r e e n s h o t oszlop utn szerepel.
most itt vagy >

335

az sql-befecskendezs megakadlyozsa

Az adatok vdelme az SQL-befecskendezssel szemben


A valdi gyenge pontot, am elyet az SQ L-befecskendezsek kihasznlnak, azok az rlapm ezk jelentik, am elyek nem ellenrzik a veszlyes karakterek jelenltt. Minden olyan karakter veszlyes karakternek szmt, ami m egvl toztathatja egy SQL-lekrdezs term szett - a vesszk, az idzjelek, illetve a - m egjegyzsjelek. Mg az adatok vgn tallhat szkzk is rthatnak. A kezd s zr szkzket a PHP beptett t r i m ( ) fggvnyvel egyszer en eltvolthatod; csak vgig kell futtatnod minden rlapadatot a t r i m ( ) fgggvnyen keresztl, mieltt felhasznlnd ket egy SQL-lekrdezsben.

$name = trim($ POST [ ' name' ] ) ; $ s c o r e = trim {$_PO ST[ ' s c o r e ' ] ) ; $s c r e e n s h o t = tr im ( $ F IL E S [ 1s c r e e n s h o t ' ] [ ' name1] ) ;

A trim () fggvny eltvoltja a kezd s zr szkzket ezekbl az urlapadatokbl.

Az SQL-befecskendezs az urlapadatok megfelel" fe l dolgozsval meg akadlyozhat.


A mysqli_rel_escape_string () fggvny a veszlyes karaktereket vdett formra alaktja, amelyek nincsenek kros hatssal az SQLlekrdezsekre^

A kezd s zr szkzk azonban csak egy rszt jelentik a problm nak, hiszen ott vannak mg a vesszk, az idzjelek, a m egjegyzsjelek, s gy to vbb. Azon kvl teht, hogy az rlapm ezkbl el kell tvoltanod a fls szkzket, arra is tallnod kell egy mdszert, hogy rtalmatlann tedd a tb bi problm s karaktert is. A PHP eb b en egy msik beptett fggvnnyel se gt: ez a m ysql i _ r e a l _ e s c a p e _ s t r i n g ( ) , amely levdi a potencilisan v e szlyes karaktereket, hogy ne lehessenek kros hatssal egy lekrdezs vg rehajtsra. Ezek a karakterek tovbbra is szerepelhetnek az rlapm ezk ada tai kztt, de a lekrdezst nem fogjk befolysolni. A t r lm () s a m ysql i _ r e a l _ e s c a p e _ s t r i n g () fggvny egyttes haszn latval szilrd vdelmi vonalat pthetsz ki az SQ L-befecskendezsek ellen:

$name = mysqli_real_escape_string($dbc, t r im ($ _ P 0 S T [ 'name' ] ) ) ; $ s c o r e = mysqli_real_escape_string ($dbc, tn m ($ _ P 0 S T [ ' s c o r e ' ] ) ) ;

$ s c r e e n s h o t = mysqli_real_escape_string($dbc, t r i m ( $ _ F I L E S [ ' s c r e e n s h o t ' ] [ ' name' ] ) ) ;

A mysqli_real_escape_string() az adatbzis fggvnye, ezrt egy olyan adatbzis-kapcsolati vltozt kell tadni neki, mint amilyet a lekrdezsek benyjtsakor hasznlunk,

A Guitar Wars hrom rlapm ezjnek feldolgozsa a t r i m ( ) s a m ysql i _ r e a l _ e s c a p e _ s t r i n g () fggvnnyel jelentsen cskkenti egy jabb SQ L-befecskendezses tmads eslyt, de ez a kt fggvny sem elg - valahogy magt a lekrdezst kellene kevsb srlkenny ten n i...

336 6. fejezet

Az alkalmazs biztonsgoss ttele

Egy biztonsgosabb INSERT (paramterekkel)


Az rlapm ezk gyenge vdelm nek kiaknzsa mellett Ethel SQ L-befecskendezses tmadsa azt a tnyt is kihasznlta, hogy az ap p rov ed oszlop a s c r e e n s h o t oszlop utn kvetkezik az adatbzisban. gy sikerlt egyszeren hozzadnia az 1 rtket az INSERT utasts vghez, s bejuttatnia azt az ap p roved oszlopba. A problm a az, hogy az INSERT-Iekrdezs gy van m egszerkesztve, hogy az sszes oszlopba b e kell szrnia adatot, ami szksgtelenl nveli a kockzatot.

Az INSERT-lekrdezsek megrhatk
^ i , ^
h i

gy, hogy pontosan meghatrozzk, hogy


l i i * m e | y O S Z lO p O K D a m I k e r ln e k NKK K iU m t/K .

1L

Az lenne az idelis, Ha nem lltannk be az id s az approved oszlopok rtkt, mivel / ezek egyszeren m e g h a tj k az alaprtei mezett rtket. \

ly o n

INSERT Il'jjfc g u ita rw a rs >y VALUES (0, NOW(), ' $name, f $ s c o r e f / $ s c r e e n s h o t , 0)


Amikor gy szrsz be adatokat egy tblba, az adatok sorrendjnek meg kell egyez nie az oszlopoknak a tbla szerkezetben elfoglalt sorrendjvel. Az tdik adat pl dul a s c r e e n s h o t oszlopba kerl, mert ez az tdik oszlop a tblban. Az id , illet ve az ap p rov ed oszlop rtkt azonban nem felttlenl szksges kifejezetten b e szrni, hiszen az id rtke automatikusan nvekszik, az ap p rov ed oszlopba pedig mindig 0-nak kell kerlnie. Jo b b m egkzelts, ha csak azoknak az adatoknak a b e szrsra sszpontostunk, am elyek egy j rekordhoz elengedhetetlenl szksge sek. Az id s az ap p rov ed oszlopoknak m egengedhetjk, hogy alaprtelm ezett r tket - AUTO_INCREMENT s 0 - kapjanak. Teht egy tdolgozott INSERT-Iekrdezsre van szksg, am ely az adatok listja eltt az oszlopok listjt vrja, m egegyez sorrendben. gy kikszblhet az a kockzat, amit az ap p rov ed oszlop belltsa jelent, hiszen az oszlop mr nem lesz a lekrde zs rsze. Ha ez a fajta lekrdezs ism ersnek tnik, annak az az oka, hogy ms pl dkban mr tbbszr is hasznltad:

INSERT INTO g u ita rw a rs (d a te , name, s c o r e , s c re e n s h o t) VALUES (NOW(), ' $name' , f $s c o r e ' , ' $ s c r e e n s h o t ')
Az id oszlop kihagyhat, mivel gyis automatiku san nvekv rtket kap.

* * approved osWo?fe3

Semm/ szrhat be

6zes rszt

m , e ri

"em

a lekr.

Az INSERT-lekrdezsnek ez a vltozata pontosan meghatrozza, hogy az egyes adatokat mely oszlop ok nak kell trolniuk, ami lehetv teszi, hogy anlkl szrj b e adatokat, hogy aggdnod kellene a m gttes tbla szerkezete miatt. Valjban helyesebb kdolsi stlusnak minsl ilyen INSERT-Iekrdezseket hasz nlni, s az adatokat pontosan oda beszrni, ahol t rolni szeretnnk ket, nem pedig a tbla szerkezetre tmaszkodni.
most itt vagy

337

a DEFAULT parancs

Na, llju n k meg egy percre I M o s t hallok e l s z r a la p rte lm e z e tt rtkekr<5) egy M y S Q L -t b l b a n . Tnyleg le h e ts g e s ilye n e ke t m egadni?
O

Nem csak hogy lehetsges, hanem nagyon j tlet alaprtelmezett oszlop rtkeket meghatrozni, amikor csak lehet.
Egy oszlop szmra az SQL DEFAULT parancsval hatrozhatsz meg alaprtelme zett rtket. Ha egy oszlophoz alaprtelmezett rtk tartozik, nem kell bellta nod az INSERT-Iekrdezsekben - nyugodtan htradlhetsz abban a tudatban, hogy automatikusan megkapja az alaprtelmezett rtket. Ez a g u ita r w a r s tb la approved oszlopban idelis megolds. Csak annyit kell tenned, hogy mg egyszer mdostod a tblt, hogy az approved oszlop szmra belltsa a 0 (jv nem hagyott) alaprtelmezett rtket:

Mivel az approved oszlop mr ltezik, ebben az ALTR TABLE utastsban az ADD

A DEFAUtTlparancs hatsra a , p - l W u t m a t* a 0 rtk kerl, U a a k W I W lekrdezs k ife j * msik rtekre nem allit|a.

C r

COLUMN helyett a MODIFY COLUMN parancsot kell hasznlnod.

ALTR TABLE guitarwars MODIFY COLUMN approved TINYINT


DEFAULT 0

Az oszlop tpust tovbbra is meg kell hatroznod, csak arra kell gyelned, hogy megegyezzen az osz lop ltrehozsakor megadottal.

Most, hogy7 az approved oszlopot mdostottad, hogy alaprtelmezett rtket kapjon, az Add Score parancsfjlban lev j, javtott INSERT-Iekrdezs anlkl szrhat be rekordokat, hogy emltst tenne az approved oszloprl. Ez j terve zsi megolds, mivel egy olyan oszlopba nem kell kifejezetten rtket beszrni, ami alaprtelmezett rtket kaphat, s az approved oszlop elrejtse nmileg n veli a biztonsgot a tmadsokkal szemben.

338 6. fejezet

Az alkalmazs biztonsgoss ttele

Az 'rlapellen'rzs soha nem lehet elg intelligens


Mg egy utols lps szksges ahhoz, hogy cskkentsd az SQ L-befecskendezs kockzatt: az rlap ellenrzsnek tovbbfejlesztse az Add Score parancsfjlban. Mieltt ellenriznd, hogy a kpernyfelvtel fjltpusa s m rete m egfelel-e az alkalmazs kvetelm nyeinek, meg kell vizsglnod az Add Score rlap hrom m ezjt, hogy nem resek-e:

if

{ ! empty($name) & ! em pty($score) &

& ! empty($ s c r e e n s h o t )) &

Ez az if utasts ellenrzi, hogy az urlapm ez1< mindegyikt kitltttk-e.


Ezzel a kddal nm agban nincs semmi gond, de egy alkalmazs biztonsgoss ttelhez gyakran tbbre van szksg a ktelez krknl. Mivel a Score m ez egy szmot vr, sszer nem csak azt vizsglni, hogy a mezt kitltttk-e, hanem azt is, hogy szmot rtak-e bele. A PHP is _ n u m e r ic () fggvnye pontosan erre szolgl: ha az tadott rtk szm, akkor tr u e -t, ha nem, akkor pedig f a l s e - t ad vissza. Az olyan aprsgok kvetkezetes ellenrzse, mint hogy egy olyan m ezben szm szerepel-e, am elyben szmot vrunk, teszi az alkalmazsokat a lehet legjobban vdett a tmadsokkal szem ben.

is_numeric (465730)

| a vagy hamis, attl gz


is _ n u m e ric ( * one m i l l i n ! 1) m fggen, hogy a fels hasznl szmot rt-e

^ igaz!

%
is_numenc

L tnii||

U Se.

is_numeric ($score)

Amikor csak lehetsges, ragaszkodj hozz, hogy az urlapadatok a kvnt formtumak legyenek.

rd t az Add Score rlapot ellenrz i f utastst az is _ n u m e r ic () fggvny felhasznlsval gy, hogy a pontszm m ezjbe csak szm ot lehessen berni!

Gyakorlat

most itt vagy

339

teszteld az j addscore.php p ara ncsf jlt!

rd t az Add Score rlapot ellenrz i f utastst az is _ n u m e r ic () fggvny felhasznlsval gy, hogy a pontszm m ezjbe csak szmot lehessen berni!

Gyakorlat - megolds
i (Itrr\^bf(I

mc) && i m e r i t j &cre)

.........................................................................................................................................................................................

Tesztt
Erstsd meg az rlapadatok kezelst az Add Score parancsfjlban!
Mdostsd az rlapadatok vltozkhoz rendelst az a d d s c o r e .p h p parancsfjlban gy, hogy a t r i m ( ) s a mysq'l i _ r e a l _ e s c a p e _ s t r i n g () fggvnyek kitiszttsk az rlapadatokat, majd mdostsd az INSERT-Iekrdezst, hogy az oszlopneveket s az rtkeket is meghatrozza, s gy ne kelljen megadni az id s az ap p rov ed oszlop rtkt. Vltoztass az rlapm ezket ellen rz i f utastson is, hogy azt is megvizsglja, hogy a pontszm szm rtk-e. vgl valamelyik MySQL-eszkz segtsgvel futtasd le az ALTER-lekrdezst, amely az ap p rov ed oszlopnak a 0 alaprtelm ezett rtket adja. Tltsd fel az j Add Score parancsfjlt a w ebkiszolglra, nyisd meg egy bngszben, s pr bld ki jra a korbbi SQ L-befecskendezses tmadst.

CuUar Wars -A d V oy Hign Scort?_

Ez a hibazenet persze lehetne konkrtabb, de a clnak meg felel, s nem bonyoltja to vbb a parancsfjlt-

Guitar Wars - Add Your High Score A Score urlapmezo most mr csak sz mokat fogad el, semmi mst.
Please enter all of the information to add your hi*h score.

Name:

Ethci Hcckei

Score: 10 0 0 0 0 0 . ,*fr*5ssa*e2. Scrccn shot: Cnoose me / no filc s^eett

' d' d

Az urlapellenorzs olyan tma, ami messze tlmutat az adatbzisok bizton sgn. Az ellenrzssel a 10. fejezet ben bvebben is foglalkozni fogunk.

340 6. fejezet

Az alkalmazs biztonsgoss ttele

gy tnik, Ethel eltkltsgt, hogy belepiszkljon a Guitar Wars rekordjai ba, vgl sikerlt megtrni, hla azoknak a javtsoknak, am elyek vdett te szik az alkalmazst az SQ L-befecskendezssel szem ben. Az igazi bajnok gi trhs ezt azzal hllta meg, hogy mr fel is tlttt egy j rekordot.

mm

Guita* Wars -H igh Scores

Guitar Wars - High Scores


W elcom e, Guitar Warrior, do you have what it cakes to crack the high score list? If so. just add ym!LQwjlK 2 - | j

Top Score: 465730


465730
N am e: Jacob Scorchcrson D a te: 2008-03^ )5 2 3 :2 8 .0 7

I G

t a r

Vgrel jra veze tem a lis t t , m gpedig egy elke p e s z ttf j re k o rd d II


> 20:36:45 1

Name: J ACvBOUNSU
Score * MbS?3G

Name: J ACOBOWMSU AC0B0UMSU

Jacob felllegezhet, mert a rekordok most ma'r vdettek a kls beavatkozssal szem ben - fel is t lt tt egy j rekordot, amit nehz lesz fellmlni.

A k u ty a f j t, e z t b e b u kta m l T aln egyszerbb, ha m e g ta nulok j ts z a n i a v irtu lis g it r o n ...

Ethel - beltva, hogy a csatt elvesztette - gy dnt, hogy inkbb csatlako zik a gitrhskhz.

m ost it t vagy

341

PHP & MySQL szerszmoslda

PHP & MySQL szerszmoslda


Mikzben a Guitar Wars dicssglistjt megjele nt webalkalmazst magasabb szintre emelted, jnhny j eszkzt s eljrst ismertl meg. Is mteljk t a legfontosabbakat:
exi t ()
Ezzel a beptett PHP-fggvnnyel azonnal lellthatod egy PHPparancsfjl futst. Amikor egy pa rancsfjl az e x i t ( } fggvnyh vssal tallkozik, sem m ilyen to vbbi PH P-kdot nem hajt vgre, s sem m ilyen tovbbi HTMLkdot nem ad t a bngsznek.

header()
Ezzel a beptett PHPfggvnnyel fejlceket kldhetsz a kiszolgltl a bngsznek, ami olyan feladatok elvgzst teszi lehetv, mint az tirnyts egy msik oldalra, a tartalomtipus m eghatrozsa vagy a HTTP-hitelests.

$_SERVER
Ez a beptett PHP-satperglobte tbbek kztt azt a felhasznl-

nevet s jelszt trolja, amit a felaszna10 akkor r be, amikor egy HTTP-hitelestst ignyl oldalt' pro :>ai elrni. Ezeket sszevethe ted a vrt rtkekkel, hogy meg vedd azokat az oldalakat, ame DEFAULT rtk lyeknek biztonsgosaknak kell Ezzel az SQL-utastssal egy osz lennik.
lop alaprtelm ezett rtkt adha tod meg egy tblban. Ha a tbl ba j sor kerl, s az oszlop rt kt nem adjk meg, az oszlop az alaprtelm ezett rtket

is_numeric()
Ezzel a beptett azt ellenrizheted, hogy egy rtk szm -e. Akkor veheted hasznt, ha arra vagy' kvncsi, hogy egy szm ot vr rlapm ez szm rtket tartalmaz-e.
W S

r e a l_ e8cap e" S tr in 9
p H P - B S S vn*

Ez a k t b ^ P f az riPadaU>
\ y o z to to d ,h o w

^ o z s b a n

fc .akkel m egakada811) W B i( k

ms karak
az S Q U e k e r d e z

dolgba.
^ ^

Az els fggvny * mi a msodik szkzket vgja le, 8 ^ le


a klnleges kara

342 6. fejezet

Az alkalmazs biztonsgoss ttele

Emberi felgyelet (moderls)


M in d e n n e k a * em be ri fe l g ye le t t k " k s a l t n k b e n a^ ti a Jeof ? r ;ikra n egy e m b e r je le n ti a le g jo b b Vdelm et m pr, l -

SQL-befecskendezs
A biztonsgi rendszer kijtszsa, amelynek sorn a tmad valami lyen mdon mdost egy SQL-lekrdezst. hogy jogosulatlan hozzf rst szerezzen egy adatbzishoz. A legtbb SQL-befecskendezses t madsnak rsze egy w ebes rlap t verse, hogy veszlyes adatokat ad jon t kzvetlenl egy dinamikusan felptett lekrdezsnek. Az ilyen t mads ellen gyakran az rlap ellen rzse

e m o e n nehez fe l lm ln i.

embert

'gondolkod

HTTP-hitelests
Egyszer w ebes biztonsgi eljrs, am ely a felhasznlnv s a jelsz elkrsvel korltozza egy w eboldal vagy parancsfjl elrst. A HTTP-hitelestst nem a magas biztonsgi kvetelm nyeket t maszt, rzkeny adatokat kezel alkalm azsokhoz szntk, de egy w ebalkalm azs biztonsga gyor san nvelhet vele.

Oszlop/rtklekrdezs
Az IN SER T utasts egyik fajt ja, am ely gondosan egyezteti ^ az o s z l o p o k a t a hozzjuk tartz rtkekkel, ahelyett, hogy arra tm aszkodna, hogy az adatok sorrendje m egegyezik az oszlo poknak a tblban elfoglalt sorrendjvel.

most itt vagy

>

343

7 Szemlyre szabott webalkalmazsok ptse

Emlkszel rm?#
M it m ondott, hogy is hvjk? Ja, pereze, Jo h n so n . No, M r. Jackeon, n nem l to k i t t nrl a d a to t. B iz to s b enne, hogy k t t t fe lo lv a s z t s i g a ra n c ia s z e rz d s t a h ib e rn l k a m r j ra ? V agy gy, ezval a kamrbl te le fo n l. M it m o n d o tt, m l a neve?
X

Senki sem szereti, ha elfelejtik - a webalkalmazsok felhasznli klnsen nem.

Ha egy alkalmazs ismeri a tagsg fogalmt, teht a felhasznlk sze mlyre szabottan hasznlhatjk az alkalmazst, akkor az alkalm azsnak em lkeznie kell a felhasznlkra. Szrny lenne, ha minden alkalom mal be kellene mutatkoznunk a csaldunknak, am ikor hazarkezve b e lpnk az ajtn. Erre azrt nincs szksg, mrt az em bereket egy csod latos dolog segti: a m e m ri ju k . A w ebalkalm azsok azonban nem em l keznek automatikusan az em berre - egy gyes w ebfejlesztnek kell a rendelkezsre ll eszkzkkel (taln a PHP s a MySQL segtsg vel?) olyan szem lyre szabhat w ebalkalm azst ksztenie, am ely kpes m egjegyezni a felhasznlit.

ez egy uj fejezet

345

nehz olyat tallni a ki tnyleg nem illik hozznk


,

Azt mondjk, az ellenttek vonzzk egymst


rk trtnet: a fi tallkozik a lnnyal, a lny szerint a fi rlt, a fi szerint a lny zakkant, de pont ezrt vonzdnak egym shoz, s boldogan lnek, amg meg nem halnak. Erre pl j trskeres oldalunk, a Mismatch.net. A Mismatch w ebhely kom olyan veszi ,,az ellenttek vonzzk egym st elm letet: olyanokat prost ssze, akikben tnyleg nincs semmi kzs. A gond csak az, hogy a Mismatch mg nem indult el, s rettent nagy szk sge lenne egy w ebfejlesztre, aki befejezi a rendszer felptst. Na, ez le szel te. Magnyos szvek millii vrjk trelmetlenl az alkalmazs elkszl tt - ne okozz nekik csaldst!

E z t a b ic e p s z e t figyeld!
O

Sidney a valsgshow-k, a jga s a sushi megszl lottja, s egy sikeres flreprostsban remnykedik.

Johan N ettles M ale

1981-11-03
A lig vrom , hogy m e g ta l lja m a t k le te s e lle n t te m e t!

A thens, GA

szemlv,e szabott v w b k * n a z to *

'

e l r n i

s t.

S idney K elsow F em ale


- >

Johan a pankrcit, a sly emelst s a hskonzervet szereti, s brki izgalomba hozza, aki vlaszol neki.

1984-07-19
Tem pe, A Z

A Mismatch alkalm azs felhasznlinak szem lyre szabottan kell tudniuk hasznlni a w ebhelyet. Ez elszr is azt jelenti, hogy* sze m lyes profilra van szksgk, am elybe olyan inform cikat rhat nak magukrl, mint a nem k, vagy a szletsi dtumuk s helyk, s m egoszthatjk azokat a tbbi M ismatch-felhasznlval.

346

7. fejezet

Szem lyre s z a b o tt w ebalkalm azsok ptse

A Mismatch a szemlyes adatokra tmaszkodik


A Mismatch alkalm azs teht a szem lyes adatokon keresztl teremt kap csolatokat. A kapcsolatoknak egy felhasznli kzssgen bell kell ltrejnnik, am elyben a Felhasznlk m indegyike elrheti a w ebhelyet, s szerkesztheti a sajt szem lyes adatait. A M ism atch-felhasznlk nyom on z a (^smatch adatbzis kvetst s szem lyes adataik trolst a m ism a tc h _ u s e r nev adatb. zistbla fogja segteni. __ '

join_dqW

birthdof
Kel sow 1984^)7-19
Temp

A Mismatch adatbzison bell a mismatch_jjser tbla trolja a felhasznlkat s a szemlyes profiljuk adatait.

2008-04-17 09:43:11

2008-05-23 12:24:06

Nettles

Athens

| V " W . ! J / . V . | r

BM W -

-l J *

A m ism atchjiter tbla minden sora egy-egy felhasznl

\ \

----------- -------- szemlyes adatait tartalmazza.


Mismatch - Ed* Profik Mismatch Edit Profile Mismatch - View Profile
Personal Information--------

Az Edit Profile (Profil szerkesztse) s View Profi le (Profil megtekintse) oldalaknak tud^ e l l , hogy kinek a profiljt kell elrnik.

First name: Sidney First name: Sidney Last name: Kelsow Gender: Female Birthdate: 1984-07-19 Location: Tcmpe.AZ Last name: Keisow Gender: Birthdate: Ti 1984-07-is

T pe em
State: a z Picture: f c h w fe t n ttficm

S idney K elsow F em ale


1984-07-19
T e m p e .A Z

1
I
I

Would you like to edit your onifiic

A felhasznli profil m egtekintsn kvl a M ismatch-felhasznlk az Edit Profile oldalon keresztl szerkeszthetik is a sze m lyes profiljukat. A gond csak az, hogy az alkalm azsnak tud nia kell, hogy melyik felhasznl profilja ll szerkeszts alatt. Az Edit Profile oldalnak teht valahogyan nyom on kell kvet nie, hogy melyik felhasznl nyitotta meg az oldalt.

Agytorna

Hogyan szabhatja testre a Mismatch alkal m azs az Edit Profil oldalt a klnbz felhasznlk szmra?

most Itt vagy

347

bejelentkezes a mismatch alkalmazsba

A Mismatch alkalmazsban bejelentkezsre van szksg


A Mismatch alkalm azsban a szem lyes adatok elrsnek problm jra az jelenthet megoldst, ha a felhasznlknak be kell jelentkeznik. Ez leh e tv teszi a Mismatch alkalmazsnak, hogy hozzfrst adjon a klnbz felhasznlk szem lyre szabott adataihoz. A bejelentkezett felhasznl pl dul csak a sajt profiljnak adatait szerkeszthetn, br a tbbi felhasznli profil m egtekintsre azrt lehetsge lenne. A Mismatch alkalm azs sze mlyre szabsnak kulcsa teht a felhasznli bejelentkezs. A felhasznli bejelentkezs ltalban ktfle adat, a felhasznlnv s a jel sz megadst ignyli:

A felhasznli bejelent kezs lehetv teszi, hogy egy webalkalmaza's szemlyre szabottan ke zelje a felhasznlkat.

Felhasznlnv
A felhasznlnv arra szolgl, hogy egyedileg azonostsa a felhasznlt a rendszeren bell. Ezen kvl a felhasznlk a felhasznlnevkn keresztl lphetnek kapcsolatba egymssal.

Jelsz
A jelsz feladata, hogy bizonyos fokig biztonsgoss tegye a felhasznli bejelentkezst, s m egvdje a szem lyes adatokat. A bejeletkezshez a felhasznlnak a felhasznlnevet s a jelszt is meg kell adnia.
******

jnettles

sidneyk

\
A felhasznlnv jellemzen be tkbl s szmokbl ll, s a fe l hasznl hatrozhatja meg.

A jelsz rendkvl rzkeny adat, ezrt soha nem sza bad lthatv tenni egy alkalmazsban, mg az adatbzison bell sem. 1 I

A felhasznlnv s a jelsz lehetv teszi a felhasznlnak, hogy7 bejelentkezzen a Mismatch alkalm azsba, s elrje a szem lyes adatait, pldul szerkeszthesse a profiljt.

Az Edit Profile oldal t r jelzi, hogy a felhasznl be van jelentkezve.


Mismatch - Ed

You are logged in as sidneyk.


_

Ahhoz, hogy az alkalmazs fe lis merje a felhasznlt, csak egy felhasznlnvre s egy jelszra van szksg.

Amikor a felhasznl bejelentkezik, az alkal mazs felismeri, s szemlyre szabott hoz zfrst nyjt neki.

Mismatch - Edit Profile


Persona] Information -
First name: Sidney Last name: Keisow Gender: FemaieTTl Birthdate^ 1954^07^19

348 7.

fejezet

Szemlyre szabott webalkalm azsok ptse

A felhasznli bejelentkezs megtervezse


A felhasznli bejelentkezs lehetsgnek hozzadsa a Mismatch alkalm azshoz nem kis feladat, ezrt fontos, hogy pontosan kidolgozd a rszleteket, mieltt nekilt nl megrni a kdot s aclatbzis-lekrdezeseket futtatni. Tudjuk, hogy mr van egy tbla, am ely a felhasznlkat trolja, ezrt az els lps ennek a tblnak a m dost sa, hogy a bejelentkezsi adatok is helyet kapjanak benne. Arra is m dot kell adni, hogy a felhasznlk m egadhassk a bejelentkezsi adataikat, s ennek valahogy be kell plnie a Mismatch alkalmazs tbbi rszbe is, hogy az olyan oldalakat, mint az Edit Profile, csak egy sikeres bejelentkezs utn lehessen elrni. A bejelentkezsi rendszer kidolgozsnak lpsei teht az eddigiek szerint a kvetkezk:
A u s e r n a m e s p a s s w o r d oszlopok hozzadsa a tblhoz az ALTER utasts segtsgvel.

Az adatbzisban j oszlopokra - usern am e (fel hasznlnv) s p assw o rd (jelsz) - van szksg az egyes felhasznlk bejelen t kezsi adatainak j--------- j trolshoz. 1 i

A bejelentkezsi parancsfjl hozzkapcsolsa a Mismatch alkalmazs tbbi rszhez.

A Mismatch alkalm azs Edit Profil s View Profile oldalait csak a b ejelen tk e zett felhasznlknak szabad elrnik. Meg kell teht gyzdni rla, hogy a felhasznl bejelentkezett a Lg In rlapon keresztl, m ieltt hozzfrst kaphatna az emltett oldalakhoz.

most itt vagy

349

a m ism atch alkalmazs mkdse

M ieltt tovbblpnl, vedd szemgyre a Mismatch alkalmazst, hogy rrezz a mkdsre.


Tltsd le a Mismatch alkalm azs valamennyi kdjt a Head First Labs w ebhelyrl, a www. h e a d f i r s t l a b s . com /books/hfphp cmrl. Tltsd fel az sszes kdot a w ebkiszolgldra az . s q l fjlok kivtelvel, am elyek a szksges Mismatch-tblkat felpt SQL-utastsokat tartal mazzk. Valamelyik M ySQL-eszkzben futtasd le az sszes . s q l fjl utastsait, hogy ltrejjjenek a Mismatch alkalmazs kezdtbli. Ha mindezzel vgeztl, nyisd meg az in d e x .p h p oldalt a bngszdben, s vedd szemgyre az alkalmazst. Ne feledd, hogy a View Profile s az Edit Profile oldalak kezdetben nem fognak mkdni, m n ezek teljesen a felhasznli bejelentkezsre tm aszkodnak, amit mg nem vals tottl meg.

A Mismatch alkalmazs foldala


M ism atch W h ere opposites a ttra ct!
v Edit

141test members:

Ez a kt hivatkozs vezet az alkalmazs szemlyre szabott rszeihez.

az utoljra bejelentkezett felhasznlk nevt s kpt mutatja, de bejelentke zs nlkl mst nemigen.

TSltsd lel
A Mismatch alkalmazs teljes forrskdja le tlthet a Head First Labs w ebhelyrl, az albbi cmrl:

www. headfirstlabs.com/books/hfphp

350 7 fejezet

Szemlyre szabott weba/ka/mazsok ptse

Az adatbzis felksztse a bejelentkezsekre


O k, vissza az ptkezshez. A m ism a tc h _ u s e r tbla mr j munkt vgez a fel hasznli profilok trolsa tern, de a bejelentkezssel kapcsolatban m g hi^ mismatrh nyossgokat mutat. Konkrtabban, a tblbl hinyoznak a felhasznlk fel< , hasznlneveit s jelszavait trol oszlopok. r Van fa i an j osz-

3 felhasznl-

mismatch user
MiDida | Hy | rta t. j_plrtO T J

nvhez s a jelszhoz, hogy trola bejelent kezesi adatokat. Nincsenek

hlye krdsek
K i

1 A felhasznlk egyedi azonostsra nem lehet


egyszeren egy u s e r _ i d oszlopot hasznlni

A felhasznlnv s a jelsz egyarnt sima szveges adat, ezrt az j


X ---------------

usernam e s p a ssw o rd oszlopokhoz hasznlhatod a mr ism ers \ f 9 USername he|yett? V Ha szeretnd, megteheted. A u s r i d YARCHAR MySQL-adattpust. Ugyanakkor a felhasznli profil nhny hoz hasonl oszlopok feladata, hogy ms adattl eltren a felhasznlnv s a jelsz oszlopa soha nem m a egyedileg azonostsk a felhasznlk so radhat res ( null ).
rait. s ezt hatkonyan teszik, ugyanak-

A username s password oszlopok egyszer szveges adatokat tartalmaznak, de soha nem szabad megenged ni, hogy resen maradjanak.

kor a szmrtk azonostkat ltalban nehcz megjegyezni, s a felhasznlk is jobban szeretik, ha maguk adhatnak meg egy felhasznlnevet a szemlyre szabott webalkalmazsok elrshez. A hasznl hatsg szempontjbl teht jobb dnts megengedni Johannak, hogy jnettles nven jelentkezzen be 11 helyett. Senki sem szereti, ha egy szmm fokozzk le!

Hegyezd ki a ceruzd!
rd meg a usernam e s passw ord oszlopokat a tblhoz ad SQL-utastst gy, hogy a kt oszlop az brn lthat helyre kerljn, a usernam e oszlopban legfeljebb 32, a passw ord oszlopban pedig 16 karaktert lehessen trolni, s egyik oszlop se engedje meg a NULL rtkeket!

IX ,

Kevesen szeretnnek 16 ka rakternl hosszabb jelszt megjegyezni!

mismatch user

most itt vagy

351

Hegyezd ki... meg id s

Hegyezd ki a ceruzd! Megolds


j oszlopokai az ALTR TABLE pa

ranccsal adhatsz egy ltez tblhoz.

rd meg a usernam e s p assw ord oszlopokat a tblhoz ad SQL-utastst gy, hogy a kt oszlop az brn lthat helyre ke rljn, a usernam e oszlopban legfeljebb 32, a p assw o rd oszlop ban pedig 16 karaktert lehessen trolni, s egyik oszlop se e n gedje meg a NULL rtkeket!

fiiLTBR.TABLE.rn is ^ K _ u s c r ADD .usernamey & R C ^ G N O T HULL AFTER userjd,............

h P.P..password V A R C M .t)

.NOT NULL. AFTER username... .

^ 7

Az u oszloPol< M y * 'j
a ta'bla'ban az AFTER utasifssal szablyozhatod.

username oszlop hozzadsa trtnik elor, ezrt itt mr nyugodtan hivatkozhatsz r.

mi smatch__user

Az oszlopok helye a tblban nem felttlenl

szmt, de a rendszerezst segtheti, ha a leg fontosabb oszlopok kvetkeznek elbb.


A Wrtiam s password oszlopok hozz adsa a tblhoz az A LTR utasts segtsgvel.

Egy je ls z t t u t ir a nem t ro lu n k a z a d a tb z is b a n gy, a h o g y v a n ... nem kne e lra k t ro z s e i tt titk o s ta n i vala hogy a je ls z a v a k a t?

Helyes szrevtel.. .a jelszavak titkostst ignyelnek.

352

7 fejezet .

A titkosts m egvalstshoz a Mismatch alkalm azsban t kell alaktani a jelszavakat valamilyen felism erhetetlen formra, mie ltt az adatbzisba kerlnnek. Minden alkalm azsnak, amely felhasznli bejelentkezst ignyel, titkostania kell a jelszava kat, hogy a felhasznlk bzhassanak a jelszavaik biztonsg ban. A felhasznlk jelszavnak felfedse mg magn az adat bzison bell is elfogadhatatlan, teht m dot kell tallnunk a jelszavak titkostsra, mieltt beszrnnk azokat a m ism a tc h _ u s e r tblba. A gond csak az, hogy a titkosts nem sokat segt, amg nincs r md, hogy a felhasznlk tnyle gesen berhassk a felhasznlnevket s a jelszavukat a b ejelen tk ezsh ez...

Szemlyre szabott weba/ka/mazsok ptse

A bejelentkezsi fellet kialaktsa


Most, hogy az adatbzist mdostottad, hogy kpes legyen trolni a felhasz nlk bejelentkezsi adatait, ki kell tallnod, hogy a felhasznlk hogyan adhatjk meg ezeket az adatokat s jelentkezhetnek be tnylegesen az al kalmazsba. A bejelentkezs felhasznli felletnek szveges beviteli me zkbl kell llnia, am elyekbe a felhasznlk berhatjk a felhasznlnevet s a jelszt, valamint egy gom bbl, amellyel a bejelentkezs elindthat.

Ahhoz, hogy egy alkalma zsba be lehessen jelent kezni, egy felhasznli fe lletre van szksg, ame lyen a felhasznlnv s

A jelszmezo' vdett, hogy a jelszt ne lehessen elolvasni.

[jn e ile s
f ia * - *

T mmwm
dierdre baldpaul jnettles

********

A Lg In gombra kattints utn az alkalmazs sszeveti a fe i-^ hasznlnevet s a jelszt az adatbzisban levvel.

Ha a felhasznlnv s a jelsz r vnyes, a felhasznl sikeresen be lptethet. (


Mismatch - View Pr

You are logged in as jnettles


Mfe mr i

ni*A

r-

Nincsenek

hlye krdsek
Ha amiatt aggdsz, hogy a fel K I Az adatbzis tnylegesen nem a csillagokat trolja, ugye? hasznlk nem fognak tudni bejelentkezni, mert mg nem rendeltnk hozzjuk felhaszn lnevet s jelszt, ne tedd.

! Term szetesen nem. Az rlap jelszm ezjben m egjelentett csillagok csak vizulis biztonsgot nyj tanak, teht azt akadlyozzk meg, hogy' valaki a vllunk fltt kukucsklva kilesse a jelszt, ami kor berjuk. Az rlap benyjtsakor magnak a jel sznak. s nem a csillagoknak az tadsra kerl sor. Ezrt fontos, hogy a jelszt titkostsd, mieltt beszrnd az adatbzisba.

A felhasznlnevek s a jelszavak ltrehoz sra ham arosan sn kertnk. Egyelre a b e jelentkezs alapjainak lefektetse a lnyeg, m g ha egyb feladatokat is el kell majd v gezni ahhoz, hogy a dolog m kdjn.

most itt vagy

353

az sha() fggvny

A jelszavak titkostsa az $H A () segtsgvel


A bejelentkezsi fellet m eglehetsen egyszer, de a jelszavak titkostsnak szk sgessgvel mg nem foglalkoztunk. A MySQL-ben tallsz egy SHA {) nev fgg vnyt, am ely egy titkostsi algoritmust alkalmaz egy szveges karakterlncra. Az eredm ny egy titkostott karakterlnc lesz. ami pontosan negyven tizenhatos szm rendszer (hexadecim lis) karakterbl ll, fggetlenl az eredeti jelsz hossz tl. A fggvny teht egy 40 karakteres kdot llt el, ami egyedileg azonostja a jelszt. Mivel az SHA () a MySQL, s nem a PHP egyik fggvnye, annak a lekrdezsnek a rszeknt kell meghvnod, amelyik beszrja a jelszt a tblba. Az albbi kd pl dul egy j felhasznlt szr b e a m ism a tc h _ u se r tblba, menet kzben az SHA () segtsgvel titkostva a jelszt:

AM ySQ LSHAO fggvnye gy fit kosit egy szvegrszletet, hogy egyedi, 4 0 karak teres kdd ala ktja azt.

INSERT INTO mismatch_user (username, password, j o i n d ate) VALUES ( ' j n e t t l e s ' ,

SHA( 1t a t l o v e r ' ) , N0W())

Az $HA() fggvny 4 0 karakteres hexa decimlis kdd alaktja a jelszt, s e z -------a titkostott kd kerl a mismatch_user tbla password oszlopba.
A bejelentkezsi egyenlet msik feln ugyancsak az SHA () fggvny mkdik: ez ellenrzi, hogy a felhasznl ltal bert jelsz m egegyezik-e az adatbzisban titkost va trolt jelszval.

Ez a tnyleges jelsz, abban a formban, ahogy az rlap jelszmezjben megadtk.

SHA('tatlover1)

A tnyleges jelsz Az $HA() fggvny a 8 karakteres jelszt egy 4 0 karakteres t it kostott karakterlnec y " alaktja.

e 5 1 1 d 7 9 3 f5 3 2 d b e 0 e 0 4 8 3 5 3 8 e ll9 7 7 f7 b 7 c 3 3 b 2 8

mismatch user
user h T 9 10 1 1 username j password dierdre | 08447b.^

Az eredeti jelsz helyett a 4 0 ka rakteres titkostott kdot troljuk.

baldpaul I 230dcb...^ jnettles

n o

Mismatch - View

You are logged in a s jnettles.

354 7. fejezet

sszehasonltsa
Miutn egy adatot titkostottl, a term szetes sztn azt sgja, hogy7 valamikor vissza is kell fejtened azt. Az SHA () fggvny azonban egyirny titkostst nyjt, visszat nlkl. Ennek clja a titkostott adatok biztonsgnak m egrzse - m g ha valaki be is trne az adatbzisba, s ellopn az sszes jelszt, akkor sem tudn vissza fejteni azokat. D e hogyan lehet belptetni egy felhasznlt, ha a jel szava nem fejthet vissza? Nos, a felhasznl eredeti jelszavt nem kell ismerni, amennyiben be jelentkezskor helyesen adja meg, ugyanis az SHA {) fggvny mindig ugyanazt a 40 karakteres kdot lltja el. ha ugyanazt a szveges karakterlncot kapja. Elegend teht titkostani a felhasznl ltal bert bejelentkezsi jelszt, s sszehasonltani azt a mi sm at.ch_user tbla passw ord oszlopban trolt rtkkel. Ez egy egyszer SQL-lekrdezssel valsthat meg, amely a jelsz alapjn prblja kivlasztani a megfelel felhasznlt:

Szemlyre szabott weba/ka/mazsok ptse

A z S H A ( ) f g g v n y e g y ir n y t i t k o s t s t n y jt : a t i t k o s t o t t a d a to k n em f e jt b e to k v is s z a .

Nincsenek

hlye krdsek

W HERE password = SHA ( 1t a t l o v e r )


A jelsz titkostshoz az SHA() fggvnyt hvod meg, hogy a jelsz szerepelhessen a WHERE zradkban.

Ezt a jelszi rta be a fe lhasznl a bejelentkezshez.

K: V:

Minek a rvidtse az SHA?

Ez a SELECT-lekrdezs minden olyan sort kijell a mismatch_user tblban, ahol a password oszlopban a bert jelsznak - ami ebben az esetben a ' t a t l o v e r ' - megfelel rtk tallhat. Mivel a jelsz nak csak a titkostott vltozatait hasonltjuk ssze, az eredeti jelszt nem muszj ismerni. Amint azt hamarosan ltni fogod, a felhasznlt tnylegesen belptet lekrdezs az SHA () hasznlata mellett a fel hasznl azonostja szerint vgzi el a kivlasztst.

Az SHA () fggvny neve a Secure Hash Algorithm (biztonsgos kivo natol algoritmus) rvidtse. A hash (kivonat) egy programozsi szakkifejezs, ami egy olyan egyedi, rgztett hosszsg karakterlncra utal. amely egyedi m don brzol egy szveges karakterlncot. Az SHA () esetb en a kivonat a 40 karakteres hexadecim lis titkostott karakterlnc, am ely egyedileg br zolja az eredeti jelszt.
A jelszavak titkostsra lteznek ms mdszerek is?

A titkostott jelsz elhelyezse


Az SHA () fggvny nmi problmt jelent a Mismatch adatbzis sz mra, mert a titkostott jelszavak 40 karakter hosszak, az jonnan lt rehozott password oszlop azonban csak l karaktert tud trolni. Vg re kell hajtanod teht egy ALTR utastst, hogy a password oszlopot kibvtsd a titkostott jelszavak trolshoz:

K: V:

ALTER TABLE mismatch u ser CHANGE password password VARCHAR{40) NOT NULL
A password oszlop mrett 4 0 - r e _ ^ ^ mdostjuk, hogy a titkostott je l szavak elfrjenek benne.

Igen. A MySQL az SHA () -hoz hason l M () fggvnyt is biztostja, ami D5 hasonl titkostst hajt vgre. Az SHA () azonban valamivel bizton sgosabbnak szmt, mint az M (), D5 ezrt az elbbi hasznlata javasolt. Ha a titkostst nem SQL-lekrdezsben. hanem PHP-kdban kell el vgezned, a PHP egyenrtk s h a l () s md5 () fggvnyeit hasz nlhatod.
most itt vagy

355

a m ism atch user tabla mdostsa

esztut
Add a username s password oszlopokat a m ism a tch jjse r tblhoz, s prbld ki ket!
Valamelyik MySQL-eszkz hasznlatval hajtsd vgre az ALTER utastst, am ely a username s password oszlopokat hozzadja a m ism atch_user tblhoz:

ALTER TABLE mismatch_user ADD username VARCHAR(32) NOT NULL AFTER user_id, ADD password VARCHAR(16) NOT NULL AFTER username
A p assw ord oszlopnak azonban kpesnek kell lennie egy 40 karakteres titkostott karakter lnc trolsra, ezrt az a lter paranccsal mg egyszer m dostanod kell a tblt, hogy helyet csinlj a nagyobb jelszadatoknak:

ALTER TABLE mismatch_user CHANGE password password VARCHAR(40) NOT NULL


Ne felejtsd el titkostani

Most szrj b e egy j felhasznlt, hog} kiprbld az j oszlopokat:

a jelszt az SHA() fggvny

INSERT INTO mismatch_user v' (username, password, jo i n _ d a t e ) VALUES ( j i m i 1, SHA( ' h e y j o e ) , NOW ())
Hogy m eggyzdj rla, hogy a jelsz valban titkostva kerlt az adatbzisba, futtass egy I SELECT-lekrdezst az j felhasznlra: _ M A sikeres b e je le # * J

m eghvsval.

SELECT password FROM mismatch_user WHERE username = jimi1

^ u y n n a a \\ szonaK gaank t
ketl lennie, mint amit a sor beszfasakor J

Vgl a felhasznl kivlasztsval s az SHA () fggvny hasznlatval egy WHERE-zradkban utnozd a felhasznl bejelentkezst:

SELECT username FROM mismatch user WHERE password = SHA ( heyj oe ) '

File Edit W ndow Heto G ppositesA ttract

rr-.Vi

- :'LECT

' rri^ tn a ,tc !;i_ a ie r V.KR

);

i i^ssrname i
!

Mm.
rov* in

Csak egy felhasznl felel meg a titkostott jelsznak.


0 . jC O S .r e r .

s e t

356 7

fejezet

Szemlyre szabott

webalkalmazsok ptse

T e h t a je ls z m o s t m r t it k o s t o t t . A bejelentkezsi rla p o t v is z o n t mg mindig nem k s z te tt k el. Nem lehetne egyszeren H T T P -h ite le s t s t h a szn ln i - hiszen a v d e tt oldalak elrshez egy fe lh a szn l n vre s egy je ls z ra van szksg?!

De igen! A HTTP-hitelests tkletesen megfelel egy egyszer felhasznl-bejelentkeztet rendszerhez.


Ha mg em lkszel r, az elz fejezet Guitar Wars alkalmazsban HTTP-hitelestssel krtnk felhasznlnevet s jelszt a felhaszn ltl, hogy korltozzuk az alkalm azs bizonyos rszeinek elrst. A Mismatch alkalm azsban nagyjbl ugyanerre a szolgltatsra van szksg, azzal a klnbsggel, hogy most egy teljes adatbzi sunk van felhasznlnevek s jelszavak lehetsges kom binciival, nem csak egyetlen felhasznlnevnk s jelszavunk, ami az egsz alkalm azsban rvnyes. A Mismatch felhasznli teht ugyanazt a HTTP-hitelestsi ablakot hasznlhatjk, csak ppen a sajt, sze mlyes felhasznlnevket s jelszavukat kell megadniuk.

M .sm atch o n w v w .m s-m a rc h .n e r Your password wf(i t * sem in the N am e:

Pi9e' V Uneed t0 '9 O


^

to area

A felhasznlk szmra a szabvnyos HTTP-hitelestsi ablak - amelynek a megjelense bngszofuggo - szolgl egyszer' bejelentkezsi felletknt.

Password. _ Remember this password in my keychain

("Cancel ) ft o g in A

most itt vagy

357

h ttp -h ite le s t s a m is m a tch alkalm azsban

A felhasznlk hitelestse a HTTP segtsgvel


Ahogy a Guitar Wars alkalmazs szem lltette, kt fejlcet kell elkldeni ahhoz, hogy egy HTTP-hitelestsi ablakon keresztl korltozzuk a hozzfrst egy oldalhoz. Ezek a fejlcek azt eredm nyeztk, hogy a bngsz felhasznlnevet s jelszt krt, mie ltt engedlyezte volna a hozzfrst a Guitar Wars Admin oldalhoz.

Ezt a kt fejlcet kell elkldeni ahhoz, hogy HTTP-hitelestsen keresztl korltozzuk a hozzfrst egy oldalhoz. A H TTP-hitelestshez szksges fejlcek elkldse kt sornyi PHP-kdot ignyel
- mindkt fejlchez egy-egy h e a d e r () fggvnyhvst:

A HTTP-hitelestshez kt
header('HTTP/11 401 Unauthorized'); header ('WWW-Authenticate: Basic realnv="Mismatch'" ) ;

fejlcet kell elkiildened.

Ez a hitelests tartom- J nya, ami ebben az esetben a teljes alkalmazs. A Guitar W/ars alkalmazs vdett oldalainak elrshez egy felhasznlnvre s egy jelszra van szksg.
To view this page, you need to log in to area "Cultar Wars" on avvw.guitarwari.net >

A felhasznl csak akkor rheti el ezt az oldalt, ha helyes felhasznlnevet s jelszt adott meg.

Guitar
Below i$ a li Ashton Sim
Name. rock Password:
*~2

c:ear

Eddie Vanil Beiita Cbev Phiz Lairstt Paco Jastorhj? Nevfl Jobamsoid 200 8 -0 4 -2 4 08.-02:11 9 8 4 3 0 Kenny Lavhz 2008-04-23 1 4 :0 * 5 0 6 4 9 3 0

Remember this password in my keychain

358

7. fejezet

Szemlyre szabott webalkalmazsok ptse

Gyakorlat

Karikzd b e a Mismatch alkalm azsnak azokat a rszeit, am elyeket rint a b e je lentkezsi parancsfjl ( lo g in .p h p ) s a hozzfrst szablyoz HTTP-hitelests hasznlata, majd rd le azt is, hogy ezek milyen hatssal vannak az alkalmazs rintett sszetevire!

M taatcft.V In Praflb

Imi

VrAa

W 41 /

login.php

Ez a parancsfjl.
view profile.php

index.php

editprofile.php

m o s t i t t vagy

359

G yakorlat

m egolds

Gyakorlat - megolds

Karikzd be a Mismatch alkalmazsnak azokat a rszeit, amelyeket rint a b eje lentkezsi parancsfjl (lo g in .p h p ) s a hozzfrst szablyoz HTTP-hitelests hasznlata, majd rd le azt is, hogy ezek milyen hatssal vannak az alkalmazs rintett sszetevire!
A kezdlap nem jtszik kzvetlen szerepet a felhasznlk bejelentke zsben, hiszen mindenki ltal el rhetnek kell lennie.

r
A profilok megte kintsnek s szer kesztsnek lehet

Amikor egy felhasznl bejelentkezik, az alkalmazs ellenrzi a felhasznlnevt s a jelszavt az adatbzisban, hogy meggyzdjn rla, hogy bejegy zett felhasznlrl van sz.

sge korltozott, va gyis ezeket az olda lakat csak a beje lentkezett felhasz nlk rhetik el.

Az Edit Profile oldal nem csak a bejelentkezsi parancsfjlra t Ha nem tallhat a felhasznlnvnek s a jelsznak megfelel sor, a bejelentkezsi parancsfjl egy hibazenetet jelent meg, s megakadlyozza a tovbbi hozzfrst. maszkodik a hozzfrs korltoz

index.php

sban, hanem a felhasznlnvre is szksge van, hogy megllapt sa, hogy melyik p ro filt szueretnk szerkeszteni.

Nincsenek

hlye krdsek
! M irt nem szksges a kezdlapra is bejelentkezni?
! Azrt, mert a kezdlap az els oldal, ahol a felhasznl tallja magt, amikor megltogatja a webhelyet. s fon tos, hogy a ltogatk lssk a webhelyet, mieltt beje lentkezsre krnnk ket. A kezdlap teht elzetes knt s kiindulpontknt is szolgl: rdekldst felkelt csali az j ltogatknak, s kiindulpont a mr bejegy zett felhasznlknak, akiknek be kell jelentkeznik, ha mlyebbre szeretnnek hatolni az alkalmazsban.

K
V

! Milyen hatssal van a jelszavak titkostsa a HTTPhitelestsre?


! Itt kt krdst kell megvizsglni: a jelszavak tovbb tst s a jelszavak trolst. Az SHA {) MySQLfggvny arra szolgl, hogy biztonsgosan, titkostott formban trolhass egy jelszt egy adatbzisban. Az adatbzist nem rdekli, hogy a jelszt hogyan vit ted be, ezn ez a fajta titkosts nincs hatssal a HTTP-hitelestsre. Ugyanakkor amellett is szlnak rvek, hogy a jelszt mr annak tovbbtsa vagy tvi tele kzben titkostsd. amikor a HTTP-hitelestsi ab lak elkldi azt a kiszolglnak. Ez a fajta titkosts k vl esik ennek a fejezetnek a tm akrn, mert csak akkor van r szksg, ha fokozott biztonsgot ignyl rzkeny adatokkal dolgozunk.

\ A bejelentkezett felhasznlk brkinek a profiljt megtekinthetik?


! Igen. A cl az. hogy a profilok minden bejelentkezett felhasznl szmra lthatk legyenek, de a vend gek eltt rejtve maradjanak. Ms szavakkal, csak a Mismatch-tagok tekinthetik meg a tbbiek profiljt.

360 7. fejezet

Szemlyre szabott webalkalmazsok ptse

A felhasznlk belptetse a HTTP-hitelests segtsgvel


A bejelentkezsi parancsfjl ( l o g in .p h p ) felel azrt, hogy a H T T P hilelestsi fejlcek segtsgvel elkrje a felhasznlnevet s a jelszt a fel hasznltl, kiolvassa azok rtkt a $_SERVER szupergloblis tmbbl, majd ellenrizze ket a m ism atch_user adatbzisban, mieltt hozzfrst adna egy vdett oldalhoz:
<?php r e q u i r e o n c e ( 1c o n n c t v a r s . p h p ' ) ;

Ha a felhasznlnevet s a jelszt mg nem rtk be, el kell kldeni a hitele stsi fejlceket, hogy a felhasznlt

8z adatok megadsra krjk.

i f ( ! i s s e t ($ SERVER! ' PHP_AUTH_USER'J ) | | l i s s e t ($_SERVER f * PHP_AUTH_ PW' J ) ) { J A felhasznlnevet s a jelszt, mg nem r t k be, ezrt e l k e l l kldeni a h i t e l e s t s i f e j l c e k e t header (r HTTP/1.1 40 Urvauth 1 ; ________________^ h e a d e r ( f WWW-Authenr.i c a t e : B a s i c r e a i m- "Mi sma t c n " 1 ) ; e x i t ( < h 3 > M is m a tc h < / h 3 > 5 o rr y , you must e n t e r y o u r usern am e and p assw o rd t o l o q i n and a c c e s s ' t h is p age. ? );

A felhasznl ltal bert beje


// C satlak o zs az adatbzishoz $ d b c = m y s q l i c o n n e c t ( 8 HOST,

lentkezsi adatok kiolvassa.


D B 'J S E R , DD PASSWORD, DB NAME);

Lekrdezs vgrehajtsa an nak ellenrzsre, hogy megfelel-e valamelyik sor a felhasznlnvnek s a t i t kostott jelsznak.

\TT A f e lh a s z n l l t a l b e r t b e j e l e n t k e z s i adatok k io lv a s s a

? use r _ u s ername roysql i _ r e a i _ e a c a p e s t r i , trir r.($ _ S E R V E R [ ' PHP_AUTH U S E R l J J . ; $u s e r p assw ord - mysq! i _ r e a l_ e s c a p e s t r i n g (S d b c , t r i m ( $_SERVER [ ' PHP AUTH~PWT; ) ) ;

// A felh aszn ln v s a j e l s z k i k e r e s s e az adatbzisbl S q u e r y = "SELECT u s e r _ i d , u s rn am e FROM n isrr,atch _u ser WHERE u se rn am e * " p a s s w o r d - SHA ( * $ u s e r _ p a s s w o r d ' ; $ d a t a = mysq.l i _ q u e r y ($ d b c , $ q u e r y j ; if

' $ - J s e r _ u s e r n a r a e 1 AND "

(mysqli_nurn_rows ( $ d a r a ) = 1 ) { // A b e j e l e n t k e z s i adatok rendben vannak. gy a f e lh a s z n l a z o n o s t j t s nevt tartalm az v lto z k b e l l t h a t k $ row = mysql. i _ f e t c h _ a r r a y ( $ d a t i ) ; Ha van illeszked sor, az azt jelenti, $user__id = Src-w (' u s e r j L d 1 J ; ^ ----

$usernam e - $ ro w [ u sernam e1j ;

hogy a bejelentkezsi adatok rendben

Ha a felhasznlnv-jelsz prnak

)
e lse {

vannak, gy bellthatjuk a $user_id s $u$ername vltozk rtkt.

egyetlen sor sem felel meg, akkor jra el kell kldeni a hitelestsi fejlceket, hogy a felhasznlt ismt az adatok megadsra krjk.

// A fe lh a s z n l n v -je l sz pr rvnytelen, e z r t ismt el k e l ' kldeni a f e j l c e k e t

header(HTTP/1.1 401 Unauthorized*); header( T WWW-Authenticte: Basic realms"Mismatch"1};


e x it

(<h2>Mismatch</h2>Sorry,

you must enter a valid username and password

to lg in and .

Ta c c e s s t

p a g e . );

}
//A s i k e r e s b e je l e n t k e z s m eg er stese e c h o ( <p c l a s s = " l o g i n " > o u a r e l o g g e d i n a s
ame .
1

. </p>1) ;

?>

Ezen a ponton minden rend ben van, gy megersthetjk a bejelentkezs sikert.

r ----- ----KISZ
Egy j bejelentkezsi parancsfjl elksztse, amely a felhasznlt a felhasznlnv s a jelsz megadsra kri.

m ost it t vagy

361

teszteld a mismatch alkalmazst!

Tsztt
Hozd ltre az j bejelentkezsi parancsfjlt, s emeld be a View Profile, illetve az Edit Profile parancsfjlokba!
Hozz ltre egy j szvegfjlt lo g in .p h p nven, s rd b ele a bejelentkezsi parancsfjl kdjt (vagy tltsd le a parancsfjlt a Head First Labs w ebhelyrl, a w w w .h e a d firstla b s.c o m / b o o k s/ h fp h p cm rl), majd adj PH P-kdot a v ie w p ro f i l e . p h p s e d i t p r o f i l e . p h p parancsfjlok elejhez, ami beem eli az j bejelentkezsi parancsfjlt. Tltsd fel az sszes parancsfjlt a w ebkiszolgldra, s nyisd meg a Mismatch alkalm azs folda lt a bngszdben. Kattints a View Profil vagy az Edit Profile hivatkozsra a bejelentkezshez s a szem lyre szabott oldalak elrshez. Ez term szetesen csak akkor fog m kdni, ha mr fel vettl egy felhasznlt felhasznlnvvel s jelszval az adatbzisba.

Ez a kt hivatkozs vezet a vdett oldalakhoz, atmelyek meghvjk a bejelentkezsi parancsfjlt, ha a felhasznl mg nem jelentkezett be.
A on
Mismatch - Where opposUesjaaract^

A jelszt az SHAl) titkostja s hasonltja ssze az adatb zisban tarolttal, hogy megl laptsa, hogy a bejelentkezs engedlyezett-e.

Mismatch Where opposites attract!

V ftoiite iew
Edit Profile
Latest member*:
To view his pa*, you need t o ^ y in to arca '^ isrn a:ch Mon www.mis-mat Yaar panword tfl b jent nyfcc-ear Name Password jnettles

Remember this password in my keychaln

^ancei

f _tb g < rt|^

A bejelentkezsi parancsfjl HTTP-hitelests segtsgvel akadlyozza meg a jogosulatlan hozzfrst a View Profile s Edit Profile oldalakhoz. A kezdlapot nem vdi a bejelentkezsi pa rancsfjl, mert ez a kiindulpont, ahonnan mlyebbre hatolhatunk az alkalmazsban.

362 7.

fejezet

Szemlyre szabott w ebalkalm azsok ptse

A Mismatch alkalmazs brn ifik oldalnak, amelyiknek'" ^ c ele'rshez bejelentkezs re van szksg, csak be kell elnie a login.php parancs fjlt a kdja elejn.
You are logged in a \ jncntes

a ty lc .c s a "

/>

Mismatch - View Profile


U sernam e; jnetdes F irst nam e: Johan L a st nam e: Neales G end er: B irth d ate: L ocation : Male 1981-11-03 Athens. O A

^P SSW R A OD

A View Profile s Edit Profile parancsfjlokban az els' utasts a bejelentkezsi parancsfjl beemelse a felhasznlk beje lentkezsnek kiknyszertshez

view profile.php
Would you like to edit vour profile?
php r e q u i r e o n c e | l o y i n . p h p * ) ;

..muKt/i oiaai megerosfti a belpst a bejelentkezsi parancsfjlban megadott zenettel. v-

< h ead > n a t c h - E-Ji P r o f i l e < / t l t l e > < lin fc r e l * " s t y l e s h e e t " t y p e ^ t e x t / o s s " h r e i - ^ s t y i e . c & a

You arr. logged in as /nettles.

Mismatch - Edit Profile


p Personal Information-------First name: >ohan Last name: Newei
B irth d ate:
C it y ; fi PAS8MOBD, DQ HAKE)

1951- 11-03
Atncnt

Ha a felhasznlnv s a jelsz rvnyes, a fel hasznl belptethet', s betltdhet az oldal htralev' rsze.

S ta te: "ga

Picture: ( ^ , r Tlohlopk

editprofile.php
fcntflrofti

A Mismatch alkalmazsban minden felhasz nl sajt, szemlyre szabott rlapot kap.

A bejelentkezsi parancsfjl hozzkapcsolsa a Mismatch alkalmazs tbbi rszhez.

most rtt vagy

> 363

a m ism atch alkalmazsnak szksge van egy feliratkozsi rlapra is

Ruby imdja a horrorfilmeket, a bvs kockt s a fszeres teleket, de jelen leg gylli a Mismatch alkalmazst, mert nem engedi feliratkozni, hogy hasznlhassa a rendszert.

Szeretnk bejelentkezni s szerkeszteni p ro filo m a t, de nem brok r ic ni, hogyan lehet fe lira tko zn i

Az j Mismatch-felhasznlknak lehetv kell tenni a feliratkozst.


Az j bejelentkezsi parancsfjl kitn munkt vgez, ami a felhasznlk belptetst illeti a HTTP-hitelests segtsgvel. A gond csak az, hogy a felhasznlknak nem ll m djukban fel iratkozni - mivel le nem hatroztl meg egyet len felhasznlnevet s jelszt sem , a bejelent kezs bajos. A Mismatch alkalm azsban teht szksg van egy feliratkozsi rlapra, amely le hetv teszi az j felhasznlknak, hogy ltre hozzanak egy j felhasznlnevet s jelszt, s gy csatlakozzanak a w ebhelyhez.

Felhasznlnv? Jelsz?

364 7. fejezet

Szemlyre szabott webalkalmazsok ptse

Feliratkozsi rlap az j felhasznlk szmra


Hogyan kell kinznie ennek az j feliratkozsi rlapnak? Tudjuk, hogy lehetv kell tennie, hogy a felhasznl berja a kvnt felhasznlnevet s jelszt, de van valami ms is? Nos, mivel a felhasznl ezen az rlapon adja meg a jelszavt, a jelszavakat pedig biztonsgi okokbl ltalban csillagokkal rejtik el a w ebes rlapokon, kt jel szm ezre lesz szksg. A felhasznlnak gy ktszer kell bernia a jelszt, s ellen rizhetjk, hogy nem trtnt-e elrs. A feliratkozsi oldal feladata teht az, hogy felhasznlne vet s jelszt krjen a felhasznltl, ellenrizze, hogy az adott felhasznlnv nem foglalt-e, majd az j felhasz nlt a m is m a tc h _ u s e r adatbzistblhoz adja.
Felhasznlnv: J e ls z : J e le z ( jra ): F e lira tk o z s

Password: Reword:

********

A jelszt ktszer kell berni, hogy kikszblhessk annak a kockzatt, hogy az alkalmazs helytelen je l szt lltson be a felhasznl szmra.

(rclyfe)

********

A Sign Up gombra kattints eredmnyekppen az alkalmazs hozzadja a felhasznlnevet s a jelszt az adatbzishoz.

mismatch user
1 u s e r jd l usofiwnw 1 1 ^ 1 10 11 ~ 12 baldpaul jnettles rubyr d8a011 ... e511d7... Q 62e4o^ % __ password | ...

Mivel a jelszavak titkosA feliratkozsi parancsfjlban az egyik lehetsges problm t az jelenti, ha a felhasz nl olyan felhasznlnevet prbl vlasztani, ami mr foglalt. A parancsfjlnak elg intellligensnek kell lennie, hogy felism erje ezt a problm t, s msik felhaszn lnv vlasztsra krje a felhasznlt. A feliratkozsi oldal feladata teht az, hogy felhasznlnevet s jelszt krjen a felhasznltl, ellenrizze, hogy az adott fel hasznlnv nem foglalt-e, majd az j felhasznlt a m ism atch__user adatbzistb lhoz adja.

tottak, az adatbzis meg tekintsekor is biztonsg ban vannak.

most itt vagy

365

a signup.php parancsfjl kiegsztse

PHP- & MySQL-mgnesek


A Mismatch alkalm azs feliratkozsi parancsfjlja egy egyni rlap segtsgvel kri a felhasznlt a kvnt felhasznlnv s jelsz bersra. A gond csak az, hogy a parancsfjl kdja nem teljes. Eg sztsd ki a kdot a htm gnesek segtsgvel, hogy az j felhasznlk feliratkozhassanak, s csatlakoz hassanak a Mismatch kzssghez!

mm
Mismatch - Sign Up Please

Mmatcfr - S g n

A feliratkozsi rlap

enter your username and dented password in sign up to Mismatch


roby

Registration Info------Username:

<?php r e q u i r e _ o n c e ( 1a p p v a r s . p h p ' ) ; re q u ire _on ce( ' c o n n e c tv a r s . php' ) ; // C satlakozs az adatbzishoz $ d b c ~ m y s q li_ c o n n e c t ( D B _ H O S T / D 3 J J S E R , DB_PASSWORD, D5_NAME);

Password: Password (retype):

if (isset($_POST[fsubmit'])) {
// A p r o f ila d a t o k k io lv a s s a a POST-tmbbl - mysqli_real_escaperstring ( $ d b c , trim($_POST[' ....................................- m y s q i i _ r e a l _ e s c a p e _ s t r i n g ( $ d b c , t r i m ( $ _POST[ ' ....................................- m y s q l i _ r e a l _ e s c a p e _ s t r i n g ( $ d b c , t r i m ($ POST[ '])); ']));

i f ( ! e m p ty ($ u s e r n a m e ) & ! e m p t y ( $ p a s s w o r d l ) & ! e m p t y ( $ p a s s w c r d 2 ) & & & &

)) (

// E lle n r iz z k , hogy v a la k i ms n i n c s - e inr b ejegy ezve e z z e l a fe lh asz n l n v v el S q u e r y = "SELECT * FROM m i s m a t c h _ u s e r WHERE usern am e - ' ' ";

$ d a ta = m ysq li _qu ery($dbc, $ q u e r y ) ; i f (m ysqli_num _row s ( $ d a t a ) - = 0) { // A felh asznln v egyedi, gy besz rh atju k az adatokat az adatbzisba LO $ q u e r y ="INSERT INTO m i s m a t c h _ u s e r (u s e rn a m e , p a s s w o r d , j o i n _ d a t e ) VALUES

tf

"('

' , SHA( *

1) , NOW( ) ) " ;

m y sq li_q u ery ($d b c, $ q u e ry );

Ne feledd, hogy az aposztrf kt le kell vdened, ha egy aposztrfok kz zrt szveg

// A mvelet sik e rn e k m e g e r stse a fe lh a s z n l szmra ^ belsejben Szerepelnek, e c h o 1<p>Ycur new a c c o u n t h a s b e e n s u c c e s s f u l l y c r e a t e d . You\ ' r e new r e a d y t o l o g i n and ' <a h r e f = " e d i t p r o f i l e . p h p " > e d i t y o u r p r o f i l e < / a > . </p>' ; m y sq li_ cio se ($ d b c); e x it ();

366

7. fejezet

Szemlyre szabott webalkalm azsok ptse

e lse { // Ehhez a felhasznlnvhez mr t a r t o z i k f i k . e z r t h ib a z e n e te t kel', m e g je l e n t e n i e c h o <p c l a s s = " e r r o r " > A n a c c o u n t a l r e a d y e x i s t s f o r t h i s u s e r n a m e . P l e a s e u s e a d i f f e r e n t a d d r e s s . </p> ;

e lse { e c h o ' <p c i a s s - " e r r o r " > Y o u must e n t e r a i l o f t h e s i g n - u p d a t a 1t w i c e . </p>1;

m y sq li^ clo se(S d b c)

?>
< p > P l e a s e e n t e r y o u r usern am e and d e s i r e d p a s s w o rd t o s i g n up t o M ism atch .</p> < form met hod** " p o s t " a c t i o n - " < ? p h p e c h o $ _SEPsVERf ' PHP_SELF' ] ; ?>"> < ie id se t> < l e g e n d > R e g i s t r a t i c n ln fo < / leg en d > < ia o e l for="usernam e">U sernam e: < / lab el> cin p u t ty p e = "le x v a i u e = " < ? p h p i f ( ! empty (

> P a ssw o rd ( r e t y p e ) : < / l a f c e i > dnpu < / field set> < i n p u t t y p e - " s u b m i t " v a l u e = " S i g n Up" name3 " s u b m i t " </.form> name

signup.php

most t vagy

367

a kiegsztett signup.php parancsfjl

A Mismatch alkalm azs feliratkozsi parancsfjlja egy egyni rlap segtsgvel kri a felhasznlt a kvnt felhasznlnv s jelsz bersra. A gond csak az, hogy a parancsfjl kdja nem teljes. Egsztsd ki a kdot a htm gnesek segtsgvel, hogy az j fel hasznlk feliratkozhassanak, s csatlakozhassanak a Mismatch kzssghez!

A feliratkozsi

Mismatch - Sign Up
Please enter your username and desired password to sign up to Mismatch, Rcguirauon Info--------------------------------------------------------------------

Username: rubyr Password: Password (retype):

// C o n n e c t t o t h e d a t a b a s e

$dbc mysqli__connect (DB^HOST, DBJJSER, DB_PASSW RD D A E) ; O , B_N M


i f ( i s s c t (S.P O ST r ' s u b m i t ] ) ) ( // Grab t h e p r o f i l e d a t a from t h e POST A ^ .19 sz r rosgtisztitjuk, majd beolvassuk.>

m y s q ^ i _ r e a l _ e s c a p e _ _ s t r i n g ( $ d b c , t r i m ( $_POST ;

$passwordl

|*= m y s q l i ^ r e a l _ e s c a p e _ s t r i n g ($db

t r i m ($ POST[

m y s q i i _ r e a l _ e s c a p e _ s t r i n g ($ d b c , t r i m ( $ _ P O S T [

i f ( ! e m p ty ($ u s e r n a m e ) & ! e m p t y ( $ p a s s w o r d l ) & ! e m p ty ($ p a s s w o r d 2 ) & & & &

Ellenrizzk, hogy egyik urlapmezo sem res-e, s hogy a kt jelsz egyezik-e.


SELECT * FROM m is m a tc h u s e r WHERE usernam e

m y s q l i _ _ c i o s e ($dbc) e x it ();

368 7. fejezet

? ba/ka/mazasoi
else {

/ / An account already exists for this username, so d i s p l a y an error message


'a d d r e s s .< / p > ';
ft ft .

^^

e c h o ' <p c l a s s - e r r o r " > A n a c c o u n t a l r e a d y e x i s t s f o r t h i s u s e rn a m e . P l e a s e u s e a d i f i e r e n . .

A felhasznlnv nem Kirtjk a $username vltozt, hogy az irlapmez' res legyen.


i

egyedi, ezrt hibazene tet jelentnk meg.

) 6 IsS I

e c h o <p c l a s s = " e r r o r " > Y o u must e n t e r a l l o f t h e s i g n - u p d a t a , i n c l u d i n g t h e d e s i r e d p a ssw o rd tw ic e .< / p > ; ^

Egy vagy tbb urlapmez res, ezrt hibazenetet


m y sq li_cio se ($d b c);

jelentnk meg.

?>
< p > P le a s e e n t e r y o u r u se rn a m e and d e s i r e d p a ss w o rd t o s i g n up t o M ism atch .</p> < f o r m m e t h o d ^ " p o s t a c t i o n = " < ? p h p e c h o $_SERVER[ 1 PHP^SELF J ; ?> "> < fie ld se t> < le g e n d > R e g is t r a t io n In fo< / legen d > < l a b e 1 f o r ^ " usernam e M U sern am e: </ l a b e l > > < i n p u t t y p e - t e x t " id ^ " v a l u e = " < ? p h p i f (! e m p t y ( < la b e i fo r < in p u t typ e<la b e l f o r - " < in p u t t y p e - " name=
ft

) echo ^ P assw o rd : < / lab el> " id *" name=


if

? > " / x b r />

/ x b r />

P a ssw o rd ( r e t y p e ) : < / l a b c l >


1G="

nair.e=

r / X b r />

< / fielcse t> < i n p u t t y p e - " s u b m i t " v a l u e = " S i g n Up name= " s u b m i t " /> </Iorm>

<?

Nincsenek

signup.php

hlye krdsek
! Mert a feliratkozsi parancsfjlnak nem az a clja, hogy korltozza az oldalak elrst. A parancsfjl feladata az. hogy lehetv tegye a felhasznlknak, hogy megadjanak egy egyedi felhasznlnevet s jelszt, majd bejegyezze ezeket a felhasznli adatbzisba. Termszetesen lehetsges egy H l TP-hitelestsi ablakot hasznlni a felhasznlnv s a jelsz beviteli felleteknt, de a hitelests felesleges az j felhaszn lk feliratkozsakor. A feliratkozshoz clszerbb egy egyni rlapot ltrehozni, aminek megvan az az elnye, hogy a jelsz ellenrzsvel kikszblhetjk az adatbeviteli hibkat.

.! M irt nem lehet egyszeren HTTP-hitelestst hasznlni az j felhasznlk feliratkozshoz?

! A feliratkozsi parancsfjl belpteti a felhasznlt, miutn feliratkozott?

Nem, s ennek oka elssorban abban keresend, hogy a bejelentkezsi parancsfjl mr elvgzi ezt a feladatot, gy nincs szksg a kd megismtlsre a feliratkozsi parancsfjl ban. A feliratkozsi parancsfjl ehelyett egy hivatkozst jelent meg az Edit Profil oldalhoz, ahov a felhasznl feltehetleg el szeretne jutni a feliratkozs utn. Mivel a felhasznl mg nincs bejelentkezve, a bejelentkezsi ablak fog megjelenni, amikor megprblja elrni az Edit Profil oldalt. A feliratkozsi parancs fjl teht ahelyett, hogy automatikusan belptetn a felhaszn lt, az Edit Profile oldalra mutat hivatkozson keresztl a beje lentkezsi ablakhoz vezeti t.

most itt vagy

o t>y

a feliratkozsi oldalra mutat hivatkozs elhelyezse

Adj eslyt a felhasznlknak a feliratkozsra!


Mr van egy feliratkozsi parancsfjlod, de hogyan jutnak el hozz a felhasznlk? Valahogy tudatnod kell a felhasznlkkal, hogy miknt iratkozhatnak fel. Az egyik lehetsg, hogy a Mismatch alkalmazs fol daln helyezel el egy Sign Up (Feliratkozs) hivatkozst. Ez nem rossz tlet, de idelis esetben kpesnek kell lenned r, hogy a hivatkozst b e- s kikapcsold, attl fggen, hogy a felhasznl mr bejelentkezette. A msik megolds, hogy a Sign Up liivatkozst a bejelentkezsi parancsfjl rszeknt jelented meg. Amikor egy j felhasznl pldul a View Profile vagy az Edit Profile hivatkozsra kattint a foldalon, a bejelentkezsi parancsfjl felhasznlnevet s jelszt kr tle. Mivel ilyenekkel mg nem rendelkezik, valsznleg a Cancel (M gse) gombra fog kattintani, hogy kilpjen a bejelentkezsi ablakbl. Itt nylik r esly, hogy m egjelentsd a feliratkozsi oldalra mutat hivatkozst, m gpedig a bejelentkezs sikertelen sgt jelz zenet mdostsval, hogy a bejelentkezsi parancsfjl egy hivatkozst adjon a sig n u p .p h p oldalra. m e a bejelentkezs sikertelensgt jelz eredeti zenet kdja:

Ez. kid e k . 1 ** i-l k m . sikerHlens# * H ' *m l' knt lehet feliratkozni a Mismatch rendszerebe.
e x i t { , < h 3 > M is m a tc h < / h 3 > S o r ry , Tt h i s p a g e . 1) ; you must e n t e r y o u r u s e rn a m e and p a s s w o rd t o l g i n and a c c e s s \ * .

*Sajnlom, meg kl adnia a felhasznlnevt e a Jelszavt a bejelentkezshez s el az oldal e e . lrshz"

A fenti kd valjban kt klnbz helyen jelenti meg az zenetet a bejelentkezsi parancsfjlban: ha nem rtak be felhasznlnevet vagy jelszt, illetve ha helytelenl adtk meg azokat. Valsznleg mindkt esetben clszer m egjelenteni a Sign Up hivatkozst. Az j kd valahogy gy festhet:

Ez a kd tnr sokkal segtkszebb, hiszen egy hivatkozst ad a feliratkozsi oldalra, hogy a felhasznl csatlakozhasson a rendszerhez. ^
e x i t ( T< h 2 > M ism a tc h < / h 2 > S o r ry , access

Sajnlom, meg kl adnia egy rvny felhasznlnevet s el

/ jelszt a bejelentkezshez s az o d l e e . Amennyila l rshz j ben nem W w * felhasznl- ^ ira tk o z h a t m :

you must e n t e r a v a l i d usernam e and p a ss w o rd t o l o g i n and 1 . a r e g i s t e r e d member, p l e a s e <a f t r ?*"s i g n u p . p h p "> s 1 qn

t h i s p a g e . I f you sren \ I t

up</a>..1 ) ; '

Ebben nincs semmi klnleges, csupn egy szokvnyos HTMLhivatkozs, ami a signup.php parancsfjlra mutat.

370 7. fejezet

Szemlyre szabott webalkalmazsok ptse

Tesztt
Add hozz a feliratkozsi szolgltatst a Mismatch alkalmazshoz!
Hozz ltre egy j szvegfjlt s ig n u p .p h p nven, s rd bele a feliratkozsi parancsfjl kdjt (vagy tltsd le a parancsfjlt a Head First Labs w ebhelyrl, a w w w .h e a d firstla b s.c o m / b o o k s/ h fp h p cm rl), majd m dostsd a lo g in .p h p parancsfjlt, hogy m egjelentse a hivatkozst azoknak a felhasznlknak a szmra, akik nem tudnak b eje lentkezni. Tltsd fel az sszes parancsfjlt a w ebkiszolgldra, s nyisd meg a feliratkozsi oldalt a b n gszdben. Iratkozz fel j felhasznlknt, majd jelentkezz be, s a profilod szerkesztsvel, illetve m egtekintsvel ellenrizd, hogy a feliratkozs s a bejelentkezs helyesen m kdtt-e. Az alkalm azsnak most mr megvan az a szemlyes varzsa", ami eddig hinyzott belle.

?V

*M uhm ferna o*
iw

m i* P?C,

rntt-m hntt M

TOlog m to * r t s

ftcfisnuin fo linuuar:

fi w * '* nw cxjt

P rd flifffQ J

- Password

A belptetsi a HTTP-Mielests Ruby feliratkozskor megadott adatai alapjn hajtja vgre.

tn P *> *k

A feliratkozs s a bejelentkezs a szemlytelen alkalmazst az r dekld felhasznlk kzssgv vltoztatja.

V 4i t/ &$*** **a* o v

Mismatch fcdH ProOk


Prsvmil inbHM*
F W name; *

Klassz! &e tudok jelentkezni a Mismatch rend szerbe, s megnz hetem, illetve szerkeszthetem a szemlyes profi lomatl y -" .

B d t*: < u frtk rn

C: ltV

Mismatch - View Profik1 sern*me: n*yr

L* DJi; R O U flS
GoKltr:
Birrhdate; Uwulo-

^ na: Rb o>
Mate

1972-W -ia CnoundniRj. AZ

Ruby profilja csak bejelentkezs utn rhet el.

a mismatch alkalmazsnak a kijelentkezst is lehetv kell tennie a felhasznlknak

Kt szobatrsammal osztozom <sgy s z m t g p e n , s nem szeret nem, ha hozzfrnnek a M is m a tc h -p ro filo m hoz. V alah ogy ki kell tu d n o m je le n tke zn i!

A kzssgi webhelyeknek lehetv kell tennik a felhasznlknak, hogy kijelentkezzenek, hogy msok ne frhessenek hozz a szemlyes adataikhoz egy megosztott szmtgprl.
A kijelentkezs engedlyezse a felhasznlknak nem hangzik valami bo nyolultnak, pedig elg nagy problmt jelent a HTTP-hitelests szmra. A gond az, hogy a HTTP-hitelestst arra terveztk, hogy egy adott oldal vagy oldalgyjtemny esetben egyszer kelljen vgrehajtani - az alaphely zet csak akkor ll vissza, ha a bngszt bezrjk. Ms szavakkal, a fel hasznl soha nem lesz kijelentkezve egy H IT ^-hitelestssel elrt weboldalrl, amg a bngszt be nem zrtk, vagy a felhasznl sajt k e zleg nem trlte a HTTP-hitelestssel elltott munkamenetet. Ez utbbit egyes bngszkben (pldul a Firefoxban) egyszerbb vgrehajtani, mint msokban (pldul a Safariban).

io u a rc lo gged in as \idneyk.

Mismatdi - Edit ProfiJe

To view th is p age, you n eed to log in to area M ism atch on w w w .m ls-m atch.net

Ha egyszer bejelentkeztl, benn is maradsz, amg be nem zrod a bngszt.

Name

s i d n e y k ________________

name: <e-*ow Birthdaie: :984-07-i

Password: I . f Remember thK password in my keychain

City: T p tm t
State: z

P ta u re :

A kijelentkezs lehetsge rvn Sidney pontosan sza blyozhatn a hozzfrst a szemlyes profiljhoz.

Profi*

Br a HTTP-hitelests knyelmes s egyszer mdja a felhasznlk belp tetsnek a Mismatch alkalmazsba, a felhasznlk kilptetsre nem ad semmilyen mdot, mrpedig egyarnt szksg van a felhasznlk m eg jegyzsre, s arra, hogy megengedjk nekik a kijelentkezst, amikor csak akarjk.

372 7. fejezet

Szemlyre szabott webalkalmazsok ptse

Nem lenne lom szp , ha anlkl is em lkezhetnnk a fe lh a s z n l k ra , hogy rkk bejelentkezve ta r ta n n k cket? V agy c s a k egy re m n yte le n P H P -lm odoz vagyok?

m ost itt vagy

373

bemutatkoznak a stik

Nha kell egy sti


A HTTP-hitelestssel eredetileg ktfle problmt oldottunk meg: egyrszt bi zonyos oldalak elrsnek korltozst, msrszt azt, hogy az alkalmazs em lkezzen arra, hogy az adott felhasznl mr rt be informcikat magrl. Az utbbi a nehezebb, mert az alkalmazsnak tbb oldalon (parancsfjlon) ke resztl kell em lkeznie arra, hogy a felhasznl kicsoda. A Mismatch alkalma zs ezt gy oldja meg. hogy a $ _ S E R V E R szupergloblis tm bben trolt felhasz nlnevet s jelszt ellenrzi - vagyis azt hasznltuk ki, hogy a PHP a HTTPhitelestshez megadott felhasznlnevet s jelszt egy olyan szupergloblis ban trolja, amely tbb oldalon t is megmarad.

A HTTP-hitelests ma radandan trolja az adatokat az gyflen, de nem engedi meg azok trlst, ha ma'r nincs rjuk szksg.
A $J E R V E R

To view (his page, yoti need to log in to area Mismatch" on **ww.m>5 -maich.nei

Y jt psswrdvltbe o a o w
N am e sld n ey k

ir t&citar. >

$_SERVER [ 1 PHP_AUTH_USER1 ] $_SERVER[ * PHP_AUTH_PW1 ]

szupergloblis tmb m ara dandan trolja a felhasz nlnevet s a jelszt.

P o .\ asswfd
1 Rcmembei this password n my keycham " Cancel

~ Loq In >

A stik kis adatdarabok maradand trolst teszik lehetv az gyflen, ame lyek brmelyik parancsfjlt tllhetik, s kvnsg szerint trlheted is.

A HTTP-liitelests luxusa azonban tbb nem ll a rendelkezsnkre, mert a HTTP-hitelests nem tmogatja a kijelentkezst. Mshol kell te ht keresnnk a felhasznl adatainak maradand trolst. Az egyik le hetsges megolds a stik (cookie) hasznlata, amelyek olyan adatokat tartalmaznak, amelyeket a bngsz a felhasznl szmtgpn trol. A stik nagyon hasonltanak a PHP vltozira, azzal a klnbsggel, hogy a bngsz bezrsa (a szmtgp kikapcsolsa stb.) utn is megmaradnak - s ami mg fontosabb, a stik trlhetk, vagyis ha az adatok trolsra mr nincs szksg - pldul mert a felhasznl ki szeretne jelentkezni - , eltvoltliatjuk ket.
W ebkiszolglc Stiadatok trolsa

Stiadatok kiolvassa

g yflb n g sz

374 7. fejezet

A stiadatokat a w ebbngsz trolja a felhasznl szmtgpn. A sink ben trolt adatokhoz PHP-kdbl hozz lehet frni, s a stik nem csak tbb oldalon (parancsfjlon) keresztl kpesek a maradand trolsra, ha nem tbb bngsz-munkameneten t is. Ha teht a felhasznl bezrja a bngszjt, a Mismatch alkalmazs nem lpteti ki automatikusan. Ez sz munkra nem jelent problmt, mert egy parancsfjl kdjbl brmikor trl hetjk a stiket, ami lehetv teszi a kijelentkezst. A felhasznlk teht tel jes kren rendelkezhetnek arrl, hogy mikor szeretnnek ki jelentkezni.

Szemlyre szabott weba/kalmazsok ptse

Mi van a stikben?
A stik egy-egy adatot trolnak egy egyedi nv alatt, nagyon hasonl an a PHP vltozihoz. A vltozktl eltren azonban a stiknek le het lejrati idejk. Amikor a lejrati id elrkezik, a sti megsemmi sl. A stik teht nem halhatatlanok, csak tovbb lnek, mint a PHPvltozk. Sti lejrati id nlkl is ltrehozhat, mely esetben ponto san gy viselkedik, mint egy PHP-vltoz - akkor semmisl meg, amikor a bngszt bezrjk.

Nv
A sti egyedi neve

rtk
A stiben trolt rtk

Lejrati id
A sti elvlsnek s megsemmislsnek ideje

Nincsenek
A stik lehetv teszik, hogy egy szveges karakterlncot egy adott nv alatt trolj, valahogy gy, mint a PHP szveg tpus vltozival. A stiket az teszi olyan hatkonny - klnsen ak kor, ha az alkalmazs tbb olyan oldalbl ll, amelyeknek em l keznik kell bizonyos adatokra, pldul a bejelentkezsi infor mcikra - , hogy tllik a parancsfjlok szokvnyos adatait.

hlye krdsek

K I M i olyan nagy szm abban, hogy a stik ma


^ j radandk? A MySQL-adatbzisok is maradandan troljk az adatokat, nem?
! Az aDe igen, termszetesen az adatb zisokban trolt adatok is maradandk, st jval maradandbbak a stiknl, hiszen soha nem vlnek el - ha beszrsz egy ada tot egy adatbzisba, az egszen addig ott ma rad. amg kifejezetten nem trld. A stik s az ltaluk nyjtott maradandsg igazi el nye a knyelem. Nem kell az rkkvals gig trolni az aktulis felhasznl azonost jt vagy felhasznlnevt csak azrt, hogy le hetv tegyk a hozzfrst a profiljhoz; csak arra van szksg, hogy gyorsan megl lapthassuk, hogy kirl van sz. Valjban te ht ideiglenes maradandsgra van szksg, ami nellentmondsnak tnhet, amg bele nem gondolunk abba, hogy valjban arra van szksg, hogy az adatok tovbb maradja nak meg, mint az oldalak - de nem rkk.
most itt vagy 375

username sidneyk 01/01/3000

A sti jval maradan dbb lesz, ha a lejrati idejt a tvoli jvbe helyezed.

Ha egyltaln nem adsz meg lejrati idt, a sti akkor trldik, amikor bezrjk a bngszt.

A Mismatch alkalmazs teht kt sti belltsval utnozhatja a $ _ s e r v e r szupergloblis ltal biztostott maradandsgot: az egy ik sti a felhasznlnevet, a msik a jelszt trolja. A jel szt persze nem muszj megrizni; helyette clszerbb lehet a felhasznl azonostjt elraktrozni.

a setcookie() fggvny

A PHP a setcookie () nev fggvnyen s a $_COOKlE nev szupergloblison keresztl nyjt hozzfrst a stikhez. A setcookie () fggvny a sti rtknek s lejrati idejnek (ez nem ktelez) bellts ra, mg a $_CQOKIE szupergloblis a sti rtknek kiolvassra szolgl.
setcookie( username 1 , 1 sidneyk1) ;

A $etcookie() els pa ramtere a sti neve.

Msodik paramterknt a stiben troland r tket kell tadnod.

echo( class="login">You are logged in as ' . <p

$ _ C O O K IE

['username * . '.</p> ]

A sti rtkre a sti nevvel hivatkozhatsz a $_C 00KIE szupergloblisban.


A stik belltsnak az az elnye, hogy a sliadatok a parancsfjlokon ke resztl is megmaradnak, gy az alkalmazs anlkl em lkezhet a felhaszn lnvre, hogy minden alkalommal bejelentkezsre kellene krnie a felhasz nlt, amikor az msik oldalra ugrik az alkalmazson bell. Ne feledd azonban, hogy egy stiben a felhasznl azonostjt is trolnod kell, mivel ez szolgl az adatbzis-lekrdezsek elsdleges kulcsaknt.
setcookie(1 user_id 11 1) ; ,

A PHP setcookie() fggvnye teszi le hetv, hogy stikben trolj adatokat.

A stiben az adatok mindig szveg knt troldnak. Ha a felhasznl azonostja egy szm, a sti akkor is karakterlncknt trolja.

A s e t c o o k i e {) fggvnynek egy harmadik, nem ktelez paramter is adhat, amely a sti lejrati idejt hatrozza meg, vagyis azt, hogy stinek mikor kell nm kden trldnie. Ha a fenti pldhoz hasonlan nem adsz meg lejrati idt, a sti automatikusan akkor vl el, amikor a bng szt bezrjk.

376 7. fejezet

Szemlyre szabott webalkalmazsok ptse

Hegyezd ki a ceruzd!
A Mismatch alkalmazs tlltsa a slik hasznlatra tbbet ig nyel pusztn egy j kijelentkezsi parancsfjl megrsnl. Elszr t kell dolgoznod a bejelentkezsi parancsfjlt, hogy HTTP-hitelests helyett stiket hasznljon. Karikzd be s lsd el megjegy zsekkel a belptet kdnak azokat a rszeit, am elyeket szerinted mdostani kell ahhoz, hogy tmogassk a stiket!

<?php re q u ire _ o n c e ( ' c o n n e c tvars . php' >; if ( ! s s e t ($_SERVER r ' PHP_AUTH_USER '} ) || i s s e t { S_ SERVER [ 1PHP_AUTH PW'J)) {

// A felhasznlnevet s a jelszt mg nem rtk be. ezrt el" kell kldn! ~a hitelestsi fejlceket

h e a d e r ( Hl T P / l._ 4G_ U n a u th o r iz e d '); h e a d e r ( 'W W u t h e n t i c a t e : B a s . c realm="Mismatch"' ) ; W -A e x i t ( ' <h3>Mismatch</h3>Sorry, you must e n t e r your username and password t o ' log in and a c c e s s t h i s page. Tf you a r e n \ ' t a r e g i s t e r e d member, p l e a s e ' '<a h re f= " s ig n u p . php">sior. u o < / a > .') ;

}
// Csatlakozs az adatbzishoz

$dbc = m y s q :i_ c o n n e c t (DBJOST, D3_USER, DB_PASSWORD, DB_NAME);


// A telhasznl ltal bert bejelentkezsi adar.ok kiolvassa $ u ser _ u s e r name -

m y s q . i _ r e a ._ e s c a p c _ s t r i n g ( S d b c , $user_password - m y s a l i _ r e a l _ e s c a p e _ s t r i n g ( S d b c ,

t r im<S^SERVER['PHP ATH USER'])); t r i m ($_SERVERf' PHP AUTH~PW'));

// A elhasznlnv s a jelsz kikeresse az adatbzisbl

$query = "SELECT u s e r _ id , username FROM mismatch_user W HERE username = " ?uber_username1 A D password = SHA(*$user password ) " ; N Sdata m ysqii_query($dbc, S q u e ry ); if (mysqli__num_rows ($data) = = 1 ) {

// A bejelentkezsi adatok rendben vannak. gy a felhasznl adatait tartalmaz vltozk bellthatk

$row - m y s q l i _ f e t c h _ a r r a y ( S d a t a ) ; $ u se r_ id = Srow[u s e r _ i d 1I ; Susername = $row[ 'usernam e' I ;

else {
// A felhasznlnv-jelsz pr rvnytelen, ezrt ismt el kell kldeni a hitelestsi fejlceket

h e a a e r { ' HTTP/1 .1 401 U n a u t h o r iz e d ') ; h e a d e r ( 'W W u t h e n t i c a t e : B a s i c reaim="Mismatch"' ) ; W -A e x i t ( ' <h2>Mi smatch</h2>Sorry, you must e n t e r a v a l i d username and password ' t o Log - n and a c c e s s t h i s page. I f you a r e n \ ' t a r e g i s t e r e d memoer, ' . ' p l e a s e <a h ref= "s ig n u p .p h p "> sig n u p < / a > .') ;

// A sikeres bejelentkezs megerstse

e c h o ( ' <p c la s s = " lo g in "> Y o u a r e logged in as ' . Susername . ' . < / p > ' ) ;

login.php

most itt vagy

377

Hegyezd ki... megolds

A HTTP-hitelestsi fejlcek elkldsre tbb nincs szksg.


// Connect t o the d atabase $dbc = mysqli_connect(D3_H0ST, DBJISER, DB_PASSWORD, DB NAM E) // Grab th e u s e r - e n t e r e d l o g - i n data * Suser_username - m y s q l i _ r e a l _ e s c a p e _ s t r i n g ( $ d b c , tr i| f($ SERVER |' PHP AUTH U SER ' ] ) 1 $user_password = m y s q l i _ r e a l _ e s c a p e _ s t r i n g ( $ d b c , t r i f c ( $ _ S E R V E R [ 'PHP AUTH_ P W 'I )) ; // Look up the username ana password in the database $query - "SELECT u s e r _ id , username FROM mismatch_user W HERE username = " . " , $user_username AN password = SKA( * $user_password' ) " ; D $data m y s q li_ q u e ry ($dbc, $<xuery) ; A lekrdez Sen semmit

--------sem kell vltoztatni.


if
a

(mysqli_num_rows($data) = ^ 1 ) { . / Tne l o g - i n i s OK so s e t t h e user ID and username v a r i a b l e s


S ro w = u v a a u fp . l ;;p n r ^ ^ d a ta ) ; , A

u s e r _ id = $ r o w [ , u s e r_ T d TT T \ ^ :~ ^ ^ ^
username ~ $ row[ 1username1 ] j y

Itt

pa ra n csfa jl-va lto zo K

------------------------ helyett kt stit kell be-

e i Se i

lltanunk.

//_Thg r.-^^rr.^fne /passworci a r e i n c o r r e c t so send the a u t h e n t i c a t i o n headers header (' KTTP/1.1 401 U n a u t h o r iz e d ') ; X ji e a d e r <'WWW-Authenticate: B a s i c reaim="Mismatch"' ) ; ""A ex"l - 1 'Mi/-'Mi5motcn</nx>.-3orry, you n^sf e n t e r d V alid username and password ' ' w log -.n and a c c e s s :.his page. I f you a r e n \ ' t a r e g i s t e r e d member, ' . O ' p l e a s e <a h r e f= "s ig n u p .p h p "> sig n u p < / a > .');

$ username

Mivel a felhasznlnv s a jelsz bershoz nem tmaszkodha tnk egy HTTP-hitelestsi ablakra, egy HTML bejelentkezsi ' rlapot kell ltrehoznunk ezeknek az adatoknak a megadshoz.

378

7. fejezet

Szemlyre szabott weba/ka/mazsok ptse

A bejelentkezs menetnek jragondolsa


Alihoz, hogy stiket hasznlj HTTP-hitelests helyett a bejelentkezs ke zelsre a Mismatch alkalmazsban, tbb szksges a felhasznli adatok trolsnak jragondolsnl. Mi a helyzet a bejelentkezsi fellettel? A stikre tmaszkod bejelentkezshez sajt rlap kell, mivel a felhaszninv s a jelsz bershoz nem tmaszkodhatsz egy HTTY-hitelestsi ablakra. Ezt az rlapot azonban nem elg csak felpteni - azt is t kell gondolnod, hogy miknt vltoztatja meg az alkalmazs mkdst, ahogy a felhasznlk bejelentkeznek s hozzfrnek az oldalakhoz.
Mksmalch Where opposites attract!

A HTTP-hitelestsi ablak

helyt egy j rlap veszi t ide kell berni a felhaszn lnevet s a jelszt a beje lentkezshez.

' ^

j Lg In hivatko-

-------------------[jidhcyk * * * * * *

zsra kattintva a fe l- I hasznl a bejelentkez K oldalra kerl, ahol te I F u T k L ~ ~ ---------megadhatja a bejelent- I kezeshez szksges I adatokat.
DienJrc

I
,__ ^ I
<? ia a i^ P
index.php

~ ~
A sikeres bejelentkezs utn a fe lhasznlt visszairnyftjuk a kezdlap ra, ahol a men most mr jelzi, hogy 3 felhasznl bejelentkezett. \
\s
M ism atch W here opposites attract!

Ha nincsenek bejelent kezve, az alkalmazst otoljra ignybe vev fel Hasznlk neve statikus szvegknt jelenik meg.

** V ic*

A kijelentkezsi parancsfjl egy olyan hi vatkozson keresztl rhet el, amely a bella&nit ifilzo fs lirs t rszs.

**CiLHfe C& w Qtisidcy u a Ju

M ism atch - View Profile

,/

y * k
Lm*

1o s
Female

lV rtjn; n vi dc
f in t name: Sidney

& vdett oldalak immr hozzfrhet*, mivel a fel hasznl bejelentkezett^

A to navigsetos me nbe egy Lg Out hivatkozs kerl, amely a bejelentke zett felhasznl ne vt is mutatja.

n*Or: Kciiov,

G enO tr:

BirtM 19U^? 19

I-o tJ T e.A ca c: arp Z

Bejelentkezs utn a felhaszn lk neve hivatkozss vltozik;^


Wld o Jtk o yu c u

ezek a hivatkozsok a megfelel profilnzethez vezetnek.


viewprofile.php m ost itt vagy

index.php

379

login.php - ezttal stikkel vezrelve!

A bejelentkezsi parancsfjl j vltozata, amely stikre tmaszkodik az adatok maradand trolshoz, nmileg bonyolultabb az eldj nl, mivel sajt rlapot kell biztostania a felhasznlnv s a jelsz bershoz - ugyanakkor hatkonyabb is, mert a kijelentkezst is le hetv teszi.
< ? P hP

Mismatch - Log In

r Login------------ -

Username: Password:

sdnek .........

A hibazenetek most egy vlto^ froldnak/ s szksg

r e q i r e _ o n c e <' c o n n e c t v a r s . p h p ' ) ;

//A hibazenet t r l s e S e rro r_ m s g _____

szerint, a parancsfjl ksbbi rszben jelentjk meq ket. Ellenrizzk a u se rJd sutit, hogy i hogy a felhasznl bejelentkezett-e

// Ha a felhasznl nincs bejelentkezve // megprbljuk b e l p te tn i


11 ( ! isset($_C O O K IE [, u s e r J .d M ) ) i f (i s s e t ($ POST[ * 3 u b m i t 1 J ) ) ^ ------

// Csatlakozs az adatbzishoz $dbc = mysqIi_connect(DB_HOST, DB USER, DB_PASSWORD, DB_NAME)

Ha a felhasznl nincs bejelentkezve, megnzzk, hogy megadta-e a bejelentkezsi adatokat. A felhasznl ltal bert ada tok most egy hitelestsi a t a l helyett 3z rlap POST-

// A telh aszn l l t a l b e i r t b e je le n tk e z s i adatok kiolvassa Suser username = m y s q l i _ r e a l _ e scape s t r i n g (Sdbc, tr im ($_P O S T [ * username ][) ) ; Suser jpassword - m y s q l i _ r e a l _ e s c a p e _ s t r i n g ( S d b c , trim($_POST f password' jj) ;

if

( ! e m p ty ( S u s e r _ u s e rname) e m p ty ( $ u s e r _ p a s s w o r d ) ) { adataibl szrmaznak. I I A felhasznlnv s a je l s z k ik e resse az adatbzisbl Suser username AN " . D Squery = "SELECT u s e r _ id , username FROM mismatch_user W HERE username "password = SHA ( ' $user_passwordT) " ; S d a ta = m y s q li_ q u e r y ( S d b c , S q u e r y ) ; ^ felhasznl belptetse a userJ A
if

(mysqii_num_rows(Sdata) == l ) { r s username stik belltsval. // A b e je le n tk e z si adatok rendben vannak, gy a felhasznl a zo n ost jt s nevt tartalmaz s tiket Srow mysq l i _ f e t e h a r r a y ($ d a t a ) ; _/ b e l l t ju k , s a felhasznlt v is s z a ir n y tju k a kezdlapra s e t c o o k i e ( 1u s e r _ i d * , $ r c w [ u ser i d ' ] ) ; ^ s e t c o o k i e (* username *, Srow [ * username ] ) ; */ i n d e x . p h p ; $home u r l = h t t p : / / ' . $ SERVER[ 1HTTP HOST*3 . dirname($_SERVERf' ?HP_SELF']) h e a d e r ( * L o c a t i o n : ' . $home_url);
... * ............................... ........................

e ls e

{ I I A felhasznlnv j e l s z pr rvnytelen, eziL hibazenetet adunk error nsg = l o r r y , you must e n t e r a v a l i d 'ern.H e a:..i psword t log i n . ; m

) " '' }

Sikeres bejeentke;-:

e s e t n

else { // A fe lh a s z n l n v -je ls z prt nem adtk meg, e z rt hibazenetet adunk $errcr_m sg * S o rry , you must nt-our usern:-nd password to lo g i n . 1;

visszairnytjuk a fe lh a s z n | t 2 Mismatch kezdi a p j ra

}
Ha brmilyen gond van

?> <html>
<head> < title > M is m a tc h - Log I n < / t i t l e > < l i n k r e l " s t y l e s h e e t " type " t e x t / c s s " hr: </nead> <body> <h3>Mismatch - Log In</h3> ? "sty le .c ss

a bejelentkezsi adatokkal, belltjuk a hibazenetet trol vltoz rtkt.

A bejelentkezsi parancsfjl most mar t f i teljes oldalt jelent meg, ezrt minden szabvnyos HTMl-elemre szks9 van.

a kvetkez'oldalon folytatdik...

380 7. fejezet

Szemlyre szabott webalkalmazsok ptse


?php *)
Ha a s u t i res, m e g je len tj k a b e l l t o t t hibazenetet a b e je l e n t k e z s i Jrlappal egytt, egybknt Deciig i f (empty(S_C0QKI511u 3 e r _ i d *31) i ^ * e r s t j k a b e je l e n t k e z s t echo '<p c la a 3 * ,e r r o r " > ' . $error_msg . ' </p>'; a e * 6n 3 ponton a felhas na/ <forrri method="post" action^ "<?php echo S_SERVER{ ' PHF_SELF' |; ?>"> < fie ld set> <1egend>Log In</legend> <1a be 1 f o r= " us e r name " >Us e r n ame : </1 a be 1> c in p u t t y p e - t e x t " id^M username" name= username vaiue="<?php i f (! empty ($u3er_userna!ne)} echo S u s e r uaemame; ?>" / x f c r /> < l a b e l for"passw ord">Passw ord:</label> --------------------------------- -------------------------------------------------------------------------------------------------<lnput typea *"password i d "passvord" narne-"password" /> <input type=,fsubm it" va]ue="Log I n " name="submit" /> </ form> Minden, ami ez eltt a kapcsos zrjel

?>

A bejelentkezshez ebben a kt rlapmezoben kell megadni a felhasznlnevet s a jelszt.

e lo lt tallhat, az els if felttel rsze.


- l s e { Jp

//A s ik e r e s b e je le n tk e z s megerstse echo{*<p elss*"io gin **> Y ou a r c lo g g e c i n as

Ha a felhasznl ezen
$_COOKI ?, { |u g r narri-s * j . V. </p > 1 ;

?>

W A bejelentkezsi weboldal teljess ttel hez le kell zrni a HTML-kdof.

a ponton be van je lentkezve, egyszeren visszajelzst adunk neki errl.

</body> </html>

Nincsenek

hlye krdsek

K
V

M irt kell a felhasznl azonostjt s a nevt is stiben trolni? Mivel mindkt adat egyedileg azo nost egy felhasznlt a Mismatch felhasznli adatbzisban, az akailis felhasznl rgztsre a kett kzl brmelyik hasznl hat. A u s e r _ i d azonban az adatbzis szempontjbl jobb (s hatkonyabb) hivatkozs, mi vel szmrtk elsdleges kulcs. Msrszrl azonban a u s e r _ i d meglehetsen rejtlyes, hiszen a felhasznl szmra semmilyen jelentssel nem br ezrt ahhoz, hogy a felhasznlval tudathassuk, hogy bejelentkezett (pldul meg jelenthessk a nevt az oldalon), a felhasznlnevet hasznlhatjuk. Sokszor tbben hasznljk ugyan azt a szmtgpet, ezrt fontos, hogy ne csak azt kzljk a fel hasznlval, hogy bejelentkezett, hanem azt is, hogy milyen nven.

K
V

Akkor m irt nem troljuk a jelszt is egy stiben a bejelentkezsi adatok rszeknt? A jelsz csak abbl a szempont bl lnyeges, hogy az elejn el lenrizzk, hogy a felhasznl valban az-e, akinek mondja ma gt. Miutn a jelszt a bejelentke zsi folyamat sorn hitelestettk, nincs r okunk, hogy1 tovbbra is kznl tartsuk. A jelszavak emel lett igen rzkeny adatok, ezrt ha csak lehet, kerljk az ideigle nes trolsukat.

K
V

gy tnik, mintha a bejelentkezsi pa rancsfjl rlapja az i f utasts belse jben lenne. Lehetsges ez? Igen, st valjban meglehetsen gyakori, hogy a PHP-kdot szt trdelve helyezik el a HTML-kd krl, ahogy' a bejelentkezsi pa rancsfjl esetben is. Pusztn az, hogy a ? > jelekkel lezrsz egy PHP-kdrszt, mg nem jelenti azt. hogy a kd logikjt is lezr tad. Amikor j PHP-kdrszt nyitsz a <?php cmkvel, a logika ott folytatdik, ahol abbamaradt. A bejelentkezsi parancsfjlban a HTML-rlapot az i f utasts els ga tartalmazza, mg az e l s e g az rlap kdja utn kvetkezik. A PHP- s a HTML-kd ilyen vl togatsa lehetv teszi, hogy ne kelljen egy csom zavaros e c h o utastssal ellltani az rlapot.

most itt vagy

381

a mismatch alkalmazs dinamikus menje

Mozgs a Mismatch alkalmazsban


Az j bejelentkezsi parancsfjl megvltoztatja a Mismatch alkal mazs mkdst, mivel egy egyszer ment ignyel, ami a kez dlapon (in d e x .p h p ) jelenik meg. Ez a men azrt fontos, mert ez biztostja az alkalmazs klnbz fbb rszeinek - jelenleg a View Profile s Edit Profile oldalaknak - az elrst, valamint a lehetsget a felhasznlknak a bejelentkezsre, feliratkozsra s kijelentkezsre, a bejelentkezsi llapotuktl fggen. Az, hogy a men a felhasznl bejelentkezsi llapottl fggen vltozik, azrt lnyeges, mert vgssoron ettl lesz a men hatkonyan hasznlhat.

Attl fggen, hogy a username sti be van-e lltva, ms-ms men jelenik meg.

Ez a men akkor lthat, psiT^tcl::. ha a felhasznl nincs be jelentkezve, s a bejelent - Where opposites attract: h kezsre, illetve a fe lira tko -^^~ -> Logio zsra ad lehetsget. *S ta lB
L a te s t m e m b w s :

A ment az in d e x . php parancsfjlban tallhat PHP-kd lltja el, s ez a kd a $_C00KIE szupergloblis segtsgvel keresi meg a usernam e stit, hogy megllaptsa, hogy a felhasznl b e jelentkezett-e vagy sem. Erre a felhasznli azonostt trol stit is hasznlhatnnk, de a m enben a felhasznlnv jelenik meg, ezrt sszerbb azt ellenrizni.

Az index.php parancsfjl tudja, hogy a rvidebb ment kell megjelente nie, ha nem tallja a username stit.

382 7. fejezet

Szemlyre szabott weba/ka/mazsok ptse

A user j d stit nem hasznljuk a klnbz menkhz, de a Mismatch-felhasznlk maradandsgnak biztostsban to vbbra is fontos szerepet jtszik. A username sti hatrozza meg, hogy melyik ment kell megjelenteni.

A bejelentkezett fe l hasznlk menje

// A n a v i g c i s men l t r e h o z s a if ( set( is $jCOOKXE-[ username *]) e c h o '& # 1 0 0 8 4 ; <a h r e f = " v i e w p r o f i l e . php">V iew P r o f ile < / a > ^ > r / > ; e c h o & # 10084; <a h r e f = " e d i t p r o f i l e . p h p "> E d it P r o f ile < / a > ) f b r / > '; e c h o '& # 1 0 0 8 4 ; <a h r e f = fT g o u t .p h p >Log Out ( ' . $_COOKIE[ ' u s e rn a m e ] lo e ls e { e ch o e ch o

&#10 0 8 4 / <a h r e f = ,,l o g i n .p h p ,,>Log I n < / a x b r />' #10084; <a h r e f = s i g n u p .p h p "> S ig n Up</a> ;

1 Sitaiia

kosin

A menpontok mellett lthat kis szveket ez a legtbb bngsz' ltal ismert HTML-egyed jelenti meg.

A ltogatk (a be nem jelentkezett felhasz nlk) menje

most itt vagy

383

a felhasznlk kilptetse a stik trlsvel

Helli Emlkezel mg rm ? M o s t m r tnyleg szeretnk kljelentkeznil

Ideje, hogy lehetv tegyk a felhasznlknak a kijelentkezst.


A stiknek ksznheten a bejelentkezs s a mozgs valamivel knnyebb vlt a Mismatch alkalmazsban, de azrt vltottunk HTTP-hitelestsrl stikre, hogy lehetv tegyk a felhasznlknak a kijelentkezst. Egy j kijelentkezsi parancsfjlra van szksgnk, amely trli a kt (a felhasznli azonostt s a felhasznlnevet tr* l) stit, hogy a felhasznl ne rje el tbb az alkalmazst. gy meg akadlyozhat. hogy valaki ksbb ugyanahhoz a szmtgphez le lve hozzfrjen egy msik felhasznl szemlyes profiladataihoz. Mivel a felhasznlk kilptetshez nem tartozik valdi felhasznli fellet, a kilptets utn elegend visszairnytani ket a kezdlapra.

Mismatch Where oppu-itta attract! ** U i PQic d r fti

L gO o r^k o tll d v'i

Sidney mg
hogy k ije le n tk e z h e s s e n ...

logout.php

A kijelentkezsi parancsfjl t rli a felhasznl bejelentke zsi stijeit, s visszairnytja a felhasznlt a kezdlapra.

384 7. fejezet

Szemlyre szabott weba/ka/mazsok ptse

A kijelentkezs a stik trlst jelenti


Ahhoz, hogy egy felhasznl kijelentkezhessen, a felhasznlt nyomon kvet kt stit kell trlni. Ez a s e t c o o k i e () fggvny meghvsval s a fggvnynek egy lejrati id tadsval hajthat vgre, amely a stit a megadott idpontban trli:

Perc

Az aktulis id

A fenti kd a lejrati idt az aktulis idtl 8 rnyira lltja, ami azt je lenti, hogy a sti 8 ra mlva automatikusan trldni fog. Mi azonban azonnal trlni szeretnnk a stit. amihez az szksges, hogy a lejrati idt egy mltbeli idpontra lltsuk. Az, hogy az idpont mennyivel mlt el. nem igazn szmt - csak vlassz egy tetszleges idtartamot - pld ul egy rt s vond ki az aktulis idbl:
setcookie( username1, 1sidneyk' time() - 3600); ,

sszessgben ez a kifejezs a lejrati idol az aktulis idtl 8 rnyira lltja.

6 0 msodperc x 60 perc = 3 6 0 0 msodperc, ami egy rval ezelttt jelent.

Ahhoz, hogy trlj egy stit, csak egy Mltbeli idpontra kell lltanod a lej rati idejt.

A Mismatch alkalmazs kijelentkezsi parancsfjljbl hinyzik nhny kdrszlet, rd be a hinyz kdokat, s gondoskodj rla, hogy a bejelentkezsi stik trldje nek, mieltt a kijelentkezsi oldal visszairnytan a felhasznlt a kezdlapra!

Gyakorlat
<?php

// Ha a f e lh a s z n l be van je l e n t k e z v e ,
if ( ) (

a s ti

t r l s v e l k i l p t e t j k id e j k egy r v a l (3 6 0 0 )

// A u s e r _ id s usernam e s t i k // k o r b b ra l l t s v a l

t r l s e a le j r a t i

// V i s s z a i r n y i t s a k e z d la p ra
$home_ u r l = ' h t t p : / / ' h e a d e r ( 1L o c a t i o n : . $_SERVER f ' HTTP_HOST' J . dirname($_SERVER[ f PHPJSELF*] ) . r . $home u r l ) ;

?>

most itt vagy

385

a kiegsztett logout.php parancsfjl

*3rrr-

A Mismatch alkalmazs kijelentkezsi parancsfjljbl hinyzik nhny kdrszlet. j rcj j3e a h ^ nyz0 kdokat, s gondoskodj rla, hogy a bejelentkezsi stik trldje nek, mieltt a kijelentkezsi oldal visszairnytan a felhasznlt a kezdlapra!

Gyakorlat - megolds
<?php
// I f th e u s e r i s log ged I n , d e l e t e th e c o o k i e t o l o g t h e m o u t Cs3k akk f 1 8 felhaSZ-

if (

, {

c _______ ____ nlt' ha m f bejelentkezett. a'

// D e l e t e t h e u s e r ID and username c o o k i e s by s e t t i n g t h e i r e x p i r a t i o n s t o an hour ago (3600)

u, W

) - y> 00);......^

$m egy rva| fo-

. W

, ; ; W ) . - 0 0 )i .

rbbr8 lltjuk, hogy a rendszer azonnal trlje Vet.

V w ia W n y iti, a Mismatch kez<Jl3pjra egy URL segtsqvel. ^


* J /

// Redirect to the home paqe

$home_url = 'http://* . $_SERVER [ HTTP_HOST1J . di rname ($_SERVER [1PHP_SELF* ] ) . ' header( Location: ' . $home_url);

?>

A Location fejle msik oldalra irnytja t a bngszt.

Tesztt
Stiket hasznlva valstsd meg a kijelentkezsi lehetsget a Mismatch alkalmazsban!
{Mdostsd a Mismatch alkalmazs parancsfjljait, hogy stiket hasznlva tegyk lehetv a fel hasznlknak a be- s kijelentkezst (vagy tltsd le a parancsfjlokat a Head First Labs webhelyrl, a w w w .h e a d fir s t.la b s .c o m / b o o k s / h fp h p cmrl). A stik hasznlathoz az in d e x .p h p , a lo g in .p h p , a lo g o u t .p h p , az e d i t p r o f i l e . p h p s a v ie w p r o f i l e .php parancsfjlt is mdostani kell. Az utols kt parancsfjlban csak kis vltoztatsokra van szk sg; elssorban a $ u s e r _ i d s a $ u sern am e globlis vltozkra val hivatkozsokat kell tll tani a $_C 00K IE szupergloblisra. Tltsd fel az sszes parancsfjlt a webkiszolgldra, s nyisd meg a Mismatch alkalmazs fol dalt ( in d e x .p h p ) egy w ebbngszben. Figyeld meg a navigcis ment, majd kattints a Lg In hivatkozsra, s jelentkezz be. Figyeld meg, hogyan vezet vissza a bejelentkezsi parancs fjl a kezdlapra, s hogyan vltozik meg a men, hogy jelezze, hogy bejelentkeztl. Vgl kattints a Lg Out hivatkozsra, hogy trld a stiket, s kijelentkezz az alkalmazsbl.
386

7. fejezet

Szemlyre szabott webalkalmazsok ptse


, felhasznl meg
Where oppoflkt attract

edzshez s a l'
leleMUezsViez

sVVet hozunk l

Mismatch Log In
j

U crtm n e K wbrv

V m arom
PaM vord: %

In------------------

im

. m

A Mismatch alkalmazs ban a be- s kijelentke zst most mr teljes g szben stik vezrlik.
- '.Sn
M ism atch - View Profile

Na cs, n lelptem!

^ w k ttimi e x n

rrrnmm. uncyk
^ mjjw: Sidney

U dr: FmJt -n e c e
Brtbdau-- I9M -07-J9

A felhasznl elfelejts
hez s a kijelentkezshez eldobjuk a stiket.

Location:

Teranc. AZ

W y ih Kfi u B ff .M o k i ia cjB d

Sidney boldog, hogy kijelentkezhet, s biztos lehet benne, hogy m sok nem szerkeszthetik a Mismatch-jwofiljt, amg tvol van.

Nincsenek

Teht a kijelentkezshez csak egyszeren trlni kell a stiket?


Igen. A Mismatch alkalmazsban a stik felelnek az sszes bejelentkezsi informci (a felhasznl-azonost s a felhasznlnv) trolsrt, gy a trlsk teljes kijelentkezst eredmnyez.

M irt egy rval korbbra lltottuk a stik lejrati idejt a trlshez? Van valami je lentsge az egy ra idtartamnak?
Nincs. A stiket automatikusan trli a w ebbngsz, amikor elrkezik a le jrati idejk, vagyis ha trlni akarsz egy stit. brmilyen mltbeli idpontra llthatod a lejratt. Az egy ra (3600 m sodperc) csupn egy vletlensze ren kivlasztott rtk, amivel azt jelezzk, hogy trlni akarjuk a stit.

most itt vagy

387

a felhasznli adatok trolsa az gyfl helyett a kiszolgln

Jason - Mismatch-felhasznl; a trzs, a testkszerek s Howard Stern rajongja - bngszjben a stik nem engedlyezettek, ami gondot jelent a bejelentkezskor.
, ja j. A bngszmben ] ^ le vannak t i l t va a stik, e z rt nem tu d o k bejelentkezni . M o s t m it csinljak? [

U g y lb n g s z

A ksrlet a beje lentkezsre itt kezd'dik.

M&atofe - Wtwt oppusitts ahract

L tIn 5 .L itn v

ongeszo visszautastja a stiket, gy megakadlyoz-

* r\ (\
MLsmatcb Ixig In

mm

W ebkiszolgl

za, hogy a bejelentkezsi pa rancsfjl belltsa azokat. A kiszolgl megprblja be lltani a u s e rjd s usernw stiket a bngszben.

r Lof la
U w rn a m r: fato*

Passw oril:

.........

K it rdekel Ja so n ? A legtbb felhasznlnl engedlyezve vannak a s tik, nem?

Igen, de egy webalkalmazsnak a lehet legtbb ember szmra hozzfrhe tn e k kell lennie.
Vannak, akik aggdnak a stik hasznlata miatt, ezrt gy dntenek, hogy a ki kapcsolsukkal fokozzk a biztonsgot, ezrt nem rt, ha azokra a felhasznlk ra is gondolsz, akik nem tmaszkodhatnak stikre a bejelentkezshez. De ez mg nem minden: van lehetsg arra is, hogy a bejelentkezsi adatokat a kiszolgln trold, s ne az gyflen. Mivel a parancsfjljaid amgy' is a kiszolgln futnak, sszer a bejelentkezsi adatoknak is ott helyet adni.

Szemlyre szabott webalkalmazsok ptse

A munkamenetek nem fggnek az gyfltl


A stik nagyon ers kis fickk, de nekik is megvannak a maguk korltai, pldul
hogy olyan dolgok korltozhatjk ket, am elyek felett nincs hatalmad. Mi lenne azonban, ha nem kellene a bngszre tmaszkodni? Mi lenne, ha az adatokat kzvetlenl a kiszolgln trolhatnd? A munkamenetek (session) ppen erre va lk: lehetv teszik, hogy a slikhez hasonlan egy-egy informcit trolj, de az adatokat nem az gyflen, hanem a kiszolgln raktrozzk el. A munkame net-adatok teht kvl esnek a bngsznek a stikre vonatkoz korltain.
M u n k a m e n e t-a d a to k trolsa W ebkiszolgl

A munkamenetek lehet
v teszik, hogy a kiszol gln, az gyfltl fg getlenl trolj maradan dan kis adategysgeket.

A stiktol eltren a mun kamenetek az adataikat a kiszolgln troljak. A bngsz nem jtszik kzvetlen szerepet a mun kamenet-adatok trols ban, mivel minden a ki szolgln troldik.
M u n k a m e n e t-a d a to k kiolvassa g yflb n g sz

A munkamenetek az adataikat munkameneti vltozkban troljk, ame lyek a stik logikai megfeleli a kiszolgln. Amikor egy munkame neti vltozba adatot rsz egy PHP-kd segtsgvel, az adatot a ki szolgl raktrozza el. A munkameneti vltozban trolt adathoz ez utn PHP-kddal frhetsz hozz, s az adat tbb oldalon (parancsfj lon) keresztl is megmarad. A munkameneti vltozk a stikhez ha sonlan brmikor trlhetk, ami lehetv teszi, hogy tovbbra is biztostsd a kijelentkezs lehetsgt, csak ppen munka meneteken alapul kddal.

u sern am e

s id n e y k

Mivel a munkamenet-ada tokat a kiszolgl trolja, hi7+nnsgosabbak s megi behatbbak a stikben trolt adatoknl.
A felhasznlk nem trlhetik sajt ke zleg a munkamenet-adatokat a bng szjkben, ami a stiknl gondot jelent. A munkamenet! vltozkhoz nem tartozik lejrati id', mert auto matikusan trldnek a munkame net vgn.

Most biztos arra gondolsz, hogy kell lennie valamilyen bukta tnak, nem igaz? Nos, valban van egy kisebb problma: a stikhez kpest kevsb szablyozhatod, hogy a munkame neti vltozk mennyi ideig troljk az adatokat. A munkame neti vltozk nmkden megsemmislnek, amint a munkamenet befejezdik, ami ltalban egybeesik azzal, amikor a felhaszn l bezrja a bngszjt. A bngsz teht kzvetetten hats sal van a munkameneti vltozkra - fggetlenl attl, hogy azok nem a bngszben troldnak hiszen a vltozk tr ldnek. amikor a bngsz-munkamenet vget r.

most itt vagy 389

a sessionjstartf) s session destroyf) fggvny

A munkamenetek lete s kora


A munkameneteket nem vletlenl hvjk munkameneteknek - vilgos kezdetk s vgk van. A hozzjuk kapcsold adatok a munkamenet lettartamnak m egfelelen lnek s halnak, amit PHP-kdon keresztl vezrelhetsz. Az egyetlen eset, amikor nincs befolysod a munkamenet letciklusa felett, ha a felhasznl bezrja a bngszt, ami - ha tetszik, ha nem - a munkamenet befejezdst eredmnyezi. Ha el szeretnl indtani egy munkamenetet, meg kell hvnod a s e s s i o n _ s t a r t () PHP-fggvnyt:
y

session start ( ; )

-------

Ez a PHP-fiiggvny indtja el a munkamenetet.

A PHP session_start() fggvnye elindt egy munkamenetet, s lehe tv teszi, hogy munka meneti vltozkban trolj adatokat.

A s e s s io n o s t a r t () fggvny meghvsa nmagban nem llt be semmi lyen adatot a fggvny feladata csupn annyi, hogy elindtsa a munka menetet. A munkamenetet belsleg egy egyedi munkamenet-azonost azonostja, amivel ltalban nem kell foglalkoznod. A webbngsz ennek az azonostnak az alapjn trst egy munkamenetet adott oldalakhoz.

W ebkiszolgl

Ez az egyedi munkamenet-azonost, amely automatikusan ltrejn minden j munkamenet esetben.

g yflb ngsz

A sznfalak mgtt a mun kamenet-azonost teszi lehetv, hogy tbb oldal osztozzon a munkamenet

Amikor egy munka menet elindul, egye di azonostt kap. viewprofile.php


editprofile.php

adatok elrsn.

A munkamenet-azonost nem semmisl meg a munkamenet b e zrsig, amire vagy akkor kerl sor, amikor a bngszt bezrjk, vagy akkor, amikor meghvod a s e s s io n _ d e s t r o y () fggvnyt:
^ session destroyO ;

A session_destroy() fgg vny egy munkamenet bez rsra szolgl.


390 7. fejezet

Ez a PHP-fuggvny zrja be a munkamenetet.


,

Ha egy munkamenetet magad zrsz be ezzel a fggvnnyel, az el raktrozott munkameneti vltozk nem semmislnek meg automa tikusan. Nzd meg kzelebbrl, hogyan troljk a munkamenetek az adatokat, hogy megrtsd, mi ennek az oka.

Szemlyre szabott webalkalmazsok ptse

A munkamenet-adatok nyomon kvetse


A munkamenetekben az a klassz, hogy a hasznlatuk nagyon hasonlt a stikre. Ha elindtottl egy munkamenetet a s e s s i o n _ s t a r t () megh vsval, a munkameneti vltozkat, pldul a Mismatch alkalmazs b eje lentkezsi adatait trolkat, a $ _ S E S S I 0 N szupergloblis segtsgvel llthatod be:
$_SESSION [1username 1 ] = ' sidneyk 1 ;
A munkameneti vltoz
yr ^ ltrehozsa s trolsa

a kiszolgln trtnik.

A munkameneti vltoz nevt in dexknt hasznlod a $_$E $$I0N szupergloblishoz.

A troland ertVet csak hozz kell rendelni a $_$E $$I0N szupergloblishoz.

echo(1 <p class="login">You are logged in as

$ SESSION[f username'] . 1.</p> );

A stiktl eltren a munkameneti vltozk belltshoz nem szksges semmilyen klnleges Fggvny - csak egy rtket kell rendelned a $_SESSI0N szupergloblishoz, s a tmb indexeknt a munkameneti vltoz nevt kell megadnod.

A munkamenet! vltoz elrshez csak a $_$E $$I0N szupergloblist s a munkame neti vltoz nevt kell hasznlnod.

Mi a helyzet a munkameneti vltozk trlsvel? Amikor egy munkamenetet a s e s s io n _ d e s tr o y () fggvnyen keresztl trlsz, a munkameneti vltozk nem semmislnek meg, ezrt sajt kezleg kell trlnd azokat, ha azt szeretnd, hogy meghaljanak, mieltt a felhasznl bezrn a bngsz jt (kijelentkezs!). Egy gyors s hatkony mdszer egy munkamenet sszes vltozjnak megsem mistsre, ha a $ _ S E S S I 0 N szupergloblist egy res tmbre lltod:
$ SESSION = array();
Ez a kd az sszes munkameneti vltozt megli az adott munkamenetben.

tH U fikdM lenet VltOZk fietTl

trldnek automatikusan, amikor egy munkamenet megsemmisl.


Ha egy munkamenet egy suti segtsgvel jegyzi meg a munkamenet awnositojat, aW(or az
a z o n o s t

De mg nem vagyunk teljesen kszen, a munkamenetek ugyanis a sznfalak mgtt stiket is hasznlhatnak. Ha a bngsz engedlyezi a stiket, a mun kamenet ltrehozhat egy stit, ami ideiglenesen trolja a munkamenet azonos tjt. Alihoz teht, hogy PHP-kdon keresztl teljesen bezrj egy m unkamene tet, a munkamenet-azonost trolsra a bngszn esetlegesen automatiku san ltrehozott stit is trlnd kell. Mint brmely ms stit, ezt is gy semmi stheted meg, hogy a lejrati idejt valamilyen mltbeli idpontra lltod. Ehhez csak a sti nevt kell tudnod, amit a session_nam e () fggvnnyel derthetsz ki:

a munka

menet neve alapjn elneve zett stiben fog trolodn.

if

( i s s e t ( $ _ C O O K I E [ s e s s i o n _ _ n a m e ()])) { s e t c o o k i e ( s e s s i o n n a m e ( ) , 1 1 , time() - 3600);

Elszr ellenrizzk, hogy ltezik-e munkamenet-sti.

A munkamenet-stit gy trl jk, hogy a lejrati idejt egy rval korbbra lltjuk.

most itt vagy > 391

a munkamenetek mkdse a mismatch alkalmazsban

Where opposites atom t!

M ls m a lc h - I .o g In

A Mismatch alkalmazs tdolgozsa, hogy a bejelentkezsi adatok t rolsra egy munkamenetei hasznljon, nem olyan bonyolult, mint _ amilyennek hangzik. Valjban az alkalmazs mk dse nagyjbl vltozatlan marad - csak az ignyel . ________I nmi tbbletmunkt, hogy elindtsd, majd megsem mistsd a munkamenetet, illetve kitakarts utna.

I
^

A felhasznl azonost ^
f.

jnak s a bejelentkezshez hasznlt felhasznlnvnek a trolsra kt munkameneti vltozt hozunk ltre.

------- i 1 I

; o n _ s t a r t- n , i u -

A session_startu egy munkamenet megnyits val kezdi a munkt.

Ha a stik engedlyezettek, a kiszolgl lt rehoz egyet a munkamenet-azonost trol sra, egybknt pedig az egyes oldalak URL jn keresztl adja t az azonostt. Ha a munkamenet-azo A session_destroy() fggvny befejezi a munkamenetet, megakadlyozva, hogy egy msik oldalon is fe l hasznlhat legyen. \ \ \ \ nostt egy sti trol ta, az alkalmazs meg semmisti a stit. A bejelentkezsi adato kat az alkalmazs most mr stik helyett mun kamenetek segtsgvel jegyzi meg. V &
Mismatch View Profile
You o r r b g g r d in u x jM o n t. L iix '.W U sernam e: j * t f First
I

A munkameneti vltozk m semmistse a $_SESSI0N tmb kirtsvel trtnik.

,1

(idfr Nlc U

HirtMaie: 1969*09-24
i Hollywood. CA

Would yt*i h ie o

392 7. fejezet

Szemlyre szabott web a!ka!mazsok ptse

Kijelentkezs munkamenetek segtsgvel


Egy felhasznl munkamenetek segtsgvel vgrehajtott kilptetse a Mismatch alkalmazsbl valamivel tbb munkt ignyel, mint az elz, csak stiket hasz nl vltozatban. A kcjvetkez lpseket kell vgrehajtanod ahhoz, hogy munka menetekkel sikeresen kilptethess egy felhasznlt a Mismatch alkalmazsbl:

Q o

A munkameneti vltozk trlse. Annak ellenrzse, hogy ltezik-e munkamenet-sti, s ha igen, a sti trlse. a munkamenet megsemmistse. A felhasznl visszairnytsa a k e z d la p ra .^

Ellenrzs nlkl * u^ . |t . hogy a munkamenet ltrehozott-e stit.

O
O

Ok, ez egy kiegszt lps, amire szigoran vve nincs szksg a felhasznl kilptetshez, de ennek ellenre hasznos lehet.

ki a ceruzd!

A Mismatch alkalmazs kijelentkezsi parancsfjlja talakts alatt ll, amelynek clja, hogy a bejelentkezsi adatok m egrzsre stik helyett munkameneteket hasznljon. Ptold a hinyz kdokat a kijelentkezsi parancsfjl m unkam enetestsre", s jegyezd fel, hogy az egyes kdr szek a kijelentkezsi folyamat melyik lpsnek felelnek meg!

<?php
Ha a f e l h a s z n l b e v an j e l e n t k e z v e ,
s e s s io n _ s ta rt(); if ( ) {

a k il p te t s h e z

t r lj k

a m u nkam eneti v l t o z k a t

// A m unkam eneti

v lto z k

t r l s e

a $_SESSIO N s z u p e r g l o b l i s r e s

t m b re l l t s v a l

// A m u n k am en et-s ti t r l s e a l e j r a t i i f (i s s e t ($_C O K IE [session_name( ) ] ) ) { } // A munkamenet m eg sem m istse

id egy r v a l

(3 6 0 0 )

k o r b b ra l l t s v a l ,

// V i s s z a i r n y t s

a k e z d la p r a

$home_url = * h t t p : / / 1 . $_SERVER[ f HTTP_HOST1] . dirname ($ SERVER[ ' PHPJ3ELF ] ) / i n d e x . p h p 1; h e a d e r ( 1L o c a t i o n : * . $ h o m e _ u r l ) ;

?>

most itt vagy

393

a munkamenetestett" logout.php parancsfjl

ezd ki a ceruzd I Megolds

o
()

A Mismatch alkalmazs kijelentkezsi parancsfjlja talakts alatt ll, amelynek clja, hogy a bejelentkezsi adatok megrzsre stik helyett munkameneteket hasznljon. Ptold a hinyz k dokat a kijelentkezsi parancsfjl munkamenetestsre", s je gyezd fel, hogy az egyes kdrszek a kijelentkezsi folyamat melyik lpsnek felelnek meg!

A munkameneti vltozk trlse.

( j T ) Annak ellenrzse, hogy ltezik-e munkamenet-sti, s ha igen, a sti trlse. A munkamenet megsemmistse. A felhasznl visszairnytsa a kezdlapra. Mg ha kijelentkezsrl van is sz, elszr el kell in dtani a munkamenetet ahhoz, hogy hozzfrjnk
<?php
/

a munkameneti vltozkhoz.
^ ----------- A

/ / I f th e / i s e r i s l o g g e d irt, d e l e t e t h e s e s s i o n v a r s t o l o g them out se ssio n ,sta rt ();

bejelentkezs llapott most egy sti helyett egy munkameneti vltozval ellenrizzk.

i f ( is s c t/^ S E S S IO K C W v ja ']) / SESSION = avray 0 ; (T )

) t

// D e l e t e t h e s e s s i o n v a r s by c l e a r i n g t h e $_SESSION a r r a y

--------- -

A munkameneti va'ltozk trlshez egy res tmbt kell rendelnnk a $_$E $$I0N szupergloblishoz.

// D e l e t e t h e s e s s i o n c o o k i e by s e t t i n g i t s e x p i r a t i o n t o an hour ago (3 6 0 0 ) i f ( i s s e t . ($_COOKIE [ s e s s i o n name ( ) ] ) ) {

setookie(sessio)\_j'\ameO;

ti*eO - IhOO),

\2j
^ ---------------- Ha ltezik munkamenet-sti, trljk azt 3 le
jrati idejnek egy rval korbbra lltsval.

j
if D e s t r o y t h e s e s s i o n

sessiott_destvoyw,

j.

/>

-------- -- A munkamenetet a beptett session_destroy() fggvny meg hvsval semmistjk meg.

// R e d ir e c t . t o t h e home page $home_url = ' h t t p : / / ' . 3 SERVER[ f HTTP_HOST ] . dirnam e ($_SERVER[' PHP_SELFt ] ) 1/ i n d e x . p h p ' ;

h e a d e r ( *L c c a t i o n : * . $ h o m e _ u r l) ;

?>

394

7. fejezet

Szemlyre szabott weba/ka/mazsok ptse

Vltoztass meg!
A stikrl munkamenetekre trtn tlls nem csak a kijelentkezsi parancsfjlt rinti. Prostsd ssze a Mismatch alkalmazs egyb rszeit a munkamenetek tmogatshoz szksges mdostsokkal!

appvars.php

iU

connectvars.php

Kincs vltozs, mivel ez a parancsfjl nem fgg kz vetlenl a bejelentkezsi adatok maradandsgtl. A felhasznl m egjeg y zsh ez egy m unkam enetre van szksg. A m unkam enet elindtshoz m eg kell
hvni a s e s s i o n _ s t a r t () fggvnyt, majd a $_C 00K lE -ra m utat hivatkozsokat $_SESSlO N -re kell cserlni. signup.php

login, php

A navigcis m en szablyozsh oz eg y m u nkam e netre van szksg. A m u n kam en et elindtshoz m eg


kell hvni a s e s s i o n _ s t a r t () fggvnyt, majd a $_COOKiE-ra m utat hivatkozsokat $_SESSiO N -re kell cserlni.

index.php

viewprofile.php

editprofile.php

most itt vagy

395

Vltoztass m eg! - megolds

Vltoztass meg!
Megolds
A stikrl munkamenetekre trtn tlls nem csak a kijelentkezsi parancsfjlt rinti. Prostsd ssze a Mismatch alkalmazs egyb rszeit a munkamenetek tmogatshoz szksges mdostsokkal!

appvars.php

Nincs vltozs, mivel ez a parancsfjl nem fgg kz vetlenl a bejelentkezsi adatok maradandsgtl. A felhasznl m eg jeg y zsh ez egy m unkam enetre van szksg. A m unkam enet elindtshoz m eg kell hvni a s e s s i o n _ s t a r t () fggvnyt, majd
a $_COOKlE-ra m utat hivatkozsokat $_SESSlO N -re kell cserlni.

A navigcis m en szablyozsh oz egy m u nkam e netre van szksg. A m u nkam enet elindtshoz meg kell hvni a s e s s io n o s t a r t () fggvnyt, majd
a $_COOKlE-ra m utat hivatkozsokat $_SESSlO N -re kell cserlni.

index.php

edltprofile.php

396 7. fejezet

Szemlyre szabott weba/ka/mazsok ptse

jratltve
A HTTP-hitelests knyelmes mdja annak, hogy korltozzuk az egyes oldalak elrst, de nem ad megfelelen mdot a felhasznl kilptetsre, amikor a felhasznl tvozni szeretne az oldalrl. A stik lehetv teszik, hogy kis adatdarabokat - pldul egy felhasznl bejelentkezsi adatait troljunk az gyflen (a w ebbngszben). Minden stinek van lejrati dtuma, ami lehet egy idpont a tvoli jvben, de lehet olyan k zel is, mint a bngsz m unkamenetnek vge. Alihoz, hogy trljnk egy stit, csak egy mlt beli idpontra kell lltani a lejratt. A munkamenetek a stikhez hasonl trolsi le hetsget nyjtanak, de a kiszolgln, ezrt nem vonatkoznak rjuk a bngsz korltozsai, pl dul a stik letiltsa. A munkameneti vltozk lettartama korltozott, s a munkamenet befejeztvel (pldul amikor bezrjk a bngszt) mindig megsemmislnek.

Nincsenek

hlye krdsek
A session_start () fggvnyt egy csom helyen meghvjuk, mg az utn is, hogy a munkamenet elin dult. Minden session_start ( ) hvssal j munkamenet indul el? ! Nem. A s e s s i o n _ s t a r t () fggvny nem csak j munkame netek elindtsra val - meglev mun kamenetekbe is belenylhatunk vele. Te ht amikor a parancsfjl meghvja ^ s e s s i o n _ s t a r t () -ot, a fggvny egy munkamenet-azonostt keresve el szr azt nzi meg, hogy ltezik-e mr egy' munkamenet. Ha nem tall munka menetet, akkor j munkamenet-azonos tt s munkamenetet hoz ltre. A s e s s i o n _ s t a r t () ksbbi hvsai ugyanabbl az alkalmazsbl felismerik a ltez munkamenetet, s j ltrehozsa helyett azt hasznljk.

Hogyan troldik a munkamenet-azonost? A munkamenetek erre hasznlnak nha stiket? ! Igen. Br a munkamenet-adatok a kiszolgln troldnak, s ezrt - a bngsz hatkrn kvl esve - biz tonsgosabbak, attl mg a parancsfj loknak valahogyan tudomst kell szerez nik a munkamenet-adatokrl. Erre val a munkamenet-azonost, amely egyedileg azonostja a munkamenetet s a hozz kapcsold adatokat. Ennek az azonostnak valahogy meg

! Mg mindig furcsa, hogy a munkame netek stiket hasznlhatnak, amikor az egszben az a lnyeg, hogy a mun kamenetek elvileg jobbak, m int a stik. M ost akkor mi a helyzet? A munkameneteknek bizonyos helyzetekben megvannak az el nyeik a stikkel szemben, de nem felttle nl vagy-vagy kapcsolatban llnak egy I C l Ha a munkamenetek is fggnek mssal. A munkamenetek ktsgtelen el a stiktl, akkor m irt rdemes munka- nye. hogy nem az gyflen, hanem a ki meneteket hasznlni stik helyett? szolgln troldnak, ami megbzhatbb A munkamenetek nem teljesen s biztonsgosabb teszi ket, ezri ha stifggk. Fontos, hogy megrtsd, maradandan kell trolnod rzkeny ada hogy a stik nem szksgesek a munka tokat, egy munkameneti vltoz nagyobb menet-azonostk megrzshez tbb biztonsgot nyjt egy stinl. A munkame parancsfjlon keresztl, csupn optimlis netek ezen kvl nagyobb adatmennyisg megoldst nyjtanak. Ha a stiket letilt trolsra kpesek, mint a stik. A munka jk, a munkamenet-azonost egy URLmenetek hasznlatnak teht vilgos el en keresztl addik t a parancsfjlok nyei vannak, fggetlenl attl, hogy' tkztt, hasonlan ahhoz, ahogy az ada maszkodhatunk-e stikre. A Mismatch al tok egy GET-krelemben. A munkame kalmazsban a munkamenetek knyelmes netek teht tkletesen mkdnek stik kiszolgloldali megoldst adnak a beje nlkl is. Azt, hogy a munkamenetek lentkezsi adatok trolsra. Azoknak pontosan hogyan reaglnak a stik letil a felhasznlknak, akiknl a stik enged tsra, a php. i n i belltfjl szablyoz lyezettek, a munkamenetek nagyobb biz tonsgot s megbzhatsgot nyjtanak, za a webkiszolgln, mikzben tovbbra is stikre tmaszkod a s e s s io n .u s e _ c o o k ie s , nak az optimlis trolshoz, mg azoknak a s e s s i o n . u s e _ o n ly _ c o o k ie s s a s e s s i o n . u s e _ t r a n s _ s i bellt a felhasznlknak az esetben, akiknl a stik le vannak tiltva, a munkamenetek sokon keresztl. egy URL-en keresztl, a stiket teljesen ki kerlve adjk t a munkamenet-azonos tt, de mkdkpesek maradnak.

kell rzdnie az gyflen ahhoz, hogy tbb oldal tartozhasson ugyanahhoz a munka menethez. A munkamenet-azo nost maradandsgnak biztostsra az egyik mdszer egy sti hasznlata: az azonost a stiben troldik, s a pa rancsfjlok ennek felliasznlsval kap csoldhatnak az adott munkamenethez.

most itt vagy

397

ttrs st/krl munkamenetekre

A munkamenetekre val ttrs teljess ttele


Br a M ism atch alkalm azsnak azok a rszei, am elyeket rintenek a m unka m enetek, m s-m s clra hasznljk azokat, a parancsfjlok vgered m nyben hasonl m dostsokat ignyelnek ahhoz, hogy stikrl m unkam enetekre trjnk t. Elszr is, m indegyikknek m eg kell hvnia a s e s s i o n _ s t a r t () fggvnyt a m unkam enetek elindtshoz. Ezen tl azonban m inden m d o sts abbl ll, hogy a $_C 00K IE helyen a $_SESSIO N szupergloblist kell hasznlni, am ely a m unkam eneti vltozk trolsn felel.

Minden munkamenetekre tmaszkod parancsfjl egy session__start() hvssal kezddik, amely elindtja a munkamenetet.

//If if

the

I n . try to log t h e in

(!isset(f$ S E S S I O N [*user_J.di > < j)' if (isset | 5UUUIXL. h i I

/ Connect to the database /


$dbc = mysgli. connect (DB_HOST, DB_USER, DB.MSSWORD, DB_NAME>;
// G r a b r hP- user-eritered l o g - i n d a t a $ u s e r u s e r n a m e = m y s q l i real e s c a p e e s t r i n g ( $ d b c , Ilu, t r i m <SJK>ST username

$userjpassword - ^sqUlreallescap^stringtSdbc, trim(S^-OffTI*password)>> I


if (Ie m p t y ( $ u s e r _ u s e r n a m e ) Jempty($user_password>) // L o o k u p t h e u s e r n a m e arid p a s s w o r d i n t h e d a t a b a s e S q u e r y - " S E L E C T usftr_idr usernan-.e F R O M m i s m a t c h _ u s e r W H E R E u s e r n a m e " p a s s w o r d = S H A l S u s e r ^ p a s s w o r d }"; S d a t i = m y s q l j _ q u e r y ( $ d b c , Squery);

dirname ($ S E R V E R 'P H P _ S E L F ' J) . '/index.p h p

login.php

A bejelentkezsi parancsfjl munkamenetek se gtsgvel emlkszik a felhasznl azonostj ra s nevre, s ehhez a $_$E $$I0N szuper globlisra tmaszkodik a $_C00KIE helyett.

398 7. fejezet

Szemlyre szabott webalkalmazsok ptse

else { echo ' &# 1 0 0 8 4 echo ' $ # 1 0 0 8 4

A Mismatch alkalmazs kezdlapja a $_S E $$I0N szupergloblist hasznlja


< a h r e f " l o g i n . p h p " > L o g i r x / a x b r /> < a href*=Hs i g n u p . p h p " > S i g n U p < / a > ' ;

a $_C 00K IE helyett a bejelentkezsi adatok elrsre, amikor ltrehozza a ment, s eldnti, hogy kell-e hivatta zsokat biztostania a legutbb beje lentkezett tagok" profiljaihoz.

// Loop through the array of user data, formatting it as HTML echo '<h4 >Latest members:</h4 > ; echo '<table>'; while (Stow - mysqli_retch_array(Sdataj) ( if (1 sse^T* SESSIONf 1usei_ld * j {

1
\

echo r >tq^g -< - * i . e.php?user_id- 1 . ?row' 'usei_id' ? . SrowT 'first name'] . *</a></idx/tr>' ;

eise I echo '<td>' . $row['first_name,l . '</cdx/tr>' ;

A bejelentkez oldalhoz s s kezdlaphoz hasonlan e Edit Profile parancsfjl **< mr a $_SESSI0N 5 bot hasznlja a bejeintkezsi adatok elrs*z a $_C 00KIE helyett.
$ SESSION ;'username * . Ls logged in before going any
luiu

index.php

V a { href A

"login.php**>log in</a> 1 0 access

Sr it t nem mutatjuk be, a View Profile parancsfjl lnyegben ugyangy haszslja a munkameneteket, mint az Edit Profile oldal.
mysqli_query{Sdtoc, Squery);
last n a m e = 1$ l a s t _ n a m e , . state = 'Sstate' M .

editprofile.php

viewprofile.php m ost itt vagy

399

kandall melletti csevely a sti s a munkameneti vltoz kztt

Kandall melletti csevely


Ma esti vendgeink, Sti s Munkameneti vltoz egymsnak feszlnek, hogy kiderljn, kinek jobb a memrija

Sti:
sszedugtuk a fejnket itt a tbbi stivel, hogy pontosan mi is folyik a kiszolgln. Az a pletyka terjed, hogy megprblsz betrni a mi terletnk re, s ellopni az adattrolsi munknkat. Mi igaz ebbl?

Munkameneti vltoz:

Ugyan mr, a lops nagyon ers kifejezs. De az igazsg az, hogy nha sszerbb a kiszolgln trolni az adatokat. Nekem aztn nem tnik sszernek. A bng sz tkletes hely az adatok trolsra, s n vagyok a m egfelel szemly a feladatra. s ha a felhasznl letilt tged? Az teljesen ms krds. Ha a felhasznl gy' dnt, hogy letilt engem, akkor biztos nem kell semmilyen adatot trolnia. Ez nem igaz. A felhasznl gyakran azt se tudja, hogy a webalkalmazs adatokat trol, mert sok esetben olyan sznfalak mgtti adatokrl van sz, mint a felhasznlnv. Mrpedig ha te nem vagy elrhet, semmilyen adat nem lesz a kezben. Felttelezem, hogy szerinted erre az a megol ds, hogy troljuk az adatokat a kiszolgln. Milyen knyelmes. Pontosan. s az a legjobb az egszben, hogy a felhaszn l semmit sem tud letiltani a kiszolgln, ezrt nem kell aggdni amiatt, hogy az adatok egyltaln trolhatk-e. J l van, Einsteinkm. Ha ezt ilyen jl kitalltad, akkor mirt kell nha mgis engem hasznlnod, hogy a drgaltos azonostdat trolhasd a bn gszben? , errl a legtbben nem is tudnak, gyhogy ebbe ne menjnk bele. Majd megbeszljk msoron kvl. A l nyeg az, hogy n mindig kznl vagyok, s kszen llok az adatok trolsra a kiszolgln.

400 7. fejezet

Szemlyre szabott webalkalmazsok ptse

Sti:
Ugyan, valld be, hogy nagyon is szksged van rm!

M u n k a m e n e ti vltoz:

Na j, elismerem, hogy idrl idre rd tmaszkodom, ha tbb oldalon t meg kell jegyeznem valamit. De ha kell, el vagyok nlkled is. Persze, tudom, hogy elvagy - ha minden ktl sza kad. Szerintem a szved mlyn kedvelsz engem. Nzd, nekem nincs veled semmilyen problmm, csak azt sze retnm, ha kicsit biztonsgosabb lennl. Meg ott van az a m retkorlt. Tudod, nem minden maradand adat falatnyi. Szval errl van sz: azrt kezdesz ki velem, mert kisebb vagyok? Lehet, hogy nem tudok annyi trolni, mint te, s beismerem, hogy az. hogy az gyflen lakom, kevsb biztonsgoss tesz, de az biztos, hogy gy izgalmasabb! s nekem van valamim, amirl te csak lmodozhatsz... Igen? s mi lenne az? Nos, a trolhelynek, meg a biztonsgnak, ami re annyira bszke vagy. ra van - a rvidebb let! Kr, hogy nekem kell elmondanom neked, de az egsz lted egyetlen munkamenetre korl tozdik a bngszben. A neved is innen kaptad. gy rted, te tovbb lhetsz egyetlen munkamenetnl? Ez meg hogyan lehetsges? Egyszer. n nem pusztulok el egy munkamenet tel egytt, csak lejrati idm van. Vagyis bellthat nak gy is, hogy hossz, teljes letet ljek, s ne legyek kiszolgltatva egy rlten kattintgat webszrfs knye-kedvnek, aki azt hiszi, j mka llandan megnyitni s tezrni a bngszt.
*

O! Csods rzs lehet a halhatatlansgot megtapasztalni! Az n egyetlen remnyem az, hogy egy trehny programoz vletle nl elfelejt megsemmisteni, amikor bezr egy munkamene tet. . .de a bngsz akkor is vgez velem, amikor bezrjk. Ugyanezek a programozk sajnos az n lejrati idmet gyakran olyan rvidre lltjk, hogy nem lhetek olyan hossz letet, amilyet megrdemel nk. gy rtem, n ... H, ott vagy mg? Hha, ez a lejrat tnyleg elg kemny.
most itt vagy >

401

Teszteld a munkamenetesitett" mismatch alkalmazst!

Tesztt
Mdostsd gy a Mismatch alkalmazst, hogy stik helyett munkameneteket hasznljon!
Mdostsd a Mismatch alkalmazs parancsfjljait, hogy stik helyett munkameneteket hasznl va tegyk lehetv a bejelentkezsi adatok maradand tarolst (vagy tltsd le a parancsfjlo kat a Head First Labs webhelyrl, a w w w . h e a d f i r s t l a b s . c o m / b o o k s / h f p h p cmrl). A mun kamenetek hasznlathoz az index.php, a login.php, a logout.php, az e d i t p r o f i l e . php s a v i ewprof ile.php parancsfjlt is mdostani kell: elssorban el kell indtani a munkame netet a session_start () fggvny meghvsval, s a $_C00KIE szupergloblisra val hivat kozsokat t kell lltani a $ _SESSI0N hasznlatra. Tltsd fel az sszes parancsfjlt a webkiszolgldra, s nyisd meg a Mismatch alkalmazs fol dalt (index.php) egy w ebbngszben. Jelentkezz be, s gyzdj meg rla, hogy minden ugyangy mkdik, mint korbban. Ha a stiket nem tiltottad le, semmilyen klnbsget nem szabad, hogy tapasztalj.
-ft
&

.... &

- Where opposites attract!

Mismatch - Where opposites attract!

Nagyon klassz! ^ J<5, hogy a s tik bekapcsolsa nlkl is be le het jelentkezni!


[

'Lfi& lc
M ayn - -9Jg isrn .
Mismatch * Log In

A munkameneteknek kszn heten azok a felhasznlk it bejelentkezhetnek, s elrhe tik a szemlyes profiljukat, akiknl a stik hasznlata nem engedlyezett.
Misiruitch - ttijr

Johac

Mismatch - Edit ProOle


You a re lo g g e d in as jasonf.

Dienire

Pcrsonai Inioiroacan
First name:
J&son

,isor

Last name: nirmow'

Gender:
B ir t b d a t t : '- ^ - 0 0 - 2 4

City: Holk/*rood
S ta te :
ca

______

Picture:

Dw R |* ^ r,Ie > elcite<s

Szemlyre szabott weba/kalmazsok ptse

Vigyzat!

A sti nlkli munkamenetek nem biztos, hogy mkdni fognak, ha a php.ini fjlban tallhat PHP-belltsok nem megfelelek a kiszolgln.

Alihoz., hogy a munkamenetek akkor is mkdjenek, ha a stiket letiltottk, valamilyen ms mdszerre van szksg a munkamenet-azonost tadsra a klnbz oldalak kztt. Ez a mdszer abbl ll, hogy a munkamenet-azonostt hozzfzzk az egyes oldalak URL-jhez, ami automatikusan trtnik, ha a s e s s i o n .u s e _ t r a n s _ i d bellts rtke 1 (true) a kiszolgl php. i n i fjljban. Ha nincs r mdod, hogy mdostsd ezt a fjlt a webkiszolgln, s a stik le vannak tiltva, akkor sajt kezleg kell hozzfznd a munkamenet azonostt az oldalak URL-jhez egy az albbihoz hasonl kddal:
<a hre-=V i e w p r o f i l e . p h p ? < ? p h p ech o S D ; ?>* >view your p r o f i l e < / a >

Az SD szupergloblis trolja a munkamenet-azonostt, amelyet az URL-en keresztl adunk t, Hogy a View Profile oldal tudomst szerezzen a munkamenetrl.

most itt vagy

403

Mirt automatikus a kijelentkezs?

A felhasznlk gy rzik, kvl tgasabb


Annak ellenre, hogy a stikhez kpest az j, munkamenetekkel ve zrelt Mismatch alkalmazs nmileg jobb, valami nem stimmel vele. Tbb felhasznl is arrl szmol be, hogy az alkalmazs kilpteti, pedig nem is kattintott a Lg Out hivatkozsra. Az alkalmazs gy mr nem igazn tnik szemlyre szabottnak, ami komoly problma.

tgasabb!
A frusztrlt felhasz nlk sohasem sz
m tanak j jelnek.

H! Az elbb mg be voltunk jelentkezve, m o s t meg hirtelen ki le tt n k lptetvel Ml folyik it t?

Ez nem az az zenet, amit a Mismatch felhasznlinak kldeni szeretnnk.

s *

M w tsn tch
Mismatch - Wbr* oppot.

A kezdlap gy jelenik meg a bejegyzett felhasz na'lk szmra, mintha I


fi Jban

togatk lennnek, pedig nem is jelentkeztek ki.

A felhasznlkat a Mismatch alkalm a-^ zs anlkl lpteti ki, hogy a Lg Out hivatkozsra kattintannak.
Dicjdrc

4 0 4 7. fejezet

Szemlyre szabott webalkalmazsok ptse

Agytorna

----------

Szerinted mi okozza a felhasznlk automatikus kilptetst a Mismatch alkalmazsbl? k csinltak valamit vletlenl?

most itt vagy 4 0 5

a stik s a munkamenetek lettartama


Fggetlenl attl, hogy

A munkamenetek rvid letek...


A Mismatch alkalmazsbl trtn automatikus kilptetsnek a munkamenetek korl tozott lettartamhoz van kze. Ha mg emlkszel r, a munkamenetek csak annyi ide ig lnek, ameddig a bngsz aktulis pldnya, vagyis minden munkameneti vltoz megsemmisl, amint a felhasznl bezrja a bngszt. Ms szavak kal, a bngsz bezrsa a felhasznl kilptetst eredmnyezi, akr tetszik neki, akr nem. Ez nem csak knyelmetlen, hanem egy kiss zavar is, hiszen az alkalmazs lehetv teszi a kijelentkezst. A felhasznlk teht azt felttelezhetik, hogy addig nem jelentkeznek ki az alkalmazsbl, amg a Lg Out hivatkozsra nem kattintanak.

sfiket vagy munkamene teket hasznlunk, a beje lentkezs az, ami a mar*dandsagof biztostja.

A bejelentkezs munkamenetek hasznlata esetn kt munkameneti vlto z ltrehozst eredmnyezi.

r I* * * -----------------

1 1

Jl

Ha a munkameneti vlto
u sernam e s idneyk

zk megsemmisltek, az alkalmazs kilpteti a felhasznlt... akr

A felhasznl szem lyre a munkameneti vltozk segtsgvel emlkeznk.


US

tetszik, akr nem.


iin u n *!

A munkameneti vltozk a munkamenettel egytt megsemmislnek, amikor bezrjk a bngszt.

C M M

Amikor a felhasznl bezrja a bngszt, nem biztos, hogy tudja, hogy ezzel ki is jelentkezik

I > \

Egy munkamenetet megsemmisthetsz, amikor vgeztl vele, de a bngsz pldny letn tl nem hosszabthatod meg a ltezst. A munkamenetek te ht rvidebb tv trolsi megoldst nyjtanak, mint a stik, hiszen a stiknek van lejrati idejk, ami rkkal, napokkal, hnapokkal, st akr vekkel ksbbi idpontra is llthat. Ez azt jelenti, hogy a munkamenetek alacso nyabb rendek a stiknl? Egyltaln nem. Csak annyit jelent, hogy munka menetekkel problms olyan informcikra - pldul a bejelentkezsi ada tokra - emlkezni, amelyeknek tl kellene lnik a bngszpldnyt.

A munkameneti vltozk megsemmislnek, ami kor a felhasznl vget vet a munkamenetnek a bngsz bezrsval.

406 7. fejezet

Szemlyre szabott webalkalmazsok ptse

.. | |

. . .

|>

Tan nem rkk, de elg sokig ahhoz,

d 6 3 S U t l K r k k T r t n l f i k *

tlljenek egy muRhmenefet.

A munkameneti vltozktl eltren a stik lettartama nem ktdik a bngszpldny hoz. A stik teht tovbb lhetnek, legalbbis addig, amg el nem rkezik a lejrati idejk. A gond csak az, hogy a felhasznlk egyetlen egyszer bngszbellts segtsgvel trl hetik a szmtgpkn trolt sszes stit, ezrt nem igazn ^ tmaszkodhatsz azok maradandsgra - a stiket vgs .rca: UAv*ni>t soron csak ideiglenes adatok trolsra szntk.

A munkamenetekhez ha sonlan a stik is beje lentkezskor jnnek ltre.


I
.

*'<

io I
9
.8 2

ii r

3
6 . .5 i "i.
4

A stik lettartamt A stik csak akkor semmislnek meg, amikor le j rn a k .^ a lejrati dtumuk/ide jk hatrozza meg.

A stik akkor semmislnek meg, amikor lejrnak, teht az lettartamuk hosszabb, mint a munkameneti vltozk.
most itt vagy

407

a stik s a munkamenetek egyttes hasznlata

5zva\ ssze r b b lenne m unka m e n e te k e t s s tik e t h a szn ln i, s a s tik segtennek h o s s za b b ideig bejelentkezve t a r t a n i a fe lh a s z n l k a t? Ez m kdne azoknl a fe lh a s z n l kn l, akiknl a s tik e n g e d lye ze tte k.

Legalbbis addij. - " ' ke"


i ebiben
a munkamenetek nll hasznlatt indokolna.

b'I,0 *!
j

Igen. Nincs semmi rossz abban, ha a munkamenetek s a stik egyedi ernyeit egyarnt kihasznlod, hogy rugalmasabb tedd a bejelentke zst a Mismatch alkalmazsba.
Valjban gy mg knyelm esebb is. A munkamenetek a rvid tv maradandsgot jobban biztostjk, mivel szlesebb krben tmogatottak, s a bngsz nem korltozza a hasznlatukat, mg a stik lehetv teszik, hogy hosszabb ideig megrizd a bejelentkezsi adatokat. Termszetesen nem mindenki fog rszeslni a stik ldsaibl, de ppen elegen ahhoz, hogy szmtson. Ha a felhasznli lmnyen a felhasznli krd jelents rsze szmra javthatsz anlkl, hogy ez msokra kros hatssal lenne, csak nyerhetsz az gyn.

408 7. fejezet

Szemlyre szabott webalkalmazsok ptse

Munkamenetek + stik = A legmaradandbb bejelentkezsi adatok


A bejelentkezsi adatok tkletes maradandsgnak biztostshoz kreatvabbnak kell lenned, s kombinlnod kell mindazt, amit ebben a fejezetben tanultl, hogy egyarnt kihasznld a slik s a munkamenetek elnyeit. Ehhez t kell dolgoznod a Mismatch alkalmazst, hogy a felhasznlk bejelentkezsi adatainak maradandsgt rvid s hossz tvon is kitnen biztostsa

A bngsz' bezrsa a munkameneti


Am ikor a felhasznl legkze lebb megnyitja a Mismatch o l dalt, a stik gondoskodnak a munkameneti vltozk jbli ltrehozsrl - voil!

vltozk megsemmistett eredm nyezi, a stikf azonban nem.

A felhasznl bezrja a v/ebbongszol, s ezzel megli a munka menetet.

A stik lejrati idejt


3 0 nappal az els' beje lentkezs utnra lltjuk

A munkameneti vltozk visszalltshoz a stikben trolt be jelentkezsi adatokat hasznljuk.

A felhasznlk nem maradnak rkk bejelentkez ve, mert a stik 30 nap mlva megsemmislnek.

most itt vagy 409

nem hlye krdsek stikrl s munkamenetekrl

Nincsenek

hlye krdsek
! Szval a munkamenetek s a stik kztt aszerint rdemes dnteni, hogy rvid vagy hossz tv maradandsgra van szksgnk?
! Nem. Vletlenl ez volt a stratgia, ami a Mismatch alkalmazs megtervezsben segtett minket, de minden alkalmazs klnbz, s a munkameneteknek, illetve a stiknek ms jellemzik is vannak, amelyeket gyakran figyelembe kell venni. A m unkam enetekben trolt adatok pldul nagyobb bizton sgban vannak, mint a stikben troltak. Ezrt mg akkor is, ha a stik engedlyezettek, s kizrlag a munkamenet-azonost trolsra hasznljuk ket, a tnyleges adatok trolsa a munkamenetekben biztonsgosabb, mintha kzvetlenl stikben raktroznnk el ket. Ennek az az oka, hogy a munka menet-adatok a kiszolgln troldnak, ami nagyon megnehezti a jogosulatlan felhasznlknak, hogy hozzjuk frjenek. Teht ha olyan adatokat kell kezelnnk, amelyeknek biztonsgban kell lennik, a munkameneteket clszer elnyben rszestennk a stikkel szemben.

I Mi a helyzet az adatok mretvel? A mret szerepet jtszik?


! Igen, az adatok mrete is szmt. A munkamenetek nagyobb mennyisg adatot kpesek trolni, mint a stik, ami egy jabb rv a munkamenetek hasznlata mellett, ha nhny egyszer karakterlncnl tbb adatot kell trolnunk. Termszetesen a nagyobb adatmennyisgek trolsra egy MySQL-adatbzis mg jobb, ezrt ne nagyon galopprozd el magad akkor sem. amikor munkameneteket hasznlsz.

! Akkor m irt vlasszak munkameneteket vagy stiket egy MySQL-adatbzis helyett?


! A knyelem miatt. Az adatok trolsa egy adatbzisban sokkal tbb erfesztst ignyel, s azt se fe lejtsd el, hogy az adatbzisokat elssorban maradand adatok trolsra szntk. Ha a nagyobb kpet nzed, a bejelentkezsi adatok nem igazn szmtanak maradandnak. Stiket s munkameneteket azrt clszer hasznlni, mert alkalmasabbak az olyan adatokhoz, amelyekre csak egy ideig kell eml kezni, s aztn eldobhatok.

410 7. fejezet

Szemlyre szabott weba/ka/mazsok ptse

A Mismatch alkalmazst tterveztk, hogy munkameneteket s stiket is hasznljon a felhasznlk bejelentkezsi adatainak maradand t rolshoz. A gond csak az, hogy a kd egyes rszei hinyoznak. Ptold a hinyz kdokat a htmgnesek segtsgvel!
i f (mysqli_num_rows ($ d a ta ) = = 1 ) { // A b e je l e n t k e z s i adatok rendben vannak. gy a telhasznl a z o n o s t j t s nevt tartalmaz // munkameneti vltozk (s s tik ) b e l l t h a t k , s a felhasznl v i s s z a ir n y t h a t a kezdlapra $row *- m y s q l i _ f e t c h _ a r r a y ( $ d a t a ) ; L' u s e r i d ' l ^ $ro w [ ' u s e r _ i d ' ] ; f ' username ' ] $rcw [ 'u sernam e ' ] ; = s e t c o o k i e ( ' u s e r _ i d ' , $rcw [ ' u s e r _ i a ' ] , t i m e 0 + (60 * 60 * 24 * 3 0 ) ) ; // 30 nap mlva l e j r s e t c o o k i e ( ' username * , $ row [ ' u se rn a m e ' ] , t i m e O + (60 * 60 * 24 * 3 0 ) ) ; // 30 nap mlva l e j r $home u r l ' h t t p : //' . $_SERVERf' HTTP _HQST' j . dirnam e ($ _SERVER[ ' PHP_SELF' 1) . ' / i n d e x . p h p 1; h e a d e r ( 'L o c a t i o n : ' . $h o m e_u rl);

PHP- & MySQL-mgnesek

<?php s ssio V sta rt^ 0 ^ i f ( i s s e t ( ........................... jelenLkeZVe' a E l p t s h e z t r lj k a munkameneti vltozkat (.' u s e r _ i d ' ]) ) {

login.php

// A munkameneti vltozk t r l s e a $_SESSION tmb k i r t s v e l = a r r a y () ; // A munkamenet- s t i t r l s e a l e j r a t i id egy rval (3600) korbbra l l t s v a l

if (is s e t(

[s e s s io n name( ) ] ) ) {

s e tc o o k ie (session_nam e () , " , time() - 3 6 0 0 ) ;

logout, php

// A munkamenet megsemmistse

s e s s i o n _ d e s t r o y () ;

}
H

k o ^ r L 1 It j t S neVt t r 16 S tik rlSe a l e j r a t i id0 s e t c o o k i e ( ' u s e r _ i d *, " , t i m e O - 3 6 0 0 ) ; s e t c o o k i e ( 'u s e r n a m e ', " , tim e() - 3 6 0 0 );

* * *

(3600,

<?php s e s s io n _ s ta r t();

// H a munkameneli vltozk nincsenek b e l l t v a , megprbljuk b e l l t a n i ket egy s tiv e l a if (!isse t ( if (isse t ( [ ' u s e r _ i d 1] ) ) t

PHP-mgnesek - megolds

r v ia c jr ie s e K A Mismatch alkalmazst tterveztk, hogy munkameneteket s stiket is hasznljon a felhasznlk bejelentkezsi adatainak maradand trolshoz. A gond csak az, hogy a kd egyes rszei hinyoznak. Ptold a hinyz kdokat a htmgnesek segtsgvel!

u s e r i s l o g g e d i n , d e l e t e Che s e s s i o n v a r s t o Log them out i o n s c a r t () ;

e x p i r a t i o n t o an hour ago (3600)

s e t c o o k i e ( s e s s i o n name()

t i m e () - 3600)

A kijelentkezs most mr egyarnt ignyli a munkamenet-sfi s az j bejelentkezsi s fik trlsi.

logout.php

username c o o k i e s by s e r t i n timeO - 3600) ; ^ , t i me O - 3 6 0 0 ) ; <?php s e s s io n _ s t a r t ();

i o n s t o an hour ago ( 3600)

Ha a felhasznl nem a munka

meneten keresztl jelentkezett // I f t h e s e s s i o n v a r s a r e n ' L s e t , t r y t o s e t them with a c o o k i e J be, megnzzk, hogy a stik be vannak-e lltva.

1 |[ * jsern am e' ] ) ) !

Ugyanennek a sti-, illetve munkm A munkameneti vltozk belltsa a stik segtsgvel net-kdnak kell az edtprofile.pHp s a viewproftle.php fjlba is kerlnie.

Szemlyre szabott webalkalmazsok ptse

Mdostsd a Mismatch alkalmazst gy, hogy munkameneteket s stiket is hasznljon!


Mdostsd a Mismatch alkalmazs parancsfjljait, hogy munkameneteket s stiket egyarnt hasznlva tegyk lehetv a bejelentkezsi adatok maradand trolst (vagy tltsd le a pa rancsfjlokat a Head First Labs webhelyrl, a w w w .h ead firstlab s.co m / b o o k s/ h fp h p cm rl). Ehhez az in d e x , php, a lo g in .p h p , a lo g o u t.p h p , az e d i t p r o f i l e .p h p s a v ie w p r o f ile .p h p parancsfjlt kell mdostani. Tltsd fel a parancsfjlokat a webkiszolgldra, s nyisd meg a Mismatch alkalmazs folda lt (in d e x .p h p ) egy w ebbngszben. Jelentkezz be, majd zrd be a bngszt, aminek a hatsra a munkameneti vltozk megsemmislnek. Nyisd meg jra a foldalt, s ellen rizd, hogy mg mindig be vagy-e jelentkezve - ezt a stik teszik lehetv, mivel a stik tl lik a bngsz adott munkamenett.

A stik kombinlsa a munkamenetekkel


lla ti A M ism atch a lk a lm a z s X . m o s t m r emlkezik rnk, ^ fggetlenl a t t l hogy b<5zrtuk-e a bngeznket.
^
q

hosszabb tv maradandsgot biztosit ---------- .. ) ^ fv maradandsg mellett,


a K aiU l u v i u lV
o * - ---------------

amit a munkamenetek mr lehetv tettek.

A legtbb felhasznl
boldog, hogy a munkame netek s a stik egyttes hasznlatnak ksznhe ten az alkalmazs job ban emlkszik rjuk.

A stik hiba tmogatjk


a munkameneteket, ez nem se gt azokon a felhasznlkon, akiknl a stik le vannak tiltva - de csak ennyit tehetnk.

most itt vagy > 413

PHP & M ySQL szerszmoslda

PHP & MySQL szerszmoslda


A Mismatch alkalmazs felhasznlkezel rendszernek felptse kzben jkora ismeretlen terletet fedeztl fel. Ismteljk t a legfontosabbakat:
.

SHA ( e r t e k )
Ez a MySQL-fggvny szvegek tit kostsra hasznlhat, s egy 40 hexadecimlis karakterbl ll ka rakterlncot eredmnyez. A fgg vny nagyszeren hasznlhat olyan adatok kdolsra, amelyek nek felismerhetetlennek kell marad niuk az adatbzison bell, a titkos ts ugyanakkor egyirny, teht visszafejt fggvnyprja nincs.

setcookie()
Ezzel a beptett PHP-fiiggvnnyel egy siitit llthatsz be a bngsz ben, belertve egy nem ktelez $_C O O K IE lejrati idt is, amelyet elrve a sti megsemmisl. Ha nem Ez a beptett PHP-szuperglo adsz m eg lejrati idt, a sti blis a stiadatok elrsre szol akkor trldik, amikor bezrjk gl. Minden sti ennek a tmb a bngszt. auu ennek 3 tmbnek egy elemeknt troldik, te" ek eZY N m e ht e&v ci.'xk n t troldik, te-

session destroy ()
Ez a beptett PHP-fggvny be zr egy munkamenetet, s mindig meg kell hvnod, amikor vgeztl egy adott munkamenettel. A fggvny a munkameneti vlto zkat nem semmisti meg, ezrt fontos, hogy sajt kezleg trld azokat a $__SESSI0N szuperglob lis tmb kirtsvel.

egy stirtk elrshez a sti nevt kell megadnod tmbindexknt.


t

rn r-iu g g v e n y egy j munkamenetet indt el, vagy j raindt egy mr ltezi. Ezt a fgg vnyt mindenkppen meg kell hv nod., mieltt elrhetnl egy mun kameneti vltozt.

$_S E S S I0N
Ez a beptett PHP-szu pergloblis a munkamenet-adatok elrsre szolgl. Minden munkameneti vl toz ennek a tmbnek egy elem e knt troldik, teht egy munka meneti vltoz rtknek elrs hez a vltoz nevt kell megad nod tmbindexknt.

7. fejezet

Szemlyre szabott webalkalmazsok ptse

--------------P H P / M y S Q L -k d

lltsd prba!
Lers

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

A Mismatch alkalmazsbl kiszedtek nhny kdrszletet, s nem emlksznk r, hogy mit csinlnak. Prostsd ssze a kdokat a lersukkal!

empty ($_COOKIE [ u s e r _ i d ' ])

Egy munkameneti vltoz segtsgvel megllaptja, hogy a felhasznl bejelentke zett-e vagy sem. Egy sti segtsgvel megllaptja, hogy a felhasznl bejelentkezett-e vagy sem.

setcookie (session_nan*e ( , ' ' , time() 3 6 0 0 ) ; ) -

sha (

$ u se r_ p a s sword.1)

Megsemmist egy munkamenet-stit a lejrati idejnek egy rval korbbra lltsval.

session destroy( )

Felismerhetetlen formra alaktva titkostja a felhasznl jelszavt. Elraktrozza a felhasznl egyedi azonos tjt egy stiben.

setcookie ( user id', $row['user id'])

$ SESSION = array( )

j munkamenetet indt.

session start( )

Bezrja az aktulis munkamenetet.

isset($ SESSION[ user i d 1] )

Minden munkameneti vltozt megsemmist.

most itt vagy

415

lltsd prba! - megolds

lltsd prba!
Megolds
A Mismatch alkalmazsbl kiszedtek nhny kdrszletet, s nem emlksznk r, hogy mit csinlnak. Prostsd ssze a kdokat a lersukkal!
P H P / M y S Q L -k d Lers

Egy munkameneti vltoz segtsgvel megllaptja, hogy' a felhasznl bejelentke zett-e vagy sem. Egy sti segtsgvel megllaptja, hogy a felhasznl bejelentkezett-e vagy sem. Megsemmist egy munkamenet-stit a lejrati idejnek egy rval korbbra lltsval.

Felismerhetetlen formra alaktva titkostja a felhasznl jelszavt. Elraktrozza a felhasznl egyedi azonos tjt egy stiben.

j munka menetet indt.

Bezrja az aktulis munkamenetet.

Minden munkameneti vltozt megsemmist

416

7. fejezet

7 / 4 A tbbszr szerepl' kdok kikszblse

A tid is, az enym is


Igazn nagyon egysze r a helyzet, kedvesem . Ha k e tte n o s z to z u n k egyetlen esernyn, a k ko r n in cs sz ksg n k k e tt re , s egyiknk sem zik e l... r a d s u l s z o ro s a n h o z z s lm lh a ts z egy j k p p a sa sh o z. Egy jkp s okos ^ pasashoz! A m e g o s z to tt esernyvel k a p c s o la to s elm leted Jw egyszeren zsenilisi __>

Nem csak esernyn lehet osztozni.


Brmely webalkalmazs esetben trvnyszeren tallkozol majd olyan helyzettel, ahol ugyanaz a kdrszlet tbb helyen is elfordul. Ez pedig azon fell, hogy pocskols, mg m eg is fjdtja a program kd karbantartsval foglalatoskod szemly fe j t - hiszen a kdban elkerlhe tetlenl szksg lesz vltoztatsokra, s ezeket a vltoztatsokat tbb klnbz helyen kell majd megejteni. A helyzet megoldsa az, ha a krdses kdrszleteket megosztva egyszeren megsznteted a kdrszletek tbbszri elfordulst. Ms szval, a tbbszr elfordul kdrszt egyet len helyen hagyod meg, s erre az egyetlen msolatra hivatkozol ott. ahol szksges. A kdrszletek tbbszri elfordulsnak kikszb lsvel hatkonyabb, egyszerbben karbantarthat s szilrdabb alkalmazs szletik.
ez e g y j fejezet 417

talld meg a tbbszr elfordul kdrszleteket!

Gyakorlat

A Mismatch alkalmazs sokat fejldtt, amita nem tallkoztatok. Knnyebb lett az irny tsa, s egysges kinzete is a felhasznli lmnyt fokozza. De a javulsnak ra volt... egyes kdrszletek immr tbbszr fordulnak el benne. A weboldalakra pillantva lehet, hogy azonnal szreveszed, hogy a tbbszr szerepl kdrszleteket tekintve az alkalma zsnak mely rszei lesznek problmsak. Karikzd be s jelld meg az alkalmazs ilyen rszeit, s jegyezd fel a lthatatlan, de felttelezheten szintn a tbbszr szerepl kd rszletek problmjt magukban hordoz terleteket is!

R O O

Mlswatrh

Mismatch - W bcre opposite* attract!


H3PC v y w Pirte * EflLfrgfife Lfig-Q tfflg3

Latest members:

Rja

lo iia

C ienl?

iass
C opyright C 2 0 0 9 M *n lch U nttptiscs.lnc.

index.php

418 7;4 fejezet

A tbbszr szerepl kdok kikszblse

Mismatch View Profile

ion*

Vjw_erofifc v Edtf Pronfe Log Ouninctiksi

Usernam e: jncoJcs First nam e: Johan L&<t nam e: Nettles G ender: B irth d atc: Location:

Maic 1981- 11-03 Athens. GA

Pfciurr:

WouW you like to edit vmir pmfifr?


Copyright C 2009 Miinxteh Eetrrpme. Inc.

viewprofile.php

Mismatch - Kdit Profile

Hens k is fil 6 E il& afilt i^tQ aU inails)


r Personal Information

Nctllc*.

l^ s t

name:
B ir t h d a t e : C ity : S ta tt: P ic tu r e :

Geo

\
iw * < > _ C ho

C c p > n * h t C 2 0 0 9 M .v m i c n B a e ip n * * * .* *

editprofile.php

m ost itt vagy

419

tbbszr elfordul kdrszletek a mismatch alkalmazsban

Gyakorlat -

A Mismatch alkalmazs sokat fejldtt, amita nem tallkoztatok. Knnyebb lett az irnytsa, s egysges kinzete is a felhasznli lmnyt fokozza. De a javulsnak ra volt... egyes kd rszletek immr tbbszr fordulnak el benne. A weboldalakra pillantva lehet, hogy azonnal szreveszed. hogy a tbbszr szerepl kdrszleteket tekintve az alkalmazsnak mely megolds rszei lesznek problmsak. Karikzd b e s jelld meg az alkalmazs ilyen rszeit, s jegyezd fel a lthatatlan, de felttelezheten szintn a tbbszr szerepl kdrszletek problmjt magukban hordoz terleteket is!

A Mismatch" cm minden oldalon megjelenik, csak a kotojel


utni rsz ms es ms.
i l M 1

A ------------------C Mi*nlcfa - Vfew Profik

-------------------------- L V ru a m r. pcok*

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

Unt mii: io h ii

C tr: M m sfc
B ln b d it :

L m im : Net k s

1981-11-03
A ihens.GA

Locaou:

P k tu rt:

A navigcis me n mindhrom ol dalon azonos.

Would you Uko to crfjt v-.ii.-r ?mren

viewprofile.php index.php

Az alkalmazs szer zi jogi informciit megjelent lblc mindentt egyforma^


Mismatch Edit HrofJVy"

P m on tl tnfcaoarkin
F lr jo r-* name: I.a sl n*<

Gender;

?
r

3C ->n / XX XX** tnU A


ssxofti'.i.vju ! !! , **" WIC" *

B irth d a l*: W i - U - o T

S te C ' ta :
t _ s :c u i r i '.A U J ' ! -

Ci):

P fc tu : fO w ig t3

Minden olyan oldal, amely a felhasznl beje lentkezst kvnja, ugyanazt a munkamenet-in dt s bejelentkezs-kezel kdot futtatja.
editprofile.php

420 7'/i. fejezet

A tbbszr szerepl kdok kikszblse

Darabokra szedjk a Mismatch alkalmazsi


Szval a Mismatch alkalmazs nhny elem e a f parancsfjlokban tbbszr is elfordul. Mi ez zel a baj? Ht az, hogy bonyolult az alkalmazst karbantartani. Mi trtnik, ha gy dntesz, hogy ] oldallal bvted az alkalmazst, amihez persze a navigcis ment is j menponttal kell bovtened? A men kdjt az sszes parancsfjlban t kell rnod. Ugyanez vonatkozik a szerzi jogi informcikat tartalmaz rszre is.

A problma megoldst az jelenti, ha minden kdrszlet, minden informci csak egyetlen


helyen szerepel. gy ha brmikor meg kell vltoztatni a kdrszletet, csak egy helyen lesz dol god. Ezt a gondolatot kvetve lehetsgnk nylik jra tgondolni a Mismatch alkalmazs fel ptst, szem eltt tartva a tbb helyen hasznlhat parancsfjl-sszetevk alkalmazst.

Az oldalak fejlce
A h e a d e r . php parancsfjl tar talmazza a weboldalak fejlct. Egy vltozra hivatkozva minden oldalon ms s ms dm megjele ntsre kpes. A fejlcbe kerl a HTML-fjlok elejn megszokott header.php ^5 ^ szintn a fejlc dolga baj ldni a CSS-stluslapra mutat hi vatkozssal, illetve a hasonl dol gok trolsval.

Ez az sszetev' nem eredmnyez lt hat HTML-kdot, de a Mismatch al kalmazsban kzponti szerepet kap, hiszen ez a rsz vgzi a felhasznlk bejelentkeztetst.

A navigcis men
A navm enu.php parancsfjl llt ja el az alkalmazs navigcis menjt, attl fggen, hogy a webhely ltogatja bejelentke zett-e vagy sem. A navigcis me-----n a Lg In' (Bejelentkezs) s navmenu.php g Log 0 u r (Kijelentkezs) menpontok kzl azt jelenti meg, amelyik ppen szksges.

A munkamenet-indt
A s t a r t s e s s i o n . php parancsfjl felel a munkamenet elindtsrt s annak ellenrzsrt, hogy a fel hasznl bejelentkezett-e. startsession.php

Az oldalak la'blce
A f 0 0 t r . php a szerzi jogi informcikat jelenti meg, illet ve lezrja a fejlcben megnyi tott HTML-cmkket. Ekpp a fej- s a lblc egy prost al kotnak, s mindig egytt kell hasznlni ket.

m ost itt vagy

421

a mismatch alkalmazs sablont kap

A Mismatch alkalmazs jraptse sablonbl


Rendben, szval a Mismatch alkalmazst tbb parancsfjlba szedjk szt, de ak kor hogyan rakjuk ssze az egszet? A beem elt fjlok mkdse mostanra isme rs, s k is rszt kpezik a m egoldsnak... Ennl azonban m esszebbre kell menned, s sablonokban kell gondolkodnod, amelyek lehetv teszik, hogy az egyes oldalakat tbb beem elt fjl kom bincijaknt alkosd meg. A sablon olyasmi, mint egy olyan alkalmazs oldalainak alapjul szolgl tervrajz, ahol az egyes oldalak egyedi adatain kvl minden mst a beem elt fjlok tartalmaznak. A Mismatch alkalmazs sablonon alapul vltozatnak kialaktsa sorn a kzs kdot olyan parancsfjlokra kell bontanod, amelyek mindegyike pontosan meg hatrozott szereppel br. Nhnyan kzlk lthat HTML-kdot lltanak el. msok pedig nem. Az alapelv az, hogy minl tbb alapvet mveletet megvals t kd a sablon beem elt fjljaiba kerljn, s csak azok a kdrszletek maradja nak az alkalmazs egyes oldalait ltrehoz fjlokban, amelyek az adott oldal egyedi tartalmt alaktjk ki.

A sablonok lehetv teszik, hogy egy PHP-alkalmazst j rahasznosthat pa rancsfj l-sszetevo1<bol pts fel.

startsession.php

Mismatch - Where opposites

headenphp

\ Mismatch alkalmazs minden,


az egyes felhasznlkhoz sze mlyre szaboH oldaln olyan bejelentkezs-kezel programkd szksges, amely nyomon kveti a felhasznlkat.

navmenu.php

A navigcis men kzvetlenl a fejlc al kerl, s a Mismatch al kalmazs minden oldaln egysges ment jelent meg, amellyel lehet A lblc a Mismatch alkalmazs minden oldaln megjelenti a szerzi jogi informcit. sges a fbb oldalak bejrsa.

index.php

Most, hogy oly sok egyb parancsfjl segti

footer,php

az index.php feladata egyedl a felhaszn lk listjnak megjelentse maradt; csak erre kell figyelnie.

422 7Vz fejezet

A tbbszr szerepl kdok kikszblse

Nincsenek

hlye krdsek
\ Pontosan m it jelent az, hogy sablon"? Nem csak egy rakat beemelt fjl egyttest?
! De igen. A sablon valban beem elt fjlok gyjtemnye, mgpedig olyan gyjte mny. amelyet azrt hozol ltre, hogy az alkalmazst mkdsi egysgekre oszd. A lnyeg az, hogy egy-egy oldalon vgl csak annyi maradjon, ami csak arra az egy oldalra jellemz. gy a fej- s lblceknek, a navigcis menknek s min den egyb dolognak, ami tbb oldalon is azonos vagy hasonl, az alkalmazssab lonba illik kerlnie. Vgeredmnyknt a sablon kdja beem elt PHP-fjlokba kerl, s ezekre a PHP-fjlokra hivatkoznak majd azok a parancsfjlok, amelyek a ben nk lv kdot hasznljk. A sablonra gy is gondolhatsz, mint olyan beem elt fjlok csoportjra, amelyek egy-kt lpssel tbbet jelentenek a tbbszr elfordul kdrszletek jrahaszno stsnl: az alkalmazs mkdsi egysgekbe val szervezst segtik. A Mismatch alkalmazs igen-igen egyszer pldjt mutatja be a sablonok haszn latnak - a nagyobb, sszetettebb PHP-alkalmazsok gyakran m eglehetsen kifi nomult sablonrendszereket hasznlnak.

! A sablonban lv PHP-kdnak tkletesen megegyez HTML-kdot kell eredmnyeznie a sab lont megoszt parancsfjlok mindegyiknl?
! Nem. Egy sablon nyugodtan llthat el olyan HTML-kdokat, amelyek csak ha sonlk, nem pedig megegyezk. Ennek oka abban keresend, hogy az egyes, a sablon alapjn kszl oldalak bizonyos fokig egyediv tehetk, ha a sablonban vltozkat hasznlsz. A Mismatch alkalmazs oldalainak cme tkletes pldjt nyjtja ennek. Az oldalak fejlceit elllt sablonfjl minden oldal esetben ha sonl, amennyiben mindig olyan cmet llt el, amely a Mismatch szval s egy ktjellel kezddik. A pontos cm azonban mindig klnbz, ezrt van szksg egy vltozra, amelynek a hasznlata aztn az egyes oldalakon nmileg eltr c met eredmnvez.

most itt vagy

423

a mismatch alkalmazs - most mr sablonokkal

A Mismatch alkalmazs jraptse sablonokkal


Az az jratervezssel jr munka, amit arra fordtasz, hogy az alkalmazst sablonknt hasz- ^ja a rnunkamenet nlhat parancsfjlokra szedd szt, ltalban megtrl. A munka vgeredm nyeknt egyegy feladatot ellt, kismret parancsfjlokat kapsz, az alkalmazs fbb, immron a sab020 n*nsen^ Ion fjljaira tmaszkod parancsfjljaiban lv kd pedig drasztikusan leegyszersdik. belltva, prbld

meg a stikbl ki nyerni okt.


Indtsd el a munkamenetet

A HTML-oldal a DOCTYPE meg- ^ adsval s egy < h tm l> cmkvel kezddik.

A header.php f jlt hasznl pa rancsfjltl kapott $page_title vltoz rtkt felhasznlva rd ki az oldal egyedi cmt.
<lir.k rel </head> <body> <?php
echo

?>

T< h 3 >Mi sniatch

header.php

else { echo echo

<a href^"login.php">Log In</a> &I10084 <a href="signup.php">Sign Up</a>';

Jelentsd meg a szerzr jogi informcit h o rd i zenetet, s zrd le


navmenu.php

a HTML-kdot.

Ellen'rizd, hogy a felhasznl bejelentkezett-e s lltsd el a megfelel navigcis ment.

<hr /> <p c la s s </body> </htral>

footer">Copyright &copy;2C08 Mismatch E n te rp rise s, Inc

footer, phc

A tbbszr szerepl kdok kikszblse

A $page_title vltoz hat rozza meg az oldalnak a fej lcben megjelen cmt.

f i In d ts d e l a munkamenett

r e q u i r e _ o h c e ( ' s t a r t s e s s i o n .php Szrd be az o ld a l t e j l c t -* $page t i t l e = 'Where o p p o s i t e s a t t r a c t ! r S ^ i i : i r e on ce ( ' h e a d e r . p h p ' ) ; s


/*

r e q u i r e o n c e ( ' a p p v a r s . p h p ' ); ^ r e q u i r e o n c e ( Tc o n n e c t v a r s . p h p ' )

A navigcis men a fejlc utn, de mg


// Jelentsd meg a ment

r e q u i r e o n c e ( 1navmenu. p h p )
II

az oldal f rsze eltt jelenik meg.

Kapcsoldj

az adatbzishoz

$dbc - m y s q l i _ c o n n e c t ( DB_HOST, DB_USER, DB_PASSWCRD, DBJAME)


// A MySQL -ti szerezd meg a felhasznlk adatait

$ q u e r y - "SELECT u s e r _ i d , f i r s t _ n a m e , p i c t u r e FROM mis mat eh u s e r WHERE f i r s t _ n a m e I S NOT NULL "ORDER BY j o i n _ d a t e DESC LIMIT 5 " ; $ d a t a m y s q li q u e r y ( $ d b c , S q u e r y ) ;
// Egy ciklussal jrd vgig s formzd HTML kdd a felhasznlk adaLait

echo * < h 4 > L a t e s t members:</ h4>' ; echo ' < t a b l e > ' ; vrh i l e ($row = m y s q l i _ f e t c h _ a r r a y ($ d a ta ) ) { s i f ( is_file(MM_UPLOADPATH . $ r o w [ ' p i c t u r e ' ] ) &S f i l e s i z e ( M M UPLOADPATH . $ r o w [ ' p i c t u r e ' ]) > 0 ) { ech o ' < t r > < t d x i m g s r c = " ' . M _UPLOADPAT H . $ row [ ' p i c t u r e * ] . ' " a l t - " ' . $row[ f i r s t _ n a m e * ] . M / > < / td > f ;

M UPLOADPATH M

$row f ' f i r s t name' ]

i ( i s s e t ( $ _ S E S S I O N l u s e r i d ' J )) { echo *<td><a h r e f = " v i e w p r o f i l e . p h ' < / a > < / t d X / t r > 1; else ( echo ' < t d > ' . $ r o w [ ' f i r s t name' J . '< / td > < / tr >

$ rowf ' f 1 r s t name']

A sablon fjljaiba ki nem kerl kd most


m y s q li_ c lo s e ($dbc}

mr semmilyen, mshol is megjelen reszt nem tartalmaz, ezrt sokkal rvidebb. A lblc zrja az oldalt, s csak utolsknt kvetkezhet, hiszen benne vannak a HTML-kd zrcmki.
index.php most itt vagy

?>

___-

// Szrd be az oldal lb ict r e q u ir e o n c e { ' f o o t e r . php1)

425

egy j l megtervezett php-alkalmazs

A Mismatch-alkalmazs ismt teljes...


Br az a gondolat, hogy a Mismatch alkalmazst apr darabokra szedjk szt, nem felttlenl volt megnyugtat, az erfeszts vg eredmnyben hatrozottan megtrlt. Az alkalmazst mostanra sz mos j, a sablon rszt kpez beemelt fjlba osztottad szt. gy az alkalmazs felptse sokkal jobban nyomon kvethet, s a le het legtbb kd vlt tbb helyen is felhasznlhatv. Ha a dara bok valamelyikt l kell alaktanod, csak egyetlen fjlt kell megvl toztatnod, s ennek hatsa az egsz alkalmazson vgigvonul. Ez jelenti a sablonok alkalmazsban rejl igazi lehetsget! __ Htsmatch - Wgrs ap h postteyattr^^|.' .....j|
Mismatch - Where opposhes attract!

so k k a l
A startsession.php parancsfjl ltja el a bejelentkezsek kel kapcsolatos, a sznfalak mgt ti teendket, de nem vlik lthatva az oldalakon. ** ?
1

s a felptse most mr jobb

A navigcis men biztotj az alkalmazs fbb rszeli vezet" hivatkozsokat. )k

lU W fijIM W . .1 / a HTML-fjlok elejn szoksos / ko'dot s az oldal cme't. /

Latest members: _

M fn t aich
Mismatch - View Profile

P le roB

n a v m e n u .p h p

header.php
m rm T , ~
L ast nam e: NettE G end er:

&rm!ik- * LftsUos8tet
_______ _ : Mismatch - E d i t * ,

Mismatch - Edit Profile


* Yl.vv_Prpnis ^

Male B lrth d ate: 1981-11-03

Location:

A U k^G A r-P a ^

I lJ bnBuim' Z Z Z Z
First

PirtU rfJ

m
W

name:
B irth d atc:

Last nam * : 198i-n-o3 G eo ~

Would you like to diLv?


C o p y rig h t C

A es thn

Copjtighi C 2009 Mimaich

footer, php 426 7f fejezet A

8 Urald az adataidat, s uralni fogod a vilgot!

Adatarats
Q O n gy l to m , ez az egsz az adatok ^ kezelsrl szl. E l s z r k iv lo g a to m a b o rs o t, a z t n k iv la s z to k nhny k ru m p lit, sszekeverem k e t w e g y kis zellerrel meg nm i kukoricval, s m ie l tt ^ V szrevenn^, m ris ksz a fin o m levesl )
f

Semmi sem rhet fel az adatok szi learatsval.


Bsges informcik, amelyek csak arra vrnak, hogy m egvizsgld , ro id ez d , ctozeh ason ltsd s kom bin ld ket, illetve ltalban vve azt csinlj velk, amire csak a kirly webalkalmazsodnak szksge van - jl hangzik? Persze. De a valdi ara tshoz hasonlan az adatok kzben tartsa egy MySQL-adatbzisban kemny munkt s jelents szakrtelmet ignyel. A w ebes felhasznlk tbbre vgynak rgi, megf radt, unalmas, rdektelen adatoknl. Olyan adatokat akarnak, amelyek gazdagtjk s elgedett teszik ket...olyan adatokat, amelyek jelentsggel brnak. Mire vrsz ht? Bgesd fel a MySQL-traktorodat, s munkra fel!

ez egy j fejezet 4 2 7

a tkletes se vele, se nlkle " kapcsolat nyomban

Tkletes ellenttek
A Mismatch alkalmazs bejegyzett felhasznlinak adatbzisa egyre n, de a felhasz nlk mr eredmnyt szeretnnek ltni. Lehetv kell tenned a felhasznlknak, hogy m egkeressk az idelis ellenttket annak alapjn, hogy a tbbi felhasznl mit szerei, s mit gyll. Minl tbbszr fordul el, hogy az egyikk imdja azt, amit a msik utl. annl kzelebb kerl a pr ahhoz, hogy tkletes ellenttek legyenek.

Sidney-nek mg meg kell ta llnia a Nagy t, de gyantja, hogy a src ugyanannyira fog ja utlni a valsagshow-kat, mint amennyire szereti.

G yllm a h o rro rfilm e k e t. Meg a h sko n ze rve t. Bo I B a rb a ra S tr e is a n d o t v is z o n t im dom , s s e m m it sem kedvelek jo b b a n , m in t a t r z s t . . .

Emlkszel mg Johanra, a ma gnyos szvre, aki egy olyan


S em m i sem m elengeti meg jo b b a n a szvem et, m in t egy j kis m e t l s h o rro r, meg egy hskonzerves szendvics. Feltve, hogy nem t n ik fel a film ben B a rb a ra 5 tr e is a n d egy t ra z s k k a ll

lnyt keres, aki legalbb annyira utlja a slyemelst, mint amennyire o szereti?

Utlom : Tetkk Szeretem: Cowboycsizma Szeretem: Utlom: Horrorfilm ek Utlom: Hskonzerv Szeretem: Fszeres telek Utlom: Howard Stem Szeretem: Barbara Streisand Utlom: Slyemels Szeretem: Trzs
Szeretem: Tetkk Szeretem: Cowboycsizma Utlom: Valsgshow-k Szeretem: Horrorfilmek Szeretem: Hskonzerv Szeretem: Fszeres telek Szeretem: Howard Stem Utlom: Barbara Streisand Szeretem: Slyemels

A Sidney ltal kedvelt s nem kedvelt dolgok (tmk) listja szges ellen ttben ll Johanval. Lehet, hogy o \ ketten j kis ellenttprt alkotnnak.
428 8. fejezet

Utlom: Trzs

Uraid az adataidat, s uralni fogod a vilgot!

A flreprosts az adatokon mlik


Ahhoz, hogy ellenttetprokat alkothass a felhasznlk kztt, elszr ki kell tallnod, hogy miknt rendszerezd azokat az adatokat, amelyek arra vonatkoz nak, hogy mit kedvelnek s mit nem. Az, hogy tudod, hogy ezek az adatok egy MySQL-adatbzisba kerlnek, nem elg. Kezelhetbb formba kell rendezned ket, s lehetv kell tenned, hogy a felhasznlk megadhassk az egyes dol gokrl (tm krl), hogy szeretik vagy utljk azokat.

A hasonl tmk egy csoportba kerlnek, mint itt a megjelens sel kapcsolatosak.

Szrakozs

Az egyes tmkkal kapcso latban a felhasznlk meg adhatjk, hogy szeretik vagy utljk-e okt, s a vlasza ikat sszevetjk a tbbi fe l hasznlval.

Emberek
Howard Stem Barbara Streisand

rd le, hogy miknt rendeznd olyan nll csoportokba a M ism atch alkalma zs adatait, amelyek egy adatbzisban trolhatk:

m ost itt vagy

429

adatmodell a m ism atch alkalmazs szmra

A Mismatch alkalmazs adatainak csoportostsa


Egy adatmodell kialaktsa egy olyan alkalmazs szmra, mint a Mismatch, rendkvl fontos lps, mivel ez jelents mrtkben meghatrozza az alkalmazs felptst. A Mismatch esetben az adatokat hromflekppen lehet csoportostani: A Mismatch alkalma

zsban a tmkat kate

Kategrik
Az egyes tmkat kategrik segtsgvel rendszerezheted. Br a kategrik nem jtszanak kzvetlen szerepet az ellentt prok meghatrozsban, egy szerbb teszik a felhasznlk nak. hogy jelezzk, hogy mit szeretnek, s mit nem.

grikba csoportostjuk.

A Mismatch adatainak alapjt ezek a tmk je lentik, s ezek hatroz zk meg azokat a para mtereket, amelyek sze rin t a felhasznlkbl ellenttprok alkothatok.

Szrakozs Tevkenysgek

Valsgshow-k Slyemels Horrorfilmek Trzs

Tmk
A flreprostst az olyan tmk sze rint vgezzk el, mint a tetovlsok vagy a fszeres telek. A felhasznlk ezek mindegyikhez megadhatjk, hogy' szeretik vagy utljk-e.

Vlemnyek
A felhasznlk az egyes tmkkai kapcsolatos vlemnykkel * rjk le magukat, hogy az alkalmazs ellenttprokat hozhasson S S ltre kzltk. Az egyes tmk kai kapcsolatos vlemny a szeretem" vagy az utlom" lehet.

A vlemnyek az egyes tmkra adott szeretem" s utlom " vlaszok, amelyek minden Mismatehfelhasznl esetben egyediek.

De pontosan hogyan rik el a fenti adatok, hogy kt fel hasznlbl ellenttpr jjjn ltre? Nos, azokat a vlem nyeket kell sszehasonltanod, amelyeket a felhasznlk az egyes tmkkal kapcsolatban kinyilvntottak. Pldul, mivel Sidney s Johan ellenttes vlemnyt formlt a hor rorfilmekrl, ezzel a tmval kapcsolatban sikeresen ellen ttprba llthatjuk ket. Egy adott felhasznl tkletes el lenttt teht gy tallhatod meg, ha azt a felhasznlt ke resed. akinek a legtbb tmban ellenkez a vlemnye. Horrorfilmek

Szeretem i

Horrorfilmek

Jf

S * Sidney horrorfilmek

irnt rzett utlata e l lenttprt eredmnyez. E lle n t tp r !

430 8. fejezet

Urald az adataidat, s uralni fogod a vilgot!

Adatbzis modellezse smval


Ahhoz, hogy a Mismatch alkalmazs adatkvetelmnyeit lefordthas suk egy tnyleges adatbzis-szerkezetre, egy smra van szksgnk. A sma (schema) az adatbzisban tallhat valamennyi adatszerkezet < tblk, oszlopok stb.) brzolsa a kzttk fenll kapcsolatokkal egytt. Az adatbzis kpi brzolsa segt, hogy lsd, hogyan kapcso ldnak egymshoz a tmk, amikor lekrdezseket rsz, nem beszl ve arrl, hogy pontosan mely oszlopok felelnek az sszekapcsol srt. Pldaknt nzzk meg az eredeti Mismatch-adatbzis smjt az elz fejezetbl, amely egyetlen tblbl (m ism atch_user) llt:

Az adatbzisban tallhat adatok (a tblk s az oszlo pok), valamint a kapcsold objektumok s az sszefg gsek mdjnak lerst s mnak hvjk.

A tbla neve mismat<K_ser user id use rn a m e p a ssw o rd join__date firs t n a m e last nam e gendei b irth d a te city state p ictu re A tbla tbbi oszlopa abban a sorrendben szerepel, ahogy az adatbzis szerkezetben is. Ez a je l mutatja, hogy az oszlop a tbla elsd leges kulcsa.

Egy tbla szerkezetnek ilyetn brzolsa kiss klnbzik attl, amit eddig lttl. A tblkat korbban gy brzoltuk, hogy az osz lopnevek voltak fell, s az adatok alattuk. Ez az nll, illetve ada tokkal feltlttt tblk brzolsra kivl, de nem tl praktikus, ha tbb tblrl szeretnl olyan szerkezeti diagramot kszteni, amely a tblk kztti kapcsolatokat is mutatja. Azt pedig mr tudjuk, hogy a Mismatch alkalmazsban tbb tblra lesz szksg...

Egy tblrl azrt rdemes diagramot kszteni, mert gy a tbla szerkezete el vlaszthat a benne lev adatoktl.

m o st itt vagy

431

a legjobb mismatch-sma kivlasztsa

Gyakorlat

A Mismatch alkalmazs adatbzisban trolnunk kell a felhasznlk vlemnyt (szere ti/utlja) az egyes tmkrl, valamint a tmk nevt s a kategrikat, amelyekbe tartoznak. Az albbiakban hrom klnbz adatbzis-szerkezetet lthatsz a kategrik (category), a tmk (topic) s a vlemnyek (response) beptsre a Mismatch adatbzisba. Karikzd be azt a smt, amelyik szerinted a legsszerbb, s rd le azt is, hogy mirt!

a te q o ry
response

Ezek azok az j adatok, amelyekre azrt van szksg, hogy nyomon kvethessk, hogy a Mismatch-felhaszna'lk m it szeretnek, s m it utalnak. I

mi sma tch_top ic

mi sma tch__user

lopi<_id 1 2 3

n am e Tattoos C o w b o y hats R e ality T V H o rro r movies

category A p p e a ra n c e A p p e a ra n c e Entertainm ent Entertainm ont

m* I u s e r j d | t o p f c jd

m ism "T iuser atch m. m u s e r jd u se rn a m e p a s s w o rd first n a m e last n a m e b irth d a te

5ify_ state
p ic tu re

432 8. fejezet

Urald az adataidat, s uralni fogod a vilgot!

mismatch

u s e r jd
m i sma t
c h __u

ser
...

u se rn a m e s i w
|

u se r d I u se rn a m e | p o ssw o rd | M I
11 i nettles

p a s s w o rd
J 2 in=d a te

wiismqtch_response re s p o n s e _ id

\ L Y

firs M ia m e la st_ n a m e gender b irth d a te c ity state p ic tu re

mismatch_response
P M p o m e Jd category topic 1 resp o n se j u se r id

1 I

101 102 103 104

A p p e a ra n c e A p p e a ra n c e Entertainm ent Entertainm ent

Tattoos C o w b o y boots R eality T V H o rro r movies

Love Love H ate Love

11 11 11 11

mismatch user
mismatch user user id u se rn a m e p a s s w o rd jo in _ d a te firs t n a m e la st nam e gender b irth d a te c ity state p ic tu re to p ic _ id response misfnqtch_topi< fo p ic jd

mi sma tch_top ic
topicJA
1 2 3 4

name
Tattoos C o w b o y hats R e ality T V H o rro r movies

category
A p p e a ra n c e A p p e a ra n c e Entertainm ent Entertainm ent

m ost itt vagy 433

a mismatch szmra legjobb adatbzissma

Gyakorlat megolds

A Mismatch alkalmazs adatbzisban trolnunk kell a felhasznlk vlemnyt (szere ti/utlja) az egyes tmkrl, valamint a tmk nevt s a kategrikat, amelyekbe tartoznak Az albbiakban hrom klnbz adatbzis-szerkezetet lthatsz a kategrik (category), a tmk (topic) s a vlemnyek (response) beptsre a Mismatch adatbzisba. Kariki:-' be azt a smt, amelyik szerinted a legsszerbb, s rd le azt is, hogy mirt!

Elszr is, fontos, hogy az egyetlen j adat, ami a felhasznl szeretem/utlom vlemnyhez kapcsoldik, maga a vlemny legyen - az adatbzisban minden ms rgztett, legalbbis a felhasznl szemszgbl

I H

mi sma tch__use r
Ki mondta, hogy ami egyszer, az min dig jobb? Ez az adatbzissma a vle mnyeket kln tblban, a tbbi, a vlemnyek ltal kzvetlenl nem rintett adattl elvlasztva trolja. Nincs ismtlds, mert a felhasznlk, a kategrik s a tmk mind kvl es nek a m ism atchjesponse tbln.
r e s p o n s e id

t o p k jd 1

nam e Tattoos C o w b o y hats R eality T V H o rro r movies

g o ry A p p e a ra n c e A p p e a ra n c e Entertainm ent Entertainm ent

id [ usamame | password

2 3 4

Az j mismatch_topie J tbla a tmk neveit trol ja, illetve azt, hogy melyik j
resp o n se | u s e r _ H | t o p k j d

kategriba tartoznak.

mismatch user user u se rn a m e a ssw o rd f in . d a te firs t_ n a m e la s L n a m e le n d e r b irth d a te

101 102 103 104

Love Love H ate Love

11 11 11 11

1 2 3 4

Az egyes vlemnyek esetben nincs ismtl ds, ami nagyon j !

m i s m a t c h =j e s p o n s e

m ism q tch fo p tc nam e c a te g o ry

user

Az eredeti mismateh_i tbla vltozatlan marad

A m ism atchj,esponse tbla kapcsolja ssze a felhasznlkat s a tmkat a user_id s a to p ic jd oszlopokon keresztl.

434 S. fejezet

Urald az adataidat, s uralni fogod a vilgot!

A vlemnyek nem a felhasznlk tbljban tro ldnak, ami nagyszer, de rengeteg adat ismtlo'dik, mert a kategrik s a tmk minden vle mny sorban szerepelnek.
m is m a t c h u s e r

mismatch user user u se rn a m e p a s s w o rd firs t n a m e nam e b irth d a te m ism qtch_rcsponse re s p o n s e _ jd c a te g o ry to p ic response user

A p p e a ra n c e A p p e a ra n c e Entertainm ent Entertainm ent

Tattoos C o w b o y boots

p ic tu re A kategrik s a tmk min den vlemny sorban ismt ldnek, ami rlt pazarls.

H o rro r movies

A felhasznlok adatai szr ny mdon minden vlemny sorban ismtlidnek.


m i sma tch__u s e r
kot

A kategrikat s a tmkat nem rossz tlet kln tb user u se rn a m e p a s s w o rd firs t n a m e last n a m e b irth d a te
category

ld 1 u se rn am e I p o s s w o r d l - l j o f

lkba tenni, de minden v lemnyhez ltre kell hozni egy felhasznli sort. gy pldul 4 Johan szerepel 4 vlemnyhez, ami nem j.

mtsmafch_fopi< nam e

Tattoos C o w b o y hats

A p p e a ra n c e A p p e a ra n c e Entertainm ent

state

H o rro r m ovies

Entertainm ent

response

m ost itt vagy 435

a mismatch smja idegen kulcsokat hasznl

Tbb tbla sszedrtozsa


Alihoz, hogy gy kapcsolj ssze tblkat, hogy azok adatok egysges rendszert alkossk, kulcsokra van szksg. Elsdleges kulcsokat (primary key) mr hasznltl: ezek biztostottak egyedi azonostt az adatok szm ra egy tblban, most azonban idegen kulcsokra (foreign key) van szks ged. hogy egy tbla egyik sort egy msik tbla valamelyik sorhoz kap csold. Hgv tbla idegen kulcsa egy msik tbla elsdleges kulcsra hivat kozik, gy ltest olyan kapcsolatot a kt tbla kztt, amelyet egy lekrde zsben felhasznlhatsz. A Mismatch alkalmazs smja az elz gyakorlatbl egy idegenkulcs-prra tmaszkodik a m isinatch_response tblban, hogy' sszeksse a vle mnyek sort a tbbi tbla felhasznlkat s tmkat tartalmaz soraival.

Az idegen kulcs egy olyan oszlop egy tblban, amely egy msik tbla elsdleges kulcsra hivatkozik.

m is m a td iu s e r user userna m e p a s s w o rd Ha mg emlkszel, ez a jel egy elsdleges kulcsot jell Ez az elsdleges kulcs nem csak egyedik azonostja a tmkat a mismatch_topic tblban, hanem ssze is kapcsolja azolu a mismatch_response tblban szerepl firs t nam e last nam e m isniat<h_response re sp o n se _ id response b irth d a te user vlemnyekkel. mismcrth_topi< to p ic J d nam e c a te g o ry p ic tu re Ez a jel azt mutatja, hogy az oszlop egy ide gn kulcs, amely egy msik tbla elsdleges kulcsra hivatkozik.
Idegen kulcsok nlkl nagyon nehz lenne egy tbla adatait egy msik tbla adataihoz trstani. Az adatismtls kiksz blst s az adatbzis hatkonysgt az adatok tbb tblba trtn elosztsa biztostja, teht az idegen kulcsok a legegy szerbb adatbzissmk kivtelvel minden smban fontos szerepet jtszanak. /

A mismatchj'esponse s a mismatch_topic tbla egyttesen trolj az olyan tmidul" kapcsolatos v lemnyeket (szeretem/utalom), m a a Megjelens - > Cowboycsizma vagy a Tevkenysgek - > Trzs.

A tblkat sszekap csol elsdleges s idegen kulcsok kapcsolatt nagy nyilak jelzik. ^

436 8. fejezet

Urald az adataidat s uralni fogod a vilgot!

Az idegen kulcsok mkds kzben

1 h,_

A to p ie jd elsdleges kulcs a mismatch_topic tbla sorainak ~ egyedi indexeknt szolgl.

m i sma t c h _ t o p i c
category
Tattoos C o w b o y hats A p p e a ra n c e

Appearance
Entertainm ent

H o rro r m ovies

Entertainm ent

Ne feledd, hogy ebben

tblban minden sor

Ebben a tblban minden sor egy-egy olyan tmt name) azonost a kate grijval (category) egytt, amely
toplUd

egy-egy Mismatchfelhasznlnak felel

hez egy szeretem/utlom vlemny tartozik, de magt a vlemnyt nem. A to p ie jd idegen kulcs a tmk soraira hivatkozik a mismatch_topi tblban. Nem egyedi rtkek sze repelnek benne, hiszen egy tmrl tbb felhasznlnak is azonos lehet a vlemnye.

Ebben a tblban m in ^ den sor egy adott fe l hasznl egyetlen szere tem /uilom vlemnye.

A m ism atch_response tblban gy derthetsz ki tbbet az adott v laszt ad felhasznlrl, hogy kikeresed az azonostjt (u s e r_ id ) a m ism atch_user tblbl. Ugyangy nzheted meg azt is, hogy a v lemny milyen tmra vonatkozik, illetve hogy az adott tma milyen kategriba tartozik: ehhez a to p ic _id - t kell kikeresned a mi sm a tch _to p ic tblbl. A tblk sszekapcsolsa elsdleges s idegen kulcsok segtsgvel le hetv teszi a bennk lev adatok kvetkezetes sszektst. Emellett az adatbzis felpthet gy is, hogy az elsdleges s a hozzjuk tarto z idegen kulcsok egyezse ktelez legyen. Ezt hivatkozsi psgnek hvjk, ami emberi nyelven annyit tesz, hogy minden kulcshivatkozs nak rvnyesnek kell lennie.

A u s e rjd idegen kulcs egy vle mny sort kapcsolja egy felhaszn l sorhoz a mismatch_user tbl ban. Az rtkei nem egyediek, mivel egy felhasznl tbb dolgot szeret het, s tbb dolgot is utlhat.

most itt vagy 437

a tblk kztti kapcsolatok fajti

S rtem, h o g y a z e\ ed\ egee s idegen i k u lc s o k tblkat k a p c s o ln a k s s z e , de a diagramokon nem ezmt a n y ila k ir n y a a k u lc s o k kztt? ^

De igen. A nyilak irnya rulja el, hogyan az egyes tblk sorai hogyan viszonyulnak egymshoz.
Pontosabban, a nyilak arrl rulkodnak, hogy egy tbla hny sorhoz tartoz nak sorok egy msik tblban, s viszont. Ez ltfontossg rsze az adatbzis sma megtervezsnek, s a kapcsolat hromfle lehet: egy-az-egyhez (one-toonc), egy-a-sokhoz (one-to-many) s sok-a-sokhoz (many-to-many).

A kapcsolatok els fajtja, az egy-az-egyhez kapcsolat, azt mondja ki, hogy az A tbla egy sorhoz legfeljebb EGY illeszked sor tartozhat a ..B tblban, s vi szont - vagyis a kt tblban minden sorhoz csak egy illeszked sor tartozhat. Pldaknt tegyk fel, hogy a Mismatch-felhasznlkat tartalmaz tblt kt tblra osztottuk: az egyik csak a bejelentkezsi adatokat trolja (A" tbla), mg a msik a profiladatokat CB tbla). Mindkt tblban tallhat egy u s e r _ id (felhasznl-azonost) oszlop; ez kapcsolja a felhasznlkat a profiljukhoz. A bejelentkezsi adatokat trol tbla u s e r _ id oszlopa elsdleges kulcs, amely a bejelentkezsek egyedi sgt biztostja, mg a profiladatok tbljban tallhat u s e r _ id oszlop idegen kulcs, amelynek ms a szerepe: csak annyi a feladata, hogy egy profilt egy bejelentkezshez kapcsoljon.

illeszkedik

EGY - AZ - EGYHEZ
ezek kzl a sorok kzl ezek kzl a sorok kz

userprofile_M

firsf

Jo h a n d ierd re 08447b. 230dcb. e5 U d 7 . 062e4a theking b 4 f2 8 3 2 0 0 8 -0 5 Jaso n 2 0 0 8 -0 5 . 2 0 0 8 -0 5 200 8 -0 6

N etties

28-6 U

A tblk egy-az-egyhez kap csolatban llnak egymssal a user id oszlopon keresztl

A kt u s e r _ id oszlop alapjn a bejelentkezsi adatok tblja a szltbla, mg a profiladatok egy gyermektbla, vagyis a s e r _ id elsdleges kulcsot tartal maz tbla szl-gyermek kapcsolatban ll az ugyanilyen nev idegen kul csot tartalmaz tblval.

438 8. fejezet

Urald az adataidat, s uralni fogod a vilgot!

Amikor egy sorhoz tbb sor kapcsoldik


L ia b le A Table l
Az egy-a-sokhoz kapcsolat azt jelenti, hogy az A tbla egy sorhoz tbb illeszked sor is tartozhat a B tblban, de a B" tbla egy-egy sorhoz csak egy az ..A tblban. A lbladiagramon a nyl mindig az egy sn tar talmaz tbla fell mulat a tbb illeszked sort tartalmaz tbla fel. A Mismatch adatbzis jelenlegi smja mr kihasznlja az egy-a-sok hoz kapcsolatok elnyeit. Mivel egy felhasznl tbb tmrl is vle mnyt formlhat (szereti a tetkkat, de utlja a trzst, s gy tovbb), a felhasznlk sorai s a vlemnyek sorai kztt egy-a-sokhoz kap csolat ll fenn. A kt tblt a u s e r _ id oszlop kapcsolja ssze, amely a m ism atch_user tblban elsdleges, mg a m ism atch_response tblban idegen kulcs.
Idegen kulcs! A user id oszlopon keresetl _ egy-a-sokhoz kap csolat ll fenn. . , . ,_____________ n u L s m a t c h _ r e s p o n s 6 / /

E G V - A - > SOKHOZ
ezek kzl a sorok kzl
&t*dleges kulcs.

ezek kzl a sorok kzl

m i sma t ch__u s e r
M rJd O W u sw n o m e p a ssw o rd

...

' dierd re b a ld p a u l jnetties rubyr theking

0 8 4 4 7 b ... 2 3 0 d c b ... 511 d 7 ... 0 6 2 e 4 a ... b 4 f 2 8 3 ...

1 \ / 0
O iT
12 13

Nincsenek

hlye krdsek
Egy-az-egyhez kap csolat: a szltbl nak pontosan egyet len sora kapcsoldik a gyermektbla egyetlen sorhoz.

K I Honnan tudhatom, hogy kt tbla sorai kztt egy-azegyhez vagy egy-a-sokhoz kapcsolatnak kell fennllnia? V
Az egy-a-sokhoz kapcsolatot jval gyakrabban hasznljk, mint az egy-az-egyhez mintt, teljes joggal. ltalban van egy ftbla (szltbla), amely az elsdleges adatokat - a Mismatch adat bzis esetben a felhasznlkat - tartalmazza, s ez a tbla cgy-a-sokhoz kapcsolatban ll a m sodlagos tblkkal (gyermektblkkal). A Mismatch smjban ez ktszer fordul el: mind a felhasznlk, m ind a tm k egy-a-sokhoz kapcsolatban llnak a vlemnyekkel. Kt tbla azon sorai, amelyek kztt egy-az-egyhez kap csolat ll fenn. sok esetben egyetlen tblban egyestietk. m indazonltal vannak olyan hely zetek. amikor termszetesen sszer egy-azegyhez kapcsolatot kialaktani. Erre az elz ol dalon lthattl pldt, am ikor is a felhasznlk profiladatait elmletben sztvlasztottuk a beje lentkezsi adatoktl - az adatok egy rsznek sa jt tblba helyezst a biztonsg indokolhatja.

Egy-a-sokhoz kap csolat: a szltbl nak pontosan egyet len sora kapcsoldik a gyermektbla tbb sorhoz.

most itt vagy > 439

sok-a-sokhoz kapcsolatok

Amikor tbb sorhoz tbb sor illeszkedik


A tblk sorai kztt lehetsges kapcsolatok harmadik s egyben utols fajtja a sok-a-sokhoz kapcsolat, amelyben az ..A' tbla tbb adatsora kap csoldik a B tbla tbb adatsorhoz, egyfajta adattlterhelsknt. Illet ve nem igazn - szmtalan eset lehetsges, amikor a sok-a-sokhoz kap csolat indokolt. De mi a helyzet a Mismatch alkalmazssal? Nzzk meg!
A felhasznlk s a tmk a vle mnyeken keresztl sok-a-sokhoz kapcsolatban llnak egymssal.
08447b

illeszkedik

SOK < - - A - > SOKHOZ


ezek kzl a sorok kzl ezek kzl a sorok kzi

d ie rd re

Tattoos C o w b o y hats e a ra n c e Entertainm ent

e51ld7.
i,

062e4a b4283

Sok-a-sokhoz!

H o rro r m ovies

Entertainm en*

A mismatch_response egy kapcsol tbla, amely a felhasznlk s a tmkrl formlt vlemnyk kztt l test kapcsolat.

A sok-a-sokhoz kapcsolat a Mismatch adatbzisban kzvetett, ami azt jelenti, hogy a m ism atch_response tbln keresztl rvnyesl. M ind azonltal a kapcsolat ltezik: nzd csak meg, hny egyforma u s e r _ id s t o p ic _ id szerepel a mi sm atch_response tblban! A vlemnyek trolsn kvl a mi sm atch_response tbla gynevezett kapcsol tblaknt (junction table) viselkedik, vagyis egyfajta knyel mes kzvett a felhasznlk s a tmk kztt. A kapcsol tbla nl kl rengeteg ismtld adatunk lenne, ami sohasem j. Ha nem gyz tnk meg, lapozz vissza a fejezet elejn tallhat smagyakorlathoz, s nzd meg figyelmesebben a msodik smatervet. Az emltett smban a m ism atc h _to p ic tbla a m ism atch_response tblba volt ptve, ami szmtalan ismtld adatot eredmnyezett.

Sok-a-sokhoz kapcsolat: a szltbla tbb sora ll kapcsolatban a gyer mektbla tbb sorval.

440 8. fejezet

Urald az adataidat, s uralni fogod a vilgot!

Nevezd meg a kapcsolatot!

Az albbi tblkban bekarikzott oszlopokat nll tblkba lehetne helyezni. rd le, hogy az egyes oszlopokat egy-az-egyhez. egy-a-sokhoz vagy sok-a-sokhoz kapcsolattal lenne-e legin kbb rdemes az eredeti tblhoz kapcsolni, majd brzold a kapcsolatokat a tblkat sszekt, megfelel nylhegyekkel elltott vonalakkal!

KAPCSOLAT

mismatch user user a d d re ss


m u n k lta t

frie n d s
b a r to k

nv
kategria

m o st itt vagy 441

Nevezd meg a kapcsolatot! - megolds

Nevezd meg a kapcsolatot! Megolds


Az albbi tblkban bekarikzott oszlopokat nll tblkba lehetne helyezni. rd le, hogy az egyes oszlopokat egy-az-egyhez, egy-a-sokhoz vagy sok-a-sokhoz kapcsolattal lenne-e legin kbb rdemes az eredeti tblhoz kapcsolni, majd brzold a kapcsolatokat a tblkat sszekt, megfelel nylhegyekkel elltott vonalakkal!

felh^ l h o z csak egyet(en

KAPCSOLAT

t r t o i k r t , vagyis a lakcm (address)


Z 69y' 3^ h c s o l a t b l ll 3 felhss^ l (user) sorval. ,

mismatch user user a d d re ss e m p lo y e r) v fr ie n d s j Ugyanannak a munkltatnak tbb felhasznl is az alkalma zottja lehet, ami egy-a-sokhoz kapcsolatot eredmnyez a mun kltatk (employer) s a felhasznlk (user) sorai kztt.

egy-az-egyhez

egy-a-sokhoz

sok-a-sokhoz kapcsolatban ll tblkat jellem zen egy kapcso l tbla illeszti egymshoz, ami itt nem lthat. nam e c a te g o ry

442 8. fejezet

Urald az adataidat s uralni fogod a vilgot!

Ne mozdulj! Sznj egy percet a Mismatch adatbzis elrendezsre, hogy ellentt prokat hozhass ltre.
Tltsd le a Mismatch alkalmazshoz tartoz . s q l fjlokat a Head First Labs webhelyrl, a www.headf ir s t la b s . com/books/hfphp cmrl. Ezek a fjlok tartalmazzk a szks ges Mismatch-tblkat m ism atch_user, mi sm atch_topic s mismatch_response felpt SQL-utastsokat. Futtasd le mindegyik .s q l fjl utastsait valamelyik MySQLeszkz segtsgvel, hogy ltrejjjenek a Mismatch alkalmazs kezdtbli. Ha ezzel megvagy, adj ki egy-egy DESCRIBE parancsot mindegyik j tblra (m is mate h_ to p ic s mi smat.ch_response). hogy ellenrizd a szerkezetket, mert ezek a tblk jelents szerepet fognak jtszani a Mismatch alkalmazs hamarosan elksz tend PHP-para n csf jljaiban. O SR E fe C tS
i i nt n i y.
! a rc f.ir (A -j)

'- r'< o

:i
l

i ~ri
I HO1

i>rv___L

j N1 O

5CI- DE3CHXBF. j>


I FaC:..
''iP %

spon.se;
I H u ! L I Kc-y 1 " V - V -!* : |' xfca'l

resp<sse_: : i ini. ( l i j
I user _ _ t | in L f i i j

SC
I KO

i PP.T
I

a te i n iii- w y c n rit.

A to p ie jd idegen kulcs a mismatch_topic tbla elsdleges kulcsra mutat,


4

tcpic id
rei-poncic

I intiuj

I HG

| L i h y .nJ: l j l ) _ j_ 1 ____\ ______ L __________

cows xa Sir!, jr..05 sec

m ost itt vagy 443

krdiv kszts az adatbzis segtsgvel

Ok. V an e g y csod la to s a n megter vezett a d a tb z is u n k , a m i fe lh a s z n l k a t, k a te g r i k a t, t m k a t s v le m n y e k e t t r o l. De h o g y a n s e g t ez s s z e p ro s ta n i a z e lle n t te k e t?

Ha egy jl megtervezett adatbzisbl indulsz ki, sokkal knnyebb lesz felpteni s sszekapcsolni az alkalmazs egyb rszeit.
Ahhoz, hogy a fejleszts a lehet leggrdlkenyebb legyen, valsznleg nem tehetsz jobbat annl, mint hogy mr az alkal mazs megtervezsnek elejn helyesen pted fel az adatb zist. gy tnhet, hogy ez jelents elzetes morfondrozst ig nyel az adatok trolsnak mikntjt illeten, de a befektetett munka hossz tvon megtrl. Gondolj csak bele, hogy mennyivel nehezebb lenne akkor tdolgozni a Mismatch adat bzist, amikor mr tele van adatokkal!

mi sma tch_t op ic
to p i.jd O r- r |
1

name

mtegory
j

Tattoos________ 1 A p p e a ra n c e G o ld chains I A p p e a ra n c e A p p e a ra n c e A p p e a ra n c e

^
3 4 5 1 6 7

B o d y piercings C o w b o y boots Long h a ir 1 R e ality T V P ro fessional w restling H o rro r m ovies

\A p p e a ra n c e
1 Entertainm ent Entertainm ent

ltalnossgban ez a jl megtervezett adatbzisok elnye. Ha konkrtan a Mismatch adatbzist nzzk, akkor van egy felhasznli tblnk, amelyet maguk a felhasznlk tltenek fel, amikor feliratkoznak, s megadjk a profiljuk adatait, illet ve egy j tblnk a tmk szmra, amely ppen elg kategri t s tmt tartalmaz ahhoz, hogy kellkppen jellemezzen egy szemlyt. Az ellenttprok kialaktshoz mr csak annyi hinyzik, hogy lehetv tegyk a felhasznlknak, hogy vle mnyt formlhassanak a klnbz tmkrl, majd elraktroz zuk a vlemnyket egy nll tblban. I

Entertainm ent |

8 9

Entertinm ent | 1 E a s y listening music | Entertainm ent | The o p e ra 1 Sushi Food F o o d ____ 1 Fo o d Food [

A teljes mismatch_topic tbla 25 elemet tartalmaz, 5 kategriba sorolva, vagyis t dimenziban teszi lehetv az ellenkezst"!

I j
j

11 12 13 u

S p a m ________J S p icy food

Peanut butter & j b a n a n a san d w ich es M artinis H o w a rd Stern Bill G a te s | B a rb a ra Streisand Hugh H efner____ | | M a rth a S tew art Y o g a _______ W eightlifting C u b e p u zzle s K a ra o k e 1 |

15 16 17 18 19 20 21 22

Fo o d People Peopel People People People A ctivities Activities A ctivities Activities | Activities

Agytorna
Hogyan formlnd olyan krdsekk a tmk s ka tegrik eme listjt, amelyekre a felhasznlk szere tem/utlom vlaszokat adhatnak?

444
1

23

**
25

H iking

Urald az adataidat s uralni fogod a vilgot!

Teht a krds az. hogy pontosan hogyan kaphatunk szeretem/'utlom vlaszokat a felhasznlktl a Mismatch adatbzisban szerepl tmkkal kapcsolatban? Nos, a vlasz az, hogy egy krdvet tartalmaz rlap segtsg vel, amelyen a felhasznlk a Love (Szeretem) s a Hate ( Utlom) lehetsg kztt vlasztva formlhatnak vle mnyt a mi sm atch_to p ic tblban szerepl tmkrl. Az rlapot kzvetlenl az adatbzisban trolt vlem nyekbl is elllthatjuk, s a mdostsokat visszarhatjuk az adatbzisba. A krdvet tartalmaz rlap felpt se valjban abbl ll, hogy kiolvassuk a vlemnyeket a m ism atch_response tblbl, majd visszarjuk azokat :da. Vessnk egy pillantst a krdvre, illetve a felptshez szksges lpsekre:
^
'
_________ How do you feel about each topic?
Appearance ---------------------

Mi s ma t c h - krdv
-

__ "rc!

-------- a kemnye az

albbi dolgokrl?

A hasonl tm kat kategrikba csoportostjuk az rlapon bell.

Tattoos: GoW chains: Body piercings: Cowboy boots: Longhair:


Entertainment

(Love OHaic Love 0 Hale Ol-ovc 0 Hate 0Lovc OHate 0 Love Q Hate

Minden tmhoz egy-egy sor tartozik a mismateh_re$ponse tblban, amely a felhasznl vlemnyt is megadja.

Reality TV: Professional wrestling: Horror movies:

Q 1 .0V <*Hax C
L o v e 0 H a tc

Love "'Harc

res vlemnysorok hozzadsa az adatbzishoz az i n s e r t utastssal, amikor a felhasznl elszr fr hozz az rlaphoz.
A krdvei tartalmaz rlapot a m is m a tc h _ r e s p o n s e tbla adataibl lltjuk el, mg akkor is. ha a felhasz nl mg semmirl nem formlt vlemnyt. Ez azt jelenti, hogy res kezdrtkekkel kell feltltennk a m is m a tc h _ r e s p o n s e tblt, amikor a felhasznl elszr fr hozz a krdvhez. Mivel a sorok r e s p o n s e (vlemny) oszlopa kezdetben res, az rlap els megjelensekor sem a Lve, sem a Hat vlasztgomb nem lesz bejellve.

A vlemnysorok mdostsa az UPDATE utastssal a felhasznl ltal az rlapon megadott vlemnyek alapjn
Amikor a felhasznl benyjtja az rlapot, a vlemnyeit be kell vezetnnk az adatbzisba, de a frisstst csak azokkal a tmkkal kapcsolatban kell vgrehajtanunk, amelyeknek az egyik vlasztgombjt a felhasznl beje llte. Ms szavakkal, az adatbzisnak csak arrl kell tudnia, amirl a felhasznl vlemnyt formlt.

A krdvet tartalmaz HTML-rlap ellltsa a vlemnyadatokbl.


A vlemnyekkel a keznkben elllthatjuk a krdvet tartalmaz HTML-rlapot, mgpedig beviteli mezk csoportjaknt, a felhasznl vlemnye alapjn bejellve a megfelel Lve s Hat vlasztgombokat.

most itt vagy *

a vlemnyek bersa a mismatch response tblba

A vlemnyek bevitele az adatbzisba


Br gy tnhet, hogy azzal kell kezdennk, hogy ellltjuk a krdvet tartal maz rlapot, az rlap a m ism atch_response tblban tallhat vlemnyada toktl fgg. Haladjunk teht lpsenknt: elszr kezdrtkekkel kell feltlte nnk a m ism atch_response tblt, vagyis ltre kell hoznunk a vlemnyt mg nem tartalmaz sorokat, amikor a felhasznl elszr fr hozz a krdvhez. Ez lehetv teszi, hogy a mi sm atch_response tblbl anlkl lltsuk el a krdvet, hogy aggdnunk kellene amiatt, hogy a felhasznl vlemnyt nyilvntott-e mr valamirl.

Az rlapon szerepl tmkhoz kezdet ben nem tartozik vlemny, mert

A vlemny oszlopa mg res, amikor a fe l hasznl elszr nyitja meg az rlapot. INSERT

a m ism a tchjesponse tbla vlemny*

A krdvet tartalmaz rlap szemszgbl nzve teht az rlapon szerepl t mk mindegyikhez tartozik egy-egy adatsor a m ism atch_response tblban. Ez azt jelenti, hogy amikor a felhasznl benyjtja az rlapot, csak frisstennk kell az adatsorokat az rlapon megadott vlemnyek szerint.

CLove Hue

Ooe Lv 0LveHrte c
Lov< OHhc
$Lo\c Q H a

UPDATE

Most, hogy a felhasznl vlemnyt nyilvntott nhny tmval kapcso latban, mr van mit trolnunk a mismatch_response tblban.

Br a vlemnyek trolsa a Mismatch adatbzisban vgssoron kt lpsbl l l mvelet, az els lpsre (i n s e r t ) minden felhasznl esetben csak egyszer van szksg. Miutn a kezdeti, res vlemnyek felvtele az adatbzisba meg trtnt, az rlapon elvgzett minden ksbbi vltoztatst a msodik lps, az UPDATE SQL-utastsok vgrehajtsa kezeli.

Az adatbzisban szerepl vle mnyeket frisstjk, hogy meg feleljenek a felhasznl ltil a krdven megadottaknak. 1

446 8. fejezet

Urald az adataidat, s uralni fogod a vilgot!

PHP- & MySQL-mgnesek


Az albbi kd hajtja vgre az res vlemnyek beszrst a m ism atch_response lblba, amikor a felhasznl elszr nyitja meg a krdvet tartalmaz rlapot, valamint ez gondoskodik a vle mnyek frisstsrl, miutn a felhasznl elvgezte a mdostsokat, s benyjtotta az rlapot. Sajnos a kd egyes rszei kipotyogtak, ezrt a helykre kell rakni ket. Ptold a hinyz kdrsze ket a htmgnesek segtsgvel!

// Ha az adott: felhasznl m g nem tlttte ki a krdvet, res v l em n ye ke t zrunk be az adatbzisba $query = "SELECT * FROM mismatch_response WHERE user_id * . $_SESSION['user_id'] . $ d a t & = m y s q l i _ q u e r y ($dbc, $ q u e r y ) ;

if (

($data)

0)

// Elszr kiolvassuk, a tmk azonostit a mismatch _t op ic tblbl $q u e r y "SELECT FROM m i s m a t c h _tcpic ORDER 3Y category_id, topic_id";

$data = mysqii_query($dbc, $query); $topicIDs = array();


w h i l e ( $r ow = m y s q l i _ f e t c h _ a r r a y ($ d a t a ) ) { a r r a y _ p u s h ( $ t o p i c I D s , $ r o w .'L o p i e _ i d 'J );

// M i n d e n trofioz eyy egy res v l emnysort szrunk be a v l em n ye k tbljba f o r e a c h ( $ t o p i c I D s as $ t o p i c _ i d ) {


$ q u e r y * 1 =

mismateri response " .


) VALUES $query); ('" . ? _ S E S S I 0 N [' u s e r _ i d ' ] .
' $topic__id*)

"(
m y s q l i _ q u e r y ($ d b c ,

1
// Ha a krdvet tartalmaz rlapot benyjtottk, a vlemnyeket berjuk az adatbzisba

if (isset($_P0STL'submit'])) 1
/ / A krdven megadott vlemnyeket, a v l e m n y e k tbljba rjuk foreach ($_P0ST as $response_d = > $ response) { $query = " "WHERE m y s q l i _ q u e r y ($dbc, mismatch_response = $query); '$ r e s p o n s e _ i d ' "; response = '^response
I If

)
echo '< p > Y o u r r e s p o n s e s h a v e b e e n s a v e d . < / p > ' ;

m o st itt vagy > 447

PHP-mgnesek

megolds

PHP- & MySQL-mgnesek - megolds


Az albbi kd hajtja vgre az res vlemnyek beszrst a m ism atch_response tblba, amikor a elhasznl elszr nyitja meg a krdvet tartalmaz rlapot, valamint ez gondoskodik a vle mnyek frisstsrl, miutn a felhasznl elvgezte a mdostsokat, s benyjtotta az rlapot. Sajnos a kod egyes rszei kipotyogtak, ezrt a helykre kell rakni ket. Ptold a hinyz kdr szeket a htmgnesek segtsgvel!

// Ha az adott felhasznl mg n e m tl t tt e ki a krdvet, res v l emnyeket szrunk be az adatbzisba $ q u e r y * " S E L E C T * F R O M m i s m a t c h _ r e s p o n s e W H E R E u s e r _ i d = '" . $ _ S E S S I O N [ ' u s e r _ x d Tj . " $data = mysqli_query($dbc, $query);
0)

if

( I m y s q li_ n u m _ r o w s
!/

_ |( $ d a ta ) -

<

________ Ellenrizzk, hogy a lekrdezs - 0 sornyi adatot adott-e vissza.

Elszr kiolvassuk a tmk azonostit a m i s m at ch _t op ic tblbl

$query = "SELECT

I to p ic i d
I M I *

m i s m a t c h _ t c p i c O R D E R BY c a t e q o r y _ i d ,

topic_id";

$data = mysqii_query($dbc,

$qnery);

$ t o p i e I D s a r r a y (); w h i l e ($row - m y s q l i _ f e t c h _ a r r a y f $ d a t a ) ) [ a r r a y j p u s h ( S t o p i c I D s , $ r o w f1t.opic_id' )) ;

A vlemnyek res tmbjnek ltreho zshoz elszr ki kell olvasnunk a t mkat a mismatch_topic tblbl.

}
// M inden tmhoz egy-egy res v le mnysort szrunk be a vlemnyek tbljba ^ f o r e a c h ( $ t o p i c l D s a s $ t o p i c id) { a vlemnysorok itt meg res ,
_ < $query =

INSERT INTO

mismatcn_respcnse VALUES

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

, a hat" lehetseit. sem a lve , sem *


' $ t o p i c _ i d ')";

(' . $ _ S E 3 S I O N [ ' u s e r ^ i d ' ]

mysql^.

// Ha a krdvet tartalmaz rlapot, benyjtottk, i f ( i s s e t ( $ _ P O S T f *s u b m i t ' j )) {

a vlemnyeket berjuk az adatbzisba

// A krdven meg ad ot t v le mnyeket a vlemnyek tbljba rjuk f o r e a c h ( $ _ P C S T a s $ r e s p c n s e _ i d =^> S r e s p o n s e ) { $q-.iery = "WHERE

UPDATE

mismatch_response

response -

'^response

ft

I response id
$q u e r y ) ;

' $resPnse- id';

ir.ys q i x _ q u e r y ($dbc, echo

'< p > Y o u r r e s p o n s e s h a v e o e e n s a v e d . < / p > ' ;

Az egyetlen dolog, ami megvlto zik, amikor a felhasznl benyjt ja az rlapot, a vlemnyek tbl jnak response oszlopa, teht csak ezt kell frisstennk.

Urald az adataidat, s uralni fogod a vilgot!

Nincsenek

hlye krdsek
M it csinl az array_push( ) fggvny? Szerintem ezzel mg nem tallkoztunk.
Valban nem, mgpedig azrt, mert mg nem kellett dinamikusan, elemen knt felptennk egy tmbt. Az array _p u sh {) fggvny egy j elemet illeszt egy tmb vgre, vagyis egy elemmel nveli a tmb mrett. Az el z oldalon szerepl Mismatch-kdban az array_p ush () fggvnyt arra hasznljuk, hogy egy tmbt ptsnk fel a mi sm atch _to p ic tblban ta llhat tmk azonostibl. Ezt kveten ennek a tmbnek a segtsgvel szrjuk be az res vlemnyeket a m ism atch_response tblba - minden tmhoz egyet-egyet.

res vlemnysorok hozzadsa az adatbzishoz az i n s e r t utastssal, amikor a felhasznl elszr fr hozz az rlaphoz.

Bumm! Egyetlen csapssal kt virtulis legyet is letttnk, s a krdv pa rancsfjlja mr flig kszen van.

J
A vlemnysorok mdostsa az u p d a t e utastssal a fel hasznl ltal az rlapon megadott vlemnyek alapjn.

A krdvet tartalmaz rlap elll tshoz szksges vlemnyadatok kiolvassa a s e l e c t utastssal. Kt lps azonban mg ht ravan, m ieltt sszeboronl hatnnk a szerelmesprokat a Mismatch-krdTwel...
most itt vagy 449

A krdvet tartalmaz HTML-rlap ellltsa a vlemnyadatokbl.

adatvezre/t rlapok hasznlata

Egy rlapot adatokkal is vezrelhetnk


Az nem jdonsg, hogy a webes rlapok szvegmezivel, vlasztlistival, v lasztgombjaival stb. adatokat gyjthetsz a felhasznlktl, az azonban mr nem biztos, hogy nyilvnval, hogy a PHP segtsgvel egy adatbzis adataibl is elllthatsz HTML-rlapokat. A Mismatch alkalmazs esetben az tlet az, hogy a vlemnyadatokbl, dinamikusan hozzuk ltre a HTML-krdvet tar talmaz rlapot. A Mismatch-krdvet ltrehoz parancsfjl felttelezi, hogy a vlemnyadatok mr lteznek, ami lehetv leszi, hogy ellltsa az rlapot a mi smatc.h_response tbla adataibl. Tudjuk, hogy ez a felttelezs bizton sgos, hiszen ppen most rtuk meg a kdot, ami res vlemnysorokkal tlti fel a tblt, amikor a felhasznl elszr nyitja meg az rlapot.

Az adatvezrelt (datadriven) rlapok MySQL adatbzisban trolt ada tokra tmaszkodnak a HTML-urlapmezk ellltshoz.

A HTMl-rlapmezV egyedi azonostsra s m is m a t< h j,esponse re s p o n s e ^ jo ^ response A HTML-urlap kdja

mezdnek az adatbzis soraihoz trstsra response_id elsdleges kulcs szolgl.


Az urlapmezoket a mezoneveknek az adatbzis elsdle ges kulcsra lltsval kt jk az adatbzis soraihoz.

tonic id
< fo rm m e t h o d -" p o s t " a c t i o n = " " >

a mismatch__response tbla adataibl jn ltre.

<n:"iL t> Y U f6el about e h 0

A vlasztgombok kivlasztst 3 cn8CKa jenemzo vezerii.


^ r r * 7*

<ibedfo ^-i6 "> T ^t'e9enf>

i
\
,>Lew

% t?y > a' e~ '* 78'


</fU lT ett>tVPe' " rad
< fie id s e t > < le g e n d > E n r.e rta irjR e n t< / Legc-nd> < /forro>
M ^m atch - Questionnaijf, 1ue-

1 " ch.ecked*"checjted"//>Love

How do you feel aboui eacb topic?

r A ppearanvc T attoos: Gold ch *: ain


Body piercings:

f^/Lovc

C Hate QHux

0 Love QHatc @Lovc

y/

Cowboy boots:

ttLove QHatc 0 Love Q H artp

Az rlap a felhasznl vlemnyt tkrzi az egyes tmkrl.

(L onghair: , Enienainrrcct

R tyTV: eaU Professional w restling: Horror m ovies:

0 Love (> Hate


0Lovc QHatc 0 Love QHatc

Urald az adataidat, s uralni fogod a vilgot!

A Mismatch vlemny-krdvet a felhasznlknak a m is m a tc h _re s p o n s e tblban trolt vlem nyeibl lltjuk el. A HTML-rlap kdjnak ellltshoz ezeket a vlemnyeket ki kell olvasni, s a mi sma t c h _ t o p ic tblban megkeresni, hogy az egyes vlemnyek melyik

Gyakorlat

s milyen kategriba tartoz tmra vonatkoznak. Az albbi k d kt lekrdezs vgrehajt sval pt fel egy tm bt a vlem nyekbl s a hozzjuk tartoz tm kbl, illetve kategrik bl: az els lekrdezs kiolvassa egy adott felhasznl vlemnyeit, m g a m sodik lekrde zs kikeresi azoknak a tm knak a nevt s a kategrijt, amelyekre az egyes vlemnyek vonatkoznak. A gond csak az, hogy a k d egy rsze hinyzik... Tltsd ki az res helyeket...

m ism atch_response
|

nusinaf<li.JopK to p ic jd nam e c a te g o ry

response

76 77 78 79 80

1 2 3 4 5 6 7 8

Lovc Love Love Love Love H ate Love Love

Tattoos G o ld chains B o d y piercing s C o w b o y boots Long h a ir R eality T V P ro fessional w restling H o rro r m ovies

A p p e a ra n c e A p p e a ra n c e A p p o a ra n c e A p p e a ra n c e A p p e a ra n c e Entertainm ent Entertainm ent Entertainm ent

A vlemnyek tmbje
a hozzjuk tartoz t- ^

mkkal s kategrikkal.

81 82 83

/ / A v le m n y a d a to k k io l v a s s a a z a d a t b z i s b l az r l a p e l l l t s h o z $ q u e ry = "SELECT r e s p o n s e _ id , t o p i c _ i d , re s p o n s e FROM m is m a tc h _ re s p o n s e . "WHERE u s e r _ id = . $_SE SSIO N [ u s e r _ i d f ] . $ d a ta = m y s q li_ q u e r y ( $ d b c , $ q u e r y ) ; $ re s p o n s e s = a r r a y ( ) ; w h ile ($row = m y s q l i _ f e t c h _ a r r a y ( $ d a t a ) ) { / / A v le m n y h e z t a r t o z tm a n e v n e k k ik e r e s s e a m is m a t c h _ t o p ic $query2 = 1 1 " . "WHERE t o p i c _ i d = " . $ ro w [ 1t o p i c _ i d ] $ d a ta 2 = m y s q li_ q u e r y ($d bc, ); i f (m ysqli_num _ro w s ( ...................* == i ) ( ) $row2 = m y s q l i _ f e t c h _ a r r a y ( $ d a t a 2 ) ; $ ro w [ ' to p ic _ n a m e ] = $ ro w [ ' c a te g o ry _ n a m e '] = a r r a y _ p u s h (^ r e s p o n s e s , $ r o w j/
IT T

t b l b l

Ez a PHPfiiggvny rul ja el, hogy a lekrdezs hny adatsort adott vissza.


}

m ost itt vagy

451

Gyakorlat

megolds

Gyakorlat - megolds

A Mismatch vlemny-krdvet a felhasznlknak a m ism atch_response tblban trolt vlem nyeibl lltjuk el. A HTML-rlap kdjnak ellltshoz ezeket a vlemnyeket ki kell olvasni, s a m ism atch_topic tblban megkeresni, hogy az egyes vlemnyek melyik s milyen kateg riba tartoz tmra vonatkoznak. Az albbi kd kt lekrdezs vgrehajtsval pt fel egy tm bt a vlemnyekbl s a hozzjuk tartoz tmkbl, illetve kategrikbl: az els lekrdezs ki olvassa egy adott felhasznl vlemnyeit, mg a msodik lekrdezs kikeresi azoknak a tmk nak a nevt s a kategrijt, amelyekre az egyes vlemnyek vonatkoznak. A gond csak az, hogy a kd egy rsze hinyzik... Tltsd ki az res helyeket... m is m q t c li^ sPoltse

rpsD onse id

m is m a t< h jo p i< t o p ie jd nam e c a te g o ry

A vlemnyek tmbje a hozzjuk tartoz tmk u l s kaiegr ikkal.

76 77 78 79 80 81

A (-------7 A
3 4 5

Love Lovo Love Love Love H ate Lovo Love

Tattoos G o ld chains B o d y piercings C o w b o y boots Long h a ir R eality T V P ro fessional w restling H o rro r movies

A p p e a ra n c e A p p e a ra n c e A p p e a ra n c e A p p e a ra n c e A p p e a ra n c e Entertainm ent Entertainm ent Entertainm ent

A Sresponses tmb a vle mnyadatok ideiglenes


tmbjeknt szolgl, amelyet

3 krdvei tartalmaz rlap ellltshoz hasznlnk.

emik 3 faiegrik nvi 3 l0plc~id sgvel kere k ki a "lismitch^topic ssu


tblbl.

82 83

6 j 7 J W

/ / A vlem nyadatok k io lv a s s a az a d a tb z is b l az r la p e l llt s h o z $query = "SELECT re spo n se _id , t o p ic _ id , response FROM m ism atch_response " . "WHERE u s e r _ id = . $_SESSION[ u s e rjL d * ] . | I $data = m y sq li_q uery ($d bc, $ q u e ry ); Nagyon fontos, he m $responses = array () ; j , . ' J w h ile ($row = m y s q li_ fe tc h _ a r r a y ($ d a ta )) { zes vlemnyhez ta r to z tma kikeresse a m ism atch_topic t b l b l hez j Vltozkat kell $ query 2 = " SELECT, ................. " na'fnod, hogy ne bet lysold
"WHERE topic_id = f" . $ro w [topic_id!] $data2 = mysqli_query (^dbc, ffycryZ ) ; . if (mvsqli num rows ( ) == i) { fdstsZ Ellenrizzk, bogy valban vannak-e vlemnyadatok.
? f ff

az eredeti lekrdezst.
A tmk s kategrik nevt a msodik lekrdezsbl szr

$row 2 = m ysqli__fetch_ar/ i:ay ($data 2 ) ; $row [ 1 topic_nam e ] = ? row [ category_nam e 1 ] = /rowZrajtegov-y'J; array _p ush ($re sp on ses/ $row );
Az array_pusb() fggvny egy elemet illeszt (pusb) a tmb vgre.

maz adatok hozzrendelsvel


adjuk a vlemnytmbhz.

452 8. fejezet

A krdvet tartalmaz rlap elll tshoz szksges vlemnyadatok kiolvassa a s e l e c t utastssal.

Urald az adataidat, s uralni fogod a vilgot!

A fe lh a s z n l v le m n ye s z v e g k n t (L v e s H a t ) troldik az a d a tb z is b a n ? H a Igen, a k k o r n in c s ennl h a t k o n y a b b m e g o ld s ?

Nem s Van - ezrt fontos a lehet leghatkonyabb adattpussal trolni az adatokat egy MySQL-adatbzisban.
Ha belegondolsz, a Mismatch alkalmazsban megadott vlemnyek egyfajta igaz/ha mis (true/false) vlaszok, mivel a felhasznl vagy az egyik rtket (lve) adja meg, vagy a msikat (hat). Valjban egy harmadik rtk (az ismeretlen') is hasznos lenne, hogy az alkalmazs tudja, hogy a felhasznl m g nem nyilvntott vlemnyt az adott tmrl. Teht m inden vlemny esetben hrom lehetsges rtket kell szmon tartanunk, erre a fajta trolsi feladatra pedig egy olyan szmtpus a legal kalmasabb, mint a T I N Y I N T . A lehetsges vlaszokat teht k lnbz szmrtkek kel brzolhatod:

?i
Ismeretlen = 0

Lve =

H a te

= 2

Egy adatbzis megtervezsekor lnyeges, hogy a lehet legkisebbre cskkentsd az adatok trignyt - ez a Mismatch alkalmazs esetben sem elhanyagoland kve telmny. A szmmal brzolt vlemnyek kzvetlen szerepet jtszanak a Mismatchkrdv rlapmezinek ellltsban.

Hegyezd ki a ceruzd!
A Hat" vlasztgombokkal egyelre
nem kell foglalkoznod, mert az ell ltsuk pontosan ugyangy trtnik.
fo r e a c h if

Az albbi kd egy ciklussal vgighalad az imnt ltrehozott vle mnytmbn, s minden Lve vlasztgombhoz ltrehoz egy HTML-rlapmezt. Ptold a liinyz kdrszeket, hogy az rlapme z bejellt kezdllapotba kerljn, ha a vlemnyt szeretem-re ( 1 ) lltottk, s ne felejts el gondoskodni az <in p u t> elem rtk nek megfelel belltsrl sem!
{

($ re s p o n s e s as $ re s p o n s e )

( ......................................................) { echo ' c in p u t ty p e = " r a d io " n a m e = "' . $ r e s p o n s e [ r e s p o n s e _ id ] r " v a lu e = c h e c k ed= ................... />Love ;

}
e ls e { echo 'c i n p u t ty p e = r a d io " narae="1 . $ r e s p o n s e [ r e s p o n s e _ i d '] f " v a lu e = _ />Love 1;

most itt vagy

453

Hegyezd ki... megolds

ezd ki a ceruzd! Megolds

Az albbi k d egy ciklussal vgighalad az im nt ltrehozott v le m n y tm bn, s m inden Lve" vlasztgom bhoz ltrehoz egy IiTML-rlapmezt. Ptold a h in y z kdrszeket, hogy az rlap m e z bejellt k ezdllapotba kerljn, ha a vlem nyt szeretem'-re (1) lltottk, s ne felejts el g o ndo sk o dn i az < in p u t> elem rtknek m egfelel belltsrl sem!

A Lve" vlasztgomb bekapcsolst a v lemny rtke hatrozza meg (az adatbzis ban a !ove"-nak az 1 rtk felel meg).

Ha a vlemny szeretem" (J), 3 v


foreach if ($responses/as $response) {

lasztgombot a checked jellemz checked"-re lltsval bekapcsoljuk.

(. [~T j....... ) { $ response [' re spo n se_id ] . echo '< in p u t type=ra d io " name="' '" value= w w checked=. />Love ?;

} e ls e ( echo ' < in p u t ty p e= "r a d io name="' . $respo nse[ 're s p o n s e _ id f ] />Love 1; value= T }
.
r

A checked = "checked" elhagysa a v lasztgomb kikapcsolst eredmnyezi, ha a vlemny rtke nem love" (1).

A * < input > elem rtkt f-

[* 3llfuk a vlemnyt knnyebb legyen elraktrozni


adatbzisban, amikor az r lapot benyjtjk.
foreach (Sresponses as ^response) {

if ($response['response'] = 2) { echo '<input type="radic" n a m e . $ r e s p c n s e ['response_xd ] value="2" checked"checked" />Kate

0i 30 |
echo '<input type="radio" name" ' . ^response I'response_id' ] '" value = " 2 " />Hate ';

Ha kvncsi lennl - a Hat" vlasztgombo kat elllt kd pontosan ugyangy mkdik, csak nmileg ms vlaszt keres... Valjban persze van tisztbb s kevesebb kdot ignyl mdja is annak, hogy egyarnt ltrehozd a Lve" s a H at" vlasztgombokat...

454 8. fejezet

Urald az adataidat, s uralni fogod a vilgot!

Aprop, hatkonysg...
A liatkonysgot illeten nem az adatbzis hatkonysga az egyetlen, amit

Az if-else utastsokat a hromrtku ? mvelet segtsgvel rhatod fel tmrebb formban.

szem eltt kell tartanod. A kdols hatkonysga is szmt, ami szmtalan m don biztosthat. Az egyik mdszer, hogy kihasznld a PHP nyelv azon adottsgt, hogy kpes egyszersteni az i f- e ls e utastsokat. Az egyszer if - e ls e utastsokat az gynevezett hromrtk mvelettel (ternary opera tor) tmrtheted:

tru e

Ha a FelttelesKifejezs rtke true, az Utastsi hajtdik vgre.

FelttelesKifejezsi

Utastsi

Utasts2
Ha a FelttelesKifejezs rtke false, az Utasfts2 vgrehajtsra kerl sor.

fa ls e

A hromrtk mvelet valjban csak egy gyorsrsos forma az if - e ls e

utastsok felrsra, amely segt egyszersteni az if - e ls e utastsokat, k1 >nsen amikor egy vltoznak adsz rtket, vagy7HTML-kdot lltasz el egy i f feltteltl fggen. A Lve vlasztgombok kdjt gy rhatod t egy hromrtk mvelettel: echo 'c in p u t ty p e= "ra d io " naiue="' . $respo nse[ 1 re s p o n s e _ id '] ($response[ ' response ] ==
' y

. ' " v a lu e = " l"

? ' checked=checked"'

Ez a true/false teszt hatrozza meg a hromrtku mvelet kimenetelt.


Ha a $response [' re sp o n se ' ] vltozban trolt vlemnyrtk 1 , ak kor az < in p u t> elem rszeknt ltrejn a checked jellemz, ami a k vetkez bejellt Lve vlasztgombot eredmnyezi:

Az < input > elem checked jellemzjt it t egy if-else utasts helyett a hromrt ku mvelettel lltjuk el.

c i n p u t ty p e = " r a d io "

nam e="279" v a l u e = " l ( ^ cked= H c h e c k e d )/>L ove

Az < in p u t> elem kdjnak ezt a rszt a hromrtku mvelet hatrozza meg.
Amennyiben a vlemnyrtk nem 1, a checked jellemz nem jn ltre, gy a Lve vlasztgomb < in p u t > eleme nem lesz bejellve.
0 I . O V C C: Harc

m ost itt vagy 455

a teljes questionnaire.php parancsfjl

A Mismatch-krdoivet tartalmaz rlap ltrehozsa


A Mismatch-krdoivet tartalmaz rlap darabjaibl most mr elg ll a rendelkezsedre ahhoz, hogy a korbban ll rehozott vlemnytmbbl ($responses) ellltsd a teljes HTML-rlapot. Ha mg emlkszel r, ezt a tmbt gy ptettk fel, hogy kiolvastuk az adott felhasznl vlemnyeit a m isrnatch_response tblbl. Nzzk meg mosd a krdvet elllt kdot a teljes q u e s tio n n a ir e .php parancsfjl sszefggsben:

<?php // Az oldal fejlcnek beszrsa r e q u i r e _ o n c e ('s t a r t s e s s i o n . p h p ' ); / / A munkamenet elindtsa $page_title = uestionnaire Q ; r e q u i r e _ o n c e (' h e a d e r . p h p ' ); re qui r e _ o n c e (' a p p v a r s .p h p ' ) ; r e q u i r e o n c e ( o n n e c t v a r s . p h p ' ); c

Bemeljtik a munkamenetet elindt s az oldal fejlct megjelent sablonfjlokat.

questionnaire.php

Az oldal elrst a beje lentkezett felhasznlkra korltozzak.

// Mieltt tovbblpnnk, ellenrizzk, // hogy a felhasznl bejelentkezett-e if (!i s s e t (3 S E S S I O N [ ' u s e r _ i d ' ])} ( e c h o *<p c l a s s = " I o g i n " > P l e a s e <a h r e i = " l o g i n . p h p " > l o g i n < / a > t o a c c e s s t h i s p a g e . < / p > ' ; exi t O ;

}
// A navigcis men megj el en t s e r e q u i r e _ o n c e ('n a v m e n u . p h p '); // Csatlakozs az adatbzishoz S d b c = m y s q l i _ c o n n e c t (D B_H0S7,

DB_USER,

D B _ PA SS WORD,

D B NAME) ;

// Ha az adott felhasznl m g nem tlttte ki a krdvet, res vlemnyeket szrunk be az adatbzisba S q u e r y = " S E L E C T * F R O M m i s m a t c h _ r e s p o n s e W H E R E u s e r i d = '" . $ _ S E S S I O N ['u s e r _ i d '] . S d a t a - m y s q l i q u e r y ( $ d b c , Squery)..; if ( m y s q l i nuin r o w s ( a t a ) = = 0 ) { d // Elszr kiolvassuk a tmk azonostit a mismatch_t.opic tblbl S q u e r y = "SELECT t o p i c i d F R O M m i s m a t c h _ t o p i c O R D E R BY category_id, Sdata = mysqli_query($dbc, $ q u e r y ) ; $topicIDs ~ array(); w h i l e ( Sr ow = m y s q l i _ f e t c h _ a r r a y ( S d a t a )) { a r r a y _ p u s h ($t o p i c I D s , $ r o w f 't o p i c _ i d T ]); topic i d " ;

}
// Mi nden Lmhoz egy egy res vlemnysort szrunk be a v le m ny ek tbljba i o r e a c h (S t o p i c I D s a s S t o p i c _ i d ) { $ q u e r y = " I N S E R T INT m i s m a t c h _ r e ' s p o n s e (usei id, t o p i c i d ) VALIJES (' , '$ t o p i c _ _ i d ')"; mysqli query($dbc, $ q u e r y ) ;

$ S E S S I O N [' liser id'j

// Ha a krdvet tartalmaz rlapot- benyjtottk, a vlemnyeket berjuk az adatbzisba i f ( i s s e t ($ P O S T f s u b m i t ' J ) ) { / / A krdven megadott vlemnyeket a v le m ny ek tbljba rjuk f r e a c h ( $ _ P O S T as $ r e s p o n s e _ i d = > S r e s p o n s e ) { S q u e r y - " U P D A T E m i s m a t e h r e s p o n s e S E T r e s p o n s e = S r e s p o n s e f ff

456 8. fejezet

Urald az adataidat, s uralni fogod a vilgot!


" W H E R E r e s p o n s e _ i d = 'S r e s p o n s e _ i d T"; m y s q l i _ q u e r y ($ d b c , S q u e r y );

1
echo
1< p > Y \ r r e s p o n s e 3 ha ve b e e n s a v e d .< / p > 1; i

// A vlemnyadatok kiolvassa az adatbzisbl az rlap ellltshoz Squery = "SELECT response_id, topic_id, response FROM misma t c h _ r e s p o n s e WHERE user_id = $ _ S E S S 1 N ['u s e r _ i d 1] . $data - mysqli_query($dbc, Squery); $ r e s p o n s e s = a r r a y {); while ($row - m y s q l i _ f e r c h _ a r r a y ( $data)) { // A vlemnyhez tartoz tma nevnek kikeresse a m i s m a tc h_ to pi c tblbl $ q u e r y 2 - " S E L E C T name, c a t e g o r y F R O M m i s m a t c h t o p i c W H E R E t o p i c id = It 1 f $ d a t a 2 = m y s q l i _ q u e r y ($dbc, $ q u e r y 2 ) ; if ( m y s q l i _ n u m _ r o w s ($data2) 1} { $ r o w 2 - iriysqli_fetch_airay < $ d a t a 2 ) ; $ r o w [ ' t o p i c n a m e '] = $ r o w 2 [ a m e *]; n $ r o w [' ca r . e g o r y _ n a m e ' ] = S r o w 2 [' ca t e g o r y ' ] ; a r r a y p u s h ($r e s p o n s e s , $ r o w ) ;
1 If

ft

$ r o w ['t o p i c id']

A ciklus megkezdse eltt kiolvassuk az els vlemnyhez tartoz kategrit.

}
m y s q l i c 1 o s e (S d b c ) ; .

// A krdvet tartalmaz rlap ellltsa a vlemnytmbn e gy ciklussal vgighaladva e c h c f< f o r m m e t h o d = " p o s t " a c t -n**" * . $ S E R V E R [ H P j S E L F * % S ' " > * * P e c h o *< p > H o w d o y o u feel a b o u t e a c h t o p i c ? < / p > T; $ ca t e g o r y * $ r e s p o n s e s \ ] f *c a t e g o ry_rtame * ]; 0 e c h o *< f i e l d s e t > < l e g e n d > ' . 3 responses'!0] [ fca t e g o r y _ n a m e ' J . / l e g e n d > r ; < lyreach (Sresponses as $ response ) { // C s a k akkor kezdnk i mezcsoportot, ha a kategria megvltozott if ( $ c a t e g o r y != S r e s p o n a e I Tc a t e g o r y _ n a m e ' ]) { $category = $responsef'ca-egory_name*J; e c h o 1< / f i e l d s e t X f I e l d s e t > < l e g e n d > . . re s o o n se [ ' c a t e g o r y n a m e T ] . *< / l e g e n d > ' ; $

Minden kategri t egy mezcsoportknt hozunk ltre, hogy a t mkat rendsze rezzk.

)
U A t m k lapmezinek meg je l en t s e r e c h o label . ($ r e s p o n s e [*r sose*] < N U L L ? Tc l a s s - " e r r o r " : . ' for=" Sre.. _ :n s e [T rc^por.c^ i d f ] . . $r e s p r. . ' ; . ' , - ' ' : '\ ..-e-" r a d i o " i d = " f . $ re Apor, s* \ ' '. narrie^" ? Srespor.se f r e s p o n s e _ i d ] vaiu-"l" * ( S r e s p o n s e [ * r e s p o n s e ' ] *** 1 ? 'c h e c k e d = " c h e c e d ' "c '') .>L-:vc ' ; e c h o '< i n p u t t y p e - n r a d i o " i d = " 1 . S r e s p o n s e l irspc ;e name=" S r s p o n s e f 1r e s p o n s e _ i d ' 3 '" v a l u e - " 2 " r . S r e s p o n s e L1r e s p o n s e = = 2 ? b e c k e d = " c h e e k e d " ' ] c />Hat.e<br />

A hromrtk mveletet itt arra hasznljuk, hogy mdostsuk azoknak a t mknak a cmkestlust, amelyekrl a felhasznl mg nem nyilvntott v lemnyt. Minden tmi egy cmke jell, ame lyet Lve" s Hat" vlaszt-

}
e c h o ' < / i e i d s e t> ; e c h o *<i n p u t t y p e - " s u b m i t " value-*n S a v e Q u e s t i o n n a i r e " e c h o '/forrni1; // Az oldal lblcnek beszrsa r q u i r e _ o n c e ( o o t e r . p h p '); f

name-'fs u b m i t " / > ;

gom kvetnek. bok

Ne feledd: 1 = love, 2 hate

Ezek az echo utastsok egy-egy v lasztgombot hoznak ltre - egyet a Lve", s egyet a Hat" szmra.

A krdvet tartalmaz HTML-rlap ellltsa a vlemnyadatokbl.

m ost itt vagy 457

a questionnaire.php parancsfjl kiprblsa

Tesztt
Prbld ki az j Mismatch-krdvet!
Mdostsd a Mismatch alkalmazst, hogy az j Questionnaire parancsfjlt hasznlja (vagy tltsd le az alkalmazs kdjt a Head First Labs webhelyrl, a www. headf ir s t la b s . com /books/hfphp cmrl). Ehhez ltre kell hoznod az j quest io n n ir e . php parancsfjlt, valamint fel kell venned a Questionnaire (Krdv) m en pontot a navmenu. php parancsfjlba, hogy a felhasznlk hozzfrhessenek a krdvhez. Tltsd tel a parancsfjlokat a webkiszolgldra, s nyisd meg a Mismatch alkalmazs foldalt (in d e x .p h p ) egy bngszben. Jelentkezz be, majd kattints a Questionnaire menpontra a krdv elrshez. Megfigyelheted, hogy egyetlen tmhoz sem tartozik mg vlemny, mi vel ez az els alkalom, hogy megnyitottad a krdvet. Nyilvnts vlemnyt az rlapon sze repl tmkrl, s nyjtsd be az rlapot. Trj vissza a foldalra, majd nyisd meg ismt a kr dvet, hogy meggyzdj rla, hogy a vlemnyek megfelelen betltdtek az adatbzisbl.
Mismatch - Questionnaire

A Questionnaire p a - -__ rancsfjl lehetv teszi a felhasznlknak, hogy megadjk, m it szeretnek, s m it utlnak, s a v lemnyket elraktrozza az adatbzisban.

How do you feel about each topic?


Appearance

Tattoos: Gold chains: Body piercings: Cowboy boots: Long hair: Entertainment Reality TV : Professional wrestling: Horror movies

Love QHatc Love QHate Love CHatc Love QHatc Love QHatc

QLovc Hate Love OHate @Lovc QHatc

Az rlap elemei dinamiku san jnnek ltre az adatb zisbl - ha j tmkat ve szel fel bele, az rlap meg vltozik.
A Mismatch alkalmazs teljes forrskdja letlthet a Head First Labs webhelyrl:
www. h

TSltsd Is!

e a d f i r s t l a b s . c o m /b o o k s /h fp h p

458 8. fejezet

Urald az adataidat s uralni fogod a vilgot!

Nincsenek

. Hogyan tudjuk ellltani a M ism atch-krdvet tartalmaz r lapot a m ism atch_response tblbl, mikzben a felhasznl mg nem is nyilvntott vlem nyt semmirl? Kitn krds. A krdvet tartalmaz rlapnak kt es hetsgre kell felkszlnie: arra. amikor a felhasznl elszr tlti ki a krdvet, s arra, amikor mr kitlttte, csak mdost nhny vlemnyen. Az els esetben mg nin csenek vlemnyek, ezrt a m ism atch_response tbla nem tartalmaz adatokat az adott felhasznlhoz. Ennek elle nre dinamikusan el kell lltanunk az rlapot, amihez a m ism atc h _to p ic tblt hasznlhatjuk. A msodik eset K ! A hromrtk mvelet gyorsabb teszi a parancsfjl futst? ben azonban ez nem mkdik, mert az rlapot ekkor a fel hasznl ltal megadott vlemnyek alapjn kell ltrehozni Valsznleg nem. A hromrtk mvelet inkbb csak (ne feledd, hogy' a Lve" s a Hat vlasztgombok az r tmrebb, mintsem gyorsabb teszi a kdot, vagyis lap rszeknt jnnek ltre). A megoldand problma teht csak arrl van sz, hogy kevesebb kd szksges a parancs az, hogy az rlapot elllt kd teljesen ms, attl fggen, fajiban. Nha rvidebb a hromrtk mveletet hasznlni, hogy a felhasznl kitlttte-e mr a krdvet. St. mi mint egy teljes i f- e ls e utastst, br a kett logikailag a helyzet, ha a felhasznl csak nhny tmrl nyilvntott egyenrtk. Ennek ellenre ne vidd tlzsba a hromrtk vlemnyt? Ez hamar jkora kavarodst okozhat. A Mismatch mvelet hasznlatt, mert nehezebben ttekinthetv teheti megoldsa az, hogy res vlemnyekkel elre feltlti a kdot, ha egy bonyolult i f e l se utastst prblsz trni. a m ism atch_response tblt, amikor a felhasznl elszr A hromrtk mveletet akkor rdemes hasznlni, ha egy fr hozz a krdvhez. gy a krdvet tartalmaz rlapot : ~-el se kikszblse tnyleg egyszerbb, s nem bo mindig ltrehozhatjuk a m ism atch_response tblbl, s nyolultabb teszi a kdot. Ez ltalban azt jelenti, hogy a h nem kell aggdnunk amiatt, hogy az rlapot ms-ms mdon romrtk mveletet egy vltozhoz rendelend vagy egy ki kell ellltanunk attl fggen, hogy a felhasznl kitltttere ezsbe beszrand rtk kivlasztsra hasznljuk. e azt, vagy hogy mely tmkkal kapcsolatban nyilvntott A Mismatch vlasztgombjainak esetben is ezt a megkzel- mr vlemnyt. Az rlapot elllt kd ettl mg persze :cst kvettk, hogy szablyozzuk egy HTML-jellemz nem ppen egyszer, de egyszerbb, mint ha nem ezt a megkzeltst kvetnnk. (checked) beszrst.

. Honnan tudja a Lve" vlasztgomb kdja, hogy a hromrtj k mvelet egy karakterlncot eredmnyez? r A hromrtk mvelet eredmnye mindig a ketts pont kt oldaln lev kt utasts egyiknek az rtke, e> a feltteles kifejezs t r u e vagy f a l s e rtktl fgg, gy melyik. Amennyiben ezek az utastsok karakterlnc ckt eredmnyeznek, a hromrtk mvelet eredmnye egy karakterlnc lesz. Az teszi ezt a mveletet olyan k nyelmess, hogy beszrhat egy rtkads vagy sszefzs kzepre.

hlye krdsek K

+-

Prbld ki!

A kd egyszerstse rdekben a Mismatch alkalmazs nem igazodik aut* matikusan az jonnan felvett tmkhoz, legalbbis nem azoknak a felhaszn lknak az esetben, akik mr kitltttk a krdvet. Ez az oka annak, hogy egy j tma hozzadsa utn ki kell rtened a mismatch_response tblt.

Adj egy j tmt a mismatch_topic tblhoz az albbi SQL-utastssal:


INSERT INT m is m a tc h _ to p ic (name, c a te g o r y ) VALUES ( V i r t u a l g u i t a r s ' , A c t i v i t i e s r )

rts ki minden adatot a m ism atchresponse tblbl az albbi SQL-utastssal:


DELETE FR0M m is m a tc h _ re s p o n s e

o
O

Tekintsd meg a krdvet a Mismatch alkalmazsban, hogy lsd az j tmt. Nyilvnts vlemnyt az j tmrl, nyjtsd be az rlapot, s ellenrizd az adatbzisba mentett vlemnyt.
m ost itt vagy

459

a rossz adatok kezelse

Az rlapot most az adatok vezrlik


Kellett hozz nm i erfeszts, de a Mismatch alkalm azs most m r d in a m ikusan lltja e l a krdvet az adatbzisban trolt vlem nyekbl. Ez azt jelenti, hogy az adatbzison vgrehajtott m in den m dosts auto m atikusan tk rzd n i fog az rlap on - ez a lnyege annak, hogy egy w ebalkalm azs felhasznli fellett egy adatbzisbl vezreljk. D e mi trtnik akkor, ha az adatok helytelenek?

response_ici response u s e rjd topic J d

to p ic jd name category

|H
Az rlapot gy hoz
How -Jo you foci about each topic? [ Appcarancc-- Tattoos: Gold chains: Body piercings: Cowboy boots: Long hair:
jEntertainment-

zuk ltre, hogy m itden kategriavlts j mezcsoportot eredmnyez, ezrt jn ltre egy ja tt mezocsoport gy - 1 ahhoz a ka te g ri d

G Love HHaic OLovc Hare QLovc 0H atc Love QHatc 0 Love Q H n

. 3 harom f c s o p o rto t val! 3n eW M m sszevonni W az Entertainment kategria e m i eW helYre kerljenek.

Reality TV: Professional wrestling: Horror mo ---

HLove C'Hatc OLovc Hate Love wHaic

Easy listening music: 0 Love ( Htc Entertainment The opera: r Food-----------Sushi: 0Lovc 0 Harc OLove Hatc 0L cve fH ate j
X

Love OHatc

Ennek a kategrinak a nevt elgpeltk, ezrt sajt mez'csoportot kap az rlapon, ami nagyon zavar.

Spam: Spicy food:

11

Az adatok m egfelelen vezrlik az rlapot, de valam i nem stimmel. gy t n i hogy az egyik kategria neve helytelenl szerepel az adatbzisban, e zn a PHP k d n ll m ezcsoportot hoz ltre hozz. Ez kom oly problm a, m n tnl r azt az erfesztsnket, hogy7 m ezcsoportok segtsgvel rendszerezzk a pt, hogy k n n y e b b legyen vlem nyt nyilvntani az egyes tm krl.
rla

460 8. fejezet

Urald az adataidat, s uralni fogod a vilgot!

Ok, teht az e g yik kategria elrva ezerepei az adatbzisban, ami tnkrevgja az rlapunkat. Srcok, ezerntetek hogyan lehetne kijavtani a hibt?

m i s
!ooi< J d 0 ==w' f nam e category


8 9 10 n i H o rro r m ovies Entertainm ent | En tertin m en $/| Entertainm ent | Food Food Food Food 1 1 1 E a s y listening music 1 In e o p e r a _______i S u s h i ________ 1 S p a m _________ J S p ic y fo o d_______

Mr tudjuk, hogy ez az elgpelt kategria gondokat okoz...


People-----H ow ard S U rn

\
|

12
| 13

Love O H ate

Peanut butter & | b a n a n a san d w ich es 15 1 16 17 18 M artin is H o w a rd Stern Bill G a te s 1 B a rb a ra Streisand

Food People Peopel People y

QLove 0H stc People----------------------- Barbara Streisand:

Q Love 0

Hale

... s it t egy msik, ami ugyanezt a prob lmt eredmnyezi a krdvet tartalmaz rlap mezocsoportjaival kapcsolatban. Frank: A megolds egyszer. Csak mdostani kell a kategria nevt a m is m a t c h _ t o p ic tblban, hogy helyesen
legyen lerva.

Joe: De egyni tbb elgpelt kategria van. s ha mr itt tartunk, nem igazn rtem, hogy a kategrianeveket
mirt kell egynl tbbszr trolni.

Jill: Egyetrtek. Az adatbzissma megtervezsekor komoly erfesztseket tettnk, hogy kikszbljk az ismt
ld adatokat, ennek ellenre itt llunk egy csom ismtld kategrianvvel, radsul nhny nem is helyes.

Frank: Ok. Mi lenne, ha egyszeren megszabadulnnk a kategria nevektl, s szmokkal hivatkoznnk a kate
grikra? Ezzel elkerlnnk az elrs kockzatt.

Joe: Igaz, de a krdvet tartalmaz rlapon tovbbra is szksgnk van a kategrianevekre a mezcsoportok
fejlcben.

Jill: Esetleg anlkl is hivatkozhatnnk szmokkal a kategrikra, hogy ki kellene dobnunk a neveket. Valami
ilyesmit csinlunk a m is m a tc h _ to p ic tblban lev tmkkal is, nem?

Joe: Tnyleg! Nem akartuk, hogy a tmanevek ismtldjenek a m is m a tc h _ r e s p o n s e tblban, ezrt


a m is m a t c h _ t o p ie tblba tettk ket, s szmrtk kulcsokkal kapcsoltuk a vlemnyekhez!

Frank: Azt mondod, hogy az ismtld kategrianevek problmjt gy oldhatnnk meg, hogy ltrehozunk egy
j kategriatblt?

Jill: Pontosan ezt mondja. Ltrehozhatunk egy j, m is m a tc h _ c a te g o r y nev tblt, amelyben egyetlen egyszer
trolunk minden kategrianevet, majd a kategrikat a m is m a tc h _ t.o p ic s a mi s m a tc h _ c a te g o r y tbla kztt elsdleges s idegen kulcsokkal kapcsolhatjuk a tmkhoz. Brilins! ^ t 40 ^

az adatok normalizlsa

Csinld normlisan!
A Mismatch adatbzis ttervezsekor azt a folyamatot, amelynek a sorn kikszbld az ismtld adatokat, illetve logikusan s kvetkezete sen sztbontod s sszekapcsolod a tblkat, normalizlsnak hvjk. Az adatbzisok normalizlsa meglehetsen szertegaz tmakr, ami elsre ijesztnek tnhet, de nem kell megijedned tle. A normalizls alapelveibl ppen elg egyszer adatbzis-tervezsi mdszer vezethe t le ahhoz, hogy jobb tedd a MySQL-adatbzisaid felptst, mint ha csak tallgatnl, hogy miknt kellene elrendezni az adatokat. Nagy vonalakban a kvetkez lpseket kell elvgezni ahhoz, hogy az adatbzis megtervezse termszetes m don normlisabb adatbzis hoz vezessen:

A normalizls (normalization) azt jelen ti, hogy gy tervezed meg az adatbzist, hogy csk kented az adatismtlodst, s javtasz az adatok k ztti kapcsolatokon.
Mi az a f dolog, amit a tblnak brzolnia kell?

1. Vlaszd ki azt az egy dolgot, amit az adott tblnak le kell rnia. 2. Kszts listt azokrl az informcikrl, amelyeket a tbla hasznlatakor ki szeretnl nyerni az adott dologrl. 3. A lista segtsgvel bontsd fel olyan rszek re az informcikat, amelyek alapjn rend szerezheted a tblt.
A normalizlssal kapcsolatos egyik alapvet fogalom az atomi adat, ami azt a legkisebb adategysget jelenti, ami az adatbzis hasznlatt tekint ve mg rtelmes. A Mismatch adatbzis f ir s t _ n a m e s la s t_ n a m e osz lopai pldul abban a tekintetben atomi (atomic) adatokat tartalmaznak, hogy a felhasznl nevt kisebb rszekre bontjk, mint egy egyetlen name oszlop tenn. Ez a felbonts a Mismatch alkalmazsban azrt szksges, mert a felhasznlkra csak a keresztnevkkel szeretnnk hi vatkozni. Mindazonltal nem mindig szksges, hogy egy alkalmazs kln ke resztnv s vezetknv oszlopokra bontson egy teljes nevel - ilyen kor a name nmagban atomi adatnak szmt. Amikor teht egy tbl ban rszekre bontod az ott trolt egyetlen dolgot, azt is vedd figye lembe, hogy az adatokat hogyan fogjk hasznlni, ne csak azt, hogy mit jelentenek.

Hogyan fogod hasznlni a tblt?

Hogyan tudod a legeit: rnhhen lekrdezni a tblt?

Az atomi adat az adott adatbzis szksgleteit kielgt legkisebb adategysg.

462 8. fejezet

Urald az adataidat s uralni fogod a vilgot!

Normalizlskor gondolkodj atomokban!


Ahhoz, hogy az emltett adatbzis-tervezsi elveket mveletekre fordt hasd le, clzott krdseket kell feltenned az adatokkal kapcsolatban. Ez segt, hogy meghatrozd, hogy7 az adatok hogyan illenek az egyes tblkba, s hogy7 valban megfelelen atomi egysgekre lettek-e bontva. Senki sem lltja, hogy az atomok szlvgsa egyszer, de az albbi krdsek segthetnek benne:

Egy normalizlt tb la ltrehozsnak el s' lpse az adatok atomiv ttele.

1.

Mi az az egy dolog, amit a tbla ler? M it r le a tbla: idegenszlelseket, levelez'lista-feliratkozsokat, videojtk-rekordokat vagy remnytelenl romantikus lmodozkat?

2. Hogyan fogod hasznlni a tblt,


hogy kinyerd belle azt az egy dolgot?
A tblt gy tervezd meg, hogy knnyen lekrdezhet legyen!

3.

Az oszlopok atomi adatokat tar talmaznak, hogy a lekrdezsek rvi dek s lnyegre trk lehessenek?
Nincsenek

Gondoskodj rla, hogy adatok csak annyira le gyenek kicsik, amennyire szksges/

--------------------- hlye krdsek


K i Az adatokat a lehet legkisebb rszekre kell bontani? K i Miben nyjtanak segtsget az atomi adatok?

V l Nem felttlenl. Az adatok atomiv ttele azt je V ! Segtenek biztostani az adatok pontossgt a tb
lenti, hogy a legkisebb olyan rszekre bontod azokat, amelyek egy hatkony tbla elksztshez szksgesek, nem a lehetsges legkisebb darabokra. Nem bontsd fel jobban az adataidat annl, amennyire szksges. Ha nincs szksged tovbbi oszlopokra, ne hozd ltre ket csak azrt, mert megteheted. lban. Pldul ha van egy oszlopod, amelyik azt a cmet trolja, ahol egy idegent szleltek, a cmet cl szer lehet kt oszlopra bontani: az utca nevre s a hzszmra. gy gondoskodhatsz rla, hogy a hzszm oszlopba csak szmok kerljenek. Az atomi adatok a lekrdezsek vgrehajtst is hatkonyabb teszik, egyrszt azrt, mert a lekrdezseket knnyebb lesz megrni, msrszt pedig azrt, mert gyorsabban lefuthat nak, ami nagy mennyisg adat esetn jelents megta kartst eredmnyezhet.
most itt vagy 463

a normalizls elnyei

De mirt legynk normlisak?


Ha a szerny adatbzisunk esetben az atomi adatokrl s a nor malizlsrl elmondottak tlzsnak tnnek, gondolj bele, hogy mi trtnne, ha a webalkalmazsod npszersge az egekbe szkne. Mi trtnne, ha az adatbzis mrete igen rvid id alatt nagysg rendekkel megugrana, s felsznre hozn a tervezs esetleges hib it? Inkbb hozd el a dot-com trfet, minthogy sebtapasszal orvo sold a kezed kzl egyre inkbb kicssz hibkat. Lgy normlis! Ha ennyi mg nem gyztt meg, vagy leragadtl a kanrisrga McLarenrl val lmodozsnl, me kt bizonytott rv az adatbzi said normalizlsa mellett:

A normalizls elnye, hogy cskkenti az adat bzis mrett, s nveli a sebessgt.

1. A normalizlt tblkban az adatok nem ismt ldnek, ami cskkenti az adatbzis mrett.
A normalizlt adat

Nagy, felfjt adatbzis = ro ssz...

bzisok ltalban j tfal kisebbek a gyen gn megtervezett aidatbzisoknl. gy is mondhatnnk: a mret pnz"!

...k ic si, hatkony adatbzis = j!

2. Mivel kevesebb adat kztt kell keresni, a lekrdezsek gyorsabban lefutnak.


Lass, ismtld adatokban gzol lekrdezs = ro ssz...

Vrjunk csak, ez le
ht, hogy gy szol:

.az

P nz

Ha van sg mindig szmt.

...frge lekrdezs = j!

464 8. fejezet

Urald az adataidat, s uralni fogod a vilgot!

Hrom lps a normalizlt adatbzis fel


Miutn eltprengtl az adataidon, m r rtkelni tudod a norm alizls el_lt. de az ltalnos elvek ennl nem visznek tovbb. Am ire valjban

szksged van, az egy rvid mveletlista, am elyet vgrehajtva m inden adat


bzist norm alizlhatsz. m e a lista:

^ ^

Gondoskodj rla, hogy az oszlopaid atomi adatokat tartalmazzanak!

Ahhoz, hogy egy oszlop valban atom i legyen, ugyanabbl a tpus adatbl nem szerepelhet

Egy adatbzis normalizlsa megkveteli bi zonyos tervezsi Q lpsek szigor betartst. Q

benne t b b rtk, s ugyanaz az adat sem


szerepelhet t b b oszlopban.
lve
c o w b o y b o o ts, lo n g h a ir, re a lity TV, o a s y listening m usic, the o p e ra

bote
tattoos, g o ld c h a in s, b o d y p ie rcin g s, p ro fe ssio n a l w re stlin g , h o rro r m ovie?

O
i

Minden tblt lss el sajt elsdleges kulccsal!

tattoos, g o ld c h a in * , b o d y p ie rcin g s, co svb o y boots, lo n g H air, p ro fe ssio n a l w re stlin g , h o rro r m ovies

re a lity T V , e a s y Traten mg m usic, the o p e ra

Az elsdleges kulcs ltfontossg ahhoz, hogy egy tbla adatait biztosan egyedileg lehessen elrni. Az elsdleges kulcsnak egyetlen o szlo pnak kell lennie, amely ide lis esetben szm tpus adatot tartalmaz, hogy

i >

Ugyanabban az oszlopban tbb azonos tpus adat szerepel, s ugyanazt az adatot tbb oszlop is tartalmazza, ami komoly gondot jelent!

y ic m o m e

p a ssw o rd

Elsdleges kulcs nl
d ie rd re b a ld p a u l j no fries ru b y r fhekinq 0 8 4 4 7 b ... 2 3 C d c b ... * 5 n d 7 ... 0 6 2 o 4 a ... b 4 t 2 8 3 ...

kl nem biztosthat a sorok egyedisge ebben a tblban.

Gondoskodj rla, hogy a nem kulcs oszlopok ne fggjenek egymstl!


Ez a norm alizlt adatbzisok legnagyobb kihvst jelent kvetelm nye - s nem is m in d ig ri meg szigoran betartani. A laposabban meg kell vizsgl nod hozz, hogy az adott tbla adatoszlopai milyen kapcsolatban llnak egymssal, mert az elv az. hogy az egyik oszlop rtknek m dostsa nem teheti szksgess egy m sik oszlop m dostst.
pirture

A kpzeletbeli irnytszm-oszlop (zip) a vros (city) s az llam (state) oszloptl is fgg, vagyis ha az egyik megvltozik, a tbbit is mdostani kell. A problma gy oldhat meg, ha a felhasznl lakcmt egy nll tblba helyezed, amelynek az irnytszm az elsdleges kulcsa.
m ost itt vagy

0 8 4 4 7 b .. b a id p a u l 2 3 0 d c b ... e 5 l 1 d 7 . ru b y r 0 6 2 o 4 o ... b 4 f 2 8 3 ...

f M *

C o m b rid g e C h a rle sto n A th e n s C o n u n d ru m

MA SC GA AZ MS

02138 29401 30601 85399

die-'drop ic.ip g p a u lp ic .pg jo h a n p ic .ipg ru b y p ic.jp g elm o rp ic.jp g

Tupelo

t 38801 j

465

a mismatch adatbzis normalizlsa

Gyakorlat

A Mismatch adatbzist normalizlnod kell, hogy megoldd az ismtld kategriane vek problmjt. A meglev adatbzis-szerkezetet alapul vve vzold fel a mdos tott felptst, amely megoldja az emlteti problmt, s kikszbli az adatbeviteli hibk kockzatt, majd lsd el a mkdst elmagyarz megjegyzsekkel!

m ism cith_user user id u se rn a m e

first nam e la st_ n a m e b irth d a te state m ism atch_response response

user

466 8. fejezet

Urald az adataidat. s uralni fogod a vilgot!

Nincsenek

---------hlye krdsek---------K i Hogyan hajthatom vgre a harmadik normalizlsi lpst a Mismatch alkalmazs esetben a kpzelet^ j beli vros-llam-irnytszm problma megoldshoz?
V ! A megolds a felhasznl lakcmnek nll tblba helyezse, majd a m ism atch_user tbla hozzkapcsolsa az j tblhoz egy idegen kulcson keresztl. Ltrehozhatsz pldul egy m is m a tc h _lo c a tio n nev tblt egy lo c a t io n _ id nev elsdleges kulccsal, illetve a vrost s az llamot trol oszlopokkal. A c it y s a s ta te oszlopot ezutn eltvoltha tod a m ism atch_user tblbl, s a lo c a t io n _ id idegen kulccsal helyettestheted azokat. Problma megoldva! Ezt a felptsi az teszi mkdkpess, hogy a lo c a t io n _ id oszlop elsdleges kulcsknt hasznlja az irnytszmot, ami kikszbli a nem kulcs oszlopok egymstl val fggsgt.

\ Ht...ez elg sok munka csak azrt, hogy betartsunk egy vlogats adatbzis-tervezsi kvetel mnyt. Tnyleg szksges ez?
! Igen is, meg nem is. Az els kt normalizlsi lps nem kpezi vita trgyt, mert az adatok atomisga s az elsdleges kulcsok minden jl megtervezett adatbzisban ltfontossgak. A harmadik lpst illeten azonban mrlegre kell tenni a makultlan adatbzis-felpts cs btst az alkalmazs vals szksgleteinek realitsval szemben. A Mismatch alkalmazs vros-llam-irnytszm problmjt valsznleg el lehet fogadni az egyszersg rdek ben, de ezt a dntst nem szabad flvllrl venni, s sok adatbzis-megszllott van azon a vlemnyen, hogy mindhrom normalizlsi lpshez szigoran tartanunk kell magunkat. A j hr azonban az, hogy az irnytszm oszlopa csupn a kpzeletnkben ltezik, valj ban nem rsze a m ism atch_user tblnak, ezrt nem igazn kell aggdnunk miatta.

! Mg ha figyelmen kvl hagyjuk is az irnytszm oszlopt, nem kellene a vrost s az llamot kln tblkba helyezni, hogy eleget tegynk a harmadik normalizlsi kvetelmnynek?
! De, elkpzelhet. Vilgos, hogy a m ism atch_user tblban ismtldni fognak a vrosok s az llamok, de irnytszm nlkl az a gond a vros s az llam kihelyezsvel, hogy valahogy fel kell tltennk ezeket a tblkat az sszes ltez vrossal s llammal, msk lnben a felhasznlk ktsgkvl el fognak rni nhny vrosnevet, gy elbb-utbb hely telen adatokat kapunk. Ez j plda arra, amikor komolyan mrlegelni kell a szigor nor malizls elnyeit egy gyakorlati alkalmazs valsgval szemben. Egy rdekes - s kivite lezhet - megolds lehet (mgpedig az sszes problmra), ha a mismatch__user tbla a vrosok s llamok helyett csak az irnytszmot trolja, majd a vrost s az llamot szksg szerint egy statikus tblbl vagy egy webszolglta ts segtsgvel keresi ki. Ez azonban bonyolultabb annl, mint amire jelenleg szksgnk van, ezrt maradjunk csak a ci t.y s s ta te oszlopoknl.

m ost itt vagy

467

a mismatch adatbzis - immr normaliz/va!

A Mismatch adatbzist no rm alizlnod kell, hogy m egoldd az ism tld kategrianevek problm jt. A m eglev adatbzis-szerkezetet alapul vve vzold fel a m
dostott felptst, am ely m egoldja az emltett problm t, s k ik sz b li az adatbe Gyakorlat megolds Viteli h ib k kockzatt, m ajd lsd el a m k d st elm agyarz megjegyzsekkel!

Az j kategriatbla a kategrianeveket a tmktl elv- --------- ^ ------------------ ----------------------______"ismcitch_user--------u s e r jd 0 ' ' u se rn a m e \ ^ A Mismatch adatbfejj fbbj rs2t nem rintik a kategrik, illetve \ t t jo v - 'y jd
\
\ I

lasztva trolja, ami kikszb^ a) t s | d s . (a i m t t

r------------------------- ---------------- \__

________ p o ssv/ord ________ _____________ a tmk vltozsai. ) o in _ d a te )


------ 7

________ rirs t_ n a m e ________ la st n a m e

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

\J,

--------- T m ism q tch _ re sp o n se re sp o n s e _ id r esponse user id to p ic jd _ _ /

mismgth_topic to p ic jd nam e

Emlkezz vissza, hogy a mismatch_response egy kapcsol tbla, amely a felhasznlkat az egyes tmkrl alkotott vlem nykhz kapcsolja.

A tmk soraiban a tnyleges kategrianevek helyett csak egy hivatkozsty (azonostt) trolunk, ami a kategriatbla megfelel sorra mutat.

Az j kategriatbla minden sora egy-a-sokhoz kapcsolatban ll a tmatblban tallhat tmkkal

Nincsenek

v :

! Az j tbla elvlasztja a kategrianeveket a mi sm atch _to p ic tbltl, s lehetv teszi, hogy nllan troljuk azokat. Annak ksznheten, hogy a kate grik a sajt tbljukban troldnak, a nevket mr nem szksges megismtelnnk - minden kategrihoz van egy sorunk, s a mi srnatch_ to p ic tbla sorai ezekre a sorokra hivatkoznak. Ez azt jelenti, hogy a m ism atch_category tbla kategriasorai egy-a-sokhoz kapcsolatban llnak a m ism atch_to pic tblban trolt tmk soraival.

Pontosan hogyan oldja meg az j m is m a t c h _ c a t e g o r y tbla az ismtld adatok problmjt?

Akkor ez azt jelenti, hogy a m i s m a t c h _ c a t e g o r y t t aban csak t sor tallhat (kategrinknt egy)?

Pontosan gy van:

mismatch category
A p p e a ra nce Entertainm ent

Minden kateg rianevet csak egyszer trolunk!

Activities

468 8. fejezet

Urald az adataidat, s uralni fogod a vilgot!

irtLL mismatc h _ c a te g c ry H c a te g o r y _ id INT NOT NULL AUTO_ name VARCHAR(49) NOT NULL, PRIMARY KEY (c a te g o ry _ id )

DROP COLUMN

mismtrt<h_fopi< t o p i c j d O '1 * nam e A tmkat egy j ca te g o ryjd nev idegen kulccsal kapcsoljuk a ka tegriatblban tallhat kategrikhoz.

nuuL

Cli ~OplC

ADD COLUMN c a te g o r y _ id INT NOT NULL

H o rro r m ovies E a s y listening music o p e ra

Peanut butter & b a n a n a sa n d w ich e s M artin is H o w a rd Stern

B a rb a ra Streisand

most itt vagy 469

teszteld a norma/iz/t mismatch-tblkat!

Tesztt
Hozd ltre s tltsd fel az adatbzis j mismatch_category tbljt!
Valamelyik MySQL-eszkz segtsgvel hajtsd vgre az elz oldalon szerepl CREATE t a b l e SQL-parancsot, amely hozzadja az j m is m a tc h _ c a te g o r y nev tblt a Mismatch adatb zishoz. Ez utn add ki az INSERT utastsokat, hogy feltltsd a tblt a kategrik adataival; a m is m a t c h _ t o p ic tblt mdost kt ALTR utastssal vedd fel a c a t e g o r y _ id oszlopot; frisstsd (UPDATE) a mi s m a t c h _ t o p ic tbla sorait, hogy a cat.egory__id oszlopuk a megfelel kategrira mutasson a m is m a tc h _ c a te g o r y tblban; vgl pedig futtass le egy SELECT uta stst mindegyik tbln, hogy meggyzdj rla, hogy minden megfelelen mkdik.

A Mismatch adatbzis most mr tnyleg normalizlt?


Igen, az. Ha a Mismatch adatbzis minden tbljra alkalmazod a normalizls hrom f szablyt, ltni fogod, hogy remekl m kdnek. Ha mgsem, akkor sincs minden veszve. Az emberek normalitshoz hasonlan az adatbzisok normalizlsnak is van nak fokozatai. A lnyeg az, hogy prblj teljesen normalizlt adatb zisokat tervezni, s csak akkor rd be kevesebbel, ha j okod van r. hogy megkerld a szablyokat.

O
A A

Gondoskodj rla, hogy az oszlopaid atom i adatokat tartalmazzanak!

Minden tblt lss el sajt elsdleges kulccsal I Gondoskodj rla, hogy a nem kulcs oszlopok ne fggjenek egymstl!

Minden tbla egyedisgt egy szm tpus elsdle ges kulcs biztostja.

mismatch user user userna m e p a s s w o rd first nam e last nam e Az adatbzisban a nevek min denhol a leginkbb atomi forrn jukban troldnak, s soha nem ismtldnek tbb oszlopban.

m ism atcjuatego ry

nam e

mismqfch_fopi< b irth d a te to p ic id O 3 nam e

A kpzeletbeli irnytszm nlkl a felhasznl cmt tr l oszlopok tbb nem kzdenek fggsgi problmkkal.
470 8. fejezet

Urald az adataidat, s uralni fogod a vilgot!

A Mismatch j t b la szerkezete

nem befolysolja a krdvet elllt parancsfjl kdjban szerepl lekrdezseket?

m ism qf<h_u c a f e g o r y id nam e

tblbl

De igen. Egy adatbzisban valjban a legtbb szerkezeti vltozs megkveteli az rintett tblkat hasznl lekrdezsek mdostst.
Ebben az esetben gy mdostottuk az adatbzis felptst, hogy hozz adtuk az j m ism atch_category tblt, ami minden olyan lekrdezst rint, amely a m ism atch_t.opic tblra tmaszkodik. Ennek az az oka, hogy a korbbi adatbzis-szerkezetben a kategrikat kzvetlenl a m ism atc h _to p ic tblban troltuk. Az, hogy a kategrikat kln tb lba helyeztk - amirl most mr tudod, hogy a normalizls miatt nagy szer tlet volt -, szksgess teszi a lekrdezsek fellvizsglatt, s a kdjuk tdolgozst, hogy mg egy tblt (m ism atch_category) figye lembe vegyenek.

q u e s tio n n a ire .p h p

m ost itt vagy 471

lennie kell jobb mdszernek a lekrdezsek vgrehajtsra!

Lekrdezsen belli lekrdezsen belli lekrdezs...


Egy adatbzis normalizlsa gyakran azt a problmt vonja maga utn, hogy a lekrdezsekben alkrdezseket (subqueries) kell hasznlni, mivel az adatokat , . ( i i i i ^ j tbb tblbl olvassuk ki, ami nehzkes lehet. Vegyk a Mismatch-krdvet tar- D O n y O lU ltb b Ifik rd B " talmaz rlapot a vlemnytmb felptsvel elllt lekrdezs j vltozatt: Z g S g k fit j 16 fit

A tbb tbla ltalban

// A vlemny adat ok kiolvassa az adatbzisbl az rlap li' itsshoz S query - "SELET response i d , t o p i c _ i d , re s p c n se FROM misma1ch re sp o n se M . W K K R K u s e r _ d - " . $ S E S S I O N [ $ d a t a - mysql i._query{$ d b c , query) $responses - rray(|; w h ile ($row m y s q li_ f e t c h _ a r r a y ($ d a ta ) ) { // A vlemnyhez tartoz tma nevnek kikeresse a mismatch_topic Lbibl . topic " . - _ : . $ d w [* . -_id . ] . . < $dataT - mysqli_query($dbc, $query2); if ( m y s q l _ n u m _ r o w s ( $ d a t a 2 ) - - 1) { $row2 - m y s q li_ _ fe tc h _ a r r a y ($ d a ta 2 ) ; $rowf tc p ic _ n a m e 1] = $row2 [ T name ]; // A tmhoz tartoz kategrianv kikeresse a mismatch_cat.egory tblbl 'au-rv3 - "SELECT name FRCM mismatch_category r id o "WHERfcl c a t e g o r y _ , , _ ... $row2 1 'c a t e q4 r y - id * ] v

Az adatokat hi klnbz tbli nyerjk ki, ami hrom lekrdez ignyel.

$data3 - mysqli_query($dbc, $query3!; if (mysql1 _num_rows($data3) i) t Srow3 - rtftsql i_fetch_array (Sdat.a3);

$row[ c^eqorY_nameM - $cow3 ['name ];

Ne feledd, ez a fggvny rulja el, hogy hny adatsort adott vissza a lekrdezs. m ism at<h_response mismat<h_topi<

tz az j lekrdezs a category_ic kulcs segtsgvel olvassa ki a ka tegria nevt a kategriatblbl. m is m o h h ta te g o r

nam e user

c a te g o ry _ id 0 nam e

"*

Tattoos

a
A p p o a ra n c e

A p p e a ra n c e

Ezek az ismtld a

tok

nem jelentenek gond*t, mert egyetlen forrstl a kategrik tblj! nyerjk ki ket, teha tbb pldnyban f

I I

Ez az ideiglenes vlemny tmb, amelyet a Mismatch krdvet tartalmaz rlap ellltsra hasznlunk.

C o w b o y boots Long h a ir R eality T V

\ A p p e a ra n c e
A p p e a ra nce -/Entertainm ent'

nem dnak

P ro fessional w restlin g r Entertainm ent H o rro r m ovies ^ En tertain m en t

472 8. fejezet

Urald az adataidat, s uralni fogod a vilgot!

Kapcsold ssze a tblkat!


. jaj! Nem lehetne tenni valamit az egymsba gyazott lekrdezsekkel? Nos, a megoldst az SQL-ben az sszekapcsols (jin) jelenti, ami lehetv teszi, hogy egyetlen lekrdezssel tbb tblbl nyerj ki adatokat. A tbla-sszekapcsolsnak tbb fajtja is ltezik, de a legnpszerbb a bels sszekapcsols (inner jin),
.mely kt tblbl vlaszt ki egy sorokat egy felttel alapjn. Bels sszekapcsoisnl a lekrdezs eredmnye csak azokat a sorokat fogja tartalmazni, amelyek deget tesznek a felttelnek.

IxLfil n|/pp: Lj '

Az sszekapcsols lehe tv teszi, hogy egyetlen lekrdezssel tbb tb-

_
FROM m is m a tc h t c u i c

"

***

8 ,ma w o s t j i t s a kategria nevt vlaszf-

SELECT m is m a tc h _to p i : . t o p ic jL d , m is m a tc h _c te g o ry . naroe

ae 0 s?0 pk kt kf^b^'tblban taf/fiatk

INNER J01M mismatch_category


ON { m is m a t c h _ t o p i c .c a t e g o r y _ i d m is m a tc h _ c a t :e g o r y .c a t e g o r y i d )

A kategrik tbljt egy INNER JO lN-nal kapcsol juk a tmk tbljhoz.

Az sszekapcsols felttele, hogy a kategriaazonost minden visszaadott adatsorban megegyezzen.

mismatch_topic
IO M
Tattoos A 3 5 7 8 9 1 1 C o w b o y boots lo n g h a ir R eality T V P ro fessio n al w restling H o rro r movies E a s y listening music 1 1 2 2 2 2 2 3 _ _ _ G o ld chains B o d y piercing s

Ez az oszlop ve
1
1 1

mi smatch_category
ougonrjd Oir
m3 P*

aitagory

zrli az ssze kapcsolst.

name

Appearance Entertainment
Food

People Activities

, A p p e a ra n c e ' / 2 3 I A p p e a ra n c e A p p e a ra n c e A p p e a ra n c e A p p e a ra n c e Entertainm ent Entertainm ent Entertainm ent

10
" J

1
\

The o p e ra Sushi

Az eremny msodik oszlopa azokat a kateg rianeveket tartalmazza a kategrik tbljbl, amelyek megfelelnek a tmaazonostknak.

...

4 5 6

Az eredmny els' oszlopa a tmaazono stkat tartalmazza a tmk tbljbl.

7 \ 8 J

Ez a bels sszekapcsols sikeresen fsl ssze olyan adatokat a kt tblbl, amelyeknek a kiolvassa korbban kt kln lekrdezst ignyelt volna. A lekrdezs vgeredmnye mindkt tblbl tartalmaz adatoszlopokat.

tblbl

adatok,

m ost itt vagy > 473

a pont jells hasznlata

pontokkal

Ksd ssze a pontokat


Mivel az sszekapcsolsok egynl tbb tblt rintenek, fontos, hogy vilgos legyen, hogy mely oszlopokra hivatkozol. Konkrtabban, a kavarods elkerlse rdekben minden oszlop tbljt azonostanod kell, hiszen a tblk gyakran tartalmaznak azonos nev oszlopokat, klnsen ha kulcsokrl van sz. Az azonostshoz csak annyit kell tenned, hogy az oszlop neve el rod a tbla nevt, valamint egy pontot. Lssuk pldul az elz INNER JOIN-t hasznl lekrdezst, amely az eredmnyhalmazt a tmaazonostkbl s a kategrianevekbl pti fel: * f ai/a Ln/i * a/i Xo*

A pont jells teszi leheT0V6, nO^y 6Qy 0SSZ6K3p l

1/

csolason bell hivatkozz


i n t r t l aClOTT OSZIOpOl T a n a i ^ ITIdZ t b l id .

Ez az oszlop neve a ta'bln bell, amelyet a tbla nevtl egy pont vlaszt el.
-LECT mismatc!*i_t.opic. topic id, ndsmatch_caregory .name 5
FROM mismatch topic

Egy msik tbla/oszlophivatkozs, amely a pont jellst hasznlja.

NNER JOIN mismatch_category

A pont jells elnye itt mutatkozik meg igazn - az oszlopnevek megegyeznek, ami a tblanevek nlkl teljes kavarodst okozna
Ha nem lehetne meghatrozni, hogy az oszlopok melyik tblba tar toznak ebben a lekrdezsben, jkora kavarods lenne. A lekrdezs ON rsze egyenesen rtelmezhetetlenn vlna, hiszen azt vizsgln, hogy a c a te g o ry _ id oszlop egyenrtk-e nmagval, felteheten a mi sm a tc h _to p ic tbln bell. Az oszlopokat tartalmaz tblkat teht mindig clszer nagyon pontosan meghatrozni, amikor JOIN-t hasznl lekrdezst runk.

onma

Egy JO IN -t hasznl le krdezsben ez az osz lopnv nem egyrtelmi

h aoia azonostsa pon

Tattoos G o id chains Body piercings

tosabb JOIN-Iekrdezst eredmnyez.

Ugoryjd

474 8. fejezet

Urald az adataidat, s uralni fogod a vilgot!

A bels sszekapcsols ennl biztosan tbbre is kpes


bels sszekapcsols nem csak kt tbla adatainak sszefslsre kpes. Mivel bels sszekapcsols vgeredm nyben maga is egy lekrdezs, a szoksos lekr dezsi szerkezetekkel tovbb finom thatod az eredmnyt. Ha az sszefslt eredyhalm azbl pldul egy adott sort szerelnl kinyerni, egy WHERE zradkot tsz az INNER JOlN-lekrdezs vghez, amellyel elklntheted a kvnt sort: SSLECT misma c h _ t o p ic . to p ic id , m ism atch_category.nam e
FRCJM m is m a t c h _ t o p ic INNER JIM mi s m a t c h _ c a t e g o r y DN (m ism aLch t o p i c . c a t e g o r y _ i d = m is m a tc h c a t e g o r y , c a t o g o r y _ i d )
.

Az INNER JIN egy felttel sszehasonl t mveleteivel kap csol ssze sorokat kt tblbl.

Mit ad vissza pontosan ez a lekrdezs? Elszr is, em lkezz vissza, hogy


^ WHERE zradk a lekrdezs finom tsra szolgl, m s szval szkti az eredeti \ NNKR

Ez az oszlop szkti a W/HERE zradkban az eredmnyhalmazt.

Ez a kt oszlop vezrli a kt tbla sszekap csolst.

JOlN-lekrdezs ltal visszaadott sorok halm azt.

Em lkeztetl lljon in a WHERE zradk nlkli bels sszekapcsols

eredmnye: _m ____
1 1 1 2 3 4 5 Entertainm ent 1 1 6 7 8 I I Entertainm ent 1 Entertainm ent 1 A ppea rance A p p e a ra nce A ppea rance A p p e a ra nce A ppea rance [

A tmaazonostkat
a mismatch_topic

tblbl nyerjk ki.

A kategrianevek a mismatch_cate gory tblbl szrmaznak.

A W HERE zradk az eredm nyhalm azt egyetlen sorra szkti:


rra a sorra, am elyben a tm a neve H o r r o r m o v ie s '. N zzk meg a m is m a tc h _ to p i c tblban, hogy m elyik sorrl van sz:

Az eredeti INNER JIN eredmnyhalmaza a WHERE zradk miatt erre a magnyos sorra szkl.

mi sma tch^topic
topicJ d o* 33^
[P r o f e s s io n a l wrestling 1

id

r \

7 8

H o rro r m ovies
1 E n s y listening music

A WHERE zradk az sszekapcsols eredmnyt egyetlen sorra szkti.

z a sor felel meg

___

a WHERE zradk

felttelnek.

most itt vagy 475

lekrdezsek egyszerstse a USING utastssal

Nincsenek

hlye krdsek

K ! Teht a w h e re zradkkal az sszekapcsolt tblk egyi


knek sorai szerint lehet szkteni egy JO iN -lekrdezs ^ j eredmnyt? V ! gy van. Ne feledd, hogy a WHERE zradkban vg zett sszehasonlts az eredeti tblkra vonatkozik, nem a lekrdezs eredmnyre. A Mismatch-pldban a lekrdezs kt olyan tblbl nyer ki adatokat, amely ben egyarnt szerepel egy bizonyos oszlop (c ate g o r y _ id ), majd csak azt a sort vlasztja ki, amelyben a m is m a tc h _ to p ic tbla name oszlopa egy bizonyos r tket ( ' H o rro r m ovies *) tartalmaz. Az INNER J IN te ht mindkt tbla c a t e g o r y _ id oszlopt alapul veszi, de a WHKRE zradk csak a m ism atch _t.op i c tbla name oszlopa szerint szkti az eredmnyhalmazt.

K i A Mismatch jo iN -le k rd e z s b e n a mismatch_ca^ j tegory tbln is alapulhatna a w h e re zradk? V ! Termszetesen. A WHERE zradk az sszekapcso
lsban rintett tblk brmelyike alapjn kpes szkteni az eredmnyhalmazt. A WHERE zradkot pl dul gy is lehetne mdostani, hogy egy adott kateg rit keressen:
... W H K R E m i s m a t c h _ c a t e g o r y . n a m e rt ainmerr ' Erit

Ez a WHERE zradk az eredmnyhalmazt azokra a t mkra szkti, amelyek az Entertainment kategriba tartoznak. A V/HERE zradk teht nem befolysolja a tblk sszekapcsolsnak mdjt, de a lekrdezs ltal visszaadott sorokat igen.

Egyszersts a USING segtsgvel


Ne feledd, hogy a clunk a bonyolult Mismatch-lekrdezsek egyszerst se az LNNER J IN segtsgvel. Ha azonban egy bels sszekapcsols azo nos nev oszlopok megfeleltetsvel jr. a lekrdezs a US ING utastssal to vbb is egyszersthet. A usiN G utasts az ON helyt veszi t az i n n e r JOlN-lekrdezsben, s annak az oszlopnak a nevt kell megadni benne, amelynek alapjn vgre szeretnnk hajtani az sszekapcsolst. Csak arra kell gyelni, hogy az oszlop neve pontosan ugyanaz legyen mindkt tbl ban. Pldaknt lssuk mg egyszer a Mismatch-lekrdezst:
S E L E C T m i s m a t c h _ t o p i c . t.opic_id, F R O M m i s m a t c h _ t 0p i c INNER JOTN mismatch caLegory ON m i s m a t c h _ c a t e g o r y .n a m e

A oszlopok neve z m egegyezik, csak

Az ON helyett a USIN6 utastst hasznlva tm rebb bels sszekapcso lst hasznl lekrdezs rhatk, amelyek egy k zs oszlop alapjn hajtjj vgre az sszekapcsol

a tblk klnbznek.

;m i s m a t c h _ t p i c .c a t e q o r y _ _ i d = m i s m a t c h c a t e g o r y .c s t e q o r y _ i d } 'Horror movies'

W H E R E m i s m a t c h _ t o p i c .n a m e =

Mivel a lekrdezs ON rsze azonos nev (c a te g o ry _ id ) oszlopokra t maszkodik. egyr USING utastssal egyszersthetnk rajta:
S E L E C T m i s m a t c h topic. topic_ia, FROM mismatch_topic INNER JOIN mismatch_category USING ( c a t e g o r y _ id) m i sma*:ch_ca t e g o r y .n a m e

C az oszlop nevre v sak an szksg, egyenlsget ne m kell m egadni az = j<


'Horror movies'

W H E R E m i s m a t c h t o p i c , narre -

Az oszlopneveknek me kell egyeznik ahhoz, I egy bels* sszekapcsol bn a USING utastst hasznlhasd.

476 8. fejezet

Urald az adataidat s uralni fogod a vilgot!

Becenevek a tblk s oszlopok szamra


i t.ier JOIN-Iekrdezsnk egyre tm rebb - gyhogy lp jn k m g egy* lps sel tovbb! Az SQL-lekrdezsek esetben m egszokott, hogy azon a nven hi vatkozunk a tblkra s az oszlopokra, am elyen azok az adatbzisban szerepel-

aek. A nagyobb, tb b tbla sszekapcsolst ignyl lekrdezsekben ez a zo n


ban nehzkes lehel, mert a nevek nehezen olvashatv lehelik a lekrdezst.

Iz n id n k n t rdemes lneveket alkalm azni. Az lnv (alias) olyan ideiglenes * \ y. amellyel egy tblra vagy oszlopra hivatkozhatsz egy lekrdezsben. rjuk s t a Mismatch-lekrdezst lnevek hasznlatval: 5 LE C m t . t o p i c _ i d , m nam e ^ A tblanevek rvidebb lnevekk tmrtsvel a ki valamivel knnyebben olvashatv va'lik.

FROM: r a is m a t c h _ t o p ic AS mt
: i:!k jc ::t

t'e g ': .

<50L-ben az AS kulcsszval hozhatsz ltre a! - ezttal a mismatch J o p ie tbla szamara.

Az lnv lehetv teszi, hogy tnevezz egy tblt vagy oszopof egy lekrde zsen bell, hogy valamilyen mdon egyszerstsd lekrdezst. a

U S IN G ( , c a t g q r $ f _ id \ WHERE m t . name ^ H o r r o r m o v ie s Ennek az lnvnek ksznheten a mismatch_category tblra ezutn egyszeren mc"-knt hivatkozhatsz.
Az lnevek csak arra jk, hogy tm rebb lekrdezseket r junk? Nem, st egyes helyzetekben kifejezetten elengedhetet lenek! A M ism atch alkalm azsban nagy hasznt v e n n n k egy olyan sszekapcsolsnak, amely egy adott tm aazonosthoz a tm a nevt s a kategria nevt is kiolvassa - a gond csak az, hogy a m is m a t c h _ t o p ic s a m is m a tc h _ c a t.e g o ry tbla ugyanazt az oszlopnevet (name) hasznlja ezekhez az adatok hoz, am i azrt jelent problm t, mert az emltett kt oszlop kom binlsa nem egyrtelm oszlopneveket eredm nyezne. Az eredm nyknt kapott oszlopoknak azo n b an lneveket ad hatunk, gy m egllapthatjuk, hogy m elyik melyik. SELCT n .: :aiR A S to r ic_nam o, mc.name PS c%i

A mismatch_topie tb lra mutat hivatkozsok ezutn kivtel nlkl m t"-re rvidthet^.

m in m a iiL

h b i^

<j

t o p i e j d sT _ C nam O j Cy flte q o r / c a t e q o r y jd

nam e l/
Ennek a kt oszlopnak a ki vlasztsa egy sszekapcso lsban azonos nev oszlopo kat eredmnyez, ami nem j!

FRCM m i s n i a t c h _ t o p c AS m t
INNER JIN m ism atch_category AS mc USING (c a te g o ry _ id ) WHERE m t.t o p ic i d = '11

A kivlasztoH oszlopok^ mos' beszdesebb lneveket adunk.

Az eredmnyknt kapott osz lopok neve most mr egyedi s azonostsra alkalmas. ^


to p fc n a m e Sushi categ o ry nam e Food

Ha egy oszlopnak lnevet adsz, az lnv jelenik meg a lekrdezs eredmnyben.

m ost itt vagy 477

a lekrdezsek trsa sszekapcsolsok hasznlatval

Az sszekapcsol sok hatkonyab bak, s kevesebb kdot ignyelnek, mint a begyazott lekrdezsek.
ff

Megmentnk, az sszekapcsols
Az sszekapcsolsok teht lehetv teszik, hogy egy lekrdezs tbb tblt is rintsen, vagyis tbb helyrl olvashass ki vele adatokat, amelyeket aztn egyetlen eremnytblba rsz. A vlemnytmbt felpt Mismatchlekrdezs tkletes jellt az sszekapcsolsra, mivel nem kevesebb, mint h rom begyazott lekrdezssel olvas a tblkbl. Kezdjk az eredeti kddal:
// A vlemnyadaLok kiolvassa az adatbzisba' az rlap ellltshoz S q u e r y = " S E L E C T r e s p o n s e _ i d , t.opic_d, r e s p o n s e F R O M m i s m a t c h _ r e s p o n s e " V . - K E u s e r _ i d - 1" . $ _ S B S S I O N [ .user^id* ] . " f"; $dar.a = m y s q i i _ q u e r y ( $dbc, $ q u e r y ) ; $responses = array(); w h i l e ( $ r w = m y s q l i _ f e t c h _ a r r a y ($ d a t a )) { A vlemnyhez -r . /. -- nevnek kikeresse a nusmatch_topic tblbl i t : . .i $quety2 = " S E L E C T natne, cat' r y _ i : FRty i n i s m at ch d " "WHERE tcpc i d = . $ r o w f 11 o p i c _ i d . ] $data2 = mysqli query($dbc, $qury?); i f { m y s q l i _ n u m _ r o w s ($ d a t a 2 ) = 1) I $ r o w 2 = m y s q l i e t c h _ a r r a y (gdat.^2); $ r o w [ *t o p i c _ n a m e * J - $ r o w 2 [| n a m e 1 1; r // A tmhoz tartoz k a te g ri a n v kikeresse a mismatch_c at eg or y tblbl $.query3 * " S E L E C T n a m e P R O M ml 5match__ca.tegory " * " W H E R E c a t e g o r y id = . $ r o w 2 f 1c a t e g o r y i d ] $ d a t a 3 = m y s q l i :iuery ($ d b c , $ q u e r y 3 ) ; if ( m y s q l i _ n u m r o w s ( $ d a t a 3 ) = = 1 ) I $ r o w 3 = m y s q l i letch_ a r r a y ($da ta 3J ,; $ r o w [ f c a t e g o r y n a m e = $ r c w 3 ( *n a m e | ] ; J a r r a y _ p u s h {$ r e s p o n s e s , $ r o w };

A Icd Utols kt lekrde

zse felel a tma s a ka tegria nevnek a kiolvass srt a megfelel tblkW -te h t tblnknt egy-efl lekrdezst hasznlunk.
I

f tf ll # t fi

Az sszekapcsols le hetv teszi, hogy egyetlen lekrdezssel kiolvassuk a tma s kategria nevt is.

Most pedig lssuk a kd j vltozatt, amely egy sszekapcsolst alkalmaz:

// A v l e m n y ad at ok kiolvassa az adatbzisbl az r la p ellltshoz $ q u e r y = "SELECT response_id, p i ^ i d , response FROM misinatch_response o " W H E R E u s e r i d = " . S _ S E S S I O N [ fu s e r _ i d ] $aar.a = m y s q l i q u e r y (-dbcf $ q u e r y ) ; $responses = arrav{); w h i l e ($row = m y s q l i I e t c h _ a r r a y ( $ d a t a )) { // A vlemnyhez Lartoz tma s kategria nevnek kikeresse a m ismatch ^ topic s mismat;ch category $ q u e r y 2 - " S E L E C T m t .n a m e A S t o p i c n a m e , m e . n a m e A S c a t e g o r y _ n a m e IO M m i s m a t c h t o p i c A S m t 1 . rR s " I N N E R J O I N m i s m t rh c a t e g o r y A S m e U S I N G ( c a t e g o r y _ i d ) 1 11 f 1 " W H E R E m t . t o p i c _ i d - 1" . $ r o w ; o p i c _ i d '] t A kdot lnevek iata2 - m y s q l i j q u e r y ( $ d b c f $ q u e r y 2 } ; i f ( m y s q i i _ n u m _ r o v r s ( $ d a t a 2 ) 1) { hasznlatval egy $ r o w ? = m y s q l i f e t c h - a r r a y ($. ); d a t 2 a V> A szerstjk. $ r o w ['t o p i c _ n a m e *] - : i . w 2 [ l t o p *]; $ r o w f 1c a t e g o r y _ n a m e *. - $row2Tj' c a t e g o r y _ n a m e fj ; ] a r r a y _ p u s h ($r e s p o n s e s , $ r o w ) ; A f lekrdezs alapja a tmaazonos
ff f tt

tblkbl

t, de magt az sszekapcsolst a ka tegria-azonost vezrli.

478 8. fejezet

Urald az adataidat, s uralni fogod a vilgot!

N em rtem. Mg mindig van egy fie lekrdezsnk, a m e ly ik a kategrianevet keresi ki. Ha az sszekapcsols olyan k ir ly , m i r t van szksg kt lekrdezsre?

Nem szksges kt lekrdezs, legalbbis akkor nem, ha az ssze kapcsolsok minden lehetsgt kiaknzzuk.
Kettnl tbb tblt is lehetsges sszekapcsolni - s a Mismatchvlemnytmb kdjban valjban erre van szksg. Egyetlen lekrde zsre van szksgnk, amely a kvetkez hrom dolgot hajtja vgre: ki olvassa a felhasznl sszes vlemnyt, kikeresi a vlemnyekhez tar toz tmk nevt, majd kikeresi a vlemnyekhez tartoz kategrik nevt is. Az elz oldalon tallhat j, tovbbfejlesztett kd az utbbi kt lpst vgzi el egyetlen lekrdezsben, a m ism a tc h _to p ic s m is m a tc h _ c a te g o r y tblk sszekapcsolsnak segtsgvel. Az idelis megolds azonban az lenne, ha egyetlen, kt sszekapcsolst alkalmaz lekrdezs terten le mindhrom madarat egy nagy, sszekapcsols alak kvel.

Gyakorlat

Az albbiakban lthat a kd, amely az sszekapcsolsok gyes alkalmazsval kpes a vlemnyadatokat egyetlen lekrdezssel kiolvasni az adatbzisbl. Lgy te is gyes, s rd meg az $QL-lekrdezst, amely elvgzi a m ism atch_response, m ism a tc h _to p ic s m ism atch_category tblk sszekapcsolst!

/ / A v le m n y a d a to k k i o l v a s s a $query =

az a d a t b z i s b l

az r la p

e l llt s h o z

$ d a * a = r a y s q l i _ q u e r y ($ d b c , S q u e r y ) ; $ r e s p o n s e s a r r a y ! ); w h i l e ( $ r o v = m y s q l i _ f e t < 2h _ a r r a y ( $ d a t a ) ) { a r r a y _ p u s h ($ r e s p o n s e s , $ r o w );

most itt vagy 479

a gyakorlat megoldsa s nem hlye krdsek

Az albbiakban lthat a kd, am ely az sszekapcsolsok gyes alkalm azsval k pes a vlem nyadatokat egyetlen lekrdezssel kiolvasni az adatbzisbl. Lgy te is gyes, s rd m eg az SQL-lekrdezst, amely elvgzi a m is m a tc h _ re s p o n s e ,

Gyakorlat - megolds

m is m a t c h _ t o p ic s m is m a tc h _ c a te g o r y tblk sszekapcsolst!

./ / A v le m n y a d a to k k io lv a s s a
$query

az a d a tb z is b l az r la p
'

e l llt s h o z

"SE L E C T m r.respcm sejcl, mr.-fcpidjd> m r.response,

.
Az els sszekapcsols
forrsknt

A lekrdezst lnevek segts gvel egyszer stjk s tesszk $ d a t a - m y s q l i _ q u e r y ( $ d b c , $ q u e r y ) ; $responses = array(); kicsit knnyeb w h i l e ( $ r o w - m y s q l i _ f e r c h _ a r r a y { $ d a t a >) { ben olvashatv. a r r a y _ p u s h ($ r e s p o n s e s , $ r o w );

"FROfA r*ismatdh_jrespo*se AS r . ''INNER JOIN AS USlNj f*top'id id) . ''INNER JON misma^K^acjovy AS m XSIN} (daiejov-yjd)" 'W r e mr.uscrja - V /_ s ^ o N ru s c rja ;i i . ^ V

beemeli a t mk tbljt a lekrde zsbe, hogy a tmaszon*sft szerint kikereshess* belle a tmanevekei

}
A lekrdezs eredmnyeknt ka pott sszes adatot a $responses tmbben troljuk.

A msodik sszekapcsols a kategriatblt drtozza be 3 lekrdezsbe a kateg riaazonost segtsgvel, ami lehetv teszi a kategrianevek elrst.

Nincsenek

hlye krdsek

! A bels sszekapcsolsok egyb fajti az egyenlsgi sszekapcsolsok (equijoin). az egyenltlensgi ssze kapcsolsok (non-equijoin) s a termszetes sszekapcsolsok (natural jin). Az egyenlsgi s egyenltlensgi sszekapcso lsok egy egyenlsg- vagy egyenltlensgvizsglat alapjn hajtanak vgre bels sszekapcsolst; az egyenlsgi ssze kapcsolsra mr szmos pldt lthattl azokban a Mismatchlekrdezsekben, amelyek a t o p i c _ i d s c a t e g o r y _ id oszlopokat feleltettk meg egymsnak. Mivel a megfeleltets egyenl" oszlopokat (egyez azonostt) ignyel, ezek a le krdezsek egyenlsgi sszekapcsolsnak szmtanak. A bel s sszekapcsolsok harmadik fajtja a termszetes sszekap csols, amelyben minden olyan oszlopot sszehasonltunk, amelyeknek kt tblban ugyanaz a neve. A termszetes sszekapcsols teht valjban csupn egy olyan egyenlsgi sszekapcsols, amelyben az sszekapcsolst meghatroz oszlopok megvlasztsa automatikusan trtnik. A termszetes sszekapcsolsokat ez az automatikus mivoltuk kevsb kvnatoss teszi a norml bels sszekapcsolsoknl, mert rnzsre nem nyilvnval, hogy mi trtnik - az adatbzis szerke-

K ! Milyen tpus sszekapcsolsok lteznek mg? V

zetnek vizsglata szksges ahhoz, hogy megllaptsd, h o g az sszekapcsolsban mely oszlopok vesznek rszt.

Vagyis az SQL-ben minden sszekapcsols csupn a becs: sszekapcsolsok valamelyik vltozata?

! Nem, szmos msfajta sszekapcsols is a rendelkez sedre ll. Az sszekapcsolsok msik f csoportjt ssa foglalva kls sszekapcsolsoknak (outer jin) nevezik, de d * e a csoportba is tbb klnbz tpus sszekapcsols tan zk, Vannak bal kls sszekapcsolsok (leit outer jin), jobb sszekapcsolsok (right outer jin), teljes kls ssze sok (full outer jin), s van a ritkn hasznlatos, de b o m b a s* kus nev hrmas spirl ktkezes sszekapcsols. Na j. h * r nem ltezik, pedig kellene! A kls sszekapcsols elve z. hog)' az sszekapcsolt tblk sorainak nem kell illeszkedni ahhoz, hogy bekerljenek az sszekapcsolsba, teht le h e a ges olyan kls sszekapcsolst meghatrozni, amely egy i l lbl mindig kivlaszt sorokat, fggetlenl az egyezsi fc lektl. A kls sszekapcsolsok ugyanolyan hasznosak nek. mint a belsk - ez csak az adott adatbzis-alkalmaz nyeitl fgg. Ha tbbet szeretnl tudni a klnbz faj sszekapcsolsokrl s azok hasznlatrl, vedd meg a r:\w First SQL cm ktetnket.

480

8. fejezet

Urald az adataidat, s uralni fogod a vilgot!

Dolgozd t a Questionnaire parancsfjlt gy, hogy a felhasznl vlemnyeit egyetlen lekrdezssel olvassa ki!
Mdostsd a q u e s t io n n i r e .p h p parancsfjlt gy, hogy bels sszekapcsolsok segtsgvel egyetlen lekrdezssel olvassa ki a felhasznl vlemnyeit, tltsd fel az j parancsfjlt a webkiszolgldra, majd nyisd meg a krdvet a bngszdben. Ha minden jl ment, semmilyen vl tozst nem szabad szrevenned - pedig a szved mlyn tudod, hogy a parancsfjl kdjnak fel ptse most mr sokkal jobb! ______
alig vrom, hogy kltltsem a krdvet, m

Tesztut

) o e t,^ \ hogy e lt n te k azok a fura kategrikl


6,

A normalizlt Mismatch-adatbzis az j kategriatblnak ksznheten sokkal- ^


k e v sb r , k e n y a h ib k f a .

mismakfitopU
responsejd response user_id to p ie jd fo p ic id
name

I* -

category**

How do you fed about each topic? Appearance

Tattoos: Gold chains: Bod> piercings: Cowboy bouts: Long hair: - EntertainnKnt^- Reality TV: Professional wrestling:

OLove MHac ;Love 0Hatc CLove Hate Love G Haie 0Love OHttc

A Mismateh-krdv dinamikusan jn
0 Love Hate

ltre a vlemnyek, tmk s kateg rik tblibl - a sznfalak mgtt nhny sszekapcsols segtsgvel.

G Love #Hatc QLovc iHatc 0 Love C Haw @Love QHaic


----- -----99

Hst, hogy az ada tok nem ismtldnek adatbzisban, az rlap sokkal k vetkezetesebb, s *zrt a felhasznlo'k szmra kevsb za varos.

Horn- movies:

r-FoodSoshi: Spam: Spicy food:

The opera:

Peanut butter & banana sandwiches: C Love 0Haic Martinis: @Love Hrnc

i K

0 Love O H jLovc 0Hatc ^Lovc OHatc

most itt vagy > 481

itt az ideje, hogy sszeboronld a prokat

K it lt t t e m a krdvt, de hol az e lle n t tp ro m ? T re lm e tle n l vrom...

Sidney krdve ki

r Food-rm: Sd u lj;
Spam:
s P k \ food:

M mtc is a h
@Lovc OHaie Ol-ovc Hate

tltve s elraktroz va kszen ll arra, hogy megkeresd az ellenttprjt.

O o CHw L ve e
O L ove

Peanut b u iit r & banana sandwitf


Martin;

0 Hafc

Love CHatc

Howard Stem:

Love 0 H r Love OHac Love QHatc

H G ie ffl a s;

B rb raS fc a a tre * ,
i lluKh H e fn e r:
m a rtb a

C Jvc H a ie

Stewart-

Love o h a? n
* L o v c OHatc
Love 0H aic

Love Q Hatc
Karaok Hiidng;
C Love H aie
L o v c OHate

A Mismatch alkalmazs most mr emlkszik a felhasznlk vlemnyeire, de mg semmit sem tud kezdeni velk - pldul nem tudja megkeresni az ellenttprokat!
A felhasznli vlemnyadatok sszegyjtse csak fltig juttat el minket a sikeres flreprosts fel. A Mismatch alkalmazsbl mg hinyzik az a kpessg, hogy Cupido nyilt az adatbzisba lje, s szerelmesprokat alkosson. Ehhez valahogy meg kell vizsglnod az adatbzisban szerepl sszes fel hasznl vlemnyeit, hogy megtalld az idelis ellenttprokat.

482 8. fejezet

Urald az adataidat, s uralni fogod a vilgot!

A z id e lis ellenttprok megtallsa elg nehznek t n ik emellett a sok kategria, tma s vlemny mellett, biztos , hogy meg lehet csinlni?

Egyrtelmen lehetsges - csak a megfelel mdszerre van szksg, amivel kiszmthatjuk, hogy kt felhasznl hny t mban nyilvntott ellenttes vlemnyt.
Ha tallunk egy kellen egyszer mdszert annak kiszmtsra, hogy kt felhasznl hny tmban nyilvntott ellenttes vle mnyt, akkor egy ciklussal vgigmehetnk a felhasznlk adatbzi sn, s sszevethetjk a felhasznlkat. Egy felhasznlnak az a szemly lesz az idelis ellenttprja, akinek a vlemnye a leg tbb tmban eltr az vtl.

Ellenttpr!

rd le, hogy miknt szmtand ki kt felhasznl ellenttprba llthatsgt a Mismatch adatbzisban trolt adatok alapjn:

most itt vagy 483

az (ellentt)prost logika

/\ szerelem 3 szmoktl f ()9


Ha mg emlkszel r, a vlemnyeket a m ism atch_response tblban szmokknt troljuk; a 0 , 1 s 2 rtknek egyarnt meghatrozott je lentse van:

m ism afch_respon$e
resp o n s e jd response

Is m e r e tle n = 0

S ze re te m = 1

U t lo m - 2

u s e r jd ^ to p ic jd

Ezeknek az adatoknak az alapjn szmtjuk ki, hogy kt felhasznl el lenttprba llthat-e, mgpedig gy, hogy olyan sorokat keresnk, ahol az egyikk esetben a szeretem ', mg a msiknl az utlom" r tke szerepel, s viszont. Mskpp fogalmazva, azokat a sorokat igyek sznk megtallni, amelyekben a response oszlop az egyik helyen 1 , a msikon 2 rtket tartalmaz, vagy fordtva.

Ezekben a sorokban a msodik oszlop trolja a vlemnyt, ami 0 (nincs), I (szeretem) vagy 2
tnilnm) aK I, a

- '* I

Ellenttpr!

Itt ugyanahhoz a tmhoz (Reality TV) az egyik helyen a lve (t), a msikon a hat (2) vle mny tartozik, ami ellenttprt eredmnyez.
A PHP-kdbl azonban mg mindig hinyzik egy knyelmes mdszer annak megllaptsra, hogy kt vlemny mikor llthat ellenttpr ba. Termszetesen sszerakhatnnk kt if - e ls e utastst az 1 s 2, majd a 2 s 1 rtkek vizsglatra, de ennl elegnsabb megolds is l tezik. A kt vlemnyrtk sszeadsa mindkt esetben 3-at eredm nyez, ezrt egy egyszer egyenlettel kiderthetjk, hogy a kt vle mny ellenttes-e:

Ha VlemnyA + VlemnyB = 3, akkor ellenttprt tala'ltunk!


A leend szerelmesprok megtallsa teht egyszer matematika. Ezzel megoldottuk az egyes tmkkal kapcsolatos vlemnyek sszevets nek problmjt, de azt mg nem, hogy tnylegesen hogyan pthetjk fel a prba llt parancsfjlt.

484 8 . fejezet

Urald az adataidat, s uralni fogod a vilgot!

A sikeres flreprosts t lpse


A tkletes ellenttpr megtallsa nem csak a vlemnysorok ssze hasonltsn mlik. A sikeres flreprostshoz a prba llt parancs fjlnak ( My Mismatch) gondosan megtervezett lpseket kell kvet nie. Ezek a lpsek jelentik a kulcsot a felhasznlk kielgtse fel, s adnak rtelmet a krdven megadott adatoknak.

Kiolvassuk a felhasznl vlemnyeit a mismatch_response tblbl, s a t maneveket sszekapcsoljuk az eredmnyekkel. Elksztjk a keressi eredmnyeket, belertve a legjobb ellenttprt" rgzt vltozkat.

Egy ciklussal vgighaladunk a felhasznlk tbljn, s sszehasonltjuk a tbbiek vlemnyeit a felhasznl v laszaival. Ehhez az adatbzisban szerepl sszes sze mly vlemnyeit ssze kell hasonltanunk a felhasznl megfelel vlemnyeivel. Azt, hogy a felhasznl hny ellenttes vlaszt adott az egyes szemlyekkel, egy pontszm" kveti nyomon.

A ciklus minden ismtlsekor megvizsgljuk, hogy az adott ellenttpr jobb-e az addigi legjobb ellentt prnl. Ha igen, az adott prt legjobb ellenttpr knt" elraktrozzuk, az ellenttes vlemnyt kivlt tmkkal egytt.

A legjobb ellenttpr" megtallsa utn egy lekrde zssel tbb informcit szerznk a felhasznl prjrl, s megjelentjk az eredmnyeket.

most itt vagy 485

a felhasznlk vlemnyeinek kiolvassa s a keressi eredmnyek elksztse

Felkszls az ellenttprok keressre


Az 1. lps ismers terep, mivel mr rtunk olyan lekrdezseket, amelyek ehhez ha sonl sszekapcsolst hajtanak vgre. Ugyanakkor el kell raktroznunk a felhasznl vlemnyeit, hogy a parancsfjl ksbbi rszben (3. lps) sszehasonlthassuk azo kat a tbbi felhasznl vlemnyeivel. Az albbi kd egy $user_responses nev tmbt pt fel, amely a bejelentkezett felhasznl vlemnyeit trolja:
$query = "SELECT m r .response_id, mr.topic_id, mr.response, mt.name AS topic_name " . "FR0M mismatch_response AS mr " . INNER JIN mismatch_topic AS mt " . "USING (topic_id)
-W HERE

Ez a lekrdezs egy JIN segtsgvel a fel* hasznl sszes vlem nyt kivlasztja.

" .

m r . u s e r _ id = ' "

. $_session[ ' u s e r _ id ' ] . ^

Egy while ciklussal vgigmegynk a lei e- sorain, tfd #S f n y n - k ---- ' s kz' ben felptnk egy tmbt a felhasz nl vlemnyeibl

$ d a ta = m y s q li_ q u e r y ( $ d b c , S q u e ry ) ;
$user_responses = array();

w h ile

($row = m y s q li_ fe tc h _ a r r a y ($ d a ta )) {

a rra y push($user responses, $row );

AmiLa^ fk ciklus u n o i Amikor a int/lii* vget a $userjres|>onse$ tmb a felhasznl sszes vlemnyt tartalmazni fogja.

a mismatch_response tblbl, s a t maneveket sszekapcsoljuk az eredmnye

A Mv Mismatch parancsfjl felptsnek 2. lpse nhny vltoz belltst ignyli, amelyek az ellenttpr-keress eredmnyeit troljk majd. Ezeket a vltozkat az egsz My Mismatch parancsfjlban hasznlni fogjuk, mikzben igyeksznk megtallni a legjobb ellenttprt:
$mismatch_score = 0; $mismatch_user_id = -1;

Ez a vltoz trolja kt felhasznl ellenttpontszmt - a legmagasabb pontszn eredmnyezi a legjobb ellenttprt.

$mismatch topics = array()/


"

Ha ennek a vltoznak a keress vgn az rtke, tudni fogjuk, hogy nem tal lenttprt - ez csak akkor fordulhat el* senki ms nem tlttte ki a krdvet, gyn valszntlen.

Ez annak a szemlynek a felhasz nl-azonostja, akit ppen vizs glunk, mint lehetsges ellentt prt. A keress vgeztvel ez a vltoz a legjobb ellenttpr azo nostjt fogja tartalmazni.
s

Ez a tmb trolja azokat a tm kat, amelyekrl a kt felhasznl ellenttes vlemnyt formlt.

Elksztjk a keressi eredmnyeket, belertve a legjobb ellenttprt" rgzt vltozkat.

486 8. fejezet

Urald az adataidat s uralni fogod a vilgot!

A felhasznlk ellenttessgnek" vizsglata


Az ellenttprok keressnek kvetkez lpse, hogy egy ciklussal vgighaladunk z sszes felhasznln, s sszehasonltjuk a vlemnyeiket a bejelentkezett felhaszn l vlemnyeivel. Ms szavakkal, fogjuk a bejelentkezett felhasznlt vagy prkerest (mondjuk Sidney-t), s a felhasznlkat tartalmaz teljes tbln vgighaladva sszevet ek a vlemnyeit minden prjelltvel. Azt a prjelltet keressk, akinek a vlemnye a legtbb tmban tkzik a prkeresvel. De hol kezdjk? Mi lenne, ha egy olyan ciklust hasznlnnk, amely i $user_responses tm bt (a prkeres vlemnyeit) jrja vgig? A ciklus belsejben sszehasonlthatnnk az egyes elemek rtkt egy msik, a prjellt vlemnyeit trol tmb megfelel elemeivel. Hvjuk ezt a msodik tmbt $mismatch_responses-nek.

Ez a tmb a bejelentkezett felhasznl, vagyis a prkeres vlemnyeit trolja.


$ u s e r re s p o n s e s
1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8
( Hate Hate Hate Love Love Love Hate Hate Tattoo^!'! G old c fvins Body J j Ircings Cowfct)f boots L o | hair Rccsf*k ' T V Profession! jtWestling Horror

Ez a tmb egy az adatbzisban szerepl msik


^
$mi sma tch__r espons es

felhasznl, a prjellt vlemnyeit trolja.

Ez a tmb aszerint vltozik, ahogy a prkeresot ms-ms prjelltekkel vetjk ssze.

Ezt a kt tmbt egyidejleg kell bejrnunk, osszehasonltva az azonos tmra adott vlaszokat, hogy lssuk, hogy megegyeznek vagy kiilnboznek-e.

A kihvst itt az jelenti, hogy egy olyan ciklusra van szksgnk, amely lnyegben egyidejleg halad vgig kt tmbn, egyenknt sszehasonltva azok megfelel eleme it. Egy fo reach ciklus nem mkdne, mert az csak egyetlen tmbt tud bejrni, ne knk pedig egyszerre kell vgigmennnk a kt tmbn. A w h ile ciklus mr jobb v laszts lenne, de akkor ltre kellene hoznunk egy szmll vltozt, s sajt kezleg kellene nvelnnk az rtkt a ciklus minden ismtlsekor. Az idelis egy olyan ciklus lenne, amely nm kden nveli a szmll vltozt, hogy elrhessk a tmbk egyes elemeit.

while (...) {
Nem mVdne! Mkdne, de nem ppen idelis.
m ost itt vagy 487

bem utatkozik a f r ciklus

Csak egy FR ciklusra van szksg


A PHP szerencsre egy msik ciklusfajtt is knl, amely pontosan azt a kpessget nyjtja, amire a My Mismatch parancsfjlban szksgnk van a vlem nyek sszehasonltshoz. Ez a ciklus a f r , amely nagyszeren alkalmas egy mvelet ism ert szm ism tlsre, gy szmllsi feladatokra, pldul visszaszmllsra nullig vagy elreszm llsra egy adott rt kig. m e a f r ciklus szerkezete, am elybl kiderl, hogy miknt pthetsz fel egy ciklust, amely egy szmll vltoz ( $ i ) segtsgvel halad vgig egy tm bn: T e s z tfe lt te l Csak akkor hajtjuk vgre ismt a ciklust, ha a tesztfelttel ered mnye true, vagyis ha a $i r tke kisebb, mint a felhasznli vlem nyek szma.

E lkszts A ciklus m egkezdse. A $ i szmll kezdrtke 0.

Frissts A ciklusszmll ( $ i ) nvelse 1-gyel.

A ciklus meg kezdse elftt kezdrtkei adunk a ciklus szmllnak.

fr ($i = 0; $i < count($user responses) ;


A countf) fggvny egy tmb elemeinek

A ciklusszmL

rt

Minden, ami a kapcsos zr jelek kztt ll, a ciklus minden ismtlsekor lefut.

szmt adja vissza, amit a ciklus teszt felttelnek rszeknt hasznlunk fel.

kt eggyel nt etjk A kd egyenrtk az zal, mintha ez rnnk: $i = $i + l .


fl

Gyakorlat
$user_responses

A My Mismatch parancsfjl 3. lpsben kt felhasznlt kell sszehasonltanod, vgighaladva a vlemnyeiken, s kiszmtanod egy pontszmot (score) annak alapjn, hogy hny eltr vlemnyt talltl. Az albbi adatokat alapul vve eg sztsd ki az emltett pontszmot kiszmt f o r ciklus kdjt: $ m is m a tc h _ re s p o n s e s A lehetsges prjellt vlem nyeinek tmbje.

$score
A ciklusban kiszmtand ellenttpontszm.

A felhasznl vlem nyeinek tmbje.

fr ($i = 0; $i < count($user_responses); $i++)

{
) (

if (

array_push($topics, $user_responses[$i][1topic_name])/
) )

488 8. fejezet

U ra ld az adataidat, s u ra ln i fogod a vil g o t!

Nincsenek

hlye krdsek
! M irt nem hasznlunk a fr helyett egy egyszer foreach ciklust a pontszm kiszmtsra? ! Br egy foreach ciklus tkletesen m egfelelne a klnbz
vlem nyek bejrsra, a ciklus egyes ismtlseihez nem bizto stana indexet ( $ i) . Mrpedig ez az index lnyeges, mert a kd egyarnt felhasznlja a felhasznli vlem nyek tm bjnek, il letve az ellenttprok tm bjnek elrsre. Egy foreach ciklus csak az egyik, s nem mindkt tmb esetben lenn szksgte lenn az indexet, ezrt egy szabvnyos, indexszel rendelkez fr ciklust kell hasznlnunk, amellyel mindkt tmbben hoz zfrhetnk a hasonl elemekhez.

! Mi a clja annak, hogy az ellenttes vlemnyeket kln tmbben troljuk?


! Az ellenttprok tm bje azrt fontos, mert ebbl tudhatjk meg a felhasznlk, hogy mely tmkban tkztt a vlemnyk az idelis ellenttprjukkal. Nem elg csak az idelis ellenttpr szemlyt kzlni - ennl sokkal jobb, ha konkrtan meg mondjuk, hogy mely tmkrl alkottak ellenttes vlemnyt. Ez nmileg pontosabb teszi az eredmnyt, s a felhasznlk kicsit tbbet tudhatnak meg arrl, hogy az adott szemly min idelis ellenttpr a szmukra.

K
r
j

i A M ism atch parancsfjl 5. lpsvel kapcsolatban lenne egy krdsem: tnyleg lehetsges, hogy egy felhasznlnak egyltaln ne legyen ellen ttprja?
ni, amikor az egsz rendszerben csak egyetlen felhasznl sze repel, mely esetben senki mssal nem lehet sszeprostani.

V ! Br valszntlen, azt a forgatknyvet is figyelembe kell ven

m ost i t t vagy

489

G yakorlat

- m egolds

Gyakorlat - megolds

A My Mismatch parancsfjl 3- lpsben kt felhasznlt kell sszehasonlta nod, vgighaladva a vlem nyeiken, s kiszmtanod egy pontszmot (score) annak alapjn, hogy hny eltr vlemnyt talltl. Az albbi adatokat alapul vve egsztsd ki az emltett pontszmot kiszmt f r ciklus kdjt:

$user responses
Tattoos G o ld chains B ody piercings

$mi sma tch__respons es


T attoos G o ld eh ains
p o a y p ie rcings

C o w b o y boots C o w b o y boots Long h a ir

7 8 8

Hate Hate

Professional w re stling H o rro r movies


Profession a l wrest H o rro r movies

$score

Ne feledd, hogy a fe l hasznli vlemnyek sz ma megegyezik a tmk A pontszmot minden ellenttes vlemny megtallsakor nveljk. teljes szmval, mivel a vlemnyek egyenesen a krdvrl szrmaznak.
{

A $score vltoz rtke a 0 (nincs ellenttpr) s a tmk teljes szma (tkletes ellenttpr) kz eshet.

for ($i = 0; $ 1 < count($user_responses); $i++) if ( fuS\r_


. f . 7 7 . J ...........

array_push ($topics//^user_responses [$i] ['topic_name ] ); /


*

Minden ellenttpr egy szeretem-utlom (1 -2 ) bl ll, ezrt ha sszeadjdl! ket, az eredmny mindig S lesz, ami ellenttet jelez.

Minden olyan tmt, Az egyes vlemnyeken a ciklusszmll segts gvel haladunk vgig. amelyrl ellenttes vle mnyt talltunk, egy tmbbe helyeznk, hogy megjelenthessk a fe l hasznl szmra, amikor felfedjk eltte az ellen ttprjt.

Egy ciklussal vgighaladunk a felhasznlk Ijn, s sszehasonltjuk a tbbiek vlem it a felhasznl vlaszaival. - -

490 8. fejezet

Urald az adataidat , s uralni fogod a vilgot!

A flreprosts befejezse
Az ellenttpontszmot kiszmt vadonatj ciklus egy nagyobb parancsfjl (nym ism ateh.php) rsze, amelynek feladata, hogy megtallja egy felhasznl idelis ellenttprjt a Mismatch adatbzisban, majd m egjelentse az informcikat.

Ez a parancsfjl t l l a meg a fl aj e*
h a s zn l

tkletes

e lle n t tp r j t.

mymismatch.php

// Csak akkor keresnk ellenttprt, ha a felhasznl kitlttte a krdvet


$ q u e r y - "SELECT * FRQM mi sma l ch__response WHERE u s e r _ i d = 1" . $_SESS ;0N [ ' u s e r _ i d ' ] $ a a ta - mysqli query($dbc, Squery); Cs^k
f f f f f

azoknak a felHasznlknak lehet megtallni

i f (mysqli_num_rows($d ata) ! 0) {

07 ollpnf^iDsrit akik kitltttk a krdvet. az elienetparjaT, axu miv

// Elszr kiolvassuk a felhasznl vlemnyeit a vlemnyek tbljbl // (s egy JOIN-nal sszekapcsoljuk azokat a tmk nevvel)
S q u e r y - "SELECT mr. r e s p . n s e _ i d , m r. t o p i c _ i d , m r . r e s p o n s e , mt.name AS t o j i c name "

" FKO mismatch response AS mr " . M


Q "INNER JOIN nii sma Lch_ Lopi>j AS int " . "USING ( t o p i c _ i d ) " . .

A tma nevt egy ismer JOIN-nal ol s vassuk k, amikor kivlasztjuk a felhasz i nlnak a k r v e adott vlaszait. d r

"WHERE m r. u s e r _ i d = ,H . $ SESSION[ u se r i d J $ d a t a - m y s q li q u e r y (Safcc, S q u e r y ) ; 3user responses = a r r a y ( ) ; w hile ($row = m y s q l i _ f e t c h _ a r r a y ( $ d a t a }) {

a r r a y _ p u s h ( $ u s e r _ r e s p o n s e s , $row) ;

A $user_re$ponses tmb trolja a felhasznl sszes vlaszt

// Elksztjk a keressi eredmnyeket


$rr.i s m a t c h _ s r : o r e ';

^mismatch u s e r i d - - 1 ;
$

rr i smat topi cs - a r r ay ( ) ; h

Ezek a vltozk kvetik nyomon a prkeress folyamatt.

Itt mg korntsincs vge - lapozz!

m ost i t t vagy

491

a te lje s my mismatch.php parancsfjl

// Egy ciklussal vgi ghal adunk a felhasznlk tbljn, sszehasonltva // a fel hasznlvlemnyeit a tbbiekvel
$ q u e r y = "SELECT u s e r _ i i FROM mismatch u s e r WHERE u s e r _ i d != 1" . $ SESSION[ u s e r _ i d '1 $ddta = m y s q l i _ q u e r y ( $ d b c f $ q u e r y ) ; while ($row = m y s q l i _ f e t c h _ a r r a y ( $ d a t a ) ) {

V
ti r rt

Ez a lekrdezs a prkeres: fel hasznl kivtelvel az * fel hasznlt kivlasztja.

// Kiolvassuk a felhasznl vlemnyadatait


$ q u er y2 - "SELECT r e s p o n s e _ i d , top ic id ,

{lehetsges ellentteket keresve)

r e s p o n s e KRM m i s m a t c h _ r e s p o n s e .

"WHERE u s e r i d = ' . $ r o w \ ' u s e r i d ' ] $ d : it a 2 - m y s q l i _ q u e r y ( $d b c, $-juery2);

$misinatch_responses = a r r a y ( ); while ($row2 = m y s q l i _ f e t c h _ a r r a y ( $ d a t a 2 j ) {

a r r a y p u s h ( $misraatch r e s p o n s e s , $ r o w 2 ) ;

Ez a lekrdezs minden fel hasznl esetben kiolvassa a k r v e adott vlaszokat, d r hogy megkereshesse a lehet sges ellentteket.

Ez a kapcsos zrjel j l i ez a f'while ciklus vgt.

// sszehasonltunk minden vlemnyt, // s kiszmtjuk az ellenttpontszmot


$score - 0;

Ez a for ciklus szmtja k j l l ellenttpontszmt. et

pr

~ array ( } ; for il ($i 0; $i < count($user_responses); $i++) {

2
'V A szveges vlaszt (pldul: ' ' 2) egy egsz szmm (2) alaktjuk (cast), hogy sszeadhat s t sszehasonlthat legyen.

( ( ( i n t ) $ u s e r r e s p o n s e s f$i

response*])

+ ( (int)Sm ism atch_responses[$iT[ response*]) = 3 ) {

$s o o r e 4= i;
array_push ($t o p i c s , ) 1 $user_rsponses[$i]

T:opic_naine ] ) ;

// Megvizsgljuk, hogy az adott felhasznl jobb-e az eddigi legjobb ellent prnl


i? ( 3 s c o r e > $mis.match s c o r e ) {

// Jobb ellentprt talltunk, ezrt frisstjk a keress eredmnyt


$mi s m a ~ ch _s c o r e = $ s c o r e ; $mismatch -iser i d - S r o w p j s e r i d ;

Ha ez a felhasznl jobb ellenttpr, mint az eddigi legjobb, l t u be legjobb ellenttprknt. t ljk


0);

m f-M
1

Smismatch ~ o p i c s - a r r a y s l i c e ( $ t o p i c s ,

Ez a fggvny egy tmb egy szelett nyeri k i - it csak arra hasznljuk, hogy a $topics tm t bt a $mismatch_topies tmbbe msoljuk. Mg mindig az elz' oldalon megkezdett i f utastsban va gyunk - s mg mindig nines vge a kdnak...

492 8. fejezet

// Ellenrizzk, hogy ta l ltu n k e


// ellenttprt

if ($mismatch_user_id != -1} {

Mieltt m e g ji-

(jelentennk a |>rkeress eredmnyt, ellenrizzk


nttort"

hogy valban talltunk-e legjo

$query = "SELECT username, f i r s t _ n a m e ,


"WHERE j s e : i d -

last_nam e, c i t y , S t a t e , p i c t u r e FRCM mismatch_user "

1Smismatch u s e r i d M T;

$data = mysq11_ q u e r y ($dbc, $ q u ery ); if (mysqli_num_rows($data) ~ 1) {

Lekrdezzk az ellenttpr ada a t hogy ti, megjelenthessk azokai.

// Az ellenttprhoz talltunk felhasznlt, ezrt megjelentjk az adatait


3row - mysqli e t c h _ a r r a y ($ d a t a );

echo 1<table x t rxtd class="lafcel">T; i (!empty($row[1first name1] && !empty( ) $row[1last name1])) { echo $row['first name'J . 1 ' . $row['last name'J . * <br />';
} if (! empty { $ row[* c i t :y ' ] ) && ! empty ($ row \ 1s t a t e 1 ] ) ) ' . $row[ ' s t a t e ' J . {

Megjelentjk a f l ehasznl nevt.

echo $ro w [ c i t y 1]
}

*<br / > ' ;

Megjelentjk a felhasznl v rost s llamt.

echo </t d x t d > 1;


il (! empty( Srow[ 1p i c t u r e ' J )) { " alt= "P rofile P i c t u r e " /><br />

ech o ' <img r e - " 1 . M UPLOADFATH . $ r o w [ ' p i c t u r e 1J M }

echo f</'td></tr></table>f ;

Ne felejtsnk e ltrehozni egy l < mg> elemei a felhasznl kp

// Megjelentjk az ellenttes vlaszt kapott tmkat


echo r<h4>You are mismatched on t h e fo llo w in g . co u n t($ m ism atch _to p ics) f o r e a c h ($mismatch t o p i c s as $ t o p i c )
ech o

. * to p ics:< / h 4> *

$t o p i c

/>'; <br

Fontos, hogy megmutassuk, hogy pontosan mely tmk eredmnyeztk az ellenttprt.

// Megjelentnk egy hivatkozst az ellenttpr felhasznli profiljra


echo '<h4>View <a h r e f = v i e w p r o f i l e . ph p? user_id=-f . $rr:is ma tch _u se r_i d . ' \ s profile</a>.</h4> ; '> .

Srow[*fir st_ n a m e ] .

} el s e {

Vgl megjelentnk egy hivatkozst, amely az ellenttpr felhasznli pro f l a mutat, hogy a bejelentkezett f ijr el hasznl tbbet tudhasson meg r l . a
echc

f <p>You must f i r s r <a h r e f = nq u e s i o n n a i r e . p h p l,>answer t h e q u e s t i o n n a i r e < / a > b e f o r e you cari

rbe m i s m a t c h e d . < / c > 1 ;

m ost it t vagy

493

lssuk a p ro ka t !

Keresd meg a tkletes ellenttprt!


Mdostsd a Mismatch alkalmazst, hogy az j My Mismatch parancsfjlt hasznlja (vagy tltsd le az alkalmazs kdjt a Head First Labs webhelyrl, a www. headfirst labs.com/boks/hfphp cmrl). Ehhez ltre kell hoznod az j nymisma teh. php parancsfjlt, valamint fel kell venned a My Mismatch (Az n ellenttprom) menpontot a navmenu.php parancsfjlba, hogy a fel hasznlk hozzfrhessenek a parancsfjlhoz. Tltsd fel a parancsfjlokat a webkiszolgldra, s nyisd meg a Mismatch alkalmazs foldalt (index.php) egy bngszben. Jelentkezz be, tltsd ki a krdvet, majd kattints a My Mismatch menpontra az ellenttprod megtekintshez. ^

Fogalmam sem volt,


-* 1 :% ^ __ .. v,,,ry.:

V
\
foR in* 22 top: o^

hogy ilyen vonzo lesz, de nem tudok ellenllni


-----________________ Q

____

Jban My Mismatch oldala Sidney-t dob ja ki Johan tkletes ellentteknt.


Tacoon chains
placing s

A n C E L ~ th *. .A ______^cl,cd n n

Johannk!

j >

Reaiiry TV ProfcssJuaaJ w Horror : c o \ k s

m i!m *

Annyi mindenben klnbznk... miceoda c u ko rfa la t!

Tan
Goid ch't Body piercicp

R irs T ca V
Tbc opera SushJ Spao>

Profc>siof.si WI' ;?iHv5

Hm tr>ovK s

E * iy lisen w g O L i n

tw U ca y v M ia
Peanut bu-.t& &

T)K OCl pT
Sonhi Spur

HG iU ate,
Yng

Pcauui bitd A Martinis Ho^inJ Stem

h tia m

Mannm Hermid Stcnj


a iT iO a tci

Bsrtara StrcAwJ
H u*h HcJncr M a itla Stcwitft ^

Hg Hvlixt uh
Manha S it w

H ature Soc;4ar.i
m

Yoga

Cube pui/ics Karaoke Hikiug

W h ritx g cig n

W eighing
Cube p u x ii

Karaoke
Hiking

Amikor Sidney megnyitja a My Mismatch oldalt, az ltja, hogy Johan a tk letes ellenttprja.

Urald az adataidat, s u ra ln i fogod a vil g o t!

Adatbzissma-mgnesek
Emlkszel mg a rges-rgi Guitar Wars alkalmazsunkra? A feladatod most az, hogy tanulmnyozd a Guitar Wars adatbzist, amire szintn rfrne a normalizls, s dolgozz ki egy jobb smt a szmra. Az oldal aljn tall hat htmgnesek felhasznlsval tervezd meg a tbla- s oszlopneveket, s azonostsd az elsdleges s idegen kulcsokat!
G u itar VVim - Mfeb

A rekordok megjele ntst a Guitar Wars foldaln az adatbzis vezrli.

'tfcrn.Ortnr n ltet. < v xt.* th . x <

Top Score: 465730

Az eredeti Guitar V/ars adatbzis, amely a felhasznlk ltal bevitt rekordpontszmokat trolja.

465730

r 3sto?

>9 4 870 im m k

W5 .-* tO tSQ U iW Score: 4fc*?30

N .U . m W

N ctet

Itt ptheted fel a mgnesek se gtsgvel az j, javtott semat. Sok szerencst!

mosf /ff vagry > 495

Adatbzissma-mgnesek

- m egolds

Emlkszel mg a rges-rgi Guitar Wars alkalmazsunkra? A feladatod most az. hogy tanulmnyozd a Guitar Wars adatbzist, amire szintn rfrne a normaliz ls, s dolgozz ki egy jobb smt a szmra. Az oldal aljn tallhat htmgnesek felhasznlsval tervezd meg a tbla- s oszlopneveket, s azonostsd az elsdleges s idegen kulcsokat!
1
(auiU r W f f f - lli^ h Scorr>

A rekordok megjeleni

a Guitar Wars fooldalm az adatbzis vezrli.

A tblbl hinyzik az e l s 'dleges kulcs, ami min den normalizlt adatbzis fontos rsze.

fliiilnrw ars
Top Score: 465730

name
Uippt

screenshot

leo r f .

U iP * :

felhasznl tbb rekordot i f s ip oszlop i m t adatokhoz sl d A tblk nevet kapnak j mivel immr konkrtabb clokat szolglnak. Az scorejd osz j lop szolgl a rekor dok tbljban e gt en szksges e s d l leges kulcsknt.

JtrtW nsv M

A jtkosok nevt s jk a kereszt- s v nvre, hogy atomi _ kt kapjunk, s csak szer troljuk t k, e lenl a t l hogy h* t, kordot tltttek fel.

A rekordok tbl j egy j idegen a


kulcson keresztl

hivatkozik a jt kosokra.

A felhasznlk nevnek ismtl dst gy oldjuk meg, hogy l t rehozunk egy t b , amely j lt a jtkosok nevt t r l a s egy oj, kulcson keresztl kapcsolja t k e a rekordok tbljhoz.

Gondoskodj rla, hogy az oszlopaid atomi adatokat tartalmazzanak! Minden tblt lss el sajt elsdleges kulccsal! Gondoskodj rla, hogy a nem kulcs oszlopok ne fggjenek egymstl!

A Guitar Wars adatbzisban nem voltak f gg oszlopokkal kapcsolatos problmk.

Mg egyszer a szablyok csak hogy biztosan el ne felejtsd okt!

496 8. fejezet

U rald az adataida t , s uralni fogod a vilgot!

PHP & MySQL keresztrejtvny


Aggdsz, hogy a te tkletes ellenttprod mg mindig vrja, hogy rtallj? Tereld el a gondolataidat rla, s tltsd ki az albbi keresztrejtvnyt!

. ,^ =

: -''.y'.t; %'

'yV' \

. . < >

5.

.V *

! "

X :

W m m Bm

W m m m m Wm

a i vm

&hkb

Vzszintes
I. Az adatbzisban tallhat sszes szerkezet - tblk s osz lopok valamint a kzttk lev kapcsolatok brzolsa (angolul). 4. Ilyen kapcsolat ll fenn. amikor egy tbla tbb sora egy m sik tbla tbb sorhoz kapcsoldik (angolul). 5. gy hvjk azt a mveletet, amikor cgv PHP-adattpust egy msikra alaktunk t (angolul). 7. Ezzel az utastssal kombinlhatod az egyik tblbl szrma z eredmnyeket a msik tblbl szrmaz eredmnyekkel egy lekrdezsben. 10. Az ismtldsek s ms tervezsi problmk kikszbl snek folyamata egy adatbzisban (angolul). II. Ilyen opertor az a hasznos kis mvelet, amellyel lervidt hetsz egyes if-elsc utastsokat (angolul). 12. Ilyen kapcsolat ll fenn. amikor egy tbla egyetlen sora egy

Fggleges
1. Ezektl szabadulhatsz meg egy sszekapcsols segtsgvel (angolul). 2. Olyan oszlop egy tblban, amely egy msik tbla elsdle ges kulcsra hivatkozik (angolul). 3. Amikor egy rlapot egy adatbzistl hozunk ltre, akkor azt mondjuk, hogy az rlap........ (angolul). 6. A legkisebb mret adat, amely egy adott adatbzisban mg rtelmes (angolul, s nem nukleris). 8. Ilyen kapcsolat ll fenn kt tbla sorai kztt, amikor az egyik tblban pontosan egy sor felel meg a msik tbla minden egyes sornak (angolul). 9. Egy ilyen nagy segtsget nyjthat egy tbla felptsnek kpi brzolsban. 13. Ideiglenes nv. amellyel egy adategysgre hivatkozhatsz egy lekrdezsben (angolul).
most itt vagy

497

PHP 8 MySQL keresztrejtvny - megolds

PHP & MySQL keresztrejtvny - megolds

498

8. fejezet

U rald az adataidat, s u ra ln i fogod a vil g o t!

PHP & MySQL szerszmoslda


Ebben a fejezetben jnhny j eljrst megis mertl a MySQL-adatbzisok tervezshez, nem beszlve nhny j PHP-fogsrl. Ismteljk t gyorsan a legfontosabbakat:

Normalizls
A normalizls egy adatbzis felp- | tsnek olyan mdostsa, amely* nek a sorn kikszbljk az adat ismtldst, s javtunk az adatok I elhelyezsn, illetve a kznk lev I kapcsolatokon. A normalizls clja I egy olyan megbzhat felpts ki J kio l o l ------ l - ' l alaktsa, amely jl alkalmazkodik az adatmennyisg nvekedshez.

Smk s diagramok
A sma az adatbzisban tallhat sszes szerkezet (tblk, oszlopok stb.), illetve a kzttk lev kapcsolatok brzolsa. A diagram az adatbzis kpi m egjelentse, amely a tblk sszekapcsolsrt felels oszlopok rszleteit is megmutatja.
\

I | |

fr (.) ..

Idegen kulcs
Olyan oszlop egy tblban, amely a tblt egy msik tbl hoz kapcsolja. Egy gyermektb la idegen kulcsa jellemzen a szltbla elsdleges kulcsra hivatkozik, gy kapcsolva ssze a kt tbla sorait.

Adott szm alkalommal ism telt ciklus, am elynek a ltrehozsakor | k e z d r t k e t adunk egy szmll- i nak, meghatrozunk egy tesztfel ttelt, s m egadjuk, hogy a szm llt hogyan kell mdostani a cik lus egyes ism tlsei utn.

AS

r x , y/,

nv

A hromrtk mvelet egy olyan PHP-szerkezet, amely gy mkdik, mint egy' igen tm r if-else utasts, amely logikai (igaz/hamis) kifejez sek alapjn vgrehajtott egy szer dntsekhez alkalmas.

m r/.

IN N E R J IN Ez a fajta sszekapcsols kt olyan tbla adatait kombinlja, amelyek egymshoz illeszke


d sorokat tartalmaznak. A norml lekrdezsektl elt ren az sszekapcsols lehe tv teszi, hogy egynl tbb tblbl olvassunk ki adato kat, aminek rendkvl nagy hasznt v e s s z k , ha az adatb zis tbb tblbl ll.

Ez az SQL-utasts egy lnevet (ali as) hoz ltre, amellyel egy adat egysget azonosthatunk egy le krdezsen bell. Az lneveket gyakran arra hasznljk, hogy a hossz tbla- s oszlopnevek r vidtsvel egyszerstsenek egy lekrdezst, de arca is alkalmasak, hogy az eredmnyknt kapott adatokat tnevezzk, ha az eredeti oszlopnevek nem elg egyediek.

most itt vagy

Karakterlncok kezelse s egyni fggvnyek

Fggvnyek egy jobb ^ let remnyben


m -m
*v ..

>< >

Vgrel Mrnki diplom val a kezemben m r senki sem llth a t meg! Nem kell ms, csak egy rejtekhely, nmi Id a lzercpk kikpzsre, s felrobbantom a H oldat. A z t n ta l n j h e t a hzassg s a bks csaldi let...

A fggvnyekkel jabb szintre emelheted az alkalmazsaidat. A PHP beptett fggvnyeit a korbbiakban is hasznltad klnfle clok el rsre, most pedig megismerkedhetsz egy valban hasznos fggvnycsald dal. Ha ezen tlestl, megtanulod, hogyan kszts egyni fggvnyeket, am e lyekkel tlpheted a kpzeleted hatrait - ha nem is segtenek a lzercpk kikpzsben, a kdjaidat m indenkppen ttekinthetbb s egyes rszeit jrahasznosthatv teheted a segtsgkkel.

ez egy uj fejezet

501

a Risky Jobs keressi lehetsget szeretne a webhelyn

Munkakeress - csak merszen!


A Riskyjobs.biz w ebhely btor clkitzssel szletett: segtene szeretne a c geknek. hogy megtalljk a legalkalmasabb embert a legveszlyesebb mun kakrkhz. Az zleti modell pofonegyszer: ha egy munkhoz megtallod az alkalmas munkaert, jutalkot kapsz. Minl tbb sikeres szerzodest ktsz, annl nagyobb hasznot vghatsz zsebre. A cgnek azonban szksge van egy j keresmotorra. J e l e n l e g rendelkezik eev adatbzissal, telis-tele veszlyesebbnl veszlyesebb llasajanlatokka , am elyek csak arra vrnak, hogy a mersz vllalkozk rjuk tlaljanak. Vess most egy pillantst a Risky Jo b s keressi rlapjra, valamint az llsn latok adatbzisra:
fs f ) O

Ez az egyszer keressi rlap egy parancsfjlt hv meg, amely a riskyjobs tblban keres.

i Rsky Jobs - Search

A Risky Jobs kere ssi rlap egy lekr dezst hajt vgre a riskyjobs tbln, amely megkeresi a megfelel lls ajnlatokat. A riskyjobs tbla a betlteni* llsok nevt s lerst, val*mint az ajnlat feladsnak idejt s a munkahely cmt tartalmazza. ,

riskyjobs
fe jd 1 2 3 4 5 6 7 1 title M a ta d o r P a pa razzo Shark Trainer F irefighter V o lta g e C hecker C ro co d ile Dentist C ustard W a lk e r Electric Bull R epairer d escription Bustling d a ir y fa rm ... Top ce le b rity... Training sharks to d o ... The C ity o f D a ta ville ... Y o u 'll be o u t in the... Do you love anim als... W e need p e o p le ... H ank's H o nky Tonic... <Hy Rutland B everly Hills O rla n d o D a taville D urham Everglades C ity A lb u q u e rq u e H oboken state VT CA FL OH NC FL NM NJ dp 05701 90210 32801 45490 27701 34139 87101 07030 company M a d A b o u t M ilk D airies D iva Pursuit, LLC SharkBait, Inc. C ity o f D a taville Shock Systems, LLC Ravenous Reptiles Pie Technologies H ank's H on ky Tonk d ate _ po ste d 2008-03-11 1 0 :5 1 :2 4 2 0 0 8 -0 3 -2 4 1 0 :5 1 :2 4 2 0 0 8 -0 4 -2 8 0 3 :1 2 :4 5 2 0 0 8 -0 5 -2 2 12:34:17 2 0 0 8 -0 6 -2 8 11:16:30 2 0 0 8 -0 7 -1 4 10 :5 1 :2 4 2 0 0 8 -0 7 -2 4 1 0 :5 4 :0 5 2 0 0 8 -0 7 -2 7 11:22:28

Az llsajnlatokat egyr telmen azonostja a jobJ d elsdleges kulcs.

Jelentsd meg a tallatokat!

502 9. fejezet

Karakterlncok kezelse s egyni fggvnyek

Minden lmom , hogy matadorknt dolgozhassak... de a Risky Jo b s keresje nem ad egyetlen t a l la to t sem!

o Z u h a v e th e g u ts to is o flnd n ? ,ob g you I T '

r m

Risky Jobs - Search


Find your risky job:
fighter Matador

Ernesto, a rettenthetetlen matador szemei vrben forognak az eredmny telen keress lttn.

yezd ki a ceruzd!
A Risky Jo b s rlap benyjtsa utn a keresett karakterlnc a $ u s e r _ s e a r c h vlto zba kerl, amelyet az albbi SQL-lekrdezsben hasznlsz fel a keresshez. rd le, hogy a szemkzti oldalon lthat r i s k y jo b s adatbzis hny sora jelenik majd meg Ernesto keressnek eredmnyben!

$search_query = SELECT job_id, title, State, description FROM riskyjobs "


"WHERE title = 1$user_search";

$result = mysqli_query($dbc, $search_query);


*

rd ide a megoldst!

m o s t i t t vagy

503

rugalm asabb lekrdezsekre van szksg

ki a ceruzd! Megolds
Az = jelet tartalmaz W/HERE zra dk azt mondja, Hogy az sszehason lto tt karakterlncoknak pontosan egyeznik kell.

A Risky Jo b s rlap benyjtsa uln a keresett karakterlnc a $user_search vltozba kerl, amelyet az albbi SQLlekrdezsben hasznlsz fel a keresshez. rd le, hogy az 502. ol dalon lthat risky jobs adatbzis hny sora jelenik majd meg Ernesto keressnek eredmnyben!

Akrmi is lljon a szvegmez ben, ebbe a vltozba kerl.

$search_queryjj( "SELECT job_idp// ? title, state, description FROM riskyjobs " . COHERE title = 1$ u s e r _ s e a r b h ^ $result = mysqli_query($dbc, $search_query) ;

nu)laj f gond az, hogy a lekrdet

zs tlzott pontossgot kvn

3 felhaSZ nl ltal megadott szvegnek pontosan egyeznie kell a keresettel.v > ..0

A keress, ahol nem hibzhatunk


A Risky jo b s parancsfjljban tallhat SELECT lekrdezs tlontl merev: csak akkor ad egyezst, ha a kt sszehasonltott karakterlnc azonos. Ez bi zony komoly gond, hiszen llskeresinknek gy pontosan el kell tallniuk az llsajnlatban szerepl megnevezst, ami bizony nehz feladat.

A kis- s nagybetit klnbsge


Trjnk vissza Ernesto keresshez, ahol a lekrdezs vgeredmnyben a riskyjobs tbla title oszlopban a Bull Fighter Matador" karakterln cot keresi.

nem szmt, ugyanis a MySQL WHERE zradka alaprtelmezs szerint rzketlen r.

SELECT job_id, title, descrip'tion FROM riskyjobs WHERE title = f Bull Fighter Matador1
* /\z = mvelet pontos egyezest kvetel meg, amikor kt karakterlnc egyenlsgt vizsglja.

. u,u u*l

Ltod mr, hol a gond? A lekrdezs kizrlag azokkal a sorokkal ad egye zst a tblban, ahol a title oszlop a Bull Fighter Matador" karakterlncot tartalmazza. Kvetkezskppen az eredmnyhalmazban nem jelenik meg a Matador, de a Firefighter vagy az Electric Bull Repairer sem. Nos, ta ln nem akkora baj, hogy az utbbi kett kiesett, de lthat, hogy a keress nem gy mkdik, ahogy azt elvrnd. Vilgos az is, hogy nem a kis- s nagybetk keveredse okozza a gondokat (a MySQL-keressek alaprtelme zs szerint rzketlenek erre) - hanem az, hogy a WHERE zradk egyenlsg (=) mvelete pontos egyezst kvetel meg a karakterlncok kztt.

504 9. fejezet

Karakterlncok kezelse s egyni fggvnyek

Rugalmasabb SQL-lekrdezsek a LIKE segtsgvel


Igazndibl arra lenne szksg, hogy a kereskifejezs brmely rszvel egye zett kereshessnk. Az SQL minderre a LIKE kulcsszval ad lehetsget, amely arra szolgl, hogy nmi rugalmassgot vigyen a WHERE hasznlatba. A LlKE-ra -gv gondolhatsz, mint az = mvelet m egengedbb vltozatra. Figyeld meg az albbi lekrdezst, amely a LIKE segtsgvel felkutat minden olyan sort, amelynek a t i t l e oszlopban brhol megjelenik a fighter* karakterlnc:

SELECT job_id, title, description FROM riskyjobs [ WHERE title LIKE f%fighter%f
a k

kulcssz lehetv teszi, hogy

' v

. .

olyan

egyezseket is megtallj, ame* J

A % jelek helyettest ka rakterek: tetszleges ka

lyek em

pontosan feleinek meg az idzjeleken bell ll karakterlnc


nak sge

- a kis- s nagybetk klnbz sdig tovbbra sem szmt.

rakterek llhatnak a hely kn a sz' elolt s utn.

A LIKE jelentsen leegyszersti az egyezsek keresst, klnsen akkor, ha a keresett kife jezst egy hosszabb sz vagy kifejezs rszeknt szeretnd meglelni. Figyeld meg, milyen karakterlncokkal mutat egyezst a fenti lekrdezs:

Firefighter Prize

Strbereknek
A l i k e utastst jobbra helyettest karakterekkel ( wildcard) egytt hasznljuk, amelyek a keresett karakterlnc karaktereinek szerepben mutatkozhat nak. Az SQL-ben a szzalkjel (%) tetszleges, akr nulla hosszsg karaktercsoportot helyettesthet. Ha egy kereskifejezs elejre s vgre is oda biggyeszted ezt a karaktert - mint a fenti SELECT uta stsban azzal azt mondod az SQL-nek, hogy min den olyan eredmnyre kvncsi vagy, amelyben sze repel a megadott karakterlnc, fggetlenl attl, hogy hny karakter ll eltte vagy utna. Az SQL-ben van egy msik helyettest karakter is, amelyet szintn hasznlhatsz a LlKE-kal. Ez pedig nem ms, mint az alhzsjel (_), amely egyetlen ka raktert helyettest. Vegyk az albbi LIKE utastst: LIKE

fighter%

Ennek a jelentse a kvetkez: Keress meg minden olyan karakterlncot, amelyben szerepel a fighter, amelyet pontosan ngy karakter elz meg, utna pe dig akrmennyi llhat. A tallatok kztt teht szere pelhet a bullfighter s a firefighter, de a streetfighter nem.

m ost Itt vagy >

505

a riskyjobs kdja

Idkrs! Sznj pr percet arra, hogy kzelebbi ismeretsget kss a Risky Jobs adatbzissal... s prblkozz nhny keresssel!
Tltsd le a riskyjobs.sql fjlt a Head First Labs webhelyrl, a www. headfirst labs.com/books/hfphp cmrl. A fjlban tallhat SQL-utastsok felptik a riskyjobs adatbzist, s feltltik mintaadatokkal. Miutn egy MySQL-eszkzzel futtattad a riskyjobs.sql utastsait, prblj ki pr lekrdezst, hogy ki csit belelhesd magad az llskeresk helyzetbe. Pldaknt lljon itt nhny:

SELECT * FROM riskyjobs

Ez a lekrdezs kivlasztja az sszes lls sszes oszlopt a riskyjobs tblban.

SELECT job_id, title, description FROM riskyjobs WHERE title = 'Bull Fighter Matador ^ ----

Ez a lekrdezs kiolvassa az lls azonostjt, nevt s lerst minden olyan sor ban, amelyben a nv pontosai megegyezik a B u ll Fighter Matador" karakterlnccal.

SELECT 3 ob_id, title, description FROM riskyjobs WHERE description LIKE %animals%

Ez a lekrdezs a LIKE h a s z n - ^ ^ latval olyan llsokat keres, ahol az animals" sz megjele nik valahol a munka lersban.

Tltsd le!
A Risky Jo b s alkalmazs teljes forrskdii letltheted a I lead First Labs w ebhelyre! mghozz az albbi cmrl:

w w w .headfirstlabs.com/books /hfphr

506 9. fejezet

Karakterlncok kezelse es egyni fggvnyek

UKE-mgnesek
Egy halom LIKE zradkot szrtunk szt a ht ajta jn. Vajon sikerl megtallnod, melyikhez melyik ^ eredmny tartozik? s melyik htmgnesnek nem fe lel meg egyetlen LIKE zradk sem?

Esetenknt tbb megolds is lehet!

Human Cannonball Pt Food Dummy Rodeo Clown

most itt vagy

507

UKE-mgnesek - m egolds

UKE-mgnesek - megolds
Egy halom LIKE zradkot szrtunk szt a ht ajtajn. Vajon si kerl megtallnod, melyikhez melyik eredmny tartozik? (Ese tenknt tbb megolds is lehet!) s melyik htmgnesnek nem felel meg egyetlen LIKE zradk sem?

Az egyezshez a T " eltt egy szkz szksges.

Brmi megfelel, aminek a vgn az


er"

ll.

Nem szmt, hogy Az SQL-lekrdezsekben a kis- s nagybeti klnbzsge nem szmt, gy it t minden e"-vel kezdd' sz megfelel, legyen az kis vagy nagy c ". kis- vagy nagybet ket hasznlsz.

Egyetlen karakter a do" utn.

Akrhol jelenjen meg az m a" betpr, egyezst kapsz.

Ezek a kifejezsek egyetlen tallatban sem jelentek meg. Ez a LIKE zradk egyetlen tallatot sem adott.

508 9. fejezet

Karakterlncok kezelse s egyni fggvnyek

Az u to ls LIKE zradk, a LIKE 7oTipper CowV nem a d o tt egyetlen tallatot sem, mivel a "Tipper" s a "Cow" nem jelenik meg egy kifejezsben. Milyen jc5l jnne, ha kulcsszavakra b o n th a tn n k a keresokifejezeseket, -> s ezekkel kln vgezhetnnk el a keresstl

Dangerl Your dream job is ou, , here o you hv th e g u ts to B0 f(n(f ( ( ? -

Risky Jobs -Search


Find your risky job:
T ipper
Cow ~

Subm it

A keress eredmnyesebb le tt volna, ha a "Tipper s a "Cow" szavakat kln kereshetnnk, nem pedig a kzs "Tipper Cow" kifejezssel.

Jl jnne bizony! Mr csak azt kellene kitallnod, hogyan keress egyezst az egyes kulcsszavakkal.
Ha kzvetlenl a Risky jo b s keresm ezjnek tartalmval keresel egyezst, nem minden esetben jrsz sikerrel. Sokkal hatkonyabb megolds lenne, ha a kifejezst alkot egyes kulcsszavakat keres hetnd. De miknt vadszhatsz tbb kifejezsre? Nos, elhelyezhe ted ket egy tm bben, majd trhatod a SELECT lekrdezst gy. hogy mindegyikket megkeresse.

most itt vagy >

509

a PHP explode() fggvnye

Karakterlncok sztdarabolsa szavakk


A hatkonyabb keress rdekben mdot kell tallnod arra, hogy darabokra bontsd a felhasznlk kereskifejezseit, amennyiben tbb szt rtak a kere sm ezbe. A m ezben szveges adatok szerepelnek. gy a PHP brmely b e ptett karakterlnc-kezel fggvnyt hasznlhatod a feldolgozsukra. Egyi kk, az e x p lo d e ( ) , klnsen alkalmas erre a clra, hiszen a segtsgvel a kiindul karakterlncol kisebb karakterlncok tmbjv alakthatod. Ls sunk is egy pldi a fggvny hasznlatra:

Az exploded fggvny egy karakterlncot rszkarakterlncok tmbjre bont.

Az exploded fggvny egy elvlaszt karakter hat.ro!. karakter] alapi bont 3 m^ #H ^ a e t s a* eredmnyb egy tmbt hoz l t e \ o, l er. Ez a parameter a felrob bantand" szveg.

$search words = explode(

'Tipper Cow1) ;
Ez a paramter hatrozza meg, hogy milyen karakter vlassza e a karakterlnc rs e t l zi. Az elvlaszt esetnkben a szkz, de akar tbb karaktert i megadhatsz it s t.

A $searcb_tfords vltoz t r l a oj azoknak a keres kifejezseknek a tmbjt, amelyeket az SQLlekrdezsben majd felhasznlsz.

Az ex p lo d e () fggvny kt paramtert vr. Az els a hatrol, vagyis az a karakter vagy karakterlnc, amelyik jelzi, hogy hol kell sztbontani az eredeti karakterlncot. Jelen esetben a szkzt alkalmazzuk erre a clra, vagyis a kereskifejezs minden szkznl felbomlik. Fontos tudnod, hogy a hatrol nem jelenik meg az eredmnyben. A msodik paramter maga a szveg, amelyet rszekre szeretnl bontani.
Az elvlaszt (szkz) adj: meg, hogy hol kell felbontani

A rszkarakterlncok adjk a tmb elemeit.

explode ( )

a karakterlncot.

$ search_words
Ahhoz, hogy a kereskifejezsek tmbjt belefoglald a Risky Jo b s adatbzis ba, szksg van mg egy kdsor vgrehajtsra a lekrdezs eltt. Ha valaki a Tipper Cow kifejezst rja be a keresm ezbe, a kd most szavakra bont ja, s egy tmbben ($ se a rc h _ w o rd s) trolja azt: $ u se r s e a r c h = $ GET [ ' u s e r s e a r c h 1] ; $search _w ord s = e x p lo d e ( ' $ u se r_ se a rch );

Az explode)) fggvny a $user_search szavait egy $search_words n v tmb e ben t r l a oj.

510 9. fejezet

Karakterlncok kezelse s egyni fggvnyek

Gyakorlat

A Risky Jo b s kereskifejezsnek rszekre bontst kveten be kell illesztened az eredmnyknt kapott karakterlncokat egy SQL-lekrdezsbe a LIKE s az OR segtsgvel. Ernesto korbbi keressnek eredm nyeknt (am elyben a Bull Fighter Matador" kifejezst adta meg) az albbi lekrdezst kapod:

Az lls megnevezse helyett inkbb a lersban kere snk, hiszen itt tbb adattal kaphatunk egyezst.
SELECT * FROM riskyjobs A _______ _

WHERE description LIKE '%Bull-*' OR description LIKE %Fighter%' OR description LIKE %Matador$

Tegyk fel, hogy az albbi kddal lltottad el ezt a lekrdezst a keresm ez tartalmbl kiindulva:

$search_query = "SELECT * FROM riskyjobs"; $where_clause = 1' ; $user_search = $_GET['usersearch']; $user_search);

$search_words = explode(

foreach ($search_words as $word) { $where_clause .= " description LIKE 1%$word% OR ";

if (!empty($where_clause)) { $search_query .= WHERE $where_clause";

S C S S B iy B B y Jo b s - Search
rd le, hogy milyen SQL-lekrdezst eredmnyez a fenti kd, ha Ernesto a Bull Fighter M atador kereskifejezst adja meg. s jelezd azokat a helye ket, ahol problma merlhet fel!
Find your mk>-job: FJgfatf f.Vaudoc
Submit

m ost i t t vagy

511

G yakorlat - megolds

A Risky Jo b s kereskifejezsnek rszekre bontst kveten be kell illesztened az eredmnyknt kapott karakterlncokat egy SQL-lekrdezsbe a LIKE s az OR segtsgvel. Ernesto korbbi keressnek eredm nyeknt (amelyben a Bull yakorlat megolds Fighter Matador kifejezst adta meg) az albbi lekrdezst kapod:

Az lls megnevezse helyett inkbb a lersban keresnk, hiszen it t tbb


selec t

fro m

riskyjobs

adattal kaphatunk egyezst.

WHERE description LIKE ,%Bull% OR description LIKE ,%Fighter%' OR description LIKE %Matador%'
Tegyk fel, hogy az albbi kddal lltottad el ezt a lekrdezst a keresm ez tartalmbl kiindulva:

$search_query = "SELECT * FROM riskyjobs;

Minden L I K E zradk Vgn

$ w h e re _ c la u s e = ' ;
$user_search = $_GET ['usersearch' ] ; $user_search);

egy OR ll, ami kapcsolatt biztost a kvetkez kifejezSSel. Ez az utols ki^ J


/

$search_words = explode (1

fejezs kivtelvel nagy szeren bevlik.

foreach ($search_words as $word) {

$where_clause .= " description LIKE '%$word%' OR ";

Gyzdj meg rla, hogy a IA/HERE zradk nem res, m ieltt a keressi lekrdezsbe illesztend.
OPwr j ii

if (!empty ($where_clause) ) { $search__query .= " WHERE $where_clause";

( ^ E z a mveleti je l a i egyik karakterlncot a msik vghez fzi.

Rsk}. Jobs Sean


Findyournsky (>b (5*5 l)

^ >

rd le, hogy milyen SQL-lekrdezst eredmnyez a fenti kd, ha Ernesto a ..Bull Fighter Matador kereskifejezst adja meg. s jelezd azokat a helyekt, ahol problma merlhet fel! SELECT -* FROtA riskyjobs

W /HERE desdrij^tior L l^E V %Bull%' OR description L li^B 7>P.^ter%' OR

description L IK E 7/V|atador%'^0^\ A lekrdezs vgn egy felesleges OR ll, ami ................................................................. ........................ lehetetlenn teszi a lekrdezs vgrehajtst!

512 9 fejezet

Karakterlncok kezelse s egyni fggvnyek

Karakterlncok egyestse az implodef) fggvnnyel


A cl igaznditl az, hogy a WHERE zradkban csak a LlKE-ok kztt heh e z z el 0R mveleteket, az utols utn ne. Hogyan valsthatod meg mindezt? Nos. elhelyezhetsz egy eset vizsglatot a ciklusban, amely figyeli, hogy elrled-e az utols kifejezst, s ha igen, nem szrja be az OR-t. Ez megoldst je lentene, de a kd kiss zavaross vlna. Sokkal tisztbb kpet kapsz, ha 22 explode () fggvny prjt hasznlod - az implode () fggvnyt, amely^ urakterlncok tmbjbl hoz ltre egyetlen, egyestett karakterlncot.

Ez a hatrol kerl az egyests sorn a rszkarakterlncok kz.

$where clause = implode( '


Az implode() fgg vny egyetlen karak terlncot ad vissza.

OR

'

, $where_list);
Itt azt a karakterlnctmbt kell megadnod, amelynek az elemeit egyesteni szeretnd.

De miknt segt ez a fggvny a ksza OR eltntetsben? Nos, az implode () lehetv te s z i. hogy megadj egy hatrol elem et, amelyet az sszefztt karakterlncok kz illeszt. Ha az ' OR ' hatrolt alkalmazod, egy olyan WHERE zradkot pthetsz fel, amelyben z OR mveletek kizrlag a LIKE zradkok kztt jelennek meg.

Hegyezd ki a ceruzd!
rd t a Risky Jo b s SELECT lekrdezst elllt PHP-kdot az implode () fggvny al kalmazsval gy, hogy megszabadulj a felesleges OR mvelettl!

m o st i t t vagy

513

Hegyezd ki a ceruzd!

megolds

Hegyezd ki a ceruzd!---------------------------------------------------------------------- 7 Megolds-----------------------------------------------------------------------r


rd r a Risky Jo b s SELECT lekrdezst elllt PHP-kdot az implode () fggvny alkalmazsval gy, hogy megszabadulj a felesleges OR mvelettl!
^

fscardK___^ucry = US E L E C T * FR/V] riskyjobs"; fwhe\re_Jisi = arrayO;


* /_j T C W v-seard h 'J;......................,5m bf
I

*f 00 Mivel az implode() karakterlncok


f ered
f f

....................... ................. /...... mnyt, l t e k l hoznod egy tmr el fscardK words e%p|<>deC /user search); / b t a LIKE zradkokbl.
........................... .................................. ..........................j .................. ............................................... ..................................

o'

foreadh (fsearh__y/ords as fword) {

Q,
]

.............^ ............................... } ?wtare__dlause imploded R \ fwhereJisj


................................................................................................F

U e W 1 * ''description U K E '%/word%"; ......

AD

n ' o , ugyangy viselkedik, mint aid az array_push() - egy elemet ij l

r a

'u

i e

3w ibM rW en^

*
(

<> *
i

.........................................................................................................................................................................

................ ..y^ . .............. ^ fggvnynek tadott hatrol az OR1, 1 .. . V . ^ r ............... egy-egy szkzzel az elejn s a vgn.

^
^

/searh_^uery . w tVHERE fwKere__laus W; } ......................................................................


*j
< i*> y
.S <

ff

bz egyests eredmnye-

^
o

knt kapott karakterlncban LIKE zradkok szerepenek, amelyeket az OR kt ssze.

;*> g'

^ >> #

&

&

* /

&

Az implode)) fggvny hasznlathoz e z r egy l s $whereJist nevezet tmbt hozunk l t e r a LIKE zradkokbl.
^

^
^

/ oc

;----- -------- >

*V .o-

^
,

&

e ?

c ?
Jb
jd

implode ( )
/ Q,
$
_ ___________

*
$

<7

co

$where s t

$where clause

514 9. fejezet

Karakterlncok kezelse s egyni fggvnyek

Tesztt
Menj egy krt a Risky Jobs keressi rlapjval!
Tltsd le a Risky Jo b s alkalmazst a Head First Labs webhelyrl, a www.heafirstlabs.com/books/hfphp cmrl. A search.php parancsfjl tartalmazza a le krdezst elllt, a korbbiakban bemutatott kdot, s a program ezzel dolgozza fel a search.html oldal keresm ezjben megadott szveget. Tltsd fel a parancsfjlt s az alkalmazs egyb fjljait a webkiszolglra, s nyisd m eg a ke ressi rlapot (search.html) egy w ebbngszben. Prblkozz klnfle kereskifejezsekkel. gy megfigyelheted, hogyan viselkedik a lekrdezst elllt kd. Min denkppen prbld ki Ernesto immr klasszikus ..Bull Fighter Matador kifejezst, amely egyttal nagyszenen mutatja az implode() fggvny mkdst az j kdban.

Kockzatos llsok
V ig y z a t! lm a id m u n k ja c s a k r d vr. E lg m e r sz vagy, hogy m egkeresd?

K ockzatos llsok - A keress eredmnye


ll s

Lers

lla m

M e g h ird e t s napja
2000-11-14 21:56:11

D ijb o kszo ld Feltrekv s zu p e rp e h e lys ly bo kszo ld MO n y e rt m rkzsei sz m n a k nvelshez e lle n fe le t keret, lo m l b n a k , kacskakezek s ve g ll a k elnyben. E l<feetes ta p a s z t a la t nem sz ks g e s. Nem te lje s td tfe fiz e t e t t ll s . T a l lko z a k o rc s o ly a p ly a m g tti s ik to rb a n . E ngedd, h o g y Kon Kjng bajnokk te g y e n , va g y le g a l b b is s e g ts e n , hogy egy b a jn o k t l kapj ki! T o rre d o r

&k s s z a rv a s m a rh k v rj k , hogy bem u* ID


ta s d e r s z a k m e n te s k p e n yle n g e t sl tu d o m n y o d a t. A la p s z in t b ik a v ia d a l ll k p e ss g i te s z t s ik e re s te lje s t s e

2000-11-14 21:49:31

i Mennyi ll s a j n la t! Nem hiszem, hogy dj birkzknt vgy elektrom os bikk szerelsvel keresem m ajd a kenyerem, de ta l n vgl m egtallom I t t lm aim m unkjt...

Toread

ktelez.
200d-11-14 11:22:23

E le k tro m o s - A H anks H onky Tnk k p z e tt e le k tro m o s - NJ b ik a -ja v t b ik a -J a v t t ke re s. Ingyen m e n e t (J a vt s Electri u t n ) s c s p s c s irk e s z m y a k f l ro n .


Repair r hot wings are some o f the benefits

Ernesto nem tallta meg azonnal 1 <BW, de y hogy a p3. g, ranesfjl a keresett kifejem egyes t g a utn k tat, taln kzelebb keaji u r l a cljhoz. t

hogyan ja vth a tu n k a keressen?

K tltncos vagyok. E ll to g a tta m a webhelydre, tkletes keres<5kfejezseket a d ta m meg, de mgsem ta l lta m ^ egyetlen alkalmas ll s a j n la to t seml
d D an ger! Your i. ream jo b is o u t th e re

Do you have the guts to go find it?

Risky Jobs - Search


Find
tightrope. circos

Selma, a kotltincos szmra a Risky Jobs keressi l p a nem raj hozott sok szerencst.

Kockzatos llsok
V lg y z a tl lm a id m u n k ja c s a k rd vr. E lg mersz vagy, h o g y m egk ere&d?

A keresolcifejezs alapjn egyr t l hogy egy cirkuszi ktl em , tncos szmra keresnk munkt, az eredmnye azonban mintha nem lenne sszhangban ezzel.

K ockzatos llsok - A keress eredmnye


ll s Lers

Macskaz s o n g l r

Mestere vagy a m a cskazso nglrkds feledett mveezetnek, a m e ly e t negyven

llam AZ

M e g h ird e t s napja 2 000-11-14 21:13-36

mester

K t lte s z -

o rszgban t ilt o t t a k be? C sak a J lm Rufz C irkusz knlja e z t a l tv n y o s s g o t a m ai kznsg k ifin o m u lt zlshez ig a z to tt fo rm b a n . E g ye stsd e r id e t cirkuszunk kiem elked m acskazsonglrjelvel - gyere az egyetlen helyre, ahol e ls a j tth a to d a s zin kro n -m a c s ka d o b l stl Ne feledd, zsonglrkdni velk m g nehezebb, m in t te re lg e tn i kt. M indenkinek egyenl e s ly t knlunk, s a lig vrjuk, hogy c s a tla k o z z a c sa p a tu n kh o z. K szlj fe l azonban, hogy szig o r te s z te k e n kell te s n e d , hogy bizo n y ts d kzgyessgedet a m acskaflkkel - csa k a legjobbak kerlhetnek be a m a cska z s o n g l r-m e s te r program bal H a s z e rin te d nagy m agassgban r kig egyenslyozni egy ktlen k it n Id t lt s , ez a m unka le h e t, hogy neked val. M inden k te l n k egy szig o r , 4 3 lpsbl ll vizsgn m egy t, am ely nek vgn egy l em ber egyen slyozik ra jta je le n t s ideig - le h e t, hogy Te leszel azl A b izto n s g i hlrl m i gondoskodunk, de s is a k o r s k e s z ty t neked kell hoznod. A M o n ta n a llam beli E>lg Top ban lev g y rt - s teszt-zem egysgnkben h ih e te tle n ll s le h e t s g e t knlunk, olyan bnuszokkal, m in t a JHozd el a h z i lla to d a t is "-h t vagy a .N a d r g k o s z t m s pntek". H rom a j n l s t krnk, am elyek a z t Is ta rta lm a z z k , hogy m ennyi v o lt Ig a z o lta n a leghosszabb Id. a m it a ktlen t lt tt l. Ille tve a z eddigi esseid s z m t. Nzd m eg a c irk u s z t a c irk u s z m g tti

atc Posrcd
2008-11 14

21:13:35

MT

2000-11-14 21:17:16

2 0 0 8 1 ] i4 2 1 :1 7 : J6

A kereskife jezsekben van a hiba, vagy val ban nem tudunk llst ajnlani egy ktltncosnak?

Karakterlncok kezelse s egyni fggvnyek

ki a ceruzd!

rd le, hogy milyen SQL-lekrdezst kapunk Selma tightrope, walker, circus kereskifejezse nyomn, s jelezd a lehetsges problmkat!

most itt vagy

517

a kereskifejezs elfeldo/gozsa

Hegyezd ki a ceruzd!
M pn/ll/lac 9 le - h o g y milyen SQL-lekrdezst kapunk Selma tightrope, walker, circus kereskifejezse nyomn, s jelezd a lehetsges problmkat!

S E L E C T * FROM riskyjobs W HERE description L IK E '% tijHv*ope,% OR dcsdriptior L |K E ^owalke*",?/ OR


a * _ #

des*ipi'o* L | ^ E

i 0/o C \rC \A S , /o

Az explode() fggvnyben 3 ha trol elemek a szokozok vesszdrl sz sem esik.


X I * I '

A vesszoVet a program a keresfcifejezs rsz nek tekinti, nem pedig elvlaszt elemeknek.

Az egyetlen eredmnyt ad keresoki fejezs a circus", ehhez ugyanis nem tapad vessz.

$search words

Nem rtem, mi olyan nagy problma it t . Csak hvjuk meg k te ze r az explodeQ fggvnyt - elszr m egszabadulunk a szkzktl, aztn pedig a vessz<5kt<51.

Az explode ( ) fggvny lehetv teszi, hogy egy karak terlncot rszekre bonts - most azonban mr eleve a rszkarakterlncokkal dolgozunk!
Az explode () fggvny els meghvsa utn egy tbb karakter lncbl ll tmbhz jutsz, gy nincs tbb egyetlen karakterln cod, amelyet rszekre bonthatnl. Ila a tmb elem einek sztbon tsval prblkoznl, a gondjaid csak megsokszorozdnnak, gy az explode () tbbszri meghvsa helyett inkbb a karak terlnc elfeldolgozsa mellett rdemes dnteni - gy addig gyes kedhetsz, amg egyetlen hatrol elemhez nem jutsz, aminek k sznheten valban a m egfelel rszekre bonthatod a kereskifejezst.

518 9. fejezet

Karakterlncok kezelse s egyni fggvnyek

A kereskifejezs elfeldolqozsa
Olyan karakterlncot szeretnl az explode () fggvnynek tadni, amelyet egyetlen lpsben a m egfelel rszekre bonthat. Miknt tehe ted ezt meg? Nos, mindssze arrl kell gondoskodnod, hogy a fgg vnynek egyetlen hatrol elem elegend legyen - pldul a szkz karakter. Vagyis, szksg van a kereskifejezs elfeldolgozsra, hogy az egyes rszek kztt vgl szkz lljon, mg akkor is, ha a felhasz nl vesszt rt be.

Ebbl*.

Az adatok elofeldolgozsval eltvolthatod a nemkvnatos karaktere kt, gy megknnytheted az adatfeldolgozst.

tightrope, walker, circus

...ezt az alakot kell ellltanod...

...gy az explode() fgg

tightrope

walker

circus

vny ezt adja eredmnyl.

$search words

Nincsenek

hlye krdsek
K i Alkalmazhatok tbb karaktert is elvlasztknt a kereskifejezs sztbontsnl? V \ Igen, tetszleges szm karaktert megad hatsz, de ez nem jelenti azt, hogy klnbz
hatrolkat hasznlhatsz, vagyis a problma nem oldhat meg ilyen egyszeren. Ha az explode ( , ' $user_search) k dot hasznlnd a karakterlnc rszekre bon tsra, nagyszer eredmnyt kapnl a tightrope, walker, circus kereskifejezs esetn, ha azonban a felhasznl a tightrope walker circus" kifejezst adja meg, akkor ott vagy, ahol a part szakad - egyetlen hossz karakterlnccal a kezedben.

I C l Nem lenne egyszerbb trlni a vesszket ahelyett, ^ j hogy szkzkk alaktannk ket? V ! Ez a megolds csak abban az esetben mk
dik, ha biztos vagy benne, hogy a felhaszn lk minden esetben vesszt s szkzt is hasznlnak az egyes kifejezsek elvlaszts ra ebben pedig nem bzhatsz. A vesszk trlse esetn a tightrope,walker5 kifejezs bl a tightropewalker karakterlnchoz jutsz, amelyet nemigen lelhetsz meg a Risky Job s adatbzisban.

m o s t i t t vagy >

519

a php s tr rep/acef) fggvnye

A nemkvnatos kereskarakterek cserje


Ha jobban belegondolsz, a R isk y jo b s kereskifejezsnek elfeldolgozsa igencsak em lkeztet arra, amikor egy szvegszerkesztben keresst s csert vgznk. Esetnkben egyszeren arrl van sz, hogy' meg szeretnnk keresni a vesszket, majd szkzkkel helyettesteni azokat. A PHP str_replace () fggvnye lehetv teszi mindezt - s csak hrom paramtert kell megadnod: a keresett s a csereszveget, valamint azt a ka rakterlncot, amelyen a keresst s a csert el szeretnd vgezni. Lssuk most a fgg vnyt mkds kzben:

Itt az a rsz, amelyet le szeretnl cserlni...

$clean_search = str__replace (1thousands 1, 1 hundreds 1, 'Make thousands of dollars your very first month. Apply now!f);
t A harmadik paramter maga az a karakterlnc, amelyen --------- az egsz mveletet vgzed. Ebben az esetben az llshirdetes szvegt kzelted nmileg a valsghoz a thousands (ez re i") szt a hundreds" (szzai") karakterlncra cserlve.
Mi a helyzet a kereskifejezsben m egjelen vesszkkel? Semmi gond az str_replace () tkletesen alkalmas egyes karakterek cserjre is:

...erre.

Emlkszel, ugye? Ezt a rszt cserled... ^ ...erre.

$clean_search = str_replace(1,1, ?

< r

'tightrope, walker, circus1);

Ahol csak megjelenik egy vessz' eb ben a karakterlapban, egy szkz ke rl a helyre.
A fenti kd futtatsa utn a $clean_string a tightrope walker circus" karakterlncol fogja tartalmazni.

Agytorna

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

Feltnik valami gyans dolog az str_replace () eredm ny ben? Vajon a vesszk cserje szkzkre gy trtnik, ahogy azt tervezted?

520 9. fejezet

Karakterlncok kezelse s egyni fggvnyek

Az albbi PHP-kd alapjn rd le, hogy milyen eredm ny jelenik meg a $search_words tmbben a megadott kereskifejezsek nyomn! Fontos, hogy a m egfelel tm belem e ket rd csak le, s ha a tmb rvidebb, hzd t a kimaradkat.

Gyakorlat
$ c le a n _ s e a r c h = s t r _ r e p l a c e ( , ' , $ s e a r c h w ord s = e x p l o d e ( T f $user_search); search);

$clean

bull,matador cape
$search words

3 szkz!

bull matador

cape

$search words

bull , matador cape

$search words

2 szkz!

bull,matador,

cape

$search words

m ost it t vagy

521

Gyakorlat

- m egolds

Gyakorlat megolds

Az albbi P H P - k d alapjn rd le, hogy milyen eredmny jelenik meg a $sea rch _ w o rd s tm bben a megadott kereskifejezsek nyomn! Fon tos, hogy a megfelel tm belem eket rd csak le, s ha a tmb rvidebb, hzd t a kimaradkat.

$clean_search = str_replace ( 1, 1, 1 1, $user_search) ; $search_words = explode( 1, $clean_search);

Ez a tmb csak hrom elemet tartalmaz.

buli,matador cape
$search words

Ez a kt tmbelem res, amit a matador s a cape szavak k ztti hrom szkz indokol. 3 szkz!

bull matador

cape

$search words

bull , matador cape


Ismt kt res elemet kapsz, mivel a vessz helyre szkz kerlt. 2 szkz!

$ search words

bul1,matador,

cape

$search words

522 9. fejezet

Karakterlncok kezelse es egyni fggvnyek

M o st, hogy elofeldolgozst vgznk a keresokifejezsen, kszen llunk az llskeressre?

0, dehogy! Az elfeldolgozs megszabadt ugyan a nemkvnatos karakterektl, de ez mg sajnos nem jelenti azt, hogy a megfelel kereskifejezseket tartal maz tmbhz jutunk.
Emlkezz vissza, hogy egy olyan karakterlnchoz szeretnl hozzjutni, amelyben a kereskifejezseket ugyanaz a hatrol elem. nevezetesen a szkz vlasztja el egymstl. Pillants r mg egyszer a szemkzti oldal hrom pldjra. A $ sea rch _ w o rd s tmbben tbb res elem is feltnik. Ha erre prblsz egy V7HERE zradkot felpteni, vgl valami ilyesmit kaphatsz:

A magukban ll szkzk egyezst adnak az sszes l lsajnlat minden egyes szkzvel, gy valban komoly gondot jelentenek.

SELECT * FROM riskyjobs WHERE description LIKE f%bull%f OR description LIKE f%matador%f OR description LIKE f% % f OR description LIKE 1% % ' OR . description LIKE f%cape%T

Pe ezek a szkzk semmivel nem adnak egyezst, ugye?

ppen ellenkezleg! Mindennel egyezst adnak!


Ha az llsajnlatban brhol elfordul egy szkz (amit biztosra vehetsz), a lekrdezs egyezst ad, s az lls m egjelenik az eredmnyben. Kvetkezskppen egy ilyen kereskifejezs a Risky jo b s adatbzis minden elemvel egyezst ad. Mieltt teht sszelltand az SQL-lekrdezst, meg kell szabadulnod ezektl az res tm belem ek tl. hiszen csak gy kaphatsz rtelmes eredmnyt.

most itt vagy

523

az res kereskifejezsek kiszrsa

A lekrdezsben valdi keresokifejezsekre van szksg


A j hr az, hogy nem is olyan nehz lisztba tenni a kereskifejezseket, mi eltt felhasznlnd azokat a lekrdezsben. Nem kell mst tenned, mint lt rehozni egy j tmbt a valdi kereskifejezsek szmra, majd ebbe tm solni az elbbi tmb nem res elemeit. Az eredmnyt ezutn felhasznlhatod a SELECT lekrdezs elksztshez. Az j tmb sszelltshoz egy f o r e a c h ciklus segtsgvel vgighaladsz az eredeti tmb elemein, s egy i f utastssal megkeresed kzttk a nem reseket. Amint tallsz egy nem res elem et, beilleszted az j tmbbe. Ls suk rszletesebben, hogyan is zajlik ez a folyamat:

Itt az eredeti tm b , amely tartalmazza a keresokifejezseket, valamint nhny res elemet a felesleges szkzk miatt.

Ettl a kt res tmbelemtol meg kell szabadulnod.

A parancsfjlt ki kell egsztened egy kdrszlettel, amely felpt egy j tmbt a valdi, nem res kereskifejezsekbl.

Az j tmb rvidebb, hiszen , csak valdi keresokifejezseket tartalmaz - reseket nem!


$final search words

524 9. fejezet

Karakterlncok kezelse s egyni fggvnyek

A nem res elemek tmsolsa egy j tmbbe


Figyeld meg most azt a kdot, amelyik tmsolja a $search_words nem res elemeit az j $f inal_search_words tmbbe:

$search_query = "SELECT * FROM riskyjobs"; / / A kereskifejezseket egy tmbben helyezed el az str_replace() segtsgvel $clean_search = str_replace(1,', T, $user_search); $search_words = explode( 1, $clean_search) ' a vesszket szkzkre cserled. $f inal_serchjwords = array()/ if (count($search_words) > 0) { foreach <$search_words as $word) { Sorra veszed a $search_word if (!empty($word)) { $final search words[ = $word; ] tmb elemeit, s Ha nem reset
} }

Semmi jdonsg -

tallsz, elhelyezed a $final search words tmbben.

A kd, miutn meggyzdtt rla, hogy a $search_words tmb legalbb egy kereskifejezst tartalmaz, egy foreach ciklussal sorra veszi a tmb elemeit, a nem resek utn kutatva. Ha sikerrel jr, a [] mvelettel elhelyezi a tallt ele met a $f inal_search_words tmb vgn. gy pl fel az j tmb. Hogyan tovbb? Nos, a SELECT lekrdezst pontosan gy kell ltrehozni, mint korbban, de most a $f inal_search_words tmbt hasznlod a $search_words helyett:

// A WHERE zradk ltrehozsa a kereskifejezsek felhasznlsval $where_list = array(); if (count ($final search words) > 0) { -t ------ .. . . .. , l/liCDr r .. * ..... . foreach($ in a l~ s e a r c h ~ w o r d s as $word) { ^ Itt Viszontlthatod a WHERE zaradek felepite$where_list[] = "description LIKE 1%$word%"; shez korbban hasznlt kdot, amely azonban

5
)

ezttal a $final search words tmbt veszi


$where_list);

$where_clause = implode( OR '

alapul, ami nem tartalmaz res elemeket.

// A WHERE zradk hozzfzse a keressi lekrdezshez if ( empty ($where__clause) ) { ! $search_query .= " WHERE $where_clause";
)

A fenti kd olyan keressi lekrdezst eredmnyez, amely nem tar talmaz res elem eket. A buli, matador, cape" kereskifejezshez tartoz j lekrdezs gy fest:

Agytorna
Vajon ez a keress vgre a kvnt eredmnnyel szolgl?

SELECT * FROM riskyjobs WHERE description LIKE '%bull% OR description LIKE %matador% OR description LIKE '%cape%'

m o st i t t vagy >

525

p r b ld k i a se arch, p hp parancsfjlt

Tesztt
Frisstsd a keressi parancsfjlt az elfeldolgozs kdjval!
Frisstsd a search.php parancsfjlt, hogy az explode () s az implode () alkalmazsval el zetesen feldolgozza a felhasznl kereskifejezst, s gy a SELECT lekrdezs is hatkonyab b vljon. Ezutn tltsd fel a parancsfjlt a webkiszolglra, s prblkozz pr keresssel.

Kockzatos llsok
V ig y z a t! lm a id m u n k ja c s a k r d vr. E lg m e r sz vagy. hogy m egkeresd?

K ockzatos llsok - A keress eredmnye


ll s L e r s

Ktttncoe Kezd c irk u s z V -3 eves ta p a s z ta la tta l rendelkez profi t ke re s kvrks e le f n tta l v g re h a jto tt

lla m TX

M e g h ird e t s n a p ja 2 0 0 3 -1 1 -1 4 21:16:19

k t lt n c o s a k ro b a ta m u ta tv n y o k h o z . H a jla n d s g r l k fe lta k a rt s ra elny. H ih e te tle n bnuszok: o rv o s i s fo g o rv o s i kezels, kedvezm nyes r s z v n y v s rl s i le h e t s g , g y g y s z e r-h o z z j ru i s , re n g e d m n y a s z u v e n rk n la tb l, r v id s h o s s z t v ro k k a n ts g i b iz to s t s , le t- s u ta z s i b iz to s t s , s z e m v e g -t m o g a t s , kedvez m nyes a u t - s o tth o n b lz to s t s , k rh z i p o l s i d j v is s z a t rt s e , to v b b ta n u l s i h o z z j ru l s , fiz e t e t t s z a b a d s g , a d o p t l s i h o z z j ru l s . R u galm as k e z d fiz e t s kpessgek, ta p a s z ta la t s helyi p ia ci v iszo n yo k s z e rin t. E l m e n e te li le h e t s g te lje s t m ny a la p j n . A z e g y e tle n , a m i v is s z a ta r th a t a n a g y s to r le g m a g a sa b b d r tk te l t l, a le lke se d se d fo k a , a m u n k a m o r lo d ... s a z e g ye n s ly rzked! E gyb m u n ka k ri k te le ss g e k: k te le k kiv la s z t s a s elhelyezse, kisebb e le f rrta d m ln ls z tr c l s fe la d a to k , gyerekek v is s z a je lz s e in e k fe ld o l g o z sa . A s ik e re s p ro fi a k ro b a t v v l s h o z p ld a m u ta t s (ne e s s le !), kezdem nyezkszsg, k r lte k in t s s e re d m n y k z p o n t s g sz ks g e s. H a s z e re te d a k ih v s o k a t, s a te h e ts g e d k ib o n ta k o z ta t s h o z t m o g a t s ra van sz ks g e d , a S in g ling B ro th e rs kn lja a le g g yo rs a b b u ta t a sike rh e zl M a cska z so n g l rm e s te r M e s te re vagy a m a cskazso nglrkds e lfe le d e tt m vszetnek, a m e ly e t negyven o rsz g b a n t ilt o t t a k be? C sak a Jm R ulz C irkusz knlja e z t a l tv n y o s s g o t a m ai kznsg k ifin o m u lt zlshez ig a z t o t t fo rm b a n . E g ye s tsd e r id e t cirku szu n k kiem el ke d m acskazsongirjeivel - gyere a z egyetlen helyre, aho! e ls a j tth a to d a sz!nkn?n-m acskadobstl Ne feledd, zso n g l rk d n i velk m g nehezebb, m in t te re lg e tn i k e t. M indenkinek egyenl e s ly t knlunk, s a lig vrjuk, hogy c s a tla k o z z a csa p a tu n kh o z. K is z lj fe l azonban, hogy szig o r te s z te k e n kell te s n e d , hogy b izo n y tsd kzgyessgedet a m acskaffkkel - c s a k a legjobbak kerlhetnek be a m acskaz s o n g l r-m e s te r program ba! AZ 2 000-11-14 21:13:35

K it lte s z te l

H a s z e rin te d nagy m agassgban r kig egyenslyozni MT egy ktlen k it n id t lt s , ez a m unka le h e t, hogy neked val. M inden k te l n k egy szig o r , 4 3 lpsbl ll vizsgn m egy t, am elynek vgn egy l em ber egyenlyozik ra jta je le n t s Ideig - le h e t, hogy Te leszel azl A b izto n s g i hlrl m l gondoskodunk, d e s is a k o r s k e s z ty t neked kell hoznod. A M o n ta n a llam beli Blg Top-ban iev g y rt - s te szt- ze m e g ys g n kb e n h ih e te t len ll s le h e t s g e t knlunk, olyan bnuszokkal. m in t a H o zd el a h z i lla to d a t is "-h t vagy a *N a d r g ko sz t m s

2 006-11-14 21:17:16

Karakterlncok kezelse s egyni fggvnyek

Vgre, valsggal dlnek az llsajnlatok! A lersok viszont kicsit hosszadalmasak... st, nem is k ic s it - nincs szksgem ennyi felesleges adatral Taln inkbb tu grom a hazardpays.com webhelyre, ahol a lersoknak csak egy rszt m u ta tj k meg, (gy tbb ta l la t o t kapok egy oldalon. O

Jllehet a Risky Jobs jobban teljest az llsajnlatok felkutatsban, a hosszadalmas lersok sokaknak kedvt szegik.
Selmt valjban az bosszantja, hogy grgets nlkl kevs llsajnlatot te kinthet t egy oldalon. R kell bredned, hogy egyltaln nem szksges egy lls teljes lerst feltntetned a keress eredm nyben. Elg ha csak egy rszt jelentesz meg, mondjuk az els pr mondatot.

rd le, hogy szerinted m it tehetsz annak rdekben, hogy az llsajnlatok lersait kis s megkurttsd a keress eredmnyben:

m o st i t t vagy

527

a php substr() fggvnye

Megeshet, hogy a karakterlncnak csak egy rszre van szksg


xMivel a Risky Jo b s adatbzisban tallhat llslersok meglehetsen vlto zatosak, s akadnak kztk hosszadalmasak is, taln gy zabolzhatod meg a legegyszerbben a keress eredmnyeit, ha mindegyiket kisebb mretre vgod vissza. A flrertsek elkerlse vgett tegyl hrom pontot a rvid vltozat vgre, ami jelzi, hogy itt csak a lers egy rsze lthat. A PHP s u b s t r () fggvnye nagyszeren alkalmas arra, hogy a megadott karakterlncbl kiemelj egy rszt. Ehhez meg kell adnod az eredeti karakterlncot s kt egsz szmot - az els a rszkarakterlnc kezdett jelli, a msodik pedig a hosszt. A fggvnyt teht ilyen alakban hasznlhatod:

A PHP substrl) fggvnye lenetove , , i . i teszi, hogy kinyerd Vf eqv karakterlnc egy rszt.
^ ^ ^

substr(karakterlnc, kezdet, hossz)


Ez az eredeti karakter- ^ lnc, amelynek egy rszhez hozz szeretnl jutni, y Itt adod meg a rszkarakterlnc kezdett... - ,n ? ' 9 a , m terelne a szama .

A s u b s t r () fggvny hasznlatnl gy gondolhatsz a karakterlncokra, mint tmbkre, am elyeknek az elem ei a karakterlncot felpt karakte rek. Vegyk az albbi karakterlncot:

$3 ob_desc = 'Are you a practioner of the lost art of cat juggling?


A tm bk elem eihez hasonlan a karakterlnc karakterei is rendelkeznek sorszmmal - a szmozs 0-val kezddik, s egyesvel folytatdik a ka rakterlnc vgig:

you a^jpractioner of the lost art of cat jugglip^?


0 1 2 3 4 5 6 7 8 9... 50 51 52

Ezeket a sorszmokat hasznlhatod a s u b s t r {) fggvnyben a karakter lnc kvnt rsznek kinyershez:

A 4-es sorszmnl kezded, _ s 3 karaktert haladsz.

substr($job_desc, 4, 3)

you

substr($job_desc, 49)

ing?

A 49-es sorszmnl kezded,


s mivel elhagytad a msodik paramtert, a karakterlnc Vgig haladsz.
substr($job_desc, 0, 3)
Are

substr($job_desc, 0, 9)

Are you a

528 9. fejezet

K arakterlncok kezelse s egyni fggvnyek

Karakterlncok elejnek s vgnek kiolvassa


A substr () fggvnnyel nem csak a karakterlnc elejrl olvashatsz ki rszeket ehetsged van arra is, hogy a vgrl kezdd a szmolst. A kiolvass irnya to vbbra is balrl jobbra mutat, de ezttal negatv kezdsorszmot kell megadnod.

Arq^you a practitioner of the lost art of cat jugglijrig?


-53 -52 -51 -50 ...
Lssunk nhny pldt:
Kezdd a -53-as s o rs z m t l s olvass k i 7 ka ra kte rt.

... -3 -2 -1

substr($job_desc, -53, 7)

Are you

Kezdd a -9-es sorszmtl, substr{$job_desc, -9) s olvasd ki az sszes fennmarad karaktert.

juggling?

ki a ceruzd!
Az albbiakban azt a PHP-kdot lthatod, amely a Risky Jo b s keressi eredm nyeinek HTML-tblzatt lltja el. Ptold a hinyz kdot, amelynek az a szerepe, hogy az ll sok lerst 100 karakterre mrskelje, valamint a felads dtumnl csak a hnapot, a na pot s az vet tntesse fel. ech o 'c t a b l e b o rd e r= "0 " c e llp a d d in g = 2 " > 1;

echo 1<td>Job Title</td><td>Description</tdxtd>State</tdxtd>Date Posted</td>'; while ($row = mysqli_fetch_array($result)) { echo '<tr class="results">; echo <td valign="top" width="20%">' . $row[title' . '</td>f; ] echo <td valign="top" width=50%">* . ....................... echo *<td valign="top" width="10%">' . $row[state' . '</td>'; ] echo <td valign=Mtop" width=20%">' . ....................... echo '</tr>f; . 1</td>; ...</td>r;

echo </table>;

most itt vagy >

529

Hegyezd ki a ceruzd!

- m egolds

Hegyezd ki a ceruzd! - Megolds


Az albbiakban azt a PHP-kdot lthatod, amely a R isk y jo b s keressi eredmnyeinek HTML-tblzatt lltja el. Ptold a hinyz kdot, amelynek az a szerepe, hogy az ll sok lerst 100 karakterre mrskelje, valamint a felads dtumnl csak a hnapot, a napot s az vet tntesse fel.

echo ctable border="0" cellpadding="2">*; echo !<td>Job Title</tdxtd>Description</td><td>State</tdxtd>Date Posted</td> ; while ($row = mysqli_fetch_array($result)) { echo 1<tr class="resuits">' ;

n e|yezz e|,rorn pontot a karakterlnc vgn, ami jelzi, hogy itt a lersnak esak egy rsze szerepel.

echo <td valign="top" width="20%> 1 . $row[1title* . '</td>f; ] echo '<td valign="top" width="50%"> . .

0,100) .... . '...</td>;

echo '<td valign="top" width="10%">1 . $row['state1] . '</td>'; echo <td valign="top" width="20%"> . echo

l/.Qi.Q).....

f</td>' ;

< /tr>

>

^ date_posted karakterlnc elejn a d-

)
echo ' </table>';

tm ll HH-NN- formtumban, ppen 10 karakter bosszsgban.

Nincsenek

Strbereknek
Lehetsged van arra is, hogy a PHP substr () fggv nyt mellzve magban az SQL-lekrdezsben csonkold az llsok lerst. Ehhez a SUBSTRING () nev MySQLfggvnyt alkalmazhatod, amely ugyanazokat a paramte reket vrja, mint a substr (), s a mkdse is hasonl. Az egyetlen klnbsg az, hogy ezttal a kezd sorszm nem 0, hanem 1 - gy az els 100 karaktert az albbiak szerint olvashatod ki: SELECT SUBSTRING(job_description/ 1,100) FROM riskyjobs; A PHP-fggvny hasznlatnak elnye, hogy gy mind a teljes, mind a csonkolt llshirdets a rendelkezsedre ll - ha a MySQL-fggvnyt alkalmazod, csak az utbbit rheted el, a teljes szveghez pedig csak egy jabb lekr dezssel juthatsz hozz.

hlye krdsek
K i Alkalmazhatom a substr ( ) fggvnyt -r j szmrtkekre is?

V \

Nem, kizrlag karakterlncokkal hasz nlhatod. Ha azonban egy olyan szm rl van sz, amelyet CHAR, VARCHAR vagy TEXT tpussal trolsz, az SQL-lel ki olvasva karakterlncot kapsz eredm nyl, nem pedig szmot, gy ez esetben alkalmazhat a substr ( . )

K . ! Mi trtnik, ha a megadott hosszrtk tlm u tat a teljes karakterlncon? Az eredmnyben ^ j a szkzk llnak majd kitlt karakterknt?

V !

A teljes karakterlnchoz jutsz hozz, mindenfle kitlt karakter nlkl. gy az albbi utasts egyszeren a .d og karakterlncot adja vissza: substr ( 'd o g ' , 0, 10)

530 9. fejezet

Karakterlncok kezelse s egyni fggvnyek

Tesztt
/

rd t a keressi parancsfjlt gy, hogy csonkolja az llshirdetsek szvegt s a fel ads dtumt!

Mdostsd a s e a r c h .p h p parancsfjlt a s u b s t r () PHP-fggvny alkalmazsval, hogy meg kurttsa az llshirdetsek szvegt s a felads dtumt! Ha ezzel elkszltl, tltsd fel a fjlt a webkiszolglra, s prbld is ki pr keresssel.

Selma elgedett, hiszen knnyedn tte^_ kintheti a tallatokat, s nem kell hossza dalmas grgetssel tltenie a drga idejt.
0 0 _____________________________

Danger! Your dream Job is out there. Do you have the guts to 90 find it?

Risky Jobs - Search Results


Job Title
Tightrope W alker Master Cot Juggler Tightrope Tester

. . Dcscnpuon
fled glin g big top looking for three -ring professional with 1 3 y ea n o f experience to perform tigfcir... Are you a practitioner o f the lost art o f cat ju ggling? Banned in forty countries.only the Jim Ru7~. If the th [angling for hours on end from great ' .then t h i -

State
TX AZ MT

Date Posted
2008 n 14

A felads idpontja
is tisztbb vlt gy,

hogy csak a dtumot tnteted fel, a pon tos idt nem.

Agytorna
Hogyan mdosthatjuk az oldal szerkezett s a lekrdezst, hogy a tallatokat a felads dtuma, az llam vagy az lls m egnevezse szerint rendezze?

most itt vagy

531

a keressi eredm nyek rendezse

A tallatok tbb lekrdezssel rendezhetk


Ha azt szeretnd, hogy a ltogatk rendezhessk a kapott tallatokat, elszr is mdot kell adnod nekik arra, hogy meghatrozzk a rendezsi szempontjai kat. Taln egy rlappal... vagy gombbal? Nos, ennl jval egyszerbb megol ds is ltezik! A HTML segtsgvel az oszlopok fejlceit hivatkozsokk alakt hatod a keressi eredmnyek tbljban. A felhasznlknak ezutn csak annyi feladatuk van, hogy arra a fejlcre kattintsanak. amelyik szerint rendezni sze retnk az eredmnyeket.

A felhasznlk tovbb finomthatjk a ke resst, a fejlcek alapjn rendezve a tal


Danaer! Your dream job is out there. Do you have the guts to go find it?

latokat. Erre lehetsget adhatsz, ha a fejlceket hivatkozsokk alaktod, ame lyekre kattintva a kvnt rendezst kapjk.

Risky Jobs -Search Results


Job Title
Prize Fighter Toreador Electric Bull Repairer

Descripcin
Up and coming super fly (B a t wc.ghl boxer i s opponent to help build his winning record. S low f... MO

Date Posted
2 0 08-11-14 2 0 0 8 -1 1 -1 4 2 0 0 8 11-14

LoveW bovine* waiting for your s u p e r i o r non-violent ID cape having skills. Must pass basic bull ftgbli... Hank * Honky Tonk need* an experienced electn c bull repairer. Free rides (after you tix it) and hal... NJ

A hivatkozsok ugyanazt a Search parancsfjlt tltik majd be, de a lekrdezs mindig m egfelelkppen rendezi az eredmnyeket. Szerencsre mr ismered az ORDER BY zradkot, amellyel rendezett eredmnyekhez juthatsz. Nem ma rad ms dolgod, mint megrni a klnfle oszlopok alapjn rendezett eredm nyeket ad SQL-lekrdezseket, gy a tallatokat bcsorrendbe llthatod az lls m egnevezse, lersa vagy az adott llam szerint, illetve idrendi sor rendbe a felads dtumnak m egfelelen. Lssuk most azt az SQL-lekrdezst, amely az llshirdets szvege szerint l ltja bcsorrendbe a tallatokat:

SELECT * FROM risky jobs WHERE description LIKE '%Bull%' OR description LIKE '%Fighter % 1 OR description LIKE 1 %Matador % 1 ORDER BY description

Ezzel a sorral rendezed a lekrdezs eredmnyeit az llshirdetsek sz vegnek bcsorrendje szerint.

532 9. fejezet

Karakterlncok kezelse s egyni fggvnyek

Hegyezd ki a ceruzd!
rj hrom lekrdezst, amelyek a Risky Jo b s keressi eredmnyeit az lls m egne vezse, az llam, valamint a felads dtuma szerint rendezik, ha a felhasznl a window, washer, skyscraper" kereskifejezst adta meg!

Hogyan lehetne trni ezeket a lekrdezseket gy, hogy az llshirdetsek s az llamok fordtott sorrendben jelenjenek meg? Hogyan jelentend meg a legfris sebb hirdetseket az els helyeken?

most itt vagy >

533

az ORDER BY rendezi a keress tallatait

Hegyezd ki a ceruzd! - Megolds


rj hrom lekrdezst, amelyek a Risky Jo b s keressi eredmnyeit az lls megne vezse, az llam, valamint a felads dtuma szerint rendezik, ha a felhasznl a window, washer, skyscraper kereskifejezst adta meg! SELECT * FROM riskyjobs WHERE description LJJ^E %window%' OR description L|^E Swasher %* OK description L[JE K 0 /os]ofsc>raftr0o / ORDER B y job__t'rtle

Az ORDER BY alapr telmezs szerint nvek v sorrendbe rendez, gy it t egyenrtk az ORDER BY job J i t l e ASC utastssal.
. * .............................................................................................................................................................

SELECT /* FROM rjskyjobs....................................................................................... WHERE dcsdrip-tioh L|^E


.4?.s.4 r.'P .i? 9 T .

w%/ OR description L !K . T^shcr%; OR.

7 ? s k y s r a p c r % ; ......................................................................................................................

...O R p E R B / .sta ^ ...........................................................................................................................................................................................

WHERE description Ll^E '%Y/mdow%; OR description

^0v^ shc'r.^ .^8. ^ /

ORDER B y datc_postcd Hogyan lehetne trni ezeket a lekrdezseket gy, hogy az llshirdetsek s az llamok fordtott sorrendben jelenjenek meg? Hogyan jelentend meg a legfris sebb hirdetseket az els helyeken? SELEC T * FROM riskyjobs WHERE desCription L|^E '%>wmdow%' OK desdiription L|^E *%washer%; OR

Ezekre a lekrdez sekre akkor lehet szksg, ha a fe l hasznl mr ren dezte az eredmnye- J kt valamelyik o s z - ^ lop fejlcre kat tintva, s most jra erre a fejlcre kat tin t.

desCription L|JE *%skysCraper%'

ORDER B / jo b ^ trtk DESC...................................................................................................... SELECT * FROM riskyjobs......................................................................................................... WHERE desCription L jtE ^ov/indo*/^ OK dcsdV iptor> L (^ . description Lfj^E '%slcyscraper%' ORDER B y state DESC SELECT * FROM riskyjobs WHERE description L|*E '%windov/%* OK description L l^E v %wasKer%; OR
description L|^E '%skysCraper%'

OR

ORDER BV date_j>osted DESC

534 9. fejezet

Karakterlncok kezelse s egyni fggvnyek

gy tnik, rengeteg ism tld# kdot kell hasznlni a lekrdezsekhez. Nincs md annak elkerlsre, hogy a lekrdezst felpt kdet hrom szor vagy akr h a tszo r kelljen begpelni?

Nos, valban igaz, hogy klnfle lekrdezseket kell vgrehajtanod, amikor a felhasznl ms-ms fejlcre kattint, de elg egyetlen lekr dezst felpteni a kivlasztott hivatkozsnak megfelelen.
Az eredm nyek els m egjelentsnl a felhasznl mg nem kattintl atott egyetlen hivatkozsra sem, gy nem kell trdnd a rendezssel. Mind ssze be kell olvasnod a keress kulcsszavait, s felptened egy lekrde zst az ORDER BY nlkl. Az eredm nyek fejlcei hivatkozsok, am elyek re kattintva a program visszatr a parancsfjlhoz, de mindig ms s ms rendezst alkalmaz. Vagyis minden hivatkozs egy URL-t tartalmaz az ere deti kulcsszavakkal, valamint egy sort nevezet paramterrel, amely jel zi. hogy miknt kell rendezni az eredmnyt. Mindennek a megvalstsban nagy segtsget nyjthat egy egyni fgg vny. amely beolvassa a rendezshez szksges adatokat, majd egy karak terlncot ad vissza a m egfelel WHERE s ORDER BY zradkokkal. Az j egyni fggvny a sort paramter alapjn dnt a rendezs mikntjrl. Mkdse sorn az albbi lpseket kell kvetnie: Elvgzi a kereskifejezs elfeldolgozst, s egy tm b ben trolja a kapott elemeket. Beolvassa a sort paramtert - amennyiben rendelkezs re ll amelynek alapjn majd elvgzi a rendezst. Megszabadul az res keresszavaktl. Ltrehozza a keresszavakat tartalmaz WHERE zradkot.

o
Q

Megvizsglja, hogy rendelkezik-e valamilyen rtkkel a sort paramter. Ha igen, beilleszti a megfelel ORDER BY zradkot. Visszaadja az elksztett lekrdezst.

gy tnhet, hogy mindez igen sok munkt jelent, de a kd nagyobb r szt mr elksztetted - mindssze egy fggvny alakjba kell ntened. Mieltt azonban ezt megtennd, foglalkozzunk egy kicsit az egyni fgg vnyekkel ltalnossgban...

m o st it t vagy

535

egyni php-fggvnyek rsa

jrahasznosthat kd - fggvnyekkel
A fggvny nem ms, mint egy a kd tbbi rsztl elklnl kdblokk, amelyet a parancsfjl brmely pontjn futtathatsz. Az eddigiekben beptett fggvnyeket hasznltl, am elyeket a PHP eleve a rendelkezsedre bocst. Az explode ( ) , a substr () vagy a mysqli_query () ilyen fggvnyek, amelyeket tetszleges parancsfjlban felhasznlhatsz. Ha azonban olyan lehetsgeket szeretnl ignybe venni, amelyeket maga a nyelv nem biztost, magad is kszthetsz egyni fggvnyeket - az gy rgz tett kdot jra s jra felhasznlhatod, anlkl, hogy ismt le kellene rnod. Ha szksged van r, nem kell mst tenned, mint egyszeren meghvni a fggvnyt a nevvel. Az albbiakban egy replace_commas () nevezet egyni fggvnyt muta tunk be, amely a megadott karakterlnc vesszit szkzkre cserli:

Az egyni fggvnyek lehetv teszik, hogy nevet adj a PHPkdrszleteknek, s gy jrahasznosthasd azokat.

Ha egyni fggvnyt rsz, mm function" kulcsszval kell kezdened a meghatrozst

Itt a fggvny neve ll - a lekor|t|anok( de f. demes trekedned arra, hogy beszdes nevet vlassz.

< * * *

- * . ?
rt6 W -

function

/ replace

c o m m a s ($str)

{ $str);

A kapcsos zrjel a ciklusokhoz vagy az i f utastshoz hasonlan a fggvny kdjnak kezdett jelzi.

$new_str = str_replace (1 , 1 , f V return $new_str;

A fggvny egy rtket is visszaadhat a hv kdnak - ebben az esetben a mdostott karakterlncot.

Ha hasznlni szeretnl egy egyni fggvnyt, egyszeren hvd meg a neve megadsval, tovbb add t zrjelben felsorolva a m kdshez szks ges paramtereket. Ha a fggvny visszatrsi rtkkel is rendelkezik, hoz zrendelheted egy j vltozhoz, valahogy gy:

Itt a tightrope, walker, circus" karakterlncot adod t. ^


$clean__search = replace__commas (1tightrope , walker, c i rcus1);

A fggvny egy j karakterlnccal tr vissza, amelyben a vesszk he lyett szkzk llnak.

536 9. fejezet

K arakterlncok kezelse s e g y n i fggvnyek

Lekrdezs felptse egyni fggvnnyel


A Risky Jo b s keressi lekrdezst elllt egyni fggvny kdjt nagy rszt mr elksztetted - nem kell mst tenned, mint elhelyezni a korbbi kdrszleteket egy PHP-fggvny trzsben. Lssuk ht, hogyan is fest A fggvnynek a $user_search z egyni b u ild _ q u e r y () fggvny: tmbt adod t, amelyet a ke-

resomezobe rt adatokbl hoz


function build_query($user_search) { $ se a rc h _ q u e ry = "SELECT * FROM r i s k y jo b s " ;
/ / A k e re s s z a v a k b e o lv a s s a egy tmbbe $ c le a n _ s e a r c h = s t r _ r e p l a c e ( 1, , ' , $ u s e r _ s e a r c h ) ; $search _w ord s = e x p lo d e ( $ c le a n _ s e a r c h ); $ fin a l_ s e a r c h _ w o r d s = a r r a y ( ) ; i f (c o u n t($ s e a r ch_w ords) > 0) { fo r e a c h ($search _w o rd s a s $word) { i f ( ! em p ty($w ord )) { $ f i n a l s e a r c h w o rd s[] = $word; } J } // A WHERE z ra d k l t r e h o z s a az s s z e s k e r e s s z v a l $ w h e r e _ lis t = a r r a y ( ) ; i f (c o u n t($ fin a l_ s e a r c h _ w o r d s ) > 0) { f o r e a c h ($ fin a l_ s e a r c h _ w o r d s a s $word) { $ w h e r e _ l i s t [] = " d e s c r i p t i o n LIKE ' %$word%'"; } } $where c la u s e = im p lo d e ( OR T, $where l i s t ) ; / / A WHERE z ra d k h o zzad sa a k e r e s s i le k r d e z s h e z if ( ! em pty($ w h e r e _ c la u s e )) { $ se a rc h _ q u e ry .= " WHERE $ w h e r e _ c la u s e "; }

tl ltre.

A fggvny belsejben semmi jdonsg nincs.

return $search_query;

Nos, ez kivtelesen j... Itt adod vissza az j le krdezst tartalmaz karakterlncot a hv kdnak.

A b u ild _ q u e r y () fggvny egy teljes SQL-lekrdezst ad vissza, amelyet a $ u s e r _ s e a r c h paramterben tadott kereskifejezs alapjn llt el. A fggvny hasznlathoz mindssze t kell adnod a keresm ezben ka pott kifejezst, s az eredmnyt egy $ s e a rc h _ q u e ry nev karakterlncban trolni: $ s e a rc h _ q u e ry = b u ild _ q u e r y ( $ u s e r _ s e a r c h ) ;
sA

fiT Ezzel a vltozval trolhatod a fggvny eredmnyt, ami itt az j keressi lekrdezs.

Itt adod t a keresmezben b p o tt rtket,

m o st i t t vagy >

537

interj egy egyni fggvnnyel

Egyni fggvnyek - lehull a lepel


Heti interjnk:
Egyni fggvnyek: mekkora egynisgek valjban?

Agyhullm: Nzze, mr rgta tprengek valamin: mi


a baj az ismtld kdokkal? Megrom, lemsolom, beillesztem - s ksz!

Agyhullm: Nos, el kell ismernem, ez nem akrmi! De to


vbbra sem ltom, hogy mirt kellene vltoztatnom a jl bevlt szoksaimon csak azn, hogy nt hasznljam... mrmint, ha nem srtem meg, azrt nnek is vannak korltai! gy tudom, csak karakterlncokat fogad el.

Egyni fggvny: Ja j, nehogy n is ezzel az ismtld


kd" szveggel jjjn! Mindketten tudjuk, hogy egy szeren bntja a szemet, radsul nehezebben olvas hatv teszi a kdot. Nem elg ennyi? Persze szmos ms ok is van, amirt utlkozhatunk!

Egyni fggvny: Ht ezt meg honnan veszi? Olyan


adattpust fogadok, amilyet csak kldenek nekem! Ha a bennem lev kd kpes kezelni ezeket az adato kat, n nem ellenkezem . s klnben is, nem em lk szik, hogy legutbb egy tmbt adott t? Ezt nem ne veznm knny falatnak!

Agyhullm: Teszemazt? Egyni fggvny: Mi van, ha valami megvltozik a kd


ban? Ez bizony elg gyakran megesik!

Agyhullm: Na s? A dolgok vltoznak, ez a termszet


rendje. Ha csak ez a gond, trok n mindent.

Agyhullm: Na j, de egy karakterlncot adott vissza... Egyni fggvny: Azt adok vissza, amit csak szeretne.
Csak aknzza ki a lehetsgeim et, s hasznljon meg felel mdon.

Egyni fggvny: No de mi van akkor, ha a vltozs


az ismtld kdot rinti? Mondjuk t vagy tz helyen az alkalmazs klnbz pontjain?

Agyhullm: Na, ez meg a msik... n annyira kvetel


dz! Elvrja, hogy adatokat adjak t.

Agyhullm: Nem rtem, mi itt a gond. Megkeresem


a helyeket, trom a kdot, s ksz.

Egyni fggvny: Kitl hallotta ezeket a marhasgokat?


Ha kedve tartja, s felkszt r, egyltaln nem kell semmit tadnia. Ha ezt szeretn, amikor ltrehoz en gem, hagyja resen a nevem utn ll zrjelprt. Br szintn szlva nem igazn rtem, mirt ne akarna t adni legalbb egy kevs adatot... radsul a r e tu r n utastssal vissza is kaphat valamit!

Egyni fggvny: Nagyszer, de sajnos nk, progra


mozk. emberbl vannak - mi van, ha egy hely kima rad? Ezt aztn nehz lesz ksbb megtallni!

Agyhullm: OK. elismerem, megfogott! De hogyan n


tud segteni?

Egyni fggvny: . ksznm a krdst. Ha a kd p


pensggel egy fggvnyben tallhat, elg egyetlen helyen trni. Ennyi. Vge. Finito.

Agyhullm: Lejrt az idnk, ideje bcszni. Ksznm,


hogy eljtt.

Egyni fggvny: Szra sem rdemes... rszemrl a sze


rencse. Vagy szerecsen? Na mindegy, valami ilyesmi...

538 9. fejezet

Karakterlncok kezelse es egyni fggvnyek

Tsztt
Mdostsd a Search parancsfjlt gy, hogy a build_query( ) fggvnyt hasznlja!
rd meg az j b u ild _ q u e r y () fggvnyt a s e a r c h .p h p parancsfjlban, s helyettestsd a m eg felel kdot a fggvny hvsval. Tltsd fel az eredmnyt a webkiszolglra, s prbld ki egy bngszben, hogy a keress valban megfelelen mkdik-e.

Az egyni build_|uery() fggvny valban nagyszer, de nem rendezi a keress eredm nyt. Vajon egy jabb para m terrel erre Is kpess tehe tn m ?

Ht persze! A build_query ( ) fggvnynek nyugodtan tadhatsz kt paramtert is.


A fggvnynek eleve tadod a $ u s e r _ s e a r c h paramtert, ami a felhasznl keresszavait tartalmazza. Szksged van azonban egy tovbbi, $ s o r t neveze t paramterre is, ami jelzi, hogy miknt rendezed az adatokat. Az j param ternek alkalmasnak kell lennie arra, hogy tadja az 535. oldalon lein hatfle rendezsi mdot: az eredmnyeket rendezheted a r i s k y jo b s tbla j o b _ t i t l e , s t a t e s d a te _ p o ste d oszlopai alapjn emelked, illetve cskken sorrendben is. A $sort vltozban magukat az ORDER BY karakterlncokat is trolhatnd, de hasznlhatod az 1-6 szmokat is a rendezsi tpusok lersra:

= 1 m ORDER BY job title


= 2

Az lls lersa alapjn b csorrendbe rendezni az ered* menyeket nem tlzottan gy mlcsz' mdszer, hiszen a sorrend ez esetben nem so kat segt az eligazodsban.

ORDER BY job_title DESC ORDER BY state ORDER BY state DESC ORDER BY date posted ORDER BY date posted DESC

Ezeket a szmokat s a hozzjuk tartoz jelen tst tetszs szerint v laszthatod meg. Erre nz ve nem ltezik semmifle szably - csak az a fon tos, hogy kitarts az ere deti vlasztsod mellett.

= 3 = 4 = 5
= 6

Az utbbi megolds felveti a krdst: nem teszed ilyen hasratsszer sz mokkal mg tlthatatlanabb a kdot? Megfelel dokumentci nlkl val ban ezt kockztatod, de a szmok hasznlata mellett egy igen slyos rv szl. I la az ORDER BY karakterlncokat hasznlnd, azok m egjelennnek a fejlcek hivatkozsaiban, felfedve a tbla oszlopneveit - ezt pedig biztonsgi okokbl clszer elkerlni.

most itt vagy 539

bzd a rendezst a felhasznlkra

Nagyszer, m r rtem , hogy mkdik a $eort paramter, de h onnan tudhatom , hogy m ikor melyik rtket adjam t a fggvnynek? E z t nem a felhasznlnak kellene megadnia?

Valban, a felhasznlnak kell megadnia a rendezs mdjt ppgy, mint magukat a keresszavakat.
A j hr azonban az, hogy mr tudod, mit kell tenned: az eredmnyek tbljban hivat kozsokk alaktod az oszlopok fejlceit. Ha pedig a felhasznl egy fejlcre - legyen ez pldul a State - kattint, tadod a megfelel szmot a b u ild _ q u e ry () fggvnynek. Mr csak azt kellene megtudnod valahonnan, hogy milyen sorrendben vgezd a ren dezst. Ennek meghatrozsrl a fejlcek hivatkozsainak ltrehozsnl gondoskod hatsz, a m egfelel s o r t paramtert helyezve el az URL-ben:

A keress eredmnyei egy HTML-tblzatba kerlnek, ezrt ll itt a < t d > cmke.

A weboldalt szeretnnk jra betlteni, amikor a felhasznl egy oszlopfejlcre kattint, ezri nhivatkozv kell tenned az rlapot.
f

V
. $ SERVER [ PH P S E L F 1 ] . &sort= 3 " > S t a t e < / a X / t d > ! ;

$sort links .= ' < t d X a href = " ' '?usersearch=' . $user_search

A b u ild j|u e ry () fggvnynek szksge van ^ a felhasznl keresszavaira az eredmnyek meg jelentshez, gy ezeket is tadod az URL-ben.

A rendezs adatait is tadod, jelezve a felhasznl vlasztst. Mivel itt az llamrl van sz, a so rt" rtke 3.

Az eredmnyoldal elksztse sorn az sszes fejlc - a Jo b Description kivtelvel sajt IJRL-t kap, ami magban foglalja a rendezst ler s o r t paramtert is.

<a K rc -V a rd K fK p ? u s < rs c a rd K ~ b u ll ig h te v r*a a d o r& s< *"t-/">


fs

O O

Risky jobs - Search

Az llsok lersa szerinti


Danger! Your dream job is out there. Do you have the guts to go find it?

rendezsnek nincs sok rtel

me, ezrt ezt a fejlcet nem

Risky Jobs - Search Results


Jo b Title

rdemes hivatkozss fenni.


State Date Posted

<a K rc usc3rK.php?uscrsearhbuli fig h tfr wva-lador&sor-t^ *> y

<a h vef'seavdh pHp^usevseardhbull -figK-tr ^a ia d o v'& s o rt 1 * > $

540 9. fejezet

Karakterlncok kezelse s egyni fggvnyek

Hm. A z t m r rtem , m iknt ha sznlhatk ezek a hivatkozsok az els hrom lekrde zsnl, de mi a helyzet a m sik hrom ORDER 3Y zradkkal, amelyek cskken s o rre n d e t adnak. Hov kerljenek?
O

Joe: Elvileg ugyanazzal a fejlccel lehetne mind a nvekv, mind a cskke n rendezst elrni. Jill: Igen, ezt szeretnnk. Ha a felhasznl a fejlcre kattint, a rendezs ir nya megvltozik.

Frank: Viszont ez esetben valahogy trolnunk kellene a fejlcek llapott, ami minden kattintssal megvltozik, hiszen az j hivatkozsnak ellenttes sorrendet kell eredmnyeznie. Joe: Nem igazn rtem, mire gondolsz... Frank: Nos, a fejlcek nem mindig ugyanolyan rendezst adnak. Ha pldul a ,Jo b Title" fejlcre kattintottunk, s nvekv sorrendben ltjuk viszont az llsok megnevezseit, a hivatkozsnak a kvetkez alkalommal csk ken sorrendet kell adnia.
Jill: Valban. De ne felejtsd el, hogy minden rendezsi tpusnak megfelel egy szm a hivatkozs URL-jben. ami meghatrozza a rendezs irnyt. Mivel pedig mi magunk hozzuk ltre ezeket a hivatkozsokat, mi is dn tnk rla, hogy milyen szmokat helyeznk el bennk.

Joe: rtem. Akkor ht az a feladatunk, hogy7 olyan kdszerkezetet kszt snk, ami kpes ellltani a megfelel hivatkozst a rendezs aktulis lla pota fggvnyben. Frank: Megvan! Nem oldhatnnk meg mindezt pr i f utastssal? Nem p pen ilyen dntshozatali helyzetekre talltk ki ket? Joe: Nos, ez akr j is lehetne, de itt egy klnleges helyzettel llunk szem ben, hiszen sok dntst kell meghoznunk egyetlen adat, a rendezs tpusa alapjn. Jo b b szeretnm, ha tallnnk valami tlthatbb megoldst az egy msba gyazott i f - e l s e blokkok sokasga helyett.
Jill: ppen most hallottam egy j utastsrl, s annak alapjn, ahogy Jo e vzolta a helyzetet, ppen megfelelne a cljainknak! A s w itc h lehetv te szi, hogy egyetlen rtk alapjn tbb - kettnl sokkal-sokkal tbb - dn tst hozzunk.

Frank: J l hangzik! Mirt is ne prblnnk ki? Joe: Egyetrtek! Brminek rlk, ami kivezet az i f - e l s e utastsok dzsungelbl. Rosszul vagyok, ha rjuk gondolok!
Jill: Legyen gy! Lssuk, mit hoz az j jvevny...

m o st i t t vagy

541

a php switch utastsa

Ha az IF nem elg - itt a SWITCH!


A s w itc h utasts hatkony mdot ad arra, hogy egy rtktl fggen k lnbz kdrszleteket hajts vgre. Ha ugyanezt i f - e l s e utastsokkal szeretnd megvalstani, egsz hadseregre lenne szksg bellk, klnsen, ha a dntsi lehetsgek szmosak. Ahelyett teht, hogy egymsba gyazott i f - e l s e utastsokkal vizsglnd meg a lehetsges rtkeket, egyetlen sw itc h utastst hasznlhatsz, amelyben minden lehetsges rtkhez egy c a s e cmke tartozik. Az egyes c a s e kdrszletek vgn egy-egy b re a k utasts ll, ami arra utastja a programot, hogy hagyja el a s w itc h utastst, s ne trdjn a tbbi c a s e cmkvel. Ezzel biztosthatod, hogy a PHP legfeljebb egy c a s e kdrszletet hajtson vgre. Nzznk most egy pldt a s w itc h hasznlatra:

A SWITCH utasts ^ CASE cmkbl


^3?

ll, amelyek klnfle


, - i ^ Intal/A t h a lt n a k K O u rtJS iB lv J ftflV VltOZ r t 31

ktl fggen,

Ezt az rtket vizsglja


switch (Sbenefit code) case 1 : $benefits = 'Major medical, 1 0 sick days';
2 a kd C$ak akkor f t u

. . .

, v r

a switch utasts - ettl fgg teht a dnts.

A break utasts hatsra a PHP kilp a teljes switch utastsbl.

*8'

3 $benefit_code

$benefits = 'Death and dismemberment only, one month paid leave'; break, case 3 : case 4 : $benefits break, default: ^ ^

^ ugyanazt szeretnd tenni fbb rtk esetn, csak hagyd el a break utastst, amg el nem red az utols szba jv' rtket.
1

= 'Good l u c k ! '; ^ ^ $benefit_eode rtke nem 1, 2,

3 vagy 4 , a program ezt az alaprtelmezett kdot hajtja vgre.

$benefits = 'None.

echo echo

'We offer(four^coiiprehensive benefits packages'; 'The plan you have selected: ' . $benefits;

A felirat hibs, hiszen mindssze hrom csomag ll rendelkezsre. A 3 s a 4 kd ugyanoda vezet, mivel a 3 case ctmkeje 5 4 2 9. f e je z e t
u t n n e m

ll break utasts.

Karakterlncok kezelse s egyni fggvnyek

Gyakorlat

A Risky Jo b s egy j fggvny, a g e n e r a t e _ s o r t _ l i n k s () segtsgvel teszi lehet v a felhasznlknak, hogy az eredmnyeket a tbla fejlceire kattintva a megfelel oszlopok szerint rendezzk - sajnos azonban nhny igen fontos rsze hinyzik. Egsztsd ki a fggvny kdjt, s ne feledd a rendezsi tpusok kdszmait: 1 = l ls m egnevezse szerint em elked, 2 = lls m egnevezse szerint cskken, 3 = l lam neve szerint em elked, 4 = llam neve szerint cskken, 5 = felads dtuma szerint nvekv s 6 = felads dtuma szerint cskken.
generate_sort_links($user_search, Ssort) {

Ssort links = ' ' ;


(Ssort) {

c a se 1:

S s o r t l i n k s .= 1<td><a h r e f = " . $ SERVER[PHP SELF*] 1? u s e r s e a r c h = ! . $ u s e r s e a r c h * &sort= ">Job T itle< / a > < / td > < td > n escrip tio n < / td > 1; Ssort_lin ks - T< t d X a h r e f * w . $_SBRVER [ PHPJ3ELF' ] . ? u s e r s e a r c h = f . S u s e r s e a r c h &sort= i i " > S t a t e < / a x / t d > 1; Ssort_lin ks = T<td><a h r e f = " 1 . $_SERVER[ PHP SELF ] . T u s e r s e a r c h = T . $ u s e r s e a r c h ?
T&sort=
case 3:

M >Date P o s t e d < / a X / t d > ;

$sort links 1&sort= $sort_links ' &sort= $sort_lin ks & s o rt =


case 5:

.= C t d X a h r e f = " . $ SERVER[ 1PHP SE LF ] " > J o b T i t l e < / a X / t d > < t d > D e s c r i p t i on</td> 1 = * < t d X a h r e f = " 1 . $ SERVER [ ' PHE'_SELF! J " >State</aX/td> *; = * <td><a h r e f = M1 . $_SERVER[ PHP_SELF'J
ff

' ?usersearch= ' ?usersearch='

. $user search . $user search

. . .

T? u s e r s e a r c h - * . S u s e r s e a r c h

>Date Posted</a></ td > ;

$ s o r t l i n k s .= ' < t d X a h r e f = " . S SERVER [ TPHP SELF J . ' ? U s e r s e a r c h * . $u ser sea rch

' &sort^
S so rtlin k s 1i s o r t = $sc*rt_links

_" > J o b T i t l e < / a > < / t d x t d > D e s c r i p t i o n < / t d > ' = 1<td><a h r e f = " ' . $_SERVER [ ' PHP_SELF] " > S t a t e < / a X / t d > *; = ' < t d x a h r e f = f . $_SERVER[ ' PHP_SELF'] '?u sersearch -' . Suser search ' ?usersearch^' . $user_search

ksort^

">Date P o s t e d < / a X / t d > f ;

$ s o r t _ l inks *sso rt$ s o r t _ l inks 1&sort~ $sort._] inks ' &sort-

= <td><a h r e f -

" 1 . $_SERVER[ r PHP_SELFf ]

?usersearch='

. Susersearch

">Job Title< / aX / td > <td> D escription< / td> ' ; = ' C t d X a h r e f = " 1 . $_SERVER [ ' PHP_SELF ] . ">State</aX/td>' ; = ' < tdX a href = " ' . S_SERVER[ PHP_SELFT] . ' ?usersearch=' . Suser search ">Dat_e P o s t e d < / a X / t d > ; ' ?usersearch= . Suscr_search

Ezek az alaprtelmezett fejlcek, amelyek ak


return

kor jelennek meg, ha a felhasznl nem v lasztott rendezsi mdot.

most itt vagy

543

a generate sort Jinks!) fggvny teljes kdja

Gyakorlat - megolds

A R isk y jo b s egy j fggvny, a g e n e r a t e _ s o r t _ l i n k s () segtsgvel teszi le hetv a felhasznlknak, hogy az eredm nyeket a tbla fejlceire kattintva a m egfelel oszlopok szerint rendezzk - sajnos azonban nhny igen fontos r sze hinyzik. Egsztsd ki a fggvny kdjt, s ne feledd a rendezsi tpusok kdszmait: 1 = lls m egnevezse szerint em elked, 2 = lls m egnevezse sze rint cskken, 3 = llam neve szerint em elked, 4 = llam neve szerint cskken, 5 = felads dtuma szerint nvekv s 6 = felads dtuma szerint cskken.
$sort) { 1,

uttd'fc.iott

q e n e r a t e s o r t ' l i n k s ( $ u s e r s e a r c h ,

$sort_iinks =

Amennyiben a $sort rtke

mr rendezted

switch
c a s e 1:

($sort) {

az eredmnyt az lls megnevezse szerint, gy most cskken sorrendre kell vltanod.


. ' ?usersearch=' ?usersearch-' ?usersearch=' . $user search . $user search . $user search

$sort_lin ks '& sort= ' &s ort = f &sort^

.= <td><a h r e f = " 1 . $_SERVER[ PHP_SELF*] .= '<t d> <a h r e f = " * ; . $ SERVERfPHP SELF ] .= ' < t d x a h r e f = "

"> Job 'ritIe</a></td><td>D escription</td>' ; . $_SERVER[ r PHP S E L F ' ] . .

$sort_links Ssort_lin ks 6

J> .......> S ra te </ a> < / td >

" >Da t e P o s t e d < / a X / L d > ;

b re a k ;
c a s e 3: $sort lin ks &s ort = $sort_links 'S s o rt' &s ort =
b r e a k ; ...............

.= ' c t d X a h r e f =
I

. $_SERVER[ ' PHP_SELFr J . $ SERBIER [ PHP SKLF 1 . $_SERVER L* PKP_SEI.F, ]

1? u s e r s e a r c h = '

. $aser search

> J o b T i l l e < / a X / t d X t d > D e s c r i p t i o n < / t d > ' ; = ' <tdX a href = "'

? u s e r s e a r-:h=f . S u s e r s e a r c h ?usersearch"-' . $user search

4*
Z

> S t a t e < / a X / t d > ; 1<td><a h r e f = " ' "> Date P o s t e d < / a X / t d > ;

$sort_link:s

c a s e 5: $sort_lm ks 'iso rt= $sort_links f &sort= ' &sort3


i

.= '< t d X a h r e i |

'

. $_SERVER[ ' PHP_SELF']

. . .

? u s e r s e a r c h - . $ a ser search $usei search '?u sersearch = ' . $user search

">Job T itle < / a x / td X td > D e s c r ip tio n < / td > ; .= ' < t d X a h r e f = " . $_SERVER[ PHP SELF1] ">State</aX /td>*; .= <td><a h r e f " 1 . $ SERVEiR[* PHP__3EIiFT] "> Date P o s t e d < / a X / t d > 1;

Ssort_lin ks

. break;......... de-fauli:
$sort_links ' &sorr_'& sort &sort= | 3 5 Ssort_lin ks $sort_lin ks .= <td><a h r e f = . $_SERVERf1PHP_SELF'j . 1? u s e r s e a r c h = 1 . S u s e r s e a r c h ? u s e r s e a r c h -1 . $user search l?usersearch=' . $user search " > J o b T i t 1 e < / a X / t d > < t d > D e s c r i pt i o n < / t d > ' ; .= <td><a h r e f = " . $_SERVER[ ' PHP_SELF J . " > S t a t e < / a X / t d > 1; .= ' < t d X a h r e f = . $_SERVER[1 PHP_SELF' ] . ">Date P o s t e d < / a X / t . d > 1;

}
return / so rt links ;

Amennyiben a $sort rtkt mg nem lltottad be, ille t ve az rtke 2, 4 vagy 6, az eredeti hivatkozsokat kell megjelentened, amelyek nvekv sorrendet adnak.

5 4 4 9. fejezet

K arakterlncok kezelse s egyni fggvnyek

Rendezs a build_query() fggvnyben


Jelenleg kt fggvnynk is van a Risky Jo b s adatbzisban vgrehajtott keressek kezelsre. A b u ild _ q u e ry () felpti a m egfelel keressi lekrdezst a felhasznl kereskifejezse alapjn, mg a g e n e r a t.e _ s o r t_ l i nks () hivatkozsokat hoz ltre az eredmny fejlceihez, lehetv tve a tallatok rendezst. A b u ild _ q u e ry () azon ban mg korntsem ksz, hiszen az ltala sszelltott lekrdezs nem vgez rendezst. Ehhez hozz kellene rznie egy ORDER BY zradkot a lekrdezshez. Fontos azonban, hogy a megfelel rendezst hasznlja - ezt biztosthatod az j S s o r t paramterrel:

function b u i l d q u e r y ($usei se a rch , S so rt) { $ s e a r c h _ q u e r y - " SELECT * FROM r i s k y j o b s " ;

A $user_search mellett ezttal a $sort paramtert is tadod a fggvnynek.

// A WHERE z r a d k b e i l l e s z t s e a k e r e s s i i f ( ! empty( $where c l a u s e )) { $ s a r ch_^uery '* W ERE $ w h e r e _ c l a u s e ; H

lekrdezsbe

}
/ / A keressi lekrdezs r-entezsfc a Ssrfc "irtV.o alapjn Switch ($sort) { // l l s m egnevezse s z e r i n t emelked

c a s e 1:
y ORDER B? t i ti e";

break; /h. l l s megnevezse s z e r i n t cskken c a s e 2: $ se a rch query " ORDER BY t i t l e

DESC ;

// llam neve s z e r i n t emelked case 3: , | %; j * $ 3e a r eh que ry . - ORDER BY s t a t e ;


:break/ J % I .X I ;

Ezt a kdrszletet kell jonnan beil leszteni a build_query() fggvnybe. A switch utasts megvizsglja a $sort rtkt, s elhelyezi a megfelel' ORDER BV zradkot a keressi le krdezs vgn.

// llam neve s z e r i n t cskken

:
. - ORDER BY state DSC ; break; / felad s dLufAa s z e r i n t nvekv (rgebbi elszr) /

:
Ssearch^query % ORDF.R BY d a t e _ j . - o s l e c ; break; / :;telad dtuma szerint. cskken (jabb elszr) /

:
$ s e 5r c h _ q u e r y break; " ORDER BY d a . e p o s t e d D E S G ^ '

Amennyiben a felhasznl gy tlti be az eredmnyoldalt, hogy nem kattintott egyetlen fejlcre sem, a $sort resen

:
// nincs $ so rt b e l l t s , 1-gy nem rendezzk a lekrdezst

marad, gy alaprtelmezs szerint az eredmny nem lesz rendezett.

iiJ
return $search_query;

i 5H 1

Az elzekhez hasonlan a $seareh_query karakterlncot adod vissza, amelynek vgn azonban ezttal egy ORDER BY zradk is ll.
m o st i t t vagy >

545

prbld ki a search.php parancsfjl j vltozatt

Tesztt
rd t a Search parancsfjlt gy, hogy a kt j egyni fggvnyt hasznlja!
Ksztsd el a g e n e ra te _so rt_lin k s () fggvnyt a search.php parancsfjlban, s helyezd el az j kdrszletet a build _que ry () fggvnyben, amely gy kpess vlik rendezett lekrde zsek sszelltsra. Ne felejtsd el meghvni a g e n e ra te _so rt_lin k s () fggvnyt a parancs fjlban ott, ahol az eredmnyek fejlceit rjuk ki. Tltsd fel a parancsfjlt a webkiszolglra, nyisd meg a search.htm l oldalt egy bngszben, s prblj ki pr keresst. Ha megrkezett az eredmny, kattints a klnbz fejlcekre az eredmny rendezshez. Mindenkppen kattints tbbszr az egyes fejlcekre, hogy megfi gyeld a nvekv s cskken rendezs kztti vltst.
R isk y J o b s

R is k y
Risky Jobs - S
Find your

j j 's

D anger! Y o u r d rea m jo b is o u t there D o yo u h a ve th e gu ts to go find it?

A build_query() fggvny beolvassa a felhasznl kereskifejezst, szavakra bontja, s egy tmbben helyezi el az eredmnyt, eltvoltja az res karakterlncokat a tmbbl, majd elkszti a keresszavak alapjn a keressi lekrdezst a sort rtktl fgg ORDER BY zradkkal (mr amennyiben szksg van erre).
Riskyjobb - Search

ButTnghter Mataof

.51

(Sb it um

R is k y J
D a n g e r Y o u r dream jo b is out there D o y o u h a ve the g u ts to g o fin d it?

Risky Jobs - Search Results


A generate_sort_links() fggvny ltrehozza az oszlopfejlcek hivat kozsait, s elhelyezi a rendezsi belltsokat a megfelel URL-ekben.
Title Description

M atador Firefighter E icctac B ull RcpAircr

B ustling daii> farm looking for p an time m atador to VT entertain piiitcd hull w ith m ild ca*e o f \D D . ... T he C it> o f I>ata\ ill i t hiiing firefighter*..V> OH experienced requited > oa wilJ be trained. N on n o ... I b nir > B onky T onk,

Date Posted

2008-03-11 20 08 -0 5 22 2008-11*14

Vgre megkereshetem a legrgebbi

llshirdetseket, amelyeknek a feladi valban eltkltek, hogy egy m a ta d o rt alkalmazzanak Vermontbanl

546 9. fejezet

Karakterlncok kezelse s egyni fggvnyek

Ha azonban tgabb krben keresek, elveszek a ta l la to k rengetegeben.

f f f ee. e

Pi n n

Risky Jobs - Search

J j r1
D a n g e r! Y o u r d re a m Job is o u t th e re . D o y o u h a v e th e g u ts to g o fin d it?

Risky Jobs -Search Results

Rengeteg llshirde ts - egy szuszra ttekinteni ket szinte lehetetlen.

Job Title
Custaic Walker Shark Trainer Voltage Checker Amcnna Installer

Description
We reed people willing to test the theory that you can walk on custard. Were going to fill a swi...

State
NM

Date Posted
200847-24 2008 04-28 2008 06-28 2008-0904 2008-07-29 2008-08-17 200803-11 200803-24 2008-11-14 2008-07-14 2008 11-02 2008-1149 2008 11 14 2008 07-27 2008 05-22 2008-11-14 2008 11-14

Training sharks to do cute tricks for the audiences at our FL new water theme park. You 1 spend tim... 1 You'll be out in the field checking a r and d x . voltages NC in the range o f 3 to 250 or more volts. Y... You'll be installing antennas and other metallic broadcast receiving equipment on the roofs of Miami... FL CA TX VT CA TX FL NY MO ID NJ OH MO AZ

Elephant Proctologist Needed: experienced proctologist willing to work with large animals. Elephants at our zoo {in San Fr... Aiiplar.e Engine Cleaner Matador Jet airplanes needing engines cleaned. In need o f clean minded individuals willing to handle rust an... Bustling dairy- farm looking for pan time matador to entertain spirited bull with mild case o f ADD. ... Top celebrity photography firm looking for seasoned paparazzo to stalk temperamental lip syncing pop... Fledgling big top looking for three ring professional with I - years o f experience to perform tightr... 3 r u .mu lnvr -f.imals and hate plaque? W ell,then this for you! Our crocodile farm ... ih new faces. Full health insurance vided.M ust love kids.,.. es or. how good our pet food tastes, p make our products even better. ... waiting for your superior nor. violent Us. Must pass basic bull fighti... onk needs an experienced electric bull ____ s (after you fix it) and hal... The City S & a ta v ille is hinng firefighters. No experienced required -you will be trained.Non smo.~ Up and coming super fly gnat weight boxer needs an opponent to help build his winning record. Slow f... Master Cat Juggler Arc you a practitioner o f the lost art o f cat juggling? r* i-mirtries.only the Ji m R u iz _

Hogyan kerlik el ms webhelyek, hogy egyel-

a tallatok felsorolsa oldalakra bontva

A keress eredmnye oldalakra bonthat


A tallatokat jelenleg egyetlen oldalon jelented meg, ami gon dokat okozhat, ha sok alkalmas llshirdets szerepel az ered mnyben. Ahelyett, hogy a felhasznlkat rlt grgetsre knyszertend, rdemes oldalakra bontanod az eredmnyt. Ilyenkor a tallatokat csoportokra bontod, s minden csoportot kln weboldalon jelentesz meg, valahogy gy:

Minden oldalon t tallatot jelentesz meg, a tbbi oldalt pedig hivatkoz sok rvn teszed elrhetv. A fe l hasznlk gy egyszeren, pr kattin tssal ttekinthetik az eredmnyeket, nem knyszerlnek grgetsre.

Rtsky
Danger? Y o ur d re a m jo b i t o u t there D o y o u ha ve the g u t to g o fin d It?

Risky Jobs * Search Results

R isky
tO I

j
^

Job TWe

Description
W c cccd pCOpW

D a n g e r! Y o u r dream jo b i t o u t there O o y o u ha ve the gut* to go fto* ***


T

CmUfd Walkex Shari Tnur.ct

-Sac er h
j

Trtinlo* hark io do cott t our new water theme park You I! be out in the beid ct Vofeaya C he ckti in ihr ran^c of 3 lo 250 or Youll be icutHiug o l d /Vnicroa Inftaiier b?oadc*i tcceivicg t^uip Eieptui! Procioiofiu Needed, expcorcctd pnx Urge am rnais Elcpb*r.a t

w'*

R iA > Jobs -Search I W

j o b TJcfc v * i:P c Q ^ r Er*.riW M

Description

let iirplanr rites


mi oik*! individo

R isky J j-* .
ingert Y o u r dream Job l i out there D o y o u ha ve the g uts to go fin d It?

< 1 2 3 4 ->

Tightrope W alkrr

Ezekkel a hivatkoz sokkal ugorhatnak a felhasznlk a to vbbi oldalakra.

Jelenleg a oldalon vagyunk - ez az oldalszm teht nem hivatkozs.

Wf need tonv ireh new twei. Full health muancc and shift pad* piovidcd Must love lad* ^ you lovt* jininu W.: pride oum W on how oac our pet food ustci ftrt Food Tester Sow you can help wake nur prodpett ever, kcaci Lovely bovjDfi jfjiiinR tor your wper.or non- violent Toreador cape waving stall*. Must pwti banc ball figfeliElectric Ball Repair ark1 H ork, Toak wed* on c.perieoced ckctnc boll . rcpaocr. Free ride* (afeer you fix >*1 bl~ Thc City of Dtiavuic i* biriss firefighter*. No Firefighter cxptriecccc rebutted l~r Nor msodik

F kdfU nf bifi fop

|tpa:*rzo io tfelk

2 2 2 5 - Risky jobs -Search Result Top ccUbfity pho

Job Title
Mime

Description

S tate NY MO ID N3 OH

700*i I 02

Dale Posted
>W>5 11-CW 2008 11 14

2008 11 14 200R-05 22

<- J 2 3 4 ->

Ez nagyszer, de hogyan oszthatom csoportokra az eredmnyt? Az SQL-lekrdezs az sszes ta l la to t egyszerre adja vissza.

A lekrdezs eredmnyt r szekre bonthatod, amelyeket kln weboldalakon jele nthetsz meg.
Olyan lekrdezsre van szksg, ami az eredmnyeknek csak egy rszhalmazt adja vissza, nem az sszesei.
Szerencsre az SQL mdot ad erre is, mghozz a l i m i t zradkkal. rdemes ht jra ttekinteni a L I M I T lehet sgeit, hogy miknt hasznlhat arra. hogy a tallatokat ts csoportokra bontsd...

<

548 9. fejezet

Karakterlncok kezelse s egyni fggvnyek

A kvnt sorok kiolvassa a LIMIT segtsgvel


A megjelentend sorok meghatrozsnak kulcsfontossg lpse, hogy egy l im it z radkkal egszted ki a lekrdezst. Ha azt szeretnd, hogy legfeljebb t sor jelenjen meg, a LIMIT 5 utastst kell a lekrdezs vgre helyezned, valahogy gy:

SELECT * FROM riskyjobs ORDER BY job title LIMIT 5

A W/HERE zradk hinyban a lekrdezs az adatbzisban megtallhat sszes llst visszaadja, vagyis olyan ered mnyt kapsz, mintha nem adtl volna meg kereskifejezst.

Akrhny tallatot is kapsz, a lekrdezs csak az els tt adja vissza.

Ugye emlkszel mg, hogy a Risky Jobs lekrdezs sszelltshoz a build_query {) fggvnyt hasznltad? Ha azt szeretnd, hogy csak az els t tallatot adja vissza, nincs ms dolgod, mint hozzfzni a l im it 5 zradkot a lekrdezs karakterlncnak vghez: $query = build query($user search, $sort); $query = $query J" LIMIT 5"; -------

A LIMIT zradk kal szablyozha tod, hogy az SQLlekrdezs hny s milyen sort adjon vissza.

A lekrdezs vgn elhelyezett LIMIT zradk korltozza a visszaadott sorok szmt - ebben az esetben legfeljebb t sorra.
iMindez nagyszeren mkdik az els t sor kiolvassnl, de hogyan jut hatunk hozz a kvetkez, majd az az utni ts csoporthoz? Nos, ehhez kiss mdostanod kell a LIMIT utastst - de vajon hogyan? A LIMIT 10 az els tz sort olvassa ki, gy ez nem jelent megoldst. Mi a 6 s 10 kzti sorokhoz szeretnnk hozzjutni - ehhez pedig j alakban kell hasznlni a LIMIT-et. Ha kt paramtert adsz meg a szmra, az els azt hatrozza meg, hogy hny sort hagyjon ki, a msodik pedig azt, hogy hnyat olvas son ki. Az albbiakban az eredmny harmadik oldalt, vagyis a 11-25. so rokat jelented meg: $query = build_query($user_search, $sort) ; $query = $query . 1 LIMIT 10, 5"; ------1

Custard Walker

I
/

Shark Trainer Voltage Checker Antenna Installer Elephant Proctoloqist Airplane Engine Cleaner Matador Paparazzo Tightrope Walker Crocodile Dentist Mime Pet Food Tester Toreador Electric Bull Repairer

...

in

--------- - \ \

1
/
...

Nv

Firefighter

Az els paramter azt adja

meg, hogy a LIMIT hny sort ugorjon t - az els tzet.

A msodik paramter azt adja meg, hogy a lekrdezs hny sort adjon vissza tt, mint korbban.
most itt vagy > 549

az eredmny oldalakra bontsa a LIMIT hasznlatval

Oldalhivatkozsok meghatrozsa a LIMIT segtsgvel


Az oldalakra bonts fontos rsze, hogy hivatkozsokat biztostsunk a felhaszn lk szmra, amelyek lehetv teszik, hogy kzlekedjenek a tallatok oldalai kztt. A LIMIT zradk itt is segt - a segtsgvel ltrehozhatod az oldalak al jn feltntetett navigcis hivatkozsokat. gy az elz s a kvetkez hivat kozsok sajt L I M I T zradkkal rendelkeznek, de hasonlkppen viselkednek az oldalszmok is, amelyekkel kzvetlenl a kvnt oldalra ugorhatunk.
me az els hrom oldal,* illetve nhny oldalhivatkozs LIMIT zradkai:
4

tc j is y

RisKy

m nn

isky

is k *

j s

'

R isky J j o
D anger! Y o ur dream is out there. Do y o u h iv * the g uts to qo fin d It?

Danger? Y o ur dream jo b is o u i there D o yo u have the g uts to q o fin d H?

job

Risk* J JS'-,
D a n g er! Y o ur dream Job i t out there. D o you ha ve the guta to go fin d It?

Risky Jobs -Search Results

Risk> Jobs -Search Results


Job Tttfc Description

Risky Jobs -Search Results

Job Title Cuttaui Wallccr

Description

Job Title
Minie

Description

We need people illins lo tc^ the A eon walk on custard. W ere gois to nil a Shark T am ar Training hjrk* to do cut* tnck* for the our new water theme pert. You'll speed You 11 be out In the neld cheeking a* , Voltage Checker in thi raccc of 3 to 250 or more v o \u .) You II be anwnna* and odter Antenna Installer hioaJiM.il receiving equipment on the E:*pfcoc: Proctoiof i*t Needed: experienced proctologic wtl laigc .r.inulv Elephant* at our 200 (In
< I 2 34>

Aiiplanc Engine Cleaner M atidot

Jet airplanes Deeding r ig me* d c a w i m z d c i mdi* kIjaU w-Jlin* to har.dk B jMltng dairy tan* loekieg for part 4rae emeriain sprntcc bull wtta mild ca*e of Top eelebnry photography firm loofcin popaiu^o to stalk Icir-pctamecUi lip ty Fled$Jieg big top loalcin$ for thnrc nng with 1 3 yean o f experience to perform t might be the Job for you Our crococil

you hive animat* and hale pliquc'

<-1234-

Wc need *oinc ncih mow laces. Full heal! anc shifl pac provided.M art love kid; h i Poftd Teller Wc prxie otinelveA on how pood our ; Now you can help make oar product* ( Lovely bovine 1 waiting for your w perioj Toreador cmpc waving ikilli.M use pa*v bast*, ball L kctnc Bull R cpuicr Honk 1 Hock) Tonk need* an e.xpcrfenc tvpairrr Flee rirvfitfm you fix it) and I Fircfi^hto The City of Deiavilie is hiring fiicfigfctt; cxpcriecKcd requited you *111 be tniij

*' "

1
LIMIT 0, 5 LIMIT 5, 5 LIMIT 10, 5

LIMIT 5, 5

LIMIT 15, 5

LIMIT 5, 5

No problemo. Nincs m dolgom, m in t megrni pr lekrdezhet klnbz LIMIT zradkokkal, ugye?

Valahogy gy. Klnbz LIMIT zradkok szksgesek az oldal tl s a hivatkozstl fggen, de ezek automatikusan is ltre hozhatk, nem kell minden lekrdezst magadnak megrnod.
Mindssze a build_query () fggvnyt kell nmikpp mdostanod, hogy a megfelel L I M I T zradkot helyezze a lekrdezs vgre.

Karakterlncok kezelse s egyni fggvnyek

Az oldalak adatainak nyomon kvetse


Ahhoz, hogy a build_query () fggvnyt felruhzd az oldalakra bonts kpessgvel, meg kell hatroznod s nyomon kell kvetned nhny vlto zt. amelyek megadjk, hogy mely tallatokat kell lekrdezni s megjelen teni egy adott oldalon. Ezek a vltozk fontos szerepet jtszanak a kapott oldalak aljn tallhat navigcis hivatkozsok ltrehozsban is.

$cur_page
Az aktulis oldal, vagyis a $cur_page rtkt a pa rancsfjl URL-jbl olvashatod ki a $_GET segtsg vel. Ha az URL-ben nem adtak t aktulis oldalt, a $cur_page az els oldalra mutat, az rtke teht 1 .
i

$results_per_page
Ez a vltoz adja meg az oldalanknti tallatok szmt. Az rtkt tetszs szerint adhatod meg, attl fggen, hogy hny tallat fr el knyelmesen az oldal szerkezet ben. Innen jutsz majd hozz a LIMIT zradkok msodik paramterhez.
W ~

Ezzel a vltozval adod meg, hogy hny tallatot kell tugrania a pa rancsfjlnak. hogy az aktulis oldalhoz jusson. Kvetkezskppen | ennek a vltoznak az rtke adja a l im it zradk els paramtert az oldal tartalmt eredmnyez lekrdezsben.

$skip

$total
Futtass egy lekrdezst l im it nlkl, ami kiolvassa : az sszes tallatot, majd szmold meg hny elembl ll - ezt trold a $t o t l vltozban. Rviden, a vltoz rtke megadja, hogy sszesen hny tallatot kaptl.

$num_pages
Ennek a vltoznak az rtkt gy kaphatod meg, ha elosztod a $ to ta l rtkt a $results_per_page vltozval. Logikus, hi szen sszesen $ t o t l tallatot kapsz, amelyek kzl oldalanknt $results__per_page darabot jelentesz meg. sszesen teht $num_pages szm oldalad van, amelyek kzl az aktulis sorsz ma a $cur_page.

most itt vagy > 551

az oldalakra bontshoz szksges vltozk meghatrozsa

Az oldalakra bontshoz szksges vltozk meghatrozsa


Az oldalakra bontshoz szksges vltozk tbbsgt egyszeren az URL alapjn hatrozhatod meg, amelyhez a $_GET szupergloblis rvn jut hatsz hozz. A $ so rt, a $user_search, valamint a $cur_page vltozk pldul kzvetlenl elrhetk a $_GET segtsgvel. Ezek alapjn knnye dn kiszmthatod, hogy hny sort kell tugrani az oldal els sornak el rshezvagyis megkaphatod a $ sk ip vltozt. A $ re su lts_p e r_p a g e esete kiss eltr a fentiektl, hiszen ezt magad llthatod be - itt semmi lyen kls knyszer nincs, a megjelentend sorok szmrl neked kell dntened, az oldal felptsnek figyelembe vtelvel.

A rendezsi sorrend kiol

Az aktulis oldal sorszmnak, va gyis a $cur_page rtknek a kiol vassa az URLbl a GET segt sgvel. Ha nincs ilyen adat, a vl toz rtkt 1-re lltod.

vassa, amely egy t s 6 kztti egsz szm lehet.


/ / A rendezs tp u s n a k s a k e re s k ife je z s n e k a k io lv a s s a az URL-bl / / a GET s e g ts g v e l. $ s o rt - $_ g e t [ s o r t ];

a kereskifejezs kiolvassa, meg a keresmezben.

$user_search = $_G E T ['usersearch'] ; ^ ---- amelyet a felhasznl adott

/ / Az o ld a la k ra bontshoz szksges adatok k is z m t s a . $cur_page = is s e t ($_GET [' page ]) ? $_GET [' page ] : 1; $ re su lts_p e r_p ag e = 5 / / / az o ld a la n k n t i t a l l a t o k

Az alaprtelmezs az el s oldal - ha az oldalszmot nem lltottk be.


szma

$ sk ip = ( ($cur_page - 1) * $ re s u lts _ p e r_ p a g e );

Az oldalanknti tallatok szm nak belltsa. Itt az oldal els" sornak szmt - ez a $skip - szmtod ki.
v

^ Ennek a szmtsnak az eredmnye az 1. olal esetben 0, a 2. oldal esetben 5, a 3. oldal esetben 10, s gy tovbb.

Tovbbra is hinyzik azonban kt igen fontos vltoz: a $ t o t a l s a $num_pages. Az rtkket csak az utn kaphatod meg, ha vgrehajtottl egy kezdeti lekrdezst, s gy megllaptottad, hogy hny tallat addik az adatbzisban. Ha rendelkezel a tallatok szmval, bellthatod ezeket a vltozkat, s mr alkalmazhatod is a megfelel LIMIT zradkokat...

552 9. fejezet

Karakterlncok kezelse s egyni fggvnyek

A lekrdezs mdostsa az oldalakra bontshoz


Miutn belltottad a vltozk rtkt, ideje, hogy trd a Search parancsfjlt, hiszen most mr rszenknt szeretnd megjelenteni a tallatokat, nem pedig egyszerre. El szr vgre kell hajtanod egy lekrdezst a $ t o t a l vltoz belltshoz, gy azutn kiszmthatod a $num_pages rtkt is. Ezt kveti egy msodik lekrdezs, amelyben mr felhasznlod a $ sk ip s a $ re s u lts _ p e r_ p a g e vltozkat a megfelel LIMIT zradkokban. Az albbiakban bemutatjuk a se a rch .p h p parancsfjl mdostott r szt, kiemelve a vltoztatsokat:

A rnysqli_num_rows () megadja, hogy sszesen hny sor szerepel a lekr dezs eredmnyben. Ez a lekrdezs nem tartalmaz LIMIT zradf ~ kot, gy az sszes tallatot visszaadja.
/ / E zzel a le k rd e z s s e l h o z z ju ts z az sszes t a l la t h o z

$ q u e ry " = b u d . q u e r y ($ u s s * ? S e i ^ C ^ o r t ) ;
$result = mysqli_que/^($dbc, $query) ; $total = mysqli num rows($result);

A " W 1- 1 _ "* () l V a me9kaH a sorok 1 'Val sszestett szmt, s trolod az eredmnyt. A sorok szmt elosztod az oldalanknti tala'la tok szmval, majd az eredmnyt felfel kere kted, gy megkapod az oldalak szmt. A ceil() fggvny a paramterknt
megadott szm()02 {

$num_pages = ceil($total / $results_per_page);

/ / ja b b le k rd e z s , csak a t a l l a t o k egy
/ / r szh a lm a zt o lv aso d k i

$query =

$query . " LIMIT $skip/ $results per page";


$query)7 -

$ r e s u lt = m ysqli_query ($dbc, w h ile

Ennyi sort hagysz ki...

nala nem kisebb egszt adja vissza. ennyit adsz Vissza,

. . .

'

($row = rnysqli \ fetch_array ($ r e s u lt) ) {

echo < tr c la s s = " r e a u lt s " > ; echo <td v a lig n = " t p " w idth="20% "> . $row[ t i t l e '] . *< / td > ';

echo ' <td valign="top" width="50%">' . substr($row[1 description], 0, 100) . '...</td>'; echo <td valign=top" width="10%> ' . $row['stater] . '</td>';
echo < td v a lig n = " tp p " w idth="20% ">' . s u b s tr($ ro w [ d a te _ p o s te d ], 0, 10) echo ' < / t r > f ; . f< / t d > ';

1
echo < / t a b le > ';

Egy jabb lekrdezs, itt azonban az eredmnyt az aktulis oldalra korltozod.

most itt vagy 553

a navigcis hivatkozsok ltrehozsa

Az oldalnavigcis hivatkozsok ellltsa


Meghatroztl teht nhny alapvet fontossg vltozt, s felptettl egy j SQL-lekrdezst, ami kiolvassa az adoti oldalnak megfelel eredmny halmazt. Nem maradt ms htra, mint az oldalnavigcis hivatkozsok lt rehozsa: nevezetesen szksged lesz egy elz hivatkozsra, az oldal szmok hivatkozsaira, valamint egy kvetkez hivatkozsra. Minden szksges adat a rendelkezsedre ll, mr csak magukat a hivatkozsokat kell ltrehoznod. Vegyk most sorra elszr az sszetevket! $user_search
Az oldalhivatkozsok ltrehozshoz tovbbra is ismerned kell a felhasznl kereskifejezst. gy ezt is rgztened kell az oldalhivatkozsok URL-jben.

$cur_page
Az oldal hivatkozsok termszetesen fggnek az aktulis oldaltl, gy ezt az adatot mindenkp pen mellkelned kell az IJRL-ekben.

$num_pages
Alihoz, hogy minden oldalhoz hivatkozst hozhass ltre, fontos tudnod, hogy hny van bellk.

$sort
A rendezs tpust szintn meg kell rizned min den hivatkozsban, hiszen egybknt az oldalak ra bonts is rtelmt veszten.

Azt tudod, hogy milyen adatokra van szksg a hivatkozsok sszellts hoz - ideje, hogy kitld a PHP-kdot, ami ltre is hozza ket. Az ered mnyt egyszeren beillesztheted a search.php parancsfjlba is, de egy egyni fggvny taln elegnsabb megoldst jelentene. gy a kzponti pa rancsfjl, amely a keressi eredmnyeket adja, jval egyszerbb vlik, hi szen egyetlen kdsorral ltrehozhatod az oldalhivatkozsokat - csak meg kell hvnod a generate_page_links () fggvnyt. Egyetlen aprcska gond akad mindssze: ha egyetlen oldalnyi eredmnyt kapunk, nem szeretnnk meghvni ezt a fggvnyt. Kvetkezskppen a hvs eltt meg kell tudnod az oldalak szmt. Az albbiakban bemutat juk, miknt vgezheted el ezt az egyszer vizsglatot, majd pedig a fgg vnyhvst, tadva a megfelel paramtereket: if ($num_pages > 1 ) {

echo g e n e ra te _p a g e _lin k s ($ u s e r_se a rc h , $ s o rt, $cur_page, $num__pages);

Elszr is gyzdj meg rla, hogy a keress tallatai egynl tbb oldalt ignyelnek egybknt nincs szksg az oldalhivatkozsok ellltsra. 554 9. fejezet

Add t a kereskifejezst, a rendezs tpust, az aktulis oldal szmt, vala mint az oldalak szmt - s mr el' is llttathatod az oldalhivatkozsokat.

Karakterlncok kezelse s egyni fggvnyek

PHP- s MySQL-mgnesek
A g e n e ra te _ p a g e _ lin k s () fggvny majdnem elkszlt - mindssze pr aprcska kdrszlet hinyzik belle. Ne aggdj, hiszen a htmgneseken mindent megtallsz, csak a helykre kell raknod a darabokat, s a Risky Jobs mris kpess vlik az oldalhivatkozsok ellltsra.
f u n c t i o n g e n e ra te _ _ p a g e I in k s ( $ u s e r _ s e a r c h , $ p a q e _ lin k s = 11 ; S s o rt, $ c u r _ p a g e , Snum p a g e s ) {

/ / Amennyiben az a k t u l i s o ld a l nem az e ls a sorban, / / az e l z " h iv a tk o z s t .


if ( ) ( .

hozd l t r e

$ p a g e _ '. in k s .= '< a h r e f - ,n . $ _ S E R V E H [' PH P_SELF! ] f ? u s e rs e a rc h = ' . $ u s e r_ s e a rc h . * & s o rt= ' . $ s o rt . ' &page=' . (
.................................................................................

) . ' " > < - < / a>

kz elzw Hivatkozs e$y balra mu-} ' fat nyl alakjban jelenik meg: < - .

/ / Az o ld a la k b e j r s a s a m e g fe le l h iv a tk o zs o k l tr e h o z s a f r ( $ i = 1 ; $ i < - $ n u m _ p a g e s ; $ i+ + ) (

it )

(
$ p a g e _ lin k s .= 1 T . $ i ;

) {

e ls e { $ p a g e _ lin k s .= <a h r e f = " ' . $_SERVER f PHP_SELF J . f ? u s e rs e a rc h = . $ u s e r_ s e a rc h . 1& s o r t = . S s o r t . 1page= . $ i . . $ i . < /* > ';

1 }
/ / Amennyiben az a k t u l is o ld a l nem az u to ls a sorban, / / hozd l t r e a kvetkez" h iv a tk o z s t.

if (

) {
.

$ p a g e _ lin k s .= * <a h r e f = " . $ SK.RVKR [ f PH P_SELFt j * ? u s e rs e a rc h = ' . $ s e r_ s e a rc h . 1& s o r t= * . S s o r t . * p a g e - ! . ($ c u r_ p a g e + 1 ) . * " > - x / a > f ;

}
e ls e { $ p a g e _ lin k s }

; egy jobbra mutat nyl A kvetkez"' hivatkozs


V alakjban jelenik meg, a kvetkezkppen: - > .

I $num ^pages t
-----

r e t u r n S p a ge . i n k s ;

}
m ost i t t vagy 555

a ksz generate jpage Jinks!) fggvny

PHP- s MySQL-mgnesek - megolds


A generate__page_links () fggvny majdnem elkszlt - mindssze pr aprcska kdrszlet hinyzik belle. Ne aggdj, hiszen a htmgneseken mindent megtallsz, csak a helykre kell raknod a darabokat, s a Risky Jobs mris kpess vlik az oldalhivatkozsok ellltsra.
function generate__page_links ($user_search, $sort, $cur_paqe, $num_pages) $page_links - ' 1; {

/ / Amennyiben az a k tu lis o ld a l nem az e ls a sorban, hozd l tr e / / az elz" h iv a tk o z s t.


if ( )

$page_links .= *<a href=' . $_SERVER[1PHP_SELF] f?usersearch=' . $user search . f &sort= * $sort . ^ ----- ------f

A felhasznl keressi ada ta it s a rendezs tpust tovbbra is t kell adnod a hivatkozsok URL-jeiben.

age-'

.................................. !....

$ cu r page

|- I 1 I

><-</a>

1
else {

$page_link }

Az ^elozo*' hivatkozs egy balra mutat nyl alakja'ban jelenik meg, a kvetkezkppen: < - .

/ / Az o ld a la k b e j rs a s a m egfelel hivatkozsok l tre h o zs a .


f r ($ i = 1; $ i < $num pags; $i++) { =*
$ c u r _ ja g e | = f $i j

if ( }

$page lin k s

1 . $ i;

else { $page_links .= <a h re f- " . $ SERVER[f PHP_SELF ] *?usersearch=* . $user__sea rch .

Fontos, hogy a hivatkozsok ugyanarra a parancsfjlra mutassanak - a k lnbsg mindssze az tadott oldalszmokban mutatkozik meg.

'fisrt f . $sort . $i ) 1 </a> * ;


Az adott oldal hivatkozsa mind ssze az oldalszmbl ll.

/ / Amennyiben az a k tu lis o ld a l nem az u to ls a sorban, / / hozd l tr e a kvetkez" h iv a tk o z s t.

$ c u rjp a g e
I r sort=

$num_pages

$page_links .- * <a h re f= "T . $_SERVERl ?H?_SELF 1 . ?usersearch- . $user search .

. $sort . &page= . ($cur page +1)

. ">-></a>';

)
else { $page_links .= 1 ->T ;

/ hivatkozs egy jobbra muta A kvetkez"


t nyl alakjban jelenik meg, a kvetkez kppen: - > .

)
return $page lin k s ;

556 9. fejezet

Karakterlncok kezelse s egyni fggvnyek

A teljes Search parancsfjl sszelltsa


Elrkezett vgre a pillanat - elttnk ll a teljes Riskyjobs Search parancsfjl, amely megjelenti a felhasznl kereskifejezsnek megfelel tallatokat, a fejlcekre kattintva lehetv teszi az eredmny rendezst, oldalak ra bontja a tallatokat, s oldalnavigcis hivatkozsokat tesz elrhetv az oldalak aljn:

<?php / Ez a fggvny p t i f e l a keressi le k rd e zst a keresszavak s a rendezsi tp u s a la p j n fu n c tio n b u ild q u e r y ($ u s e r _ s e a r c h , $so rt) {

Ezeket a fggvnyeket mr elk sztetted, gy nincs rtelme min den sorukat jra feltntetnnk.
. . __- __________ _____________ - _ , _ c e k h iv a t k o z s a it a megadott re n d e z si tp u s a la p j n fu n c tio n generate_sojrifc_links($user_search, $so rt) {

r e tu r n $ s o rt lin k s ;

)
/ / Ez a fggvny hozza l t r e a n a v ig c i s o ld a lh iv a tk o z s o k a t / / az a k t u l is o ld a l s az o ld a la k szma a la p j n fu n c tio n c re n e ra te ^ a g e _ lin k s ($user_search, $ s o rt, $cur_page, $num_pages)

re tu rn $page lin k s ;

Itt olvasod ki a rendezs tpust, valamint a kereso1<ifeje2st, amelyek az URL-ben GETadatknt jelennek meg.

/ / A re n d e z s i t p u s s a keresszavak k io lv a s s a az URL-bl a GET s e g ts g v e l $ s o rt = $_GET[ 's o r t 1]; $user_search = $_GET[ u s e rse a rc h '] ; Itt kezdrtkt adsz az oldalakra bontshoz / / A z o ld a la k r a bontshoz szksges / / adatok k is z m t s a szksges vltozknak, hiszen hamarosan $cur_page = isse t($_G E T [ 'pag e'] ) ? $_GET[fpage ] : 1; hasznlod okt a LIMIT zradkokban s $ re su lts_p e r_p ag e = 5 ; / / number o f r e s u lts per page $ sk ip = ( ($cur_page - 1) * $ r e s u lts _ p e r_ p a g e ); az oldalhivatkozsok ltrehozsakor. / / Az eredmnytbla fe l p t s n e k megkezdse Itt hvod meg a generate_sort_links() fgg echo c ta b le border="0" c e llp a d d m g = ,f2 "> ; / / A z eredmnyek fe jl c e in e k e l l l t s a echo '< t r c la s s = f,h e a d in g M ; > echo g e n e ra te _ s o rt_ lin k s ($ u s e r_ s e a rc h , $ s o r t ) / echo < / t r > 1;

vnyt az eredmny fejlceinek elksztshez, amelyeket nyomban a kpernyre is rsz.


Mg, mg, ennyi^ nem elg!

most itt vagy 557

a search.php vgs vltozata

A teljes Search parancsfjl - folytats


/ / K apcsolds az a d a tb z is h o z . re q u ir e _ o n c e ( ' c o n n e c tv a rs. p h p ' ) ; $dbc = mysqli_connect(DB_HOST, DBJJSER, DB_PASSWORD, DB_NAME); / / Lekrdezs v g r e h a jt s a az A build_query() fggvny meghvsa a keressi / / sszes t a l l a t k io lv a s s h o z ^ $query = b u ild _ q u e ry ($user_search, $so rt) ; lekrdezs ielptshez. $ r e s u lt = m y sqli_query ($d bc, $ q u e ry ); $ t o t a l = m ysqli_num _row s($result) ; $num_pages = c e i l ( $ t o t a l / $ r e s u lts _ p e r_ p a g e );

A LIMIT zradk, amellyel / / jabb le k rd e zs a t a l l a t o k rszhalm aznak a lekrdezst a tallatok / / k io lv a s s h o z $query = $query . " LIMIT $ sk ip , $ re s u lts _ p e r_ p a g e "; rszhalmazra korltozod. $ r e s u lt = m ysqli_query ($dbc, $query); w h ile ($row = m y s q li_ f e tc h _ a r r a y ( $ r e s u lt) ) { echo ' < tr c la s s = " r e s u lt s " > ; $row[ t i t l e ' ] . ' < /td > '; echo *<td v a lig n = nto p " w idth="20% ">1 s u b s tr($ ro w [ 'd e s c r ip t io n 1], 0, 100) echo <td v a lig n = " to p " width="50%" > $row[ s t a t e ] . < / td > ; echo '< td v a lig n = " to p " width="10%,f> 1 s u b s tr($ ro w [ ' d a te _ p o s te d '], 0, 10) echo <td v a lig n = " to p " width="20%,,>' echo ' < / t r > f ;
}
echo < / ta b le > ;

. . . < /td > ; ' < /td > ;

s a kd, amellyel rvidre vgod az llshirdetsek szvegt, va lamint a felads dtumt a substr() fggvny alkalmazsval.

/ / N a v ig c i s o ld a lh iv a tk o z s o k l tr e h o z s a , ha egynl tb b o ld a lr a van szksg f ($num_pages > 1 ) { echo g e n e ra te _ p a g e _ lin k s ($user_search, $ s o rt, $cur_page, $num_pages);

J m y s q li_ c lo s e ( $ d b c ) ,?>

A generate_page_links() fggvnnyel ltrehozod az oldalhivatkozsokat, majd a kpernyre rod azokat.

V -

Rend a lelke mindennek: az adatbziskapesolat bezrsa. Nincsenek

hlye krdsek K I Ok, de m i a helyzet az adatok kirsval? Ezt nem tehetM uszj fe lt tle n l tadni a kereskifejezst, a rendezs
tpu s t, v a la m in t az oldalakra bonts a da tait a generatejpage_links ( ) fggvnynek?

n m eg m aga a generate_page_iinks ( ) f g g v n y 1

\ Igen. Mindennek az az oka, hogy a jl megrt


fggvnyek nem nylhatnak olyan adatokhoz, amelyek kvl esnek a kdjukon. gy ht a fgg vnyek csak olyan adatokat rhetnek el, amelye ket paramterknt tadunk nekik, s csak a visszatrsi rtket mdosthatjk.

; A vlasz nem, mgpedig hasonl okokbl. Ha ugyanis a fggvny a bngsz felletre rn ki az adatait, ezzel tovbb nyjtzkodna, mint ameddig a takarja r - vagyis mdostsokat v gezne a hatkrn kvl. A hibakeress s a kar bantarts a fggvnyek esetben lnyegesen bo nyolultabb, ha nem teljesen tiszta, hogy milyen adatokat mdostanak. A megolds egyszer: a fggvny ltal mdostott adatoknak mindig a visszatrsi rtkben kell megjelennik - ezekke: azutn a fggvnyen kvl azt tesznk, amit akarurt-:

558 9. fejezet

Karakterlncok kezelse s egyni fggvnyek

Fejezd be a Risky Jobs Search parancsfjlt!


Illeszd be a g e n e ra te _ p a g e _ lin k s () fggvnyt a search .ph p parancsfjl kdjba, azzal a kdrszlettel egyetemben, amelyik meghvja, miutn ellenrizte, hogy a keress egynl tbb oldalt ad eredmnyl. Hozd ltre s lsd el kezdrtkekkel azokat a vltozkat, amelyek a fggvny paramtereiknt szerepelnek. Vgezetl, ne feledkezz meg a LIMIT zradkok el helyezsrl sem, amelyek a megfelel tallati halmazokat jelentik meg az egyes oldalakon. Ha mindezt elvgezted, tltsd fel az j search .ph p parancsfjlt a webkiszolglra, s nyisd meg a s e a rc h .h tm l oldalt egy bngszben. Prblj ki nhny keresst - olyanokat is, ame lyek sok tallatot adnak, hogy az oldalakra bonts is szerepet kapjon. A lehet legtbb talla tot gy kaphatod, ha resen hagyod a keresmezt.
Risky Jobs - Search

R is k y
D a n g e r! Y o u r d re a m jo b Is o u t th e re . Do y o u h a v e th e g u ts to g o fin d it?

Risky Jobs -Search Results


T T itio__________ rv .^rin tin n _____ rH
(^M atad o r Paparazzo Shark Trainer Firefighter Voltage Checker Bustling dairy fsirn looking for part time matador to entertain spirited bull with mild case o i ADD. .Top celebrity photography firm looking for seasoned paparazzo to stalk temperamental lip-syncing pop.Training sharks to do cute tricks for the audiences at our new water theme parit. You'll spend tim... The City of Dataville i%hiring firefighters. No cxpcncnced required -you will be trained. Non-smo... You'll be out m the field checking ax. and . voltages NC in the range of 3 to 2 50 or more volts. Y ...

Vgre r ta l lta m lmaim

State
VT CA

Date Posted
2008 03 11 2UU8-U3-24 2008-04 28 20084)5-22 2 0 0 8 0 6 28

munkahelyre! Vermont, a ti d vagyok!

< 12 3 4 >

Ernesto megtallta a tkletes llst az letveszly garantlt!

Toltsd le!
Ne feledd, a Risky Jobs alkalmazs teljes forrskdjt letltheted a Head First Labs webhelyrl, az albbi cmrl: www. headfirstlabs.com/books/hfphp

m ost i t t vagy

559

php 8 mysq/ szerszmoslda

A Risky Jobs Search parancsfjl elksztshez szmos j PHP- s MySQL-eszkzre volt szksg Tekintsd t a legfontosabbakat!

str__replace ( )
Ezt a fggvnyt akkor rdemes meghvnod, ha keress s csere" mveletet szeretnl vgrehajtani egy karakterlncon, egy karaktert vagy karaktersorozatot egy m sikra cserlve.

Nvvel elltott, konyhaksz;' PHP-kdrszlet. Az egyni fgg vnyekkel egyes feladatok meg valstst elvlaszdiatod a program trzstl, gy a meg felel kdrszleteket knnyedn s felesleges ismtldsek nl kl jrahasznosthatod.

560 9. fejezet

10

Szablyos kifejezsek

A csere szablyai ^
1 Mrs. B la tt kicserlte az osztly hrcsgt! A z t h itta , nem vesszk eszre?

A karakterlnc-kezel fggvnyek szeretetre mltak - a kpessgeik azonban ugyanakkor korltozottak.


Persze el tudjk rulni neked egy karakterlnc hosszt, le tudjk vgni a vgt, s bizonyos karaktereket ms karakterekre tudnak cserlni benne. Nha azonban ki kell szabadulnod a ketreckbl, hogy sszetettebb szvegkezelsi feladatokat hajt hass vgre. Ebben segthetnek a szablyos kifejezsek (regular expression), amelyek kel preczen mdosthatsz karakterlncokat, mgpedig nem egyetlen felttel, ha nem szablyok halm aza alapjn.

ez egy j fejezet 561

a kockzatos llsok oldala helytelen adatokat tartalmaz

A Risky Jobs oldal lehetv teszi az nletrajzok feltltst


A Riskyjobs.biz webhely felntt. Most mr lehetv teszi az llskeresknek, hogy egy webes rlapra ber jk az nletrajzukat s az elrhetsgket, hogy a Risky Jobsnl llst knl cgek knnyebben rjuk ta lljanak. Az rlap gy fest:

A kockzatos llsok j jelentkezsi r lapja lehetv teszi az llskeresknek, hogy adatokat adja nak meg magukrl, hogy a potencilis munkaadk rjuk ta lljanak.

O sngcrl Your ream )o i t out thro O o yo u M v f t U i t y\A% to g o nd K?

Risky Jobs Registration


Rcgtscx with Risky Jobs, and post youj itsu o c

A szokvnyos adatok mellett az llskeresknek a kvnt munkt (Desired Job) is meg kell adniuk, s be kell illesz tenik az nletrajzukat is.

P h o rr:

Desired Job:

Az llskeresk adatait egy olyan tbla trolja, amelyben a munkaadk s a fejvadszok kereshetnek, hogy rbukkanjanak a lehetsges jelltekre. De van egy kis gond - az rlapra bert adatokban nyilvnvalan nem lehet megbzni! A nindzst nem tudtam elrni, mert hinyzik a telefonszm a, aztn a kses zsonglrnek k ld tt

levelem is vissza p a tta n t. Tele van a hcipm a Risky Jobs nletrajz-adatbzisban lev "\ hibs adatokkal! ^

A munkaadk jellteket kereshetnek a Risky Jobs adatbzisban, s kapcso latba lphetnek velk, ha alkalmazni szeretnk ket - feltve, hogy elegend informci ll a rendelkezskre!
562 10. fejezet

Szablyos kifejezsek

Albb a r e g is tr a t io n .php parancsfjl kdjnak az a rszlete lthat, amelyik az r-

Gyakorlat
<?php i f ( i s s e t ($_POST[ s u b m it ])) (

$first_nam e = $_POST[ 'firs tn a m e '] ; $last_nam e = $_POST[ ' la s tn a m e 1]; $em ail = $_POST[ 'e m a il ]; $phone = $_POST[rphone'] ; $jo b = $_POST[ j o b 1]; $resume = $_POST[ 'resume'] ;
$output_form = 'n o '; if (empty($ fir s t_ n a m e )) {

// A $first_nam e res
echo '<p c lass= "e rro r"> Y o u fo rg o t to e n te r your f i r s t name. </p> ; $output form = y e s ;

if

(em pty($last_nam e)) {

// A $last._name res
echo <p c la s s = ,,error">You fo rg o t to e n te r your la s t nam e.< /p> '; $o u tp u t form = ' y e s';

if

(e m p ty ($ e m ail)) {

// Az $email res
echo <p c la s s = e r r o r >You fo r g o t to enter your em ail ad d re ss. < /p > '; $output form = y es ;

if

(em pty($phone)) {

/ / A $phone res
echo <p c la s s = " e r r o r '>You fo r g o t to e n te r your phone number. </p> ; $output form = ' y e s ;

Itt folytatdik annak az ellen'rzse, hogy a mezok nem iire$ek-e.


else { $output_form = y es ;

if

($output form == 'y e s ')

?>
k z ----------Itt megjelentjk az rlapot.

most itt vagy 563

Gyakorlat - megolds

Gyakorlat - megolds

Albb a r e g is tr a t io n .php parancsfjl kdjnak az a rszlete lthat, amelyik az rlapra bevitt felhasznli adatok megjelentst s feldolgozst vgzi az j je llt bejegyzshez. rd a kd mell, hogy szerinted mi a gond vele, s hogy miknt lehetne vltoztatni rajta. hogy kikszbljk a hibs adatok problmjt!
{
A parancsfjl ellenrzi, hogy az rlapmezk nem resek-e, ami j, de egyes mezVben az adatok formatuma is szmt.

<?php i f ( i s s e t ($_POST[ ' s u b m it'] ) )

$first_nam e = $_POST[ 'firstn a m e '] ; $last_nam e = $_POST[ 'la s tn a m e '] ; $email = $_POST[ 'e m a il'] ; $phone = $_POST[1phone'] ; $j ob = $_POST[ j ob1]; $resume = $_POST[ ' resume'] ;
$output_form = 'n o '; if (empty($ fir s t_ n a m e )) {

//A
)

$first_nam e res
A kereszt- s vezetknvvel kapcsolatban mst nem na gyon lehet ellenrizni, gyhogy ez a kd rendben van.

echo '<p class= "erro r"> Y o u fo rg o t to e n te r your f i r s t nam e.< /p> '; $output_form = 'y e s '; c-

if

(empty($ la s t_n a m e )) {

/ / A $last_name res
echo '<p c la s s = " e r r o r M >You fo rg o t to enter your la s t nam e.< /p> '; $ o u tp u t_ f orm = ' yes ' ; e_maj| cmnek egyedi formtuma van,
J amit ellenriznnk kell, mieltt az adatt elfogadhatnnk a felhasznltl. . _ . .. . _. .

if

(empty($ e m a il)) {

/ / Az $email res
echo f <p c lass= "e rro r"> Y o u fo r g o t to e n te r your em ail ad d re ss. < /p > '; $output_form = 'y e s ;
} Ngyujj" McGraw lehagyott egy ponttal kezdd rszt az e-mal cme vgrl - az rlapnak el kell

if

(empty ($phone) ) {

fognia az ilyen jelleg hibkat!

echo ' <p c la s s = " e r r o r >You fo rg o t to e n te r your phone number. < /p > '; $output form = 'y e s '; Ugyanez a helyzet a telefonszmmal is -

// A $phone res

Itt folytatdik annak az ellenrzse,


}

a felhasznl ltal bert adat csak akkor fogadhat el, ha biztosak lehetnk benne, hogy a telefonszm helyes formtum.

hogy a mezk nem resek-e.


Jimmy Sw ift a telefon szmhoz nem adott meg krzetszmot, amit pedig

e ls e { $output_form = 'y e s ';

}
if ($output_form == 'y e s ') {

Valjban arra van szksg, hogy megbizonyosodjunk az e-mail cmek s a telefonszmok rvnyessgrl (vagyis az rlapon konkrt formtum adatot vr me zkbe rt rtkek helyessgrl). A tbbi mez eset ben elg csak arrl meggyzdni, hogy nem resek.

az rlapnak meg kellene kvetelnie.

?>

Itt megjelentjk az rlapot.

564 10. fejezet

Szablyos kifejezsek

M irt nem hasznlunk valamilyen karakterlnc-kezel<? fggvnyt a helytelen adatok kijavtsra? Nem lehetne a str_replace()-szel ptolni a hinyz adatokat?

Egyes adatokat ki lehet javtani karakterlnc-kezel fggvnyekkel, de ezek akkor sem sokat segtenek, ha az adatoknak egy bizonyos mintra kell illeszkednik.
A karakterlnc-kezel fggvnyek egyszer keress s csere' mveletekhez tklete sen megfelelnek. Pldul ha egy felhasznl ktjelek helyett pontokkal elvlasztva adja meg a telefonszma szmjegytmbjeit, a pontokat knnyen ktjelekre cserl hetjk egy s tr _ r e p la c e () - hasznl kddal. Az olyan adatok esetben azonban, t mint Jimmy Swift telefonszmnak krzetszma, nem tudhatjuk, hogy mit is kellene kapnunk, teht az adatot ber szemlyt kell megkrnnk, hogy pontostson. Ahhoz viszont, hogy megllapthassuk, hogy hinyzik a krzetszm, pontosan ismernnk kell a telefonszmok formtumt. Valjban olyan, magasabb szint ellenrzsre van szksgnk, ami biztostja, hogy a telefonszmokhoz s e-mail cmekhez hasonl adatok bersa helyesen trtnjen.

Ok, de nem lehet e z t az ellenrzst karakterlnc-kezel fggvnyekkel elvgezni?

A karakterlnc-kezel fggvnyek csak a legegyszerbb adatellenrzs cljaira alkalmasak.


Gondold vgig, hogyan prblnd ellenrizni egy e-mail cm rvnyessgt egy karakter lnc-kezel fggvnnyel. A PHP-nek van egy s tr le n ( ) nev fggvnye, ami elrulja, i hogy hny karakterbl ll egy karakterlnc - az olyan adatok, mint az e-mail cm, azonban * nem rendelkeznek elre meghatrozott karakterhosszal. A telefonszmok esetben persze lehet, hogy ez a fggvny segtene, mert azok ltalban ugyanannyi szmjegybl llnak, de az esetleges pontokkal, ktjelekkel vagy zrjelekkel akkor is foglalkozni kellene. Az e-mail cmekre visszatrve, ezeknek a cmeknek egyszeren tl bonyolult a formtuma ahhoz, hogy karakterlnc-kezel fggvnyeket hasznlhass az ellenrzskre. Valjban bizonyos a d a tm in t ka t keresnk, ami olyan ellenrzsi mdszert ignyel, amellyel a felhasz nl adatait sszevethetjk egy adott mintval, hogy megbizonyosodjunk az rvnyessg rl. Az rlapadatok esetben teht az rvnyessg-ellenrzs (validation) lelkt a mintk modellezse jelenti.

most itt vagy 565

hatrozd meg az adatok elvrt formtumt!

Dntsd el, hogy milyen formtum adatokat szeretnl kapni!


A feladat az, hogy vilgosan, karakterrl karakterre meghatrozd, hogy az rlap egyes meziben pontosan milyen formtum adatokat szeretnl kapni. Vegyk Jimmy telefonszmt. Egy ember szmra nyilvnval, hogy hinyzik belle a kr zetszm. Az rlap ellenrzst azonban nem emberek vgzik, hanem PHP-kd. Ez azt jelenti, hogy meg kell tantanod a kdot arra. hogy miknt veheti szemgy re a felhasznltl kapott, karakterlnc formj adatokat, s llapthatja meg, hogy illeszkednek-e a telefonszmok mintjra. Egy ilyen minta meghatrozsa jelenthet nmi kihvst, mert vgig kell gondolni az adott tpus adat lehetsgeit. A telefonszmok meglehetsen egyszerek, mivel csak 10 szmjegybl, valamint nem ktelez elvlaszt karakterekbl llnak. Az e-mail cmekkel mr ms a helyzet, de miattuk rrnk mg aggdni.

% ember knnyen szreveszi, hogy Jimmy elfelej tette megadni a krzetsz mt, de ugyanezt az sz revtelt" PHP-kdbl mr nehz megejteni.

First Name: Jimmy Last Name: Swift Email: JS@sim-u-duck.com Phone: 636 4652 Desired Job: Ninja

Nincsenek

hlye krdsek
i Mg mindig nem rtem igazn, hogy mi rt nem lehet egyszeren az isset ( ) s az empty ( ) fggvnynl maradni z rlap ellenrzshez. Ez a kt fggvny elrulja, hogy az. aki benyjtotta az rlapot, rt-e ada tot egy bizonyos szvegmezbe, de ma gukrl a bevitt adatokrl nem mond sem mit. Az empty () fggvny szempontj bl egyltaln nincs klnbsg akztt, hogy a felhasznl a "(707)827-700" vagy a "4FG8SXY12 " rtket rta-e be az rlap telefonszm mezjbe. Ez egy olyan webhely esetben, mint a Risky Jobs. jelents gondol okoz, mert ahhoz, hogy' az llskereskkel kapcsolatba le hessen lpni, megbzhat adatokra van szksg. K I C . ! Ha az isset () s az empty ( ) fggvny nem mkdik, akkor nem le hetne egyszeren az adatbzisba val felvtel utn ellenriztetni az adatokat valakivel? ! Termszetesen lehetsges, de ek kor mr ltalban ks kijavtani a helytelen adatokat. Ha egy telefon szmbl hinyzik a krzetszm, akkor meg kell krnnk a felhasznlt, hogy pontostsa az adatokat az rlapmez j bli kitltsvel. Ha vrunk, s csak ak kor ellenrizzk az adatokat, amikor azok mr az adatbzisban vannak, lehet, hogy nem lesz r mdunk, hogy kap csolatba lpjnk a felhasznlval, hogy tudassuk vele, hogy az adatok egy rsze rvnytelen. Mivel pedig a felhasznl valsznleg nem jn r, hogy hibt v tett, arrl sem fog tudni, hogy az adatb

zisba rvnytelen adat kerlt. A legjobb teht az, ha a felhasznl rlapadatainak rvnyessgt rgtn az rlap benyjt sakor ellenrizzk, mert ha gond van. gy megjelenthetnk egy hibazenetet, s megkrhetjk a felhasznlt, hogy is mtelje meg az rlap kitltst.
I C ! Akkor most hogyan dnthet el, hogy a felhasznl ltal bert adatok rvnyesek-e? ! Ez az adatok termszettl fgg. A klnbz tpus adatoknak mag ms szablyokat kell kvetnik arra nz ve, hogy milyen karaktereket tartalmaz hatnak. hny karakterbl llhatnak, illet\ c a karaktereknek milyen sorrendben kell lennik. Ezeket a szablyokat a PHPkdban kell megfogalmazni - nzzk is meg kzelebbrl, hogy milyen szablyok vonatkoznak a telefonszmokra...

566 10. fejezet

Szablyos kifejezsek

Hegyezd ki a ceruzd!
rd le a telefonszmok sszes formjt, ami csak az eszedbe jut:

Milyen szablyok betartst sszer elvrni a felhasznlktl, ami kor kitltik az rlapot (pldul: a telefonszmok nem tartalmaz hatnak betket)?

Kezdlksnek itt egy szably. .Megkvetelhetjk pldul,, hogy csak .szmjegyeket lehessen bevinni, s.mjn.d.a 1.0. szmjegyet egybe kelljen.rni...........................................

most itt vagy 567

Hegyezd ki a ceruzd! - megolds

Hegyezd ki a ceruzd! Megolds

rd le a telefonszmok sszes formjt, ami csak az eszedbe jut:

(<595) klk-WSZ

A telefonszamokban lehet nek szkzk, ktjelek, z rjelek s nha pontok is.

............. ................................

(-555) 695

Egy telefonszmban mg be tk is szerepelhetnek, br ez mr feszegeti annak a hatrait, hogy mit tekinthetnk rvnyes szmnak. Kezdlksnek itt egy szably.
95'5-t3>-^>52. 595 M t M m Milyen szablyok betartst sszer elvrni a felhasznlktl, ami kor kitltik az rlapot (pldul: a telefonszmok nem tartalmaz hatnak betket)?

M ^ M e J .h e tj k . p iM u l .hagy.

.$?ni$gyekt. ie h w .w . bevm i, .......................

.s. mind. a .10.izm jeg^t. e.gyhe.kfillj.00 . rni................................................................


A szmot felbonthatnnk hrom urlapmezore:. egy a krzetszmot,.egy az els.h:. rom. szmjegyet,, ejy pedig, . utols ngy szmjegyet tartalmazna'........................... .... . Vagy arra utasthatnnk a .felhasznlt,, hogy. gy. tltse k i.az .rlapot,, hogy....... a szm .(5 5 5 )6 3 6 -4 6 5 2 formtMm legyen.. A szablyokat, mi. szabjuk meg,...........
Olyan sokfle minta lehetsges! Hogyan hatrozhatunk meg olyan

szablyokat, amelyek minden m in t t lefednek?

Vannak dolgok, amiket biztosan tudunk a telefonszmokrl, s ezek alapjn megalkothatjuk a szablyokat.
Elszr is, Amerikban a telefonszmok nem kezddhetnek 1-gyel (tvolsgi hvs) vagy 0-val (kezel). Msodszor, 10 szmjegynek kell lennik. s br egyesek furfangosan szavakat alkotnak a telefonszmukbl, a telefonszmok lnyegben szmokbl llnak - a krzetszmmal egytt pontosan 10-bl.

568 10. fejezet

Szablyos kifejezsek

A telefonszmok mintjnak meghatrozsa


Ha tl akarsz lpni az empty () s az is s e t () fggvny nyjtotta alapszint ellenrzsen, meg kell hatroznod egy mintt, amelyre az adatoknak illeszkednik kell. A telefonszmok esetben ez azt jelenti, hogy el kell ktelezned magad egyetlen formtum mellett, amelyet megkvetelsz az rlap telefonszm mezjben. Miutn eldnttted a telefonszm kvnt formtumt (mintjt), sszehasonlthatod vele az adatokat. Albb lthat az Egyeslt llamok belfldi telefonszmaihoz valsznleg legszlesebb kr ben hasznlt formtum. Ha ezt a formtumot kveteled meg. az azt jelenti, hogy ha a fel hasznl ltal megadott telefonszm nem illeszkedik erre a mintra, a PHP-parancsfjl visszautastja az rlapot, s hibazenetet jelent meg.

# # # - # # # - # # # #

A vlasztott formtum: 3 szm jegy, egy ktjel, mg 3 szm jegy, mg egy ktjel, majd az utols 4 szmjegy.
636-46521

Ebbl kt szmjegy s egy ktjel hinyzik, s gy tnik, hogy a meglev k tjel sincs j helyen.

555-636-46521

Itt eggyel tbb szmjegy szerepel!

555-636-4652 5556364652

Ebben nincsenek ktjelek. Nincsenek

Ez tkletesen illeszkedik a mintra.

hlye krdsek K V
Muszj ezt a mintt hasznlnom a tele fonszmok illesztshez? A Risky Jobs esetben azrt ezt a mintt hasznljuk, mert szabv nyosnak tekinthet, de a sajt r lapjaid tervezsnl olyan formtu mot vlaszthatsz, ami a legssze rbbnek tnik. Azt azonban nem rt. ha szben tartod, hogy minl szlesebb krben elfogadott egy minta, annl valsznbb, hogy a felhasznlk kvetni fogjk. Nem lehetne egyszeren arra utastani a felhasznlkat, hogy a # # # # # # # # # # minta szerint r jk be a telefonszmot, majd a PHP fggvnyeivel biztostani, hogy 10 szm karakter legyen benne?

V: Megtehetnd, s elg is lenne, ha K a felhasznlk ezt a mintt vr


nk. Sajnos azonban ez nem tl j minta, mert a legtbben nem rjk egybe a telefonszmukat, amikor kitltenek egy rlapot. Az pedig, hogy a minta nem igazn szabv nyos, azt jelenti, hogy a felhasz nlk nincsenek hozzszokva, s ezrt kevsb valszn, hogy k vetni fogjk. s akkor mi K: meg, amilyetvan? Olyan mintt adhatok akarok, nem? De. csak V: szeretnd,kzbenanyilvn azt is hogy ltogatidnak kellemes lmnyben legyen r szk, msklnben nem fognak visszatrni a webhelyedrc.

Ok. s ha hrom szvegmezt hasznl nk a telefonszmhoz (egyet a krzet szmnak, egyet a kvetkez hrom szmjegynek, s mg egyet az utols ngy szmjegynek), aztn a PHP karakterlnc-kezel fggvnyeit alkalmaznm? Megtehetnd. s nhny webhely gy is tesz, de a mintailleszts na gyobb rugalmassgot nyjt, s ahogy a fejezetben ksbb ltni fogod, sokkal tbb mindenre hasznlhat annl, mint hogy biz tostsd. hogy a felhasznlk meg felel formtumban rjk be a tele fonszmukat.

most itt vagy 569

bemutatkoznak a szablyos kifejezsek

Mintailleszts szablyos kifejezsek segtsgvel


A PHP hatkony mdszert biztost szvegmintk ltrehozsra s illesztsre: szablyokat hatrozhatsz meg, amelyek lehetv teszik, hogy mintkat keress karakterlncokban. Eze ket a szablyokat szablyos kifejezseknek, vagy az angol nevkbl (regular expression) rvi den regex-cknek nevezik. A szablyos kifejezsek egy-egy karakterlnc-mintt brzolnak - ezekre illesztnk szvegeket. A szablyos kifejezsek segtsgvel a kdban lerhatod azokat a szablyokat, amelyeknek a karakterlncoknak meg kell felelnik ahhoz, hogy' az illeszts egyezst talljon. Pldaknt lssunk egy szablyos kifejezst, amely 10 egyms utn kvetkez szmjegyet keres. A minta csak olyan karakterlncokra fog illeszkedni, amelyek 10 szmjegybl llnak - ha a karakterlnc hosszabb vagy rvidebb ennl, nem kapunk egyezst, s akkor sem, ha szmokon kvl mst is tartalmaz. Nzzk meg a minta egyes rszeit:

Ez a rsz egyszer. Minden szablyos kifejezs perjelek kel kezddik s vgzdik.

/ A\ d \ d \ d \ d \ d \ d \ d \ d \ d \ d $ /
A A kalapjel azt jelzi, hogy az illesztst a karakterlnc elejn kell kezdeni. A

\
A \d a d ig .t" (szmj ff) rov.d.tese A karakterlnc els karakternek teht szm jegynek kell lennie...

\
& ^ kell keresni.

Ez a dollarjel azt je lenti, hogy a karakterlnenak itt vge kell, hogy legyen.

J
# je(ek
y feht

sszesen 10 szmjegyet

Ugyanezt a szablyos kifejezst tmrebben is fel lehet rni. mgpedig kapcsos zrjelek segtsgvel, amelyek ismtldst jeleznek.

/ A\ d { 1 0 } $ / f, ,
Ez ugyanazt jelenti, mint

A szablyos kifejezsek olyan szablyok, amelyek, , .... , , .

a fenti minta, a { i o }

1 0

szm kifejezsjegy"

kel egy vagy tbb karakterlncot illeszthetsz egy mmtara.


,

nek rvid formja.

570

70. fejezet

Szablyos kifejezsek

M o s t m r minden vilgos. Kivve a szablyos kifejezseket.


Q

Igaz, a szablyos kifejezsek elg rejtlyesek, s gyakran nehezen olvashatk - viszont rendkvl hatkonyak.
A hatkonysgnak ltalban ra van, s a szablyos kifejezsek esetben ez az r a megalkotsukhoz szksges bonyolult nyelvtan elsajttsa. Nem vl hatsz a szablyos kifejezsek mesterv egyetlen jszaka alatt, de erre sze rencsre nincs is szksg. A szablyos kifejezsekkel meglepen hasznos dolgokat lehet csinlni akkor is, ha csak alapszint ismereteid vannak rluk, klnsen ha rlapmezk rvnyessgnek ellenrzsrl van sz. Ezen k vl minl tbbet hasznlod ket, s minl tbb gyakorlatot szerzel a feldol gozsukban, annl knnyebben megrted majd a jelentsket.

m o st i t t vagy

>

571

a szablyos kifejezsek szokvnyos metakarakterei

Mintapts metakarakterek segtsgvel


Egy szveges karakterlncban szmjegyeket keresni a \ segtsgvel elg d klassz, de ha csak ennyi lenne, amire a szablyos kifejezsek kpesek, akkor elg szk terleten lennnek alkalmazhatk. A szmjegyek illesztse mg a Riskyjobs telefonszmainak ellenrzsre sem elg, hiszen olyan karakte rek illesztsre is szksg van, mint a szkzk, a ktjelek, st a betk. Szerencsre a PHP szablyos kifejezseiben szmos, a \d-hez hasonl k lnleges kifejezst hasznlhatsz az ilyen karakterek megkeresshez. Ezeket a kifejezseket m etakaraktereknek hvjk - nzzk is meg kzelebbrl a leg gyakrabban hasznltakat:
jL

A metakarakterek te szik lehetv, hogy szvegmintkat rj le egy szablyos kifeje zsen bell.

\d Ahogy az elz oldalon lthattad, ez a metakarakter \\w * egy szmjegyet keres, s brmilyen szmjegyre illesz kedik 0 s 9 kztt. Ne feledd azonban, hogy nma- | Ez a metakarakter egy tetszleges alfanumerikus karaktert jelent, vagyis egy bett vagy egy szmot, j gban a \ csak egy szmjegyet jelent, ezrt ha egy d ; a-z s A-z kztt (kis- s nagybetseket egyarnt), kt szmjegybl ll szmot keresel, akkor vagy' illetve 0-9 kztt (mint a \ d). : a \ d, vagy a \d{2} kifejezst kell hasznlnod. d\

J a metakarakter ureshely-karaktereket (whitespace)


keres. Ez nem csak azt a szkz karaktert jelenti, amit akkor kapsz, ha letd a Szkz billentyt; az \ a tas latoi az jsor, e.s a kocsivissza karakterekre is illesz k e d j Nem szabad megfeledkezned arrl, hogy az egyszerre csak egy karaktert tall meg, ezrt ha kt egyms utn kvetkez szkzt keresel, akkor vagy az \ s, vagy az \ s\ s{2} kifejezst kell hasznlnod A kalap metakarakterrel mr szintn talkoztl az elz oldalon. Ez egy karakterlnc kezdett ke resi, teht azt jelezheted vele, hogy az illeszkeds nek a karakterlnc elejn kell kezddnie, nem pe dig brhol a karakterlncon bell. A / A\d{3} sza blyos kifejezs pldul a .,300 alkalmazs" szveg re illeszkedik, a Leszlltottk a 300 alkalmazst .mondatra azonban nem.

A pont metakarakter az jsor kivtelvel minden karakterre illeszkedik: a betkre s a szmje gyekre, mint a \ , valamint a szkzkre s ta w bu latorokra, mint az \ s.

Ez a metakarakter egy karakterlnc vgt keresi. A ka lapjellel egytt hasznlva megadhatod, hogy a kere sett mintnak pontosan hol kell kezddnie, s hol kell vegzdnie. A /*W{5}\s\d{3 }$/ szablyos kifejezs pldul a Nanny 411" szvegre illeszkedik, a Nanny 411 is great vagy a Gall Nanny 411 azonban nem '

Ezek a metakarakterek nagyon hasznosak, de mi a helyzet, ha a szablyos kifejezsben egy konkrt karaktert szeretnl megadni? Nos, csak annyit kell tenned, hogy berod a kvnt karaktert a kifejezsbe. Pldul ha pontosan a 707-827-7000 telefonszmol keresed, a / 707 8 27 - 7 0 0 0 / szablyos kife jezst kell megadnod.

572 10. fejezet

Szablyos kifejezsek

lltsd prba!
lltsd prba a klnbz telefonszmokat ler szablyos kifejezseket a megfelel telefonszmmal!

Szablyos kifejezs

Az illeszked karakterlnc

5556364652

/-\d{3}\s\d{3}\s\d{4}$/

555 636 4652

/"Ad{3}\d(3}-\d{4}$/

5 5 5 6 3 6 -4 6 5 2

/~\d(3)-\d{3)-\d{4}$/

5 5 5 ME N IN JA

/ A\d{3}

\s\w\w\s\w{5}$/

555 6 3 6 4 6 5 2

/ A\d{10}$/

5 5 5 -6 3 6 -4 6 5 2

most itt vagy * 573

lltsd prba! - megolds

lltsd prba!
Megolds
lltsd prba a klnbz telefonszmokat ler szablyos kifejezseket a megfelel telefonszmmal!

Szablyos kifejezs
/ /'\d{3) \s\d{7] $/

Az illeszked karakterlnc
5556364652

/-\d{3)\s\d(3)\s\d{4}$/

555 636 4652

/-\d{3}\d{3}-\d{4}$/
A Risky Jobs rlapon erre a mintra van szksg, hogy a telefonszmok

5 5 5 6 3 6 -4 6 5 2

# # #_# # # _## # #
formtumban legyenek.

/''\d{3}-\d{3}-\d{4}$/

5 5 5 ME N IN JA

// '\d{3}\s\w\w\s\w{5) $/

555 6364652

A \w

metakarakter ebben a min

fban betkre illeszkedik.

/ A\d{10}$/
Ez a minta csupa szmjegybl ll, teht csak azokra a telefonszmokra illeszkedik, amelyek nem tartalmaznak szkzket vagy ktjeleket.

5 5 5 -6 3 6 -4 6 5 2

574 10. fejezet

Szablyos kifejezsek

Lgy a szablyos kifejezs!


A feladatod, hogy eljtszd a szablyos kifejezs szerept, s vagy elfogadd, vagy visszautastsd a Risky Jobs felhasznlinak telefonszmait. Pipld ki azoknak a telefonszmoknak a ngyzett, amelyeket rvnyesnek ta llsz, a tbbit pedig hagyd resen, s rd le, hogy az rvnytelen szmok mirt rvnytelenek!

Ez a telefonszmok szablyos kifejezse.


/ A\ d { 3 } - \ d { 3 } - \ d { 4 } $ /

* (5 55 ) 9 3 5 -2 6 5 9 (5 5 5 )6 7 2 -0 9 5 3 5 5 5 -3 4 3 -8 2 6 3

A szrfzs elg kockza tos, klnsen ha hivat sos cpacsaiiknt dolgozol!

5 5 5 -4 4 1 -9 0 0 5

5 5 5 .9 0 3 .6 3 8 6

5 5 5 -6 1 2 -8 5 2 7 -8 7 2 4

most itt vagy * 575

Lgy a szablyos kifejezs! - megolds

Lgy a szablyos kifejezs! - Megolds


A feladatod, hogy eljtszd a szablyos kifejezs szerept, s vagy elfogadd, vagy visszautastsd a Risky Jobs felhasznlinak telefonszmait. Pipld ki azoknak a telefonszmoknak a ngyzett, amelyeket rv nyesnek tallsz, a tbbit pedig hagyd resen, s rd le, hogy az rvnytelen szmok mirt rvnytelenek!

Ez a telefonszmok szablyos kifejezse.


/ A \ d { 3 } - \ d { 3 } - \ d { 4 } $ /

A zrjelek nem megengedettek, s a szkzk sem. (5 55 ) 9 3 5 -2 6 5 9

M
^

*
1 ^ 5 5 5 -3 4 3 -8 2 6 3 Krem, ne hasznl jn zrjeleket!

(5 5 5 )6 7 2 -0 9 5 3

A szablyos kifejez snk ktjeleket s nem pontokat vr. 5 5 5 -4 4 1 -9 0 0 5 5 5 5 .9 0 3 .6 3 8 6

J, itt ngy szmjeggyel tbb van! Ez valami iro dai mellk?

555-612-852 -8 7 2 4

576 10. fejezet

Szablyos kifejezsek

Egyesek tovbbi szmjegyeket adnak a telefonszmukhoz, pldul egy ngy szmjegy mellket. Nem lehetne valahogy ezekre is m in t t illeszteni?

De igen, csak az a lnyeg, hogy egy ilyen minta elhagyhatknt szerepeljen a szablyos kifejezsben.
Ha a szablyos kifejezst a /^\d{3}-\d{3}-\d{4}-\d{4}$/ alakra vltoztatod, akkor m egkveteled a karakterlnc vgn a ngyjegy mellket, gy a minta mr nem fog illesz kedni az olyan telefonszmokra, mint az 555-636-4652. A szablyos kifejezsekben azonban azt is jelezheted, hogy a karakterlnc bizonyos rszei nem ktelezek. A szab lyos kifejezsekben gynevezett m ennyisgjelzkkel (quantifier) hatrozhatod meg, hogy a mintban hnyszor kell szerepelnie egy adn karakternek vagy metakarakternek. Mennyisgjelzt mr lttl mkds kzben is, egy ilyesfajta szablyos kifejezsben:

/ A\ d { 1 0 } $ /

z azt mondja, hogy zsinrban 10 szm jegynek kell llnia a karakterlncban.

Itt a kapcsos zrjelek mennyisgjelzknt mkdnek, s azt adjk meg, hogy hny szmjegynek kell szerepelnie a karakterlncban. Nzznk meg nhny szintn gyak ran hasznlatos mennyisgjelzt:

{min,max}

______

I la a kapcsos zrjelek kztt kt vesszvel elA megelz karakternek, vlasztott szmjegy ll, az azt hatrozza meg. hogy az elzleg megadott karakter, metakarak- metakarakternek legalbb tr legalbb s legfeljebb hnyszor fordulhat el. f?Yszer szerepelme kell, de A {2 4} pldul azt jelzi, hogy a karakter 2, 3 t0bbsZ0r 1 kerepelhet. 5 vagy 4 alkalommal szerepelhet egyms utn.__ _m
A m e g e l z karakti m etakarakter egyszer vag y t b b

i
? A megelz karakter vagy metakarakter egyszer szerepel, vag y egyaltalan ~

szr is s z e re p e l...v a g y egyaltalan nem .

A mennyisgjelzo adja meg, hogy egy meta karakternek hnyszor kell szerepelnie.

Teht ha a telefonszm vgn tallhat nem ktelez szmjegyeket is meg szeretnd tallni, a kvetkez mintt hasznlhatod:

/ A\ d { 3 } - \ d { 3 } - \ d { 4 } ( - \ d { 4 } ) ? $ /
A z t rszt, amelyikre a m ennyisig!!" vonatkozik, zrjelbe tesszkA krdjel a ktjelet s az utols ngy szmjegyet elhagyhatv teszi.
m ost i t t vagy 577

ka ra kte ro szt lyo k hasznlata

Egy dolgot elfelejtettel. Az amerikai telefonszmok nem kezddhetnek O-val vagy 1-gyel.

Teljesen igazad van. A 0 a kezelt kapcsolja, az 1 pedig tvolsgi hvst kezdemnyez.


Mi csak a krzetszmot s a telefonszmot szeretnnk megkapni, te ht meg kell bizonyosodnunk rla, hogy az els szmjegy nem 1 vagy 0. Ehhez pedig egy karakterosztlyra lesz szksgnk. A karakterosztlyok segtsgvel egy rtkhalmazbl illeszthetsz ka raktereket, pldul egy adott tartomnyba es szmjegyeket keres hetsz. Ha pedig mindent meg szeretnl tallni, ami nem rsze a meg adott halmaznak, a kalapjelet kell a tartomny el rnod. Ha azt szeretnd jelezni, hogy bizonyos karakterek vagy metakarakterek egy karakterosztly rszei, csak annyit kell tenned, hogy szgletes zrjelek kz rod ket. Nzznk nhny pldt a karakterosztlyokra mkds kzben:

A karakterosztlyokban a ^ azt jelenti, hogy nem egyezik".

[ 0- 2 ]
Ezzel az adott tartomny ba es (0. 1 vagy 2) sz mokat keresheted meg.

[ Ab - f ]
A kalapjel jelentse ms, ha egy karakterosztlyon bell hasznlod. Itt nem azt mondja, hogy a karakterlncnak a kvetkez karakterrel kell kezddnie, hanem azt. hogy illessz mindent, kivve.... A fenti kifejezs teht a b, c, ci. e s /karakterek kivtelvel mindenre illeszkedni fog.

[A -D ]
Ez az A. B, C s D karak terekre illeszkedik.

A karakterosztlyok egyetlen karakter illesztst vgz' szablyhalmazok.


578
10. fejezet
rj szablyos kifejezst a nem zetkzi telefonszm ok illesztsre:

................................................................................

Szablyos kifejezsek

A mintk finomhangolsa karakterosztlyok segtsgvel


A karakterosztlyok segtsgvel finomthatunk a telefonszmokat ellenrz szablyos kifejezsnkn, hogy ne illeszkedjen az rvnytelen szmjegy-kombincikra. gy ha valaki vletlenl 0-val vagy 1-gyel kezdd krzetszmot ad meg, hibazenetet adhatunk. me az j, tovbbfejlesztett szablyos kifejezs:

A ~ s a $ azt adja meg, hogy a szablyos " w


/ A [2 - 9 ]
^

~
l

kifejezsnknek az illesztett karakterlnc egszt magba kell foglalnia, vagyis a karai raktert, ami nem a telexszm hoz tartozik.

\ d {2 } -\ d{ 3 } -\ d{ 4} $ /

^ - majd hrom wffijegynek...

A karakterosztly azt mondja, hogy az els karakternek egy 2 s 9 kz es szmnak kell lennie.

Ezt kvetben kt szm] ey n kell llnia, ame|yek rtke brmi |e(,e} o s 9 kztt...

x x ...vgl pedig egy ktjelnek es az utolso ngy szmjegynek,

Nincsenek

hlye krdsek Ki Teht a karakterosztlyok segtsgvel a szvegre illesz- V I Csak annyi a dolgod, hogy egy mennyisgjelzt

ked karaktertartomnyokat hatrozhatunk meg? ! Igen, a karakterosztlyok azt teszik lehetv, hogy egy szablyos kifejezsben lerd, hogy a szvegre nem csak egy karakter, hanem karakterek egy adott halmaza is illeszkedhet. Az faeiouj karak- v terosztly pldul minden kisbets magnhangzra illeszkedik, mg az [m-zM-z] az bc msodik V felnek minden betjre, akr kisbets, akr nagybets, a [0-9] karakterosztly pedig egyenrtk a \d metakarakterrel, ami lnyegben csak az elbbi gyorsrsos vltozata.

K ! A karakterosztlyokban megadott karakterek vagy tart-

mnyok kz nem kell szkzt vagy vesszt tenni? ! Nem. Ha gy teszel, azt a PHP gy rtelmezi, hogy ezek a karakterek is a szvegre illeszteni kvnt karakterhalmaz rszei. Az [m~z, M-Zl karakterosztly pldul nem csak az m s 2rkztti kis- s nagybetkre illeszkedne, hanem a szkzkre s a vesszkre is - pedig valsznleg nem ez volt a szndkod.

K ! M it kell tennem, ha egy karakterosztlyban egy karakter


egynl tbb elfordulst keresem (pldul tbb egyms utn ll magnhangzt)?

rsz a karakterosztly utn. Az / [aeiouAEiou] + / kifejezs pldul egy vagy tbb egyms utn ll magnhangzra illeszkedik, rr ! Azt hittem , a mennyisgjelzk csak a kzvetlenl elttk 'r j ll karakterre vonatkoznak. ! ltalban valban ez a helyzet, de ha egy mennyi sgjelzt kzvetlenl egy karakterosztlyt kvet, akkor az egsz osztlyra rvnyes. Ha pedig azt szeretnd, hogy egy mennyisgjelz karakterosztlyban nem szerepl karakterek egy sorozatra vonatkozzon, akkor zrjelek kz kell rnod az emltett karaktereket, hogy jelezd az sszetartozsukat. A / (hello) + szablyos kifejezs pld/ ul a hello sz egy vagy tbb egyms utni elfordulst tallja meg egy szvegben, -- wt S ^ M i a helyzet, ha egy szt ktfle rsmddal (pldul \\ 'c j ketchup" s catsup") is meg szeretnk tallni? V ! A szablyos kifejezsekben a cs karakterrel ( I) jellhetsz vlasztsi lehetsget. Az emltett sz hrom leggyakoribb rsmdjt teht a / (ketchup | catsup l catchup) / szablyos kifejezssel keresheted meg. m o s / f f vggy 579

a fenntartott karakterek levdse

Mi a helyzet akkor, ha egy szablyos kifejezsbe olyan karaktereket szeretnek rni, m in t a pont vagy a krdjel? Ha ezeket berom, a PHP a z t fo^Ja hinni, hogy m ta ka rakterek vagy mennyisgjelzdk, es elrontja a regex feldolgozst, nem?

Ha egy szablyos kifejezsben fenntartott karaktereket (tiltott karaktereket) szeretnl hasznlni, le kell vdened ket (escape).
A szablyos kifejezsek nyelvtanban nhny karakternek klnle ges jelentse van, mert ezek metakaraktereket, mennyisgjelzket s karakterosztlyokat jellnek. Ezek a karakterek a pont (.), a kr djel (?), a pluszjel (+), a nyit szgletes zrjel (D, a nyit s zr kerek zrjel, a kalapjel (a), a dollrjel ($), a cs karakter ( I), a for dtott perjel (\ a perjel (/) s a csillag (*). Ha ezeket a karaktereket ), az eredeti jelentskben, s nem metakarakter vagy7mennyisgjelz szerepben szeretnd egy szablyos kifejezsbe rni, le kell vde ned" ket gy7 hogy eljk rsz egy fordtott perjelet. , Ha egy telefonszmban pldul zrjeleket szeretnl keresni, ezzel a megoldssal nem lhetsz:

Ezeket a PHP egyszeren csoportknt kezeli.


/ l

(5 5 5 )6 3 6 -4 6 5 2

/ A ( \ d { 3 } ) \ d { 3 } - \ d { 4 } $ /

Ehelyett mind a nyit, mind a zr zrjel el fordtott perjelet kell tenned, hogy jelezd, hogy tnylegesen zrjelknt kell rtelmezni ket:

A PHP most mr tudni fogja, hogy ezek tnyleg zrjelek.

(5 5 5 )6 3 6 -4 6 5 2

/ A\ ( \ d < 3 } \ ) \ d { 3 } - \ d { 4 } $ /

580

10. fejezet

Szablyos kifejezsek

rj ide egy-egy karakterlncot, amire az albbi mintk illeszkednek:

Gyakorlat

/ A [ 3 - 6 ] { 4 } /

/ A ( [ A - Z l \ d ) {2 }$ /

Tegyk fel, hogy bvteni szeretnnk a Risky Jobs webhely lehetsgeit, s lehetv szeretnnk ten ni, hogy a felhasznlk tbbfle formtumban is megadhassk a telefonszmaikat. rj olyan szab lyos kifejezst, amely az albbi karakterlncok MINDEGYIKRE illeszkedik, s nem engedi meg a 0-t vagy az 1-et els szmjegyknt. A mintnak csak szmjegyeket, zrjeleket, szkzket s ktjele ket szabad engedlyeznie.

5 5 5 -6 3 6 -4 6 5 2 (5 5 5 )-6 3 6 -4 6 5 2

5 5 5 6 3 6 -4 6 5 2

(5 5 5 ) 6 3 6 -4 6 5 2

most itt vagy 581

Gyakorlat - megolds

rj ide egy-egv karakterlncot, amire az albbi mintk illeszkednek:

Gyakorlat - megolds
A karakterlncnak a kvetkezvel kell kezddnie:
^

s ez a karakterosztly ismtldik

A karakterlncnak a kvetkezvel kell egy kezddnie: nagybet... s egy szm... N*

^ s itt a vge.

/ A [ 3 - 6 ] { 4 } /

/ A ( [ A - Z ] \ d ) { 2 } $ /

Minden olyan karakterlnc illeszkedni fog, ami a 3, 4, 5, 6 tartomnyba es ngy szmjeggyel kezddik. Ezek teht mind jk: 5533", 3 4 5 6 is a number.", 6533xyz .

Minden olyan karakterlnc, ami egy nagybet vel kezddik, ezt egy szmjegy kveti, majd mg egy nagybet s egy jabb szmjegy, s a karakterlnc itt vget r: ilyen pldul a B5C 9" vagy az R2D2".

Tegyk fel. hogy bvteni szeretnnk a Risky Jobs webhely lehetsgeit, s lehetv szeretnnk ten ni, hogy a felhasznlk tbbfle formtumban is megadhassk a telefonszmaikat. rj olyan szab lyos kifejezst, amely az albbi karakterlncok MINDEGYIKRE illeszkedik, s nem engedi meg a 0-t vagy az 1-et els szmjegyknt. A mintnak csak szmjegyeket, zrjeleket, szkzket s ktjele ket szabad engedlyeznie.

5 5 5 -6 3 6 -4 6 5 2 (5 5 5 )-6 3 6 -4 6 5 2 A karakterlncnak a kvetkezvel kell kezddnie: ^

555 6 3 6 -4 6 5 2 (5 55 ) 6 3 6 -4 6 5 2 egy ktjel vagy szkz... V mg egy ktjel


/

egy 2 gs 9 k. , tfj 52m ^ ktszer... ^

s ngy szmjegy.

egy elhagyhat nyit zlommal szerepelhet...

/ * \ (? c z - ) ] \ a { i } \ ) ?c-\ sJ \ d i } - \ d{ * } / / / s itt a vge. f


szmjegy... egy elhagyhat zr zrjel... s hrom szmjegy.

rjel, ami 0 vagy I alka

582 10. fejezet

Szablyos kifejezsek

Elegem van a Risky Jobs nletrajzadatbzisban ta l lh a t rossz adatokbl! Mire Jk ezek a kifejezsek, ha nem hasznljuk fel <5ket valahogy?

A Risky Jobs webhelyen munkra kell fognunk a sza blyos kifejezseket az r lapadatok ellenrzshez!

most itt vagy * 583

a php preg match!) fggvnye

Mintakeress a preg_match() segtsgvel


Nem csak a szrakozs kedvrt ptettnk fel mintkat - most munkra is fog juk ket a PHP preg_match<) fggvnynek segtsgvel. Ennek a fggvny nek egy a korbban ltottakhoz hasonl szablyos kifejezst, valamint egy sz veges karakterlncot kell tadnod. Ha a fggvny nem tall egyezst, hamis r tket, ha viszont igen, akkor igazat ad vissza.

preg_match($szablyos_kifejezs, $karakterlnc)
Ide jn a szablyos kifejezs. A fggvny T egy karakterlncot vr, ezrt a szablyos kifejezst aposztrfok kz kell tenned. Ide kerl a karakterlnc, amely nek a mintval val egyezst el lenrizni szeretnd.

me egy plda a preg_match () fggvny hasznlatra: egy olyan szablyos ki fejezst adunk t neki, amely egy ngy karakterbl ll, nagybetket s szmje gyeket vltakozva tartalmaz szvegel keres:

A preg_match()-nek tadott szablyos kifejezseket aposztrfok kz kell zrni.

p r e g _ m a t c h ( 1/ A \ d { 3 } - \ d { 2 } - \ d { 4 } $ / 1 ,

f
A fggvny egy egsz szmot ad vissza: 1-et, ha a karakterlnc il leszkedik a mintra, s 0 -t, ha nem.

'555-02-9983')
Ez a karakterlnc illeszkedik a szablyos kifejezsre, ezrt a fggvny 1-et fog visszaadni. A preg_match() fggvny a felttelbe gyazdik, teht az eredmnye hatrozza meg, hogy milyen kd fog lefutni.

"T A mintt berhatod gy, kzvetlenl is a fggvny be, de ltalban jobb egy vltozban trolni.

A preg_match() fggvny lehetsgeit kihasznlva kifinomultabb rvnyessg-ellenrzst valsthatsz meg a PHP-parancsfjlokban, ha egy if utastsba foglalod a visszakapott rtket:

if (preg match ('/A\d{3 }-\d{2 }-\d{4 }$/', '555 -02 -9 9 8 3 ')) { echo 'Valid social security number.1 ; } else {
Ha az illeszts sikeres, a preg_match() igazat ___ ad vissza, ami azt jelzi a PHP-nek, hogy a fel ttel teljeslt, ezrt ezt a kdot futtatja le,

echo 'That social security number is invalid!';

t
584 10. fejezet

Ha az illeszts nem sikerl, a preg_match() hamis rt ket ad vissza, gy a felttel is hamisra rtkel'dik ki, teht ez a kd fut le.

Szablyos kifejezsek

rd t a Risky Jobs PHP-parancsfjljnak itt kiemelt rszt gy, hogy a jelentkezsi rlapon a telefonszm mezbe bert szveget az empty {) helyett a preg_match () fggvny segtsgvel ellenrizze. A fggvnyben hasznld az elz oldalon meg alkotott szablyos kifejezst.

if (empty($phone)) {
//A $phone re s

echo !<p class=error">Your phone number is invalid.</p>T; $output form = fyes!;

m o s t i t t vagy > 585

Gyakorlat

megolds

Gyakorlat megolds

rd t a Risky Jobs PHP-parancsfjljnak itt kiemelt rszt gy, hogy a jelentkezsi rlapon a telefonszm mezbe bert szveget az empty () helyett a preg_match () fggvny segtsgvel ellenrizze. A fggvnyben hasznld az elz oldalon megalkttt szablyos kifejezst.

if (empty($phone)) {
// A $phone re s

echo T<p class=ferror">Your phone number is invalid.</p>!; l $output_form = fyesf;


Az emptyO helyett a pfeg_match() segts gvel ellenrizzk a telefonszm rvnyess gt. A fggvnye neve el a tagads - nt (1) - mveleti jele kerl, mert nem akarunk minden alkalommal hibt jelezni, amikor a bert
adatok NEM illeszkednek a mintra.

z az a korbbi szablyos kifejezs, amelyet a telefonszmokhoz alkottun . Az eoho utasitast modositam kell IfU e )) { e9Y kicsit, mivel nem csak azt ellenorizzk, hogy a mez't kitltttk-e, hanem azt is, hogy az adat megfelel-e a telefonszmok szabvnyos mintjnak.

/ / A $phone nem rvnyes


edko '< f
i r foutfut^+orm _ iycs; >. J

P^*c numbey*. k j #yald.< /j>j r

} \ .......................

Az $output__form vltzt Vesre lltjuk ..................f Hlbazenett , - ... v aztn bertam a teljes 3 ogy ra an. / telefonszm om at, es ll s t kaptam nindzsakntl

First Name: Jimmy Last Name: Swift Email: JS@sim-u-duck.com Phone: (555) 636 4652 Desired Job: Ninja

586 10. fejezet

Szablyos kifejezsek

,2 ; dfL ! U
Z

Nem csak art, hogy a telefonszm mez' res-e!

Ellenrizd a telefonszmok rvnyessgt a Risky Jobs jelentkezsi rlapjn!


Tltsd le a r e g is tr a tio n .php parancsfjlt a Head First Labs webhelyrl, a www.heaf i rstlabs . com / books/hf php cmrl, a Risky Jobs webhely stluslapjval (s ty le , ess) s kpeivel (r i sk y jo b s_ti t l e . g i f s risk y jo bs_fire m an .png ) egytt, majd mdostsd a r e g is tr a tio n .php parancsfjlt gy, hogy a preg_m atch() fggvny segtsgvel ellenrizze a telefon szmok rvnyessgt a megfelel szablyos kifejezs alapjn. Ne felejtsd el mdostani a hi bazenetet sem, hogy a felhasznlk ne csak arrl rtesljenek, ha a mez resen maradt, ha nem arrl is, ha a telefonszm rvnytelen. Tltsd fel a mdostott parancsfjlt a webkiszolgldra, s nyisd meg egy webbngszben. Prblj berni nhny klnbz formtum tele fonszmot, s figyeld meg, hogyan lgja el a parancsfjl a hibkat.
'y R SkyJos - Retustatior ... B..

M o st m r nem tudunk vletlenl rossz telefonszm ot berni, gy nem maradunk le az llsajnlatokrl!

A parancsfjl most mar hi bazenetet jelent meg, ha a telefonszmot helytelenl rtk be - ez esetben kt jel helyett pontokkal.

A Risky Jobs alkalmazs teljes forrskdjt le tltheted a Head First Labs webhelyrl, mg hozz az albbi cmrl: www.headfirstlabs.com/books/hfphp

m ost i t t vagy 587

a php p re g re p la c e f) fggvnye

Hm. Ha a szablyos kifejezsnk tbb telefonszam mintra is illeszkedik, akkor az adatbzisban klnfle form tum adatok fognak szerepelni, ami nem t l j. 5zerintem egysgesteni kellene e z t a dolgot.

Az, hogy megengeded, hogy az adatokat klnfle formtumokban rjk be, mg nem szksgszeren jelenti azt, hogy gy is szeretnd trolni ket.
Szerencsre van egy msik szablyoskifejezs-fggvny is, amely lehe tv teszi, hogy fogd a Riskyjobs felhasznli ltal megadott rvnyes telefonszmokat, s ngy klnbz helyett egyetlen egysges mintba rendezd azokat. A preg_replace () fggvny egy lpssel tovbbmegy a preg_match( )-nl a szablyos kifejezsekkel vgzett mintailleszts ben. Azon tl, hogy megllaptja, hogy az adott minta megfelel-e egy adott karakterlncnak, azt is megengedi, hogy megadj egy cseremintt, amelyet az illeszked karakterlncokra alkalmazhatsz. Ez nagyon hason lt a korbban mr hasznlt str_replace () fggvny mkdsre, csak ppen karakterlncok helyett szablyos kifejezsekkel vgzi a munkjt.

preg_replace($mintaf $csereminta, $karakterlnc)

/ Ezeket a nemkvnatos
karaktereket keressk.

t
Ha nemkvnatos ka raktert tallunk, erre szeretnnk lecserlni.

f
Ebben a karakterlncban hajt juk vgre a keress s csere" mvelett.

me egy plda a preg_replace () fggvnyre mkds kzben:

$new _year = p r e g _ r e p la c e ( ' / 2 0 0 [0 - 9 ]/'

/
A $new_year vltozban a preg__replace() fggvny eredmnyt, vagyis a keress s csere mvelete utn kapott javtott karakterlncot troljuk. Ez a szablyos kifejezs arra utastja a preg_replace()-t, hogy a 2 0 0 0 s 2 0 0 9 kz es vszmokkal keressen egyezst.

'2010',

'T h e y e a r

is

2009.

Ha a fggvny egye zst tall, az vsz mot 2010-re cserli.

A karakterlncban tallt minden 2 0 00 s 2 0 0 9 kz es vszm 2010-re cserl'dik.

588

10. fejezet

Szablyos kifejezsek

Egysgestsd a Risky Jobs rlapjra bevitt telefonszmokat, s rd be az albbi ada tokat a lenti adatbzis-tbla phone oszlopba. Azt a formtumot hasznld, amelyik a lehet legkevesebb adatot trolja a felhasznlk telefonszmainak brzolshoz!

Gyakorlat

(5 5 5 )6 7 2 -0 9 5 3
Risky Jobs -Registration
Register with Risky Jobs, and post your First Namer L a Name:

5 5 5 -4 4 1 -9 0 0 5 5 5 5 .9 0 3 .6 3 8 6 5 5 5 -6 1 2 -8 5 2 7 -8 7 2 4

HraaiL Phone: Desired Job Paste your resume here:

most itt vagy 589

Gyakorlat

m egolds

Egysgestsd a Risky Jobs riapjra bevitt telefonszmokat, s rd be az albbi ada tokat a lenti adatbzis-tbla phone oszlopba. Azt a formtumot hasznld, amelyik a lehet legkevesebb adatot trolja a felhasznlk telefonszmainak brzolshoz!

Gyakorlat - megolds

(5 55 ) 9 3 5 -2 6 5 9 (5 5 5 )6 7 2 -0 9 5 3 5 5 5 -3 4 3 -8 2 6 3 5 5 5 -4 4 1 -9 0 0 5 5 5 5 .9 0 3 .6 3 8 6 5 5 5 -6 1 2 -8 5 2 7 -8 7 2 4

A telefonszmok trolsnak legtisztbb mdja, ha a szm jegyeket kivve mindent elt voltasz bellk.

5 5 5 ^ -/1 0 0 5

590 10. fejezet

Szablyos kifejezsek

A telefonszmok egysgestse
A Riskyjobs alkalmazs jelenleg a kvetkez szablyos kifejezst hasznlja a fel hasznlk ltal a jelentkezsi rlapon megadott telefonszmok rvnyessgnek ellenrzsre:

/ A \ ( ? [ 2 - 9 ] \ d { 2 } \ ) ? [ \ s ] \ d { 3 } - \ d { 4 } $ /
Ez a kvetkez ngy mintt kvet telefonszmokra illeszkedik:
X O i l i ,11 A 1 1 I 7 1 T m T i T m

TT m / T TT

j t

TT TT

I I jl Tl T lT Tl iI - IIJ l i l i l i l l
# ) - # # # - # # # #

( #

(###) mtt-ttmt#

Az adatokat ezekrl a form tum okrl...

A fenti formtumok az emberi szem szmra knnyen rtelmezhetk, de az SQLlekrdezseknek megneheztik, hogy az eredmnyt a kvnsgunk szerint rendez zk. A zrjelek pldul valsznleg megakadlyozzk, hogy a telefonszmokat krzetszm szerint csoportostsuk, ami a Riskyjobs alkalmazsban fontos lehet, ha elemezni szeretnnk, hogy a webhely hny felhasznlja lakik egy adott helyen. Ahhoz, hogy az ilyesfajta lekrdezsek lehetv vljanak, egysgestennk kell a te lefonszmokat, vagyis egyetlen formra kell hoznunk ket a p re g _re p l ace () fgg vny segtsgvel, mieltt egy INSERT utastssal beszrnnk az adatokat az adatb zisba. A legjobb megolds taln az, ha a szmjegyeket kivve minden karaktertl megszabadulunk, gy egyszeren 10 jegy szmokat trolhatunk a tblban, felesle ges karakterek nlkl. A tblban teht gy szeretnnk trolni a szmokat:
rrT rT rfT T T T T T rT T fT T r
I I f

...erre szeretnnk talaktani

Ez azt jelenti, hogy ngy karaktert kell megkeresnnk s lecserlnnk, pontosab ban eltvoltanunk: a nyit s zr zrjeleket, a szkzket s a ktjeleket. Ezeket a karaktereket attl fggetlenl meg kell tallnunk, hogy hol helyezkednek el a karakterlncban, ezrt a kezd kalapjelre (A illetve a zr dollrjelre ($) nincs ), szksg. Az emltett karakterek csoportjbl mindegyik karakter eltvoltsa szk sges, ezrt megadhatjuk ket karakterosztlyknt. A keressi sorrend nem szmt. A kvetkez szablyos kifejezst hasznlhatjuk:

Az adatok egysge stse hatkonyab b teszi az SQLlekrdezseket.

/ [\(\)
nyit zr zrjel kdt]el

most itt vagy 591

karakterek eltvoltsa a preg replacef) segtsgvel

Szabadulj meg a nemkvnatos karakterektl!


Most, hogy van egy mintd, amelyik megtallja a nemkvnatos karaktereket, a telefonszmokra alkalmazhatod, hogy megtiszttsa azokat, mieltt az adatbzis ba kerlnnek. De hogyan? Nos, itt veheted hasznt igazn a preg_repl ace ( ) fggvnynek. A trkk az, hogy a nemkvnatos karaktereket nem kell lecserlni, csak el kell tvoltani azokat - cserertkknt teht egyszeren egy res karakter lncot kell tadnod a preg_replace () fggvnynek. me egy plda a telefon szmokban nem kvnatos karakterek megkeressre s res karakterlnccal va l helyettestsre, vagyis lnyegben trlsre:

A csert a $phone vl tozban lev' karakter A keress s csere eredmnyt ebben lncon kell vgrehajtani.

az j telefonszm-vltozban troljuk.

$new _phone

= p re g _ re p la c e ( ' / [\( \) \ - \ s ] /
Ezeket a karaktereket keressk...

$phone)

... s egy res karakter lncra cserljk ket.

1i l il l IJ ill i f 1 1l 4 tT i i j i i i vv >> t rrrrrr - TTTTTT.tTTTTT

l l l l 1J

n n Tr Y ti ~ ww w T T1 1TiT T nw wnt
V drfim oJif It r t fhtf*. u th !o go h < |f? nJ

(# # # )-# # # -# # # #

O o

(###) m n - n m #

Ri'ky Jobs - Registration


R e is e r with Jo tn ,And p o s jrour

Ezek a telefonszm-formtumok mind rvnyesnek szmtanak, s a jelentkezsi rlap elfogadja ket.


phonfi

Email

L iNm: m ae

Fhxt Naox*. 7"

" -------------

Dcnitd Job:

p re g

r e p l a c e ()

5559352659 5556720953 5553438263 5554419005 5559036386 5556128527


^

ij

Minden telefonszmot egysge sen erre a formra hozunk, hogy az adatbzisban azonos alakban szerepeljenek.

592

70. fejezet

Szablyos ktfejezesek

Nem is tu d o m ... Nekem tlzsnak tnik, hogy azzal kelljen foglalkoznunk, hogy az a d a t bzisunkban csak 10 szmjegybl ll karakterlncok legyenek. Nem lehetne Inkbb ragaszkodni hozz, hogyr a felhasznlk gy gepeljek be a telefonszmokat?

Termszetesen lehetne, de ez ksbb gondokat okozna, mert a telefonszmokat kiolvas lekrdezsek nem gy mkdnnek, ahogy szeretnnk.
A legtbb felhasznl ahhoz szokott, hogy a telefonszmokat ktje lek, zrjelek s szkzk valamilyen kombincijval tagolva rja be, ezrt a tisztn szmjegyekbl ll telefonszmok kiknyszertse nem biztos, hogy a kvnt eredmnyt hozn. Sokkal jobb, ha komp romisszumot ktnk a felhasznlkkal, s viszonylag rugalmasak va gyunk az engedlyezett beviteli formtumok tern, mikzben gon doskodunk rla, hogy az adatok trolsa a lehet legegysgesebben trtnjen. Amgy is egyetlen preg_replace {) -hvsrl van sz, ami igazn nem nagy r a problma megoldsrt. Ila egyni fggvnyt kellene rni j sok kddal, akkor persze mr ms lenne a helyzet, de ha a hasznlhatsg s az adategysgessg javtsa csak egyetlen kd sorba kerl, akkor ezen tnyleg nincs mit tprengeni!

m o st i t t vagy

593

registration.php ellenrzse

Tsztt
Tiszttsd meg a telefonszmokat a Registration parancsfjl segtsgvel!
Mdostsd a r e g is tr a tio n .p h p parancsfjlt gy, hogy megtiszttsa a telefonszmokat! Ehhez add a kvetkez kdsorokat a parancsfjlhoz, kzvetlenl az utn a sor utn, amelyik megk szni a felhasznlnak, hogy feliratkozott a Risky Jobs adatbzisba:
$pattern = f/ [\(\)\-\s]/ ; $replacement = 1; $new_phone = preg_replace($pattern/ $replacement, $phone)/ echo Your phone number has been registered as . $new_phone . '.</p>!;

Tltsd fel a parancsfjlt a webkiszolgldra, s nyisd meg egy webbngszben. Tltsd ki az rlapot, rj be egy telefonszmot tagol karakterekkel (pldul: (707) 827-7000). nyjtsd be az rlapot, s nzd meg az eredmnyt.

Danger! Your dream job is out there. Do you have the guts to go find it?

Risky Jobs - Registration


Howard Soarstcn, thanks for registering Your phone number has been registered

A telefonszm csak szmjegyekre zsugo rodik - tagol ka rakterek nlkl.

Prbld ki a telefonszmot tbbfle vltozatban - pldul 707.827.7000, (707)-827-7000 vagy 707 827-7000 s figyeld meg, ahogy a szablyos kifejezs s a preg_replace () fggvny el tvoltja a felesleges karaktereket.

594 70. fejezet

Szablyos kifejezsek

A kses zsonglrnek k ld tt e-mailem vissza p a tta n t. Nem hiszem el, hogy ez a hlye rlap olyan e-mail cmeket is megenged berni, amik nem mukdnekl

Az e-mail cmbl hiny zik egy pont!

A telefonszmokhoz hasonlan az e-mail cmek formtuma is elgg kttt ahhoz, hogy ellenrizni kelljen az rvnyessgket is, ne csak azt, hogy kitltttk-e a mezt.
Ahhoz hasonlan, ahogy korbban a telefonszmok rvnyessgt ellenrizted, elszr azo kat a szablyokat kell meghatroznod, amelyeket az e-mail cmeknek kvetnik kell. Ezt k veten ezeket a szablyokat szablyos kifejezss formlhatod, s megvalsthatod a PHPparancsfjlban. Nzzk meg teht elszr, hogy pontosan milyen rszekbl is ll egy elektro nikus levlcm.

Tudjuk, hogy az e-mail cmeknek ezt a kt karaktert tartalmazniuk kell.

H e ly iN v Q T a r t o m n y E l t a g . T a r t o m n y U t t a g Ezek a rszek betkbl s szmokbl IIHafnak, s a HelyiNv-nek legalbb egy, a Tartomnylotag-nak pedig legalbb kt karakteresnek kell lennie. Ez ltalban hrom alfanumerikus karakterbl ll.

Agytorna
Prblj kitleni egy szablyos kifejezst, ami elg rugalmas ahhoz, hogy illeszkedjen a jobbra tallhat e-mail cmekre, s rd ide:

m o st i t t vagy 595

szablyos kifejezs az e-mail cmekhez

Az e-mail cmek illesztse nem felttlenl egyszer


gy tnhet, mintha az e-mail cmek illesztse meglehetsen egyszer feladat lenne, mivel els pillantsra nem ltszik annyi korltozs a hasznlhat ka rakterekre nzve, mint a telefonszmok esetben. A cm HelyiNv (LocalName) rsznek (a @jel eltti rsznek) az illesztst pldul gyerekj tknak vlheted, mivel csak szmok s betk (alfanumerikus karakterek) le hetnek benne, teht gy gondolhatod, hogy a kvetkez minta hasznlhat:

/ A\w+/

A karakterlnc elejn...

...egy vagy tbb alfanu merikus karakter ll.

Ez a minta minden alfanumerikus karaktert megenged a helyi nvben, de sajnos hinyoznak belle tovbbi karakterek, amelyek ugyancsak rv nyesnek szmtanak az e-mail cmekben. Ha hiszed, ha nem. egy rv nyes e-mail cm az albbi karaktereknek is brmelyikt tartalmazhatja a HelyiNv rszben, br vannak kzttk olyanok, amelyek nem llhat nak a cm elejn:
! $ & * = A

Ezek a karakterek mind szerepelhetnek egy e-mail cm HelyiNv rszben.

'

{ }

Ha lehetv szeretnd tenni a felhasznlidnak, hogy az e-mail cmeikben a fenti karakterek is szerepelhessenek, a korbbi helyett inkbb egy ilyen szablyos kifejezsre lesz szksged:

/ A [a-zA-ZO

9 ] [a-zA -Z 0-9\

\ -& ! ? = # ] * /

Az els karakternek ezek kzl kell kikerlnie.

V
A tbbi karakter ezek brmelyike lehet...

/
... s nulla vagy tbb is lehet bellk.

Ez a minta sem illeszkedik minden rvnyes HelyiNv-re, mivel a rej tlyesebb karakterek egy rszt tovbbra is kihagytuk, de a gyakorlat ban jl hasznlhat, s a Risky Jobs legtbb felhasznljnak e-mail cmt lefedi.

596 10. fejezet

Szablyos kifejezsek

Ez az e-males cucc knny. A ta rto m n y nv ellenrzshez egyszeren ugyanazt a m in t t alkalmazzuk, m in t a m it a helyi nvhez hasznltunk.. .pofonegyszer.

Sajnos ez csak a tartomnynv egyik felben - az eltagban mkdik, az uttagban nem.


Mg a tartomnynv-eltag a HelyiNr-hez hasonlan az alfanumerikus ka rakterek s nhny klnleges karakter lnyegben brmilyen kombinci jt tartalmazhatja, a tartomnynv-uttagokra sokkal szigorbb korltozsok vonatkoznak. A legtbb e-mail cm csupn egy maroknyi elterjedt tartomnynv-uttag valamelyikre vgzdik: ilyen pldul a .com, az .edu, az . org vagy a . gov. Azt is ellenriznnk kell teht, hogy az e-mail cmek vgn rvnyes tartomnynv-uttag ll-e.

Nincsenek

hlye krdsek
! Engedlyezhetek minden rvnyesnek tekinthet e-mail K i Nem gurulnak dhbe a felhasznlk, ha egyes e-mail ccm et is? meket nem fogadok el? ! Megteheted, s ha a webhelyeden van rtelme, I Elfordulhat, de a legtbb ember nem eszement clszer gy is tenned. Nha azonban jobb csak e-mail cmmel rendelkezik. A legtbb internetes a szles krben elfogadott formtumokat tmo levelezsi szolgltat olyan szablyokat alkalmaz, gatni, s nem megengedni minden lehetsges vl amelyek megakadlyozzk, hogy a felhasznlk tozatot. Meg kell hatroznod, hogy a felhasznl a kvetkezhz hasonl rlt (br rvnyes) id 99,9%-a milyen e-mail cmmel rendelkezik, s e-mail cmeket vlasszanak: a maradk 0,1%-ot mr csak a kd egyszerstse " _i ' m crazy"@ gregs- list.net. rdekben sem rdemes elfogadnod. Az rv nyessg-ellenrzs valjban az egyensly megta llst jelenti akztt, hogy mi az, ami megenge dett, s mi az, amit gyakorlati szempontbl cl szer elfogadni. Ha a webhelyeden nem szeretnl komolyabb cmellenrzst megvalstani, a kvet kez helyen tallhatsz kitn nylt forrs (vagyis ingyenes) PHP-kdokat: http://code.google.com/p/php-emailaddress-validat. ion/. m ost it t vagy 597

Az rvnyessg-ellenrzs sorn gyakran egyenslyt kell tallni akztt, hogy mi az, ami megengedett, s mi az, amit gya korlati szempontbl clszer elfogadni.

a tartom ny nv-uttagok illesztse

Tartomnynv-uttagok mindentt
Azokon az abszolt hzkznapi tartomnynv-uttagokon kvli - pldul a . com vagy az . org - , amelyekkel gyakran tallkozhatsz, sok-sok egyb tartomnynv-uttag ltezik, amelynek a hasznlata megengedett az e-mail cmekben. A tartomnynv-rendszer (DNS) ltal rvnyesnek tekintett ut tagok kztt vannak olyanok, amelyeket taln mr lttl, mint a .b i z vagy az . in fo , de pldul az egyes orszgoknak is vannak megfelel tartomnynv-uttagjai (Kanad pldul a .ca, Tdzsikisztn pedig a . t j). me egy lista nhny lehetsges tartomnynv-uttagrl (a lista korntsem teljes):

Mg en sem szeret nk zsonglrkdni ezzel a rengeteg tartom nnyal.

aero

museum

no.com

nome

co.nz

Egyes tartom nynv-utotagok csak ktbetsek, msokban 2 vagy 3 bet, aztn egy pont, majd ism t 2 vagy 3 bet ta l lh a t , de v annak 4, s<5t 5 betsek is. Illesztskor m indet kln kell ellenrizni?

Strbereknek -

Megteheted, s mkdne is.


De van egyszerbb megolds. Az sszes lehets ges tartomny rgztse s egy j tartomnynvuttag felvtelekor a kd mdostsa helyett az e-mail cm tartomnv rszt a PHP checkdnsrr ( ) fggvnyvel is ellenrizheted. Ez a fggvny a tartomnynv-rendszerhez (Domain Name System, DNS) kapcsoldva ellenrzi a tartom nyok rvnyessgt.

A tartomnynv-rendszer (Domain Name System, rvi den DNS) egy elosztott adat szolgltats, amely a tartom nyok s a hozzjuk tartoz IPcmek vilgmret cmtrt biz tostja. Ez a rendszer teszi lehe tv a tartomnynevek haszn latt. A DNS nlkl az oreilly.com cm helyett pl dul a 208.201.239.36 cmet kellene megadnunk.

Szablyos kifejezsek

A tartomny ellenrzse a PHP segtsgvel


A tartomnynv-uttagok rvnyessgnek ellenrzst a PHP a checkdnsrr () fggvnnyel teszi lehetv. Ezzel a mdszerrel taln mg jobban is lehet vizs glni az e-mail cmek mintjt, mint szablyos kifejezsekkel, mert nem csak az llapthat meg vele, hogy egy adott karakterlnc elfogadhat-e levelezsi tartomnyknt, hanem a DNS-bejegyzsek tnyleges ellenrzsvel az is kidert het, hogy a tartomny ltezik-e egyltaln. Teht amg egy szablyos kifejezs csak annyit mond, hogy a lasdjlkdfsalkjaf.com rvnyes cm, addig a checkdnsrr () egy lpssel tovbb megy, s azt is elrulja, hogy ez a tarto mny nincs bejegyezve, ezrt az sdfhfdskl@lasd j 1kdfsalkjaf .com e-mail cmet clszer visszautastani, ha ezt rjk be a jelentkezsi rlapra. A checkdnsrr () fggvny utastsformja igen egyszer:

A checkdnsrr() egy tartomnynevet , . . . L i x ' l-e t ad vissza, ha a tartomany i ' i -i - a -x l letezik, es O-at, ha nem.
/

tartalmaz karakterlncot vr. A tartomnynv a cmnek a @ jel utn / . , kvetkez' teljes rsze.

c h e c k d n s r r ( ' h e a d f i r s t l a b s . c o m 1)
Ez csak akkor rvnyes, ha a webkiszolald Windows rendszer. Ha egy W/indowst fu t tat szmtgpen pted fel a webhelyedet,

Ha a PHP-t egy Windows rendszer kiszolgln futtatod, ez a parancs nem fog mkdni.

de UNIX vagy Linux rendszer kiszolgln helyezed el, a problma nem jelentkezik.

Vigyzat!

Helyette ezt a kdot hasznlhatod: Ez az exec parancs egy a kiszolgln fu t kls programot hv meg a tartomny ellenrzshez.
Csak a mka kedvrt prbld ki, hogy kz vetlenl a foreach utn egy echo paranccsal kiratod a $iine tartalmt. Valami ilyesmit fogsz ltni:

function win_checkdnsrr($domain,$recType='f) { if ( empty ($domam) ) { ! if ($recType==) $recType="MX"; exec("nslookup -type=$recType $domain,$output); foreach($output as $line) { if (preg_match (,/A$domain/"/ $line) ) { , return true; ) } return false; } return false;

Server: 68.87.64.14bAddress: 68.87.64.14b#53Non-authoritative answer: oreilly.com mail exchanger = 20 smtpl. oreilly.com


most itt vagy 599

az e-mail cm rvnyessgnek ellenrzse t lpsben

Az e-mail cm rvnyessgnek ellenrzse - sszefoglals


Most mr tudod, hogyan kell ellenrizni az e-mail cmnek mind a HelyiNv r szt szablyos kifejezsekkel, mind a tartomny ne vet a checkdnsrr () fggvny segtsgvel. Nzzk meg lpsrl lpsre, hogy miknt rakhatjuk ssze a kettt, hogy teljes rtk rvnyessg-ellenrzst hajthassunk vgre a Riskyjobs web hely jelentkezsi rlapjn megadott e-mail cmeken:

A preg_match () fggvnnyel megllaptjuk, hogy az e-mail cm HelyiNv rsze rvnyes karaktermintt tartalmaz-e. Vedd szre, hogy ennek Ezt a kvetkez szablyos kifejezssel vgezhetjk el:

f / A [a -z A -Z O -9 ] [a -z A -Z 0 -9 \ . ^ \ - & ! ? = # ] *@ / " j-

__ a szablyos kifejezsnek a vgn nincs dollrjel,

mivel a @ utn tovbbi karakterek llnak majd.

Az e-mail cmnek alfanumerikus karakterrel kell kezddnie, majd ttszleges szm alfanumerikus karaktert, illetve bizonyos klnleges karaktereket tartalmazhat.

Ezttal a kukaejelet (@ ) s fceres. sk, hogy megbizonyosodjunk ro'la, hogy az e-mail cm tartalmaz egyet a tartomnynv e l tt.

Ha a HelyiNv nem bizonyul rvnyesnek, hibazenetet runk ki a felhasznlnak, s jratltjk az rlapot.

Ha a IlelynNv rvnyesnek talltatik, a felhasznl ltal bert karakterlnc tartomny rszt tadjuk a checkdnsrr () fggvnynek.

Ha a checkdnsrr () fggvny O-t ad vissza, akkor a tartomny nincs bejegyezve, ezrt hiba zenetet runk ki a felhasznlnak, s jratltjk az rlapot.

Ha a checkdnsrr () fggvny 1-et ad vissza, akkor bejegyzett tartomnyrl van sz, gy meglehetsen biztosak lehetnk benne, hogy az e-mail cm rvnyes, ezrt tovbblphetnk az rlap tbbi mezjnek ellenrzsre.

600

10. fejezet

Szablyos kifejezsek

Albb lthatod a felhasznlk e-mail cmnek rvnyessgt ellenrz PHP-kdot de egyes rszek hinyoznak belle. Ptold a hinyz rszeket, hogy a kd mk dkpess vljon!

Gyakorlat

if (!preg_match('

, $email)) {

// Az $email tartalma rvnytelen, mert a LocalName nem megfelel echo Your email address is invalid.<br />; $output_form = 'yes';

)
else { // Az e-mail cmbl a tartomny kivtelvel mindent lecspnk $domain = preg_replace(1 '

);

// Most ellenrizzk, hogy a $domain vltozban lev tartomnyt bejegyeztk-e if (.................. ) { echo Your email address is invalid. <br />'; $output_form = ?yes';

most itt vagy 601

Gyakorlat - megolds

Albb lthatod a felhasznlk e-mail cmnek rvnyessgt ellenrz PHPkdot - de egyes rszek hinyoznak belle. Ptold a hinyz rszeket, hogy a kd mkdkpess vljon!

Gyakorlat - megolds
Az e-mail cmnek a kukac jellel vgzd
^

HelyiNv rszre illeszked szaba'lyos kifejezs.


a z / l * $email)) { ,

if (!preg_match (1 C

// Az $email tartalma rvnytelen, mert a LocalName nem megfelel echo 'Your email address is invalid.<br />'; $output_form = yes/

j
else {

A HelyiNv s a kukac levgshoz csere-karakterlncknt egy res ka rakterlncot kell megadnod.

// Az e-mail cmbl a tartomny kivtelvel mindent lecspnk $domain = preg_replace( ' // Most ellenrizzk, hogy a $domain vltozban lev tartomnyt // bejegyeztk-e '/ * / /email ); /

if

< /h e k d rW /d o m a m )

) (

echo Your emailNaddress is invalid. <br />; $outPut_form = '

A csert az $email rtkn kell vgrehajtani.

Ha Windows rendszer kiszolJl,# t l aszn,sz' ne fe|ejtsd el , 6eme n' 3 w' n_ c*iec^ ns,'f() kdjt, s innen meghvni azt.

A !checkdnsrr() igazat ad vissza, ha a tartomny nincs bejegyezve.

jratltve
A preg_match () mintkat keres karak terlncokban. A preg_replace () lecserli az illesz ked karakterlncokat. A mennyisgjelzk segtsgvel azt szab lyozhatod, hogy egy karakter vagy ka rakterhalmaz egyms utn hnyszor for dulhat el.
A mintban megengedett karakterek halmazt egy karakterosztly segtsgvel hatrozhatod meg. A mintban a \d a szmjegyeket, a \w az alfanumerikus karaktereket, az \ s pedig az reshelyeket jelzi, A checkdnsrr () fggvny a tarto mnynevek rvnyessgt ellenrzi.

602 10. fejezet

Szablyos kifejezsek

Egsztsd ki a Risky Jobs alkalmazs Registration parancsfjljt az e-mail cmek rv nyessgnek ellenrzsvel!
Az elz oldalon tallhat kd felhasznlsval egsztsd ki a registration.php parancsfjlt az e-mail cmek rvnyessgnek ellenrzsvel, majd tltsd fel a parancsfjlt a webkiszolglra, s nyisd meg egy webbngszben. Prblj benyjtani egy rvnytelen e-mail cmet, s figyeld meg, hogy az j szablyos kifejezst hasznl kd hogyan utastja vissza az rlapot, s jelent meg hibazenetei, amely elmagyarzza, hogy mi trtnt.
a

ni in

Risky Jobs - Registration


Y o u r email address ks i n v a l i d . ^

^
A hibazenet rmutat, hogy a fel hasznl e-mail cme rvnytelen

Register with Risky Jobs, and post your resume

Ennyi. sszegyjtttem az e lj rt szm jelentkezt a koc kzatos llsokra. Nincs ms dolgom, m in t sszeadni, hogy mennyi pnzt kerestem.

Name:

Dwmtev
rickyc gregs

(kukac jel helyett szkoz van benne)

Phone: Desired Job:

s55-io-

sh irk et

Subm it

A Risky Jobs webhely jelentkezsi rlapja r vnyessg-ellenrzssel egszlt ki, ezrt tb b nem jelent gondot felvenni a kapcsolatot az gretes jelltekkel, s rekordid alatt be tlteni a kockzatos llsokat.

most itt vagy 603

PHP a M y SQL szerszmoslda

A szablyos kifejezseket metakarakterekbl ptjk fel, amelyek olyan elem eket jellhet nek, mint a hrom szmjegy" (\d\d\d) vagy az reshely (\w)

preg__match()
Ez a PHP-fggvny azt vizsglja, hogy egy karakterlnc illeszkedik-e egy szablyos kifejezsre. Ha igen, a fggvny igazat ad vissza, ha nem, akkor pedig hamisat.

checkdnsrr( )
Ezzel a PHP-fggvnnyel azt vizs glhatod meg, hogy egy adott tar tomnynv valban ltezik-e. En nek az e-mail cmek rvnyessg nek ellenrzsekor veheted hasz nt, mivel ilyenkor meg kell bizo nyosodnod arrl, hogy a cm tart ninv rsze valdi.

10. fejezet

1 1 Az adatok megjelentse... s mg annl is tbb!

Dinam ikus kpek rajzolsa


Maradjanak n y u g to n , ne m o zo g ja n a k . > M o s t pedig nzzenek egyenesen r m , s m o s o ly o g ja n a k . Nem , nem m a gu k, hanem a z a d a ta ik ! R endben, m o s t te g y k k e re s z tb e a z o s z lo p a ik a t, s d n ts k a z e ls d le g e s V k u lc s u k a t k ic s it b a lra . T k le te s! A r

Mindnyjan tudjuk, hogy micsoda hatalma van egy j lekrdezsnek s egy halom szaftos eredmnynek.
A lekrdezsek eredmnye ugyanakkor nem mindig beszl nmagrt. Nha segt, ha az adatokat ms, lthatbb fnyben nzed. A PHP lehetv leszi, hogy egy adatbzis adatait kpi brzolssal jelentsd meg: tortadiagramon, oszlopdiagra mon, Venn-diagramon, Rorschach-brn, vagy ahogy akarod. Brmi megteszi, ami segt a felhasznlknak, hogy jobban megrtsk az alkalmazson tfoly adatok jelentst. A PHP-alkalmazsoknak azonban nem minden lnyeges grafikja ered a te adatbzisodbl. Tudtad pldul, hogy dinamikusan ltrehozott kpekkel
megakadlyozhatod az rlapkitlt reklmrobotok mkdst?

ez egy j fejezet

605

tmadnak a reklmrobotok!

Guitar l/l/ars jratltve: A gpek lzadsa


A jv elrkezett. A virtulis vilgot mr elznlitek a robotok, s semmi sem llthatja meg ket, legfeljebb nhny ber PHP-program. A kretlen rek lmokat terjeszt reklmrobotokrl (spam bot*) van sz, amelyek olyan adatbeviteli rlapokra vadsznak a Weben, amelyek lehetv teszik a szmukra, hogy reklmokat fecskendezzenek beljk. Ezek a robotok vrfagyasztan hatkonyak, s mit sem trdnek a megtmadott rlapok eredeti cljval. Az egyetlen cljuk, hogy sajt tartalommal rjk fell az rlapokat, hogy csilla ptsk uraik gonosz szemetelsi vgyt. Sajnos a Guitar Wars rekordmegjelen t alkalmazs is ldozatul esett a robotok tevkenysgnek.
R e k l m o t fe lt lte n i, re k l m o t fe lt lte n i, re k l m o t fe lt lte n i, re k l m o t fe lt lt e n i... o O n

Minden Webes rlap ki van tve a reklm robotok tmadsnak.

cuitar wrs - Add Yotr H.gh s

Guitar Wars - Add Your High Score


Thanks for adding you and added to the high s Name: www.classhate Score: 999999999

Csatlakozz, s ld jra s z r ny lmnyeidet azokkal, aki ke t a gimiben u t lt ll

R e c o n n e c t and rettuy
hvijf xperrences r with people you

tetted m high K haall

pn

:-MGuitar Wars ~ Add Your High Score

Guitar Wars - Add Your High Score


Thanks for adding y < and added to the hig Name: www .frown Score: 999999999

G a ra n t lta n km prog ram m entes!* *Nem igazn.

Cuitar Wars - A,iri y.., u.L r

szemlyes gy

~ a robotok csak a fe l hasznlk szemgolyit akarjk, hogy reklmokkal bombzzk azokat.

Gyengn kp ze tt tud so k fris s Guitar Wars - tanulm nyai bizonytjk, hogy az oldalakon t hmplyg, igen Thanks for adding your r apr bets szveg ellaztja and added to the high see az a g y a t, s megakadlyozza a tu d s beszivrgst, ami j t M e rt nha jobb nem gondolkodni. kony tu d a tla n s g h o z vezet.

A reklmrobotok erssge az sz nlkli ismtls - ami eb ben az esetben abbl ll, hogy jra s jra kitltik s be nyjtjk a Guitar Wars rlapot, csak ppen rekordpontszmok helyett reklmokat feltltve.

J i m I b e t ,, ot to th.nh.

**

j.nrxx

606

11. fejezet

Az adatok megjelentse... s mg annl is tbb!

Egyetlen beviteli rlap sincs biztonsgban


Szerencsre a Guitar Wars oldalon a reklmrobotok tmadsai szrevtle nek maradnak a vgfelhasznlk szmra - ksznheten a 6. fejezetben az alkalmazshoz adott emberi moderlsnak. A felgyeletet ellt sze mlynek azonban most hatalmas mennyisg reklmmal kell megkzde ni, s alig br tgzolni rajaik, hogy kivlogassa az rvnyes rekordokat. Az emberi moderls nagyszer, de az em ber nem tud szembeszllni egy olyan automatizlt ellensggel, aki soha ne frad el.

Guitar Wars - High Scores Administration


B e lo w is a st o f ail G u tia r W a r s h ig h s c o r e s . U s e th is p ag e n eed ed .
id

rem o v e

Ez n e v e ts g e s . Lehetetlen m e g s z rn i a z s s z e s b e n y jto tt a d a to t, a m in e k a nagy r sze r a d s u l s z e m t. A z t se m tu d o m , . m i a z a fro w n e y ! J

Rettenthetetlen Guitar Mars-modertorunk veszts re ll a robotokkal szemben akik fradhatatlanul kldz getik a hamis rekordokat.

Date $ core Action 7008-06*23 11:44-36 999999999 Rcispvc /AJHLQX

W W W ^das^attxwn r'rW'ClaSSba

08-06-23 11:45:15 99999999 Rsffls' AEPE-K 2008-06 -B 11-45:29 999999999 B3USS ' ABUJaM 2 0 M -0 6 23 . 5 ,

w w w lro w n tjccn ^ H n e y M .4l" 2 w w v rIro w neycen w w ^iieadlasrtabsxom

X 2 S ii s

os-06-23 11:46:19 999999999 RemOYC/ ACBTQYC 1 2008 06-23 11:47:26 999999999 RCHSM / ^ ^ ^ .47.42 999999999 H f S ie v e 1 2008*06*23 U :47:55 999999999 ,4g.l2 999999^

www.beadlastlahsxom

2008-06-23

______ - - - - - j -

Vilgos, hogy a benyjtott rekordadatok emberi szrse nem elg. Mdot kell tallnod arra, hogy megakadlyozd, hogy robotok is tlthessenek fel ..rekordokat" - vagyis mr a bejratnl le kell nyakaznod ket, ha mond hatjuk gy. Ehhez azonban meg kell klnbztetned valahogy az automa tizlt szoftvert s a valdi aggyal rendelkez embert. Nem kis kihvs, de megoldhat.
/

rj le hrom krdst, am it feltennl, hogy megllaptsd, hogy igazi emberrel vagy mestersges robotaggyal van dolgod:

m ost i t t vagy 607

g u ita r w ars: csak embereknek

Vlaszd el az embert a gptl!


Alihoz, hogy kitalld, hogyan szlelheted, hogy a Guitar Wars Add Score oldalnak tloldaln egy valdi em ber ll-e, elszr meg kell hatroznod, hogy pontosan mit is csinl egy reklmrobot, amikor hamis adatokkal tlti ki az rlapot.

Egy reklmrobot-parancsfjlnak gyerek jtk tzszer, szzszor vagy akr ezerszer megszrni adatokkal egy rlapot...
r\,0
G uita r W ars ? M d Y o a r H ig h Sc o r g

C u ita r W ars - A d d Y o u /

Guitar Wars - Add Your High Score


WWW Mh.cor

Guitar Wars - Add Your High Score


Name: www.das5 baTes.eom Score: l

% headlaitlabt

9W ?99____

Screen shut;

A Guitar Wars adat bzist elrasztjk a hamis rekordok, mert a reklmrobotok visszalnek az Add Score rlappal.

f t O Q

C ustar W ari_> A d d Yo u r H iflh S c o r g _

Guitar W ars - Add Your High Score


N am e: ,v<\w fro w n cycem tai.co m

S c o re : 9999S&<599 S c rc c n s h o r C ^ m e J ^ e >

'o w r*y re o tra l. 0ng

Az Add Score rlap nem kpes megkln bztetni a valdi emberek ltal feltlttt adatokat az automatizlt robotoktl.

Az Add Score rlapon egy j mezre van szksg, amely emberi megerstst ignyel, mieltt megengednd a rekord feltltst.
608 7 7. fejezet

Az Add Score rlappal az a gond, hogy semmit nem tesz az automatizlt adat bevitel megakadlyozsa rdekben, ami azt jelenti, hogy egy kellen kp zett robot programoz kpes olyan robotot alkotni, amely jra s jra reklm adatokkal tlti ki az rlapot. A hamis adatok ugyan a moderlsnak kszn heten soha nem jutnak el a Guitar Wars alkalmazs foldalra, de a mode rls vgeredm nyben hasztalann vlik, mert az emberi felgyelnek hamis adatok szzait kell kzi mdszerrel eltvoltania. Az rlapon egy j megerst mezre van szksg, amelyet sikeresen ki kell tlteni ahhoz, hogy az rlap megengedje a rekordadatok benyjtst. A meg erst m eznek pedig olyannak kell lennie, amit egy ember knnyedn ki tud tlteni, de egy gp nem.

Az adatok megjelentse... s mg annl is tbb!

Gyakorlat

Az albbiakban tleteket lthatsz olyan rlapmezkre, amelyeket annak megakad lyozsra hasznlhatnnk, hogy a reklmrobotok benyjthassk az rlapot. Karikzd be azokat az rlapmezket, amelyek szerinted egyszeren s sikeresen kpesek lenn nek arra, hogy csak az emberi rlapbenyjtst engedlyezzk, s rd melljk azt is, hogy mirt.
n robot? Q Igen Q Nem

M i v o lt Elvis kedvenc tele?

...............

........

'

R etinavizsglat:

| N z z e n a w e b k a m e r b a , s kattintson

rja be az itt lthat betket:

M e n n y i 7 + 5?

M ily e n llat ez?

rja be az itt lthat betket:

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

N y o m j a az ujjt az rzkelre

m ost it t vagy > 609

Gyakorlat - megolds

Gyakorlat - megolds
Tl knnytallgatni a s i kr eslye 50%, mrpedig feleannyi hamis adat i ton s nkra rghat.

Az albbiakban tleteket lthatsz olyan rlapmezkre, amelyeket annak meg akadlyozsra hasznlhatnnk, hogy a reklmrobotok benyjthassk az rla pot. Karikzd be azokat az rlapmezket, amelyek szerinted egyszeren s sike resen kpesek lennnek arra, hogy csak az emberi rlapbenyjtst engedlyez zk. s rd melljk azt is, hogy mirt.

On robot?

*9en O

Nem

A robotoknak ktsgkvl nehz krds, de egyes embereknek i az l het. Nem mindenki t d a s e uj, hogy Elvis a mogyorvajas-bannos szendvicset szerette, s kellene hozz egy kvzkrdseket s -vlaszokat tartalmaz adatbzis i. s

M i v o lt Elvis kedvenc tele?

Nem rossz, de csak ha feltesszk, hogy a jelsbet kpknt s nem k szvegknt jelennek meg, mert ha R e tin a vizsg la t: egy robot elg okos ahhoz, hogy op t k i karakterfelismerst (OCR) al ia kalmazzon, knnyen kijtszhatja.
rja be az it t l th a t b e t ke t:

Nzzen a w eb ka m e r ba , s k a ttin ts o n

Ez hatkonyan meglltja a robotokat, de techni kailag kltsges, s ne hezen megvalsthat.

M e n n yi 7 + 5?

Egyszers hatkony. A legtbb robot nem elg okos ahhoz, hogy megoldjon egy ilyen matemati k feladvnyt - remljk, az emberek igen! ai

Emlkszel mg Agyarra, a kutyra, a i a knyv kt korbbi rszben elra boltak az idegenek?

Megtveszt hatkony - a robotoknak gondot okoz a kpek en tartalmnak rtelmezse. Viszont k l hozz egy adatbzis, el amely a kpeket s a megfelelvlaszokat tartalmazza. gyes tovbbfejlesztse a korbbi jelszellenorzo mez - i t a b t k t nek t e e vonalak s pontok takarjk. Hogy megzavarjk az OCR-t alkalmaz robotokat.
--------------------------------------------------------------------------------------------------------------

rja be az it t l th a t b e t ke t:

Nem olyan bonyolult, mint a retinavizsglat, de ez i klnleges hard s vert s szoftvert ignyel. ^
U jjle n y o m a t-v iz s g la t:

N yo m ja az u jj t az rzkelre

610 11. fejezet

Az adatok megjelentse... s mg annl is tbb!

Az automatizlst automatizlssal gyzheted le


Az olyan teszteket, amelyek azt vizsgljk, hogy egy rlap msik oldaln valdi em ber ll-e, CAPTCHA-nak hvjk, ami a Completely Automated Public Turing Test to Teli Computers and Humans Apart (teljesen automatizlt nyilvnos Turing-teszt sz mtgpek s em berek m egklnbztetsre) rvidtse. Ez elg krlmnyes meg hatrozsa egy olyan rlaptesztnek, amelyen idelis esetben csak egy em ber juthat t. Szmos rdekes CAPTCHA-t terveztek, de az egyik legszlesebb krben elterjedt az, amelyik egy vletlenszer jelszt llt el. amelyet a felhasznlnak be kell rnia. Annak rdekben, hogy az gyesebb, optikai karakterfelismerst (OCR) alkalmaz robotok ne jtszhassk ki a rendszert, a jelsz beti torztva vagy vletlenszer vo nalakkal s pontokkal rszben eltakarva jelennek meg.

Mivel a jelsz beti vletlenszeren jnnek ltre, a jelsz az rlap minden megjelentsekor klnbz lesz- ' ' ^

A CAPTCHA olyan program, amely vala milyen teszt segtse gvel vd egy seb helyet az automati zlt robotoktl.

rja be az itt lthat betket:


A CAPTCHA-jelszt a felhasznl egy szokvnyos szvegmezben adhatja meg. A szveget a vletlenszer vonalak s pontok p pen csak annyira takarjk el, hogy megakadlyoz zk az optikai karakterfelismerst, de az ember szmra a betk felismerhetk maradjanak.

A CAPTCHA-rlapmezk ugyanolyanok, mint brmely ms rlapmez, eltekintve attl, hogy az egyetlen cljuk az, hogy megakadlyozzk az rlap benyjtst, ha a CAPTCHA-teszt meghisult. Teht ms rlapmezktl eltren, amelyek az rlap benyjtsakor ltalban adatokat adnak t a kiszolglnak, a CAPTCHA-mezk csak megerstsre s a benyjtsi mvelet ellenrzsre szolglnak.

Mivel a rekla'mrobot nem tudja meg fejteni a jelszt, csak tallgathat.

rja be az itt lthat betket: [ g w e rty?


Egy ember knnyen meg tudja fejteni a jelszt.

rja be az itt lthat betket:


Nagyon fontos, hogy a CAPTCHA-jelsz ne csak szvegknt, hanem kpknt je lenjen meg az rlapon, m sklnben a robotok sokkal knnyebben m eg tudjk fejteni.

m o s t i t t vagy

611

nem hlye krdsek: captcha-kiads

Nincsenek

hlye krdsek
K

! A kutys CAPTCHA-kp nagyon klassz. Nem lehetne inkbb azt hasznlni jelsz helyett?

! Dehogynem. Csak ne feledd, hogy szksged lesz egy k peket s a lersukat trol adatbzisra, mert minden CAPTCHA-teszt sikernek zloga a vltozatossg. Egy j tesztnek kellen vltozatos tartalmat kell megjelentenie, hogy az rlapon lehetleg ne szerepeljen ktszer ugyanaz a teszt. Hz az elnye a CAPTCHA-jelsznak: mivel a jelsz vletlenszer betkbl ll el, igen valszntlen, hogy brmely felhasznl ktszer ugyan azt a tesztet ltja, mg ha sokszor prblkozik is.

a szempontbl kitnek, hogy a legfrissebb CAPTCHA-technolgit nyjtjk, de ltalban nem gyazhatok be olyan zkkenmentesen, mint egy egyni CAPTCHA, amelyet kifejezetten az adott webalkalmazs ignyeihez szabtak.

K V

! Mi a helyzet a cskkentltkkal? Mi trtnik, ha k nem tudjk teljesteni a vizulis CAPTCHA-tesztet?

! A kpi CAPTCHA-tesztek nem a legmegfelelbbek a cskkent ltsi kpessgekkel rendelkezknek. Egy idelis CAPTCHA-megoldsban hangos alternatvt is fel kell knlni a kpi helyett. Lehetsges pldul egy olyan hangos CAPTCHAteszt. amely szmok sorozatt olvassa fel, amelyeket a felhasznlnak be kell rnia a teszt sikeres teljestshez. A problma ugyanaz, mint korbban: az gyesebb robotok hangfelismers tjn legyzhetik az ilyen CAPTCHA-teszteket, ezen nhny teszt jcskn torztja a hangot, ami gy elg ijeszt lesz. A hangos CAPTCHA-tesztek technikailag hasonlak a kpi CAPTCHAtesztekhez: hangklipek s hozzjuk tartoz vlaszok adatbzist ignylik. Lteznek szolgltatk, akik olyan rugalmas CAPTCHAteszteket knlnak, amelyek kpeket s hangokat is hasznlnak; ilyen pldul a www.captcha.net. Ezek a szolgltatsok abbl

! A CAPTCHA-tesztek hasznlata sorn kompromisszumot kell ktnnk a reklmrobotok tmadsainak visszaszort sa s egyes felhasznlk elidegentsnek kockzata kztt. A vrusokhoz s a vrusirt programokhoz hasonlan a reklmrobotok s a CAPTCHA-tesztek valsznleg tovbbra is macska-egr jtkot fognak jtszani: jabb robotok szletnek majd. amelyeket egy adott CAPTCHA kijtszsra ksztettek, amire vlaszul kifinomultabb CAPTCHA-tesztek jelennek meg. Azok a felhasznlk, akik a CAPTCHA-tesztek korltozott kpessgei miatt esetleg kimaradnak a szrsbl, sajnos kereszttzbe kerlhetnek. Mindig az adott webfejleszt feladata, hogy mrlegelje, megri-e elveszteni azokat a felhasznlkat, akik a webhely CAPTCHA-tesztekkel vdett rszeihez nem tudnak hozfrni, annak rdekben, hogy a webhely vdett legyen a robotok tmadsaival szemben. Ha ez esetleg vigaszt jelent, ne feledd, hogy a legkifinomultabb robotok ltalban a nagy webhelyeket veszik clba, ahol hatalmas mennyisg reklmot helyezhetnek el. ami azt jelenti, hogy valsznleg nem fogsz igazn gonosz robottal tallkozni, amg a webhelyed akkorra nem n. hogy elg nagy clpontot jelentsen az ignyes robotok szmra.

I C ! Vannak olyan emberek is, akiknek a ltsa s a hallsa is rossz. Velk mi lesz?

Ok, szval a C A P T C H A -je ls z t kpknt kell m e g je le n te n i, v le tle n s z e r vonalakkal e pontokkal. E z rendben is lenne, de h og y a trba le h e t ily e s m it l tre h o z n i a PH P-vel? A PH P csak H T M L -t d o t t u d e l llta n i, nem ?

A PHP-nek grafikai kpessgei is vannak, amelyeket kihasznlva dinami kusan ellltott kpeket hozhatsz ltre, amelyeket aztn HTML-kd segt sgvel megjelenthetsz.
A GD (Graphics Draw, kprajzol) grafikai knyvtr segtsgvel a PHP-parancsfjlok kpesek dinamikusan kpeket ellltani, olyan npszer formtu mokban, mint a GIF, a JPEG vagy a PNG, s vagy tadni azokat a w ebbngsznek megjelentsre, vagy fjlba rni ket a kiszolgln. A PHP-nek ez a k pessge rendkvl fontos, mn tisztn HTML-en keresztl nem lehet rajzolni" egy weboldalra. A PHP viszont lehetv teszi, hogy egy kpen vgrehajtott grafikai mveletekkel egy oldal adott rszre rajzolj, majd megjelentsd a raj zolt kpet a jl ismert < i m g > cmke segtsgvel.

Az adatok megjelentse... s mg annl is tbb!

A CAPTCHA-jelsz ellltsa
Mieltt egyltaln a CAPTCHA-jelsz grafikai oldalra gondolhatnl, ki kell tallnod, hogy miknt llthatod el magt a vletlenszer jelszt, ami erede tileg szvegkarakterek sorozata. A jelsz brmennyi karakterbl llhat, de hat-nyolc karakter ltalban elegend. A jelszt hossza bellthat egy llan dval, ami lehetv teszi, hogy szksg esetn ksbb knnyen mdosthasd a jelsz karaktereinek szmt.

Egy hat karakteres CAPTCHA-jelsz val sznleg elegend arra, hogy meglltsd
d e f i n e ( 1c a p t c h a _ n u m c h a r s , 6 ); ^

a robotokat, anlkl, hogy a felhasznlkat felbosszantand.

De pontosan hogyan lehet ellltani egy hat karakter hosszsg vletlenszer szveg-ka rakterlncot? Itt lp be a kpbe a PHP kt beptett fggv nye: a rand () s a c h r ( ) . A ran d () fggvny egy vletlenszer szmot ad vissza a kt paramtere ltal meghatrozott tartomnybl, mg a c h r () a szmszer ASCII-karakterkdot alaktja t a tnyleges karakterr. Az ASCII (American Standard Code fr Information Interchange, az informcicsere kdolsnak amerikai szabvnya) egy szabvnyos karakterkdols, amely a karaktereket szmokknt brzolja. Neknk csak a 9 7 -1 2 7 tartomnyban lev ASCII-karakterkdokra van szksgnk, amelyek a kisbetknek felelnek meg a-tl z-ig. Ha ebbl a tartomnybl hatszor egyms utn ellltunk egyegy kdot, egy vletlenszer, hat karakterbl ll, kisbets jelszt kapunk.

// A vletlenszer jelsz ellltsa


$p ass_p h rase = f r ( $ i = 0 ; $ i < CAPTCHA_NUMCHARS; $ i+ + ) $ p a s s _ p h r a s e .= c h r ( r a n d ( 9 7 , 1 2 2 ) ) ; (

A ciklus annyiszor ismtldik, ahny karakterre szksg van a jelszban.

Ez a kd majd egy nll, jrahasznosthat parancs fjlba (captcha.php) kerl.

A jelsz vletlenszer karakte reit egyenknt lltjuk el'.

chr ( )
Ez a beptett fggvny egy szmot alakt t a neki megfelel ASCU-karakterr. Az 'a' (kisbet) ASCIIkdja pldul a 97, teht az a'-t a c h r (97) hvssal kaphatod meg.

rand( )
Ez a beptett fggvny egy vletlenszer egsz sza mot ad vissza, vagy a megadott tartomnybl, vagy 0 s a beptett RAND_MAX lland rtke kozott (ez utbbi a kiszolgltl fgg). Ha egy bizonyos tarto mnybl szeretnl vletlenszer szmot kapni, csak paramterekknt t kell adnod a tartomny als es fels hatrt a r a n d () fggvnynek.

A rand() fggvny egy vletlen szer egsz szmot ad vissza egy adott tartomnybl.
m ost i t t vagy 613

captcha-kp rajzolsa

A CAPTCHA-kp megrajzolsa
Most, hogy a vletlenszer jelsz ellltst megoldottad, tovbblphetsz a jelsz sz vegt vletlenszer vonalakkal s pontokkal egytt tartalmaz kp ltrehozsra, amely majd segt elrejteni a jelszt a robotok ell. De hol is kellene kezdeni? Nos, az els do log, amit el kell dntened, hogy milyen mret legyen a CAPTCHA-kp. Mivel a kp egy rlapon, egy7 beviteli mez mellett fog megjelenni, clszer a mrett elg kicsire venni. Legyen mondjuk 1 0 0 x 2 5 kppont. rjuk ezeket az rtkeket kt vltozba, hogy a kp mrett csak egy helyen kelljen belltani, s gy ksbb - ha szksges knnyen mdosthat legyen.
d e f i n ( 1CAPTCHA_WIDTH1 , 1 0 0 ) ; d e f i n ( ' CAPTCHA HEIGHT', 2 5 ) ;

A PHP-ben a di namikus kpek rajzolshoz a GD knyvtr fggv nyeinek hasznla tra van szksg.

A CAPTCHA-kp mrett llandkban troljuk, hogy ks1>b szksg esetn knnyen meg lehessen vltoztatni.

A CAPTCHA-kp megrajzolshoz a GD knyvtr nhny fggvnyt kell meghvnod, am elyek mindegyike egy a memriban lev kpen hajt vgre mveleteket. Ms sza vakkal, a kpet a memriban hozod ltre, majd rrajzolsz, s vgl amikor mindennel vgeztl, elkldd a bngsznek, hogy az megjelentse.
// A kp l t r e h o z s a $im g = i m a g e c r e a t t r u e c o l o r (CAPTCHA_WIDTH, CAPTCHA_HEIGHT)/ // Fehr h t t r - , f e k e t e sz v eg - s sz rk e r a j z o l s z n b e l l t s a $ b g _ c o lo r = im a g e c o lo r a llo c a te ($ im g , 2 5 5 , 2 5 5 , 2 5 5 ) ; // fe h r $ te x t_ c o lo r = im a g e c o lo ra llo c a te ($ im g , 0, 0, 0 ) ; // f e k e t e $ g ra p h ic _ c o lo r = im a g e c o lo ra llo c a te ($ im g , 64, 64, 6 4 ) ; // sz rk e // A h t t r k i t l t s e im a g e fille d re c ta n g le ($ im g ,

0,

0,

CAPTCHA_WI DTH, CAPTCHA_HEIGHT, $ b g _ _ c o lo r) ;

I I Nhny v l e t l e n s z e r vonal r a j z o l s a
f r ( $ i = 0 ; $ i < 5 ; $ i+ + ) { i m a g e l i n e ($ im g , 0 , r a n d ( ) % CAPTCHA_HEIGHT, CAPTCHA_WIDTH, r a n a {) % CAPTCHA_HEIGHT, $ g r a p h i c _ c o l o r ) ;

}
// Nhny v l e t l e n s z e r pont e l p t y g t e t s e f r ( $ i = 0 ; $ i < 5 0 ; $ i+ + ) { i m a g e s e t p i x e l ($ im g , r a n d { ) % CAPTCHA_W1DTH/ r a n d ( ) % CAPTCHA_HEIGHT, $ g r a p h i c _ c o l o r ) ;

// A je ls z s z v e g m e g r a jz o l s a i m a g e t t f t e x t ( $ i m g , 1 8 , 0 , 5 , CAPTCHA_HEIGHT C o u r i e r New B o l d . t t f , $ p a s s _ p h r a s e ) ; / / A kp k im en etre k ld se PNG-knt egy f e j l c h e a d e r ( C o n t e n t - t y p e : im a g e / p n g " ) ; im a g ep n g ( $im g) ;

5,

$ te x t_ c o lo r,

se g ts g v e l

614 11. fejezet

Az adatok megjelentse... s mg annl is tbb!

Az jonnan ltrehozott k pek res fekete httrrel in dlnak. Mondd gyorsan h romszor: Te fekete kefe "

A CAPTCHA-kp megrajzolshoz fehr httrre van szksgnk.

i ^

Elszr nhny vletlenszer vonalat rajzolunk.

Az anyagmintzatot" nhny vlet

lenszer ponttal egsztjk ki. Miutn a bngsz megkapta a kpet, a szokvnyos < im g > HTML-cmke segtsgvel jele ntheti meg azt. ^

A szveget sttebb sznnel a vonalak s pontok fl rajzoljuk.


\\00\

\O ! ** o tO

Vgl PNG-knt tadjuk a kpet a bngsznek.

gyflbngsz

m ost it t vagy 6*15

a GD knyvtr grafikai fggvnyi

A 6D knyvtr grafikai fggvnyeinek bels mkdse


A CAPTCHA-kpek ltrehozsa mgtti varzslatrt a GD grafikai knyvtr a felels, amelyrl mr megtudtad, hogy olyan fggvnyeket biztost, amelyekkel dinamikusan rajzolhatsz egy kpre egy PHP-kdbl. Vizsgljunk meg rszletesebben nhnyat ezek kzl a fggvnyek kzl, hogy lssuk, mi a szerepk a CAPTCHA-kp ltrehozsban!

imagecreatetruecolor ( )
Ez a fggvny egy res kpet hoz ltre a memriban, amely kszen ll arra, hogy ms GD-fggvnyekkel rraj zoljunk. Az imagecreatetruecolor () kt paramtere a kp szlessge s magassga. A kp kezdetben teljesen fekete, ezrt ltalban kitltjk valamilyen httrsznnel, pldul fehrrel, mieltt brmit rrajzolnnk. Ezt az imagef illedrectangle {) fggvny meghvsval te heted meg. Az imagecreatetruecolor {) visszatrsi rtke egy kpazonost, amelyet els paramterknt a leg tbb GD-fggvnynek t kell adnunk, hogy tudjk, me lyik kpre akarunk rajzolni.

Az jonnan ltrehozott kpek httere kezdetben fekete.


szlessg

magassag

Az j kp szless ge kppontban.

magassga.

A fggvny egy kpazonostt I^ ad Vissza amelyre a rajzolahhoz, hogy tnylegesen a kpre tudjanak rajzolni

$img = imagecreatetruecolor (CAPTCHA_WIDTH, CAPTCHA_HEIGHT) ;

fggvnyeknek van s z k s g k ^y 1

Ez a kd az llandink rtknek megfeleln egy 100x25 mret kpet hoz ltre.

imagecolorallocate( )
Vrs: (255, 0, 0). Kzpzld: (0, 128, 0 ).
Ez a fggvny egy sznt hatroz meg a rajzolfgg vnyek szmra. Els paramtere a kperforrs azonostja, amelyet az RGB (Red, Green, Blue - v rs, zld, kk) sznrtk hrom sszetevjt szm szeren ler paramterek kvetnek. A hrom rtk mindegyiknek a 0 255 tartomnyba kell esnie. A fggvny visszatrsi rtke egy sznazonost, am e lyet a rajzolfggvnyekben a szn meghatrozsra hasznlhatunk, ltalban utols paramterknt.

Kk: (0, 0, 255).

$text_color = imagecolorallocate($img, 0, 0, 0);

A visszaadott rtk egy sznazonost, ame yet a rajzolfggvnyekben a sznnek - pldul a CAPTCHA-szveg sznnek a meghatrozsra hasznlhatunk.
616
11. fejezet

Annak a kpnek az azonostja, ^ amelyen a sznt hasznlni fogjuk.

A szn vrs, zld s kk sszetevi, amelyek ebben az esetben fekete sznt adnak.

Az adatok megjelentse ... s mg annl is tbb!

imagesetpixel( )
Ez a fggvny egyetlen kppontot rajzol a kp egy megadott koordintjn. A koordintarendszer ori gja (0,0) a kp bal fels sarka, ahonnan a koordi ntk jobbra s lefel nvekszenek. A GD-fggvnyek tbbsghez hasonlan ez a figgvny is azzal a sznnel rajzolja meg a kppontot, amelyet utols paramterknt tadunk neki. imagesetpixel ($1119, rand()

A legtbb GD-fggvny koordi ntarendszernek kiindulpontja a kp bal fels' sarka, ahonnan a koordintk jobbra s lefel nvekszenek. szlessg, magassg

% CAPTCHA_WIDTH, rand () % CAPTCHA_HEIGHT, $graphic_color) - v ------------ ------------------------'

Annak a kpnek az azonostja, amelyre a kppontot rajzoljuk.

A kppont x,y koordinti a kp bal fels" sarkhoz viszo nytva, ami ebben az esetben egy vletlenszer helyet eredmnyez a CAPTCHA-kpen bell.

A kppont sznazonostja.

image1in( )
Ennek a fggvnynek a meghvsval egy vonalat rajzol hatunk kt koordinta ( x l,y l s x2,y2) kztt. A koordi ntkat a kp bal fels sarkhoz viszonytva adjuk meg, a vonal sznt pedig a fggvny utols paramtere hat rozza meg.

A vonal kezdetnek x,y koordinti, amelyek ebben az esetben a CAPTCHA-kp bal szln helyezkednek el.
imageline($img, 0, r a n d () % CAPTCHA_HEIGHT, CAPTCHA_WIDTH, rand() % CAPTCHA_HEIGHT, $graphic_color);
------------------------------------ - v - ----------------------- ----------- --------------------------

A vonal vgnek x,y koordinti, amelyek ebben az eset ben a CAPTCHA-kp jobb szln helyezkednek el.

imagerectangle( )
Egy tglalapot rajzol a megadott sznnel, amely az ( x l,y l) pont ban kezddik, s az (x2,y2) pontban vgzdik. A fggvny els paramtere a kp azonostja, mg a kt pontot s a sznt a fggvny m sodik-hatodik paramterei hatrozzk meg. xi>yi

x2>y2

imagefilledrectangle( )
Az imagerectangle() fgg- 1^ 1 vny pontosan ugyanazokat a paramtereket vrja, mint az imagefil!edrectangle().
Az imagerectangle () -hez hasonlan ez a fggvny is egy tglalapot rajzol, de a meg adott sznnel kitlti a belsejt. X2>V ; CAPTCHA HEIGHT, $bg color);

imagefilledrect a n g l e ($img, 0, 0, CAPTCHA WIDTH,

A kezd'- s a vgpont x,y koordinti. A tg lalap itt kitlti a teljes CAPTCHA-kpet.

m ost itt vagy 617

a GD knyvtr grafikai fggvnyei: msodik rsz

A 6D knyvtr grafikai fggvnyei - folytats


Ezzel a fggvnnyel krk s ellipszisek rajzolha tok; ehhez az alakzat kzppontjt, valamint egy szlessget s egy magassgot kell a fggvnynek tadni. A tkletes kr is csak egy ellipszis, csak ppen azonos a szlessge s a magassga. A fgg vny utols paramtere az ellipszis vagy kr szne.

szlessg magassag

szlessg

Ellipsziseket nem hasz nlunk a CAPTCHAkpben, de attl mg na gyon hasznosak.

magassg

Inkbb egy kitlttt ellipszisre lenne szksged? Ha igen, csak annyi a dolgod, hogy meghvod az im agef i l l e d e l l i p s e () fggvnyt, ami pontosan ugyangy mkdik, mint az im a g e e llip s e ( ) , csak ppen a megadott sznnel nem krvonalat rajzol, ha nem kitlti vele az ellipszist.

Az imagee%seO es az unagefilledellipseO u t azkat a paramtereket varjak.

Az ellipszis szlessge s ma gassga - ha megegyeznek, t kletes krt kapunk.

Az ellipszis kzppontj nak x,y koordintja.

Ha befejezted a kpre rajzolst, ezzel a fgg vnnyel kzvetlenl elkldheted a kpet az gyfl webbngszjnek, vagy fjlba rha tod a kiszolgln. A vgeredmny mindkt eset ben egy olyan kp lesz, amely az <img> HTMLcmke segtsgvel megjelenthet egy weboldalon. Ha gy dntesz, hogy' kzvetlenl a mem riban (vagys fjlnv nlkl) hozol ltre egy PNG kpet, akkor a h ead er () fggvnyt is meg kell hvnod ahhoz, hogy a kpet egy fejlc segt- ^ ^azonost, arnesgvel elkldhesd a bngsznek. ^ a raj 2 olfggV-

A kp elkldhet' kzvetle nl a bngsznek, vagy fjlba rhat a kiszolgln.

nykben hasznltl. A fggvny igazat vagy hamisat ad vissza, attl fggen, hogy a kp sikeresen ltrejtt-e.

A nem ^ te le z i msodik paramterben egy fjlneVet 3<,,iafsz ffle9 ~ "lkl a fggvny a mem riban hozza ltre a kpet, amelyet gy egy fejlc segtsgvel lehet tadni a bngsznek.

77. fejezet

Az adatok megjelentse... s mg annl is tbb!

Ha mr nincs rjuk szksg, a kpeket clszer kitakartani, hogy a ki szolgl ne pazarolja az erforrsokat.

imagedestroy( )
A kpekkel val munka a GD knyvtr segtsgvel rendszererforrsokat ignyel. Ez a fggvny gondoskodik a takarts rl, ha a kpekre mr nincs szksg. Csak annyi a dolgod, hogy meghvod ezt a fggvnyt, miutn az imagepng () fgg vnnyel a kimenetre kldted a kpet.

Ez a fggvny az imagepng()-hez ha sonlan siker esetn igazat, mg ms esetben hamisat ad vissza.

imagedestroy ($img) ;

A megsemmisteni kvnt kp azonostja.

prbld minden ltrehozott kpre

Mindig szabadtsd fel az imagedestroy() fggvnnyel a kpek helyt a memriban, miutn a kimenetre kldted ket.
imagestring( )
Ez a fggvny egy szveges karakterlncot rajzol a PHP alaprtelmezett bettpusval s a megadott sznnel. A fggvnynek a kperforrs azonostjn kvl a bet mretet (ez egy 1 s 5 kztti szm lehet), valamint a ka rakterlnc bal fels sarknak koordintjt, magt a ka rakterlncot s a sznt kell tadni.

meghvni ezt a fggvnyt, hogy minden kp megsemmisljn.

A szveg megrajzolshoz hasznlt betmretet egy I s 5 kztti szm lltja be, ahol az 5 a legnagyobb mretet jelenti.
Mintaszveg

A karakterlnc betmrete, 1 s 5 kztt.


imagestring($img, 3, 75, 75,

Egyszer szvegrajzolshoz az alaprtelmezett bettpus meg felel, de a mrete korltozott.

Sample t e x t 1, $ c o l o r ) ;

A karakterlnc bal ^ fels* sarknak x,y koordintja.

A megrajzoland karakterlnc.

A szveg szne,

imagestringup( )
Az imagestringupo az ra mutat jrsval ellenttesen 9 0 fokkal elforgatott, vagyis fggleges szveget rajzol.
x,y
0 > > = 0 N ) r d j c H s:
C T.

Ez a fggvny az imagestring ( )-hez hasonlan szintn szveges karakterlncot rajzol az alaprtelmezett bett pussal, de a szveget fgglegesen jelenti meg, mintha az az ramutat jrsval ellenttesen 90 fokkal el lenne forgatva. A fggvnyt ugyanazokkal a paramterekkel kell meghvni, mint az imagestring {) -et. m ost it t vagy > 619

nha a HTML nmagban nem efeg

Szvegrajzols adott bettpussal


Az im a g e s tr in g ( ) fggvnnyel knny rajzolni, de a szveg megje lensnek szablyozhatsgt illeten meglehetsen korltozottak a lehetsgei. Ahhoz, hogy egy konkrt megjelenst rj el, sajt TrueType bettpust kell hasznlnod. A CAPTCHA-jelszkp esetben szksg is lehet erre, mert a karaktereknek elg nagynak, s lehetleg flkvrnek kell lennik. Az egyni megjelenshez legalbb mg egy GD-fggvny segtsgre szksged lesz, amely egy a kiszolgln el helyezett TrueType bettpus hasznlatval rajzol szveget.

imagettftext( )
Ha valban testreszabott szveget szeretnl rajzolni, helyezz el egy TrueType bettpusfjlt a webkiszolgldon, majd hvd meg ezt a fggvnyt. Ezzel a mdszerrel nem csak tetszleges bettpus hasz nlatra nylik lehetsged, hanem a betmretet, st a szveg kirajzolsi szgt is rugalmasabban szablyozhatod. Az im a g e s trin g () ti eltren az ennek a fggvnynek tadott koordintk a szveg el s karakternek alappontjt" hatrozzk meg, ami durvn az els ka raktr bal als sarknak felel meg. A fggvny hasznlathoz min denkppen el kell helyezned egy TrueType bettpusfjlt a kiszolg ln, s ezt a fjlt kell megadnod utols paramterknt. A TrueType bettpusfjlok kiterjesztse ltalban . t t f .

Az egyni megjelens szve gek rajzolshoz egy TrueType betfpus s az imagettftext!) fggvny szksges.

---------x,y#

Mintaszveg

t Ha az imagettftext() fggvnnyel
rajzolsz szveget, a megadott koordi ntk az imagestring()-tol eltren a szveg bal als sarkt jellik.

A betk mrete, ltala'bn pontban megadva.

A szveg llsi szge, az ramutat jrsaval szemben, fokban megadva 0 norml szveget jelent)
^

A szveg bal als sarknak x,y koordintja.

imagettftext($img, 18, 0, 5, CAPTCHA_HEIGHT - 5, $ text__color, 'Courier New B o l d . t t f , $pass_phrase);

Maga a kirajzolni kvnt szveg.

A GD grafikai knyvtr csak akkor ta llja meg a TrueType bettpust, ha el helyezted azt a webkiszolgln.

00)

III ou

ooi ou
loion
C ourier New B o ld .ttf

Strbereknek
Ha meg szeretnl prblkozni egy tel jesen sajt TrueType bettpus ksz tsvel, hogy a CAPTCI lA-kped mg egynibb le gyen, ltogass el a w w w .Jbntstnict.com cmre, ahol egy internetes bettpus-kszt kzssget tallsz, valamint egy w ebes eszkzt, amellyel egyni bet tpusokat hozhatsz ltre.

Az egyni megjelens szvegek rajzolshoz egy TrueType bet tpus s az imagettftext() fgg vny szksges.

620 17. fejezet

Az adatok megjelentse... s mg annl is tbb!

lltsd prba!
Prostsd ssze az albbi PHP nyelv kprajzol kdokat az ltaluk ltrehozott kppel! Felttelezzk, hogy a kpet ($img) s a szneket ($black_color, $white_color, $gray_color) mr ltrehoztuk.

/
jm a g e c o lo fa llo e a te ($ iK ig ,

/
imagecolorallocatetfimg, 128, 128, 128);

0, 0, 0 ); image<

255, 255, 255);

im a g e f ille d r e c ta n g le ( $ im g / 10, 10, 90, 90, $ g r a y _ c o lo r ) ; im a g e fille d e llip s e ($ im g , 50, 50, 60, 60, $ w h ite _ c o lo r ); im a g e fille d r e c ta n g le ($ im g , 40, 40, 60, 60, $ b la c k c o l o r ) ;

im a g e lin e ($ im g , 15, 15, 5 0 , 5 0 , $ b l a c k _ c o l o r ) ; i m a g e l i n e ($ im g , 1 5 , 8 5 , 5 0 , 5 0 , $ b l a c k _ c o l o r ) ; im a g e lin e ($ im g , 5 0 , 5 0 , 8 5, 5 0 , $ b l a c k _ c o l o r ) ; im a g e f ille d e llip s e < $ im g , 15, 1 5, 2 0 , 2 0 , $ g r a y _ c o lo r ) ; im a g e f ille d e llip s e ( $ im g , 15, 8 5 , 2 0, 2 0 , $ g r a y _ c o lo r ) ; im a g e fille d e llip s e ($ im g , 50, 50, 20, 20, $ g ra y _ c o lo r); im a g e f ille d e llip s e ( $ im g , 85, 5 0 , 2 0 , 2 0 , $g ray c o l o r ) ;

im a g e fi11e d re c ta n g le ($ im g , 10, 10, 90, 60, $ g r a y _ c o lo r ) ; im a g e s e tp ix e l($ im g , 3 0 , 25, $ b la c k _ c o lo r ) ; im a g e s e tp ix e l($ im g , 7 0 , 2 5 , $ b la c k _ c o lo r ) ; im a g e lin e ($ im g , 35, 45, 65, 45, $ b l a c k _ c o l o r ) ; im a g e fille d r e c ta n g le ($ im g , 45, 50, 55, 90, $ g r a y _ c o lo r );

i m a g e e l l i p s e ($ im g , 4 5 , 4 5 , 7 0 , 7 0 , $ b l a c k _ _ c o l o r ) ; im a g e fille d e llip s e ($ im g , 75, 75, 30, 30, $ g ra y _ c o lo r); im a g e s e tp ix e l($ im g , 10, 10, $ b la c k _ c o lo r ) ; im a g e s e tp ix e l($ im g , 80, 15, $ b la c k _ c o lo r ) ; im a g e s e tp ix e l($ im g , 2 0 , 15, $ b la c k _ c o lo r ) ; im a g e s e tp ix e l($ im g , 90, 60, $ b la c k _ c o lo r ) ; im a g e s e tp ix e l($ im g , 2 0 , 80, $ b la c k _ c o lo r ) ; im a g e s e tp ix e l($ im g , 45, 90, $ b la c k c o l o r ) ;

im a g e fille d re c ta n g le ($ im g , 25, 35, 75, 90, $ b la c k _ c o lo r ); im a g e lin e ($ im g , 10, 5 0 , 50, 10, $ b l a c k _ c o l o r ) ; im a g e lin e ($ im g , 5 0 , 10, 90, 5 0 , $ b l a c k _ c o l o r ) ; im a g e fille d r e c ta n g le ($ im g , 45, 65, 55, 90, $ w h ite _ c o lo r ); im a g e lin e ($ im g , 0, 9 0 , 100, 90, $ b l a c k _ c o l o r ) ;

most it t vagy > 621

lltsd prba! - megolds

lltsd prba!
Prostsd ssze az albbi Pl IP nyelv kprajzol kdokat az ltaluk ltrehozott kppel! Felttelezzk, hogy a kpet ($img) s a szneket ($ b la .c k _ c o lo r, $ w h ite _ c o lo r. $ g r a y _ c o lo r ) mr ltrehoztuk.
im a g e f ille d r e c ta n g le ( $ im g / 10, 10, 90, 90, $ g r a y _ c o lo r ) ; im a g e fille d e llip s e ($ im g , 50, 50, 60, 60, $ w h ite _ c o lo r ); im a g e fille d r e c ta n g le ($ im g , 40, 40, 60, 60, $ b la c k _ c o lo r );

im a g e lin e ($ im g , 15, 1 5 , 50, 5 0 , $ b l a c k _ c o l o r ) ; im a g e lin e ($ im g , 15, 8 5 , 50, 5 0 , $ b l a c k _ c o l o r ) ; im a g e lin e ($ im g , 50, 5 0 , 85, 5 0 , $ b l a c k _ c o l o r ) / im a g e f ille d e llip s e ( $ im g , 15, 15, 2 0, 2 0 , $ g r a y _ c o lo r ) ; im a g e fille d e llip s e ($ im g , 15, 85, 20, 20, $ g r a y _ c o lo r )/ im a g e fille d e llip s e ($ im g , 50, 50, 20, 20, $ g ra y _ c o lo r); im a g e fille d e llip s e ($ im g , 85, 50, 20, 20, $ g ra y _ c o lo r)/

im a g e fille d re c ta n g le ($ im i m a g e s e t p i x e l { $im g , 3 0 , im a g e s e tp ix e l($ im g , 7 0 , im a g e lin e ($ im g , 35, 4 5 , im a g e fille d re c ta n g le ($ im

g , 10, 10, 90, 60, $ g r a y _ c o lo r ) ; 25, $ b la c k _ c o lo r)/ 25, $ b la c k _ c o lo r); 65, 45, $ b la c k _ c o lo r )/ g , 45, 50, 55, 90, $ g ra y _ c o lo r) ;

im a g e e llip s e ($ im g , 45, 45, 7 0, 70 , $ b la c k _ c o lo r ) ; im a g e fille d e llip s e ($ im g , 75, 75, 30, 30, $ g ra y _ c o lo r); im a g e s e tp ix e l($ im g , 10, 10, $ b la c k _ c o lo r ) ; im a g e s e tp ix e l($ im g , 80, 15, $ b la c k _ c o lo r ) / im a g e s e tp ix e l($ im g , 2 0 , 15, $ b la c k _ c o lo r ) ; im a g e s e tp ix e l($ im g , 90, 60, $ b la c k _ c o lo r ) ; im a g e s e tp ix e l($ im g , 2 0 , 80, $ b la c k _ c o lo r ) ; im a g e s e tp ix e l($ im g , 45, 90, $ b la c k _ c o lo r ) ;

im a g e fille d re c ta n g le ($ im g , 25, 35, 75, 90, $ b la c k _ c o lo r ); im a g e lin e ($ im g , 10, 5 0 , 5 0 , 10, $ b l a c k _ c o l o r ) ; im a g e lin e ($ im g , 5 0 , 10, 90, 5 0 , $ b l a c k _ c o l o r ) ; im a g e fille d re c ta n g le ($ im g , 45, 65, 55, 90, $ w h ite _ c o lo r); i m a g e l i n e ($ im g , 0 , 9 0 , 1 0 0 , 9 0 , $ b l a c k _ _ c o l o r ) ;

622 11. fejezet

Az adatok megjelentse... s mg annl is tbb!

Vletlenszer CAPTCHA-kp ellltsa


Ha sszerakod a teljes CAPTCHA-kdot, megkapod a vadonatj c a p tc h a .p h p parancsfjlt, amelynek a feladata a vletlenszer jelsz el lltsa, valamint a PNG kp elkldse a bngsznek.
c Tp h p sessio n _start() ; / Nhny f o n t o s CAPTCHA-iland b e l l t s a d e f i n ( ' CAPTCHA_NUMCHARS * , 6 ) ; // a j e l s z d e f i n { 1CAPTCHA_WIDTn1 / 1 0 0 ) ; define('CA PTCH A _H EIG H 7\ 2 5 ) ; // A v l e t l e n s z e r jelsz

A captcha.php parancsfjl teljesen nll - megnyitha tod egy bngszben, s megtekintheted az ltala lt kpet. Itt hozzuk ltre azokat az llan dkat, amelyek a CAPTCHA ka raktereinek a szmt, illetve a CAPTCHA-kp szlessgt s magassgt troljk.

k a r a k t e r e i n e k a szma

// ^ k p s z l e s s g e n a kp ma g a ss g a

ellltsa {

$pass_pbrase = f c r ( $ i = 0 ; $ i < CAPTCHA_NUMCHARS; $ i r + ) $ p a s s _ n h r a s e .= c h r ( r a n d (9 7 , 1 2 2 ) ) ;

A titkostott jelszt az adatbzisban is trolhatnd, de egyszerbb egy munkamenet-vltozba tenni. A jelszt azrt kell trolni, hogy az Add Score parancsfjl hozz frhessen.

// A t i t k o s t o t t j e l s z t r o l s a egy munkamenet - vl t ozban $ _ S E S S I O N [ ' p a s s _ p h ra s e ' J - s h a l ( $ p a s s jp h r a s e ) ;

// A kp l t r e h o z s a $ i m g = i m a g e c r e a t e t r u e c o l o r (CAPTCHA_WIDTH, CAP7CriA_HEIGHT) ; // F e h r h t t r , f e k e t e szveg s szrke g r a f i k a b e l l t s a

$ b g _ c o l o r = i m a g e c o l o r a l l o c a t e ($im g, 2 5 5 , 2 5 5 , 2 5 5 ) ; // f e h r $ t e x t _ c o l o r - i m a g e c o l o r a l l o c a t e ( $ i m g , 0, 0, 0 ) ; // f e k e t e $ g r a p h ic _ c o lo r - im a g e c o lo r a llo c a te ($ im g , 64, 64, 6 4 ); // s t t s z r k e


II

kitltse i m a g e f i l l e d r e c t a n g l e ( $ i m g , 0 , 0 , CAPTCHA_WIDTH, CAPTCHA_HEIGHT, $ b g _ c o l o r ) ; Nhny v l e t l e n s z e r vonal r a j z o l s a

A httr

II

f r ( $ i ^ 0 ; $ i < 5; $i++) { i m a g e l i n e ( $ i m g , 0 , r a n c ( ) % CAPTCHA_HEIGHT, CAPTCHA_WIDTH, r a n d O % CAPTCHA_HEIGHT, $ g r a p h i c _ c o i o r ) ;

}
// Nhny v l e t l e n s z e r pont. e l p t y g t e t s e f o r ( $ i = 0 ; $ i < 5 0 ; $i++) { i m a g e s e t p i x e l ( $ i m g , r a n t ( ) % CAPTCHA_WIDTH, r a n d O % CA PTC H A J I I G HT, $ g r a p h i c _ c o l c r ) ;

)
/ / A j e l s z szvegnek m e g r a jz o l s a i m a g e t t f t e x t ( $ i m g , I S , 0 , 5 , CAPTCHA_HEIGHT - 5 , $ t e x t _ c o l o r , " C o u r i e r New B o l d . L t f " , $ p a s s _ p h r a s e ) ;
II

A kp e l k l d s e PNG k n t egy f e j l c h e a d e r ( " C o n t e n t - t v p e : image/png") ; im agepng($ im g ); // T a k a r t s i m a g e d e s t r o y ($img)

segtsgvel ^ _______

?>

A PNG kp az sszes megrajzolt elemet tartalmazza.

A PNG kpet egy fejlcen keresz tl kldjk el a bngsznek.

A GD grafikai knyvtr egyes vlto zataiban viszonytott (relatv) el rsi ttal kell megadni a bettpusfjl helyt, pldul gy: "./Courier New B o ld .ttf.

Az utols lps a kp trlse a memribl (a kp et tl mg a fejlcen keresztl a bngszhz kerl).

captcha.php
m o s t i t t vagy

623

prbld k i a captcha.php parancsfjlt!

rd meg a CAPTCHA parancsfjlt s prbld ki!


Hozz ltre egy j szvegfjlt c a p tc h a .p h p nven, s rd bele a CAPTCHA parancsfjl kdjt az elz oldalrl (vagy tltsd le a parancsfjlt a Head First Labs webhelyrl, a w w w .h ea d firstla b s.co m / b o o k s/ h fp h p cmrl). Tltsd fel a parancsfjlt a webkiszolgldra, s nyisd meg egy w ebbngszben. A CAPTCHAkp a vletlenszer jelszval azonnal megjelenik a bngszben. Ha j jelszt szeretnl elllt tatni. tltsd jra az oldalt.

100x2 S pixels

Minden ltrehozott CAPTCHA-kp hat vlet lenszer karaktert, valamint httrzajknt" nhny vonalat s pttyt tartalmaz.
capicha. 0 0x2 5 pixels

fsno
Pxes

100x2 S pixels

Ha jratltd (frissted) a CAPTCHA parancsfjlt, j V letlenszer jelszkp jn ltre.

624 11 fejezet

Az adatok megjelentse... s mg annl is tbb!

Ezek a ro b o to k m e g rjte n e k! A z o n n a li s e g ts g re van sz ks g e m , h o g y m e g llts a m o k t!

Vess vget az rletnek a Guitar Wars alkalmazsban!


Most, hogy a GD-fggvnyeknek s a CAPTCHA-kpeknek ksznheten elbjt belled a PHP-mvsz, ideje, hogy a CAPTCHA-kpeket munkra fogd, s megmentsd a Guitar Wars alkalmazs modertort a reklmrobo tok tmadstl. A robotproblma megoldsa a CAPTCHA-jelszavak segt sgvel tbb lpsbl ll feladat, de a j hr az. hogy' kettt mr ki is pi plhatsz: a vletlenszer jelsz ellltst, illetve a CAPTCHA-kp megraj zolst. Hajtsd vgre a maradk lpseket is, hogy a Guitar Wars alkalma zst hivatalosan is robotmentess nyilvnthasd!

A Guitar VJars alkalma zs modertora annyira kiakadt, hogy kpzelet beli robotokkal kzd. Azonnali megoldsra van szksg!

Mr ksz!

Vlotlonszor jelsz ellltsa.


A rajz is ksz!

&

A jelszt-ta rtalmaz CAPTCHA kp megrajzolsa.

o
o

A CAPTCHA-kp megjelentse a Guitar Wars alkalmazs Add Score rlapjn, s a felhasznl felszltsa, hogy rja be jelszt. A jelsz sszehasonltsa a felhasznl ltal berttal.

Gyakorlat

Hajtsd vgre a 3- lpst (a CAPTCHA-kp megjelentse a Guitar Wars alkalmazs Add Score rlapjn): rj HTML-kdot, amely egy j megerst szvegbeviteli rlap mezt hoz ltre, amely arra kri a felhasznlt, hogy rja be a CAPTCHA-jelszt. Ne felejtsd el szvegcmkvel elltni a mezt, s egy <img> elem et tenni utna, amely megjelenti a c a p tc h a .p h p parancsfjl ltal ltrehozott CAPTCHA-kpet.

most it t vagy 625

Gyakorlat - megolds

Gyakorlat - megolds

Hajtsd vgre a 3- lpst (a CAPTCIIA-kp m egjelentse a Guitar Wars alkalmazs Add Score rlapjn): rj HTML-kdot, amely egy j megerst szvegbeviteli r lapmezt (Verification) hoz ltre, amelv arra kri a felhasznlt, hogy rja be a CAPTCHA-jelszt. Ne felejtsd el szvegcmkvel elltni a mezt, s egy <img> elem et tenni utna, amely megjelenti a c a p tc h a .p h p parancsfjl ltal ltrehozott CAPTCHA-kpet.

A .. v/ ...

..

Ebbe a szvegmezbe M r * , CAPTCHA/ . . . . f kpen lthat jelszt, / r j }d~H ycxtfy!.f'dw. ycKi f y' . . .ih?.
/ > .

7 M a < label > elem v , V hatarozza meg. ^ <labcl $or <mput

^ A kp forrasa annak a PHP-parancsfjlnak f a CAPTCHA-kepet. Ez azrt mkdik, mert a eaptcha.php parancsfjl egy kpet ad vissza, amelyet az imagepngf) fggvny s egy fejlc
S fc S ! M d .M M , b5s, * , k.

A CAPTCHA-kp az rlapon a megerostff szvegrnezo I llH jelenik . 9.

oo

***

W afs Add Vour lgh

Nmet Scorc:
Sercco shot: T n c s f ftle no filc e c te t^ *

Vcnficafion: v>ttr tt* pdss-pfvras

C ') m

u \ M i, csak m

lps > k"*1

A CAPTGHA kp mogjolontso a Guitar W ars alkalmazs Add Scoro rlapjn, s a flhasznl felszltsa, hogy rja bo jelszt.

626 11. fejezet

A z adatok megjelentse... s mg annl is tbb!

A CAPTCHA hozzadsa az Add Score parancsfjlhoz


Az egyenlet gyfloldaln az a d d sc o re .p h p parancsfjl az j Verification szvegbeviteli mezt tartalmazza, mel lette a CAPTCHA-kppel. A legfontosabb mdosts azonban egy j i f utasts hozzadsa az Add Score pa rancsfjlhoz (4. lps), amely ellenrzi, hogy a felhasznl ltal bert jelsz m egegyezik-e a CAPTCHA-jelszval.

<?php sessio n _start {);

?> <html>
<head> < t i t l e > G u i t a r W a r s - Add Y c j r H i g h S c o r e < / r . i t l e > < l i n k r e l = " s t y i e s h e e t " t y p e = " t e x t / c s s " h r e f " s t y l e . e s s " /> </head> <body> < h 2 > G u i t a r W a r s - Add Y o u r H i g h S c o r e < / h 2 >

A jelsz sszoha sonltsa a fel hasznl ltal be


r tta l

<?php r e q u ir e _ o n c e ( ' a p p v a rs.p h p ' ) ; r e q u ir e _ o n c e < 'c o n n e c t v a r s .p h p ') ; i f ( is s e t ( $ _ P O S T [ ' su b m it' ] ) ) {


// Csatlakozs az adatbzishoz

Teljesen kszen vagyunk!

$dbc = mysqli_Connect(DB_H0S7, DBJJSER, B_PASSWORD, DB_NAME);


// A rekordpontszmok kiolvassa a POST-tmbbl

$name - m y s q li_ r e a l_ e s c a p e _ s t r i n g ($dbc, t r i m ( $_POSTr ' na me ' J ) ) ; $ s c o r e ~ mysqli_ re a l_ e sc a p e _ s t r i n g ($dbc, t r i m ($_POST f ' s c o r e 1] ) ) ; $ s c r e e n s h o t *= m y s q li_ r e a l_ e s c a p e _ s tr in g ($dbc, t rim ($_FJL E S[ ' s c r e e n s h o t ' J f ' name ] ) ) ; $ s c r e e n s h o t _ s i z e = $_F IL E S[ s c r e e n s h o t 1[ s i z e ] ;

:;' Itt olvassuk be a titk o s to tt je l --------------------------------------------------------------------------------------------szt a munkamenet-vltozbl, s


\
f

flA

CAPTCHA- jelsz ellenrzse $ se r_ p a ss_ p h ra se = sh al {$ _ p o stf v e r i f y j ) ;

ellenrizzk hV a flhasznl ellenrizz*, nogy a Temasznaio

i f ($_SESSIONl pass p h r a s e ]

== $ u se r pass p h rase) {

helyesen rta-e be.

else { e c h o <p c l a s s = - " e r r o r " > P l e a s e e n t e r t h e v e r i f i c a t i o n p a s s - p h r a s e e x a c t l y a s s h o w n . </p>

m ost itt vagy 627

a captcha-kpessgekkel kie g szte tt addscore.php tesztelse

Tesztt
Mdostsd az Add Score parancsfjlt, hogy tmogassa a CAPTCHA-jelszavakat!
Egsztsd ki az a d d sc o re .p h p parancsfjlt az j megerst rlapmezvel, s mdostsd gy. hogy a c a p tc h a .p h p parancsfjl segtsgvel kpes legyen CAPTCHA-kpet megjelenteni. Ezen kvl add hozz a felhasznl ltal bein jelszt ellenrz kdot, hogy megbizonyosodj r la, hogy a jelsz helyes, mieltt a rekordot felvennd az adatbzisba. Tltsd fel mindkt parancsfjlt a webkiszolglra, s nyisd meg az a d d se o re .php-t a bngszdben. Prblj feltlteni egy j rekordot a CAPTCHA-jelsz bersa nlkl, majd prblkozz jra, de ezttal rd b e elbb a CAPTCHA-kpen lthat jelszt.

Nagyszer rzs em bernek lennl

Cttar Wars

Guitar Wars - Ada lo u r nKu


Please enter the verification par-pbrase exn etiy as shown
Guitar Wars

Emberi modertorunk vgre bkre lelt, egy kis sajt automatizls nak ksznheten, v

Name:

healaMlabvcom

A d d Your H ig h Score

S co re : 9999*9999

Scrccn shot : O>ooe ffi<) no file


V

Guitar Wars - Add Your High Score


Please enter the verification pa&s-phrase exactly ns show n
C u it ir W ars A d d Y o u r H ig h Score

rrificarion: Crter the past - o>- rase

ww w ce tfa ^ w f?o ny n ;.co


^core: 999999999 Screen shot
Cnooic Flic

no file seccieo

Guitar Wars - Add Your High Score


Pleas* enter the verification pass-phrase exactly as shown
Name:

Verification: emh ih pus*phrue

II -

w *w .e !a5 sh atei.r> m -------- i n

Score. 999999999

Screcn shoe

C- i * n e f iit

no file selected

Az lladan vltoz CAPTCHA-jelsz alaposan megnehezti az automatizlt robotoknak, hogy reklmokkal rasszk el a Guitar W/ars rlapjt.

Verification:

E rter the o a s i - phrase

628 71. fejezet

Az adatok megjelentse... s mg annl is tbb!

Nincsenek

hlye krdsek
I C . ! K: A GD-fggvnyekkel a PNG-n kvl Ilyen esetben a kphez nem tarto Pontosan. Ha egy <img> elem ms form tum kpeket is ltrehozzik .png fjl, mivel a kp nem is src tulajdonsga egy PHP-pa't hatok? fjlban troldik. Az imagepng ( ) rancsfjlra hivatkozik - ahogy a Guitar V ! Igen. Az i m a g e g i f () s fggvny ehelyett a kiszolgl memri Wars alkalmazs captcha.php pa
az i m a g e jp e g O fggvnyek az im ag ep n g () -hez nagyon hasonlan mkdnek, csak ppen GIF, illetve JPEG kpet hoznak ltre. jban hozza ltre a binris PNG kpet, s egy fejlcen keresztl juttatja el a bngszhz. Mivel a kpadatok kz vetlenl a bngszhz kerlnek, nincs szksg arra, hogy kpfjlban troljuk azokat. rancsfjljval is tettk - , akkor a kpet kzvetlenl ettl a parancsfjltl kapjuk. Az <img> elem szokvnyos hasznlata ezzel szemben az, hogy az src jellem zben egy kpfjl nevt adjuk meg. Mi vel azonban a parancsfjl a kzvetlen forrsa a bngszben egy fejlc (illetve az imagepng {) fggvny) segtsgvel megjelentett kpnek, fjlra nincs szk sg. A bngsz tudja, hogy a fejlcben kapott kpet kell az <img> elemhez kapcsolnia, mert az src jellemz egy parancsfjlt hatroz meg.

I C ! A kpltrehoz fggvnyek ttetsz kpeket is kpesek ellltani?


! Igen! Ltezik egy

imagecolortransparent( }
nev fggvny is, amely a megadott sz n kppontokat ttetszv leszi a kpen bell. A sznnek egy olyan sznnek kell lennie, amelyet mr ltrehoztl az imagecolorallocate () fgg vnnyel. Miutn a sznt ttetszknt ll tottad be. minden, amit ezzel a sznnel rajzolsz a kpre, tltsz lesz. Az ttet sz terleteket tartalmaz kp ltreho zshoz az imagegif () vagy az imagepng {) fggvnyt kell meg hvnod; az image jpeg () nem hasznl hat, mert a JPEG kpek nem tmogat jk az ttetszsget.

! Ez az oka annak, hogy a CAPTCHAparancsfjl nevt kzvetlenl berhatom egy < i m g > elem s r c jellemzjbe?

0 0

K:

Ha az i m a g e p n g ( ) segtsgvel kzvetlenl az gyflbngsznek kl dk el egy PNG kpet, akkor hol tro ldik a kp .png fjlja, s mi a neve?

jratltve
Minden webes rlap ki van tve a reklmrobotok tma dsnak. a reklmrobotokat viszont a furfangos PHPprogramozk veszlyeztetik, akik a CAPTCHAkpekhez hasonl megoldsokkal verik vissza ket. A GD a PHP szabvnyos grafikai knyvtra, amely lehe tv teszi, hogy dinamikusan hozz ltre kpeket, s mindenfle grafikt s szveget rajzolj rjuk. A rajzolshoz a GD knyvtr c r e a t e t r u e c o l o r imag () fggvnyvel hozhatsz ltre res kpet. Ha a ksz kpet PNG kpknt el szeretnd kldeni a bngsznek, vagy fjlba szeretnd rni a kiszolgln, a GD knyvtr imagepng () fggvnyt kell meghv nod. Ha egy kpre mr nincs szksged, takarts ki utna az im a g e d e s t r o y () fggvny meghvsval.

m ost it t vagy 629

a m ism atch alkalmazs adatainak kpi megjelentse

Az ellenkezs t szintje
Mivel a Mismatch w ebhely bejegyzett (em beri!) felhasznlk kzssge, a reklmrobotok itt nem jelentettek eddig gondot. A felhasznlk azon ban a szolgltats bvtsre vgynak - elssorban arra, hogy az ellentt proknak az ellenkezs t szintje" alapjn trtn meghatrozsakor ne csak egy lista jelenjen meg azokrl a tmkrl, amelyekrl ellenttes a vlemnyk az idelis ellenttprjukkal, hanem valamilyen kpi br zolsa is legyen a fbb kategriknak, ami megmutatja, hogy az adott csoportba tartoz tmk szerint milyen fok az ellentt.

A Mismatch alkalmazs ban az ellenkezs t szintje" (five degrees o opposability) a tmk kategrinknti vizsgla tt jelenti.

L to k e g y c s o m t m t, de nem ig a z n tu d o m , h og y a prommal m e n n yire t r n k el a z egyes k a te g ri k b a n . T e ts z ik a z ellen ke zs t s z in tj n e k elve, d e e g y lta l n nem l to m a s z e re p t a z e lle n t tp ro k m e g h a t ro z s b a n . Van v a la m ilye n m e g o ld s e rre ?

Belita vizulis szemlyisg, aki tbbet szeretne ltni egy listnl, .m i csak azt mutatja, Hogy milyen tHo_ns * atch * M j Misma,cb ^ ------------ --------.

mkban ellenkezik a tkle- Jason Filmingtl, tes ellenttprjval. Hollywood, c a

You are m ism atch! ou the folkm ing 18 topics: /I acoos X Cowboy boots Long hair Reality TV Horror movies Easy listening music The opera Sushi Spicy food
M artinis

Peanut butter & banana sandwiches BilJ Gates Hugh Hefner Yoga Weightlifting Cube puzzles Karaoke Hiking
View

/ /

/
/

/
y /

630 11. fejezet

Az adatok megjelentse... s mg annl is tbb!

Az ellenkezs brzolsa
Ha mg emlkszel r, a Mismatch alkalmazshoz ksztettl egy kategrikra bontott krdvet, amelyen a felhasznlk klnbz tmkkal kapcsolatban nyilvnthatnak vlemnyt (szeretem" vagy utlom Love/Hate), s ezek a vlaszok hatrozzk meg az idelis ellenttprokat. Amikor felfedi egy felhasznl idelis ellenttprjt, a My Mismatch parancsfjl egy listt jelent meg azokrl a tmkrl, am elyekben el lenkezik a vlemnyk, s ezt a listt tmbknt pti fel a Mismatch adatbzisbl. A felhasznlk azonban most mr tbbet akarnak egy egyszer tmalistnl - az ellenkezst kategrikra bontva, kpi brzols ban szeretnk ltni, esetleg egy oszlopdiagram (bar graph) formjban.

Gyakorlat

Rajzolj oszlopdiagramot a Mismatch-adatok szmra, amely vizulisan brzolja Belita s Jason esetben az ellenkezs t szintjt, s rd mell, hogy mit mutatnak az egyes elemek!

Tattoos C o w b o y boots

Ezt a tmalistt valamilyen mdon a kategrik oszlopdi agramjv kell alaktanod.


*

Reality TV H o rro r m ovies Easy listening music The o p e ra

Peanut b u tte r & b a n a n a sandw iches M a rtin is

W e ig h tliftin g C ube puzzles K araoke

Tettk Cowboycezma Hoeez haj Valeg&how-k Horrorfilmek Tlngli-tan^li zene Opera Suehi F&zeree telek Mogyorvajas-bannoe 9zendv\c& Martin! Bili G atee Hugh Hefner

Jga
Slyemels Bve kocka Karao ke Trzs

most itt vagy 631

grafikonadatok trolsa tmbkben

Rajzolj oszlopdiagramol a Mismatch-adatok szmra, amely vizulisan brzolja Belita s ja s o n esetben az ellenkezs t szintjt", s rd mell, hogy mit mutatnak az egyes elemek!

Gyakorlat - megolds

Br az ellenttadatok kpi brzolsa sokflekppen meg oldhat, az oszlopdiagram nem rossz vlaszts, mivel az egyes kategrikban azonos szm tma tallhat.

Az oszlopdiagram tarto mnya hatrozza meg az egyes oszlopok le hetsges rtkeit.

A diagram minden osz lophoz tartozik egy fejlc (cm) s egy r tk - ami ebben az esetben 5.

Tartomny

Minden oszlop azt mutatja, hogy az adott kategriban hny tmrl ellenttes a v lemnye a kt szemlynek. Az oszlop magassga az adott kateg rihoz tartoz rtket tkrzi.

Az oszlopdiagram adatainak trolsa


Ha a lnyeget nzzk, az oszlopdiagram mgtt meghzd adatok taln mg fontosabbak, mint maga a kpi brzols. Mivel tudjuk, hogy egy oszlopdiagram vgeredmnyben csak fejlcek s rtkek gyjtemnye, a diagram adatait tekint hetjk egy ktdimenzis tmbnek (two-dimensional array) is, amelyben a f tmb trolja az oszlopokat, mg az ahm bk az egyes oszlopok fejlc-rtk prjait.

Minden altmb a diagram egy-egy oszlopnak fej lct s rtkt trolja.


$graph_data = array( array("Heading 1", array("Heading 2", array("Heading 3", . . . ) ; \r $valuel), $value2), $value3),

\/alue 1

A fo tmb minden eleme egy-egy oszlopnak felel meg Oszlop t Oszlop 2 Oszlop 3 Oszlop 4

632 77. fejezet

Az adatok megjelentse... s mg annl is tbb!

Nincsenek

hlye krdsek
K
Egyltaln nem. de ne felejtsd el, hogy a diagram egyes oszlopai ltalban ktfle informcit jelentenek meg: egy fejlcet s egy rtket. Ezen kvl minden oszlopdiagram tbb oszlopbl ll, ezrt egy ktdimenzis tmb hasznlata lo gikus s hatkony mdja a diagram feltltshez hasznlt ada tok trolsnak. Viszont ahogy a rgi monds tartja: Ha csak

Egy oszlopdiagramot mindenkppen egy ktdimenzis adattmbre kell pteni?

egyetlen megoldst ltsz, akkor valsznleg nem rted a prob lmt.' Ebben az esetben a problma az, hogy miknt lehet az oszlopdiagramon brzolt adatokat a legjobban trolni, s erre az egyik legjobban mkd megolds egy ktdimenzis tmb hasznlata. Termszetesen az igazi kilivst az jelenti, hogy pontosan hogyan ptjk fel ezt a ktdimenzis tmbt a Mismatch alkalmazs kategriinak rtkeibl. Az els lps pedig nem ms, mint annak a meghatrozsa, hogy az adatb zis mely adatai jtszanak szerepel a megoldsban.

Gyakorlat

Albb a Mismatch alkalmazs adatbzis-smjt lthatod. Karikzd be az sszes olyan adatot, amelynek szerepe lehet az ellenkezs t szintjt brzol oszlopdiagram di namikus ellltsban, s rd melljk azt is, hogy miknt kell hasznlni ket a diag ram ltrehozshoz.

mismcrt<lt_user
user
id

mismatch.category
c a te g o ry J d nam e

u s e rn am e p assw o rd |o in _ d a t e first n a m e last n a m e le n d e r b ir t h d a t e city state p ic tu re


r e s p o n s e _ i d = *PT

mismatchjesponse mismqfchjfopu
re s p o n s e

nam e c a fe g o ry _ jd

m o st i t t vagy

633

Gyakorlat - megolds

Gyakorlat - megolds

Albb a Mismatch alkalmazs adatbzis-smjt lthatod. Karikzd be az sszes olyan adatot, amelynek szerepe lehet az ellenkezs t szintjt brzol oszlopdi agram dinamikus ellltsban, s rd melljk azt is, hogy miknt kell hasznlni ket a diagram ltrehozshoz.

A user_id oszlop alapjn krdezzk le a krdvre adott vlaszokat, hogy meghatrozzuk az adott fel hasznl legjobb ellenttprjt.

A category_id oszloppal kapcsolunk egy kategrit egy tmhoz, s gy kapjuk meg az ellenttes vlaszokat. Az oszlopdiagram fejlceit a kateg rik neve szolgltatja.

mismatch user
user u s e rn a m e p a s s w o rd

A response_id oszlop alapjn ssze prostjuk kt felhasznl vlaszait, hogy meghatrozzuk, hogy ellenttes-e az rtkk, mely esetben egy ellenttet kapunk.

firs t n a m e la s t n a m e

match response
response re s p o n s e user

b irth d a te

A to p ic jd oszlop teremti meg a kap csolatot a kategrik s a vlaszok k ztt, s ez teszi lehetv, hogy meglla ptsuk, hogy az egyes ellenttes vlem nyek melyik kategrihoz tartoznak.

Az oszlopdiagram ltrehoz shoz meg kell szmolni, hogy az egyes kategrikban hny ellenttes vlasz szle te tt. Ez a szm adja az adott oszlop rtkt, mg a kateg ria neve az oszlop fejlct.

634 11. fejezet

Az adatok megjelentse... s mg annl is tbb!

Oszlopdiagramok - lehull a lepel


Heti interjnk:
Olvassunk a sorok kztt a grafikonok mestervel!

Agyhullm: Szval n lenne az, akii az emberek hvnak, ami


kor adatok kpi brzolsra van szksgk, igaz?

Oszlopdiagram: , igen. Mindenfele adatbrzolsban otthon


vagyok, klnsen a ngyszgletesben.

re oszt egy tortt, annl kisebbek lesznek a szeletek, s egy szer csak nehz lesz kivenni a kpen a rszleteket. Az n oszlopaim esetben ezzel szemben csak az szmt, hogy az rtkk ugyanazon a skln legyen brzolhat.

Agyhullm: Teht az n rajzolsi kpessgei nagyrszt a tg


lalapokra korltozdnak?

Agyhullm: Ami mit is jelent? Oszlopdiagram: Nos, nekem nehzsget okoz olyan dolgokat
brzolni, amelyeknek jelentsen klnbzik az rtke, ha csak nem bnja termszetesen, hogy az oszlopok mrete k ztt drmai lesz a klnbsg. n igazn akkor villogok, ha olyan rtkek kztt kell megmutatnom a klnbsget, amelyek ugyanabba a tartomnyba esnek. Tegyk fel pld ul. hogy azt szeretn, ha megmutatnm, hogy miknt vlto zott a benzin ra az elmlt egy vben: ebben az esetben minden rtk egy viszonylag szk tartomnyba fog esni, mondjuk gy pr dollrra egymstl.

Oszlopdiagram: Vlemnyem szerint a korltozott igen ers


sz az esetemben. Csak arrl van sz, hogy sokszor az egy szerbb a jobb. Az emberek valamirt vonzdnak az oszlo pokhoz, taln mert hozzszoktak, hogy gy mrik a dolgokat - tudja, mint a mobiltelefonok kis kijelzje, ami a jelerss get mutatja: Most hallasz? n szeretem az ilyesmit.

Agyhullm: Nos, rendben, de n mr lttam olyan meglehet


sen hatkony diagramokat is, amelyek kr alakak. Sz momra pldul az ilyen diagramok megnyugtatan otthono sak. Olyanok, mint az almatorta. rti. mire gondolok?

Agyhullm: Biztos ebben? Oszlopdiagram: Tudom, gy tnhet, hogy a benzin ra jelent


sen ingadozik, de abban a tartomnyban, amit nekem br zolnom kell. nem igazn.

Oszlopdiagram: rtem, mire akar kilyukadni, s jl ismerem


Tortadiagramot. Nzze, itt ugyanannak a dolognak a ktfle nzetrl van sz. Tortadiagram bartom a vilgot kereknek ltja, n meg egy kicsit szgletesebb vagyok, ennyi az egsz.

Agyhullm: Ezek szerint ltott mr vadabb dolgokat is? Oszlopdiagram: Nmelyiket nem is hinn el. Egyszer volt egy
esetem egy fickval, aki egy olyan webal kai mazst ksztett, ami azt figyelte, hogy hny mrfldet tesz meg az egrrel egy adott hnapban. Folyamatosan rt rla a webnapljban, s az n segtsgemmel brzolta az utazsait. Elg nagy rltsg, de az emberek imdtk.

Agyhullm: De az emberek szmra eredenden vonzbb


egy torta, mint egy raks oszlop, nem?

Oszlopdiagram: , dehogy. Legalbbis azoknak nem, akik


nem hesek. Tudja, Tortadiagram tnyleg j abban, hogy megmutassa, hogy7 egyes rszek hogyan viszonyulnak az egszhez, amikor az sszessgk is jelent valamit, mint a 100%, a 32 csapat vagy az 50 llam esetben. 50 llamunk van, ugye?

Agyhullm: Teht itt lp n a kpbe a webalkalmazsokban?


Kpi bepillantst enged egyes emberek adataiba?

Agyhullm: Igen. feltve hogy Washington D.C.-t fvrosi


krzetnek ', az olyan helyeket, mint Puerto Rico s Guam, pedig csatolt terleteknek" szmtja. De rtem, mit akar mondani - azt, hogy a tortadiagramok inkbb a rsz-egsz viszonyokrl szlnak. De ht nem ugyanezt brzolja n is?

Oszlopdiagram: Azt hiszem, igen. Ha beptenek egy oldalba,


s a szemnek vonz formban brzolnak velem olyan ada tokat, amelyek msklnben unalmasak s nehezen felfog hatk lennnek, akkor elmondhatom, hogy j napom volt.

Agyhullm: rmmel hallom. Nos, ksznm, hogy' megosz


totta velnk a gondolatait. Remlem, mskor is eljn.

Oszlopdiagram: De igen. csak ne felejtse el, hogy n sokkal


rugalmasabb vagyok Tortadiagram bartomnl. Annyi osz loppal bvthet, amennyivel csak akar; nekem nem okoz gondot, hogy megjelentsem ket. Viszont minl tbb szelet

Oszlopdiagram: Nekem volt megtiszteltets. s ne aggdjon,


mg biztosan tallkozunk.

most itt vagy

635

a kategrik tm bjnek felptse

Tmbbl tmbbe
Amikor utoljra tallkoztunk a Mismatch alkalmazssal, voli egy tmalistnk, amely kt felhasznl ellenttes vlemnyei alapjn llt ssze. Pontosabban fogalmazva: tmk egy tm bjt ptettk fel. A gond csak az, hogy a most megrajzolni prblt oszlopdiagram nem kifejezetten tmkat brzol, hanem a hozzjuk tartoz kategrikat. Egy szinttel te ht tvolabb vagyunk azoktl az adatoktl, amelyekre valjban szksgnk van. gy t nik, hogy tovbbi SQL-lekrdezseket kell rnunk: nem csak az ellenttes vlemnyeket kivlt tmk tm bjre, hanem egy hasonl, az ezekhez a tmkhoz tartoz kategrikat trol prhuzamos tmbre is szksgnk lesz.
A kategrik tbljt tbb ssze kapcsolssal (jin) a vlemnyek tbljhoz kapcsoljuk, hogy k i nyerhessk a kategrik nevt. A kavarods elker lsre lnevet hasz nlunk , amikor a mismatch_categor y tbla name oszlo pra hivatkozunk

$query = "SELECT m r .response_id, m r .topic__id, m r .response, mt.name AS topic_name, me.name AS category_name "FROM mismatch_response AS mr " . INNER JOIN mismatch topic AS mt USING (topic id) . INNER JOIN mismatch_category AS me USING (category_id) "V7HERE mr.user id = *" . $ SESSION [ user id']
f t t t t

If

A fenti lekrdezsben szerepl jabb sszekapcsols hatsra az egyes tmkrl alkotott vlem nyeknek megfelel kategrianevek hozzcsapdnak az eredmny hez, gy vgl bekerlnek a $ u s e r _ r e s p o n s e s tmbbe. Nem szabad elfelejtened azonban, hogy csak az ellenttes vlaszokat kivlt kategrikra van szksgnk, nem az sszes kategrira. Egy jabb tmbt kell teht felptennk, ami csak eze ket a kategrikat tartalmazza.
category_nam e
Tattoos G o ld chains B od y piercings C o w b oy b o o ts Long hair Reality TV 1 Professional w restling j H orror movies I Easy listening music The o p e ra Sushi Sp am Sp icy fo o d ! | A p p e a ra n ce A p p e a ra n ce A p p e a ra n ce A p p e a ra n ce A p p e a ra n ce Entertainm ent Entertainm ent Entertainm ent Entertainm ent Entertainm ent Food J

Szksgnk van egy j tmb re, amely csak az adott felhasznlprtl ellenttes vlaszokat kap tmk kate griit tartalmazza.
^ | A p p e a ra n c e A p p e a ra n c e

Az ellenttkpzs sorn ka
pott adatok j o s z lo p a minden vlemnyhez tartoz

A p p e a ra n c e E ntertainm ent E ntertainm ent | E ntertainm ent E ntertainm ent Food Food

kategria nevt tartalmazza.

Ki kell nyernnk egy kln tmbbe azokat a kategrianeveket, amelyek az ellenttes vlaszokhoz tartoznak.
| 1

Food Food People People A ctivities A ctivities A ctivities A ctivities

Food Food Food

A 8 . fejezetben ltrehoz tuk a $user_responses ktdimenzis tmbt, ame lyet az aktulis felhasznl vlaszainak megfelel* ada tokkal tltttnk fel.

Peanut butter & b a n a n a san d w ich es M artinis H ow ard Stern Bill G a te 5 B a rb a ra Streisand H ugh H efner

Food P eop le People People |

A ctivities

$user_responses
636 7 7. fejezet

Mg mindig nem rtk el a clunkat: az ellenttes vlaszokhoz tartoz kategri k tm bjnek felptst. Ehhez vissza kell trnnk ahhoz a kdhoz, amelyik fel ptette az ellenttes vlemnyt kivlt t mk tm bjt...

Az adatok megjelentse... s mg annl is tbb!

Prbld ki az ellenttes vlemnyt kivlt tmk s kategrik kiolvasst vgrehajt j lekrdezest!

Tesztt

S 33K S
hogy egy olyan felhasznl azonostjt (> hanem ki is tlttte a Mismatch alkalmazs krdvt.
SELECT m r. r e s p o n s e _ i d , m r . t o p i c _ i d , m r . r e s p o n s e , m t . name AS t o p i c n a m e , m e.nam e AS c a t e g o r y _ n a m e FROM m i s m a t c h _ r e s p o n s e AS mr INNER JOIN m i s m a t c h _ t o p i c AS mt U S I N G ^ ( t o p ic _ id ) INNER JOIN m i s m a t c h _ c a t e g o r y AS me USING ( c a t e g o r y _ i WHERE m r . u s e r _ i d = 3 ;

A felhasznlazonostnak egy olyan ltez felhasznlhoz kell tartoznia, aki a Mismatch alkalmazs krdvt.
I F(,'o Edit Window Help Opposp

mysql>

S E LE C T m r . r e s p o n s e ! d ,

m r.to p ic_id ,

m r.resp o n se, name

m t . n a m e AS t o p i c n a m e , m e . n a m e AS c a t e g o r y FROM m i s m a t c h r e s p o n s e AS mr

71WF.R JOT>J m i s m a t c h t o p i c AS mt USING ( t o p i c _ i d ) 7:>iNER JOTl i mi s m u t c h c a t e g o r y AS me USING ( c a t e g o r y ^^WI-ERF. m r . u s e r i d ; 3 ;

id)

resp on $e_id

i to p ic

id

response

i to p ic

na:ne

, category , /appearance i Appearance Appearance

name

i T attoos i G old c h a in s J Body p i e r c i n g s I Cowboy b o o t s i Long h a i r i R e a l i t y TV

i Appearance i Appearance i Entertainm ent

i P ro fe s s io n a l w re s tlin g I Entertainm ent j H orror m ovies i E ntertain m en t I Easy i i s t e n i n g m usic | Entertainm ent

Megfigyelheted, hogy ennek a lekrdezsnek az eredmnye megegyezik az elz oldalon szerepl $user_responses tmbbel - ami pontosan az, amit akartunk.

Minden lekrdezst rdemes egy MySQL-eszkzben kiprblni, mieltt beptend egy PHP-kdba.

most itt vagy > 6 3 7

a tm k tm bjnek felptse

Az ellenttes vlemnyt kivlt tmk tmbjnek felptse


Most mr van egy lekrdezsnk, amely a tmk mellett tbb sszekapcsols vgrehajtsval kiolvassa a vlem nyekhez tartoz kategrikat is, majd ezeket a $ u s e r _ r e s p o n s e s tm bbe rja. Emlkezz vissza, hogy egyf ehhez hasonl lekrdezs az adatbzisban szerepl felhasznlk adatait is kinyeri, hogy sszeha sonlthassuk az ellentteket. A $ u s e r _ r e s p o n s e s teht a Mismatch alkalmazsba ppen bejelentkezett fel hasznl vlemnyadatait trolja, mg a $m ism at:ch _resp on ses a rendszer egy msik felhasznljt. Ez lehetv teszi, hogy egy ciklussal vgighaladjunk az sszes felhasznln, s minden ellentt megtall sakor frisstsk a $ m ism a tch _ resp o n ses tmb tartalmt. Az emltett kt tmbt mr hasznljuk is, mgpedig arra, hogy rgztsk az ellentteket, s felptsnk egy tm bt az ellenttes vlemnyt kivlt tmkbl. Most mr csak egy jabb sornyi kdot kell rnunk, ami az ellenttes vlemnyt kivlt tmkhoz tartoz kategrik tmbjt is ltrehozza - ez a tm b fogja trolni

a kt felhasznl ellenttes vlaszaihoz tartoz kategrikat.

Ez .a n a z kd, mint m i i a Mismakh d U m knrbbi b " lttl, azzal .2 eltrssel, b n n .t ellenttes v.l.et W IK temak ^ tmbje mellett a tmkhoz tartoz kategoriak tmbjt is telepti.
$ c a t e g o r ie s = a r r a y ( ) ; f r ( $ i = 0 ; $ i < cou n t ($ u se r_ _ re sp o n se s); $i++) ( i f ( $ u s e r _ r e s p o n s e s [ $ i ] [ r e s p o n s e ] + $ m ism a tch _ re sp o n se s[ $ i ] [ 1r e s p o n s e ] == 3) $ s c o r e += 1/ a r r a y _ p u s h ($ to p ic s , $ u s e r _ r e s p o n s e s [ $ i ] [ to p ic^ n am e' ] ) ; a r r a y _ p u s h ( $ c a te g o r ie s , $ u s e r _ r e s p o n s e s [ $ i ] [ ca te g o ry _ n a m e* ] ) ;

Ha mindennel kszen vagyunk, < * * mind eileaith., tartalmazni fog egy-egy a egoria. Nincsenek ^ 3Z e||entfes vlemnyek

Ez a U e a .n ( M . W nyez, amely csak az ellenttes vlemnyt kivlt kategrikat tartalmazza.

he2 taftoz kategrikat.

hlye krdsek ------------------------------K

[ Kiss ssze vagyok zavarodva. Mi a klnbsg a MySQLeredmnyhalmaz s a PHP-tmb kztt?

! Az egyik legnagyobb klnbsg a hozzfrsben je lentkezik. Az eredmnyhalmazbl egyszerre csak egy adatsor rhet el, mg egy tmb a dimenziknak kszn heten tbb sornyi" adatot is trolhat. Ha az eredmnyhalmazt egyTktdimenzis tmbbe rjuk, hatkonyan vgig haladhatunk az adatsorokon, anlkl, hogy jra s jra az adatbzis-kiszolglhoz kellene fordulnunk egy-egy so rrt. Nagy mret adathalmazok esetben persze ez nem mkdik, mivel hatalmas tmbket kellene ltrehozni, de a Mismatch-vlemnyek esetlx?n a tmbk soha nem lesznek nagyobbak a rendszerbe felvett tmk szmnl.

! Nem kell tovbbra is megszmllnunk, hogy hny ellenttes vlemny szletett egy-egy kategriban ahhoz, hogy ltrehozzuk az oszlopdiagramot?

! De igen. Az ellenttes vlemnyt kivlt tmk kate griibl ltrehozott tmb nmagban nem elg. Ne feledd, hogy a Mismatch oszlopdiagramjnak oszlopaival egy-egy ellentteket tartalmaz kategrit szeretnnk br zolni, ahol az oszlop magassga mulatja, hogy hny ellen ttes vlaszt kaptunk az adott kategriban. Ehhez meg kell szmolni az ellenttes vlemnyeket az egyes kateg rikban. Valsznleg rdemes visszalpni egy lpst, hogy kidolgozzuk az ltalnos tmadsi tervet...

638

11. fejezet

Az adatok megjelentse... s mg annl is tbb!

Az oszlopdiagram felptsnek megtervezse


Az ellentteket tartalmaz kategrik tm bje mr megvan, s egy csom nagyszer tlettel is rendelkeznk arra nzve, hogy miknt hasznljuk fel azt a My Mismatch oldalon az oszlopdiagram ellltsra - de ltalnos tervet mg nem dolgoztunk ki. Nos, az oszlopdiagram dinamikus ellltshoz csak hrom lpsre van szk sg, s az egyiket mr el is vgeztk.

e Az ollonttokot tartalmaz kategrik novnok kiolvassa


a M ismatch adatbzis lekrdezsvel. o Q Az egyes kategrikban tallhat ellenttek szmnak meg hatrozsa. Az oszlopdiagram megjelentse a kategrikba rendezett ellenttes vlemnyek szma alapjn.

Ez a lps az ellentteket tartalmaz kategrik listjt eredmnyezi.

A kategrik listjt szmszer kategriarikekk kell alaktanunk. Ha a kategrik szmszer r tke megvan, jhet a szra koztat rsz: az oszlopdiagram megrajzolsa a 6 D knyvtr fggvnyeinek segtsgvel.

A terv 2. lpsnek vgrehajtshoz valahogy t kell alaktanunk az ellentteket tartalmaz kategrik listjt szmszer kategriart kekk, vagyis meg kell szmolnunk, hogy az egyes kategrik hny szor szerepelnek az ellentteket tartalmaz kategrik tmbjben. Ha mg emlkszel r. egy oszlopdiagram feltltshez pontosan ilyen adatok szksgesek - a kategrikbl lesznek a fejlcek, s az egyes kategrik elfordulsainak szmbl az oszlopok rtkei. A kategrikat s az elfordulsuk szmt egy ktdimenzis tmb segtsgvel foglalhatjuk egyetlen adatszerkezetbe.
,T A p p e a ra n c e Entertainm ent Food People 5
S* 1

3
A A

Elforgats!

Ha az j kategriatmbt m sik szgbl nzzk, lthatjuk, hogy miknt tltik fel az adatok az oszlopdiagramot.

2
1 5

A ctivities

/
Ez a tmb az egyes kateg rik neveit tartalmazza, az zal egytt, hogy hny ellen ttet tartalmaznak. Az ellentteket tartalmaz kategrik j adatai ponto san azok, amelyekre az osz lopdiagramhoz szksg van.

0) o> (/> >* C <D -X '<U >

1 Jt

K i

Miutn a kategriartkek tmbjt felptettk, kszen llunk a 3- lpsre, hogy nhny GD-fggvny segtsgvel tnylegesen elksztsk az oszlopdiagram kpelemeit.
most itt vagy 6 3 9

egy kis tm bm atem atika

A kategrik megrgsa
A feladat most az, hogy a kategrik tm bjbl ltrehozzuk a fejlcek s rtkek ktdimenzis tmbjt. Az ellentteket tar talmaz kategrikat a $categories tmbben troljuk. Egy j, $category_total s nev tmbt kell ltrehoznunk, amely ka tegrinknt egy-egy bejegyzst tartalmaz, mellettk pedig az adott kategriban tallhat ellenttek szmt.

Innen kell e lju tn u n k ...


/ p p e a rq n ce \ I A

Egy kategria elfordulsainak szma a $categories tmbben sszegzett szmrtkknt jele nik meg a $eategory_totals tmbben.

$category_totals
$catego ries

Agytorna
Hogyan sszegeznd a $ c a t.e g o ri e s tmbben tallha t. ellentteket tartalmaz kategrikat a ktdimenzis $category_tot.als tmb felptshez?

640 11. fejezet

Az adatok megjelentse... s mg annl is tbb!

A kategrik sszegzse
Az ellenttprokat ad kategrik egydimenzis tmbjtl eljutni a kategrikat sszegz ktdimenzis tmbig egy kicsit nehezebb, mint amilyennek elsre tnhet, ezrt nem rt, ha a megoldst elbb lkd (pszeudokd") formjban dolgozod ki, mieltt valdi PHPkdot rnl. Az lkd felszabadt a nyelvtani ktttsgek all, s lehetv teszi, hogy a konkrt kdolsi megolds mgtti alapelvekre sszpontosts.

j, ktdimenzis tmb ltrehozsa a kategriartkek trolsra, az els elembe az els kategri t s a 0 rtket helyezve. Az ellentteket tartalmaz kategrik tmbjnek bejrsa egy ciklussal. A tmb minden egyes kategrijnak esetben... Az sszegzett kategriatmbben az utols elem ms kategria, m int az aktulis ellenttkategria? Igen! Akkor ez j kategria, ezrt az sszegzett kategriatmbhz adjuk, s a szmlljt a 0 rtkre lltjuk. Nem! Akkor ez az aktulis kategria egy jabb pldnya, ezrt nveljk az sszegzett ka tegriatm b utols elemnek szmlljt.

A fenti kd az sszegzett kategrik ktdimenzis tmbjt eredmnyezi, amelyben a f tmb egyetlen kategrit trol, mg az egyes altmbk egy-egy kategria nevt s rtkt.

Fordtsd le a fenti lkdot, s egsztsd ki a Mismatch kategriaadatait trol ktdi menzis $ c a t e g o r y _ t o t a l s tmbt felpt valdi PHP-kdot!

Gyakorlat

$category_totals = array(array($mismatch_categories[0], 0))/ foreach ($mismatch_categories as $category) (

m ost it t vagy 641

Gyakorlat - megolds

Fordtsd le a fenti lkdot, s egsztsd ki a Mismatch kategriaadatait trol ktdi menzis $ c a t .e g o r y _ t o t a ls tmbt felpt valdi PHP-kdot!

A tmbelemek sorszmozsa 0-tl dl, ezrt a tmb utols eleme mindig count{) mnusz egy.
$ c a t e g o r y _ t o t a l s = a r r a y ( a r r a y ( $ m is m a tc h _ c a te g o r ie s [ 0 ] , fo r e a c h i-f ($m isru iatch _categ o ries as $ c a t e a qrv) 0));
J

- 1301 / fatejory) {

a ^a y^u sh (/d a c 3ory_jbo-taU, a rra y ^a te jo ry , /)); Ez egy j kategria, ezrt " i ............................................................................ ^ ........ az sszegzett kategriatmbhz ......................................................................................................... adjuk mint j altmbt, amely . ............................................................................................... a kategria nevt s az 1 kezdfd a ^ 3ory_^^lsC tcK nt(f;a {z 5c^y_-fcotals) - IJCIJ++; rtket tartalmazza.

...1...........................................................................................^TTTT: A nvel mvelet ( + + ) j az s/tmb msodik elemre $ c a te g o r y _ to ta ls vonatkozik, amely a kateg ria szmllja (rtke). A $category_totals vlto zban most pontosan azok A p p e a ra n ce az adatok vannak, amelyek Entertainm ent re szksg van az ellent teket tartalmaz kategri kat brzol oszlopdiagram Activities ltrehozshoz.
Ez a fenti kd vgeredmnye

Ezt a lpst nyugodtan ki hzhatjuk a listrl, gy mr csak az oszlopdiagram meg rajzolsa van htrny

Az ogyos kategrikban t allhat ellenttek sz mnak meghatrozsa.

642 11. fejezet

Az adatok megjelentse ... s mg annl is tbb!

Nincsenek

hlye krdsek
li trtnik a kategriasszegz kddal, ha a grik nincsenek sorrendben?
$ m i s m a t c h _ c a t e g o r i e s

tmbben lev kate

Az bizony nagy gondot okozna. A kd teljes mrtkben arra tmaszkodik, hogy a $inismatch__categories tmbben lev kategrik sorrendben vannak. Ez abbl derl ki, hogy a kd felttelezi, hogy brmilyen kategriavlts j kategria nyitst ignyli, ami azonban csak addig mkdik, amg a kategrik csoportostva vannak. Szerencsre a krdv parancsfjljban lev lekrdezs, amely eredetileg kivlasztja a $mismatch_response tblba beszrand tmkat, elg intelligens ahhoz, hogy a vlem nyeket kategria szerint rendezze:

SELECT topic_id FROM mismatch_topic ORDER BY category_id, topic_id


Elszr ez a lekrdezs olvassa ki a tmkat az adatbzisbl s szrja be azokat res vlaszokknt az adott felhasznl szmra. Ez biztostja, hogy a felhasznl v lemnyei kategria szerint rendezve troldjanak az adatbzisban, s ez teszi lehe tv a kategriasszegz kd megfelel mkdst.

! Nem kockzatos olyan kdot rni, ami egy adatbzis-tblban trolt adatok sorrendjre tmasz kodik?
Igen is, meg nem is. Ne feledd, hogy ezt az adatbzist teljes m rtkben az ltalad n parancsfjl kdja vezrli, teht az adatok sorrendje csak akkor vltozik, ha olyan pa rancskdol rsz, ami mdostja a sorrendet. Ettl fggetlenl lehet rvelni amellett, hogy My Mismatch parancsfjlban lev sszekapcsol lekrdezsben mindenkp pen kategria szerinti rendezst kell alkalmazni, hogy' teljesen biztosak lehessnk benne, hogy az ellenttkategrik listja helyes sorrendbe kerl.

most itt vagy > 6 4 3

oszlopdiagramok rajzolsa

Az oszlopdiagramok alapjai
Most, hogy van egy vadonatj ktdimenzis tmbd az ellenttkategrik adataival, ami Kaikat get a zsebedbe, ideje rtrni az oszlopdiagram megrajzolsra. Ahelyett azonban, hogy egy ki fejezetten a Mismatch alkalmazshoz kszlt oszlopdiagramot rajzolnl, mirt ne alkalmaznl egy ltalnosabb megkzeltst? Ha egy minden clnak megfelel oszlopdiagram-rajzol fgg vnyt rsz, nem csak a Mismatch alkalmazsban hasznlhatod azt, hanem ksbb is, amikor csak szksg van r. Ms szavakkal. rj jrahasznosthat fggvnyt! Az j fggvnynek a kvet kez lpsek sorozatt kell vgrehajtania, hogy kpes legyen oszlopdiagramot ellltani egy ktdimenzis adattmbbl:

A kp ltrehozsa. A grafika s a szveg kirajzolshoz hasznland sznek belltsa A httr kitltse egy httrsznnel. Az oszlopok s a fejlcek megrajzolsa. Tglalap rajzolsa a teljes oszlopdiagram kr. A skla (az rtktartomny) megrajzolsa a diagram bal oldaln. Az oszlopdiagram kpfjlba rsa. Kitakarts a kp megsemmistsvel.
Minden oszlop rtknek a megadott tartomnyon bellre kell esnie a fgg vny meghvsakor.

V'alue Z Value l l/alue I


Tartomny

r /

Az egyes oszlopok szles sgt s az oszlopok k ztti tvolsgot az oszlop diagram teljes szlessge s az oszlopok szma alap jn kell kiszmtani.

"O

<> r

c-4 <r> c

co
CT)

Az oszlopok szmt az adattmb hossza hatrozza meg.

m ym ism atchgraph png

644 71. fejezet

Az adatok megjelentse... s mg annl is tbb! P l J P _ |V )d/)npC p|/ ^ ^^smatc^ parancsfjl teht egy j, draw _bar_graph () ney V fggvnnyel bvl, amelynek a feladata egy oszlopdiagram meg l^ rajzolsa a neki tadott szlessg s magassg, a diagramon brzoland adatokat tartalmaz ktdimen zis tmb, az rtktartomny maximlis rtke, illetve az eredmnyknt ellltand PNG kpfjl neve alapjn. Ptold a GD knyvtr rajzolfggvnyeinek hinyz hvsait a htmgnesek segtsgvel!

f a n c t io n draw _bar_graph ($w id th / $ h e ig h t, S d a ta , $m ax_value, $ iien am e)

// Az res diagramrajz ltrehozsa


$ i m g - ............................................................................... ( S w i d t h , S h e i g h t ) ;

// Fehr httr-, rekesze szveg- s szrke rajzolszin belltsa


$bg c o l o r = $text $bar r.o lo r = color = (Sirag, 2 5 5 , 2 5 5 , 2 5 5 ) ; ($im g, 2 5 5 , 2 5 5 , 2 5 5 ) ; ( $ ifiig, 0 , 0 , 0 ) ;

// fehr
// f e h r // f e k e t e // v i l g o s szrke

$b o rd er_color =

($im q, 1 9 2 , 1 9 2 , 1 9 2 ) ;

// A httr kitltse
($im g, 0 , 0, Sw id th , $ h e i g h t , $ b g _ c o l o r ) ; // Az o s z l o p o k m e g r a j z o l s a $ b a r _ w i d t h *= $ w i d t n / ( ( c o u n t ( $ a a t a ) * 2 ) f r ( $ i - 0 ; 1 < c o u n t ( $ d a t a ) ; $i++) ............................................................................... ( $ i m g ,

i 1);

( $ i * $ b a r _ w i d t h * 2) + $ b a r _ w i d t h , $ h e i g h t , ( (S h e ig h t / $m ax_value) * $ d a t a [ $ i j

( $ i * $ b a r _ w i d t h * 2) + ( $ b a r _ w i d t h * 2) , $ h e i g h t .................... ( $ im.g, 5 , $text_color) ;

Hl ) , $b ar_co lo r);

( $ i * $ b a r _ w i d t h - 2) + ( $ b a r _ w i d t h ) , S h e i g h t - 5 , $ d a t a . ; $ i ] L 0 ] ,

}
// Tglalap rajzolsa az egsz diagram kr
($ im g , 0 , 0 , $ w i d t h - 1 , $ h e i g h t - 1 , $ b c r d e r _ c o i o r ) ;

// A skla megrajzolsa a diagram bal oldaln


fer ( $ i- l; $i $m ax_vaiue; $i++) { ($ i * ($ h e ig h t / $m ax_vaiue)) , $ i , $ b a r _ c o lo r ) ; ($im g, 5 , 0 , S h e i g h t -

}
//A diagram kpfjlba rsa
( $ i m g , $ f i l e n a m e , 5) ; ($im g);

i m a g e f i 1 1 e d r e c t a n g l e

PHP-mgnesek - megolds

A My Mismatch parancsfjl teht egy j, draw _bar_graph () nev fggvnnyel bvl, amelynek a fel adata egy oszlopdiagram megrajzolsa a neki tadott szlessg s magassg, a diagramon brzoland adatokat tartalmaz ktdimenzis tmb, az rtktartomny maximlis rtke, illetve az eredmnyknt el lltand PNG kpjl neve alapjn. Ptold a GD knyvtr rajzolfggvnyeinek hinyz hvsait a htmgnesek segtsgvel!

PHP-mgnesek - megolds

function draw bar_graph ($width, $height, $data, $inax_value, .filename) { , // Create the empty graph image ^ _______________ ______ ElSZf ltrehozunk egy , res j $img | //set a $bg color = imagecreatetruecolor |($width, $height); text and gray graphics imagecolorallocate l ( $img, 255, 255, 255);
$ irag, 2 5 5 , 2 5 5 , 2 5 5 ) ; ;$ img , 0 , 0 , 0 ) ;
II

kpet, amelyre rajzolhatunk.


//white wmte ^ Meghatrozunk nhny

\ f sznt, amelyeket az osz' \ lopdiagram egyes rszein \ fogunk hasznlni.


)

* k ($im g, 1 9 2 , 1 9 2 , 192)

//light gray

//

F i l l th e background
i m a g e f i l l e d r e c t a n g l e

------ Trljk a htteret, hogy elksztsk az oszlopdiagram grafikjhoz.


0, 0, $width, $height, $bg_color);

V s i m g ,

to r ($i o ; $ i < count ($ a a ta );


(5 I
i m a g e s t r i n g u p

" . S

/ | | 1 ( W ,L .| . ! ,

(alapknt rajzoljuk meg.

kifl,8H %

imagefilledrec tangle l $ r . , ($i * $bar width * 2 + $bar_width, $height, (irg )


* 2) , S h e i g h t - ( ( S h e i g h t / $ m a x _ v a iu e ) * $ d a t a L $ i l [1 ] ) , $ b a r _ c o l o r ) |(Siir.g, 5 , <$i $ b a r _ w i d l h * 2) + < $ b a r _ w i d t h ) , $ h e i g h t - 5 , $ d a t a r $ i ] [ 0 1 ,

; t e P i l! l T P , w ^

Az oszlopok fejlct fgglegesen tjolt


szveges karakterlncknt rajzoljuk meg.

// Draw a r e c t a n g l e a r o u n d t h e w h o l e t h i n g
i m a g e r e c t a n g l e | (5img, 0, 0, $ w i d t h - 1, S h e i g h t - 1, $ b o r d e r _ c o l o r ) ;

leit side of the g r a ^ ^ -

Tglalapot rajzolunk a teljes oszlopdiagram kr.

f o r ( $ i 1 ; $ i <= $ m a x _ v a l u e ; $ i + + )

{ ( $ i * ($height. / $m ax_va.ue) ) , $ i , $ b a r _ e o lo r ) ;

}
//

imagestring I KmmmmmmmmmmJf ---------------------- Az osziopdiagram bal oldalra norml, vzw r i t e t h e g r a ph image t o a f i l e im agep ng f c ( $ i m g , $ f i l e n a m e , 5) ;

---------------------------------L{ $ i m g , 5 , 0 , $ h e i g h t -

szintes Vgknt felrajzoljuk a sklt.

i l ^ S t o n k . ( $im 9) ;

A kpet egy

PNG fjlba

rjuk a megadott f jl-

_ \ __ A memribl takaritasA
kppen trljk a kpet. \

nvvel s 5-s (kzepes) tmrtsi szinttel.

A kiszolgl azon mappjnak, ahov a f jlt rjuk, rhatnak kell lennie ahhoz, hogy ez a fggvny mkdjn.

646 17. fejezet

Az adatok megjelentse... s mg annl is tbb!

Nincsenek

hlye krdsek ,
Ki V
Mirt rja a ( ) fggvny fjlba az osz lopdiagramot ahelyett, hogy egyszeren kzvetlenl tadn a bngsznek?

draw _bar_graph

Azrt, mert a fggvny nem nll parancsfjlban tallhat, amely egy fejlcen keresztl visszadhatna egy k pet a bngsznek. Ne feledd, hogy az egyetlen md arra, hogy kzvetlenl a bngsznek adjunk vissza egy dinamikusan ellltott kpet. az. ha egy fejlcet hasznlunk egy parancsfjlban. ami azt jelenti, hogy a parancsfjl egyetlen cljnak a kp ellltsnak kell lennie.

! Egy fggvnyt ltalban j tlet kln parancsfjlba tenni, hogy jrahasznosthat legyen, de egy problma tovbbra is addik, amikor a kpet egy fejlcen keresztl t szeretnnk adni a bngsznek. A problma abbl ered, ahogy a kdokat jrahasznostjuk: amikor egy parancsfjlba beemelnk valamilyen kdot az include, az include_once, a require vagy a require_once utastssal, a kd gy kerl be a parancsfjlba, mintha min dig is ott lett volna. Ez az olyan kdok esetben tkletesen

I Akkor mirt nem tesszk nll parancsfjlba a ( ) fggvnyt, hogy az oszlopdiagram kpt egy fejlccel kzvetlenl tadhassuk a bngsznek?

draw _bar_graph

megfelel, amelyek semmi olyasmit nem csinlnak, ami a bn gsz mkdsvel kapcsolatos, de egy fejlc elkldse ha tssal van a parancsfjl kimenetre, ami a beemelt kdoknl gondot okozhat. Nem arrl van sz, hogy beemelt kdbl nem lehet fejlcet kldeni, hiszen a korbbi pldkban mi is csinltunk ilyesmit, csak ppen nagyon vatosnak kell lenni, s egyes esetekben nem ttelezhetjk fel teljes bizonyossggal. hogy mg nem trtnt fejlcklds. A My Mismatch pa rancsfjl pldul nem kpes kpet visszaadni a bngsznek. mert a feladata az ellenttprosts eredmnyt tartalmaz HTML-kd kirsa. Ha olyan parancskdot emelnk be ebbe a parancsfjlba, amely egy kp dinamikus ellltsrl s visszaadsrl gondoskodik, fejlctkzs lesz az eredmny.

gy van. s a captcha .php parancsfjlra kzvetlenl egy <img> elem src jellemzjbl hivatkoztunk. Itt azonban az a gond, hogy az oszlopdiagram-rajzol kdnak sok-sok adatot kell tadnunk, ami GET vagy POST segtsg vel igen krlmnyes lehet.

V:

K i ! Ok, teht csak hivatkozhatok az oszlopdiagram-rajzol kdra, ahogy a Guitar Wars parancsfjljval is tet tk. Az jl mkdtt beemels nlkl is, igaz?

captcha.p p h

Az oszlopdiagram megrajzolsa s megjelentse


A draw _bar_graph () fggvny lehetv teszi az oszlopdiagram kpnek dinamikus ellltst, feltve, hogy meg felel informcikkal ltjuk el. A Mismatch oszlopdiagramjnak esetben meg kell adnunk egy olyan szlessget s magassgot, ami mkdik a My Mismatch oldalon (480x240). az ellenttkategrikat tartalmaz ktdimenzis adat tmbt, az rtktartomny legnagyobb rtkeknt (teht az ellenttes vlemnyt kivlt tmk kategrinknti maxi mlis szmaknt) 5-t, valamint egy rvnyes feltltsi tvonalat s fjlnevet az eredmnyknt kapott oszlopdiagram szmra. A fggvny meghvsa utn ltrejn a kp, s megjelenthetv vlik egy <img> HTML-elem segtsgvel:
Ezzel a fiiggvnyhvassal ltrehozott kpfjl neve mymismatehgraph.png,

echo '< h 4 > M i s m a t c h e d category breakdovm:</h4>1;


: raw_b*:_gr apn (480, 240, $c v.:.. 1<img . ' . MM_ .

s a webkiszolgln az M _U M PL0A PA elrsi ton troldik. D TH


V ________________________________

sAs^ 5, MMJJ fLOADFATH .

raph,

1);

pnq" alt="Mismatch catec Az < im g > elem sre jellemz jben ugyanazt az elrsi utat s kpfjlnevet adjuk meg.

Egy jrahasznosthat fggvny segts gvel egy adatbzis adataibl kpfjlban trolt oszlopdiagram kszthet.

)Ol \\io \o t
OOI li

toiom
mymismatchgraph.png

m o st i t t vagy 6 4 7

a m ism atch alkalmazs tesztelse - ezttal oszlopdiagrammal

rd meg a My Mismatch parancsfjlt s prbld ki!


Hozz ltre egy j szvegfjlt mymismatch.php nven, s rd bele a iMy Mismatch parancsfjl kdjt (vagy tltsd le a parancsfjlt a Mead First Labs webhelyrl, a w w w .h ead firstlabs.com / book s/ h fp h p cmrl). Ezen kvl adj egy j menelemet is a navmenu. php parancsfjlban a My Mismatch hivatkozs szmra. Tltsd fel a parancsfjlokat a webkiszolgldra. s nyisd meg a Mismatch alkalmazs foldalt (in d e x .p h p ) egy w ebbngszben. Jelentkezz be, ha mg nem tetted volna meg. s kattints a My Mismatch hivatkozsra a f navigcis menben. Gratullunk, megvan az idelis ellenttprod!
^ OO j M atch ism ^
N *. M * b e a z t i t m l
a

'y
\

Mismatch My Mismatch

________________________ (

Hoint, mVlcu prr-fic Profile Qucatgaaft^* ------------------------- h og y J a s o n az Igazi.

LqsI m

kpi k a te g ria b o n t s b l m r l t o m , ) S

Jason Finingtoo
Hollywood, C A

N .

g\

Q
q

A tmkat tblzatba rendeztk, hogy helyet csinljunk az oszlopdi agramnak.


Mismatched c3Wgor> breakdown

Az oszlopdiagram remekl illik a My Mismatch oldalra az ellenttes vle mnyeket kivlt t mk listja mell.
C p rig t C M alchE n ,In o y h 200& itm etctp aM c

Az oszlopiagram mogjolontso a kategrikba rondozott ollonttos -vlemnyek szma alapjn.

648 77. fejezet

Az adatok megjelentse... s mg annl is tbb!

K v n csi vagyok: h og ya n t r o lh a tju k a M y M is m a tc h o s z lo p d ia g ra m k p t e g y e tle n f jlb a n , a m ik o r m inden fe lh a s z n ld s z m ra egyedi kp j n l tre ?

Kis szerencsnk volt, ennyi az egsz.


Egy adott pillanatban csak egyetlen kp ltezik az oszlopdiagramrl, fggetle nl attl, hogy hny felhasznlnk van. Ez akkor jelenthetne gondot, ha kt felhasznl pontosan ugyanakkor szeretn megtekinteni a My Mismatch oldalt, mert ekkor azt kockztatnnk, hogy kt klnbz kpet lltunk el a sz mukra, majd ezeket egyetlen kpfjlba prbljuk rni. A valsgban ez a problma meglehetsen ritkn jelentkezne, de ahogy a Mismatch oldal npszersge n, s felhasznlk ezrei csatlakoznak hozz, jelentss vlhat. Maga az a tny, hogy a felhasznlk mindegyike gy gondol az oszlopdiagramra, mint a sajtjra, jelzi, hogy az egyetlen diagramrajzot hasz nl felptsnek vannak gyenge pontjai.
KkmkH Ml

Itt vilgos, hogy a felhasznlk hrom klnbz' oszlopdiagram-rajzot lt nak, de mi tudjuk, hogy a trolsukra csak egyetlen kpfjlt hasznlunk.

H0*

v * ..r 2 ^

-****-*-1 *

L
O**=S w *
I W '

t *t T >JM lA

< u * .r* W

55

****>

m ym ism atchgraph.png
v.r,.

Ka,.
J^OTV V *......... ......

B> a ttp i pv

m jsw Ym u i M h m >

t* i>*ca>

A My Mismatch alkalmazs oszlopdiagramjt trol m e tlm kpet minden fel hasznl esetben jra s jra ltrehozzuk.

^ w8 1

ru * i*

C 4iw # w
WO***

Aqytorna
Hogyan mdostand a Mismatch alkalmazs kdjt, hogy a felhasznlk biztosan ne ugyan azon az oszlopdiagram-kpen osztozzanak?

Vw k

most itt vagy 649

k l n oszlopdiagram ot m inden felhasznlnak!

Kln oszlopdiagramot mindenkinek!


A megosztott oszlopdiagram-kpfjl problmjra a megoldsi tbb kp - minden felhasznl szmra e g y -e g y - ltrehozsa jelenti. Azt azonban biztostanunk kell, hogy mindegyik kp csak egyetlen felhasznlhoz kapcsoldjon. Ebben segt az adatbzisok egy mr ismers ele me: az elsdleges kulcs. A mismatch_user tbla elsdleges kulcsa, a user_id, egyedileg azo nost minden felhasznlt, ezrt kivlan alkalmas arra, hogy egyedi nevet adjunk az egyes oszlopdiagram-kpeknek, s egyben egy felhasznlhoz kssk ket. Csak annyit kell ten nnk. hogy a felhasznlk azonostjt a hozzjuk tartoz oszlopdiagram-kpfjlok nevnek elejhez fzzk.

A u s e rjd oszlop a felhasznlk tbljban az elsdleges kulcs szerept tlti be.

112121111 %
m a tc b g r a p h .p n

nevii

12o20b. 676o66.

Egyetlen oszlopdiagramkpfjl az sszes fel- __ hasznai szmra hossz tvon egyszeren nem jelent j megoldst.

sdaniels

1K915.. 53o56a

o klug m a n be fita c

dfOOf3. 7 c l9 d d 3dq70c.

1001 ( 11010 OOIOl IOIOII


13-m ym ism atchgraph.png

d ie rd re

08447b 230dcb. e5Ud7. 062e4a b 4 f2 8 3

m le d be tte r o w en b

0 4 fc 2 a 36be76

IOOI U
n to io c OOIOiC

Ha minden felhasznlnak sajt oszlopdiagram-kpet adunk, nem kell egyetlen kpfjlt megoszta nunk az egsz alkalmazsban.

liom
m ism atchgraph.png

Az egyedisget gy biztostjuk, hogy a felhasznlk tbljnak u s e rjd oszlopban szerepl rt ket az adott felhasznlhoz tartoz oszlopdiagram-kpfjl nevnek ele jhez fzzk.

IOOI l m o io o o io h IOIOII
16-m ym ism atchgraph.png

650 11. fejezet

Az adatok megjelentse... s mg annl is tbb!

Nincsenek

hlye krdsek
K

! Van valamilyen elnye a PNG formtum dinamikusan elllto tt kpeknek a GIF vagy JPEG kpekkel szemben?

! Nincs, legalbbis azon fell, ami a statikus kpek ese tben a klnbz kpformtumokra rvnyes. A GIF s a PNG formtum pldul alkalmasabb a vektoros grafikk hoz, mg a JPEG a fotrealisztikus kpekhez illik jobban. A Mismatch alkalmazsban vektorgrafikkkal dolgozunk, ezrt a PNG s a GIF is megfelel. A PNG az jabb kpszab vny, ezrt ezt hasznltuk, de a GIF is mkdtt volna. Ha egy GD-kpet GIF vagy JPEG formtumban szeretnl lt rehozni. az im a g e g i f { ) , illetve az im a g e j p e g () fgg vnyt kell meghvnod.

A tmrtsi szint belltsa az im ag ep n g () fgg vnyben akkor lp a kpbe, amikor fjlba rsz egy PNG kpet, s a szint 0-tl (nincs tmrts) 9-ig (legnagyobb t mrts) terjedhet. Nincsenek kbe vsett szablyok arra nz ve, hogy mikor milyen mrtk tmrtst kell alkalmazni, ezrt rdemes ksrletezni a klnfle belltsokkal. A Mismatch alkalmazsban az oszlopdiagramra 5-s szint tmrtst lltottunk be, ami j kompromisszumnak tnik a minsg s a mrethatkonysg kztt.

. Honnan tudhatom, hogy milyen tmrtsi szintet kell hasznlnom, amikor fjlba rok egy PNG kpet?

! Nem igazn. Ez a krds bizonyos fokig kapcsoldik a tmrtsi szinttel kapcsolatos elz krdshez, de valszntlen, hogy tl sok vagy tl nagy fjlokkal terhelnd tl a kiszolglt, hacsak rlt mdon tnyleg nem risi kp fjlok ezreit hozod ltre. A plda kedvrt vedd figyelembe, hogy a Mismatch oldal oszlopdiagramjai egyenknt tlagosan 2 KB mretek, ezrt mg ha a webhely felhasznlinak sz ma 50 000-re ugrana is, az sszes kpfjl sem tenne ki tbbet 100 MB-nl. Ez persze szp darabot hast ki a webes trhely bl, de egy 50 000 felhasznlval rendelkez webhelynek elg pnzt kell keresnie ahhoz, hogy ellenslyozza a kiesett trhelyet.

. Szmolni kell a fjlok trignyvel is, amikor minden felhasznl szmra kln oszlopdiagram-fjlt hozunk ltre?

Gyakorlat

Albb lthatod azt a Mismatch-kdot, amelyik dinamikusan ltrehozza az oszlopdiagram kpfjljt, majd megjelenti a kpet az oldalon. rd t a kdot gy, hogy minden felhasz nl szmra egyedi kpfjlt lltson el! Tipp: az egyedi kpfjlnevek felptshez hasznld a $_SESSI0N[ 'user_id' ] utastst.

e c h o < h 4 > M is m a tc h e d c a t e g o r y b r e a k d o w n : </h4> f ; d r a w _ b a r g r a p h ( 4 8 0 , 2 4 0 , $ c a t e g o r y _ t o t a l s , 5 , MM_UPLOAD PA7K . ' m y m i s m a t c h g r a p h . p n g ) ; echo '< in g s r c = " ' . MMJJPLOADPATH . ' m y m i s m a t c h g r a p h . p n g a l t = M i s m a t c h c a t e g o r y g r a p h / > < b r / > ' ;

m ost it t vagy 651

Gyakorlat - megolds

Gyakorlat - megolds

Albb lthatod azt a Mismatch-kdot, amelyik dinamikusan ltrehozza az oszlopdi agram kpfjljt, majd megjelenti a kpet az oldalon. rd t a kdot gy, hogy min den felhasznl szmra egyedi kpfjlt lltson el! Tipp: az egyedi kpfjlnevek felptshez hasznld a $_SESSI0N [ ' u s e r _ i d 1 utastst.

e c h o '< h4> M ism atched c a t e g o r y breakdow n:</ h4> * ; d r a w b a r _ g r p f i ( 4 8 0 , 2 4 0 , $ c a t e g o r y _ t o t a l s , 5 , MM_UPLOADPATH . ' m y m i s m a t c h g r a p h . p n g 1 ) ; e c h o ' < i m c : s r c = ,M . MM_UPLOADPATH . m y m i s m a t c h g r a p h . p n g M a l t = M i s m a t c h c a t e g o r y g r a p h " / > < b r / > ' ; M

Tovbbra is a szabvnyos fjl- ^ Gondoskodj rla, hogy ez a mappa feltltsi tvonalat hasznljuk frhat legyen a kiszolgln, hogy annak biztostsra, hogy belerhasd a kpfjlt, a kp trolsa a kvnt helyen . * . tortenjen a kiszolgln.
ttV o

Az egyedi kpfjlnv az x-mymismatchqraph.png r J r s r pj formt kveti, ahol az x a felhasznl azonositoja.

daiejory breakdow*v<A^V;

dv-aw_bav-_3raj>K(^, 2A O , j te gry_ W ak 5,

/VI/VIJXPLOADPATti . /_SE^IONfuser_jcTJ . a ltsw A1ismaUK ate^ovy /><bv />;j

);

cdho '<"*3 srt~ }>>. /VI/VMXPLOADPATH . f_SESS|0KCWr_id,3 . '-mYmismadhyraphp^

Felhasznlhatod a felhasznl azonostjt, amelyet mr elraktroztunk egy munkamenet-vltozban.

A HTML-kdban az oszlopdiagram kpnek megjelentsrl gondoskod < im g > elem src jellemzijnek belltsakor ugyanazt a kpfjlnevet hasznljuk.

Tesztt
Mdostsd a My Mismatch parancsfjlt, hogy egyedi oszlopdiagram-kpfjlokat hozzon ltre!
Mdostsd a My Mismatch parancsfjlt gy, hogy egyedi oszlopdiagram-kpfjlokat hozzon ltre minden felhasznl szmra. Tltsd fel a mymismatch.php parancsfjlt a webkiszolgldra, majd nyisd meg a bngszdben. Az oldal nem fog mskpp kinzni, de ha megnzed az oldal forr st. lthatod, hogy az oszlopdiagramhoz most egyedi kpfjlnv tartozik.

652 71. fejezet

Az adatok megjelentse... s mg annl is tbb!

A Mismatch felhasznli cspik az oszlopdiagramokat


Most, hogy a megosztott oszlopdiagram-kpfjlok problmjt meg oldottad, sikerlt elhrtanod egy szk keresztmetszetet a teljest mny tern, ami hossz tvon jelentkezhetett volna, ahogy egyre tbb felhasznl csatlakozik a Mismatch oldalhoz, hogy megtekintse az ellenkezs t szintjnek" diagramjt. Most mr minden felhaszn l sajt, egyedi diagramfjlt kap, amikor megtekinti az idelis ellen ttprjt. A javts szerencsre a sznfalak ioo\ mgtt trtnt, a felhasznlk tudtn 1110(0 kvl, akiknek gy nincs ms gondja, ooioi mint hogy megkeressk letk prjt. loioni
1 3-m ym ism atchgraph.png

Elmer nhny tnclpst tkletest, hogy ne vall jon szgyent az idelis ellenttprjval.

looi llllO ooiocA

jjJ

Most mr minden felhasznl oszlopdiagramja nll fjlban troldik.


100) u \i\o\oc 00IOU
[l lO lll

C tf*cacao .

V **

5-m ym ism atchgraph .png

Ethelnek ugyan van nmi ktsge az ellenttek vonzzk egymst" elv mukdkpessgt illeten, de hajland tenni egy prbt.

1 6- my mismatchgraph .png

Owen mr meg is beszlt egy tallkozt az ellentt prjval, s most kszl a nagy randira.

OJ -a
Vl.-sr*

txrw. v*oJCi

V k

tnp

HTttC

m ost it t vagy

653

PHP b MySQL szerszm oslda

PHP & MySQL szerszmoslda


A dinamikus kpek olyan rdekes PHP-parancsfjlok felptsre nyjtanak lehetsget, amelyek menet kzben hoznak ltre egyedi kpeket. Ismteljk t a mindezt lehetv tev elemeket:

imagecreatetruecolor( )
Ez a fggvny is a GD grafikai knyvtr rsze, s arra hasznlhatod, hogy egy j kpet hozz ltre, amely re rajzolhatsz. A kp kezdetben csak a memriban ltezik, s addig nem kerl a kimenetre (vagyis nem vlik m egjelenthetv), amg meg nem hvtad a megfelel fggvnyt, pld ul az imagepng (} -t.

CAPTCHA
Program, amely az automatizlt reklmrobotoktl vd egy webhelyei valamilyen ellenrz teszttel. Egy CAPTCHA-teszt pl dul llhat abbl, hogy egy eltor ztott jelsz betit kell berni, egy kp tartalmt kell azonostani, vagy egy egyenletet kell felismer ni egy egyszer matematikai sz mts vgrehajtshoz.

6D knyvtr
PHP-fggvnyek gyjtem nye, amelyekkel egy kpre rajzolhatunk. A GD knyvtr lehetv teszi, hogy dinami kusan hozz ltre kpeket, s rajzolj rjuk, majd vagy kz vetlenl tadd azokat a bn gsznek, vagy kpfjlokba rd ket a kiszolgln.

imagestring(), imagestringup(), imagegettftext( )


A GD grafikai knyvtr szveg raj zolst is lehetv teszi, akr egy beptett, alaprtelmezett bett pussal, akr egy tetszleges TrueType-bettpussal.

image1in(), imagerectangle (), . . .


A GD grafikai knyvtr szmos fggvnyt knl grafikai alapele mek, pldul vonalak, tglalap ok, st akr egyedi kppontok rajzolshoz. Mindegyik rajzol fggvny egy meglev kpre tud rajzolni, amelyet korbban mr ltrehoztl az imagecreatetruecolor( } fggvnnyel.

imagedestroy( ) imagepng( )
Ha elkszltl egy rajzzal, ame lyet a GD knyvtr grafikai fgg vnyeivel helyeztl el egy kpen, ezzel a fggvnnyel kldheted a kimenetre a kpet, hogy az megjelenthet legyen. A kpet elkldheted kzvetlenl a w ebbngsznek, vagy kpfjl ba rhatod a kiszolgln. Miutn egy kpre rajzoltl, s a kvnt mdon a kimenetre kldted, clszer felszabadtani az ltala lefoglalt erforrsokat. A kpet ennek a fggvnynek a meghvsval semmistheted meg.

654 17. fejezet

Az adatok megjelentse ... s mg annl is tbb!

PHP & MySQL keresztrejtvny


Amikor tnyleg jl jnne egy robot, akkor bezzeg nincs sehol. Na mindegy, bizonyra az analg agyad is megbirkzik a kihvssal, s ki tudod tlteni ezt a kis keresztrejtvnyt.

Vzszintes

Fggleges

I. Ez a PHP-rajzolfggvny egy vonalat rajzol. 2. A PHP grafikai knyvtrnak neve. . Ezzel a kpi elemmel jelentetted meg, hogy az ellenttpr 3. Ezt a fggvnyt meghvva PNG formtumban hozod ltre ok kategrinknt mennyire klnbznek, (angolul) a kpet. 7. A felhasznlnknt egyedi oszlopdiagram-kpek elllt 4. Owen idelis ellenttprja. shoz ezt az adatot hasznltad a Mismatch alkalmazsban 5. A Mismatch alkalmazs egy oszlopdiagramon mutatja be. a kp fjlnevnek rszeknt, (angolul) hogy a felhasznlk mennyire klnbznek az ... t szint 8. A Mismatch alkalmazs ilyen tpus tmbt hasznl az osz jn". (Neheztsnk: ezt is angolul) lopdiagram adatainak trolsra, (angoul) 9. gy hvjk azokat a teszteket, amelyeket arra hasznlnak, 10. Ha megadsz neki kt pontot, ez a rajzolfggvny egy hogy megklnbztessk az emberi felhasznlkat az auto tglalapot rajzol. matizlt reklmrobotoktl. I I . Ha egy szveget egy adott bettpussal szeretnl kirajzol 12. Amikor a PHP a kimenetre kld egy kpet, a kp vagy ni, az image...textO fggvnyt kell meghvnod. kzvetlenl az gyflbngszhz kerl, vg)- egy ...-bn t 13. Miutn egy kppel vgeztl, mindig ki kell takartanod roldik. (angolul) ennek a PHP-fggvnynek a meghvsval. 14. Ezt a grafikai fggvnyt kell meghvnod egy j kp ltre hozshoz.

m ost it t vagy >

655

PHP fir MySQL keresztrejtvny - megolds

PHP & MySQL keresztrejtvny - megolds

656 11. fejezet

1 2 Tartalomsugrzs s webszolgltatsok

Fellet a vilg fel


T Ez h ih e te tle n ! A h e ly e tt, V hogy krbe kellene u ta z n u n k a vil g o t, s szem lyesen m egkrdeznnk a z em be re ke t, hogy mi t r t n t velk, hzhoz s z lltj k a h re k e t... fa n ta s z tik u s ! ^ Valban az! A te c h n ik a a t in t a f o lt o s a s z ta lu n k ra te s z i a v il g o t!

A vilg risi, s ezt a te webalkalmazsaid sem hagyhatjk figyelmen kvl.


Ami pedig taln mg ennl is fontosabb: nyilvn nem szeretnd, ha a vi lg hagyn figyelmen kvl a te webal kai mazsaidat. Az egyik legkit nbb mdja annak, hogy a vilgot a webal ka Imazsaidra hangold, ha az adataidat sugrzsra alkalmass teszed, ami azt jelenti, hogy a felhasz nlk elfizethetnek a webhelyed tartalmra, gy nem kell mindig megl togatniuk a w ebhelyet, ha j informcikat szeretnnek. Az alkalmazs emellett webszolgltatsokon keresztl ms alkalmazsokkal is kapcsola tot tarthat, s msok adatait felhasznlva gazdagabb lmnyt nyjthat a felhasznlknak.

ez egy j fe je ze t

657

ju tta s d el a hreket Owen w ebhelyn t lra !

Owen mindenkivel tudatni szeretn, hogy mi trtnt Agyarral


Minden webhelynek az az egyik legnagyobb gondja, hogy miknt vegye r a ltogatit, hogy idrl idre visszatrjenek. Becsalogatni knny ket, de visszatr vendgg tenni mr sok kal nehezebb. Mg a legvonzbb tartalmat knl webhelyek is lekerlhetnek egy szrfl ra darjrl; egyszeren azrt, mert nehz szben tartani, hogy rendszeres ltogatsra lenne szk sg. Ennek tudatban Owen az rbl jtt idegenekkel kapcsolatos jelentseket ms mdon is elrhetv szeretn tenni: a jelentseket a felhasznlk asztalra" szeretn tenni, hogy ne kelljen rendszeresen vissza-visszanznik a webhelyre, hogy felkerlt-e valami j hr.
J A z idegenekkel k a p c s o - ^ la to s je le n t s e k f e n t va n n a k a w ebhelyen, d e A g y a r mg m in d ig nem k e r lt e !<1 5
First name: Last name: What b vour email address. When did happen? How long were you gone? How many did you set? Describe ihem: What did they do to you? Hnve vou seen my dog Fang
Cnevy

bctiwc'oc*in.n

loo*-06-2*
airrojt a vcek

Looking fonwd < o


Anything felse you want to add.
'Rcpr

extraterrestrials? Were you abducted? Have

seen my abducted dog, Fang?

v T oo f T o tw
2008-06-21 : Bdita Chevy
Abducted for; Alien description: almost a week Clumsy little buggers, had no rhythm. Fang spotted

2008-05-11 : Sally Jones

Az elrablsbejelent rlap kivlan mkdik, de Owen nagyobb nyil vnossgot szeretne a webhelynek.

Abducted for: Alien description: 1day green wjth ^ centaCjC!;

Fang spotted

2000-07-12 : Atf Nader


Abducted for: AJien description:
one week & was a big non-retyctablc shiny due full 0 whal / appeared to be mutated labor

Fang spotted
officials

1991-09-14 : Don Quaylc

Abducted for: Alien description: 37 seconds They looked like donkeys made out o f metal wuh some kind o f jet packs attached to them

1969-01-21 : Rick Nixon

Fang spotted yes Fang spotted

Abducted for: Alien description: nearly 4 yean; They were pasty and pandering, and not very for*.

Amita utoljra tallkoztunk Owen nej ksztett egy foldalt, amelyen meg lehet tekinteni a felhasznlk ltal be kldtt idegenszlelseket.

Owen remli, hogy ha szlesebb krben tud mst szereznek a webhelyrl, akkor jobbak lesznek az eslyei, hogy megtallja Agyart.

658 12. fejezet

Tartalomsugrzs s w ebszolgltatsok

Az idegenekkel kapcsolatos adatok eljuttatsa az emberekhez


Az idegenekkel kapcsolatos tartalom eljuttatsval a felhasznlkhoz Owen lnyegben egy virtulis csapatot pt, akik segthetnek neki a je lenlsek feldolgozsban. Minl tbben dolgoznak az gyn, annl na gyobb az eslye, hogy tbb informcira lelnek Agyarrl, s remlhet leg kidertik, hogy hol van az elrabolt eb.

Egyes levelezprogramok tm ogatjk a tartalomsugrzst (push"), s lehetv teszik, hogy a felhasznl az elektronikus levelek foga dshoz hasonl mdon jusson hozz webhelyek frisstseihez.

A webes tartalom sugr zsa a felhasznlknak hatkony mdja annak, hogy nveld egy webhely ismertsgt.

Szmos elterjedt webbngsz ugyancsak lehetv teszi a sugr zott tartalmak bngszst, ami vel gyorsan hozzjuthatnak egy webhely legfrissebb hreihez.

Owen nem igazn tudja, hogy miknt sugrozhat tar talmat a felhasznlknak, de az tlet nagyon tetszik neki.

Mg a mobileszkzk is hozzfrst nyjta nak a sugrzott tartalmakhoz, amelyek auto matikusan rkeznek, amikor egy webhelyen vltozs trtnik.

Owen idegenszlelseket feldol goz virtulis csapata remlheto'leg nvelni fogja az eslyeit, hogy megtallja Agyart.

m ost itt vagy 659

tartalomsugrzs az RSS segtsgvel

Ili/ebes tartalom sugrzsa az RSS segtsgvel


A Weben elhelyezett HTML-tartalom clja, hogy a webhelyre rkez ltogatk megte kintsk. De mi a helyzet, ha azt szeretnd, hogy a felhasznlk krs nlkl jussanak hozz az ltalad knlt w ebes tartalomhoz? Nos, ezt az RSS teszi lehetv, amely egy olyan adatformtum, amely lehetv teszi a felhasznlknak, hogy anlkl rteslje nek a tartalom vltozsrl, hogy tnylegesen el kellene ltogatniuk a webhelyedre.

Az RSS egyfajta webes megfelelje a digitlis vidergztnek (digital vide recorder, DVR).
A DVR-ek lehetv teszik, hogy elfizess (subscribe) bizonyos tvsorozatokra, amelyeknek aztn adskor minden epizdjt rgztik. Mirt vltogatnd a csatorn kat, hogy megkeresd a kedvenc sorozatodat, ha a DV'R-nek ksznheten a sorozat hzhoz is jhet? Az RSS ugyan nem rgzt semmit, de annyiban hasonlt a DVRhez, hogy a w ebes tartalmat hzhoz szlltja, hogy ne neked kelljen utna menni. Owen egy RSS-hrfolyam ltrehozsval szeretn rtesteni a felhasznlkat az ide genekkel kapcsolatos j adatok berkezsrl. Ezzel fenntarthatja a felhasznlk rdekldst, gy tbben fogjk tfslni az adatokat. Ami pedig a legnagyszerbb az egszben: a weboldalt s az RSS-hrfolyamot ugyanaz az adatbzis vezrelheti.

A HTML a tar talom megtekin tsre szolgl, mg az RSS a tartalom su grzsra.


A webhelyek tartalmbl ki nyert hreket tartalmaz rfo lyamokra egy hrolvas program segtsgvel lehet elfizetni.

Aliens Abducted Me W efcoffc, bavc > t ne encoutier ou KcpociMh*: Mo rroi nperttJ Muak*
2WW-06-21: Belit Q v )
A W u r t l { o r z A d en d w r i j) & .n :

W von crt

H ave

*> * * * * *

T* C#y*c,u ,y hT m
* * * r Jo "** With

"o

t* s w Ctonay doto tfrn . ImLnu sek


2008-05-11 : Srily l i* *
A b A x t l f a r : A tien d fS fT ip o o :

Ali Kado, - It , bifl non-r*cyclb'# ,h in

\ (U y

^rren w w irm tfh c3c*

20(30-07 .12 : Alf Xadfcr

M gj i,*W_ to

, 1 -0 9 .1 4 : DO.

19694)1-21 : R k k W ***

S ^ - iS S S r - . *

Br a weboldal dinamikusan ll el* az adatbzis adataibl, jra s jra meg kell ltogatnod, ha tudni szeretnd, hogy rkeztek-e j informcik.

Itt a Safari bngszbe be ptett hrolvast hasznltuk.

Az RSS segtsgvel a felhasznlk gy tekinthetik meg a W eben elhelyezett ada tokat, hogy a hrek automatikusan jutnak el hozzjuk, amikor j tartalom rkezik. Egy adathalmaz RSS-nzett RSS-hrfolyamnak (RSS feed) vagy egyszeren hrfo lyamnak (new sfeed) nevezik. A felhasznlk elfizethetnek (feliratkozhatnak) egy hrfolyamra, gy hozzjutnak az j tartalomhoz, amint az felkerl a webhelyre, te ht nem kell elltogatniuk a w ebhelyre s ott keresglnik. Egy RSS-hrfolyam megtekintshez csak egy RSS-hrolvasra (newsreader) van szksg. A npszer w ebbngszk s levelezprogramok tbbsge kpes RSS-hrfolyamokra felirat kozni: csak meg kell adnod a hrolvasnak a hrfolyam URL-cmt, s a program gondoskodik a tbbirl.
660 72. fejezet

Tartalomsugrzs s webszolgltatsok

Az RSS valjban XML


Az RSS annyiban hasonlt a HTML-hez, hogy az RSS is tisztn szveges jel l- vagy lernyelv (markup language), amely cm kket (elem eket; tag) s jellemzket (attribute) hasznl a tartalom lersra. Az RSS az XML-en ala pul, amely egy ltalnos jellnyelv, amelyet brmilyen adatok lersra hasznlhatunk. Az XML erejt a rugalmassga adja: a nyelv nem hatroz meg semmilyen konkrt cmkt vagy jellemzt, csupn azok ltrehozsnak s hasznlatnak a szablyait rja le. A HTML-hez s az RSS-hez hasonl nyelvek feladata, hogy rszletesen megadjk a hasznlhat cm kket s jel lemzket, illetve azok alkalmazsnak mdjt. Ahhoz, hogy magabiztosan kpes legyl hasznlni az RSS-t, elszr az XML alapszablyait kell megrtened. Ezek a szablyok valamennyi XML alap nyelvre rvnyesek, az RSS-t s a HTML jabb vltozatt, az XHTML-t is b e lertve. A szablyok egyszerek, de a betartsuk ktelez - az XML- (vagy RSS-) kdod nem fog mkdni, ha megszeged ket! me a szablyok:

Az RSS egy jellnyelv, amelyet sugr zott Webes tartalom lersra hasznlnak.

Helytelen! Hinyzik a cmkepr zr tagja!


r .r - h o rr

g f A tartalmat kzrefog cmkknek mindig prban kell llniuk.


<p>Phone home!</p>

Helytelen! Az res cmkk zr cs csos zrjele eltt egy szkznek s egy perjelnek kell szerepelnie! >j

Helyes.

A tartalmat kzre nem fog res cmkk vgn, a zr cscsos zrjel eltt egy szkznek s egy perjelnek kell szerepelnie.

<br />

Hel*eS-

Helytelen! A jellemzket idzjelbe kell tenni!

g r Minden jellemzrtket (ketts) idzjelbe kell tenni.

- . i ' J 11

1 -1 :'[ ! i / r1

< im g s r c = a l i e n . g i f />

Az XML egy jellonyelv, amellyel brmilyen tpus adat lerhat.

A PHP-tl eltren, amely a legtbb helyzetben az aposztrfok s az idz jelek hasznlatt is megengedi, az XML mereven ragaszkodik a (ketts) idz jelekhez a jellemzrtkek esetben.

Helyes.

m ost it t vagy 661

nem hlye krdsek az rss-r l

Nincsenek

K: M irt jobb az RSS, mint ha a felhasznlk egyszeren elltogatnnak a webhelyemre?


V : Ha a webhelyednek rendszeres ltogati vannak, akik kvncsiak a legfrissebb
hrekre, akkor az RSS nem nyjt tbbet annl, mint ha egyszeren megjelente nd a tartalmat a webhelyen. A legtbben azonban mg azokrl a webhelyekrl is megfeledkeznek egy idre, amelyeket kedvelnek. Az RSS hatkony mdot knl arra, hogy a webes tartalmat kzvetlenl juttasd el az r dekldknek, hogy ne kelljen maguknak megkeresnik.

K: M inek a rvidtse az RSS?


V : Manapsg gy tartjk, hogy' a Really Simple Syndication (igazn egyszer tar
talomsugrzs) rvidtse. Trtnete sorn tbb vltozata is szletett, de a leg frissebb kiads (RSS version 2.0) neve valban Really Simple Syndicationt je lent, s neknk csak ez az rdekes.

K: Mibl ll az RSS? V ! Az RSS egy adatformtum, akrcsak a HTML. A HTML a webbngszben


megjelentett tartalom lerst teszi lehetv, az RSS pedig a hrfolyamknt el rhet webes tartalmakt. A HTML-hez hasonlan az RSS is tisztn szveges adatformtum, amely cmkkbl s jellemzkbl ll, amelyekkel a hrfolyamba kerl tartalom lerhat. I C l Honnan szerezhetek be egy RSS-hrolvast?

V ; A legtbb webbngszbe beptettek egyet, st egyes levelezprogramok is


tartalmazzk. Ez utbbiak esetben az RSS-hrek levlknt jelennek meg a hr folyamok szmra kijellt mappban. Ugyanakkor termszetesen lteznek nll RSS-hrolvas programok is.

662

12. fejezet

Tartalom sugrzs s w ebszo/g/tatsok

me az Aliens Abducted Me (Elraboltak az idegenek!) hrfolyam RSS-kdja. Lsd el megjegyzsekkel a kiemelt kdrszeket, amelyek elmagyarzzk, hogy szerinted mi re valk az egyes cmkk!

Gyakorlat
<?xml v e r s io n = " l.0 " encoding= "utf- 8 "?>

<rss version="2.0"> <channel>


< t it le > A lie n s Abducted Me - Newsfe e d < /t i t le > < H in k > h ttp : / / a lie n s abduct edme. com/|:/ lilik < d e s c rip tio n > A lie n a b d u c tio n re p o rts from around the w orld courtesy o f Owen and h is abducted dog F a n g .< /d e s c rip tio n > <1nguage>en-us j

<item> < t it l e > B e lit a Chevy - Clumsy l i t t l e buggers, had no r h . . . < / t i t l e >

< lin k > h ttp : //www. a lie n s abduct edme. com/ ind ex , php? abduct io n _ id = 7 < /lm k > <pubDate>Sat, 21 Jun 2008 00:00:00 EST</pubDate>
/.-' -VX'" .....y..//.... /s -V-'

...

w -

J.y * ,

..

< d e s c rip tio n > T rie d to g et me to p la y bad m u s ic .< /d e s c rip tio n > <7item>

<item> < t i t l e > S a l l y Jones - green w ith s ix t e n t a c l e s . . . < lin k > h ttp : //www. a lie n s abduct edme. com/index. p h p ?a b d u c tio n _id = 8 < /lin k > <pubDate>Sun, 11 May 2008 00:00:00 EST</pubDate> <description>W e ju s t ta lk e d and played w ith a d o g < /d e sc rip tio n > </item >

< /c h an n e l> </rss>

m ost it t vagy

663

a m egjegyzsekkel e ll to tt rss-k d

me az Aliens Abducted Me (Elraboltak az idegenek!) hrfolyam RSS-kdja. Lsd el megjegyzsekkel a kiemelt kdrszeket, amelyek elmagyarzzk, hogy szerin ted mire valk az egyes cmkk!

Gyakorlat - megolds

Ez a kdsor nem cmke, hanem egy XML-utasts (direktva"), amely a dokumentumot XML-kdot tartalmazknt azonostja. Ez a < t it le > (cm") cmke az egsz hrfolyamra vonatkozik. A csatornahivatkozs (link ) ltalban a hrfolyamhoz tartoz webhelyre mutat.

<?xmi v e rs io n = "1 .0 " encoding= "utf- 8"?>


< r s s :' v e ^ i o n * - t f

<channel>

< t it le > A lie n s Abducted Me - N e w sfe e d < /title > < lin k > h t t p : / / aliensabductedm e. c o m /< /lin k >

< d e s c rip tio n > A lie n a b d u c tio n re p o rts from around the w orld courtesy o f Owen and h is abducted dog Fang. < /d e s c rip tio n >
<*------------------------------ Minden hrfolyamnak szksge van egy le-

< 1anguage >en-us</language > A hrfolyamok tbb nyelven (language") is ltrehozhatk - ez a cmke egy csatorna nyelvt adja meg.
< t i t l e > B e li t a Chevy - Clumsy l i t t l e

rsra In s c rip tio n "), amely elmagyarzhogy a hrfolyam milyen hreket knl,

buggers, had no r h . . . < / t i t l e >

< lin k > h ttp : / / www.aliensabductedme. com/ index, php? abduct io n _ id = 7 < /lm k > <pubDate>Sat, 21 Jun 2008 00:00:00 EST</pubDate> < d e s c rip tio n > T rie d to get me to p la y bad m u s ic .< /d e s c rip tio n >

< /ite a c * < ite m >

^ elrabolt szemly nevt s az idegeneket le r informcikat sszevonva kpezzk az egyes hrek cmt (title ).

< t i t l e > S a l ly Jones - green w ith s ix t e n t a c le s . . . < / t i t l e > < lin k > h ttp ://w w w .a lie n sa b d u c te d m e . c o m /in d e x .p h p ?a b d u c tio n _id = 8 < /lin k > <pubDate>Sun, 11 May 2008 00:00:00 EST</pubDate> <description>W e j u s t ta lk e d and p la y e d ^w ith a d o g < /d e sc rip tio n > </item >

Ez az RSS-dokumentum csak egyet len csatornt tartalmaz, ami tkle tesen megfelel, ha a hreket nem kell klnbz kategrikra trdelni.
</channel> </rss> ---

A < pubDate > elemben meghatrozott dtum az RFC-822 dtum- s idoformtumt kveti, ami a dtum s id szveg knt trtn brzolsnak szabvnya.

Minden XML-elemnek rendelkeznie kell kezd- s zrcmkvel - ez a zrcmke zrja le az RSS-dokumentumot.

Az egyes hrekre mutat hivatkoz sok jellemzen a hrelem teljes tartalmra hivat koznak a hrfo lyamhoz tartoz webhelyen.

664

72. fe jezet

Tartalom sugrzs s w e bszo lg lta t so k

Ok, t e h t az K 55 valjban XML, ami a z t je le n ti, hogy c s a k egy ra k s cm kbl ll. Ez elg knnynek t n ik . Ezek s z e rin t ha l tre s z e re tn k hozni egy h rfo ly a m o t, a k k o r c s a k annyi a dolgom , hogy kszte k egy X M L -f jlt?

Lnyegben igen, de az XML-kdot ltalban nem sajt kezleg rjuk meg, s gyakran nem is fjlokban troljuk.
Igaz, hogy XML-t lehet s szoktak is fjlban trolni, de az RSS eset ben olyan dinamikus adatokrl van sz, amelyek llandan vltoz nak, ezrt nincs rtelme fjlba rni ket, hiszen a fjl gyorsan elavul na, s folyamatosan jra kellene rni. Az XML-kdot ehelyett menet kzben clszer ellltani az adatbzis alapjn - pontosan gy m k dik az Aliens Abducted Me foldal HTML-vltozata is. A PHP segts gvel teht dinamikusan szeretnnk RSS- (XML-) kdol ltrehozni, amelyet krsre kzvetlenl tadhatunk egy RSS-hrolvasnak.

m o s t i t t vagy 665

az rss-hrolvask mkdse

Az adatbzistl a hrolvasig
Alihoz, hogy az idegenekkel kapcsolatos adatokat egy hrfolyamba tpllhas sa, Owennek dinamikusan RSS-kdot kell ellltania a MySQL-adatbzisbl. Ez az RSS-kd egy teljes RSS-dokumentumot forml, amelyet az RSS-hrolvask kpesek elolvasni. Az idegenekkel kapcsolatos nyers adatokat teht a PHP alaktja RSS formtumra, amelyet aztn a hrolvask feldolgozhatnak, s elr hetv tehetnek a felhasznlk szmra. A mvelet legklasszabb vonsa, hogy miutn a hrfolyam RSS formtumban hozzfrhetv vlt, minden ms nm kden zajlik - a frisstett hrek megjelentse mr a hrolvask feladata. a lie n s a b d u c tio n
a fa M o n U 1 A lf la st name N ader w hen f__hoppnd 200-07-12 how J a * one week h o w m a rry a least 12 a6en_dMrt|*ton It was a big nonrecycloble shiny disc full of... They looked Tike donkeys made out o f metal... They were pasty and pandering, and not very... w h a fjh e y _ < M 5w ooped dow n from the sky and... 1 was sifting there eating a baited... Im peached me, o f course, then they probed... Tried to g e t me to p la y bad music. -

Az RSS-hrolvask feladata, hogy az RSS-hrfolyamokban elrhet adatokat feldolgozzk.

Don

Q uay'e

1991-09-14

37 seconds

dunno

Rick

N ixon

1969-01-21

nea rly 4 years

just one

Az RSS hrfolyam-dokumentumot a PHP segt sgvel lltjuk el egy MySQL-adatbzisbl.

Bet

Chevy

2008-06-21

almost a week

27

Clumsy little buggers, had no rhythm.

Sally

Jones

2008-05-11

< / * m I v e r s i o n * - l . o - e n c o d i n g - - u t f - 8 " ?> < rs s v e r s io n - " 2 . 0 "> < c h a n n e l> < t i t I e > A l i e n s A b . rM*u d tir ^ ^

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

<link>hr.tp: / a liensabduci /. <deseription>Ali.en abduct abducted dog Fang .</descr


< ian au av 7 e > e r.- u s< /ianc ii^t

.-sreed</riLl> ; c i . c J lnk> . or// reports fc i around the world on on> Ourtcsy of Ovre n

A hrolvas tudja, hogyan rtelmezze az XML-kdban tallhat egyes hrelemeket, s miknt jelentse meg azokat a fel hasznlnak.

v c i t x e > B e ! i t a Chevy < lin k > h t t p :/ / w w w .a l


< p u b D a t e > S a t , 21 J u n

< d e s c r ip t io n > T r ie d t

As sxkitw M ir n l e Te lok 3W ne \ O. h oM * o* Y u tiwsa09 n* - y U thn e e- rtc c M -fl'e nwtftV tfntyiA. e w


a

\ ri**:)

RV k

-Te * * hy *

,UK

K TU tMV m

Minden hrelem sajt blok kal rendelkezik az RSS hrfolyam-dokumentumban.

Minden hrolvas a sajt md jn trja a felhasznl el a hrelemeket - itt az egyes hrek az elektronikus levelek hez hasonlan jelennek meg.
666 12. fejezet

Aliens Abducted Me - Newsfeed


Berta Chevy -Clumsy little buggers, had

Ez a Mac OS X szabv nyos Mail alkalmazsnak beptett hrolvasja. Beptett hrolvast sz mos ms npszer leve lezprogram is tartalmaz.

Tartalomsugrzs s webszo/g/tatsok

------

lltsd prba!

------

Az RSS-hrfolvamok ltrehozshoz elengedhetetlen az RSS nyelv ismerete, ami azt jelenti, hogy meg kell ismerkedned a hrelemeket ler cmkkkel. Prostsd ssze az egyes RSS-cmkket a lersukkal!

<rss>

Ennek a cmknek semmi kze az RSS-hez, pedig klassz nv lenne egy hregysg szmra!

:ejjcinneJ:

A kzzttel dtuma minden hrelem esetben fontos in formci. s ezzel a cmkvel lehet megadni. Ez a cmke egyetlen csatornt jell egy RSShrfolyamban, s a ler jelleg adatok, illetve az egyes hrelemek troljaknt szolgl.

,0 <CT9n rte>

Egy hrelemet vagy' sztorit jell, amelyet a gyermekelemek rnak le rszletesebben.

IcingUcige>

Ez a cmke mindig egy URL-t tartalmaz, amely egy csatorna vagy hrelem hivatkozsaknt szolgl.

<)ink>

Egy teljes RSS-hrfolyamot zr kzre, teht minden ms cmknek ezen az elemen bell kell llnia. Ez a cmke egy csatorna vagy hrelem cmt trolja, s l talban a <channel> s az <item> elemeken bell hasz nljk.

:pubDctfe:

Rvid lerst ad egy csatornrl vagy hrelemrl. Vagy a <channel>, vagy az <item> elemen bell szerepel.

<rtem>

Ez a cmke egy csatornra vonatkozik, s a csatorna nyelvt adja meg (az amerikai angol esetben pldul en-us formban).

m o s t i t t vagy 667

llts d p rb a ! - m egolds

lltsd prba!
Megolds
Minden RSS -hrfolyam leg albb egy csatornbl ll, ami lnyegben az sszetarf

Az RSS-hrfolyamok ltrehozshoz elengedhetetlen az RSS nyelv isme rete, ami azt jelenti, hogy meg kell ismerkedned a hrelemeket ler cmkkkel. Prostsd ssze az egyes RSS-cmkket a lersukkal!
Az < r s s > cmke az RSS-dokumentum gykreleme" (ro o t") - minden ms cmknek ezen bell kell szerepelnie.

toz hrelemek csoportja.

<rss>

Ennek a cmknek semmi kze az RSS-hez, pedig klassz nv lenne egy hregysg szmra!

<ef]inneJ

A kzzttel dtuma minden hrelem esetben fontos in formci, s ezzel a cmkvel lehet megadni. Ez a cmke egyetlen csatornt jell egy RSShrfolyamban, s a ler jelleg adatok, illetve az egyes hrelemek troljaknt szolgl. Egy hrelemet vagy sztorit jell, amelyet a gyermekele mek rnak le rszletesebben.

<crpnW5-fe>

<ttfe>
Ezi a cmkt csak csa tornkban hasznljuL^

< ljngugge>

Ez a cmke mindig egy URL-t tartalmaz, amely egy csa torna vagy hrelem hivatkozsaknt szolgl.

<l!nl<>

Egy teljes RSS-hrfolyamot zr kzre, teht minden ms cmknek ezen az elemen bell kell llnia. Ez a cmke egy csatorna vagy hrelem cmt trolja, s l talban a <channel> s az <item> elemeken bell hasz nljk.

<descTpt9 n>
Ez a cmke csak a hr elemekre vonatkozik.
: pubOcfte

Rvid lerst ad egy csatornrl vagy hrelemrl. Vagy a <channel>, vagy az <dtem> elemen bell szerepel.

<rtem>

1
668
12. fejezet

Ez a cmke egy csatornra vonatkozik, s a csatorna nyelvt adja meg (az amerikai angol esetben pldul en-us formban).
A < t i t l e > , < lin k > , <pubO ate> s < description> cmk ket az < ite m > elemen bell, egy hrelem lersra hasznljuk.

Tartalom sugrzs s w e b szolg ltatsok

RSS Az XM i felptsnek kpi brzolsa


Mr megtanultad, hogy az XML-kdok cmkkbl (pontosabban a velk kzrefogott elemek bl) llnak, amelyek szl-gyerm ek viszonyban llnak egymssal a teljes XML-dokumentum krnyezetn bell. Amikor XML-kddal dolgozol, sokat segt, ha kpileg is brzolni tudod ezeket a szl-gyermek viszonyokat. Pldaknt nzzk meg az elz oldalon bemutatott RSS-dokumentum elemhierarchijt, a hrfolyam adatainak egyfajta csaldfjaknt, amely nek tetejn a szlelemek llnak, lefel haladva pedig a gyermekelemeiket lthatod:

Az egyes csatornk title , link, description s language elemei a hr elemek mellett jelennek meg, mint a channel elem gyermekei. \

A legfels elem a doku mentum gykere, vagyis minden ms elem szlje

Az egyes hrelemek title, link, pubOate s description ele mei az fm elem gyermekeiknt je lennek mea.

un*.

a s c r ip t io n

Albb egy vadonatj idegenszlelsi jelentst lthatsz, amely most kerlt az a lie n s _ a b d u c t io n adatbzisba. rd meg az ehhez a jelentshez tarto z <item> RSS-elem XML-kdjt, s gyelj r, hogy tartsd magad a hrfo lyamok RSS formtumnak szablyaihoz!

aliens abduction
a b d u d io n jd fir s tn a r w w h a n t f haooened h o w jo n g ] h o w m a n y

w h q t_ th y_ tB d 1

14

Shill

W a tn e r

2 0 0 8 -0 7 -0 5

2 hours

d o n 't know

There w as a b rig h t lig h t in the s ly ...

They b ea m ed me to w a rd a gas station...

m ost i t t vagy

669

G yakorlat - m egolds

Gyakorlat - megolds

Albb egy vadonatj idegenszlelsi jelentst lthatsz, amely most kerlt az a lie n s _ a b d u c tio n adatbzisba. rd meg az ehhez a jelentshez tar toz <item> RSS-elem XML-kdjt, s gyelj r, hogy tartsd magad a hr folyamok RSS formtumnak szablyaihoz!

aliens abduction
a t x lu d o n jd fir e t_ n a m e j 14 shi W a tn e r 1 2 0 0 8 -0 7 -0 5 1 f ___ ____1 w n e n jt_ h a p p e r w i h o w jo n g M* 2 hours d o n 't know There w as a b rig h t lig h t in the sky... They beam ed me to w a rd a gas station...

h o w .m n w y

aBen description

w hqt_tf>ey_did |

<rtcm>

A hrelemet az < ite m > cmkk zrjk kzre.

s < description > elemek a hrelem rszleteit adjk meg. m tlic sl^...< /tijje> pubOare
|<e v e *

< itlc>S^ill jVdtvgr - There w3s a b rijK t

,^!ih!c.>K i ^ P / / ^ ^ ! \ c.h^bdu;-tcclmc.dom/mclc%.php?ab(lut'tioh^icll^</l'm k>


< p y b P a t e > S a t , O 'y J u l Z 0 0 9 0 0 0 0 0 0 E S T < / Pu b D a t e >

eism nevei

< :-------------- "

b j u a !!a s s a J e s

........................................................................................................... D-vel keli rnif teht nem <^ csd'r!Flon. X^.cy > . **?. rd a gas .^ t'< ^ .v :</dcs^ripiioh> |e;ie| < pubdate> vaay . < / t e .....................
Nincsenek

<PU BD ATE>.

hlye krdsek

K: Az XML megklnbzteti a kis- s nagybetket? V Igen. az XML betlls-rzkeny, ezrt az XMLcmkkben s -jellemzkben szmt, hogy nagy- vagy kisbetket rsz. Ennek j pldia az RSS <pubDate> eleme, amelyet kevert betllssal s nagy D-vel kell rni. A legtbb XML-cmke kisbets vagy betlls. I C l Mi a helyzet az reshelyekkel? Van szerepk az XML-ben?

K i i Az RSS-hrfolyamokban lehetnek kpek is?

V Igen, csak tartsd szben, hogy nem minden hrolvas


kpes kpeket megjelenteni. Ezen kvl az RSS 2.0-ban csak a csatornkhoz adhatsz kpeket, az egyes hrelemekhez nem. Egy csatornhoz az <i mage> cmke segtsgvel lehet kpet csatolni, amelynek a <channel > elemen bell kell ll nia. me egy plda: <imaae>
i.:rl > t te : //w w w . aliensabducfcedrne . com/f an g . jp y < /u r l> n
< tit le > M y dog F a n g < /tille > < lin k > h r t.p : / /www. a .io n s a b d u c te d m e . c o m < /lin k > </irnage>

V Elszr is, az XML-ben a kvetkez reshely-karakterek


lteznek: kocsivissza \r), jsor (\n), tabultor (\t) s szkz ( 1 '). Az reshelyek tbbsge a legtbb XML-dokumentumban tisztn eszttikai, formzsi clokat szolgl, pld ul a gyermekelemek behzst. Ezeket a jelentktelen res helyeket az XML-adatokat feldolgoz alkalmazsok, pldul az RSS-hrolvask ltalban figyelmen kvl hagyjk. ugyanak kor a cmkken bell szerepl reshelyek Jelentsek, s lta lban pontosan gy jelentik meg ket, ahogy ott llnak. Ez te szi lehetv pldul, hogy egy olyan verset, amelyben a trk zknek jelentse van, pontosan vissza lehessen adni XML-ben.

Technikailag persze lehetsges egy lirelembe is kpet gyazni az RSS 2.0-ban: ennek az a trkkje, hogy a HTML <i mg> ele mt kell hasznlni az elem lersn bell. Mindazonltal ehhez a HTML-elemet XML-egyedekkel kell kdolni, s ez sok szem pontbl ellentmond annak a kvnalomnak, hogy egy RSSelem tisztn szveges tartalombl lljon.

670

72. fejezet

Tartalom sugrzs s w e bszolg ltatsok

RSS - lehull a lepel


Heti interjnk:
Mire gerjed egy hrszolgltat? Agyhullm: gy tudom, hogy amikor valaki hreket ke res a Weben, nhz fordul. Igaz ez? Agyhullm: Rendben, de miben klnbzik HTML-tl?

RSS: Nos, mindketten olyan szveges adatformtumok RSS: Azt hiszem, ez attl fgg, hogy mit tekint hrnek . vagyunk, amelyek vgssoron az XML-en alapulnak, ami azt jelenti, hogy mindketten cmkk s jellemzk n fknt azzal foglalkozom, hogy az informcikat segtsgvel rjuk le az adatokat. De mg HTML-t kifeje olyan formba csomagoljam, amit a hrolvask kpe sek feldolgozni. Az mr nem rm tartozik, hogy a tarta zetten arra terveztk, hogy webbngszk rtelmezzk s jelentsk meg, addig n a hrolvaskat szolglom lom hrrtk-e... Ezt mindenki dntse el maga. ki. gy is mondhatjuk, hogy ms-ms nzetet nyjtunk Agyhullm: Hrolvask alatt az embereket rti? ugyanazokrl az adatokrl. RSS: Nem. Azokra a szoftvereszkzkre gondolok, Agyhullm: n viszont tudom, hogy egyes amelyek tudjk, hogy ki vagyok, s hogy miknt szol webbngszk is kpesek hrfolyamokat megjelente gltatok adatokat. Pldnak okrt engem egy csom levelezprogram tmogat, ami azt jelenti, hogy n el ni. Mi teszi ezt lehetv? RSS: J krds. Tudja, egyes bngszk beptett hrol fizethet egy hrfolyamra, s majdnem ugyangy juthat vast is tartalmaznak, teht valjban kt eszkzt knl hozz a frisstsekhez, mintha elektronikus leveleket nak egyben. Amikor azonban egy bngszben egy fogadna. hrfolyamot jelent meg, egszen mst lt, mint Agyhullm: rdekes. Akkor mgis miben klnbzik a HTML-wr eboldalak. az e-mailektl? RSS: , n teljesen ms vagyok, mint k. Elszr is, az e-maileket emberek kldik egymsnak, s ltalban egy ktirny prbeszd rszei: n vlaszolhat egy le vlre, a vlaszra viszontvlaszt kaphat, s gy tovbb. n csak egy irnyban kommuniklok: egy webhelyrl tovbbtok informcikat egy egyni felhasznlnak. Agyhullm: Ez min egyirny kommunikci? RSS: Nos, amikor valaki gy dnt, hogy elfizet egy hrfolyamra a hrolvas programjban, akkor lnyeg ben azt mondja, hogy rteslni szerelne rla, amikor egy adott webhelyre j tartalmat tltenek fel. Amikor aztn az j tartalom tnylegesen felkerl a webhelyre, n gondoskodom rla, hogy olyan formban legyen el rhet, hogy a hrolvas programok rtesljenek rla, s megmutathassk az elfizetnek. A hrolvasknak azonban nincs r mdjuk, hogy vlaszoljanak egv-egy hrre. Ezrt egyirny a kom m unikci - csak a web hely fell rkezik adat az elfizet fel. Agyhullm: rtem mr. Akkor mi is n pontosan? Agyhullm: De ht a legtbb hrfolyam HTMLweboldalakra mutat, nem igaz? RSS: De igen - n HTML-lel egyttmkdve nyjtok jobb hozzfrst a wr ebes tartalmakhoz. A lnyeg az. hogy engem kell hasznlnia, ha anlkl szeretne rte slni az jdonsgokrl, hogy el kellene ltogatnia a webhelyre. Ha viszont olyat mutattam, amirl tbbet szeretne tudni, egy kattintssal a kapcsold oldalra juthat. Ezrt tartozik minden hrelemhez hivatkozs. Agyhullm: Teht n egyfajta elnzete a weboldalaknak? RSS: g y is mondhatjuk, de ne felejtse el, hogy n me gyek nhz, nem nnek kell elltogatnia hozzm. Ezt szeretik bennem a legjobban - szksgtelenn teszem, hogy a felhasznlnak jra s jra meg kelljen ltogat nia a webhelyeket, hogy ellenrizze, hogy rkezett-e j tartalom. Agyhullm: Most mr vilgos. Ez tnyleg knyelmes megolds. Ksznm, hogy tisztzta a szerept a Weben.

RSS: Valjban csupn egy adatformtum vagyok: olyan egyezmnyes mdja a tartalom trolsnak, ame RSS: rmmel tettem. lyet a hrolvask ismernek s fel tudnak dolgozni. Ha velem troltatja az adatait, a hrolvask hrfolyam knt kpesek lesznek azt elrni.

m ost it t vagy 671

rss ltrehozsa a p h p segtsgvel

RSS-hrfolyam dinamikus ellltsa


Az RSS adatformtum megrtse hasznos dolog, de Owennek tovbbra sincs hr folyama, amellyel az idegenszlelsi jelentseket eljuttathatn az rdekldknek. Ideje munkra fognod a PHP-t, s dinamikusan ltrehoznod az Owen MySQLadatbzisbl szrmaz, idegenekkel kapcsolatos adatokkal teli hrfolyamot. Sze rencsre ez a kvetkez lpsek vgrehajtsval knnyen megoldhat:

Az eredmnyknt kapott hrfolyam nem fjlban t roldik, hanem egy XMLdokumentum.

V
h

A dokumentum tartalomtpusnak meghatrozsa XML-knt.


<?php header( 'Content-Type: text/xml1);

RSS-dokumentum tartalomtpust egy fej lc segtsgvel XML-re kell lltanod.

?>

A dokumentumot XML-knt azonost XML-utasts ltrehozsa.


<?php echo r<?xml versi:on="l.0" encoding="ut-8"?> '; ?>

formcik ltrehozsa.

A nem az adatbzisbl szrmaz statikus RSS-kdok, pldul az <rss> cmke s a csatornain

< rss v e r s io n - " 2 .0 > < ch a n n e l> < t i t l e > . .. < lin k > . . . < d e s c r ip tio n > ... < la n g u a g e > .. .

Ezt a kdot nem befolysolja az adatbzis; ennek a hrfolyam nak az esetben mindig ugyanaz.

Az idegenekkel kapcsolatos adatok kiolvassa egy lekrdezssel az aliens_abductions adatbzisbl. Mieltt elllthatnd a hr
a b d u c tio n _ id last_nam e irst_nam e whe n _ i t_ h appen ed a lie n _ d e s c r ip t io n
w hat_they__did

elemek RSS-kdjt, ki kell olvasnod az idegenekkel kap csolatos adatokat a MySQLadatbzis lekrdezsvel.

Az adatok bejrsa egy ciklus segtsgvel, s RSS-kd ellltsa az egyes hrelemekhez.


<item > < title > . . . < lin k > ... < D u b D a te > .. . < d e s c r ip t io n > . . . </' i tem>

Ez a kd tartalmazza az adatbzis bl kinyert adatokat, ezrt nagyon krltekinten kell ltrehozni.

A dokumentum lezrshoz szksges statikus RSS-kd ltrehozsa, belertve a zr </channel> s </rss> cmkket.
< /c h a n n e l> < / rss>

672

72. fejezet

s XML-! PHP- s MySQL-mgnesek

Tartalomsugrzs s w ebszolgltatsok

0^\en Aliens Abducted Me RSS-hrfolyamnak parancsfjljbl (new sfeed.php) hinyzik nhny fontos kdrszlet. Gondosan vlogasd ki a megfelel htmgneseket a kd kiegsztshez s a hrfolyam dinamikus ellltshoz! <?php header ( 'Content-'lype: te x t/x m l'); ?> <?php echo ' <?xml version^"1.0Mencoding~"utf-8"?>'; ?> <rss version="2. 0">

< t i t i e > A l i e n s /abducted M e - N e w s f e e d < / l j . t i e >

h ttp : //a lie n sabductedme. com/


< a e s c r i p t i o n > A l i e n a b d u c t i o n r e p o r t s f roir a r o u n d t h e w o r l d c o u r t e s y o f O w e n and his abducted dog Fang.</cescriptior en-us

newsfee<iphp

<?php r e q u i r e _ o n c e ('c o n n e c t v a r s . p h p ' );


// Csatlakozs az adatbzishoz $dbc - mysqli_ccnnect(DB_HOST, DB_USER, DB_PSSWORD, D B N A M E ) ; // Az idegenekkel kapcsolatos adatok kiolvassa a MySQL adatbzisbl $ q u e r y - " S E L E C T a b d u c t i o n _ i d , f i r s t _ n a m e , last_naire, " . " D A T E _ F O R M A T ( w h e n _ i t _ h a p p e n e d , *%a, % d % b % Y %'i A S w h e n _ t _ h a p p e n e d _ r f c , " . ') "alien_description, what_lhey_did " . "FROM aliens_abduction " .

"ORDER BY w h e n _ i t _ h a p p e n e d S d a t a = ir.ysqli_query ($dbc, $ q u e r y ) ;


// A idegenekkel kapcsolatos adatok tmbjnek bejrsa s RSS*knt trtn frmzsa egy ciklussal w h i l e ($row - m y s q l i _ f e t c h _ a r r a y ( $ d a t a ) ) { // Az egyes sorok megjelentse RSS-elemknt

echo ' fTj

';

e c h o ' < t i L l e > ' . $ r c w [ 'f i r s t _ n a m e '1 . ' ' . $ r c w [ a s t ^ n a m e '] . ' - ' . l s u o s t r ( $ r o w f 'a l i e n _ d e s c r i p t i o n ' 1 / 0, 32) . ' . . . < / t i t l e > 1; e c h c ' < l i n k > h t t p : / / w w w .a l i e n s a b d u c t e d m e . coirt/index . p h p ? a b d u c t i o n _ i d ~ ' . $row[' echo ' '1 . * < / l i n k > ' ; ' . $ r o w [ h e n _ i t _ h a p p e n e d _ r f c 'J . 1 ' . date('T') w . '

e c h o ' < d e s c r i p t i c n > ' . $ r o w f 1w h a t _ t h e y _ d i d . '< / d e s c r i p t i o n > '; 1 e c h o '< / i t e m > ';

m o s t rtt vagy 673

PHP-, M y SQL- b X M L-m gnesek - m egolds

<?php he ad e r ( ' Content-Type <?php echo 1<?xml version^-" < rs s v e r s io n ~ " 2 .()">

text/xml); ?> . 0" e n c o d in g = "u tf- 8

< t i t l e > A I i e n s A bducted Me - N e w s e e d < /title > < lin k > h t t p :/ / a lie n s a b d u c t e d m e .c o m / I < /lin Jc > K m r i d c o u r te s y o f Owen

n e w s fe e

c d e ^ c ^ p t i o n > A l ie n a b d u c tio n r e p o r ts from a r o u n d ^ ? ? and h i s a b d u c te d dog F a n g .< / d e s c r ip tio n >

<?php r e q u ir e _ o n c e ( c c n n e c t v a r s .p h p 1); / / Csatlakozs az adatbzishoz $dbc - m ysqli_co nnect(D 3 _H 0 S T , DB_USER, D3_PASSWORD, DB_NAME); / / Ay. idegenekkel kapcsolatos adatok kiolvassa a MySQL-adatbzisbl query - "SELECT a b d u c t io n _ id , f ir s t _ n a m e , ia s t_ n a m e , " . " DATE_FORMAT(w h e n _ it_ h a p p e n e d ,1%a, %d %b % %T') AS w h e n _ it_ h a p p e n e d _ r fc , " a l i e n _ d e s c r i p t i o n , w h a t_ th e y _ d id " . ) "FROM a l i e n s a b d u c t io n " . ORDER BY when i t happened

$ d a ta = m y s q li_ q u e r y ($ 0 0 0 , S q u e r y ); idegenekkel kapcsolatos adatok tmbjnek bejrsa s RSS-knt trt n formzsa egy c ik lu s s ! w h ile ($row - m y s q li_ f e t c h _ a r r a y ( $ d a t a ) ) {
//A

// Az egyes sorok m egjelentse RSS-eiemknt echo ' < ite m > ;

echo ' < S f f e ^ T $row fir s t_ n a m e '] . ' ' . $rowL la st_n a m e ' ] . ' - .
s u b s t r { $ r o w [ 'a lie n d e s c r i p t i o n 1], 0, 32) . 1. . . < / t i t l e > ' ; echo ' < lin k > h t t p : / / w w w .a lie n s a b d u c te d m e .c o m /in d e x .p h p 7 a b d u c tio n _ id - ' . $row[ ' echo ' echo '

a b d u c t io n _ id

fe 1 ,< / l i n k > ' ; w h e n _ it_ h a p p e n e d _ r fc ' ] . ' ' . d a t e C T ') . ' 1 < /pu bD ate > . $row [ *w h a t_ th e y _ d ic ' 1 . ' < / d e s c n p t io n > * ; V

Tartalom sugrzs s w e bszolg ltatsok

Add az RSS Newsfeed parancsfjlt az Aliens Abducted Me webhelyhez!


Hozz ltre egy j szvegfjlt new sfeed.php nven, s rd bele Owen RSS Newsfeed parancsfjljnak kdjt az elz mgneses gyakorlatbl (vagy tltsd le a parancsfjlt a Head First Labs webhelyrl, a www.headf i r s t l abs . com /books/hfphp cmrl). Tltsd fel a parancsfjlt a webkiszolgldra, s nyisd meg egy hrolvas program ban. A legtbb bngsz s nhny levelezprogram is lehetv teszi a hrfolyamok megtekintst, ezrt ha nincs nll hrolvas alkalmazsod, akkor elszr ezekkel prblkozz. A Newsfeed parancsfjlnak a legfrisebb idegenszlelseket kell megjele ntenie, amelyeket kzvetlenl az Aliens Abducted Me adatbzisbl olvas ki.

Alien*. A b d -c te d Me. ~ wrifacd --------------------- -

Aliens Abducted Me -N e w s f e e d
M elnhold R e ssn e r - They w ere in a s h ip the size of
Canted rvi to lie a p of a noofttain ar,d croapad nw or.
Articfe Lengtft:

Mickey M ikens - H uge heads, sk in n y arm s a n d legs


Bob3 my rvna r-c- c -

Ha a bngszdnek gon dt okoz a hrfolyam megjelentse, prblj fe e d ://-e t rni az URL be a h ttp :// helyett.

S h ill W atner There w as a b rig h t light In the ...


They oo ar*3 n * vswinl a ga tiatcn in ii ocwn.

B e lita C hevy - C lum sy little b u g g e rs, had n o rh...


Tr'^o m - chay Had

Td y oa
dog '"

Sally J o n e s * green w ith six te n tacle s...


We just tt!lu*o and olaywd

vcsraay lest Savan Days rnis b'an*

LMrth

tt w as a big non-recyclsble sh in ...

A hrfolyam nagyszeren nz ki, de h onnan fognak tu d n i a ltezsrl a wabhelyem ltogati?

-i r e vy ar.d sr<aa;fio<l m s up wth no warning,

^ Actions:

A newsfeed.pbp parancsfjl olyan RSS hrfolyam-doku mentumot llt el, amely brmely RSS-hrolvasval megtekinthet.

hey looked like don k e y s m ade ou ...


ing 3 aa*eo g o w o e when 'Zwooah'' *vs c o n or sight loo* m away

Aey were pasty and p an d e rin g


course. inert r a y probed

M w f U tteT Subscri* In A 800u JK raiH

UOSftV- \* \ \

Csak annyi a dolgod, hogy elhelyezel egy r mutat hivatkozst a webhely nyitoldaln.
Ne felejtsd el, hogy a newsfeed.php nem tbb egy PHP-parancsfjlnl. Az egyetlen klnbsg kzte s a knyvben eddig ltott egyb Pl P-parancsfjlok tbbsge kztt, hogy HTML-dokumentum helyett RSS-dokumentumot llt el. Az elrse azonban ugyangy trtnik, mint brmely ms PHP-parancsfjl - csak meg kell adnod a parancsfjl nevt egy URL-ben. Owennek az a gondja, hogy nem tudja, hogyan ossza meg ezt az URL-t a webhelye lto gatival, pedig ez minimlis erfesztsbe kerl - egy tartalomsugrzsi hivatko zst (syndication link) kell elhelyezni, ami nem ms, mint egy kznsges hi vatkozs az Owen kiszolgljn tallhat newsfeed.php parancsfjlra. m o s t i t t v a g y 675

az rss-hivatkozs elhelyezse

Ltezik egy
Fontos, hogy egy webhely hrfolyamra jl szrevehet hivatkozs mutasson, mert sok felhasznl nagyra rtkeli, ha ilyen szolgltats is hozzfrhet. Ltezik egy szabvnyos ikon, amellyel felhvhatod a figyelmet a hrfolyamra, hogy segts a fel hasznlknak, hogy gyorsan megtalljk a webhelynek azt a szolgltatst. Ezzel az ikonnal fogjuk most felpteni a lirfolyamra mutat hivatkozst Owen nyitol dalnak ( index. php) aljn.

szabvnyos RSSikon, amely vilgoss teszi a felhasznlk szmra, hogy a web hely RSS-hrfolyamot knl.

Ez az ikon mindenfle mretben s kpform tumban elrhet, de a ki nzete mindig azonos.

100 11

nioio
o o i o i.

i o io n
rssicon.png

A hrfolyamra mutat HTML hivatkozs egy RSS-ikont s szveges lerst is tartalmaz


A e vA u M ic n fcd ct^d c

Aliens Abducted Me
Wckorac, have you bad an encounter with extnucrrawiaJs? Were you abducted? Have- you seen my abduciod dog. Fang' Report it hert l Most recent reported abductions;

2008-08-10 : MeinboW Resxner


Abducted for: 3 hours Abducted for: 45 minutes Alien description: They wen: in a ship the sl2c o f a full moon. Alien description: Huge beads, skmnv arms and tegs

Fang spotted

2008-07-11 : Mickey Mlkens

Fang spotted yes Fang spotted

2008-07-05 : Shill Winner Abducted for Alien description:


2 noun

There was a bngbt light in the sky. followed by u hoik nr two

2008-06-21 : B eliui Chevy

A fo Aliens Abducted Me oldalon el helyezett, jl lthat hivatkozs segt a felhasznlknak, hogy gyorsan hoz zfrhessenek Owen hrfolyamhoz.

Abducted for: almost a week Abducted for: I day

Alien description: Clumsy Unlc huggcre, had no rhythm. Alien description; green with six tentacle*

2008-05-1! : Sally Jones

kQ Click to syndicate the abduction news feed.

676 72. fejezet

Tartalomsugrzs s webszolg/tatsok

Add hozz a hrfolyamra mutat hivatkozst az Aliens Abducted Me webhely nyitoldalhoz!


Mdostsd az Aliens Abducted Me webhely in d e x .p h p parancsfjljt gy, hogy megjelentse a hr folyamra mutat hivatkozst az oldal aljn, s tltsd le az rs s ic o n .png kpfjlt is a fejezethez tar toz kddal egytt a Head First Labs webhelyrl, a www.heaclf i r s t l a b s . com/books/hfphp cmrl. Tltsd fel az in d ex .p h p parancsfjlt s az rs s ic o n .p n g kpfjlt a webkiszolgldra, s nyisd meg a parancsfjlt a bngszdben. Kattints az j hivatkozsra, hogy megtekintsd az RSS-hrfolyamot.

M iu t n Ilyen sok embert elraboltak, mindig figyelem az idegenekrl szl V hreket. J

A g y a rt nem l tta m , de ezek a je lentsek nagyon rdekesek

Az RSS-nek kszn hetoen az j idegen* szlelsi jelentse ket az elfizetk anlkl megkapjk, hogy el kellene lt gatniuk az Aliens Abducted Me webhelyre.V

m/vibqxu
IrrbO *

O jtbc*
Seni

! COAM

> T trt ro

A llens Abducted Me - Newsfeed I


Meinhofd Ressner - They were fn a ship th
Carried n a irt top o* 3 mouna n anc dropped rr, off ftpfld-ngra

Lehet, hogy ez ugyanaz a kutya, m in t a m it azon a YouTube -'viden l tta m ?

Chloe, aki lelkes olvasja az Aliens Abducted Me webhely hrfolyama-' nak, gy gondolja, hogy lehet, hogy Agyart ltta egy YouTube-viden.

m o st i t t vagy *

youtube-tarta/om hozzadsa owen webhelyhez

J J S

(.lr

Miutn a hrfolyam egyik elfizetje rtestette Owent, hogy ltott egy videt a YouTube-on, amelyben egy Agyarra hasonlt kutya szerepelt, Owen rbredt, hogy az eb megkeresshez ms technolgikat is ignybe kell vennie. De hogyan? I la O w en be tudn pteni a YouTube-videkat az Aliens Abducted Me webhely ol dalaiba. a felhasznlk segthetnnek neki megkeresni Agyart, radsul elkerlhet n, hogy neki kelljen sajt kezleg vgigkutatnia az sszes videt a YouTube-on.

A YouTube nagyszer eszkz az idegenek ltezsvel ka p cso la to s bizonytkok sszegyjtsre, s A gyar m egtallsban is s e g th e t...a z j idegenvidekat v is z o n t nagyon f ra s z t megkeresni.

Br a YouTube nagyon gretesnek tnik, hogy segtsen Owennek megtallni Agyart, a videk megkeresse kzi mdszerrel ren geteg erfesztsbe kerl.
% 8 n flb u 3 m & (0 ire 5 d c sd e )
Videos Channels
Vtcas.___ J

Account*

Q u n *L t*{0 )

Help

Sign Out

Youu

| Wrtd W A E g C3 o w ? ) n lish | 1
Home

Community
Search

rost test Yoursft ' Q n abduction dog! *!. mj. i"1 1 11 iu " 1

Pug A bducted By UFI

UFO Spotted Near Eiffel Tower!

Dog Rides in UFO Hovering Near San Francisco!

fo /'M

Owen gy vli, hogy a videk fogjk Agyar nyo mra vezetni.

678

72. fejezet

Tartalom sugrzs s w ebszo/g/tatsok

Prbld ki!
Ltogass el az Owen YouTube-videit tartalmaz oldalra a www.youtube.com/user/aliensabductedm e cmen! Nzz meg nhny idegenes videt, amit Owen tallt. Szerinted a videkon szerepl kutya Agyar?

Nem lenne meseszp, ha a videkat kzvet lenl az Aliens A bducted Me oldalon nzhetnm meg, s nem a YouTube-on kellene keresglnem? b rc s a k lenne r md, hogy egyszeren felkeres sek egy w eboldalt, amelyen m r s s z e g y jt tte k r helyettem a videkat! Ez persze csak lo m ...

m o st i t t vagy 679

a tartalom lehvs ms,, m in t a tartalom sugrzs

Webes tartalom lehvsa msoktl


Az RSS-hrfolyam elve, hogy a tartalm at sztsugrozza a felhasznlknak, hogy ne kelljen llandan visszatrnik a webhelyedre j tartalomrt. Ahogy Owen is tapasztalta, ez nagyszer mdja annak, hogy knyelmess tegyk a felhasznlknak egy webhely nyomon kvetst. A webes tartalomsugr zsnak azonban van egy msik oldala is: a tartalom lehvsa egy msik webhelyrl, amit aztn elhelyezhetsz a sajt oldaladon. gy te vlsz a fogyasz tv (consumer), s valaki ms tlti be a tartalomszolgltat (content provider) szerept. Owen esetben, aki YouTube-videkat szeretne a webhelyn megjelenteni, a YouTube lesz a szolgltat (provider).

A YouTube a videk szolgltatja.


P Ad c *8 UfC u buu y

Az Aliens Abducted Me w eb hely a videk fogyasztja.


m fin
Anen* Abducted Me

Aliens Abducted Me
Welcome, have you had an cocounja whb extraterrestrials? Were you abdueicd? Have you seen my abductcd dog. Fang? Report it here! Most recent reported abductions:

2008-08-10 : Meinhold Ressner


Abducted for: ^ hours Abducted for: 15 minutes Abducted for: 2 *** * Alien description: They were io a ship the sr of a full moon. AUeo description: Huge heads, skinny aims and iegs Alien description; There was a bright light in the sky. fallowed by a hark or two. Fang spotted: no Fang spotted: yes Fang spotted: yes Fang spotted: no Fang spotted: yes

2008-07-11 : Mickey Mikeau

2008-07-05 : Shill Watner

2008-06-21 : Bclilu Chevy Abducted for: Alien description:


almost a week Abducted for: Clumsy ltrde buggers, had no rhythm Alien description:

2008-05-11 : Sully Jones


lday green with six tcntacles |<jg k o f i i l n e k V~

SanF r ^ n c ^ t
E3 Click to syndicate the abduction news feed.

dek miniatrjei.

Az Aliens Abducted Me oldal felptst egy kiss mdostanod kell, hogy helyet csinlj a videkeress eredmnynek.
Fontos, hogy rtsd, hogy Owen nem csupn egy bizonyos YouTube-videt vagy egy videra mutat hivatkozst szeretne begyazni - ezt elg knny megvalstani gy, hogy kivgjuk s beillesztjk a megfelel HTML-kdot a YouTube-rl. Owen azonban egy keresst szeretne vgrehajtani a YouTube-ra feltlttt videk kztt, s ennek a keressnek az eredmnyt szeretn meg jelenteni. Az Aliens Abducted Me webhelynek teht egy valsidej lekrde zst kell vgrehajtania a YouTube adatain, majd dinamikusan kell megjelen tenie az eredmnyeket. Ez lehetv teszi Owennek s Agyart keres sereg nek, hogy percreksz informcikkal rendelkezzenek a YouTube-ra leitett idegenes videkrl.

A YouTube visszaadja a keresett, idegenek kel kapcsolatos vide kat, s betlti azo kat Owen foldalra.

68 0 72. fejezet

Tartalom sugrzs s w e b szolg ltatsok

YouTube-videk sugrzsa
Alihoz, hogy a YouTube-oi videforrsknt hasznlhasd, pontosan tudnod kell, hoA videk sugrzsa gyan teszi sugrozhatv a videkat a YouTube: krelmek s vlaszok tjn bonyoltott \ T L / " II ^ I kommunikcin keresztl, amelynek sorn bizonyos videkat krelmezhetsz (request), 3 YOU I U D 6 TI K 6 f 6 l ~ majd vlaszknt (response) informcikat kapsz a keresett videkrl a YouTube ki mek kiadst s a vszolglitl. A te felelssged, hogy a krelmet a YouTube ltal elvrt formban add ki, s a te feladatod a vlasz kezelse is, amelybe beletartozik a vlaszknt kapott I^ S Z O k | ( 6 Z 6 l S t adatok tfslse a szksges adatok (a vide cme, miniatr elkpe, hivatkozsa ------

sth.) irnt.
Ahhoz, hogy videkat hvhass le a YouTube-rl, s megjelenthesd azokat, a kvetkez lpseket kell vgrehajtanod:

ignyli.
w ... ,
------ A krelem U t a l* * 9* U R t formja* H.

o o
Q o

A YouTube-videkra irnyul krelem felptse, A videkrelem kiadsa a YouTube fel. A YouTube vlaszadatainak fogadsa, amelyek informcikat tartalmaznak a keresett videkrl. A vlaszadatok feldolgozsa s HTML-kdd alaktsa.
A bngsz elszr elkri a foldalt a webkiszolgltl.

A YouTube XM l fo r
mtumban vlaszol

a videikrelmekre.
l)

YouTubew e bkiszo lg l

A PHP-parancsfjl videadatokat krelmez a YouTube-kiszolgltl.

gyflbngsz

A vgs weboldal, ame; lyet a bngsz megkap, tiszta HTML-bol ll. A PHP-parancsfjl feldl gozza a videadatokat, s egy formzott HTMLWeboldalt ad vissza.

Az idegenekkel kapcsolatos adatoknak a MySQL-adatbzisbl lekrdezssel vgrehajtott kiolvassa mellett a PHPparancsfjl most a YouTube videvlaszt is feldolgozza.

A YouTube-kiszolgl egy videadatokat tartalmaz XMldokumenturoot ad vissza.

m ost i t t vagy 681

bem utatkoznak a REST krelm ek

YouTube-videkrelem kiadsa
A videk lehvsa a YouTube-rl s a beptsk a sajt weboldalaidba egy krelemmel kezddik. A YouTube a videkra irnyul lekrdezse ket egy REST-krelem formjban vrja, ami egy egyedi URL, amely bizo nyos erforrsokhoz, pldul YouTube-videadatokhoz vezet: felptesz egy URL-t, amely azonostja, hogy milyen videkat keresel, a YouTube pedig egy XML-dokumentumon keresztl informcikat ad vissza rluk. A YouTube-krelem URL-jnek rszleteit az hatrozza meg, hogy milyen videkhoz szeretnl hozzfrni. Krheted pldul egy adott felhasznl kedvenc videit, de Owen esetben a legjobb megkzelts valszn leg az, ha kulcsszavas keresst hajtasz vgre az sszes YouTube-vide kztt. Az emltett tpus REST-videkrelmekhez szksges URL-ek nmileg klnbznek, de az URL alapja mindig gy kezddik:
h ttp ://g d a ta .y o u tu b e .c o m /fe e d s /a p i/

Nincsenek

hlye krdsek
I C l Minek a rvidtse a REST?

V ! REpresentational State Transfer


(brzol llapottvitel). Vilgos, hogy ez egyike azoknak a betszavak nak, amelyek sokkal bonyolultabbnak s mszakibb jellegnek hangzanak, mint amilyenek valjban. A REST mgtti elv az. hogy a webes erforrsoknak hozzfrhetnek kell lennik egyedi hivatkozsokon keresztl, ami azt jelenti, hogy a REST-kpes (RESTful) adatoknak egyszeren egy URL felptsvel elrhe tnek kell lennik. A YouTube esetben ez azt jelenti, hogy videkat kereshetsz pusztn egy a keressi feltteleket tartal maz URL segtsgvel.

Ez az alap-URL hasznlatos az sszes REST-krelemhez a VouTube-on.

Videk krelmezse felhasznl szerint

Ha egy bizonyos YouTube-felhasznl kedvenc videit szeretnd lehv ni, ki kell egsztened a fenti URL-t, s a YouTube-felhasznl nevt Egy VouTube-felhaszna'l kedvenc videi is meg kell adnod: hoz a felhasznl neve nyjt hozzfrst.
h t t p : //g d a ta .y o u tu b e . c o m /fe e d s /a p i/u s e r s /u s e r ^ a m e /fa v o rite s

Ha teht az e lm e r p r ie s tle y nev felhasznl kedvenc videira vagy kvncsi, a kvetkez URL-t hasznlhatod:
h t tp : //g d a ta .y o u tu b e . c o m /fe e d s /a p i/u s e r s /e lm e r p r ie s tle y /fa v o r ite s

Cz a R E $ T -k re le tn az e lm e rp rie s tle y

Y o u T u b e -fe lh a s z n l
3(j j a

kedvenc vi-

vissza e re d m n yk n t.

Videk krelmezse kulcsszavas keresssel


Ennl hatkonyabb s gyakran hasznosabb YouTube-videkrelem egy kulcsszavas keress, amely fggetlen a felhasznlktl. Egynl tbb kulcsszt is hasznlhatsz, ha perjelekkel elvlasztod azokat az URL vgn:
h ttp :/ /g d a ta . y o u tu b e . c o m /fe e d s /a p i/v id e o s /- /^ e y ^ o r d l/A e y iv o r d
2

Egy videkeressben tbb kulcsszt is megad hatsz, ha perjelekkel elvlasztod azokat.

/ . . .

Az URL ugyangy kezddik, mint -------^ t . , a felhasznl szerinti kerelemnel, de h .1 ,1 , v id w i"

Ne feledkezz meg a per. ' r

lia teht az elvis" s az impersonator" kulcsszavakkal kapcsolatos ked venc videkat keresed, az albbi URL-re lesz szksged:
h t t p : / / g d a t a .y o u tu b e . c o m /f e e d s /a p i/v id e s /- /e lv is /im p e r s o n a to r

Itt a videka* az elvis" s M impersonator" kulcssza vakkal keressk.

A kulcsszavakban nem szmt a kis- s nagybeti*___ ^ klnbzsge, teht az elvis , az E lvis s az eLvIs" ugyanazt az eredmnyt adja.

682 12. fejezet

Tartalom sugrzs s w ebszo/g/tatsok

Lgy a YouTube REST-krelem!


A feladatod, hogy befrkozz a YouTube elmjbe, s eljtszd egy REST-videkrelem szerept. Az oldal aljn tallhat hutomgnesek segtsgvel lltsd ssze a kvetkez'YouTube-videkra irnyul REST-krelmeket, majd prbld ki okt a webbngszodben!

Minden vide, ami a Roswell" kulcsszhoz kapcsoldik:

Minden vide, ami az alien" s abduction" kulcsszavakhoz kapcsoldik:

Minden vide, ami a headfirstmork nev felhasznl kedvenceknt van megjellve:

Minden vide, ami az uf", sighting" s dog" kulcsszavakhoz kapcsoldik:

Minden vide, ami az aliensabductedme nev felhasznl kedvenceknt van megjellve:

h t t p : / / g d a t a . y o u tu b e . c o m / fe e d s /a p i/

Elfordulhat, hogy egyes mgneseket tbbszr is fel kell hasznlnod.

---- -------, -, -

f a v o r it e s

m o st i t t vagy

683

Lgy a YouTube REST-krelem ! - m egolds

A feladatod, hogy befrkzz a YouTube elmjbe, s eljtszd egy REST-videkrelem szerept. Az oldal aljn tallhat hfftmgnesek segtsgvel lltsd ssze a kvetkez YouTube-videkra irnyul REST-krelmeket, majd prbld ki ket a webbngszdben! g* A < - ------Elfordulhat, hogy egyes mgneseket tbbszr is fel kellett hasznlnod.

Az sszes REST-krelem YouTube URL-je ugyangy kezddik.

Minden vide, ami a Roswell" kulcsszhoz kapcsoldik:

Az egyetlen kulcssz az utols elem az URL-ben

Minden vide, ami az alien" s abduction" kulcsszavakhoz kapcsoldik

A keressi kulcsszavak mindegyike az URL vgn szerepel, s perje lek vlasztjk el okt egymstl.

Minden vide, ami a headfirstmork nev felhasznl kedvenceknt van megjellve


h t t p : / / g d a t a .y o u t u b e . c o m / f e e d s / a p i/ H use rs 1 / U h e a d fi

Ha egy felhasznl kedvenceit keressk, az URL-ben a vides" helyett a users szt kell hasznlnunk.

T*1

Minden vide, ami az uf", sighting" s dog" kulcsszavakhoz kapcsoldik

Az URL a favorites"
Minden vide, ami az aliensabductedme nev felhasznl kedvenceknt van megjellve: ^

szval vgzdik.

Ezt a mgnest nem hasznltuk fel. sszeeskvs/

Ez annak 3 felhasznln3k a neve, akinek a kedvenc videit el szeretnnk rni.

684 12. fejezet

Tartalom sugrzs s w e bszo lg lta t so k

Nincsenek

! Miben klnbznek a REST-krelmek mondjuk a GET-krelmektl?

\ Semmiben. Amikor GET-krelmet hasznlsz, pldul egyszeri en egy weboldalt krsz, valjban a REST-et hasznlod. Egy szokvnyos weboldalra annyiban tekinthetsz gy, mint egy REST-erforrsra, hogy egy URL-en keresztl rheted el, mg pedig a GET REST-mvelet segtsgvel. A REST akkor vlik rdekesebb, amikor lekrdezsek felptsre hasznlod, mint a YouTube-videkrelmek esetben. Ekkor is RESTkrelmekrl van sz, de ahelyett, hogy egyszeren egy stati kus weboldalt krnl, egy adatbzisbl olvasol ki adatokat.

! A YouTube-on vgrehajtott kulcsszavas keresseknl szmt a param terek sorrendje? ! Igen. Az elrbb ll kulcsszavak elnyben rszeslnek a k sbb kvetkezknl, ezrt gyelned kell r, hogy cskken fontossgi sorrendben sorold fel ket.

I Ha egy videkeress tbb tallatot is ad, mi alapjn dnti el a YouTube, hogy mely videkat kell visszaadnia? ! A kulcsszavas YouTube-videkrelmek a legpontosabb illesz keds elve alapjn adjk vissza a videkat, teht azokat a vide kat fogod megkapni, amelyek a leginkbb megfelelnek a megadott kulcsszavaknak, fggetlenl attl, hogy mikor tet tk fel ket a YouTube-ra.

m o st i t t vagy 685

egy REST-krelem felptse

Alig vrom , hogy lssam a v id i t a I la to k a t...

Owen kszen ll, hogy felptsen egy REST-krelmet


Mivel Owen clja az, hogy- megtallja azokat az idegenes videkat a YouTube-on, amelyek ben esetleg Agyar is szerepel, a benyjtand REST-krelem tpusaknt egy kulcsszavas ke ress tnik a legsszerbbnek. Azoknak a videknak a megtallsra, amelyekben esetleg Agyar is feltnik, szmos kulcssz-kombincit lehetne hasznlni, de egy klnsen gre tesnek tnik a kifejezetten Agyarhoz kapcsold videk kiszrsre:

http: //gdata. youtube .com/feeds/api/videos/-/alien/abduction/head/first

Egy szokvnyos YouTube-videkeress vgrehajtsa sorn valsznleg nem hivatkoznnk egy knyvsorozat cmre - de ebben az esetben j t letnek tnik. Mondjuk gy, hogy valamilyen rejtlyes vletlennek kszn heten az idegenes videk nagy rszt az Agyhullm-rajongk ksztettk. Most, hogy megvan a REST-krelem URL-je, Owen kihzhatja az 1. lpst a YouTube-videlehvsi feladatok kzl.

Az utols kt kulcssz gondoskodik rla, hogy megtalljuk az Owenhez s Agyarhoz kapcsold idegenes videkat.

A YouTube-krelem URL-jnek kszn

heten vgeztnk az els lpssel.


o Q
q

A YouTubo vidrkra irnyi kfolom fotptso. A videkrelem kiadsa a YouTube fel. A YouTube vlaszadatainak fogadsa, amelyek infor mcikat tartalmaznak a keresett videkrl. A vlaszadatok feldolgozsa s HTML-kdd alaktsa.

686 12. fejezet

Tartalomsugrzs s webszo/g/tatsok

Prbld ki Owen YouTube-krelmnek URL-jt!


rd be Owen YouTube-krelmnek URL-jt egy webbngszbe: h ttp ://g d a ta .y o u tu b e .c o m /fe e d s /a p i/ v id e o s / - / a lie n / a b d u c t io n / h e a d / f ir s t Mit ltsz a bngszben? Nzd meg az oldal forrst is, hogy lsd a YouTube llal visszaadott tnyleges kdot!

YouTube Videos

YouTube Videos
UFO Spotted Crashing Party at G racela...
tn an unusual conspiratonal twist of fate, a UFO was spotted crashing a raucous party at Graceland. the home of me undisputed King of Rock n Roll. Read Head First PHP & MySQL*, http/vwww.headfirstlabs.com Read more. Search Articles:

Article Length:

Sort By:

Aliens Turn Face of Sphinx Into a Dog!


watch as a UFO laser chisels the face of the Sphinx into a Pug. Read Head First PHP & MySQL! http://www.headfirstiabs.com Read more...

Date

T itle
Source

New
Recent Articles:

Dog Rides in UFO Hovering Near San...


This shocking video shows a pug taking a ride in a UFO as it flies around near the Golden Gate Bndge.

Qfiadmore^ UFO Spotted Near Eiffel Tower!


Check out this video of a UFO zapping cats in Pans. Read Head First PHP & MySQL! httpj/www.headfirstlaDs.com Read morgi:-

All Today Yesterday Last Seven Days This Month Last Month Source: YouTube Videos Actions: Update Now

Pug Abducted By UFO!

eftmateftuclecfeira Ywtfarday. 9:51 PM

Help! My dog was abducted by aliens Read more

A webbngszo a YouTube vlaszban vissza kapott XML-adatokat hrfolyamknt jelenti meg, csak ppen ebben az esetben minden hrelem egy-egy vide.

m o s t i t t vagy 687

REST-krelmek kiadsa p h p -p a ra n c s f jl segtsgve!

Videkat lehvni a YouTube-rl egyszeren

egy URL bersval a b n g sz d e klassz, meg minden, de ml kze ennek a PHP-hez? M i rt nem lehet elemi a videkat egy parancsfjlbl?

A PHP SimpleXML bvtmnye, amely

a simplexml_load_file() fggvnyt knlja, az 5-os vltozat ta rsze a PHP-nek. A PHP korbbi kiadsai teht nem rendelkeznek be ptett tmogatssal az XML-feldolgozshoz.

Ez is lehetsges, csak egy olyan PHP-fggvnyre van szksgnk, amely lehetv teszi egy REST-krelem kiadst s a vlasz fogadst.
A PHP beptett sim p le x m l_lo a d _f i le {) fggvnyvel olyan RESTkrelmeket - pldul YouTube-krelmeket - adhatunk ki, amelyek XML formtum vlaszokat eredmnyeznek. A fggvny valjban egy PHPobjektumba tlt be egy XML-dokumentumot, amelyet aztn az XML-adatok feldolgozsra s a kvnt informcik kinyersre hasznlhatunk. De m i lyen hatssal van ez Owen YouTube-videkrelmre? Nzd meg az albbi kdot, amely egy llandt hoz ltre egy YouTube-URL trolsra, majd egy REST-krelmet ad ki a s im p le x m l_ lo a d _ file () fggvny segtsgvel: d e f in e ( *YOUTUBE_URL1, h ttp ://g d a ta .y o u tu b e .e o m /fe e d s /a p i/v id e o s /- /a lie n /a b d u c tio n /h e a d /fir s t') $xml = s in p le x m l_ lo a d _ file (YOUTUBE_URL);

Br szigoran vve nem ktelez, ltal- J bn j tlet a statikus URl-eket llan dkban trolni, hogy tudjuk, hol kell megvltoztatni ket, ha szksg lenne r.
o A YouTubo v idekra irnyul krolom flptse. A vidokrolom kiadsa a YouTubo fel. A YouTubo vlaszadatainak fogadsa, amolyok informacikat-tartalmaznak a korosott videkrl: A vlaszadatok feldolgozsa s HTML-kdd alaktsa.

Nem kell aggdnod, ha nem tudod, mi az az ob jektum - a PHP-kmyezetben klnsen nem. A PHP-objektum olyan klnleges adattpus, amely lehetv teszi, hogy* egyetlen szerkezetbe cso magoljunk adatokat s fggvnyeket. Egyelre elg annyit tudnod, hogy a PHP-ben sokkal knnyebb ob jektumok hasznlatval feldolgozni az XML-adatokat. Ennek mdjrl hamarosan bvebben is szt ejtnk.

688

12. fejezet

Ezzel a kt lps sel megvagyunk!

Tartalomsugrzs s webszolgltatsok

<?xml v e rsio n - '1 .0 ' encoding-'UTF-8'?> feed xmlns-http://www.w3.org/2005/Atom xmlns:openSeareh-http://a9.eom /-/spec/opensearchrss/l .0/ * xmlns :gml- h t t p ; //www .opengis. net/gm l' xmlns:georss-h ttp : / / www.georss .org/georss * xmlns :media-'h t t p : //s e a rc h .yahoo.com/mrss/ xmlns:batch-' h t t p : / /schemas. google.com/gdata/b a tc h xm lns:yt-'h ttp ://g d a ta .y o u tu b e .com/schemas/20071 xmlns: gd-h t t p : / /schemas.google.com/g /2005'> id>h t t p :/ / g d a t a .youtube.com/reeds/a p i/ users/aliensabductedm e/favorites/id> <updated>2008-08-0lT20:37; 48.7982</updated> category scheme-'http://schemas.google.com/g/2005#kind' term-'h t t p :/ / g d a t a . youtube.com/schemas/2007#v ideo /> < t it le type- te x t >Favorites of aliensabductedm e/title> <logo>http://www.youtube.com/img/pic_youtubelogo_123x63.g if< /lo g o > lin k r e l- 'r e la te d ' type-' application/atom *xm l h re f- http://gdata.youtube.com /feeds/ a p i/users/aliensabductedme / > < lin k r e l- alternate* type- te x t/h tm l h re f- 'http://w w w .youtube.com /profile_favorites?user-aliensabductedm e / > lin k r e l- http://schem as.google.com /g/2005#feed type- application/atom+xml' h re f- 'h t t p : / /gdata.youtube.com /feeds/api/users/aliensabductedm e/favorites' / > lin k r e l- 'http://schemas.google.com/g/2005#batch' type-' application/atom *xm l' h re f- 'http://g data.y outube.com /feeds/api/users/aliensabductedm e/favorites/batch'/> c lin k r e l - 's e l f ' type- application/atom+xml h re f- 'http://gd ata.y o utub e .co m /fee ds/ap i/use rs/aliensabductedme/favorites?start-index=lfcamp;max-results-25 / > <author> <name>aliensabductedme</name> <uri>h t t p : / /gdata.youtube.ccm /feeds/api/users/aliensabductedm e/uri> </author> <generator version- '2 .0 u r i- 'h ttp ://g d ata .y o u tu b e .co m / >YouTube data API</generator> openSearch:totalResults>9/openSearch:totalResults> <openSearch:startIndex>l</openSearch:startlndex> openSearch: itemsPerPage>25/openSearch:itemsPerPage> <entry> <id>h ttp ://g d a ta .y o u tu b e . com/feeds/a p i/videos/_6U ibqf0vtA /id> published>2006-06-20T07:4 5:05.000-07:00/published> updated>2008-08-01T09:19:58.000-07:00/updated> <category scheme-'http://gdata.youtube.com /schem as/2007/keyw ords.cat' term-' s ig h tin g s /> <category scheme-http://gdata.youtube.com/schemas/2007/keywords.cat' term -'ca /> <category scheme- http://gdata.youtube.com/schemas/2007/keywords. c a t ' term-'5 1'/> category scheme-'http://schem as.google.com /g/2005#kind' term='h t t p : / /gdata.youtube.com/schemas/2007fvideo / > <category scheme- h t t p : //gdata.youtube.com/schemas/2007/keywords. c a t term -'area /> category scheme- http://gdata.youtube.com/schemas/2007/keywords.cat' te rm - 'a lie n s /> category scheme- 'h ttp : //gdata.youtube.com/schemas/2007/keywords.cat term- 'a lie n ' /> category scheme-'http://gdata.youtube.com /schem as/2007/categories.cat' term -'Travel' label-'T ravel &amp; Events'/> category scheme-http://gdata.youtube.com/schemas/2007/keywords.cat term-C a lif o r n ia '/> category scheme-'http://gdata.youtube.com/schemas/2007/keywords.cat' term-'nevada'/> <category scheme-'h ttp ://g d a ta .y o u tu b e .com/schemas/2007/keywords .c a t' term-u fo /> category scheme- http://gdata.youtube.com/schemas/2007/keywords.cat term-' s ig h t in g '/> ^ ^ "" t i t l e type-' t e x t >UF0 S ighting in Yosemite Park near Area 5 1 /title > content type- te x t >1 went on a t r i p to Yosemite Park in 2002. Yosemite Park is very close to the border between C a lifo r n ia and Wr evening, on my way out of the park, I was d riv in g down a winding road, when I saw a small b a ll of lig h t high up in the sky, and a long tw irle d t r a i l behind i t . I video taped i t for a few seconds, and then I grapped my camera to take some photos a jr i t well enough. U nfortunately i t was too dark for the photo camera, so the pictures d id n 't come out. A ll I have is the v i The b a ll of lig h t with the huge halo moved across the sky, leaving a t r a i l . A fter about 2 minutes the b a l l of lig h t dLisaa was illu m in a te d and s t i l l b r ig h tly v is ib le even when the surrounding sky was already p itc h b lack. f

A few minutes la te r several A ir Force je ts appeared and c ir c le d in the sky where the l ig h t had disappeared.</content>I lin k r e l- 'a lte r n a te type- te x t/h tm l hre f- http://www.youtube.com/watch?v-_6Uibqf0vtA'/ > I lin k r e l- h t t p : //gdata.youtube.com/schemas/2007#v id e o . responses type-' application/atom+xml' hre f- h t t p :/ / g d a t a .y i lin k r e l- http://gdata.youtube.com /schem as/2007#video.related' type- application/atom+xml' h re f- h ttp ://g d a ta . yout^k lin k r e l- s e l f ' type-'application/atcfflH-xml' h re f- http://gdata.youtube.com /feeds/api/users/aliensabductedm e/favorit5 author> <name>gaspirt2 /name> uri> h t t p :/ / g d a t a .youtube.com/fe e d s /a p i/u s e rs /g a s p irtz/u ri> </author> media :group> m e d ia :title ty p e - 'p la in >UF0 S ig h tin g in Yosemite Park near Area 5 1 /m e d ia:titie> <m edia:description type-p l a i n >1 went on a t r i p to Yosemite Park in 2002. Yosemite Park i s very close to the border between C a lifo r n ia and Nevada, and JlU&U 16 Area 51. In the evening, on m way out o f the park, I was d riv ing down a winding road, when I saw a small b a l l of l ig h t high up in the sky, with a large halo of lig h t y surrounding i t , and a long tw irle d t r a i l behind i t . I video taped i t for a few seconds, and then I grapped my camera to take some photos as w ell, in case the video camera d id n 't capture i t well enough. U nfortunately i t was too dark for the photo camera, so the picture s d id n t come out. A ll I have is the video I took before and a fte r I took the photos.

nnav. osaK eppen fokozza a problmt: mi a fent csinlunk egy ekkora kupac zavaros XML-adattal? Kizrt, hogy egy HP-parancsfjl ki tudn azt bogarszni!

The b a ll o f lig h t with the huge halo moved across the sky, leaving a t r a i l . A fter about 2 minutes the b a ll o f lig h t disappeared, and only the t r a i l remained. The t r a i l was illu m in a te d and s t i l l b r ig h tly v is ib le even when the surrounding sky was already p itc h black. A few minutes la te r several A ir Force je ts appeared and c ir c le d in the sky where the l ig h t had disappeared./m edia: description> <media:keywords>51, a lie n , a lie n s , area, ca, C a lifo r n ia , nevada, s ig h tin g , s ig h tin g s , ufo/media:keywords> < yt:duration seconds-'50'/> media:category la b e l- Travel tanp; Events' scheme- http://gdata.youtube.com /schem as/2007/categories.cat>Travel/media:category> onedia:content u r l- http://www.youtube.eom/v/_6Uibqf0vtA' type- application/x-shockw ave-flash' medium-' v id e o ' is D e fa u lt- ' t r u e ' expression- f u l l d u ra tio n * 50 yt format- 5 /> < nedia:content u r l- r t s p :/ / r ts p 2 . youtube.com/ChoLENy73wIaEQn&wSnbiKl_xMYDSANFEgGDA /0/0/0 /video.3gp type-'video/3gpp medium-v id e o expression- f u l l 3 duration- 50 y t : format- 1 /> <3nedia:content u r l- rtsp://rtsp2.youtube.com/ChoLENy73wlaEQnQvvSnbiKl_xMYESARFEgGDA--/0/0/0/video.3gp type-'video/3gpp medium-v id e o expression- f u l l d u ra tio n - '50 yt:form at- 6'/> <media:piayer u r l- http://www.youtube.com/watch?v-_6Uibqf0vtA /> media:thumbnail u r l- h ttp ://im g .y o u tube.com /vi/_6U ibqf0vtA/2.jp g ' he ig ht- '9 7 w idth- l3 0 time-00:00:25'/> media: thumbnail u r l- h ttp ://im g .y o u tu b e .co m /v i/_6 U ib q f0 v tA /l.jp g height- 97* w idth-'130' time- 00:00:12.500'/> media: thumbnail u r l- 'h ttp :/ /im g . youtube. com/vi/_6Uibqf0vtA/3. jp g height- 97 width- 130 time-*00-.00:37 .500 /> media: thumbnail u r l- h ttp ://im g .y o u tube.eom /vi/_6U ibqf0vtA/0.jp g height-'240 width-'320' time-00:00:25'/> /media:group> < yt- .statistics viewCount- 2528356 * favoriteCount- l9 3 l /> <gd:rating min- l max- 5' numRaters-'1648' average-'4 .1 7 '/> <gd:conments>

valjban nem is olyan zavaros, mint amilyennek ltszik...csak tudnod kell, mit kell keresned.
evQuco! n i uu i u u e -iu i K ap n AiviL-Kod

most itt vagy

689

a krelem x m l-t ad vissza

A YouTube az XML nyelvn beszl


A YouTube-tl kapott videvlasz nem kimondottan egy zsugorfliba csrnagolt s az ajtd el letett DVD, hanem egy XML-dokumentum, amely csak rszletes informcikat tartalmaz a krt videkrl, nem magukat a videkat. < fe e d x m in s = ' h ttp ://w w w .w 3 .a rg /2 0 0 5 /A to n i xmlns :openS earch=' h t t p : / / a 9. c o m /-/s p e c /o p e n s e a r c h r s s /l. 0 / '
x m ln s :g m l= 'h ttp :/ /w w w .o p e n g is .n e t / g m l' x m ln s :g e o r s s = 'h ttp ://w w w .g e o r s s .o r g / g e o r s s 1 x m ln s :m e d ia = ' h t t p : / / s e a r c h . yah o o .co m /m rss/ *
< ? x m l v e r s i o n u l . 0 e n c o d i n g = 'U T F - 8 1 ? >

Y o u T llb 3 V id O k rfil*

mekre olyan XML-adainl/l/al \ / 5 l a C 7 n l

l R R d l V d l d ^ U I , d lM C iy C * I i j /i .
16 1T13 K 3 \ /ld60K 3T .

Afflpll/pll

x m ln s :b a tc h = 'h ttp ://s c h e m a s .g o c g le .c o m /g d a ta /b a tc h ^ 32 XML-kd elQ x m ln s : y t - 'h t t p : / / g d a t a .y o u tu b e .c o m /s c h e m a s /2 0 0 7 ' x m ln s :g d ^ *h ttp ://s c h e m a s .g o o g le .c o m /g /2 0 0 5 '> ZSfolt, annyit megfigyel< id > 'rirtp : / / g d a t a . y o u tu b e . c .>m/ fe e d s /a p i /u s e r s /a I iensabductedm e/ f a v o r it e s < /id > hetsz, hogy minden vide <updated>2008-07-25T03: 2 2 : 3 7 .O O lZ </updated>
^ c a te g o r y scheme-' h t t p : //schem as .g o o q le . com /g/2005#kirid te rm * * h t t p : / / g d a t a . y o u tu b e . com /schem as/2007#v id e o 1/ > e type= *t e x t > F a v o r ite s o f a lie n s a b d u c t e d m e < / t it ie >

. /

P W - fi tf

< e n t f V > elem

3i belsejben tallhat.

<ent ry> .

... 5.^
y,y

< 1 j > h t t p : / / g d a t a . yout u b . com/ f e e d s / a p i / v id e o s /_<SUibqf OvtA </ id > .. . . ' - - : ' --Z .;7 : i .= 00-07 : 0 0 < / p u b lis ed> n

< m edia: ip> <medi a i t i t : l e ty p e ~ T l a i n * >UFO S ig h t in g i n Y ase m ite P ark n e a r Area 51</m e d ia : t i t le > p <media d e s c r i p t i o n type- *p l a i n >1 went on a t r i p to Y osem ite Park i n 2002. Yosemi te P ark i s v e ry cl to th e b o rd e r betw een ; r o r n ia and Nevada, and c lo s e t o Area 5 .1 .. . < /m e d ia : d e s r ip t io n > c-medl'a : keywords> 51 r, a l i e n , a l i e n s , a r e a , c a , C a l i f o r n i a , nvada, s i g h t i n g , s i g h t i n g s , u i o< / med i a : keywo rd s > < y t : d u r a t io n S eco nds- 15 0 ' /> <m edia: c a te g o r y l a b e l 'T r a v e l Stamp; E v e n ts ' h ttp : . . . : ....... < m edla: c o n te n t u r i- ' h t t p : //w w w .y o u tu b e . c o m /v /_6 U lb q fO v tA 1 t y p e * a p p lic a tio n / x - s h o c k w a v e - f la s h ' m edium-' v id e o ' i s D e f a u i t = ' t r u e 1 e x p r e s s io n - f f u l l ' d u r a t i o n = '5 0 ' y t : fo r m a t= * 5'/><m edia:co nte nt. ur 1 = *r t s p :// r t s p 2 .yout u b e .com/ChoI.KNy73wI aE Q nQ w S nbiKI xMYDSANFEgGDA=-/0 / 0 / 0 / v id e o .3 g p 1 type- v ideo /3gpf. ' m edium=' v id e o * e x p r - s s io h = ' f a l l ' d u r a t i o n 2 ' 50* y t : f o r m a t - '1 */> C m e d i a : c o n t e n t u r l = *r t s p : / / r t s p 2 . y o u t u b e .c o m / C h o L E N * y 7 3 w I a Q n Q v v S n b i K I _ x M Y B S A R F E g G D A V 0 / 0 / 0 / v i d e o . 3gp' t y p e *v i d e o / 3 g p p * m e d i u m - *v i d e o 1 * ' ill * d u r at i o n * * 5.01 y t : ' ' <m e d ia : p l a ye r u r 1= *h t t p : f / www. you t u b e . com./watch ? v=_U i b q f OvtA / > Crnedia: t*humb: a i 1 u r l - ' h t t p : / / im g .y o u t iib e .c o m / v i/ 6 u ib q fO v tA /2 . j p g ' h e ig h -* 97* w id t h * ' 130* n t i me- ' : < m edia : t numbnai 1 u r l * * h t t p : / / i m g . y o u tu b e . c o m / v i/ jjSU i b q f $ v tA /.l. j pig'' h e ig h t - ' 97* w id th - ' 1 BO' Mme-'OC : 00:12 . 5 0 0 '/> C m edia: th u m b n a il u r l= ' h t t p : / / im g .y o u t .u b e .c o r o / v i/ _ 6 J ib q I0 v t A / 3 . j p g ' h e ig h t - ' 97' w id t h - '1 3 0 ' < to e d la :th u m b n a il u r l 'h r t p : / / i mg. y o u tu b e , com/v i/ _ 6 U i b q f O vtA /0 . j p g ' h e ig h t ^ '2 4 0 ' w id th = '3 2 0 ' : : ' < /m e d ia :g ro u p > < y t : s t a t i s t I cs v i ev/Count-' 24*78159T f a v o r i te C o u n t= r 18971/ > < g d : r a t i n g min= ' 1 ' I'.'.ax-' 5 ' num R ate rs= ' 1602 ' average*-' 4 .17 '/ > < gd : comments> <q-i: fe e d L ln k h r e f = 'h t t p : / / g d a t a . y o u t ib e .c o m /fe e d s /a p i/v id e o s /^ t.'ib q fO v tA y c o m m e n ts ' c o u n tH ii.t - ' 4426' / > </ g d : comment s> < /e n tr y > ' ry> < 1 d>h 1 1 p : / / gda t a . y o u t u b e . c o m / f eed s / a p i /v i deo s / XpNd-Dg6 _ z Q < / i d > < p u b lish e d > 2 0 0 6 - ll- 1 9 T 1 6 : 44 : > 3.000-08: 0 0 < /p u b ' i shed> \

...
</er;t ry> </ ic(jd>

Ez az < e n try > elem egy jabb videt indt az XML-va'laszadatokon bell.

690

12. fejezet

Tartalomsugrzs s w ebszolgltatsok

Hegyezd ki a ceruzd!
Tanulmnyozd a YouTube-vlasz XML-kdjnak kiemelt rszt az elz oldalon, s vlaszolj az albbi krdsekre. Lehet, hogy tbbet tudsz a YouTube-videk XML formtumrl, mint ahogy elsre gondoltad!

1. Mi a vide cme?

2. Melyik hrom kulcsszt trstottk a videhoz?

3. Milyen hossz a vide msodpercben mrve?

4. A YouTube melyik videkategrijba tartozik a vide?

5. Hnyszor nztk meg eddig a videt?

6. Milyen tlagpontszmra rtkeltk a videt a felhasznlk?

m o s t i t t vagy 691

Hegyezd k i a ceruzd! - m egolds

Hegyezd ki a ceruzd! Megolds

Tanulmnyozd a YouTube-vlasz XML-kdjnak kiemelt rszt az elz eltti oldalon, s vlaszolj az albbi krd sekre. Lehet, hogy tbbet tudsz a YouTube-videk XML formtumrl, mint ahogy elsre gondoltad!

<nvedia: title type='plain

1. Mi a vide cme?

U'O

in Yosemrt Park war jVea *5/

2 . M elyik hrom kulcsszt trstottk a videhoz?


3. Milyen hossz a vide msodpercben mrve?
Az XML egyes karaktereket kln leges kdokkal r le - az &amp; v pldul az & (s") jelet jelli. J ,

fi, aliens, neyada

. f

A YouTube melyik videkategrijba tartozik a vide?

Hha, ez rengeteg! Majdnem 2,5 milliszor nztk meg a videt!

5. Hnyszor nztk meg eddig a videt?

6. Milyen tlagpontszmra rtkeltk a videt a felhasznlk?

. .^.(7.

692

12. fejezet

Tartalom sugrzs s w ebszolg/tatsok

Hm. Egy k ic s it sszezavartak azok az XML-elemek, amelyeknek kt, kettsponttal


elvlasztott nevk van. Ez az elemek rendszerezst segti? Es mi a helyzet azzal a furcsa &amp; kddal a vldekategrlban?

A szokatlan XML-kdok nvtereket (namespace) s egyedeket (entity) hasznlnak, amelyek az elemek rendszerezsben s a kln leges karakterek kdolsban segtenek.
Ha olyan XML-elemet ltsz, amelynek kt, kettsponttal elvlasztott neve van, akkor egy nvtrrl v a n sz, amely elemek egy halmazt rendezi egy logikai csoportba. A nvtereknek az a clja, hogy megakadlyozzk az azo nos nev elemek tkzst, ha ugyanabban a dokumentumban tbb XMLsztr is hasznlatos. Pldaknt vegyk az albbi kt XML-elemet:

< m e d ia :title r.ype-piain'>UPO S iqh ting in Yosemite Park ncar Area b l< /m e d ia:U tle >

A nvterek XML-elemek nvvel elltott csoportjai, mg az egyedek klnleges ka rakterek kdolsra hasznlatosak az XMLdokumentumokon bell.

A msodik < t it le > elemben lev m dia nvtr nlkl lehetetlen lenne meg klnbztetni a kt elemet, ha ugyanabban az XML-kdban szerepelnnek. A nvtereket teht egyfajta eltagnak vagy vezetknvnek tekintheted, amely egy keresztnevekkel teli XML-dokumentum sszeomlst akadlyozza meg a rokon elemek azonostsval. A YouTube-vlaszkd tbb klnbz nvte ret is hasznl, ami azt jelenti, hogy valjban egyszerre tbb klnbz XMLnyelven beszl - ezek vilgos megklnbztetst teszik lehetv a nvterek. Az egyedisg biztostshoz egy XML-nvteret mindig egy URL-hez kell trsta ni. A YouTube XML-adataiban hasznlt mdia nvtr meghatrozsa a <^eed> elemen bell pldul gy trtnik:

xm lns:m edia='h ttp ://s e a r c h .y a h o o .c o m /m r s s /1

Klnsnek tnhet, hogy egy Yahoo-ne'vtr szerepel egy YouTube XML-kdban, de csak arrl van sz, hogy a YouTube rszben egy olyan adatform tumra tmaszkodik, amelyet a Yahoo! alkotott meg.
= &

Ez az URL valjban nem egy weboldalra mutat, hanem egy ne'vtr egyedi azonostja.

A YouTube XML-kdjban a msik furcsa dolog az &amp; kd - az XML gy je lli az s (&) karaktert. A kd egy XML-egyed - az egyedek olyan klnleges karaktereket jellnek, mint az & a < vagy a >, amelyek mind klnleges jelen , tssel brnak egy XML-kdon bell. Albb azt az t elre meghatrozott XMLegyedet lthatod, amelyekkel valsznleg tallkozni fogsz, ahogy mlyebben elmerlsz az XML-kdolsban:

most i t t vagy 693

a youtube xm l-vlasznak szerkezete

A YouTube XML-vlasznak megfejtse


Ha mr ismered a YouTube-vlaszok szerkezett, a keresett videadatok kinyerse meglehetsen egyszer. Azon kvl azonban, hogy tudnod kell, hogy mely elemek s jellemzk milyen adatokat trolnak, azt is fontos megrtened, hogy az elemek hogyan viszonyulnak egymshoz. Ha mg emlkszel r a fejezet korbbi rszbl, ahol egy RSS-folyamot elemeztnk, tudhatod, hogy az XML-dokumentumok elemek hierarchi jaknt brzolhatok. Ez a YouTube videvlaszaiban kapott XML-adatokra is rvnyes:
< e n try >

Ez a < t i t l e >
_

< id> h t t p :/ / g d a t a .y o u t u b e . c o m /fe e d s /a p i/v id e o s /_ 6 U ib q fQ v tA < /id > X e8 ' rn m aZ <published>2006-06-20T07:49:05.000-07:00 < /published> / a Vide cmt.
<med i a : qroup> cm edla: t i t l e ty p e = *p l a i n >VF0 S ig h t in g i n Y osem ite Fark n e a r Area 5 1 < / m e d ia : t it le > *

Ebben a kdban az elem neve title " , a nvtr pedig mdia'

<media:description type='p la in '>1 went on a tr ip to Yosemite Park in 2002. Yosemite Park is very close tc the be rdei t *.ween C ali :-rnia sn: Nevidi, and rlose .. Area 51. . . <, : i : c . . j i iptiQn? A v.dftonoz
<medi-a: keywordS>51, a l i e n , a l i e n s , a re a , c a , C a l i f o r n i a , n e v ad a, s i g h t i n g , s i g h t i n g s , ^ csit kulcsszavak. u fo < /m e d ia : keywords> t : cur n is - * 50' /> ^ = ----------------- ------ -------- A Vide hossza < jn e d ia :c a te g o r y l a b e l* 'T r a v e l Samp; E v e n ts ' <3r msodpercben, scheme-' t t p : / / g d a ta .y o u tu b e .c o m /s c h e m a s /2007/c a te g o r ie s T t 4 ^ > T r a v e l< /in e d ia r c a te g o : <m edia: c o n te n t u r l = ' h t t p : //www. y o u tu b e .c o m /v /_ 6 U ib q f0 v tA 1 ty p e = r5 p p i4 c a tio n /x - s h o c k w a v e - in a s h T m e d iu m = 'v id e o ' i s D e f a u l t = ' t r u e ' e x p r e s s i o n = 'f u l l ' d u r a t io n = *5 0 1 y t : formcTt^I5'/> " < m e d ia: c o n te n t u r l * ' r t s p : / / r t s p 2 . youtube . com/ChoLEMy7 3 w IaE Q nQ vvS nbiK l_x M Y D 5 X pii^G D A = /0 /0 /0 / v id e o . 3gp' t y p e * ' v id e o / 3 g p p ' medium1v id e o ' e x p r e s s io n * ' f u l 1' d u r a t i o n * 150' y t : f o r m a t * ' I 1/> < m e d ia :c o n te n t u r l = ' r t s p : / / r t s p 2 . y o u tu b e . com/ChoLENy7 3wIaEQnQvvSnbiKl _xMYESARFEgGDA=^S>0/0 / 0 / v id e o . 3 q p f t v p e = / v i ^ e o / 3 g p b ^ j e d i u n ^ v i d e o ^ x p r e s s i o n ^ f u i ^ ^ d u r a t ^ n ^ 5 0 t : f o r m a t = '6' / > y A vide <medi.a : p i ayer u r l* * h t r p : / /v;ww. y o u tu b e . com /w at.ch?v-_6L'ibqfOvtA.' / > _ _ _ _ _ YouTubeitube . 3oro __6Uibqf0vt .jp g * h e ig h t - >" w *13 kategrija. time-' 00: GO: 25 '/> <medi a: th u m b n a il u r l = ' h t t p : / / i m g . y o u tu b e , c o m /v i/ S U ib q l JvtA /1 \pg h e ig h t = '9 7 ' w id th = '1 3 0 ' t im e - '0 0 :0 b : 1-2.500'/> <medi a : thum bnaj 1 u r l * ' h t t p : / / im g . y o u tu b e . com /vi / _ 6 U ib q f O v tA /3. jp ^ f' h e iq h t- 97 1 w id t h * ' 130' A YouTubet im e * '0 0 : 0 0 :3 7 .5 0 0 1/> on lev vide Cmedia: th u m b n a il u r l - ' h t t p : / / im g . y o u tu b e . c o m /v i/_ 6 U ib q fO v tA /0. jpg\ h e i g h t * 1240' w id t h = '3 2 0 ' ra mutat t i me-'0 0 : 0 0 : 2 5 '/ > </medi a : group> hivatkozs. A vide miniatr elontete. <yl : s L a t i s t i c s view Gunt-^'2478159' fa v o r ite C o u n t^ '1 8 9 7 '/ > a : i l _;: j i:;l i:11 ' iM^' ' ttnRa t r s 3 1 602' v e r a g e * T . 1 7 1/ *T 4 < gd : comments>

<qd: feedLink h r e f * ' h t t p : / /g d ata . youtube. eom /feeds/api,/ ^ id e o s / _ ^ J : b q f OvtA/ comments1 c o u n tH in t* '4 426'/>
< / g d :c o m m e n t s >

< / nt ry>

A gd" nvtr a Google Data rvidtse, s olyan elemeket tartalmaz, amelyeket a Google klnfle adatok brzolsra hatrozott meg - a YouTube ugyanis a Google rsze.

A vide tlagos fe l hasznli rtkelse.

A vide eddigi megtekintseinek szma.

A fenti XML-kdban eltemetett videadatok megrtsnek egyik fontos kulcst a ben ne hasznlt klnfle nvterek jelentik. A kifejezetten a videadatokhoz kapcsold elemek tbbsghez a mdia nvtr trsul, mg az y t nvteret kizrlag a < s t a t is t ic s > elemmel hasznljk, vgl, a megjegyzseket a <comments> elem zrja magba, amely a gd nvtrbe tartozik. Ezek a nvterek nagyon fontosak lesznek, amikor PHP-kdot rsz bizonyos elemek s a bennk lev adatok megkeressre.

694

12. fejezet

Tartalomsugrzs s webszo/g/tatsok

Az XML-videadatok kpi brzolsa


A fejezet korbbi rszben, amikor az RSS-kdon dolgoztl, megtudtad, hogy az XML-dokumentumok egymssal szl-gyermek kapcsolatban ll elemek (cmkk) hierarchijaknt brzolhatok Ezek a kapcsolatok mg fontosabb vlnak, amikor XML-kdot akarsz feldolgozni s elrni a benne trolt adato kat. Valjban felbecslhetetlen rtk kpessg, ha egy XML-dokumentumra pillantva rgtn fel aidod rajzolni az elemek kztti kapcsolatokat. Ne feledd, hogy minden olyan elem. amelyet egy msik elem zr magba, gyermekelem, mg a befoglal elem a szl. A YouTube-videnak az elz oldalon tallhat XML-kdjt elemezve a kvetkez hierarchit kapod:

Az elemek (element) az XML-cmkk (tag) s a kzttk ll adatok elvont brzo lsnak tekinthetk.

Az XML-adatok elemek (cmkk) hierarchijba rendezdnek.


id

Ebben a konkrt XMLkdrszletben az entry a legfels elem.

e n try |

p u b lis h e d

group

s ta tis tic s

comments

.lie

description keywords

duration

c a t e g o r y cor*tent c o n t e n t

p la y e r

th u m b n a il k . .

th u m b n a il

Az elemek eme hierarchijnak jelentsge az. hogy brmelyik elemtl eljut hatsz egy msik elemig, ha az tvonalt vgigkveted a hierarchia cscstl. Pldul ha a vide cmt szeretnd kinyerni, az tvonalt a kvetkezkppen hatrozhatod meg:

Egy elem megkeresse egy XMl-dokumentumban a szltl a gyermek fel vezet tvonal kvetst ignyli.

entry

group

title

Nincsenek

krdsek
Mirt kell trdnm a nvterekkel? Mert a msok ltal ksztett XML-kdok gyakran tartal maznak nvtereket, ami befolysolja, hogy miknt r hetsz el XML-elemeket egy programbl. Ahogy majd ltni fogod, az egyes elemekhez trstott nvterek kz vetlen hatssal vannak arra. hogy' miknt tallhatod meg az elemet, amikor XML-adatokat feldolgoz PHPkdot rsz. A nvtereket teht figyelembe kell venni minden olyan kdban, amely egy adott elemben trolt adatokat prbl kinyerni.

K V

Honnan tudhatom, hogy egy elem egy nvtr rsze? Br lehetsges olyan alaprtelmezett nvteret meghat rozni. amely nem jelenik meg kifejezetten egy-egy elem kdjban, a legtbb esetben a nvteret ott fogod tallni az elem nevben, teht a cm' elem pldul cmedia:title> s nem csak <title> formban fog szerepelni. A kettspont bal oldaln ll nv min dig a nvteret jelli.

m o s t i t t vagy 695

m inden a p h p -o b je ktu m o kr l

XML-adatok elrse objektumok segtsgvel


Az XML-adatokkal val munknak szmtalan mdja van a PHP-ben, de az egyik leg jobb az objektumok hasznlata. Az objektum olyan klnleges adattpus a PHP-ben, amely egyetlen szerkezetbe csomagol adatokat s Fggvnyeket. De mi kze ennek az XML-hez? Nos, az XML-dokumentumok teljes elemhierarchijt egyetlen vltoz trolja - egy objektum. Ezt az objektumot hasznlhatod arra, hogy elmerlj az ada tokban, s hozzfrj az egyes elemekhez. Az objektumoknak ezen kvl tagfggvnye ik (method) is vannak, amelyek olyan fggvnyek, amelyek egy objektumhoz kap csoldnak, s az objektum adatainak kezelst teszik lehetv. Az XML-adatokat tar talmaz objektumok tagfggvnyeinek segtsgvel elrheted egy elem gyermekobjektumainak gyjtemnyt, valamint a jellemzit is. m M
s kezelsre hasznlatos PHP-objektumok tpusa SimpleXMtElement.

Az objektum olyan klnleges adattpus a PHPben, amely adato kat s fggvnye ket foglal egyet len szerkezetbe.

Egy XML-dokumerim minden eleme elrhet egy XML-objektum tu lajdonsgaknt.

A SimpeXMLEIement objektumoknak olyan tagfggvnyeik vannak, amelyek le hetv teszik, hogy tbbet tudj meg az elemekrl, pldul kidertsd, hogy mi lyen gyermekelemeik s jellemzik vannak.

Owen kulcsszavas YouTube-videkeressnl mr lttad, hogyan kell ltrehozni ezt az XML-objektumot:

Ne feledd, hogy ez a fggvny a PHP 5-s vagy annl jabb vltozatt ignyli.

d e fin e { YOUTUBE_URL^ h t tp : / / g d a t a . youtube. c o m /fe e d s /a p i/v id e o s /- /a lie n /a b d u c tio n /h e a d / f ir s t 1) $xml = s im p le x in l_ lo a d _ file (YOUTUBE_URL) ;
Ez a fggvny egy SimpleXMLEIement tpus PHP-

Ez a kd egy $xml nev vltozt hoz ltre, amely a YouTube-videvlaszban objektumot hoz ltre, amely a YouTube-videvaiaszban kapott sszes XML-adatot egy PHP-objektumba csomagolva tartalmazza. kapott sszes XML-adatot tartat ma2za. Az adatokhoz az objektumtulajdonsgokon keresztl frhetsz hozz, amelyek az objektumon bell trolt nll adatelemek. Minden tulajdonsg egy-egy XML-elemnek felel meg. A kvetkez plda a dokumentum valamennyi entry elemhez hozzfr: Az elem nevnek (entry) meghatroz$ e n trie s = $xml->entry;

A - > mveleti jellel egy tulajdons got rhetsz el egy objektumon bell.

savai az XML-adatok kztt tallhat sszes elemet kiolvashatod.

Minden videbejegyzst az $entries tmb trol.

Ez a kd az XML-adatok kztt tallhat sszes e n try elemhez hozzfr egy tulajdonsgon keresztl. Mivel az adatok kztt tbb e n try elem is tallhat, az $ e n tr ie s vltozba egy objektumtmb kerl, amelyet az egyes videbejegyzsek elrsre hasznlhatsz. Mivel tmbbel van dolgod, a vi dekhoz tartoz <entry> elemeket a tm b sorszmozsval rheted el. A dokumentumban elsknt szerepl <entry> elem pldul a tmb els eleme, a msodik bejegyzs a msodik tmbelem, s gy tovbb.

$ e n trie s

696

12. fejezet

Tartalomsugrzs s w ebszolgltatsok

Amikor XML-adatokrl s PHP-objektumokrl van sz, valjban objektumok gyjtemnyvel van dolgod. Emlkszel mg, hogyan brzoltunk egy XMLdokumentumot elemek hierarchijaknt? Nos, ugyanezt a hierarchit a PHPben egy objektumgyjtemny valstja meg:

;e.ywords

d u r a t io n c a te g o r y co n te r .t conLeriL

th u m b n a il

thumbnail

Ha egy XML-objektum tkreben nzzk, az XML-elemek hierarebia'ja objektumok tbb szint' gyjtemnyv vlik.

A duration objektum a group objektum gyermeke, mivel a < d u ra tio n > elem a < g ro u p > gyermekeleme.

A rating objektum az entry objektum gyermeke, mert a < rating > elem az < entry> gyr mekeleme.

Egy YouTube-vide rdekes


A fenti elemhierarchia vagy objektumgyjtemny jelenti az alapot ahhoz, hogy megrti lesd, hogyan kereshetsz az XML-adatok kztt a PHP-ben. Az egyes XML-adatelemek kztti kapcsolatokat szben tartva olyan kdot rhatsz, amellyel mozoghatsz az adatok kztt, s kiolvashatod egy adott elem vagy jellemz tartalmt egy XML-dokumentum mlyrl.

tartalmnak nagy rszt a group objektum gyermeknhip.ktumai tartalmazzk.

m o s t r tt vagy

az o b je ktu m a d a to k elrse

Az XML-adatok kinyerse objektumok segtsgvel


Owenhez visszatrve, a clunk az, hogy* nmi informcit nyerjnk a videkrl a YouTube XML-vlasznak rszeknt kapott adatokbl. Mr tudjuk, hogyan olvashatjuk be az XMLadatokal egy PHP-objektumba a sim p le x m l_ lo a d _f i l e () fggvnnyel, de az rdekes adatok tbbsge mlyebben eltemetve tallhat. Hogyan haladhatunk vgig az objektu mok gyjtemnyn? A megoldst a -> mvelet knlja, amellyel egy objektum egy tulaj donsgra vagy tagfggvnyre hivatkozhatunk. Az XML-objektumok esetben a -> mve letet a gyermekobjektumok elrsre hasznlhatjuk. A kvetkez kd egy olyan vide c mt jelenti meg, amelynek a bejegyzst az $entry nev vltoz trolja:

echo

---------- Itt a - > mvelettel addig frunk le a begyazott gyermeks e n t r y - > g r o u p - > t itie ; objektumok kztt, amg el nem rjk a title objektumot.
^

A fenti kd jelents mrtkben a t i t l e , group s e n try objektumok kztti kapcsolatok ra tmaszkodik, amelyek szl-gyermek viszonyokat alaktanak ki.

A title objektum a group ob jektum gyermeke, ami viszont az entry objektum gyermeke.

A > mvelet egy gyermekobjektumra hivatkozik egy szlobjektumbl. A t i t l e teht a gr oup gyermeke, mg a group az entry-. Ne feledd, hogy a > mvelettel tulajdonsgok s tagfuggvnyek is elrhetk. Az egyik klnsen hasznos tagfggvny az a t t r ib u t e s (), amellyel egy adott XML-elem valamelyik jellemzjnek rtkt nyerheted ki:
S a ttrs

.=

$ e n tr y - > g r o u p - > d u r a tio n - > a ttr ib u te F ( >; 1seconds ' ];

echc $ a _t r s

Az attributes() tagfggvny egy objektum (elem) jellemzinek tmbjt olvassa ki.

A fenti kd a d u r a tio n elemig fr le, majd kiolvassa annak sszes jellemzjt, s az $ a t t r s vltozba rja azokat, ami teht az sszes jellemz tmbje. A seconds jellemz rtkt ezt kveten ebbl a tmbbl lehet kinyerni.

Egy adott jellemzrtket gy nyerhetsz ki, hogy a tmb kulcsa knt a jellemz nevt hasznlod.

$ a t t r s [ f seconds ]

698

12 fejezet

Tartalomsugrzs s w ebszolgltatsok

Nvtr nlkl soha!


Az XML-adatokai objektumok segtsgvel elr koddal van egy kis gond, ami a nvterekkel kapcsolatos. Ha mg emlkszel, a nvterek egyfajta vezetknv knt" mkdnek, amelyek az elemeket sszetartoz csoportokba rendezik. Egy YouTube-vlaszban teht a <duration> elem <yr. id u r a ti on> formban kdol va szerepel, mg egy vide cme nem egyszeren < ti tle>-knt, hanem <media: t i t l e > formban. Ha egy elemet egy nvtrhez trstottak, a PHP-kdban nem hivatkozhatsz r egyszeaen az elem nevvel, hanem elszr azonosta nod kell a nvtert, a szlobjektumra meghvva a c h ild r e n ( ) tagfggvnyt:
$m edia - S e n tr y - > c h i ld r e n T t t p : / / s e a r c h .y a h o o .c o m /m rs s /' ); h

A nvterek kiss meg neheztik az elemek elrst az XML-ada tok kztt.

A fenti kd annak a videbejegyzsnek az sszes gyermekobjektumt adja vissza, amelyiknek a nvtere h ttp : //search.yahoo.com /m rss/. Ez azonban egy nv tr LTRL-je, nem maga a nvtr. Az URL az XML-dokumentum elejn, a <f eed> elemben tallhat - itt lelheted fel a dokumentumban hasznlt sszes nvteret:
<1 ecd x m ln s = 'h ttp ://w w .w 3 .o r g /2 0 0 5 /A to m *

A childrenf) tagfggvny egy tmbt ad vissza, amely a meg adott nvtrben tallhat sszes gyermekelemet tartalmazza.

x m ln s :o p e n S e a rc h = f h t t p : / / a 9 .c o m / - / s p e c / o p e n s e a r c h r s s / l.0 / x m in s : g m l= h t t p : / / w w w .opengis. n e t / g m l' x m in s : g e o r s s = f h t t p : / /w w w .georss. o r g / g e o r s s

cmlns:med

'

Minden elem, ami a < mdia:" eltaggal kezddik, ehhez a nvtrhez tartozik. Ez a nvtr az < y t : " elotag elemek.

x m in s : b a tc h = * h t t p : //s c h e m a s .g o o g le .c o m / g d a ta / b a t c h xm ins: y t- ' h t t p : / / g d a t a . c u t u b e . ^m/sch m as/2007 x m lns : q d - 1h t t p : / / schem as. g o o g le . c o m /g / 2 0051>

Ez a kd elmlja, hogy az egyes nvterek egy-egy URL-hez kapcsoldnak, pontosabban hogy a mdia s az y t nvtereket hogyan hatrozza meg a doku mentum. sszesen ennyire van szksged ahhoz, hogy megtalld az ehhez a kt nvtrhez tartoz elemeket. Miutn elklntetted egy adott nvtr gyermekelemeit a c h ild r e n () tagfgg vny meghvsval a szlelemre, folytathatod a gyermekobjektumok elrst a -> mvelettel. Az albbi kd pldul a <m edia:group> elembl nyeri ki a vide cmt:
$ tilie - $ m e d ia - > g r o u p - > title ;

Egy adott nvtr sszes elemt a childrenf) tagfgg vny segtsgvel k lntheted el.

A < t it le > elem a <media:group> elem gyermeke.

ki a ceruzd!
A fenti nvtrinformcik s PHP-kd felhasznlsval egsztsd ki az albbi kdot, amely egy videklip msodpercben mrt hosszt (duration) olvassa ki:
$ y t - $medi a-> e h i I d r e n ( $ a ttrs = echo $ a t t r s [ * ' );

m o st i t t vagy 699

nem hlye krdsek az o bje ktu m o kr l

Hegyezd ki a ceruzd! ^ M e g o l d s

A fenti nvtrinformcik s PIIF-kd felhasznlsval egsztsd ki az albbi kdot, amely egy videklip msodpercben mrt hosszt (duration) olvassa ki:

$ y t - 5 m e d ia - > c h ild re n S a ttrs -

^ { .{ ^ / / ^ d s B ^ iM b J a C to n / itU e n d s /Z O O l

);

echo $a t t r s f 1 seo>ds ' i ;

f a < y t :dUration > elem

Ez a nvtr URL-je, ahogy a dokumentum elejn tallhat < feed > elemben szerepel.

A jellemzk tmbjnek el- J rsekor kulcsknt a jellemz nevt hasznljuk.

sszes jellemzjt kiolvassuk,

Nincsenek

hlye krdsek

I C ! n azt hittem, a - > mvelet az objektumtulajdonsgok elrsre val. Hogyan teszi lehetv egy gyermekobjektum elrst? ! De igen. A tmbk s az objektumok valjban sok ! Amikor XML-objektumokki dolgozunk a PHP-ben, minden hasonltanak egymsra. Hatalmas klnbsg a gyermekobjektumok valjban tulajdonsgokknt tro azonban, hogy az objektumokhoz tagfggvnyek formj ldnak. Teht amikor a > mvelet segtsgvel egy gyermek ban vgrehajthat kd is kapcsoldhat. A tagfggvnyek l objektumhoz prblsz hozzfrni, valjban egy tulajdonsgot nyegben ugyanolyanok, mint a fggvnyek, azzal a klnb rsz el. Ezt a SimpleXMLElement objektum teszi lehetv. sggel, hogy' egy objektumhoz tartoznak, s ltalban arra tervezik ket, hogy kifejezetten egy objektumban trolt ada ! Vrjunk csak - mi az a S im p le X M L E le m e n t objektum? tokkal vgezzenek mveleteket. A tmbk kizrlag ssze tartoz adatokat trolnak, s nem ismerik a tagfggvnyeket. V A PHP-ben minden objektum meghatrozott adattpus Ezen kvl a tmbelemeket az elem sorszmnak (index sal rendelkezik, ami azt jelenti, hogy az objektum va nek) vagy kulcsnak szgletes zrjeleken belli meghatro ljban ltalnos kifejezs. Amikor ltrehozol egy objektu zsval lehet elrni, mg az objektumtulajdonsgokat s mot. egy adott tpus objektumot hozol ltre, amelyet egy konkrt feladat vgrehajtsra terveztek. Az XML esetben tagfggvnyeket nv szerint, a -> mvelettel. az objektum tpusa SimpleXMLE! ement, s a sim ple I Pontosan micsoda egy objektum? Olyan, mint egy szokvxm l_l oad_f i l e () fggvny automatikusan adja vissza. nyos vltoz? Ms szavakkal, a sim pl e x m l_lo ad _f i le () fggvny ! Igen. Az objektumok pontosan olyanok, mint brmely meghvsa egy SimpleXMLE lement tpus objektum ltre ms vltoz a PHP-ben - csak ppen sszetettebb ada hozst eredmnyezi. tokat kpesek trolni. Egy objekmm nem csak egy szveges karakterlncot vagy szmot, hanem ezek kombincijt is t ! Mit kell tudnom a S im p le X M L E le m e n t-r l? rolhatja. Az elv az. hogy az sszetartoz adatok s a rajtuk mveleteket vgz fggvnyek kombinlsval az alkalma V Meglep mdon nem tl sokat. A legfontosabb, hogy zsok ltalnos felptse s kdolsa logikusabb vlhat. az XML-dokumentumokban tallhat elemeket tulaj

Miben objektum egy K ! adatok klnbzik egy troljk, nem? tmbtl? A tmbk is gyjtemnyt

donsgokknt teszi elrhetv, illetve hogy ezek a tulajdon K ! De hogyan segtik az objektumok az XML-adatok feldolgozst? sgok olyan gyermekobjektumokhoz vezetnek, amelyek s V Az objektumok abban nyjtanak segtsget az XML- a SimpleXMLE lement objektum pldnyai,kvlgy tovbb. A SimpleXMLElement objektumnak ezen olyan tag adatfeldolgozs sorn, hogy kpesek modellezni a be gyazott gyermekobjektumokat tartalmaz XML-dokumentumok elemhierarchijt. Ennek a megkzeltsnek az az el nye, hogy a gyermekobjektumokon vgighaladhatunk a -> mvelettel, s tetszleges adatokat rhetnk el.

fggvnyei vannak - pldul a c h ild r e n () vagy az a t t r ib u t e s () - . amelyek lehetv teszik az elemeken belli adatok elrst.

Tartalomsugrzs s webszo/g/tatsok

Egyre tbben ltjk Agyart


Amg Owen az XML-tudsa fejlesztsvel volt elfoglalva, illetve azzal, hogy kitallja, hogyan kommunikljon a YouTube-bal, Agyar sem ttlenkedett. Szmos videfelvtel ltott napvil got, amelyek arrl tanskodnak, hogy a kis eb idegenvezetknt kalauzolja krbe a vilgon az t elrabl idegeneket. Owen kszen ll r, hogy elvgezze a vgs simtsokat a videkat az Aliens Abducted Me oldalon megjelent YouTube-parancsfjlon. s megtallja vgre az elveszett kutyjt.
9 WW ln UF0 *10
San Franciscoi

A lie n s Turn Face of Sphinx

Ez az XML-dolog lenygz# t nekem meg kell ta l ln o m a ku ty m a t. gy h a llo tta m , j szlelsek je lentek meg A gyarrl a YouTube-on...M ndenkppen meg kell szereznem a z o k a t a videkat s. a honlapomraI ____^

UFO Spotted Crashing Party at Graceland!

& /9 '!> a Q I9 I0

A j hr az, hogy Owen majdnem kszen van a YouTube-parancsfjllal - valjban csak annyi maradt, hogy befejezze az XML-adatok feldol gozst, s HTML-kdknt formzza az eredmnyt. O A-Yeafobo videkra irnyul krolom folptso. A vidokfolom kiadsa a YouTubo fol.
-

&
Ha ezzel 3 lpse ..gynk, a youtube.p p P3 rancstji e U s z -------^
-

0
Q

A YouTubo-vlaszadatainak fogadsa, amelyek infor m cikat tartalmaznak a korosott videkrl. A vlaszadatok feldolgozsa s HTML-kdd alaktsa.

Rajzold le, hogyan formlnd videv a YouTube-vlaszadatokat az Aliens Abducted M e webhely foldalnak aljn:

m o st i t t vagy 701

a youtube-videk elrendezse

A y o u tu b e . php parancsfjl mgtti tlel az, hogy majd beemeljk az Aliens Abducted Me webhely f in d e x .p h p parancsfjljba. Ez azt jelenti, hogy a y o utu b e .ph p parancsfjl feladata lesz a videkrelmek kiadsa, az XML-vlasz feldolgozsa, illetve az egyes videk formzsa, hogy HTML-en keresztl gy lehessen megjelenteni ket, hogy jl megfrjenek a mr a foldalon lev idegenszlelsi jelentsekkel. Ennek megvalsts ra j megolds, ha a videkat vzszintesen rendezzk el az oldal aljn.

Ezek a VouTube-rl . XML-adatokknt dina mikusan elrt videk.

Ezt a sor videminiatrt kell ltrehoznia a youtube.php parancsfjlnak.

Video

Video

Video

Video

Video

Ot videminiatrt mg k nyelmesen el lehet rendezni vzszintesen anlkl, hogy tl sok helyet foglalnnk el.

Aijcns Abducted Me

Aliens Abducted Me
WcIconic, have you hod an encounter with extraterrestrials? Were you abducted? Have you seen my abducted dog, Fang? Report ft here! Most recent reported abductions

A y o u t u b e .p h p pa rancsfjlt gy gyazzuk be, hogy a videk ppen az idegenszlelsi jelent sek alatt jelenjenek meg.

2008-08-10 : Meinhold Ressner


Abducted Tor: 3 hours Abducted for; 15 minutes Abducted for: 2 hours Abducted for: almost a week Ahducted for: 1 day Alien description: They w oe in a ship (he size of a full moon. Alien description: Huge heads, skinny arms and legs A ben description: There was a bright light in the sky, followed by a bark or two Alien description: Clumsy bole hugger*, had no ifivthm. Alien description: green with su tentacles Fang spotted

2008-07-11 : Mickey Mikens

2008-07-05: Shill Wutner


Fang spotted

2008-06-21 : Betfta Chevy

2008-05-11 : Sallv Jones


Fang spotted

Q Click to syndicate the abduction news feed.

A videk vzszintes elrendezse a foldalon nem vonja el tlsgosan a ltogatk fi gyelmt az idegenszlelsi jelentsekrl. Ezenkvl videminiatrknek s nem ma guknak a videknak az elrendezsrl beszlnk, teht a felhasznlknak valamelyik miniatrre kell majd kattintaniuk, hogy a YouTube-ra ugorva megtekinthessk a videt. Ha tbb videt a kzvetlen begyazshoz elegenden nagy mretben prblnnk az Aliens Abducted Me oldalon elhelyezni, tl sok helyet foglalnnk el a kpernybl.

Ez j hely arra, hogy megje lentsk a videminiatrk sort, ahonnan a ltogatk knnyen elrhetik a videkat,

702 72. fejezet

Tartalomsugrzs s webszo/g/tatsok

A videadatok formzsa a megjelentshez


Br a vide miniatr elnzete termszetesen az egyik legfontosabb informci ah hoz, hogy eldnlhessk, hogy egy videt rdemes-e megnzni, Ow en YouTubeparancsfjljban nem ez az egyetlen hasznos adat. Egy vide cme pldul ugyangy fontos informcit adhat a vide termszetrl - pldul arrl, hogy feltnhet-e ben ne egy kutya. A vide hossza ugyancsak hasznos adat, s termszetesen a YouTubera mutat videhivatkozs URL-jre is szksgnk van, hogy a felhasznlk a vide miniatrre kattintva megtekinthessk a videt. Ebbl kvetkezen a kvetkez infor mcikat kell kinyernnk a YouTube-vlasz XML-adataibl:

Szmos informci szksges C m H ossz M in ia t r H iv a tk o z s ^ ahhoz, hogy YouTube-videkat helyezhess el egy weboldalon.

Ezek az adatok jelentik a videk vzszintes sort megjelent HTML-kd alapjt. Val jban a sorban tallhat minden vide vgl gy fog festeni:

C m H ossz
#

_ /

> ______

* s

z a hivatkozs a VouTube-on tallhat videhoz vezet, ha a vide cmre, hosszra vagy miniatrjre kattintanak.

M in ia t r

A YouTube-vlaszadatokban a vide msodpercben mrt hosszt az <yt :d u ra tio n > elem jellemzje adja meg. Sajnos a legtbbnk nem tisztn msodpercben mr, mert hozzszoktunk, hogy az idtartamokat percben s msodpercben adjk meg. Nem azonnal nyilvnval pldul, hogy 330 msodperc egy t s fl perces videt jelent, ezrt az rtket ki kell szmtanunk, hogy rtelmes idtartamknt feltntethessk. Ezt figyelembe vve j tlet elvgezni ezt a szmtst a felhasznlk helyett, amikor megje lentjk egy vide hosszt, s a msodpercek szmt percre s msodpercre alaktani:

Hacsak nem vesznk rszt a YouTube Director programban, mely esetben 10 perc nl hosszabb videkat is feltlthetnk.

330 m sodpert? H ossz 5 p e rc , 30 m s o d p e rc J Ezt a felhasznlk knnyebben megrtik.

Strbereknek
Az rkat nem szksges szmtsba venni, amikor kiszmtjuk egy vide hosszt, mn a YouTube jelenleg csak 10 percnl rvidebb videkat enged kzztenni.

m ost it t vagy 703

a youtube.p h p p a ra n csf jl befejezse

Gyakorlat

A youtube.php parancsfjl PHP-kd segtsgvel kiolvassa az idegenekkel kapcso latos videkra irnyul YouTube-keress t legjobb tallatt, majd vzszintes sor ban miniatr elnzeteket jelent meg a kapott videkhoz, amelyek a YouTube-on tallhat tnyleges videkra mutatnak. Ptold a parancsfjlbl hinyz kdrszeket az elz oldalon mintaknt tallhat YouTube XML-videvlasz adatai alapjn!

<?php
d e f in e ( 'YOUTUBE URL*, ' h t t p : / / g d a t a .y o u r u b e .e o m / f e e d s / a p i/ v : c ic : o s / - / a lie n / a b d a c t io n / h e a d / f ir s t ' ) ; d e f in e ('NUM V ID EO S', 5 );

// Az XML-adatok beolvassa egy objektumba


$xml ( YOUTUBE UR1 );

$num v id e o s found - c o u n t ( i f ($num v id e o s _ f o u n d > 0 ) { echo ' < t a b le > < t r > 1;

);

o r ( $ i = 0; $ i < m in ($ n u m _ v id e o s _ fo u n d , NUM_VIDEOS); $ 1 ++) {

/ / A cm kiolvassa
$ e n tr y - $ x m i- > e n try [ $ i J ; $m edia - $ e n t r y - > c h ild r e n ( ' h t t p : / / s e a r c h .y a h o o .c o m / m r s s / ' ); $ t i t l e $m edia->group->

// Az idtartam kiolvassa s talaktsa perc, msodperc formra


$yr - $ m e d i - > c h i2d re n { 'h t t p : / / q d a t a . y o u tu b e . com/schemas/20C)7 1 );

$ a t t r s - $ y t- > d u r a tio n - > a ttr ib u te s ();


$ le n g th _ m in = l o o r ($ a ttr .s I ' $ le n g t h s e c = $ a t t r s [' '1 % 60; m in u te s , : ' m inute# ') 1 j / 6 0 );

$ le n g t h _ f o n n a t t e d = $leric^h_m iJi . ( ($ i n g tft_ m ii

S le n g th sec . ( (S le n g th se c ! = ! ) ? ' s e c o n d s ': ' s e c o n d ');

// A vide URL-jnek kiolvassa


S a t t r s = $m edia-> group-> p!ayer- > $v id e o u r l - $ a t t r s [ ' u r l ' ] ; 0;

704 72. fejezet

Tartalom sugrzs s w e b szo lg lta t so k

/ / A m in ia t r kp URL-jnek k io lv a s s a
3 a t *_rs - Smedia-> - > th u m b n a il ; j ->at t r i b u t e s ( )

$ t h u m b n a il_ u r l - $ a t t r s f ' u r l 11;

II

Az a d o tt bejegyzshez t a r to z eredmnyek m e g je le n t s e

echo ' <rd s t y l e="ve rt i ca 1 -a : i g n : bor r.onn; te x t- a 1 g n : c e n t e r w id th = " ' . (1 0 0 / MK VI DEOS) ><a h r e f= " . $vieteo u r l . * * > ' . . < b r / X s p a n s t y l e - f o n t - s iz e : sma1l e r " > . . ' " /> < /a > < /td > f ;

$ le n g th _ fo r m a tte d . '< / s p a n > < b r /> < im g s r c - HI . }

A hinyz PHP-kd
echo '<p>bo r r y , no v id e o s were f o u n d .< / p > f

sakor nyugodtan hivatkozz erre az XML-pldakdra.

< id > h t t p : / / g d a t a . y o u t u b e .c o m / f e e d s / a p i/ v id e o s / _ 6 U ib q f 0 v t A < / id > <published>2006-06-20T07 : 49: 05 . 000-07 : 0 0 < /p u b lis h e d >
Ifaa

< m ed ia:g ro up> __________ _______________________________ < m e d ia :t i t l e t y p e * ' p l a i n ' ^ F O S ig h t in g in Y csem lte 9 a rk n e a r Area ^ / m e d i a : L i t i o <rr.edia:d e s c r i p t i o n t y p e ~ 'p i c i i n 1s l w e n t o n a t r i p t o V o s e m r t e Lr K in 2 0 0 2 . Y o s e m i t e P a r * is v e r y -a c l o s e t o t h e b o r d e r b e t w e e n C a l i i o r n i a a n d N e v a d a , a n d c l o s e t o A r e a 5 - . . .< / m e d i a :d e s e r i p t i.on/ < m e d ia :keywords>51, a ^ ie n , a l i e n s , a r e a , c a, c a lifo r n j- a , nevada, s i g h t i n g , s i g h t in g s , u fo c /m e d ia : k e y w e r d s ^ * - ^ ^ ______________________________ _ A vide idtartama (hossza; <yt.: d u r a t io n s e c o n d s fT50^A> < m e d ia : c a te g o ry la b e ^ t r a v e l & amp; E vents 1 masodpercoen. schem e*' h t t p : I f g d a t a . y o u tu b e . com/schem as/2007 / c a t e g o r ie s . c a t ' > T r a v e K /m e d ia : c a te g c ry > <m edia: c o n te n t u r l - ' h t t p : //www. y o u tu b e , c o m /v /_6 U ib q fO v lA ' type= ' a p p ^ ic a tio n /x - s h o c k w a v e - fla s h ' m edium-' v id e o ' i s D e f a u l t * ' t r u e ' e x p r e s s io n - ' f u l l ' d u r a t i o n * '5 0 ' y t : f o r m a t* ' 5 ' / > < m e d ia: c o n te n t u r l ' r t s p : / / r t s p 2 . y o u tu b e . ccm/ChOLENy 13wIaEQnQvvSnbiKl_xMYDSANFEgGDA / 0 / 0 / o / v id e o . 3gp ty p e ' v id e o / 3 g p p ' medium-' v id e o ' e x p r e s s io n - ' f u l l ' d u r a t i o n - '5 0 ' y t : f o r m a t * '1 '/ > < m e d ia: c o n te n t u r l - ' r t s p : / / r t s p 2 . yout. ub e . com/ChoLENy73wIaEQnQvvSnbiKl_xMYESARFEgGDA--/0/0/0/ v A e o . J g p ' d ty p e - ' v id e o /3 g p p ' medium- 1v id e o ' e x p r e s s io n * ' f 1' *50 1 y t : fo rm a t* ' 6 ' /> <m edia: p la y e r u r K U i t t p : / /yf^u, ynnt h Hp . r-nm/w a tc n ? v^ 6U.Lbqf0vt.AV> ---------- A VouTabe< m c d ia : th u m b n ai 1 u r l * ' h t t p : / / im g . youL uue. cum/ v .l/ f 0 A p g 1 h e ig h t* '9 7 ' w icth- ' i 3 j videra mutat t i m e * '0 0 :0 0 :2 5 '/ > . . < m e d ia: th u m b n a il u r l * ' h t t p : / / im g . y o u tu b e . com /vi/__6U ibqf 0 v t A / l . : p g ' h e i g h t * ' 9 I w id tn * .30 hivatkozs t im e * '0 0 : 0 0 :1 2 .5 0 0 '/ > c m e d ia : th u m b n a il u r l * ' h t t p : / / i m g . you t u b e .c o m / v i/ 6 U ib q f0 v tA /3 . jp g ' h e ig h t- ' 9 / ' w rath- I j C URL-je. t i m e * '00: 0 0 : 3 7 . 5 0 0 ----------- ------------ ---- - - - ' N. , . <m edia: th u m b n a il url*\ h t t p :/ / im g .y o u t u b e .c o m / v i/ _ 6 U ib q f 0 v t A / 0 . ^ p g 'y ie ig h t- 240' w id th * 320 t i m e * '0 0 : 0 0 : 2 5 '/ > < /m e d ia :g ro u p > < y t: s t a t i s t i c s v ie w C o u n t* '2 478159' f a v o r ite C o u n t= ' 1697 ' /> < g d : r a t i n g mm- ' 1' m ax*' 5 ' n u m R a te rs *'1 6 0 2 ' a v e r a g e * '4 .1 7 ' /> A vide miniatr <gd:comments> <gd: l e e d L i n k h r e f * 'h ttp :/ /g d a ta .y o u tu b e .c o m /f e e d s / a p i/ v id e c s / _ 6 U ib q f O v tA / c o m m e n ts ' elnzetnek (blyeg c o u n t H in t * '442 6 '/ > kpnek) URL-je. </gd:com m ents> < /e n tr y > < entry> < /e n tr y >

a ksz youtube.p h p p a ra n csf jl

Gyakorlat - megolds

A youtube.php parancsfjl PHP-kd segtsgvel kiolvassa az idegenekkel kapcso latos videkra irnyul YouTube-keress t legjobb tallatt, majd vzszintes sorban miniatr elnzeteket jelent meg a kapott videkhoz, amelyek a YouTube-on tall hat tnyleges videkra mutatnak. Ptold a parancsfjlbl hinyz kdrszeket az elz oldalon mintaknt tallhat YouTube XML-videvlasz adatai alapjn!
Owen kulcsszavas YouTube-

<?php

keresse'nek URL-je.

d e f i r.e ( 1YOUTUBE URL , 1h t t p : / / g d a t a . y o u tu b e . com / fe e d s / a p i / v id e o s / -/a l i e n / a b d u c t i o n / h e a d / f i r s t ' : ; d e f in e ('NUM VIDEOS , 5 ); A megjelentend videk s * egy i l l

// Az XML adatok beolvassa // egy objektumba


ni - simplc*mModd_jfile (YOUTUBE URI.) ;

Az XML-adatokat a sim plexm lJoad_ftle() fggvnnyel krjk el a VouTube-tol.

$nu m _v id e o s_fo u n d = c o u n t ( f % *l>ewtry i f ($ n u m _ v id e o s _ fo u n d > 0 ) 1 echo , < t a b l e x t r > 1;

);

Az < e n try > elemek meg szmllsval ellenrizzk, hogy a YouTube tnylegesen hny videt adott vissza. A videadatokon egy ciklus segtsgvel bejegyzsenknt haladunk vgig. Kinyerjk az ehhez a bejegyzshez tar

f r ( $ i = 0; $ i < m in ($ n u m _v id e o s _fo u n d , NUM_VIDEOS); $i+^ ) {

// A cm kiolvassa
$ e n t r y = $ x m l- > e n tr y [ $ iJ ; $medi a = $ e n tr y - > c h ild r e r i ( f h t t p : / / s e a r c h . yahoo. com /m rss/ ' );

toz sszes olyan gyermeket, amely a Yahoo! mdia nvternek rsze. Kinyerjk az ehhez a bejegyzshez

$ t i t l e = $ m e d ia - > g r o u p - > ^ r tlc

Kinyerjk 3 videbejegyzs cmt, amelyet a < m e d ia :title > elem trol.

// Az idtartam kiolvassa s talaktsa.. .


$ y t = $ m e d ia - > c h ild r e n ( h t t p : / / g d a t a . y o u ru b e .c o m /sch e m a s/2 0 0 7 1); $ a t t r s $ y r.- > d u ra tio n - > a ttr b u te s ( ); $ le n g t h m in - f lo o r ( $ a t t r s [ stCxmds 1 / 6 0 );

tartoz sszes olyan gyermeket, amely a Youube yt nvternek rsze.

Kiolvassuk a vide msodpercben mer ^ < yi:(juratio n > elembl, majd talaktjuk perc, msodperc formra.
m in u te , ')

$length_sec - $attrs [ s t o n d s t

' % 60; ^ --- " 1

$1 e n g th _ fo r m a tte d = $length_m n . ( ($ le n g th _ m in !~ 1 ) ? ' m in u te s , $ le n g th _ s e c . ({ $ le n g t h sec ! = 1 ) ? s e c o n d s ': 1 s e c o n d ');

/ / A vide URL-jnek kiolvassa


$a l r s - $ m e d i a ->group->pl aye r-> a ttr ib u te s ( ) ; _ $ v id e o _ u r i = $ a t t r s [u r l ' ]; ^ _____

Kiolvassuk a videhivatkozst (az URL-t) a <m edia:player> elem url jellemzjbl

706 72. fejezet

Tartalom sugrzs s w ebszo/g/tatsok

// A miniatr kp URL-jnek kiolvassa


$ a t t r s = $media-> 9rouP - > th u m b n a il [0] - > a t t r ib u t e s ( ) ;

$ t h u m b n a il_ u r l - $ a t t r s f u r l ' ] ;

Kinyerjk az els miniatr kp U R l-jt i <m edia:t)ium bnail> elem url jellemzjbl.

// Az adott bejegyzshez tartoz eredmnyek megjelentse


echo f<td s t y le * " v e r t ic a l- a : ig n :b o tto m ; te x t- a lig n : c e n te r" w idth=" ' . (100/ NUM VIDES)
1 . -v i d e o u r l .

* ' <t>r / X s p a n s ty le = " f o n t- s A z e : s m a lle r n> 1 . . "7 > < /a x /td > - ;

$ le n g th _ fo r m a t t e d . 'C / s p a n X b r / X i m g s r c = " . /-bkurr.b*il url


)

echo f< / t r X / t a b l e>* J el se |

A videeredmnyeket a vide cmt, hosszt s miniatr kpt tartalmaz tblazatceaknt formzzuk.

A fouTubo vidokra irnyul krolom flptse. A-vidokrolom kiadsa a YouTube fol. euTubo vtaszadatainak fogadsa, amolyok Y informcikat tartalmaznak a korosott videkrl. o A-vlasga alaktsa.

echo < p> S o rry , no v id e o s were fou nd .< / p > ' ; }

r < entry> < id > h t t p : / / q d a t a .y o u t u b e . c o m /fe e d s / a p i / v id e o s / JS U ib q f0 v tA < /id > <published>2006-06-20T 07:4 9 :0 5 .0 0 0 - 0 7 :0 0 < /p u b lis h e d >

Ksz!
A vide cme.

< m ed ia:g ro up> _________________________ ____ ____________ _ c m e d i a : t i t l e t y p e * p l a i n S i g h t i n g *.n Y oscm ite Park n e a r Area sy / m e G ia : t i t ^ e > < m e d ia : d e s c r i p t i o n ty p e 1p i c i i n 1^ I went* on a t r i p ho jfosem ite Fark i n 2u0<:. i!osem i e Parr: i s very _ c lo s e to th e b o rd e r between C a l i f o r n i a and Nevada, and c lo s e t o Area 51. . .c / m e d ia : d e s c r ip t io n > cm e dia:keyw ord s>51, a l i e n , a l i e n s , a r e a , c a, C a l i f o r n i a , n e v a d a , s i g h t i n g , s i g h t i n g s , u lo < /m e d ia : k e y w o r d s ^ - ^ ________________________ _______ _____.___________________ _____ A video idotartama < y t : d u r a t io n seconds^/_50j^> ' " . . , ,

<m edia: category la b e i^ T r a v e l &amp; Events 1

(hossza] masodpercoen.

schem e-' h t t p : / / g d a t a . y o u tu b e . c c m /s c h e m a s /2 0 0 7 /c a te g o rie s . c a t ' > T r a v e l< /m e a ia : c a te g c r y > <m edia: c o n te n t url*= ' h ttp ://w w w . y o u tu b e , com /v/ _6 U ib q f0 v tA ' type- ' a p p lic a tio n /x - s h o c k w a v e - f la s h medium* *v id e o ' i s D e f a u l t * ' t r u e ' e x p r e s s i o n * ' f u l l ' d u r a t i o n ^ ' 50' y t : f o r m a t * ' 5 ' / > c m e d ia :c o n te n t u r l* 'r t s p :/ / r t s p 2 .y o u t u b e .c o m / C h o L E N y 73w laEQnQvvSnbiKl xMYDSANFSgQDA**/0 / 0 / 0 / v i d e o .3 g p ' t y p e * 1v id e o / 3 g p p ' medium-' v id e o ' e x p r e s s io n * ' f u l l ' d u r a t i o n * '5 0 ' y t : f o r m a t * ' 1 ' / > c m e d ia : c o n te n t u r l - ' r t s p : / / r t s p 2 . y o u tu b e . com/ChoLENy73wIaiQnQvvSnbiKl_xMYESARFEgGDA**/C/0/ 0 / v id e o . 3 g p ' ty p e * ' v id e o /3 g p p ' m e d iu m - 'v id eo 1 ex p ress j 1 i 1 ir,-v^oa= ' SO ' y t : fo rm a t* ' 6 ' /> itch?v= SUibqlOvtA cm edia: p la y e r u r l C n t t ; p : / /wyw -ym itnoe . com____ p g ' h e ig h t - '97 * w i d t h * '130' c m e d ia :th u m b n a il u r l * ' h t t p : / / i m g . y o utub e.com A YouTubet im e * ' 0 0 : 0 0 : 2 5 ' / > . . . , ... videra mu c m e d ia : th u m b n a il u r l * ' h t t p : / / i m g . y o u tu b e . c o m / v i/ _ 6 U ib q f 0 v t A / l. jp g ' h e ig h t * ' 9 ! ' w id th * ' ^0' tim e = '0 0 :0 0 :1 2 .5 0 0 '/ > tat hivatko c m e d ia : th u m b n a il u r l * 1h t t p : / / im g . y o u tu b e , c o m /v i/ 6 U ib q f0 v t A / 3 . j p g ' h e i g h t * ' 9 / ' wi dt h' u C zs URL-je. t im e * 10 0 :0 0 :3 7 .5 0 0 ' Z i _________ . cir.edia: th u m b n a il u r l \ http: / / im g . y o u tu b e . c o m /v i/_ 6 U ib q f OvtA/ C . ~pg' p e ig h t- ' 240 1 w id t h - ' J20 time*00:00:25'/> c /m e d ia : group> c y t : s t a t i s t i c s v ie w C o u n t* ' 2478159' f a v o r it e C o u n t * ' 1897 ' /> c g d : r a t i n g m i n = ' l ' max=' 5' n u m R a te rs*'1 6 0 2 ' a v e r a g e ^ ' 4 . 1 7 ' / > A vide miniatr cgd:comments> cgd: fe e d liin k h r e f * ' h t t p : / / g d a t a . y o u t u b e .c o m / f e e d s / a p i/ v id e o s / _ 6 U ib q f OvtA/com m ents' elnzetnek (blyeg c o u n t H in t * '4 4 2 6 '/> kpnek) URL-je. < /g d : comments> c /e n tr y > c e n try > c /e n try >

e/rabo/takazidegenek - yo u tu b e -vid e kka f!

Add a YouTube-parancsfjlt az Aliens Abducted Me webhelyhez!


Hozz ltre egy j szvegfjlt youtube. php nven, s rd bele Owen YouTuhe parancsfjljnak kdjt az elz kt oldalrl (vagy' tltsd le a parancsfjlt a Head First Labs webhelyrl, a w w w .h e ad firstlab s.c o m /b o o k s/h fp h p cmrl). Ahhoz, hogy a YouTube-videk megte kinthetk legyenek az Aliens Abducted Me foldalrl, ezt a parancsfjlt be kell gyaznod az in d e x .p h p parancsfjlba. Ezt az albbi kt PHP-kdsorral hajthatod vgre: echo '<h4>Most recent ab d u c tio n v id e s :< /h 4 > '; r equi re _o n c e ( ' youtube. p h p ); Tltsd fel a parancsfjlokat a webkiszolgldra, majd nyisd meg az index.php oldalt a bngszdben. Az oldal aljn meg kell jelennie az ide genekkel kapcsolatos YouTube-videliivatkozsok dinamikusan ellltott sornak.
a n r
Aiiens Abducted Me

Csak a youtube.php parancsfjl beemel se szksges ahhoz, hogy a foldal aljn megjelenjen az idegenes videk sora.

Aliens Abducted Me
Welcomc,have you had an encour.ua- with cxtratracarials.' Were you abductcd? Have you wen ray abducted dog, Fang?
R e p o rt it here! M ost recent reported abductions:

2008-08*10 : Meinhold Ressner


A bducted for: Alien description:

F a n g spotted:

3 hours
A bducted for:

they were in a ship the size of & full moon


Alien description:

no
F a n g spotted:

2008-07-11 : M kkey Mikem.


45 minutes...and counting huge heads, skinny arms and tops
Alien description:

yes
F a n g spotted:

2009-07-05: Shill Watncr


A bducted for:

2 hours

there was a bright light in the sky. fobowed by a bark or two


Alien description:

yes
F a n g spotted:

2008-06-21: BcliU Chevy


A bducted for:

almost a week

clumsy little buggers, had no ibythm


Alien description:

no

A YouTube-videk segtettek Owennek leszkteni Agyar le hetsges tartzkod si helyeinek krt.

2008-05-11 : Sally Jones


A bducted for:

1 ja y

green with six tentacles

Click to syndicate the abduction news feed.


Most recent abduction videos:

708 72. fejezet

Tartalom sugrzs s w ebszolg ltatsok

Hegyezd ki a ceruzd!

n
m ik * *
-o NI 0 3

c
n

r
n

n
fg B S f e i

L J
_

zi

n
m o st i t t vagy 709

m egtalltad A g y a rt!

Hegyezd ki a ceruzd! - Megolds


* I I . - n i

Is. L !fZ

ZL

Iz

ZL:

r
in

n
t ^ }

_____ I

n z k

3^.; -g?

J
#

zi

_r

i n

710 12. fejezet

Tartalom sugrzs s w ebszo/g/tatsok

PHP & MySQL szerszmoslda


Most, hogy Agyar elkerlt, rdemes visszatekin teni, hogy mi minden kellett ahhoz, hogy rbuk kanjunk. Ahogy ltod, a PHP s a MySQL nmi kls segtsget is ignyelt.
Az informcik tisztn URL-eKen keresztl trtn elrsnek mdja a Weben. A REST lehetv teszi, hogy egyszeren egy-egy URL fel ptsvel hatkony adatkrelme ket adjunk ki. Az ilyen krelmekre ltalban REST-kpes CRESTfuD krelmekknt szoktak hivatkozni.

ltalnos jellnyelv, amellyel ki szmthat szerkezetet hatrozha tunk meg adatok szmra. Az elve az, hogy ms-ms elemhalmazt (cmkket) hatrozhatunk meg at tl fggen, hogy ppen milyen adatokat trolunk XML-knt. Az XML-re szmos klnbz je llnyelv pl, pldul az XHTML vagy az RSS.

RSS
XML alap nyelv, amelyet sugr zott tartalom, pldul hrek trol sra hasznlnak. Az RSS lehetv teszi a webhelyeknek, hogy az adataikat ms webhelyeknek s alkalmazsoknak sugrzsra hozzfrhetv tegyk, illetve le hvjk a ms webhelyek ltal elr hetv tett adatokat.

s im p le x m l_ lo a c L _ f i l e ( ) Ez a beptett PHP-fggvny egy XML-fjlt tlt be egy URL-rl. majd az eredmnyknt kapott XVlL-adatokat egy objektumon keresztl teszi elrhetv.

SimpleXMLElement
Beptett PHP-objektum, ame lyet XML-adatok elrsre hasz nlhatunk. Ezt az objektumot a simplexml_load_fileO fgg vny adja vissza, s egy XMLdokumentum teljes dokum en tumhierarchijt tartalmazza.

Az XML-elemek halmazainak ren dezsi mdja, amely ahhoz ha sonlan rendezi logikai csopor tokba az elemeket, mint ahogy a vezetknv fogja ssze egy nv vel rendelkez csoportba a csa ldtagokat. A nvtr mindig egy URL-hez kapcsoldik, amely biz tostja a nvtr egyedisgt ms nvterek kztt.

m o s t i t t vagy > 711

i. fggelk: maradkok

Tz Tuti Tm a (am irl nem v o lt sz)

Ha az eddigieket megrgtad s lenyelted, akkor jhet a desszert. Van mg pr dolog, amit rdemes lehet tudnod. Olyan tmkrl van sz, amiket helytelen lenne kihagynunk, mg akkor is, ha elg pp csak rintennk ket. Szval, mg mieltt letennd a knyvet, fus suk t a PHP-rl s a MySQL-rl szl albbi rvid, mde tanulsgos nyencsgeket. Biztatsul meggrjk, hogy ha ezt is elolvastad, ak kor mr csak pr tovbbi fggelk van... meg a szszedet... esetleg egv-kt hirdets... aztn vge. Komolyan!

ez egy fggelk 713

ha p hp 4 van a gpeden

# 1 . A knyv hasznlata a PHP 4-es vltozatval s a mysql-fggvnyekkel


A 12. fejezetben trgyalt XML-fggvnyek kivtelvel a knyvben lv kdok tlnyom rsze minimlis mdostsokkal futni fog olyan kiszolglkon is, ahol mg a PHP 4 van teleptve. A knyvben a mysqlifggvnycsaldot hasznltuk, ami csak a PHP 4.1-tl szerepel a nyelvben, s minthogy a fggvnyknyv trat sajt kezleg kell telepteni, lesznek majd kiszolglk, amelyek nem tmogatjk. A mysqli-fggvnyek ltalban gyorsabbak, de ez majd csak akkor kezd szmtani, ha az adatbzisod megn. A kicsi vagy tlagos nagysg adatbzisok nem lesznek szreveheten lassabbak a rgebbi mysql csaldba tartoz fggvnyekkel sem. Ebben a rszben azt mondjuk el, hogy miknt vehet r a mysqlifggvnyeket hasznl kd a PHP rgebbi vltozatban hasznlt mysql-fiiggvnyek hasznlatra. Ha ilyesmit ltsz...

$dbc = mysqli_connect (localhost, 'mork' , 'fromork'); noysqli_select__db ( $dbc, 'alien_database' ; )

...akkor gy rd t:

$dbc = mysql_connect (localhost, 'mork', fromork1);

m y s q is e ie c t d b ( a iie n _ d a ta b a s e ' , $ d b cf^

Az adatbzis-kapcsolatot itt nem az els vltoz trolja, mint a mysqli_select_db() fggvnyben.

ltalban annyirl van sz, hogy a mysql i vgrl lekapod az i-t, vagyis mysql-t csinlsz belle, aztn felcserled a paramterek sorrendjt, hogy* az adatbzis-kapcsolatot trol vltoz (esetnkben a $dbc) legyen htul. A dolog ott kezd humoross vlni, amikor a mysql i_c o n n e c t () fggvny megkerli a m y s q li_ s e le c t_ d b ( ) fggvnyt, s kzvetlenl az adatbzis nevt hasznlja. A mysqlfggvnycsaldban ehhez mg csak hasonl sincs. Az egyetlen adatbzisnevet hasznl mysql i_c o n n e c t () fggvny csak kt mysql-fggvnnyel helyettesthet. Ha ilyesmit ltsz...

$dbc = mysqli_connect (localhost, mork' , fromork, ' aliendatabase' ; )

.. .akkor kt utasts hasznlatval gy rd t:

Ezttal az adatbzist a kapcsolat kiptsnek rszeknt vlasztjuk ki - ez olyasmi, amit a mysqlfggvnycsalddal nem lehet egy lpsben elvgezni.

$dbc = mysql_connect (localhost, 'mork1, 'fromork'); mysql_select_db ( alen_database', $dbc) ; '

y" A kapcsolati vltozt adatbazis-hivatkozsnak" is nevezik.


714 /. fggelk

A mysql-fuggvnycsala'd esetben a kapcsolat egy adott adatbzissal mindig kt utasts h3Szn|3tva( pthet ki.

m aradkok

me az egymsnak megfeleltetett mysql-, illetve mysqli-fggvnyek:

MySQL-kapcsolat lezrsa m y s q l_ c l s e ( kapcsolat) MySQL-kapcsolat kip tse a kiszolglval m ysql_connect {lloms, felhasznlnv,

mysql i_ c lo s e ( kapcsolat) mysql i._connect ( lloms,

jelsz)
Az adatbzis kivlasztshoz szksg van a m y sq l_s e le c t_d b () fggvnyre.

felhasznlnv, jelsz, adatbzis)


A z adatbzis kivlasztshoz nincs szksg a m v s q li_ s e le c t_ d b () fggvnyre.
m y s q li_ e r r o r ( kapcsolat)

Az elz MySQL-mveletbl szrmaz hiba zenet szvegnek visszaadsa Karakterlnc levdse

m y s q l_ e rro r( kapcsolat)

mysql__escape_ s t r in g ( karakterlnc,

m y s q li_ e s c a p e _ s tr in g ( kap

kapcsolat)
A paramterek sorrendje ellenkez: a fgg vny elszr kri a karakterlncot, utna m a kapcsolatot (a hivatkozst). Egy eredmnysor trstsos tmbben, indexelt tmbben vagy mindket tben val visszaadsa Az eredmnysorok sz mnak meghatrozsa MySQL-lekrdezs futtatsa Klnleges karakterek levdse egy karakter lncban mysq] _fet.ch_row ( eredmny)

csolat, karakterlnc)
Elszr vrja a kapcsolatot (a hivat kozst), utna a karakterlncot. mysql i _ f etch_row (eredmny)

mysql_rmm_rows ( eredmny) m y sq l_q u e ry ( kapcsolat, lekrdezs)

m ysqli_num _row s( eredmny) m y s q li_ q u e ry (kapcsolat,

lekrdezs)
m y s q l_re a l_e s c a p e _ s trin g (karakterlnc, m y sq li_re a l_e s c a p e _s trin g {kap

kapcsolat)
A paramterek sorrendje ellenkez: a fgg vny elszr kri a karakterlncot, utna a kapcsolatot (a hivatkozst). m y s q l_ s e le c t_ d b ( adatbzisnv,

csolat, karakterlnc)
Elszr vrja a kapcsolatot (a hivat kozst), utna a karakterlncot. m y s q li_ s e le c t_ d b ( kapcsolat,

MySQL-adatbzis kivlasztsa

kapcsolat)
A paramterek sorrendje ellenkez: a fgg vny elszr kri a karakterlncot, utna * a kapcsolatot (a hivatkozst).

adat.bzi snv)
Elszr vrja a kapcsolatot (a hivat kozst), utna a karakterlncot.

m ost i t t vagy 715

fe lhasznli jo g o s u lts g o k belltsa a m ysql-ben

# 2 . Felhasznli jogosultsgok a MySQL-ben


Mondjuk, hogy ksz van egy olyan webal kai mazsod, amellyel a weboldal ltogati egy tbln SELECT utastso kat hajthatnak vgre. Az adatokon futtatott lekrdezsek egy adott adatbzisban keresnek, az adatok leletti ellen rzst pedig a MySQL biztostja. Na, akkor gondold vgig a kvetkezt: ha valaki a mysqli-fggvny kapcsolati karakterlncban hasznlt felhasznlnvvel s jelszval, a MySQL terminljt vagy egy grafikus felletet hasznl va kzvetlenl az adatbzishoz kapcsoldik, akkor INSERT, UPDATE s DELETE utastsokat is kiadhat. I la az al kalmazsod rendesen nem vgez ilyen mveleteket, akkor semmi ok arra. hogy a felhasznlnv s jelsz birto kban egyltaln lehetsg legyen az ilyen mveletek elvgeztetsre. A MySQL-lel korltozhatod az adatbzis hoz val hozzfrst. Megbeszlheted a MySQL-lel, hogy a felhasznl csak a SELECT parancsot hasznlhassa, vagy mondjuk a SELECT s az INSERT parancsokat - vagy azt a parancskombincit, amit csak az ri kedved diktl. Mg ennl is lenygzbb, hogy a hozzfrs tblnknt llthat be. Pldul, ha az alkalmazsodnak csak az a lie n _ in o nev tblval van dolga, s semmi kze a c y b o rg _in fo tblhoz, akkor a hozzfrst kor ltozhatod csak az a lie n _ in f o tblra. Okosan teszed, ha elszr is vadonatj felhasznlnv-jelsz prt hat rozol meg, amit majd az alkalmazs hasznlhat. Ezt a MySQL-terminlban teheted meg:

I File Edit Window Help Aliens?

mysql> CREATE USER alienguv IDENTIFIED BY 1aiiensRsc4ryf; Query OK, 0 rows affected ( 0.01 sec)

Hnnek vgeztvel a MySQL grant parancsval megadhatod, hogy az a lie n g u y nev felhasznl mi mindent tehet az adatbzisban. Ha csak a SELECT s az 1NSKRT parancsokra lesz szksge, akkor az albbi parancsokat add ki:
File Edit Window Help TheyLive

mysal> USE alien database; Database changed mysql> GRANT SELECT, INSERT ON aJieninfo TO alienguy; Query OK, 0 rows affected (0.03 sec)

Ha nem tetszik, hogy a MySQL-term inlban hozod ltre a felhasznlkat, s adsz nekik jogosultsgokat, akkor tltsd le s teleptsd a MySQL Administrator nev gyes kis programot. Itt tallod: h t t p : //d e v .m y s q l. com/downloads/gu i - to o ls /5 . 0 .htiml.

Megadhatsz teljesen konkrt felhasznli jogosultsgokat is - akr azt is megmondha td, hogy milyen utastsokat szabad kiadnia a felhasznlnak egy bizonyos oszlopra. Errl a tmrl a Head First SQL cm knyvbl tudhatsz meg tbbet.
716

/ fggelk ' .

m aradkok

A MySQL Administrator alkalmazs lehetsget nyjt a felhasznli fikok kezelsre, s bellthat vele, hogy az egyes felhasznlknak milyen jogosultsgai vannak az adatbzisban. Mg az is megadhat, hogy egy adott felhasznl milyen lekrdezseket futtathat az adatbzis egyes tblin. Az egyes felhasznlk adott tblkra s lekrdezsekre vonatkoz jogosultsgainak belltshoz nyisd meg a MySQL Administrator alkalmazst, majd kattints az A ccounts (Felhasznli fikok) flre. me az alkalmazs felhasznli fellete, illetve nmi ttekints az e g ye s felhasznlk jogkrnek belltsrl. Elszr hozz ltre egy felhasznli fikot:
+/

.t

'.ocilhov v iocWn ttt

lr*m izn <r%o y

fesS
-o n

Elszr kattints az Accounts ikonra

L p n i r t denAAl ir.form tto a O rt* u r o A b t/T

MS t U N . v Q i.t .m

itt

Tm

1*01 mjcaiiff tn ixiwi** I<

MW MI. T^* * * f l j ?ji tate.h "*

r rp t

* j wwt'f t

f 04

w Qa m i

Miutn elnevezted az j fe l hasznlt, s jelszt is adtl neki, kattints ide, s a GRANT paranccsal adj ne ki jogosultsgokat.

A!<*fW 4 ? yd ctnto
fej***! DKn;>30*

C n c lno7* o Ut ? nfto

Ga mft.
S

Or^ itiMm oe i A o ar U lulra h *. t}

K* O
OHMK*. *

o tVtf* .W 1

Aztn ezzel a gomb bal hozd ltre a fe l hasznli fikot.

S C iw w H

Itt tallod az adott adatbzisban lv tblk listjt. Jelld ki azt, amelyiket az alkalmazs hasznlja.
n r\ o
Accounts iocalbostsocket

Ez a felhasznlid listja. Az j felhasz nlk ltrehozsakor pontosan bellthatod, hogy milyen jogosult sgokkal brnak az egyes alkalmaz sokban. Itt vlasztha tod ki azt a felhasz nlt, akinek a jogait mdostani szeretnd.

In to r n m ic n

Servie

O p tic r t

Accounts

Con

Health

Logi

Backup

R ejtre C ataioi
Resources

Ceneral

Schema Prvleges

Ezt a listt tfutva lthatod, hogy azok a fbb MySQLutastsok szerepel nek benne, amelyek a knyvbl mr is mersek. Csak azokat vlaszd ki, amelyek nlkl az alkalmazs nem mkdne.

mywebappSlocalhost
1 elmer A lynn t i mywebapp local hos t m e & root Asgn schema (dataoase) connection privileges to the user.

S e as J / ch m
fedef
r j Informatlon.se ne aliendatabase aliens elvts.store I I mysql rtsfcyjobs $ test

A 'g n e d Privilegr

Av a la b le P riv ile g e

St **lC1
"ft Insert % Update % Delete Create % Drop % Grant % References ^ Inacx % Alter ^ O e ate jm p .tab le ^ Lock,tables % Create_v;ew % Show.view % Create.routine Alter .routine % Execute

Oiscd'd Changes

Save Chanss

hibajelzs a m ysql-ben

# 3 . Hibk jelzse a MySQL-ben


A knyvben lv kdrszletekben sokszor ltsz effle sorokat: 0 m y s q li_ c o n n e c t(lo c a lh o s t, 'm o r k ', 'fro m o rk ') or d ie ('C o u ld n t c o n n e c t.') Ha a parancs sikertelen, a weboldalon megjelenik a Could nt connect." (A csatlakozs meghisult) zenet. Annyit megtudsz belle, hogy valami rosszul ment, de sokkal okosabb nem leszel. Szerencsre a PHP-ben van egy m y s q li_ e rro r () nev fggvny, amely a hiba pontos mibenltt illeten nyomra vezethet. Figyeld meg az albbi kdot, amely egy nem ltez MySQL-kiszolglhoz prbl csatlakozni: <?php m y sq li_co n n e ct ( 'badhostnam e' , 'm ork' , 'fro m o rk ') o r d ie
?>

(m y s q li_e rro r ()) ;

Unknown MySQL server h s t 'badhostnam e'

(1)

Ezt a hibazenett fogod kapni.

Ezzel a kddal a mysql i_co nnect () fggvny elhasalsakor pontos informcit fogsz kapni arrl, hogy mi nem sikerlt. A m y s q li_ e rro r () fggvny nem csak a mysql i_corm ect () fggvnnyel hasznlhat:
<?php

$dbc = m y sqli_conn ect (' lo c a lh o s t 1, mork , fro m o rk ')/ m y s q li_ s e le c t_ d b ($ d b c , ' a lie n _ d a ta b a s e 1); echo m y sq li_e rro r($ d b c) . ' <br / > '; m y s q li_ s e le c t_ d b ($dbc, ' a lie n _ d a ta b a s e 1); Nem ltez adatbzishoz m ysqli_query ($dbc, "SELECT * FR0M a lie n _ in f o " ) prbltunk kapcsoldni. echo m y s q li_ e r r o r ($ d b c );
?> O 0O Motili Fiftfpx o

me a kimenet:

Nem ltez' tblt pr bltunk kivlasztani.

Unknown database alien.database Table a lie n jn fo doesn't exist

Kvetkezzen pr hibazenet, amivel tallkozhatsz: Table ' t e s t . n o _ s u c h _ ta b le ' doesn' t e x is t (A tbla nem ltezik.)

C an' t c re a te ta b le (A tbla nem hozhat ltre.) C a n 't c re a te database ' y o u rd a ta b a s e ' ; database e x is t s (Az adatbzis nem hozhat lt re, mert mr van ilyen nev adatbzis.) C a n 't drop database 'y o u r d a ta b a s e '; het, mert nincs ilyen adatbzis.) database d o e s n 't exi s t (Az adatbzis nem trl

Van mg pr tucatnyi hibazenet, de tiszta paprpocskols lenne mindet bemutatni. Az albbi webhelyen sztnzve tovbbi informcikra lelhetsz: h t t p : / / d e v .m y s q l. c o m /d o c /r e fm a n /5 . O /e n /e r r o r - m e s s a g e s - s e r v e r . h tm l Ha ppen azon gykdsz, hogy egy alkalmazst futtathatv tegyl a PHP4-ben - ahogy azt az # 1 . pontnl olvashat tad - akkor a mysql i_error ( ) helyett a mysql_error ( ) fggvnyt kell hasznlnod.

718 i fggelk

m aradkok

# 4 . Kivtelkezels PHP-mdra
A kivtelkezels lehetv teszi, hogy a kd vgrehajtsnak norm lis folyamatt megvltoztatva egyes kivteles esemnyek bekvet keztekor az esemnyhez tartoz kdrszt futtass le. Kivtelkezels sel csak a PHP 5-s s 6-os vltozata rendelkezik. Kvetkezzen egy rvid bevezets: Mondjuk, hogy egy bankautomatbl ki akarsz venni 200 dollrt, de az egyenlegednek 1000 dollr felett kell maradnia, s ha kiveszed a 200 dollrt, akkor az egyenleg 1000 dollr al cskkenne, ami tilos. A tranzakci sikertelenl zrul. A fenti esemnysor PHP nyelven, a hiba elfogshoz a kivtelkeze lst segtsgl hvva az albbiak szerint jtszdik le:

<?php fu n c tio n checkB alance($balance) i f ($balance < 1000) { {

Ezt a visszajelzst adjuk, ha az egyenleg 1000 alatti.

throw new E x c e p tio n ("Balance is le s s than $ 1 0 0 0 .");


}

re tu rn tr u e ;

}
try {

A try " blokk val arra, hogy a program az rtket a lells veszlye nlkl ellenrizhesse. <^. Ez a sor ellenrzi az egyenleget.

checkBalance (999) ;

echo 'B alance is above $ 1 0 0 0 .';


}

c a tch (E x c e p tio n $e) echo E rror:

' . $e->getMessage();

?>

Ha futtatod a kdot, akkor az albbi zenet fogad: E rro r: Balance le s s than $1000. (Hiba: az egyenleg kevesebb, mint 1000 dollr.)

Ha kivtel lp fel, ak kor a blokk belsejben lv kd fut le. Ese tnkben ez a hibaze net kirst jelenti.

m ost i t t vagy 719

kivtelkezels a PHP-ben

# 4 . Kivtelkezels PHP-mdra (folytats)


A kivtelkezels hrom kdblokkbl ll: l.T r y - Ebben a blokkban ellenrzd, hogy az rtk m egfelel-e a vrtnak.

Ha igen, akkor minden rendben, a kd fut tovbb. Ha nem, akkor kivtel lpett fel. Programozi zsargonban gy is mondjuk, hogy kivtelt dobunk. Ha valamit eldobsz, akkor nem rt, ha valami el is kapja azt. Ha kivtel lp fel, a catch" (elkaps) blokkban lv kd fog lefutni. Ha nem lp fel kivtel, ak kor a kd futsa a kvetkez utastsnl folytatdik.

2. Throw - A throw (dobs) blokk a catch blokk parancsnoka, s egy zenetet kld neki. Minden throw blokkhoz legalbb egy ..catch blokk tartozik.

<?php function checkBalance($balance) i f ($balance < 1000) { --- * ~ 1----41 ---{

throw new Exception ' ) return true; ) try { checkBalance(999);

3. Catch - A kivtellel kapcsola tos informci egy objektumba kerl. Az objektum okrl a tls oldal szl.

echo 'Balance is above $1000.'/ } catch(Exception $e) { echo Error: } ?> ' . $e->getMessage();

720 i. fggelk

maradkok

# 5 . Objektumkzpont PHP
Az objektumkzpont (objektum orientlt) nyelvek az eljrskzpont (procedriis) trsaiktl igencsak eltr programozsi megkzelts alapjn mkdnek. A PHP-t ed dig eljrskzpontan hasznltad, de vannak objektumkzpont vonsai is. Az id rendben, lpsrl lpsre vgrehajtott utastsok helyett bizonyos szerkezetek objek tumokk alakulnak. Az objektumok nem csak az adatszerkezeteket, hanem az adatszerkezetek kel elvgezhet mveleteket is tartalmazzk. Ha objektumkzpont PHP-kdot rsz, akkor objektumokat hozol ltre, vagyis objektumokkal dolgozol. Mieltt megtrgyaljuk, hogy mi n lehet rdemes objektumkzpont PHP-kdot rnod. rj is egy keveset.

Ez a Song (Dal) osztly, amelybl ltrehozzuk az objektumunkat.

rj meg egy osztlyt.


class Song { var $titie; var $lyrics;

Ezek a pldnyvltozk. Itt lltjuk be a dal c


{ < ----

function Song($title, $length) $this->title = $title; $this->lyncs = $lyrics;

mt s szvegt, amikor ltrehozunk egy dalt.

function sing() { echo 'This is called ' . $this->title . '.<br />; echo 'One, two, three...' . $this->lyrics; }

Ez egy olyan tagfggvny, ami az ob jektum pldnyvltozit hasznlja.

Hozz ltre egy j objektumot.


$shoes_song = nv; Song (fBlue Suede Shoes', $shoes song->sing();

Az j dalnak a Blue Suede Shoes" cmet adjuk.


'Well i t V s one for the money...');

Itt hvjuk meg az objektum sins() tag fggvnyt.

A dal elnekli nmagt!


A kdot lefuttatva ezt kapod:
Moziba ftfoft

*4 i a. *r { *

CD

Th is is called Blue Suede Shoes. One, two, three...Well its one for the money...

De ha mindenfle objektum-iz nl kl is hasznlhat az ech o utasts, akkor ugyan mirt hasznlna brki is objektumkzpont PHP-t? Ht, pr j ok van azrt r...

m ost itt vagy >

721

objektumkzpont php

# 5 . Objektumkzpont PHP (folytats)


Az idrendben, lpsrl lpsre vgrehajtott utastsok helyett bizonyos szerkezetek objekaim okk alakulnak. Az objektumok nem csak az adatszerkezeteket, hanem az adatszerkezetekkel elvgezhet mveleteket is tartalmazzk. A pldban szerepl song osztlynak a belsejben adtl rtket a dal cm nek s szvegnek, s az osztly belsejben alak tottad ki a sing () tagfggvnyt is. Ha valaha is jabb kpessgekkel kell felruhznod a Song osztlyt, akkor az osztly j tagfggvnyekkel s vltozkkal bvlne. Pldul, ha dalszvegrt kellene rendelned minden dalobjektumhoz, akkor a dalszvegrt t rol vltoz is az osztly belsejbe kerlne. Az objektumkzpont m egkzeltsben rejl er az alkalmazs nvekedtvel fog fel ragyogni. Tegyk fel, hogy7 a Song osztlyt egy karaokeprogramban akarod hasznlni, amelyben dalok - Song osztly objektum ok - szzait, st ezreit trolod, s mindnek megvan a sajt kln cme, szvege s szvegrja. s akkor jn valaki, aki csak azo kat a dalokat hajland nekelni, amelyeket Elvis rt. Nem gond - csak annyi a dolgod, hogy vgignzed az egyes objektum oknak a szvegri tartalmaz pldnyvltozit. s hogy miknt adod t a karaokeprogramnak a dal szvegt? Egyszeren meghvod az ppen nekelt dalobjekaim ok s i n g ( ) tagfggvnyt. Br minden objektum eset ben ugyanazt a tagfggvnyt hvod meg, a hvs eredmnyl mgis minden objek tumnl ms-ms adatot kapsz.

Szval az objektumkzpont PHP kt nagy elnye a kvetkez':


Az objektumosztlyokat knny jrahasznostani. A kialaktsuk az ket hasznl kdtl fggetlenn s a szksgleteknek m egfelelen jrahasznosthatv teszi ket. A kd knnyebben rthet s knnyebben karbantarthat. Ha meg kell vltoztatni egy adattpust, ezt csak az objektumosztly bevezetsben kell elvgezned, sehol mshol. Nagy htrny, hogy az objektumkzpont kd ltalban hosszabb, s tbb ideig tart megrni. Ha csak egyetlen dal szvegt kell megjelentened, akkor egy rvid eljrs kzpont program tnik a legjobb vlasztsnak, de ha azon tprengsz, hogy online karaokeprogramot rsz, rdemes megfontolni az objektumkzpont PHP hasznlatt.

722 / fggelk .

maradkok

# 6 . A PHP-alkalmazsok biztonsgoss ttele


Van pr egyszer lps, am elyeket kvetve megvhatod a PHP-parancsfjljaidat a gyalzatos, a botlsaidat a billentyzetk fl grnyedve les hackerektl.

Tvoltsd el a phpinf o () fggvny hvsait. Amikor j webkiszolglkon kezdesz neki PHP-alkalmazsokat rni, feltehetleg rsz egy parancsfjlt, amelyben benne van a phpinfo () fggvny, hogy lsd, hogy melyik PHP-vltozatot hasznlod, s hogy van-e benne MySQL-tmogats, s milyen egyb fggvnyknyvtrak vannak teleptve. Nem baj, hogy mindezt a phpinfo () fggvnnyel ellenrzd, de miutn megnzted az eredmnyt, tvoltsd el a fggvnyt. Ha ezt nem teszed meg, akkor a Neten az sszes hacker, aki felfe dez egy sebezhet pontot a PHP-ben, ltni fogja, hogy a te webhelyed srlkeny-e ilyen szempontbl. Ha nem valaki ms kiszolgljn brelsz helyet, s gy hozzfrsz a php .ini fjlhoz, akkor a P HP-alkalmazsaid nagyobb biztonsga vgett clszer pr dolgot megvltoztatnod ben ne. Furcsnak tnhet, de a php.ini fjl helye is megtallhat a phpinfo () fggvnnyel:

> 0

phprtfo

CD

ft

' |G.- &

P H P V e r s io n 5 .2 .1

t l D

System Build Date Configure Command Server API Virtual Directory Support Configuration File (php.ini} Path PHP API PHP Extension Zend Extension Debug Build Thread Safety Zend Memory Manager IPv6 Support Registered PHP Streams Registered Stream Socket Transports Registered Stream Rlters

FreeBSD pfo24.abac.com 5.$-RELASE'p2 FreeBSD 5 .5-RELASE-p 2 #0*. Fn Jun 16 11 -29:40 PDT 2006 rootftp 1 abac .com-AiSr/oOj/usr/src/sys-'PRO 386 Apr 3 2007 13 21 53 / co n ju re -enable-verston*v3' 'Vrtf'-iayout-GNU '**disabie-aH --enabte-iibxmr '-vrith- ibxmi-dira/usr/locaf -W iable-^f ecrton' '-program-preix^ '-enabie-fastcgr '~wih-regex=php '-with-zer!d-vm=CALL' -dsabe-ipve' -prefixcAisrykJcai' CGNFastCGl disabled /usrtoca* etc/php5/php.u* ^ 20041225 20060613 ::------- ----------- ...

Ez a php.ini fjlod helye. Ha feljegyez fed, ne felejtsd el trlni a phpinfof) fggvnyt.

220060519
no disabled enabled disabled php iite. data http, ftp, com pressjyb :cp. udo. unix, udg sinng.roti3. string.tcupper, strtng.tolover, string strip tags, convert.*, consumed, zi b.*

Az oldalon lejjebb tovbbi rzkeny adatok is vannak.


%

m ost it t vagy 723

biztonsgi intzkedsek a php-ben

# 6 . A PHP-alkalmazsok biztonsgoss ttele (folytats)


Az albbiakban pr olyan bellts kvetkezik, amelyeket esetleg rdemes lehet a php. ini fjl ban megvltoztatnod. Nyisd meg a fjlt egy szvegszerkesztben, ejtsd meg a vltoztatsokat, mentsd a fjlt, s indtsd jra a webkiszolglt. safe_mode = On Ha a safe_m o d e belltst bekapcsolod, akkor a parancsfjlokat nem hvhatja meg egy' msik, ugyanazon a webkiszolgln lv, eltr tulajdonos parancsfjl. Nyilvnval, hogy amennyiben engedlyezned kell, hogy msok tulajdonban lv parancsfjlok meghvhassk a te parancsfjlja idat, akkor nem kapcsolhatod be a belltst. open_basedir = directory[:...] Ez a bellts a megadott knyvtrra s annak alknyvtraira korltozza a PHP ltal elindthat, il letve hozzfrhet parancsfjlok helyt. expose_php = Off Ha ez a bellts be van kapcsolva, akkor a w ebhelyedet megltogat bngszk az elkldtt fejlc-inform cikbl a PHP-kiszolgldrl is megtudnak egyet-mst. Ha a belltst kikapcsolod, akkor a kiszolgld egy hangynyival kevsb lesz hvogat a gonoszok szmra. display_errors = Off Ha elkszltl az alkalmazsod fejlesztsvel, s egy les" webkiszolgln futtatod azt, akkor nem fontos ltnod a hibazeneteket. Remlhetleg mostanra eleget tettl a hibk ellen, de azrt mindig felbukkanhat valami vratlan dolog. Az oldal ltogati ell ennek a belltsnak a kikap csolsval elrejthetk a hibazenetek. log_errors = On Ezzel a belltssal a hibazenetek egy naplfjlba rhatk. Ha hibt keresel az alkalmazsban, ak kor rdemes ezzel a belltssal kezdened a hibakeresst. Ha a display_errors belltst kikap csolod, a log_errors belltst meg bekapcsolod, akkor te ltni fogod a problmkat, az oldalad ltogati viszont nem. error_log = fjlnv A fjl helye az ltalad hasznlt webkiszolgl alkalmazstl fgg. Ha a log_errors belltst b e kapcsolod, akkor ebbe a fjlba kerlnek a hibazenetek.

724

i fggelk

maradkok

# 7 . vd meg az alkalmazsodat az idegen parancsfjloktl!


Alighanem hallottl mr az idegen parancsfjlokon ala pul, cross-site scriptingnek vagy rviden XSS-nek neve zett tmadsi mdszerrl. Az idegen parancsokon alapu l tmadsok sorn az alkalmazs rlapfeldolgoz pa rancsfjlja kvlrl kap vgrehajtand kdot, s a tmad az gy keletkezett kimenetre csap le. A PHP-ben rt w ebalkalmazsoknl komoly biztonsgi problmt jelente nek az ilyen tmadsok. Nzzk meg, hogy pontosan mirl is van sz, s hogy miknt lehet ellene vdekezni. Az idegen parancsokon alapul tmadsok rendszerint az olyan w ebhelyekei rik, amelyek a felhasznltl ka pott adatokat jelentenek meg. Brmilyen, a felhasznl idtl szrmaz adat lehet hibs - vletlenl vagy szn dkosan s ekppen az oldal ltogatit tmadsok clpontjv teheti. Az XSS-tmadsok kiagyali a legrosszabbakra kpe sek. Az egyik legrosszabb dolog pedig az, ha az oldalad ltogatjt egy olyan webhelyre irnytjk t, ami valaki ms irnytsa alatt ll, s ahol jabb adatokat krnek tle. A felhasznl esetleg szre sem veszi, hogy mr nem a te weboldaladon jr. s sajt maga ad meg bizal mas informcikat, egyenesen a tmad kiszolgljn. m e eg\Ta Guitar Wars oldal elleni tmads lehetsges menete: Ethel az rlap Name (Nv) m ezjben a sajt neve he lyett rvid JavaScript-kdot helyez el. A pldban a window. location fggvnyt hasznlja, amellyel a bngszprogramot a sajt w ebhelyre irnytja. A sa jt w ebhelyn az r. gy aztn azt jelent meg a w eb hely ltogatja eltt, amit csak akar - pldul egy az eredeti oldallal mindenben megegyez kinzet ol dalt. Az olyan oldalak esetben, amelyek a jtkban el rt eredmnyeknl nmileg fontosabb adatokat - pld ul zleti informcikat - krnek el a ltogatktl, Ethel mg ennl is gyalzatosabb dolgokat mvelhet. Ethel tovbbi gyalzatos csalrdsgokat is elkvethet, mondjuk ellophatja a bngsz-stijeinket. vagy egy b e jelentkez kpernynek ltsz oldalt jelenthet meg a fel hasznl eltt. Ahogy* a felhasznl bejelentkezett, a fel hasznlnv s a jelsz birtokban Ethel mris bejelent kezhet az eredeti weboldalra - a felhasznl nevben. De hogyan kerlheted el egy webalkalmazsban az ide gen parancsokon alapul tmadsokat?
.

fo ty

t o n - Arid Your MigH Scorg

G uitar W ars - Add Your High Score


i N e: fv Hc e om th| cki
Score: loooooo-

Screen ihot: ( p r a T r * ) % hetcOT2.9K

Ha mr Ethel nem esal-, hat, akkor a pontszmo kat tartalmaz oldalt XSS-sel a sajt webhelyre irnytja.
A z t h itta d , h og y t lj r t l a z eszem en, d e m a jd j l e lte rte m a z o ld a la d a t, e a k k o r neked kam pecl

<script la n g u a g e - javascript">window. location="http://ethelrulz. com";</script>

Ethelnek csak annyi a dolga, hogy az rlapon a nv mezjbe ezt a kdot rja. Ha valaki megnzi a pontszmokat, a bngszjt a JavaScript-kd tirnytja Ethel webhelyre.
most itt vagy 725

vdekezs az xss ellen

# 7 . vd meg az alkalmazsodat az idegen parancsfjloktl! (folytats)


Szerencsre, ha a berkez adatokat ellenrzd, akkor j ton haladsz az alkalma zs megvsa fel. A Guitar Wars alkalmazs megrsakor mr megtanultad az adatellenrzs mdjt. m e a hrom alapelv, amellyel az alkalmazsaid biztons goss tehetk: I

Ellenrizz mindent!
Minden olyan adatot, amelyet az alkalmazs kvlrl kap, ellenrizned kell. gy mg az eltt megtallhatod a rossz szndk kdokat, hogy azok az alkalmazsban brmilyen galibt okoznnak. Nagyobb biztonsgban vagy, ha egszen addig flttelezed. hogy' az adat rthat, amg az ellenrzs az ellenkezjt nem bizonytja.

I I

A PHP beptett fggvnyei a segtsgedre lehetnek


A kls adatok megtiszttshoz hasznlj olyan beptett PHP-fggvnyeket, mint a s t r i p _ t a g s ( ) , amely arra val, hogy egy karakterlncbl minden HTML-cmkt eltvoltson. Amennyiben az Etheltl szrmaz $_POST[ 'nam e' ] vltozt tfutta tod a s t r i p _ t a g s () fggvnyen, ezt kapod eredmnyl: window. locat:ion= 'http: //ethelrulz .com' Br ez mg mindig nehezen nevezhet nvnek, egyetlen bngszt sem fog seho v tirnytani, hiszen mr nincsenek benne a fontos JavaScript-cmkk.

Az adat egszen addig bnsknt kezelend, amg az ellenkezje be nem bizonyosodik


Kezdd a legszigorbb ellenrzssel, s ha nagyon muszj, akkor lazts rajta. Pld ul ha egy telefonszm ok bevitelre szolgl rlapmezben csak szmokat fogadsz el, s ksbb m egengeded a zrjel s a ktjel karaktereket is, sokkal nagyobb biztonsgban vagy, mintha kezdettl fogva megengednd az sszes bett s sz mot. Vagy, a Guitar Wars alkalmazst tekintve, ha a Name m ezben csak betket engedsz meg, akkor soha nem juthat be a kisebb, mint" (<) jel, amellyel Ethel go nosz JavaScript-kdja kezddtt. A 10. fejezetben ismertetett szablyos kifejezsek hasznlatval hatalmas lpseket tehetsz afel, hogy pontosan csak azok az adatok jhessenek be, amiket szeretnl.

726 / fggelk .

maradkok

# 8 . Mveleti sorrend
Vizsgld meg a kvetkez kdsort:

$ m a rb ie s = 4 / 2 - 1 ;

Az eredmny I lesz.

A $m a rb les vltozban trolt rtk 1 vagy 4 lehetne. A kd alapjn nem mondhat meg, hogy melyik, de felttelezhet, hogy a kd kveti a mveleti sorrendet. A mveleti sorrend hatrozza meg a mveletek vg rehajtsnak sorrendjt. A PHP-ben a mveletek adott sorrend szerint hajtdnak vgre. A fenti pldban az oszts megelzi a kivonst, a $m arb les vltozban trolt rtk teht 1 lesz. Attl fggen, hogy milyen kimenetet kell a kdnak ellltania, a fenti sor ktflekppen rhat fel: $marbles = (4 / 2) - 1; $marbles = 4 / ( 2 - 1 ) ; Az els esetben ngyet osztunk kettvel, majd kivonunk egyet. A msodik esetben elvgezzk a kivonst, majd a ngyet elosztjuk a kivons eredm nyeknt kapott eggyel. A zrjel hasznlata lehetv teszi a m veleti sorrend pontos megadst, de ha ismered a PHP mveleti sorrendjt, akkor az sszetett kifejezsek viselkedst is meg tudod rteni. Hidd el, ez az ismeret jl fog mg jnni, amikor azrt kell hibt keresned egy kdban, mert elfelejtetted kitenni a zrjeleket. Mieltt rtrnnk a PHP mveleti sorrendjre, lssunk mg egy indokot, amirt rdemes lehet zrjeleket hasznlni. Figyeld meg az albbi kdot: $marbies = 4 - 3 - 2 ; A? eredmny 1 lesz.

A mveleti sorrend trvnyei itt nem rvnyesek. Az eredmny lehet 3 s -1 is, ami programrs kzben elg zavar. O kosabb, ha a kdban zrjelezel, mint ahogy az albbi kt sorban mi is megtettk: $marbles = 4 - ( 3 - 2 ) ; $marbles = (4 - 3) - 2; s akkor a lista, az elsknt kirtkelt mvelettl haladva az utolsknt kirtkelt mvelet fel:

A mvelet tpusa
++ */ % + - , < < = > > =

<>

1-------------1

& &

11
= + = - = * = / = . = 0/0 = & = |= A = = =

and xor or

nvel/cskkent aritmetikai aritmetikai s karakterlnc------------------------- /----------------------------sszehasonlt sszehasonlt logikai logikai rtkad logikai logikai logikai

Az sszehasonlt mve leteknek, mint amilyene ket az IF utastsokban hasznlsz, szintn van mveleti sorrendjk.

most itt vagy 7 2 7

a php 5 s a php 6

# 9 . Klnbsgek a PHP 5 s a PHP 6 kztt


A knyv rsakor a Pl IP 5 volt a legfrissebb stabil PHP-vltozat. Ugyanakkor mr folyik a munka a PHP 6-on is, s a fejlesztk szmra elrhet, mgpedig innen: ht tp://snaps.php.net/ . A PHP 4 s 5 kztti klnbsg lnyegesen nagyobb, mint az 5 s a 6 kztt. A 6-os vltozat sok tekintetben az 5-s vltozatban megjelent objektumkzpont kpessgek finomtst je lenti. A tovbbi vltozsok kztt megtallhat az XML s az Unicode nagyobb tmogatsa.

Nagyobb Unicode-tmogats
Ttelezzk fel, hogy egy alkalmazsodnak grg szveget kell megjelentenie.
Wro 0&4.0* . 4W aantr* 4\

Ji

- n r //O f

X U /fc 4 ^ n > h .tT jr i - r co*% j 3

'

iV

<

O R E IL L Y
Ao x v tf.n m
MX V LfiL
fif
*4'0

Ez neked knai.
(Maker Faire)

siiA rron^ a rrr)

14 * .Mm m w a*

iJd * i

tn x ti AI**AT B V * &.A IrVdfOrlXwfflUf


IBA4

w - l
nfte vari

rrM jtt T
U
w :; UftOm .

Mti v C W
vu rurfiHr

1^1 O*<V b

nwi #a wa

Uo i

ta

r,w<rfju% a- t'.-m*

* >*. tn:
flnorvoc

"V 4 laiww

T ; Pow TO L*lerc*TOP, im er P.

wm t-

MCiaimniiiMaM

Gondolj csak azokra a mveletekre, amelyeket egy-egy karakterlnccal el kell vgezned, pldul megllaptani a hosszt vagy rendezni. Angol nyelv szveggel ez megy, mint a ka rikacsaps, de ha ms nyelvek karaktereivel dolgozol, a karakterlncokon vgzett mveletek bonyolultabb vlnak. Az Unicode nem ms, mint egy karakterkszlet, illetve a benne lev karakterek kdolsra szolgl technolgia. Az Unicode kdolsban a knai rsjegyek is kapnak egy-egy szmk dot, a tbbi nyelv karaktereihez hasonlan. Az Unicode elfogadott szabvny, ami annyit tesz. hogy a fbb fejlesztk tmogatjk. Az Unicode kdolsban minden karakternek egyedi azonostszma van, amely fggetlen a hasznlt nyelvtl, alkalmazstl s rendszertl. A PHP 5 m egjelense eltt a PHP nem igazn tudta kezelni az Unicode kdols karaktere ket. Az Unicode kdols karakterlncokat illeten, illetve a kifejezetten az Unicode kdol s karakterlncok ellltsra s m egfejtsre szolgl fggvnyek tekintetben a PHP 6 nagyobb tmogatssal br.

728 / fggelk .

maradkok

# 9 . Klnbsgek a PHP 5 s a PHP 6 kztt (folytats)


Fejlettebb objektumkzpontsg, az XML tmogatsa, s egyb vltozsok
A P H P 5 tmogatja az objektumkzpont programozsi modellt, ugyanakkor lehetv teszi, hogy keverd az objektumkzpont s az eljrskzpont programozsi elemeket. A PHP 6 tovbbi lpseket tesz az objektumkzpont vilg fel. Ebben a tekintetben a legjelentsebb vltozsok \ ,... * . . . . r, , egyike, hogy tbbe nem lesz lehetseges a dinamikus fggvnyeket a statikus fggvnyeknl hasznlatos mdszerrel meghvni. Ezen kvl renge teg kicsi, mde fontos olyan vltozs is van, amelyekkel az objektumkz pont kd kezelst illeten a PHP hasonlbb vlik az egyb objektum kzpont nyelvekhez, pldul a C++-hoz s a Javhoz. Pr tovbbi vltozs: A PHP 6 csomagban helyet kap az XML Reader ( XML-olvas) s az XML Writer (XML-r) bvtmny, ami megknnyti az XMLfjlokkal val munkt. A php. ini fjl rcgister_globals, magic_quotes, s safe_mode belltsai nem lesznek elrhetek a tovbbiakban. A szablyos kifejezsek ltrehozsra val ereg bvtmnyt eltvo ltjk. Szerencsre a knyvben is trgyaltuk a p reg_m atch () fgg vnyt, amely a PHP 6-ban a szablyos kifejezsek ltrehozsnak f eszkze lesz.
B e k e r l a n y e lv b e e g y 6 4 b ite s e g s z tp u s.

_____ A knyvben szerep l kdok egyike

sem hasznl dinamikus fggvnyszva| ngm y j aggdnod, a k. , * , . , niJr , L dk futni fognak a PHP 6-ban is. 3

A fo r e a c h ciklus kpes lesz tbbdimenzis tm bk bejrsra. A PHP 6-os vltozata mindenekeltt a nyelv tiszttst s finomtst clozza.

m o st i t t vagy 729

n p s z e r php nyelv alkalmazsok

#10. Msok PHP-kdjnak hasznlata


Nem minden esetben kell a sajt PHP-kdodat a nullrl indulva megrni. Vannak esetek, amikor az a leg okosabb, ha egy msvalaki ltal mr megrt kdot hasznlsz. A kvetkezkben nhny npszer s igen csak sikeres PHP alap programcsomagot mutatunk be. amelyeket szksg esetn btran hasznlatba ve hetsz ahelyett, hogy jra feltallnd a kereket. Ja, mg valami - ezek a programcsomagok szabadon felhasznlhatk!

Drupal
Napjaink egyik leginkbb tiszteletet parancsol PHP-programja a Drupal. Olyan, jl hasznlhat tartalomkezel rendszerrl van sz, amely szinte brmely tartalom alap weboldal kia laktsra megfelel. A NASA, a The Onion, az Electronic Frontier Foundation s a Popular Science webhelyein egyarnt a Drupal mkdik. A Drupal elg rugalmas alihoz, hogy szinte brmilyen, tartalom alap webhely alapjul szolgljon. A h t t p : // d ru p a l. org/, illetve a h t t p : // d ru p al. hu/ weboldalon tallhatsz rla informcit.

Na, c s i! M inek ta n u lja m meg a P H P -t, ha m s o k k d j t is h a s z n lh a to m ?

A Joomla! egy tovbbi, igen gyes, P H P alap tartalomkezel rendszer. A http://www.joomla.org web helyre elltogatva jobban is megis merheted.

phpBB

A phpBB az online frumok birodalmnak taln legnevesebb tagja knt az egyik legkzenfekvbb vlaszts, ha sajt frum kialakts rl van sz. A phpBB hihetetlenl sokoldal, s abban a dologban, amire ksztik - beszlgetsek, beszlgetsszlak kezelse - nehz nla jobbat tallni. A http: //www.phpbb.com/,illetve a http: //phpbb. hu/ weboldalon tudhatsz meg rla tbbet.

Coppermine Gallery
Ha egy kptrolsra val oldal ksztst fontolgatod, akkor meg kell ismerned a Coppermine Gallery nev PHP-alkalmazst. A Flickr. a Photobucket, a Shutterfly s a Snapfish korban a sajt fottr zem eltetsnek krdses a ltjogosultsga. Ugyanakkor, ha teljes ellenrzst kvnsz gyakorolni a kpeid felett, akkor a http: //coppermine-gallery .net / oldalra elltogatva rdemes egy pillantst vetned a Coppermine Gallery-ra.

W/ord Press
A webnaplksztk versenyben a WordPress a nehzsly kate griban indul. Egy olyan PHP alap webnaplkszt programrl van sz, amellyel egy webnapl-oldalt kialaktani s karbantartani minimlis erfesztst jelent. A webnaplksztk versenye kile zett. szval rdemes jl krlnzni, de a WordPressnl nemigen ta llsz jobbat. A WordPress a http: //wordpress .org/, illetve a http: //word press.hu/ oldalrl tlthet le.

M ert msok kdjt hasznlni nem min dig olyan egyszer, mint azt gondolnd - nha nem rt rteni a PHP-hez.
Sok PHP-alkalmazst testre kell szabnod, ami gyakran Pl IP-fejleszti felkszltsget ignyel, s akkor mg nem is beszltnk ar rl, hogy elkpzelhet, hogy a ms ltal k sztett kdbl csak egy rszletet akarsz hasznlni, nem az egszet. Akrhogy vesszk, ha rtesz a PHP-hez, akkor van v lasztsi lehetsged, s az bizony j dolog!

730

/. fggelk

ii. fggelk: fejleszti krnyezet kialaktsa

J tsz t r

Szksged lesz egy olyan helyre, ahol jstet PHP- s MySQL-ismereteidet kiprblhatod, anlkl, hogy az adataidat kitennd a webes tmadsok veszlynek. Mindig hasznos, ha egy PHP-alkalmazst biztonsgos helyen fejlesztesz s tesz telsz , mieltt elrhetv tennd az egsz vilgon (vilghln). Ez a fggelk se gt bezem elni a webkiszolglt s telepteni a MySQL-t s a PHP-t, vagyis egy biztonsgos sarkot kialaktani, ahol dolgozhatsz s gyakorolhatsz.

ez egy fggelk 7 3 1

a php s a m ysq l helyi teleptse

Teremts PHP-fejleszti krnyezetet!


Mieltt egy ksz alkalmazst elhelyeznl a Vilghln, nem rt, ha megrod. Az l mosknyv szerint semmi jt nem jelent, ha egy webalkalmazst az em ber az egsz Vilghl orra eltt fejleszti. Lehetsg van arra, hogy a szksges programokat az ott honi gpedre teleptsd, s ott fejleszd ki s teszteld az alkalmazsodat, mieltt kitennd a Vilghlra. A PHP-alkalmazsok otthoni fejlesztshez s tesztelshez hrom programot kell teleptened a szmtgpedre: 1. 2. 3. Egy webkiszolglt A PHP-t Egy MySQL adatbzis-kiszolglt

A PHP nem kiszolgl, hanem egy olyan szablykszlet, amelyet a webkiszolgl megrt, s a segtsgvel rtelmezni tudja a PHP nyelv programkdokat. A webkiszolgl s a MySQL-kiszolgl egy-egy, a gpeden futtathat program. Fontos megrtened, hogy a sajt gpedre fogod telepteni a PHP-nyelv alkalmazs fejlesztshez szksges webkiszolglt. Ettl mg mindig szksged lesz egy sa jt internetkapcsolattal rendelkez webkiszolglra, ahov a ksz alkalmazst majd fel tltd, s ahol msok is elrhetik s hasznlhatjk azt.
A PHP-parancsfjlokat egy webkiszolgl program, pldul az Apache alaktja weboldalakk^X

K is z o lg l s z m t g p

A PHP-fejleszti krnye zetedben a sajt gped lesz a PHP-parancsfjfokat fu t tat kiszolgl.

A MySQl-adatbzis-kiszolga'lt gyakran ugyanarra a ge'pre telep tik, ahova' a webkiszolgld prog ram is kerl - esetnkben ez a gp a te otthoni gped.

A PHP-t a webkiszolgl program rszeknt teleptik, s arra kell, hogy a webkiszolgl kpess vljon PHPparancsfjlok futtatsra.

Milyen opercis rendszered van?


Mieltt elkezdend a helykre tenni a PHP-fejleszti krnyezel egyes darabkit, legokosabb, ha megnzed, hogy mi az, ami mr most a helyn van. Tekintsk t az egyes darabokat, s nzzk meg, hogy miknt dnthet el, hogy van-e mr ilyen a gpeden. Abban, hogy milyen elem ek vannak teleptve, az ott honi gpeden fut opercis rendszer jelents szere pet jtszik. A Mac OS X-et futtat gpeken alaprtel mezs szerint tallsz webkiszolglt, mg a legtbb W indows-gpen nem.

MEGJEGYZS: A fggelkben lertak a W indows 2000, XP, Vista, W indows Server 2003 s 2008, s egyb 32 bites W indows opercis rendszerekre, a Macintosh esetben pedig a Mac OS X 10.3-ra s az jabb Macintosh rendszerekre vonatkoznak.

732

//. fggelek

fejleszti krnyezet kialaktsa

Van webkiszolgl a gpeden?


Ha jabb PC-d vagy Maced van, akkor lehet, hogy mr van webkiszolgl a gpeden. Ez gyorsan megllapthat, ha megnyitsz egy bngszablakot, s a cmsorba berod, hogy h t t p :/ / l o c a l h s t. Ha betltdik valamilyen bevezet jelleg oldal, akkor az azt jelenti, hogy a gpeden lv webkiszolgl l. s j egszsgnek rvend.

e s i *f t

#
Index o f /

2 4 -M *r-2 0 & t 13IT

Ha a gpedre az Apache webkiszolgl van teleptve, akkor Macen s Windowson is valami ehhez hasonlt fogsz ltni.

.......... Ha olyan, Windowst futtat gped van, ahov az ||$ van teleptve, akkor valami ehhez hasonlt fogsz ltni,

Van PHP a gpeden? Melyik vltozat?


Ha van webkiszolgl a gpeden, akkor knnyedn megllapthatod, hogy a PHP is meg van-e, s azt is, hogy a PHP-nek melyik vltozata. Hozz ltre egy in fo .p h p nev parancs fjlt, s rd bele ezt:
<?php p h p i n f o O ; ?>

A parancsfjlt mentsd a webkiszolgld ltal hasznlt knyvtrba. Windowson ez a knyv tr ltalban a kvetkez: C :\inetpub\wwwroot\ Macen meg valami ilyesmi: /Users/a neved/Sites/ Ha van a gpeden PHP, s a bngszd cmsorba a http: //localhost/info.php hi vatkozst rva lefuttatod a parancsfjlt, akkor valami ehhez hasonlt fogsz ltni:

Ez a gpedre teleptett PHP vltozatszma.

m ost i t t vagy 733

a mysql-vltozat ellenrzse

Van MySQL a gpeden? Melyik vltozat?


Windowson ezt akkor ludod megmondani, ha a Vezrlpult (Control Panel ) megnyitsa utn a Felgyeleti eszkzk ( Administrative Tools) kzl a Szolgltatsok (Services) ikonra kattintasz.

A MySQl-nek itt kell lennie.

Azt, hogy van-e MySQL a gpeden, Macen gy mondhatod meg. hogy megnyitsz egy terminlt, s berod az albbi sn: cd /usr/local/mysql Ha a parancs mkdik, akkor van MySQL a gpeden. A vltozat ellenrzshez rd be ezt: m y s q l ________________ _
I File Edit Window Help IHeartPHP

A MySQL-terminll, amely MySQL monitor nven is ismert.

$ cd /usr/1ocal/mvsai

Ha ez a parancs sikeresen lefut, akkor van MySQt a gpeden.

$ raysql Ap Welcome to the MySQL monixor. Commands end with ; or \q. Your MySQL connection id is 3 Server version: 5.0.51b MySQL Community Server (GPL) Type -help;' or ' for help. Type T\c' to clear the buffer. mysql> / /

Ez a gpedre te leptett MySQL vltozatszma.

734 i i f g g e le k

fejleszti krnyezet kialaktsa

Kezdd a webkiszolglval!
Attl fggen, hogy melyik Windows-vltozat fl a gpeden, letltheted a Microsoft Internet Information Server-t ( US) vagy a nylt forrskd Apache webkiszolglt. Ha Macen akarsz webkiszolglt futtatni, ak kor is rdem es az Apache-ot vlasztanod, hiszen az alaprtelmezs szerint teleptve van. Kvetkezzk az Apache Windowsra teleptsnek rvid ttekintse:

Ltogass el a http: //httpd.apache.org/download.cgi weboldalra. Ha Windowst hasznlsz, akkor az no_ssl r2 . ms i (vagy jabb, m si letltened, m n ebbl a fjlbl az feltelepl, ha a letlts vgeztvel ap ach e_2 . 2 . 9 -w in 3 2 -x 8 6 kiterjeszts) fjlt tancsos Apache automatikusan megnyitod.

Ezt a vltozatot tltsd le, s ha lejtt, kattints dupln az ikonjra.


Ekkor megnylik az Installation Wizard (Telept varzsl) ablaka. Az utastsok legtbbje magtl rtetd, s elfogad hatod az alaprtelmezett belltsokat.

f*T"

a p icu u t

TI W J * 0 ZVCXTteFCRtSK

MC tiW MtfW l,
S s -iH M T T r W .

9* m .a* *.r. ** t

v,% .)nrA * : zto***r* **** Wm im a# u tt

Add meg annak az internetes tarto mnynak a nevt amelynek a gped rsze. Ha nem tudsz megadni ilyes mit, akkor rd be azt, hogy localhost.

A legokosabb, ha a Typical (Szoksos) teleptsi lehetsget vlasztod.

Rendszerint nyugodtan vlaszthatod az alaprtelmezett knyvtrat a prog ram teleptsre.

most itt vagy

a p hp teleptse

Az Apache teleptse...befejezs
Mr majdnem ksz is vagy. Kattints az Install (Telepts) gombra, s vrj nhny percet, amg a telepts vgbemegy. Ennyi az egsz!

A webkiszolgl gy van belltva, hogy a gpeddel egytt induljon el, de ha a Vezrlpult megnyitsa utn a Felgyeleti eszkzk kztt a Szolgltatsok ikonra kattintasz, akkor a m egjelen Szolgltatsok ablakban immr megtallhat a w ebkiszolgl is, ahol tetszs szerint lellthatod vagy elindthatod.

A PHP teleptse
Ltogass el a ht tp:/ /www. h p .n e t /downloads .php weboldalara. p Csakgy, mint az Apache esetben, ha Windowst hasznlsz, akkor azt tancsol juk. hogy a Windows teleptrendszerhez illeszked, php-5 .2 .6-win32installer . r s (vagy jabb, msi kiterjeszts) fjlt tltsd le, m n ebbl a fjl iti bl a PHP automatikusan feltelepl, ha a letlts vgeztvel megnyitod.
w m m m z :....

Ez a Windowshoz megfelel, .msi kiterjeszts' vltozat. Ha kivlasztottad a letltend


7 36 H fggelk

f jlt, akkor vlaszd ki azt is, hogy honnan tltd le.

Miutn letlttted a fjlt, kat tints r dupln. A Run (Futta ts) gombra kattintva m eg kezddik a telepts.

fejleszti krnyezet kialaktsa

A PHP teleptsnek lpsei


A megszokott teleptkperny fogad. A telepts folytatsa eltt el kell fogadnod a felhasznlsi szerzdst. Az alaprtelmezett teleptsi mappt ltalban elfogadhatod.

Welcome to Ihe PHP 5 .2 .6 Setup Wizard

C t e I t e t t t o a m f c x * Of

n* >*u d -4 5.2.6 /WO BBPJ^t m u 'c. f J t r^ t P t f f a * d >ii auet? an ,*v *r*v^t K *.t#f W vff^ /nQC K

y forma,

/ [ l

Ennl a kpernynl figyelj oda! Ha Apache webkiszolglt hasznlsz, add meg a hasznlt vltozatot. Ha az HS-t hasznlod, akkor alighanem az IIS ISAPI modul lehetsget rdemes vlasztanod. A hasznlt programot figyelembe vve llapthatod meg, hogy mit kell megadnod. A kvetkez kperny is figyelmet ignyel. Menj lefel az Extensions (Bvtm nyek) listn, s jelld meg a mySQLi lehetsgei. Ez val arra hogy a PHP-vel telepljenek azok a mysqli-fggvnyek, amelyeket az egsz knyvben hasznltunk.

V
1
W *b Server S r tu p

5e*c t * vft b e KW :o ts*i

Az Extensions gban keresd meg a MySQLi-t, kat tints r, s vlaszd az Entire feature" lehetsget m ost it t vagy > 737

a mysql teleptse wndowsra

A PHP teleptse...befejezs
Ennyi az egsz. Kattints az Installgombra, majd a Don (K sz) gombbal zrd be a teleptt.

Ha eljutottl idig, prbld megnyit ni a http://localhost/info.php oldalt a webbngszdben, s ellen rizd a vltozatszmot.

ComplftWi the PHP 5.2 Setup W!?jrd

A MySQL teleptse
Teleptsi tmutat s hibaelhrts
A MySQL teleptsvel mg sehol sem tartunk, szval gyrkzz neki, s tltsd le, hogy telepthesd. A MySQL RDBMS-kiszolgl ingyenes vltozatnak manapsg MySQL Community Server a neve. Az albbiakban ismertetjk a MySQL teleptst Windows s Mac OS X opercis rendszerre, de ez az tmutat nem helyettesti a MySQL wr eboldaln olvashat re mek segdanyagokat, szval melegen ajnljuk, hogy keresd fel s olvasd el az oldalt, amely az itteninl lnyegesen rszletesebb teleptsi tmutatt s hibaelhrtsi segdletet tartalmaz: . .

6.0-as vagy ennl jabb vltozatot szerezd be.


http://dev.mysql.com/doc/refman/6.O/en/windows-installation.html

Szeretni fogod a MySQL Query Brow ser alkalmazst is, amelyrl mr beszltnk. Ha a lekrdezseket ebben fogalmazod meg, akkor az eredmny is itt jelenik meg a konzol helyett.

738

//. fggelk

fejleszti krnyezet kialaktsa

A MySQL teleptsnek lpsei Windowson

Ltogass el erre a weboldalra:

h t t p ://dev. m y s q l .com/downloads/mysql/6 .0 .html


s kattints a MySQL Community Server letltgombjra.

ntp'/^r.-n^*:ol<cnvi^vnx^rayci' S.tefr.:

M y SQL
Home Products Services

$ 0 1 L < ) L R OHL
f ^ in w r s & Sotutifis | CustOfTfefs Wirw* & E v*fit& bovt Why MySQL? K o w fo B jy

Vlaszd az 5.0-s vagy ennl jabb vl tozatot.

Downioas

M ySQ L 5 0 D o w ?lo a d s

rrm an>
Urne Ul c W . * *
lu r o

ajutf Viv UtfiOL sr*n<K, If


f? j M a i n p w f c * m a r c e e /

M ySQ L C o m m u n ity S e rv e r

s r Jv 3rd

H pom *+> (U U % jriT *o m v iM W *O f .


3 * ru n t, w f v f

Download

rm

o to ir ? * * :

>

K A iI lcs.it

u c*06S CCo p itfv *M n-.


T in * to idcnUfr and rt

A W^ lcH ib

tfa isop OffiiDca -x & nfS L oar


ar.d dhe-r

M ySQ L

A listbl vlaszd a W indows- 1.

A legfelst!
.. ,
tttfweal I f t SAi mort
'&

. _ _ _ V
M ySQ L 5.0 C o m m u n ity S rver - G enerally A vailable I
to c o r n ia l

I nttftf/dev r r y a ; t c c ^ \ W ^ f ^ f n ^ V * 5 ^

Windows

SAim b hca.i

,u lvioJuit V w h j hm .oncttttIfcSQLConunuint' i *: * t'4 .


* * ^ a f t f ? as* ofl w w * r w cj
c e r r > o a f l r t t m * 3 r u rrxj m a c c / M fta n ta j

10 r ie

i h K T n c i m A Dean m o m j

fi!w ;M 9# ?*** f l 4 v j Up I M r sc *ufc*r<*um iCc lu i (Knit c * anti 3<iirt4* * f W t t ' j

Ihr U ixvqumncMf- ncY / ttcoai tr tn soJ*** : t3w CW k


Max vOi^wi tf :<i k cmetf c* >

T*? S M M tviwvts a*i recmmeaefl toc

W in d o w s x64 Linux n o n RPM p a cka g e s: Linux Mion RPM. Inte: f + c c n t R ed H at E nterprise Linux 3 RPM i

cioctnts

Th ftofecg f\*v* inc k ir * r*nu^tf>g c

v.>jw M jii_a, . l aji


W Kote- acre IV * H S l h u jenem !*

ttdfltti a
V J r t f i f lh g 5 * 4

UflJ, ioar.RPiQLSi C .T.

a^ iL ag L Jif.Ra.u jg v mT B ^ B Wfl^B MW 6 g rtg tt ^ 3 R n llia fl


. Pj o ,riX . s X tS X A t UnUK.4 fiPL\

H? " H T i

L f i 4 BHU

F iio h) tfifc a

m mm

mosf i t t vagy > 739

a m ysql teleptse w indow sra (folytats)

Tltsd le a teleptcsomagot!
Azt tancsoljuk, hogy a Windows downloads rszbl a Windows ZlP/Setup.EXE lehetsget vlaszd, ez ugyanis nagyban leegyszersti a teleptst, hiszen a csom agban helyet kapott egy teleptprogram is. Kattints a Pick a Mirror (T krkiszolgl vlasztsa) hivatkozsra.

M km ySQ Window dow nload! !p

Windows ZlP/Setup.EXE (x86)


II: H ffW 3cd M a> illS3tS3glega^ i l

2P.1teUip.tA U8ci (unrp fi C V

nir scis sow

Window xW dow nload* (pattern no:aS)

Felttlenl az .EXE vgt vlaszd!


B SM lL y E fllB !m

Wr*x>wft ZP Set Up tXk (AM064 - In tel FMGrfT)

5045

51 / U

U i ^$4M D *fc4eat>r*m i*c*ien

W ouf mfitt-er iAVD-5. nkS 5W n im 64

5045 S JM 1
5 0 46 7 s. f a j 4 M

Linux (non RPM p * c k * c e t) download* [plascm notes I


1 * iu m *S 6 fli C -2 * ''i a f t f f t n r f e s ta tic }

~ rro f

f .r c I bmr <xC) LUK <AMDf^ ; mtr t Vti* t}


L f**< 4 A fc4 W *d M * 21 50 it

<<r,M
> 2 2 2 ^ I E A 2 .C lp *

I .

^.mxu'u
v j u

1 ? a W eW A fC U .0 eiW W sW U T ttrtt . K 132 i- u cw y *i4iam n i% r4 cfT iw 55c^


tv rtttmcr > Mooc <*l

so 4s

Dc^rao |e a u ir m :

M0 0%

u>JiW W W

m . H g p p p W. .i

Egy listt fogsz ltni azokrl a helyekrl, ahonnan letltheted a programot. Vlaszd azt. amelyik a legkzelebb esik hozzd. Ha a fjl letltdtt, az egrrel dupln rkattintva indtsd el. Ekkor megnylik a teleptst vgz Setup Wizard ablaka. Kattints a Next (Tovbb) gombra.

Welcome to the Setup Wizard lor MySQL Server 5.0


The Setup VVcard vi dkrtt yuu to "locfcf-y, rpa#, or rencve MySQL Server 5.0. To o n K , cfck fteyt

M yS Q L
kBI A C

Ha az egrrel elindtottad a tele ptt, s megnylt a Setup Wizard ablak, kattints a Next gombra.

740

fggelk

fejleszti krnyezet kialaktsa

Add meg a clmappt!


@ A telept arra kr, hogy vlassz a Typical (Szoksos), a Complete (Teljes) vagy a Custom (Egyedi.) teleptsi mdok kzl. A knyv cljainak a Tyipcal md is megfelel. A szmtgpeden megvltoztathatod a MySQL teleptsnek helyt, de azt tancsoljuk, hogy maradj az alap nei mezett mappa hasznlata mellett:

C :\Program Files\MySQL\MySQL Server 6.0


Kattints a Next gombra.

Kattints a; Install gombra, s kszen is vagy!

Ekkor a Ready to Install (Teleptsre ksz) prbeszdablakot lthatod, ahol megtekintheted a Destination Folder (Clmappa) rtkt. Ha a tele pts clknyvtrnak belltsa megfelel, kattints az install gombra. Ha nem, akkor a Back (Vissza) gombbal visszatrhetsz az elz kper nyre, ahol a Change (Mdosts) gombbal megvltoztathatod a knyv trat, majd visszatrhetsz ide. Kattints az Install gombra.

m o s t i t t vagy

741

a mysq/ teleptse m ac os x-re

A PHP engedlyezse Mac OS X-en


A Mac OS X 10.5 ( Leoprd) s ksbbi vltozatai tartalmazzk a PHP-t, de alaprtelme zs szerint nem indtjk el. Meg kell nyitnod az Apache f belltfjljt, s be kell kap csolnod egy sort, hogy a PHP betltdjn. A belltfjl neve h t t p d .c o n f , s abban a mappban tallhat, ahov az Apache-ot teleptetted. A belltfjlban az albbi sort kell megkeresned - a sor elejn lv kettskereszt a sort megjegyzss alaktja: #LoadModule php5_module Iibexec/apache2/libphp5.so

Trlnd kell a kettskeresztet, majd jra kell indtanod a vvebkiszolglt, hogy a Pl IP bekapcsoldjon. A h t t p d .c o n f fjl a root" felhasznl tulajdonban van, ami annyit tesz. hogy az llomny megvltoztatsakor meg kell adnod a jelszavadat. Elkpzelhet, hogy a p h p . i n i fjlt is be kell lltanod, hogy az Apache hasznlatba vegye. Az emltett lpsek megvalstsrl, illetve a PHP bekapcsolsrl bvebben a http://foundationphp.com/tutorials/php_leopard.php oldalon olvashatsz.

A MySQL teleptse Mac OS X-re


Ha Mac OS X Server opercis rendszert futtatsz, akkor elvileg a MySQL valamelyik vl tozata mr teleptve van a gpedre. Mieltt nekifognl a teleptsnek, ellenrizd, hogy a xMySQL valamelyik vltozata nincse mr jelen a gpeden. Ezt az Applications (Alkalmazsok) men Server (Kiszolg l) alm enjnek MySQL Manager parancsval teheted meg. Ltogass el erre a weboldalra:

http: //dev.mysql.com/downloads/mysql/6 .0 .html


s kattints a MySQL Community Server Download gombjra.
itvvs
*,v)i %

Lehet, hogy kicsit lejjebb kell grgetned az oldalon.

MySQL 5.0

MySQL Community
I i o * t> I -. V I t . . : f e l r* ........... .... na

Server
J

V AvuteJ

MQ fS t
Svrvr*

ri
lltt
tomtn is u m v cv v w m um vw r * v

742

fggelk

fejleszti krnyezet kialaktsa

A listbl vlaszd a Mac OS X (package formt) lehetsget.


VtfOv S.O
y y y / y .

w . >-

> -vxw<'>

Cu*** 0?mr*x**n
CSfl> M lS ** U H fl f t e w '

hothnirait KISKC. vora s ra p*. ftfe K A .B S L ?.

MySQL 5.0 Community Server - Generally Available (GA) Release U O O f t f f l c t M ySQi 'oothfr rD di 4 er>.ftery r.icet t - c * r***} 0**4A 1 O ky #t^nf. v*mn < *v* m ji C^jw y /H vu^r/f>r#fi?r#i0w **.i* wrvnu^ti mtibM d necft arpi^cio r
Enlvpnsv Suvcr vrf ol 0 <nr * fcAttq,*njConm unr>Sefvtf n t o t o Qwtv mil *
to u ttm w 4 jJw sy t

toft* r
D e m o l e irxjm t h r 5 ^ -. N ?

iK 4

Kicsit lejjebb kell gr getned, hogy megtalld.


<4

o o 'C t # n d t i n r f ; V o r * i u r * * b t / i d t S c * - M e f r e Ib i*sI r * u C * t f * < J a r n m u n t y

r * ttfW **9 i * i on r u t r*0* r v

ir^r- n p*Jov% r M * k * r *n> z * u M l MrwMftt *w u c tji sufpoffa:

gptrfcfep m own >19 *o w * i t a * A ftyffiiflt ?*!*:>< *3 tv* w yv

Th $U>4iDtnartw9m w cvnr>w ngdlf rtR i j%

mm mm
L- f .*vl ; liaa;L,teas. iW1*13*11fiiAy uywf W)5.t iu *

Mac OS X (package format)

Mai a i a . a age rara: . ig.gy scz:


K 4 A TAH n # ;*:**.

M ax fli3g iso jaR fci


M/JX

J &S il UC'2U M L J l 6M it*O S .Tf f l K 3 2 j W: 2


Maga
KaL'iOSrvBt i

Vlaszd ki a Mac OS X-vltozatodnak m egfelel csomagot, s kattints a Pick a M irror hivatkozsra.

Egy listt fogsz ltni azokrl a helyekrl, ahonnan letltheted a programot. Vlaszd azt, amelyik a legkzelebb esik hozzd. Ha a fjl letltdtt, az egrrel dupln rkattintva indtsd el. Ha a telepts megtrtnt, nyiss egy ter minlablakot, s rd be ezeket a parancsokat (a s h e ll> - t nem kell bernod, az a kszenlti jel):

shell> cd /usr/local/mysql shell> sudo ./bin/mysqld_safe


(Ha szksges, add meg a jelszavadat.) (Nyomd meg a C o n tro l+ Z billentykombincit.)

shell> bg
(A parancshjbl a Control+D billentykkel vagy az exit paranccsal lphetsz ki.) Ha valamilyen grafikus felleten - ilyen pldul a phpMyAdmin - keresztl szeretnd kezelni a MySQL-t, akkor olvasd el a fellet dokumentcijt arrl, hogy a telepts vgeztvel miknt lte sthetsz kapcsolatot a MySQL-lel.
m o s t i t t vagy
>

743

a webhely ed letre keI

tlls les krnyezetre


Miutn napokat vagy heteket tltttl a webhelyed elksztsvel, lassan gy r zed, hogy tallhatsz az les kiszolglra. A PHP s MySQL technolgit hasznos t w ebhely tkltztetse a gpedrl az Interneten lv kiszolglra nmi terve zst s pr klnleges fortlyt ignyel. Elszr is, meg kell bizonyosodnod arrl, hogy azon a helyen, ahol a webhelyed ezentl lakni fog, az elvrtnak m egfelel PHP-, illetve MySQL-vltozat van tele ptve. Ha nem. akkor esetleg t kell alaktanod a kdot az ottani helyzetnek meg felelen. A knyvben lv kd legnagyobb rsze hordozhat, de esetleg meg kell oldanod, hogy a kd a rgebbi mysql-fggvnycsaldot hasznlja a knyv ben szerepl mysqli-fggvnycsald helyett. Ha ilyen helyzettel kerlsz szembe, akkor nzd meg a Tz Tuti Tma cm fggelk els pontjt. Ha az les helyen lv programvltozatok m egfelelek, akkor mr egyszer a w ebhelyed tkltztetse. m e a kvetend lpsek: 1. A fejleszti kiszolgldrl tltsd fel a PHP-fjlokat az les kiszolgl m egfe lel knyvtrba. A fjlok egymshoz viszonytott elhelyezkedst ne vl toztasd meg, s figyelj oda, hogy ne maradjanak otthon a beem elt llom nyokat (include) tartalmaz mappk sem - mr amennyiben hasznltl ilyen mappkat. Az adatbzisrl kszts lemezkiratst (mindjrt megmutatjuk, hogyan), s gy megkapod a tblk ltrehozsra szolgl MySQL-utastsokat, illetve a ksz tblkat az adataiddal feltlt iNSERT-eket. gy mr tvihet a fejlesztsre szolgl gpen lv adatbzis-tartalom az les kiszolglra. Jelentkezz be az les adatbzisba, s futtasd le az adatbzis ltrehozshoz s a gpeden trolt adatokkal val fel tltshez szksges CREATE s INSERT MySQL-utastsokat. A PHP-fjljaidban lv adatbzis-hivatkozsokat alaktsd t gy, hogy az les adatbzis-kiszolglra mutassanak. Ha ezt nem teszed meg, akkor az les PHP-kd a fejleszti adatbzishoz prbl kapcsoldni, ami persze nem fog neki sikerlni.

A PHP-fjljaidat FTPvel fel kell tltened az les webkiszolgld megfelel knyvtrba.

A tblid szerkezett s a bennk trolt ada tokat ki kell nyerned az adatbzisodbl. A msik nyl msik v gn megtallod az erre szolgid mdszert. A lemezkiratskor ltrejtt llomny ban benne vannak az adatbzis ltreho zsra s feltltsre szolgl pontos utastsok.

2.

3.

4.

/
A mysqli_connect() fggvnyek paramtereit rd t gy, hogy az les webhelyedhez tartoz MySQL-kiszolglhoz prbljanak kapcsoldni, s ne felejtsd el megadni az j felhasznlne vet s jelszt sem.

744 ii fggelk

fejleszti krnyezet kialaktsa

rasd lemezre az adataidat (meg a tblidat is)!


Mostanra FTP-vei feltlttted a PHP-fjljaidat az les kiszolglra, de az adataid mg mindig nincsenek az les kiszolgln fut MySQL adatbzis-kezelben. Egy adatokkal teli tbla m sik MySQL-kiszolglra val kltztetse nem felttlenl hozza lzba az embert. Szerencsre a MySQL-programcsomagnak rsze a MySQLdump alkalmazs, amely egyszer mdjt knlja az adattblk ltrehozsra alkalmas CREATE TABLE utastsok, illetve a tblkat adatokkal feltlt INSERT utastsok kinyersnek. Egyszeren csak le kell futtatnod a MySQLdump al kalmazst. Ha teht az adataidrl olyan msolatot szeretnl, amely tvihet egy msik MySQL-kiszolglra, rd be az albbiakat egy terminlba:

Pile Edit Window Help Dun'pYourDa-a

$ mysqldump
Usage: mysqldump OR mysqldump OR mysqldump For more options, 'OPTIONS] database [tables] OPTIONS] databases [OPTIONS] DB1 [DB2 DB3...] [OPTIONS] all-databases [OPTIONS] use mysqldump help

$mysqldump riskyjobs jobs > riskyjobstable.sql

Ezzel a paranccsal a jobs tblt ltrehoz CREATE TABLE utasts berdik egy frissen lt rejtt s risky jobstable. sql nvre keresztelt szvegfjlba. Ha a parancs vgrl elha gyod a >riskyjobstable.sql rszt, akkor a CREATE TABLE s az INSERT parancsok egy szeren a terminlablakban rdnak ki. Prbld ki, s megrted, hogy mirl beszlnk. Nem tl hasznos, de legalbb megnzheted, amint az adataid szpen formzott INSERT paran csokknt villmtempban elsorjznak a szemed eltt. Ha az elbbiekben ltott sok-sok adatot egy ..nagyobb, mint jellel j fjlba irnytottad, a ltrejtt fjlt vidd t az les kiszolglra, s ott a fjlban lv MySQL-lekrdezsek futtat sval hozd ltre a tbla msolatt.

Elkszletek a lemezre rt adatok felhasznlsra


Tedd meg az elkszleteket a lemezre rt adataid bekltztetsre: Az les MySQI.kiszolgln add ki a szksges CREATE DATABASE parancsot, majd egy USE DATABASE pa rancsot az j adatbzisra vonatkozlag. Ha ezzel megvagy, akkor minden kszen ll arra, hogy a fejleszti kiszolgln trolt adatok az les kiszolglra kerljenek.
m ost itt vagy

745

nha a HTML nmagban nem elg

A lemezre rt adatok thelyezse az les kiszolglra


Ltrehoztl egy riskyjobstable.sql nev llomnyi, am elyben egyarnt megtallhatk a tbla ltrehozsra s adatokkal val feltltsre szolgl MySQL-utastsok. A riskyjobstable.sql nev llomny valsznleg hasonlt az albbiakhoz: MySQL dump 10.11 Host: localhost Server version Database: riskyjobs 5.0.51b

riskyjobstable. sql

Ez itt mind

megjegyzs, ne j tr'dj vele.

/*! 40101 SET @OLD_CHAPACTER_SET_CLIENT=@0CHARACTER_SET_CLIENT */ ; Table structure for table 'jobs'

drop table if exists 'jobs';^ CREATE TABLE 'jobs' ( <*---- ----------S= A mysqdump F9 job id' int(11) NOT NULL auto increment, ram mindig tesz title' varchar(200) default NULL, Itt jn a CREATE eg y DROP utas description' blob, TABLE utasts city' varchar(30) default NULL, tst a CREATE state' char(2) default NULL, s az INSERT el, zip char (5) default NULL, hogy ez utbbiak co__id' int(ll) default NULL, PRIMARY KEY ( job_id' ' ) tiszta lappal indul ) ENGINE=My ISAM AUTO INCREMENT=14 DEFAULT CHARSET=utf 8 ;

ink nevi tbld ott, anoi Ha tudod, hogy nincs i 1 p a ra n c cs a l x ' utrA akkor ne torodj ezze y ezt hoznd \eiref

hassanak.

Dumping data for table 'jobs

A LOCK paranccsal sem kell t rdnd, elg, ha az INSERT uta ststl msolod a dolgokat.

LOCK TABLES 'riskyjobs' WRITE; ~ /* !40000 ALTER TABLE 'riskyjobs' DISABLE KEYS */; INSERT INTO 'riskyjobs' VALUES (8,1Custard W a l k e r We need A mysqldump people willing to test the theory that you can walk on custard.\r\n\r\nWe\re going to fill a swimming pool with program ^ custard, and you\ll walk on it. \r\n\r\nCustard and other egyetlen kinds of starchy fluids are known as non-Newtonian fluids. INSERT utas They become solid under high pressure (your feet while you tst alakt ki, walk) while remaining in their liquid form otherwise.\r\n\r\ nTowel provided, own bathing suit, a must.\r\n\r\nNote: if ez helyezi el you stand on for too long on the custardV s surface, you will az sszes sort slowly sink. We are not liable for any custard sinkages;

a tblban.

746

fggelk

fejleszti krnyezet kialaktsa

Az .sql kiterjeszts llomnynak jelld ki a teljes tartalmt, majd msolssal s beillesztssel tedd t az egszet a MySQL-terminlba vagy a grafikus MySQL-programod (mondjuk a phpMyAdmin) le krdezsek rsra szolgl ablakba.
gy lefuttathatod a lekrdezst. Az elz oldalon lv plda esetben az llomny egy CREATE table s egy INSERT utastsbl ll. A lekrdezs futsa sorn az llomny megkri a MySQL-kiszolglt, hogy t rlje a meglev tblkat, illetve hogy zrolja, vagyis ms felhasznlk szmra elrhetetlenn tegye a fris sen ltrehozottat, amg az INSERT utasts elhelyezi benne az thozott adatokat.

Kapcsolds az les kiszolglhoz


A PHP-fjljaidat tvitted az les kiszolgldra. Az adattblid szerkezete CREATE TABLE utastsokknt, a tblid tartalma pe dig egy megtermett INSERT utastsknt rdott lemezre, az les webkiszolgln pedig lefuttattad a lemezre rt lekrde zseket. szval az adataid is tkerltek. Egy pici lps van mg htra. A webkiszolglra FTP-vel tho zott PHP-kd egyelre nem kapcsoldik az les MySQLkiszolglhoz. A mys q l i_connect () fggvnyben meg kell vltoztatnod a kapcsolati karakterlncot, hogy a fggvny most mr az j ki szolglhoz igyekezzen kapcsoldni. Mdostanod kell a PHPkd minden olyan rszt, ahol meghvod a mysql i_connect ( ) fggvnyt. $dbc = mysql i__connect(l o c a l h o s t ', 1m y u s e r n a m e 1, ' y p a s s w o r d ', m or die('Error connecting to MySQL s e r v e r . '); myd^tabase T)

Ide az les kiszolg ln ltrehozott adat bzis nevt rd be.

Ide az les kiszolgl neve vagy IP-cme kerl. Csak akkor marad localhost", ha a P H P -o ld a la id s a MySQL-kiszolgd
egyazon gpen vannak.

Ennyi! A PHP-fjlaiclat felmsoltad az les kiszolglra. Az adattblidat kirattad egy . s q l llomnyba.

Ide az les MySQL-kiszolgln rvnyes felhasznlnv s je l sz kerl.

Az llomnyban lv lekrdezseket lefuttattad az les MySQL-kiszolgln. Vgl gy rtad t a PHP-kd m egfelel rszeit, hogy az les MySQL-kiszolgln lv adatbzissal lpjenek kapcsolatba.

A weboldalad lesben mkdik!


m ost it t vagy 747

iii. fggelk: a php bvtse

Ha m indez nem elg


T u d o m , h o g y megvan mindenem, am it csak egy z v d g le s z to e ri szp, rdgien okos vgzet asszonya kvnhat, de ez nekem nem elg.

Igen, nagyszer webalkalmazsokat tudsz rni a PHP s a MySQL segtsgvel, de azrt rzed, hogy nem ennyibl ll a vilg - s igazad is van. Ez a nylfarknyi fggelk a mysqli bvtmny s a GD grafikusknyvtr-bvtmny teleptst mutatja be. Lteznek tovbbi PHPbvtmnyek is - vannak ugyanis olyan helyzetek, amikor hasznos, ha elgedetlenkedsz.

ez egy fggelk

749

j php-modulok teleptse

A PHP bvtse
Ez a fggelk a mysqli s a GD modul Windowson trtn teleptst trgyalja. A most k vetkez rszben megmutatjuk, hogy miknt tudhatod meg, hogy7 mely modulok vannak te leptve a gpedre, s hogy miknt szerezheted be a mysqli, illetve a GD modulokat, ha nem szerepelnek a teleptettek kztt. Megmutatjuk azt is, hogy ezek hogyan telepthetk Windowson. Sajnos Macintosh s Linux rendszereken a teleptsk nem tl egyszer, de er rl a fggelk vgn mg beszlnk.

MEGJEGYZS: A fggelkben lertak a W indow s 2000, XP, Vista, W indow s Server 2003 s 2008, s egyb 32 bites W indow s opercis rendszerekre vonatkoznak.

Ha Windowst hasznlsz, mzlid van


Az is lehet, hogy mr most teleptve van a mysqli s a GD modul a gpedre. Ha mgsem, akkor is viszonylag knny a dolgod. Bemutatjuk, hogy miknt ellenrizhet, hogy mi az. ami mr megvan, s ha brmi hinyozna, akkor az hogyan szerezhet be, s azt is, hogy mi a modulok aktivlsnak mdja. Azzal kezdjk, hogy megnzzk, hogy mi az, ami mr megvan:

Elszr is, tudd meg, hogy a rendszereden van-e mr telept ve a GD vagy a mysqli modul. Ezt gy tudod megtenni, hogy belpsz abba a knyvtrba, aho v a PHP-bvtmnyek telepl tek. A bvtmnyek a legtbb esetben a C: \PHP\ext mappba kerlnek, br a gpeden az elr si t akr el is trhet ettl. Nyisd meg az ext knyvtrat, s keresd meg a php_ga2 .dll, illetve a php_mysali .dll tjit. A PHP 5. illetve a ksbbi vltozatok tele ptsekor ezek ltalban felkerl nek a merevlemezre, s egyszer en csak aktivlni kell ket. Ha a fjlokat megtalltad, a 3. l pstl folytathatod. Ha nem, ak kor folytasd a 2. lpssel.

Elvileg meg ke'ne ta llnod a pHp gd2.dll, e's a |>hp_my$qli.dll


fjlt

750

iii. fggelk

a php bvtse

Ha akr a php_gd2 . d l l , akr a php_m ysqli . d l l fjl hinyzik, akkor elszr be kell szerezned ket. J eslyed van r. hogy mindkt DLL fjl ott van mr a gpeden, de ha mgsem, akkor a php_gd2 . d l l a h t t p : //www. lib g d .o rg / D o w n lo a d s webhelyen megtallhat. Tltsd le, s msold a PHP-teleptsed e x t mappjba. A knyv pldi azt felttelezik, hogy ezt a mappt a C: \PHP\ext knyvtrban tallod. A mysqli bvtmny a MySQL.com webhelyrl tlthet le. A bngszddel elszr nyisd meg a h t t p : //www.mysql .com weboldalt. A fels rszen kattints a Downloads , azon bell a Connectors (a bal oldali m enben van), itt a MySQL native driver fr PHP, vgl jobboldalt a mysqli extension, fr MySQL Server x hivatkozsra. Bizonyosodj meg rla, hogy a PHP-vltozatodnak megfelel letltst vlasztod. i p a ft*

-*> . w

:yc.Ins nr/PftP UgzttU FWox

is h ' -

- c

How* Products Service fertrt Hs*/ to Bwf


Download UyV Co.rotmWf' r5Uf ru*w

omk

Me*n

T i bow

Download Connector/PHP
PHP - Window downloads for connecting to MYSQL from PHP
m y * * r i t w * o o (Pttf>

Azt a mysqli-vltozatot tltsd le, amelyik a gpeden lw PHP-vltozatnak megfelel,

V UiSgL^iiaLlC^7 _ _L .[Connectors A
mytQI * S t t n * O f ) |PHP S J i

i . :3

. - , W *

>vc sujrj*si tia! WJ ,:..kfir K

:.nr. ,V^

.trf. n

If I M.s Q H uestions 2 .fHP anc M it >1 O rtosa f.-.o iicjs ool W9**i -C-I. <1# ow
P ; S 3 G e U l l S * . t b a O U l j 0 f J t u U l l o (V S C O S 8 r t t P .

C h fifllo g

T:\Program RtesJPHP

F est w fe fe Ha mr itt jrsz, akkor mind a php_gd2 . d l l , mind a php_m ysqli . d l l fjl megta llhat a gped \PHP\ext map pjban. Most mr csak r kell venned a php. i n i fjlt, hogy vegye hasznlatba ezt a kt DLL fjlt. Ezt gy teheted meg. hogy belpsz a php. i n i fjlt tartalma z mappba, s megnyitod egy' szvegszerkesztvel. (Jw

Famentes

Toote

Heto

J $

AoT-ast _-------- ro g cm j C '.'p - hrie and Fokier Tasks tns

Name * _ jd c v _ j * t fl n strf.tx t ^ K K T ^ .d l :0 fcense.txt z T rcws.Ot i^pnpbemDftd.ft) ^JphpSesflp.dl !^pho5t<.dJ gjpphpjex io h p .g tf . 1

5ze

Type fo tfrr Folder

Date MntSM 9/2/2U08 JI 9/7/20X VJ S/2/2006 6:< 5/2/2000 5:i 5/2/20086: S/2/2006 6: 4/30/2039 4 5/2/2008 6rf 5/2/2008 :C 5/2/2008 6:C 5/2/2008 6:> 9/2,2003 10

^ M s^ oveth e
Copy this fie
t i Pifcfah tht f t s t o h e

91 ;* 2 ,028 KB 4KB 6 5 4 KB

Text Dowoeni App&cfiOon Extension lextOocjTvent

183 C TexrDocinHnt B AppkatKr'. Extrt'ision ,7l KB S3 KB 3>3 43 KB fippkilon Extenser Apgiiracr> GIF Emeoe Cnn^guioon Setngs

Web

J ) e m l t s fite
^ ? n n t t h * fi

Dc^ietns^ie
O th e r P ia c c

Elfordulhat, hogy a PHP a gpeden a Prog ram FilesXPHP mappba van teleptve. Ke resd m e g a php.ini f jlt, s nyisd meg, mert a kvetkez lpsben kelleni fog.

j' . Jg .. ---------------- -------itt**' ... ' -*e e ^ e -w I v : Corf^idWn Dete Modified* 9 / 2/2003 # :5 5 AM Sfrg; 4 / 7 KB

_ j Mv Decurnt _ j Shed>jCJTj*.ts

T>cc: Configuration settngs Date M ed: 9/2/2008 10.55 A ocW H See- 47.7 W

m o s t itt vagy 751

j php-modulok teleptse (folytats)

Nzd vgig a php. i n i fjlt, s keresd meg a kvetkez sorokat: e x te n s io n = p h p _ g d 2 . d l l

# php.ir! - Notepad Fife Edit Format View He!p

______________

; ; ; ; ;

Windows Extensions Note th a t ODBC support is b u i l t in , so no d l l is needed to r Note th a t many DLL f i l e s are lo c a te d in th e e x te n s io n s / (Ph e xte n sio n fo ld e r s as w e ll as th e separate pecl dll downioac Be sure to a p p ro p ria te ly se t the e x te n s iG n .d ir d ir e c tiv e .

extension=php mysqli.dll Ha valamelyik eltt pontosvesszt (;) vagy kettskeresztet (#) ltsz, az azt jelenti, hogy az a sor megjegyzss van alaktva. Trld a jelet vagy jeleket, s mentsd a fjlt.

; ext ens i on=php. ,bz2. d l l _


! ; e x t e n s i on -= p h p _cu rl. d l l j ;e x te n sio n = p h p _ d b a .d ll ; e x te n s io n = p h p _ d b a s e .d l1 ; e x te n sio n = p h p _ e x if. d ll ; e x t e r .s i o n = p h p _ f d f . d l l ^ >extension=php_gd2. d l l '" 'l; e x te n s io n = p n p _ g c tte x t.d ll ; e x t e n s i o n - p h p _ g n p .d l l ;e x te n s io n -p T p _ ifx .d ll ; e x te n sio r= p h p _ im a p .d ll ; e x te n s 1 o n -p h p _ in te r b a * e .d ll e x te n s io n = p n p _ ld a p .d ll ; ex te n sio n = p n p _ m b strin g . d l 1 ; e x t e n s i o n = p h p _ m c r y p t .d l l i ; e x te n sio n ~ p h p _ rc h a sn . d l l ! ; e x t e n s i o n = p h p _ m im e _ n a q i c .d l 1 \ ; e x te n s io n = p h p _ m in q . d l l : e x te n s io n p h p _ m s q T .d ll ; e x t e n s io n = p h p _ m s s q l . d l 1 e x te n sio n -p h p ^ m y sq l. d l 1 ^xtension^php_tnysql i . d l 1 ^ \ e x te n s ic n -p n p _ o c i8 .d ll ; e x t e n s i o n -p ip_opens s 1 . d 11 ; e x t e n s i o n = p h p _ p d o .d l l ; e x te n s io n p h p _ p d o _ fir e b ir d .d ll I ; e x t e n s i o n = p h p _ p d o _ m s s q l .d l l ; e x t e n s io n - p h p _ p d o _ m y s q l. d l 1 ; e x te n sio r = p h p _ p d o _ o c 1 . d l 1 ;e x te n s io n -p h p _ p d o _ o c i8 .d ll

Ha ennek a kt sornak az ele jn pontosvesszt ltsz, akkor trld, aztn mentsd a fjlt.

Az utols lps, hogy jraindtod az Apache webkiszolgldat, hogy a php. i n i fjl vltoz sa rvnyre jusson. Ezt gy teheted meg, hogy a Windows Vezrlpultjn (Control Panel) az egrrel dupln kattintasz a Felgyeleti eszk zk (Administrative Tools) ikonra, majd a Szol gltatsok (Services) hivatkozsra kattintasz:
jj........ ........... . r>e Adiuo vienr ' I* * ** ::B: 1 E ) ^ SCTUCE toCM'. , ft;' * ------. "

1 ; e xt ensi orphp_pdo_odbc. d l 1 ! ; e xtension=php_pdo_pgsgl.dll ; extension-php_p do_sqli t e . d l l ; extension=php_pgsql. d l l ; extensior.*php_pspel 1 . d l l | ; e xt ens 1on=php_shrrop . d l l . : extension*php_snm p.dll ; e xt ensi on=-php_soap. d l 1 ; e xte n sio n = p h p _ so cke ts.d il ; e x te n s io n = p h p _ s q lite . d l 1 ;e xte n sio n = p h p _ syb a se _ ct.d ll ; e x te n s io n p h p _ tid y .d ll ; e x te n s io n = p h p _ x rlrp c .d ll : e xte nsio n ph p_ xsl. d l 1 ; e xte n sio r= p h p _ zip . d l l

v_J$*13

Jelld ki az Apache elemet, majd kattints a Restart hivatkozsra.

% -V R *T untim Q e pbn. %obciHS*rYte


0ev7iatcn:
A o x h e .'l 7.S fV in37)

H eD oW evice !^pijp*CdtonLA>e 5.. %ASP.NFT5t8Serv..


-tnba: *% V 7A Me'vge... SA G ierl ^jAv-GTR-artrr.}^.. ^ t*W7update Sc?vtat "^Bsiiouid 3rV&Q

Kattints az Apache szolgltats nevre, majd a hal oldali men Restart (jrain dts) hivatkozsra. Mostantl a GD s a mysqli modulok fggvnyei elvi leg baj nlkl mkdni fognak.

752 // fggelk /.

a php bvtse

Ha Maced van...
Ha Macintosh-od van, akkor sajnos egy kicsit nehezebb a dolgod. Ha Macen akarsz jabb modulokat mkdsre brni, az egyet jelent a PHP forrskdjnak a megfelel, a kvnt modulok ellltst eredmnyez kapcsolkkal val jrafordtsval. Egy szeren tl sok kom binci ltezik a Macintosh opercis rendszerek, illetve a PHPvltozatok tekintetben, hogy minden elfrjen ebben a rvidke fggelkben. Van azonban egy remek lers, amely a GD modul teleptsben segtsgedre lehet: h t t p ://macoshelp.blogspot.com/2008/02/adding-gd-library-for-mac-os-x-leopard.html A lersban foglaltak csak akkor fognak nlad is mkdni, ha a megfelel OS X-kiadssal (Leoprd) s az 5-s PHP-vel rendelkezel. Ha nem ez a helyzet, akkor esetleg rdemes lehet vgigbogarsznod a GD w eboldaln ( h t t p : //www. lib g d .o r g / ) tallhat hozzszlsokat, a gpedre te leptett OS X- s PHP-vltozatra vonatkoz teleptsi tmutatt keresve.

Ne feledd, hogy a 6D s a mysqli bvtHa a mysqli modullal szeretned hasznaim a Macmtosh-odon lev PHP-t, ami megint csak a PHP rfordtst jelenti, az itt tallhat lerst ajnljuk a figyelmedbe: http://dev.mysql.com/downloads/connector/php-mysqlnd/

i_j

..

, n ,

'i

a*

i ' '** dut>

mnyek teleptsvel kapcsolatos tortrt ' kiallnod, ha a Macedet hasznlod a fejleszti webkiszolgl futtafsra. Ha a Macintosh-t csak a PHP-kd megrsra hasznlod, amit majd egy msik kiszolglra feltltve fogsz tesztelni, ak kor az itt lertak rd nem vonatkoznak.
csa^ a^ r ^

m ost i t t vagy 753

Trgymutat

a trgymutat

Jelek, jellsek
! 174, 221 S 572 $_COOKIE 376, 414 $_FILES 239, 267, 293 $_GET 276, 277, 552 $_POST 32, 33, 34, 57, 91 $_POST['submit'] 202 $_SERVER 300, 315, 342, 374 $_SERVER['PHP_AUTH_PW'] 301 $_SERVER[' PHP_SELF'] 200 S_SESSION 391, 414 $dbc 80 Sresult 86 Starget 248 % jel 505, 560 && 179, 221 * 70 ?> 24, 25 @ 270 \d 570 \s 572 \w 572 I I 179 <? 27 <?php 24, 25 <?php ?> 57 <channel> 667 <cronkite> 667 <description> 667 <entry> 690 <form action> 10 <form> 6, 14 <img> 240, 252, 612, 618, 647 <input> 6, 236 <item> 667 <language> 667 <link> 667 <pubDate> 664, 667 <rss> 667 <textarea> 204 <title> 667 -> mvelet 698, 700

A,

action 200, 278 adatbzis 61, 68 adatbzis helye 80 adatbzis ltrehozsa 111 adatbzis neve 80 adatbzisfjlok 109 adatbzis-hivatkozs 714

756

Trg ymutat

a trgymutat

adatbzis-kiszolgl 61 adatbzis-tblk l adatbeszrs 72 adatellenrzs 165, 171, 726 adatforrs 75 adatmintk 565 adatmodell 430 adatok tvizsglsa 96 adatok bejrsa 140 adatok beszrsa 66, 77 adatok egysgestse 591 adatok formtuma 564 adattpus 27, 113, 114 adatvezrelt rlapok 450 ADD COLUMN 232, 293 AFTER 232 AFTER oszlop 235 aktulis dtum s idpont beszrsa 238 alhzsjel 26, 505 alaprtelmezett adatbzis 120 alaprtelmezett rtk 338 alaprtelmezett oszloprtk 338 alappont 620 alfanumerikus karakter 572, 596 alias 477, 499 alkalmazs 105 alkalmazsvltozk 255 lkd 641 lland 248 llandk ltrehozsa 253

allekrdezs 472 llomsnv 63, 76 lnv 477, 499 ALTR 125, 232, 235 ALTR DATABASE 232 ALTR TABLE 209, 221, 293, 322 AND 179, 221 Apache 733, 735 aposztrf 92 aposztrfos karakterlnc 47 application 105 array_pushO 449 AS 499 AS kulcssz 477 ASC 259, 260 ASCII 613 tirnyt fejlc 309 atom 463 atomi adat 462 atomic 462 ttetsz kp 629 attribute 661 attributesO 698 AUTO_INCREMENT 209 automatikus kilptets 406 automatikus nvels 209 automatizls 105, 6 l 1 automatizlt adatbevitel 608

most itt vagy *

757

a trgymutat

B
bal kls sszekapcsols 480 bar graph 631 Basic realm 306, 311 Bee: 50 begyazs 176 begyazott if utastsok 180 beemelt fjl 254, 255, 422 beemelt kd 647 beptett fggvny 501, 536 bejelentkezs 348 bejelentkezsi fellet 353, 357 bels sszekapcsols 473, 475, 480 beszrand rtkek listja 66 betlls 27 betmret 619 bettpus 620 binris adatok 114, 240, 252 biztonsg 299, 312, 723 biztonsgi intzkedsek 724 biztonsgi zna 315 biztonsgos kivonatol algoritmus 355 biztonsgosabb INSERT 337 blind copy 50 BLOB 114 break 542 CASE 542 cast 492 Catch 720 Ce: 50 ceilO 553 clhely 245

C, Cs
CAPTCHA 611, 612, 654 CAPTCHA-jelsz 613 CAPTCHA-kp 614

CHANGE COLUMN 232 CHAR 114, 115 CHARACTER 114 checkdnsrrQ 598, 599, 604 checked jellemz 450 childrenO 699 chrO 613 ciklus 138 ciklusmvelet 139 ciklusszmll 488 cmke 661 column 61 consumer 680 content provider 680 Content-Type 309 cookie 374 Coppermine Gallery 730

Trgymutat

trgymutat

copy 50 countO 488 CREATE DATABASE 110, 111 CREATE TABLE 65, 110, 117 cross-site scripting 725 csatlakozs 80 csatorna 667 csatorna nyelve 664, 667 csatornahivatkozs 664 csillag 70 cs karakter 579 csoportosts 430 CSS 262

DESCRIBE 122, 123 diagram 499, 632 die() 83 digital vide recorder 660 digitlis vidergzt 660 dinamikus HTML-oldalak 3 dinamikus kpek 614 dinamikus men 382 dinamikus webhely 105 dinamikusan ellltott kpek 612 display_errors 724 DNS 598 dollrjel 26 Domain Name System 598 DROP COLUMN 232 DROP TABLE 124, 209 Drupal 730 DVR 660

D
data-driven 450 DATE 114 DATETIME 114 dtum s id 664 DEC 114, 115 DECIMAL 114 decimlis szm 113 DEFAULT 338, 342 defineO 253 DELETE 147, 148, 206 DELETE FROM 283, 293 DESC 259, 260

echo 24, 41, 42, 57, 204 egsz szm 113 egy-a-sokhoz 438, 439 egy-az-egyhez 438, 439 egyed 693 egyedileg azonosthat 208 egyedisg 149, 210

most itt vagy

759

a trgymutat

egyni fggvnyek 501, 535, 538, 560 egyni php-fggvnyek 536 egyenlsg 504 egyenlsgi sszehasonlts 167 egyenlsgi sszekapcsols 480 egyenlsgjel 31, 148 egyenltlensgi sszekapcsols 480 egyirny kommunikci 671 egyirny titkosts 355 egysgests 591 egysoros megjegyzs 335 elem 661, 669 elemhierarchia 669 elrsi t 248 les kiszolgl 747 les krnyezet 744 lettartam 406 eljrskzpont programozs 721 elkld gomb 105 ellenrzs 164 ellipszis 618 elfeldolgozs 518, 519, 523 elz hivatkozs 555 elrendezs 45 else 184, 221 elsdleges kulcs 208, 209, 210, 285, 436, 465, 650 elvlaszt karakter 510 Elvis-bolt 104 e-mail 44, 48

e-mail cm 596 e-mail kldse 50 emberi felgyelet 320, 343 emptyO 172, 173, 221 entity 693 ENUM 325 equijoin 480 eredmny 86 eredmny oldalakra bontsa 550 eredmnyhalmaz szktse 96 ereg 729 erforrs 135 erforrs-azonost 136 error_log 724 rtkads 170 rtkek 66 rtkek sszehasonltsa 168 rvnyes 164 rvnyes vltoznevek 26 rvnyessg 564 rvnyessg-ellenrzs 565 s jel 276 escape 580 escape character 46 exitO 307, 315, 342 explodeO 510, 518, 560 expose_php 724 ext knyvtr 750

760

Trgymutat

trgymutat

F
fjltviteli protokoll 19 fjlellenrzs 268 fjlfeltltsi tvonal 253, 652 fjlfeltlt mez 231 fjlfeltlt rlapmez 236 fjl mret 267 fjlok feltltse 19 fjltpus 267 false 139, 167 fejlc 45, 301, 302, 304, 315, 358, 647 fejlctkzs 647 fejleszti krnyezet 732 felad 50 felesleges sorok trlse 207 felhasznli adatok trolsa 388 felhasznli bejelentkezs 349 felhasznli jogosultsgok 716 felhasznli kzssg 347 felhasznli profil 347 felhasznlk belptetse 361 felhasznlk hitelestse 358 felhasznlk kilptetse 372, 384 felhasznlnv 80, 300, 348 feliratkozsi rlap 364 felkiltjel 176 felttel 139

feltteles kifejezs 166 feltlttt fjlok 244 feltlttt kpfjlok 248 felgyeleti oldal 272 fenntartott karakter 130, 580 fenntartott szavak 123 fnykpes megersts 225 file: 18 FIRST 235 fogyaszt 680 for 499 for ciklus 488 fordtott perjel 46, 580 foreach 215, 216, 221 foreign key 436 formzs 262 forrshely 245 frisstsi fejlc 309 FROM 70 From: 50 FTP 248 FlP-program 19 full outer join 480 function 536 fggleges szveg 619 fggvny 21 fggvnyek 501, 536 fggvnyparamter 50

most itt vagy

761

a trgymutat

hatrol elem 560 hatrol karakter 510 hatkonysg 455 hatkr 558 GD 612, 614, 616, 618, 750 GD knyvtr 654 gd nvtr 694 GET 278 GET-krelem 276, 277 Go gomb 65 grafikai fggvny 6 l6 , 618 grafikon 632 GRANT 716 Guitar Wars 224 GWJJPLOADPATH 248 gyermek 695 gyermekobjektum 698, 700 gyermektbla 438 gykrelem 668 gyjtemny 32, 697 httr-parancsfjl 321 httrszn 6 l6 headerO 305, 309, 315, 342, 358, 618 helyes rlapadatok 164 helyettest karakter 505 helyi telepts 732 hexadecimlis 354 hiba kijavtsa 123 hibajelzs 718 hibakeress 724 hibazenet 718 hrelem 667 hrfolyam 660 hrolvas 660, 666 hitelests 300, 302, 306 hitelests fejlcekkel 306 hitelest parancsfjl 314 hivatkozs 87, 240 hivatkozsi psg 437 hivatkozsok ltrehozsa 554 hozzrendels 31 hamis 139, 167 hangos CAPTCHA-teszt 612 hromrtk mvelet 455, 499 hash 355 HTML-formzs 45 HTML-l alakts 22 http: 18 httpd.conf 742

762

Trgymutat

n trgymutat

HTTP-fejlc 301 HTTP-hitelests 299, 300, 301, 315, 343, 357, 358 HTTP-hitelests tartomnya 311

imagegifO 629 imagejpegO 629 imagelineO 617, 654 imagepngO 618, 651, 654 imagerectangleO 617, 654 images 247, 248 imagesetpixelO 617 imagestringO 619, 654 imagestringupO 619, 654

idegen kulcs 436, 437, 499 idegen parancsfjlok 725, 726 ideglenes mappa 244 ideiglenes maradandsg 375 idzjel 31, 92 if 221 if kd megtiszttsa 188 if-else utasts 455 igaz 139, 167 igaz/hamis 27 IIS 735 imagecolorallocateO 6 l6 imagecolortransparentO 629 imagecreatetruecolorO 6 l6 , 654 imagedestroyO 619, 654 imageellipseQ 618 imagefilledellipseO imagegettftextO 654

imagettftextO 620 implodeO 513, 560 include 255, 293 include file 254 include_once 255, 293 index.php 75 indtfjl 246 inner join 473, 476, 499 INSERT 66, 67, 72 INSERT INTO 66 INSERT lekrdezs 85 INT 114, 115 INTEGER 114 interaktv kapcsolat 2 IP-cm 63, 76 is_numericO 339, 342 ismtld kd 253 issetO 172, 173, 221

618

imagefilledrectangleO 6 l6 , 617

most itt vagy

763

a trgymutat

j
jellemz 661 jellemzrtk 661 jellnyelv 661 jelszavak trolsa 360 jelszavak titkostsa 354 jelszavak tovbbtsa 360 jelsz 80, 300, 348, 352 jelsz titkostsa 355 jelz 194 jobb kls sszekapcsols 480 jin 473 Joomla! 730 jvhagys 321 JPEG 270 junction table 440

kapcsol tbla 440 kapcsolds az adatbzishoz 76 kapcsos zrjel 139, 166, 570, 577 karakterek eltvoltsa 592 karakterkdols 613 karakterlnc 31 karakterlnc-kezel fggvnyek 565 karakterlncok egyestse 513 karakterlncok sszefzse 42 karakterosztly 578, 579, 604 karaokeprogram 722 kpazonost 6 l6 kpek fjlneveinek trolsa 238 kpek feltltse 236 kpernyfelvtel 225 kpfjlok feltltse 231 kpltrehoz fggvny 629 krdv 444 krdjel 577 krelem 27, 302 krelmek 86, 681 keress 503 keress s csere 560, 565 keressi eredmnyek rendezse 532 kalap metakarakter 572 kalapjel 570, 578 kapcsolat bezrsa 87 kapcsolati adat 76 kapcsolati vltoz 79, 714 kereskarakterek cserje 520 kereskifejezs elfeldolgozsa 519 kt egyenlsgjel 167 ktdimenzis tmb 632, 633 ketts idzjel 47

764

Trgym utat

a trgymutat

ketts ktjel 334 kettspont 693 kezdeti trolhely 245, 246 kijelentkezs 372, 384 kimenet formzsa 45 knai szveg 728 kis- s nagybetk 26 kis- s nagybetk klnbzsge 505 kisebb vagy egyenl 168 kisebb, mint 168 kiszolgl 9, 10 kiszolgloldali 57 kiszolgloldali ellenrzs 165 kiszolgloldali programozsi nyelv 13 kiterjeszts 25 kitlttt ellipszis 618 kivtelkezels 719, 720 kivonat 355 kocsivissza 572 kdols hatkonysga 455 konkatenci 40 konstans 248 kr 618 kvetkez hivatkozs 555 kzs oszlop 476 kzzttel dtuma 667 kukac 270 kulcs 436 kulcsszavas keress 682

kls fjladatok trolsa 240 kls fjlok 240 kls sszekapcsols 480

L
left outer jin 480 lernyelv 661 lejrati id 375 lekrdezs 77, 85 lekrdezs eredmnynek kiolvassa 136 lekrdezs felptse egyni fggvnnyel 537 lekrdezsek egyszerstse 476 lekrdezsek felptse 84 lekrdezsen belli lekrdezs 472 lekrdez karakterlnc 77, 85 lemezre rt adatok thelyezse 746 levds 580 levl elkldse 50 LIKE 505, 512, 560 LIMIT 284, 285, 293, 548, 549, 550, 560 localhost 76, 80 Location 309 log_errors 724 logikai S 179 logikai mvelet 179 logikai VAGY 179

most itt vagy >

765

a trgymutat

M
Mac OS X 742 mailO 50, 51, 57, 134 mailto 6, 8, 9 many-to-many 438 maradand trols 374 markup language 661 msolat 50 M D 50 355 mdia nvtr 694 megerst weboldal 13 meghatrozott adatok trlse 148 meghvs mdja 282 megjegyzsek 334 megoszts 254 megosztott adatok ignylse 255 megosztott parancsfjlok 255 memria 345 men 382 mennyisgjelz 577, 579 mretkorlt 266 metakarakter 572, 604 method 278, 696 MIME-tpus 239, 267 mintailleszts 569, 570 mintk 565 MM UPLOADPATH 647

moderls 343 modertor 320 MODIFY COLUMN 232 move_uploaded_file() 245 mkdsi egysg 423 munkamenet 389 munkamenet bezrsa 390 munkamenet-adatok 389 munkamenet-adatok nyomon kvetse 391 munkamenet-azonost 390 munkamenetek lettartama 406 munkameneti vltozk 389 mvelet 139, 166 mveleti sorrend 727 MySQL 57 MySQL adatbzis-kiszolgl 63 MySQL Administrator 716 MySQL Community Server 738 MySQL teleptse 738 mysql_error() 718 MySQL-adatbzis 60, 62 MySQL-adatbzis lekrdezse 86 MySQL-adattpusok 114 MySQLdump 745 MySQL-eredmnyhalmaz 638 MySQL-fggvnyek 714 mysqli_closeO 77, 78, 87 mysqli_connect() 77, 78, 80 mysqli_error() 718

766

Trgymutat

a trgymutat

mysqli_fetch_arrayO 135, 136 mysqli_queryO 77, 78, 85, 135 mysqli_real_escape_string() 336, 342 mysqli_select_db() 82 MySQL-kapcsolat ltestse 76 MySQL-kapcsolati fggvny 78 MySQL-lekrdezs 77 MySQL-terminl 62, 64, 68, 111

NT 221 NT NULL 209 NOWO 238, 252 NULL 27, 210 nyilak irnya 438 nylhegy 438

objektum 27, 700, 720, 721 objektumgyjtemny 697 nagyobb vagy egyenl 168 nagyobb, mint 168 namespace 693 naplfjl 724 natural join 480 navigcis hivatkozsok 550, 554 negci 221 negatv szmok 114 nem egyenl 168 nemkvnatos karakterek 592 nv-rtk pr 276 nvtr 693, 699, 711 newsfeed 660 newsreader 660 non-equijoin 480 normalizls 462, 463, 464, 499 normalization 462 objektumkzpont PHP 721, 722 objektumok 696 objektumorientlt programozs 721 objektumtulajdonsg 696, 700 OCR 610 oldalakra bonts 551, 553 oldalakra bontshoz szksges vltozk 552 oldalhivatkozsok 550 oldalnavigcis hivatkozsok 554 ON 476 one-to-many 438 one-to-one 438 openjbasedir 724 opertor 179 opposability 630 optikai karakterfelismers 610

most itt vagy

767

a trgymutat

OR 179, 221 ORDER BY 258, 259, 260, 293, 532, 534, 545 oszlop 61, 109 oszlop/rtklekrdezs 343 oszlopdiagram 631, 632, 633, 635, 639, 647 oszlopdiagramok rajzolsa 644 oszlopnevek 112 oszlopok sorrendje 235 outer jin 480 Owen mysql-adatbzisa 98 nhivatkoz rlap 199 sszefzs 40, 92 sszehasonlts 167 sszehasonlt mvelet 475 sszekapcsols 473

PHP nyelv alkalmazsok 730 PHP teleptse 736 php.ini 246, 397, 723, 724 php_gd2.dll 751 php_mysqli.dll 751 phpBB 730 PHP-fggvnyek 78 phpinfoO 723 PHP-karakterlnc 77 phpMyAdmin 62, 65, 68 PHP-objektum 688 PHP-parancsfjl 12, 57 PHP-parancsfjlok feltltse 19 PHP-szably 25 PHP-tmb 638 pont jells 474 pont karakter 40 pont metakarakter 572 pontosvessz 25, 64, 111 POST 278 POST-krelem 277 preg_matchO 584, 604, 729 preg_replace() 588, 592, 604 PRIMARY KEY 209, 210, 436 procedurlis 721 profil 347 provider 680 pszeudokd 641 push 659

P
parancsablak 62 parancsfjlok adatainak megosztsa 254 parancssoros fellet 68 pldnyvltoz 721 PHP 2, 3, 11, 15, 57, 73 PHP 4 714 PHP 5 728, 729 PHP 6 728, 729 PHP bvtse 750

768

Trgymutat

a trgymutat

Q
quantifier 577 query 85 Query Browser 738 Query OK 65

rszkara kterlncok 510 RFC-822 664 right outer join 480 root 668 rossz adatok 460 row 61 rvid egsz 114 rvid nyitcmke 27 rvidre zrt kirtkels 181 RSS 660, 661, 671, 711 RSS feed 660 RSS ltrehozsa 672 RSS-cmkk 667 RSS-dokumentum 666 RSS-hrfolyam 660 RSS-hrolvas 660, 666 RSS-ikon 676

R
ragads rlap 199 randO 613 RAND_MAX 613 Refresh 309 regex 570 regular expression 561, 570 reklmrobot 606 rendezs 535, 540, 545 rendezett SELECT utasts 259, 260 request 681 require 255, 293 require_once 255, 256, 293 response 681 REST 682, 711 RESTful 682 REST-krelem 682, 686 rszhalmaz 548

sablon 66, 422, 423 safe_mode 724 schema 431 Secure Hash Algorithm 355 SELECT 70, 96 sma 431, 499 session 389 session.use_cookies 397

most rtt vagy

769

trgymutat

session.use_trans_id 403 session_destroyO 390, 414 session_name() 391 session_startO 390, 414 setcookieO 376, 385, 414 SHA 414 shaO 354, 355 sharing 254 SD 403 sima szveg 46 sima szveges e-mail 45 SimpleXML 688 simplexmI_load_fileO 688, 711 SimpleXMLElement 696, 700, 711 sok-a-sokhoz 438, 440 sor 61, 109, 112 sorok trlse 283 soronknti illeszkeds 438 sorrend 67, 539 sort 535, 540 sortrs 46 spam bot 606 SQL 57, 61 SQL lap 65 SQL-befecskendezs 334, 335, 336, 343 SQL-lekrdezs 84 SQL-megjegyzsek 334 SQL-parancs 62 SQL-parancsok automatizlsa 72, 73 statikus HTML-oldalak 2

stluslap 262 str_replace() 520, 560 strip_tags() 726 strlenO 565 Structured Query Language 61 strukturlt lekrdeznyelv 61 submit 6, 105, 202 subqueries 472 subscribe 660 substrO 528, 560 SUBSTRINGO 530 sti 374, 375 stik lettartama 407 stik trlse 385 stivezrelt bejelentkezs 380 switch 541, 542 switch-case 560 syndication link 675 szablyos kifejezs 561, 570, 572, 604, 729 szmtpusok 115 szzalkjel 505 szemlyre szabott webalkalmazsok 345 szerkezeti diagram 431 sznazonost 6 l6 szkz 26, 572 szolgltat 680 szgletes zrjel 215, 578 szveges adatok 113 szvegformzs 46

Trgymutat

a trgymutat

szvegrajzols 619, 620 sztori 667 szupergloblis 33 szl 695 szl-gyermek viszony 669 szlobjektum 698 szltbla 438

tartalomsugrzs 659, 660 tartalomsugrzsi hivatkozs 675 tartalomszolgltat 680 tartalomtpus 45, 672 tartalomtpus-fejlc 309 tartomny 306, 315 tartomny ellenrzse 599 tartomnynv-eltag 597 tartomnynv-rendszer 598 tartomny nv-uttag 597, 598 tglalap 617 telefonszm 569

tbla 68 tbla adatainak kiolvassa 70 tbla elvetse 124 tbla mdostsa 232 tbla szerkezete 123 tblk 61, 109 tblk kztti kapcsolatok 438 tblk ltrehozsa 64, 110 tblk sszekapcsolsa 437 tbla-sszekapcsols 473 table 61, 232 tabultor 572 tag 661 tagads 174, 221 tagfggvny 696 trol 31 tartalomkezel rendszer 730 tartalomlehvs 680

teljes kls sszekapcsols 480 temporary 244 termszetes sszekapcsols 480 terminl 64, 111 ternary operator 455 tervezs 108 tesztfelttel 166, 167 TEXT 114 Throw 720 tiltott karakter 580 TIME 114 time() 252 TIMESTAMP 114 TINYINT 114 titkos msolat 50 titkosts 352, 354

tizedesjegyeket tartalmaz szm 113


tizenhatos szmrendszer 354

most itt vagy >

771

a trgymutat

tbb felttel vizsglata 179 tbb sor 44 tbb sorra trdels 85 tbb szbl ll vltoznevek 26 tbbsoros megjegyzs 335 tbbsoros szvegmez 204 tbbszr szerepl kdok 194 tbbszr szerepl kdrszletek 418 tmb 27, 34, 57, 632, 636 tmb bejrsa 216 tmbelemek sorszmozsa 642 tmrtsi szint 651 trls 147 trls korltozsa 284 trimO 336, 342 true 139, 166, 167 TrueType 620 try 719, 720 ttf 620 tulajdonsg 696 two-dimensional array 632 type 6

jrahasznosthat parancsfjl-sszetevk 422 jsor 572 jsor karakter 46, 47 Unicode 728 unlinkO 269, 270 UPDATE 235 upload_tmp_dir 246 URL 27 rlapadatok elrse 16 rlapbenyjtsi mdszer 33 rlapellenrzs 339, 343 rlapmezk ragadss ttele 204 rlapmvelet nhivatkozv ttele 200 USE 120 user_id 637 USING 476 gyfloldali 57 gyfloldali ellenrzs 165 res cmkk 661 res rtk 172 res karakterlnc 170 res kereskifejezsek 524 res tmbelemek 523 reshely 572, 670 zenettrzs felptse 44

j oszlop 209 jrahasznosthat 644 jrahasznosthat kd 536

772

Trgymutat

a trgymutat

vlasz 302 vlaszok 681 validation 565 vltoz hosszsg karakteres adat 114 vltoz-elnevezsi szablyok 26 vltozk 24, 26, 31, 57 value 204 VALUES 66 VARCHAR 114, 115 vdekezs az xss ellen 726 vdelem 299 vdett oldal 299 vdkarakter 46, 57 vgtelen ciklus 142 vletlen trls 149 veszlyes karakter 336 vessz 66, 70 vesszk cserje szkzkre 520 visszafejts 355 vizulis biztonsg 353 vonal 617

webalkalmazs 105 webes krelmek 278 webes tartalom sugrzsa 659 webkiszolgl 2, 18, 733, 735 webmappa 248 webnapl 730 WHERE 147, 148, 293, 327, 475, 504 WHERE zradk 96 while 139, 140 whitespace 572, 670 wildcard 505 window.location 725 Windows 739, 750 WordPress 730

XHTML 661 XML 661, 690, 711, 729 XML-dokumentum 672 XML-videadatok kpi brzolsa 695 XSS 725

most itt vagy

773

a trgymutat

y
YouTube 681 YouTube-videkrelem 682 yt nvtr 694

Z
zrjel

166

774

Trgymutat

most itt vagy

775

Agyhullm: PHP
Mit tanulhatsz ebbl a knyvbl?

& MySQL
A PHP s a MySQL napjaink legnpszerbb webfejlesztsi technol gii kz tartoznak - eb bl a knyvbl kiderl, hogy mirt. Az, hogy nlklk ptsnk fel egy webhelyet, ma mr ugyanannyira elkpzel hetetlen, mint a webtervezs a CSS nlkl. Ez a ktet nagyszer be vezetst nyjt a tmba, s hihetetlenl szra koztat. Brcsak n is ebbl a knyvbl tanul tam volna!"

Kszen llsz r, hogy statikus, HTML alap weboldalaidat magasabb szintre emeld, s adatbzis-vezrelt webhelyeket pts a PHP s a MySQL segtsg vel? Ha igen, az Agyhullm: PHP & MySQL a legjobb tmutat a dinamikus webhelyek gyors fellltshoz. Ebben a ktetben valdi alkalmazsokat p tnk, egy videojtk eredmnyjelz oldaltl egy internetes trskeres web helyig. Mire a knyv vgre rsz, kpes leszel rlapok ellenrzsre, munka menet-azonostk s stik kezelsre, adatbzis-lekrdezsek s tbla-sszekapcsolsok vgrehajtsra, fjlok be- s kimeneti mveleteinek kezelsre, s gy tovbb.
E redm nyjelz o ld a lt

ksztnk a kedvenc II t i ' rock and roll video jtkunkhoz

W H W I au&kir..

RSS-krfolyam o kh l bvtjk

~
i

3 webhelynket,

Stik s munkamenetek segtsgvel lehetove tesszk a bejelentkezst a webhelynkre.

Nv
Kialaktjuk a tkletes
^ id a tb z is s m a 't.

A sti eg y ed i n ev e

rtk
A s lib en trolt rtk

jra ti dtum
A sti rv n y e ss g n e k lejrata... avagy a sti v g z e t n e k ideje

Harvey Quamen, az angol nyelv s a hu mn informatika adjunktusa, University of Alberta


-

Mirt nz ki ez a knyv mskpp, mint a tbbi?


gy gondoljuk, hogy az Olvas ideje tl drga ahhoz, hogy j fogalmak bemagolsra pazarolja, ezrt a kognitv tudomnyok s a tanulselmlet leg jabb kutatsi eredmnyeinek felhasznlsval egy minden rzkszervre ha t anyagot lltottunk ssze. Az Agyhullm: PHP & MySQL kpileg is izgal mas formtumt gy terveztk meg, hogy az lmost, szveggel telezsfolt knyvekkel szemben az agy mkdshez igazodjon.

Ezt a knyvet olyan ol vasni, mintha egy iga zn 'j fej' tanrtl ta nulnnk. Az ember alig vrja az rkat!"
-

Stephanie Liese, webfe jleszt

IS B N : 978 963 9637 63 4

9 789639 637634

Kategria: Programozs, Adatbzis-kezels, MySQL, PHP Szint: Kezd-Halad ISBN szm: 978 963 9637 63 4 ra: 12000 Ft

www.kiskapukiado.hu

O REILLY
www.oreilly.com www.headfirstlabs.com

Vous aimerez peut-être aussi