Académique Documents
Professionnel Documents
Culture Documents
A gy hullm:
O R E IL L Y
K IS K
OREILLY
<> S
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
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
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
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
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
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.
/ i
xi
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
s i a r f w r c . 20% o t t
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
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^
MakMtLVf.ecw
a rrf
) rcm ve . o a
cen
<= 5
a tartalom jegyzk
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
a> O
i* "t
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
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
, -------------------- (
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
xv
a tartalom jegyzk
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
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.
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
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
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 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.
a tartalom jegyzk
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!
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
Tartalom jegyzk
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
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?
/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*
, 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.
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
. . 625 . . 627
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
Urc.^*
srf a d d1 *e de 0
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
>
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
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
m o s t itt va g y
xxiii
a tartalom jegyzk
............................................ 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
Oowrtfoad Connector.-PHP
PHP - ttV rtp fo r
cw w hj
Trgymutat
755
most itt vagy xxv
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
kte e ht
...
xxvii
Jobban szereted az inspirl beszlgetseket vacsora kzben, mint a szraz s unal mas iskolai eladsokat? .akkor ez a knyv neked szl.
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)
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?
\h
xxviii Bevezets
Bevezets
mes eiraWrozm*.
Egy ufs VouTube-vide nyilvnvalan rdekesebb az agyadnak, mint egy szmtgpes szakknyv.---------- >
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
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
Horrorfilmek
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
( 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.
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.
~ ~
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.
xxxiv Bevezets
Bevezets
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.
m o s t itt vagy x x x v
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.
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
W
// / m ^
--------- 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
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
* k a 'l< * S t a j !
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*
MySQL-adatbzis
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.
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:
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:
Owen remli, Hogy erre valaki igennel felel majd, teht ltta Agyart az idegenek rhajjn.
Owen egy e-m ailt szeretne kapni, amikor a ltogat kitlttte az rlapot.
Milyen problm kba tkzhet O w en, ha a fenti rlappal prbl adatokat szerezni az idegenek tevkenysgrl? Ide lerhatod, ami az eszedbe jut:
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
/ ,, H .. . ..
<form method="post" action="mailto:owen0aJLiensabductediDe.com"> <input type="text" id=,firstnaIne, name="firstname" / x b r /> , , <label for="lastname">Last name:</label>
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
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,
7. fejezet
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
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
Owen nem kapja meg az urlapadatokat, hacsak a felhasznl nem kldi el sajt kezleg ezt a bizarr klsej levelet.
0 w W, p j , , amij
o
i folyik itt? Van valamilyen tleted, hogy miknt lehetne kijavtani az rlapot?
7 fejezet .
im fw m a
i_ _
i Jtvr nanic:
t>*ra clh B c :
H ouavrfki ,w^ , o*
W v ,
Y<* L S o r j
Az rlap csods - amg a Report Abduction gombra nem kattintasz, amikor is minden trldik!
Havcjmj
t you
gyfloldal s klszolgloldal
^
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 <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
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 .
A felhasznl kitlti az rlapot, s benyjtja, tadva az rlapadatokat egy a kiszolgln tallhat PHPparancsfjlnak.
11
a p h p kiszolgloldali nyelv
report.html
Hwl* J* o m ***
\ o md ym to u } id
A felhasznl kitlti az rlapot, s benyjtja, mire a bngsz tadja az rlapadatokat egy a kiszolgln tallhat PHP-parancsfjlnak.
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
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 kiszolgl futtatja a PHP-parancsfjlt, amely e-mailt kld, s elllt egy megerst weboldalt.
o
Owen megkapja az e-m ailt.
13
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.
A < f o r m > elem action je l lemzje indtja el a PHPparancsfjlt a kiszolgln, amikor az rlapot benyjtjk
reportphp
14
1. fejezet
Nincsenek
hlye krdsek
J V M it jelent a PHP?
Annak ellenre, hogy a webbngszm egy olyan oldalt mu tat, aminek a neve .php-re vgzdik, az oldal tiszta HTML. Hogy is van ez?
.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.
15
az els php-parancsfjlod
<?php
Na, itt kezd rdekes
lenni a dolog jff kezddik a tnyleges PHP-kd.
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
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.
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?
1 b i on d w* on
WM
Yes O N o
m e about UfO
---
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>
A bductod Mo
f lO D o r, cport
Szerinted gy kell mkdnie a PHP-parancsfjlnak? rd le, hogy mirt vagy mirt nem, s hogy szerinted mi trtnik itt:
17
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 PHP-t ismer webkiszolglk tudjk, hogyan kell futtatni a PHP-parancsfjlokat, s hogyan kell azokat a bngsz szmra rtelmezhet HTML-weboldalakk alaktani.
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.
18
1. fejezet
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
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!
19
teszteld a php-parancsfjlt!
report, php
A
Nade'
Unj?t**Yr<aJlQrecn com
t*jt NovemDc^
1 hus 1 or
dozen
0 ^ 0
20
1. fejezet
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.
21
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.
report.php
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
Abduction
_______
a kiszolgln.
23
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 ] ;
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>
24
7. fejezet
g f
^ ^
A legtbb
PH
n t o U t f t a u r l PHP
9 *1 0 , h jy to(J pNp
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
e f
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.
vltoz-elnevezsi szablyok
A vltoz olyan trolf amelybe adatokat helyez hetsz. Minden vltoznak egyedi neve van.
Fogtam!
N M M f * ?
_ Jen vltoev elejt, to te le n -
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
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-
26
7. fejezet
Nincsenek
hlye krdsek
K i Szmt, hogy a PHP-utastsokat kisbet vel vagy nagybetvel rom?
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.
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 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
% -
f |/> ^
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
,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^
- k u p o n an A b d u ti.c n
28
1. fejezet
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>
['whenithappened '];
$ _ P O S T ['howlong']; S _ P O S T ( 'descript
Salien_description = $fang_spotted -
ion'];
$ _ P O S T ['fangspotted' ]
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
Hegyezd ki...
m egolds
an Abduct
ens Abducted
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
sml
ltM
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
re n d e lje
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] ;
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 ' ] ;
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?
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
$ _ P O S T [ ,h o w l o n g ,l
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 .
$ 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
szvegm ezibl?
33
a $ _P O S T egy tmb
***
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 ?
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> \ ^
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
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>
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
</body> </html>
report.php
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
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;
</body>
rep ort.php
36
1. fejezet
sa dr U Nvme tl o e br
1 h^ 1 o rs
Itnfc Qteen mer w % IM ib o u t UfO ons
Y cs O No 0
w ant
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
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<
~~~ '
< 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
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.
Aliens Abducted Me - j
e ch o
' D e s c r ib e th em :
'< 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;
A report.php parancsfjl jelenleg figyelmen kvl hagy t klnbz urlapadatot is. Megdbbent'!
Describe them:
Itttie green m *n
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
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.
}
A lie ti A b d JC W d M e - R e p o r n
ft felhasznl . . . .
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
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 / > * ;
ech o
'D e s c r i b e th em :
<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
'Y o u r e m a il a d d r e s s i s
41
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.
! 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
42
1. fejezet
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 .
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.
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!
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.
Iona . * . '
. ' .. ~y --
. $ a l i ^ d e s c rip tio n
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.
&
$msg = -$name
n_it_happened .
I 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:
kosn t b b sorra
szoktk hzni az kt, hogy jobban bogy mely sorok
kdsort szndfrdelnek, be
Egy hossz PHP-kdsor tbb sort is tfoghat, ha gyelsz arra, hogy miknt bontod fel a kdot.
3 kdban.
44
7. fejezet
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.
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?
45
$msg * $name . r was abducted 'Number of aliens: 'Alien description: 'What they did: 'Fang spotted:
$how_long . '.\n'
1 . $a1ien_descriVtion
' . $what they did . '\nf . ' . $fang_spotted . 1\n* ' . $other; .
'Other comments:
^ 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
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.
ST:
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:
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.
47
Ez mr megvan f
O Ai zonot trzoo.
e:
Btsjt|1M
az e-mail trgya-
/y felhasznl
/
Az zenet trgya,
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:
Ez lehet statikus
h a felhasznl e-m ail
tsr- A ftW
karakterlnc.'
Q Aliens ^ a ^ a in,
Vus VaraV\er\anc.
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
--
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
$ 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"
49
A level trgya
tozsakor
a 'From:' eltagot.
Nincsenek
Ffchow l o n g A n "
$u b 3> c ^ -
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 .
"O th*r c o o s w in ts i S c t h e r 1 ; *
V:
A III)
% 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.
<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 :'
Menet kzben egy HTMLweboldalt lltunk el, amely megersti az rlap sikeres benyjtst.
?>
'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
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
____ ____ _ __
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
*l4ui4tC*ft
Yc* 0 No
A dinamikusan ell
n c f *v *r f o t m t
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
Sally kitlti
H r. r*
I MI*M:
y iV mwr sJw **
* ftmf ml I rwm'
m * + ** f
ka I
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
Owen most mr boldog, mert az rlapjn keresztl dlnek hozz az informcik az idegenekrl.
levlradat
Aliens Abducted
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
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()
55
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
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.
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).
57
Kapcsolds a MySQL-hez
* Rakd
e kell dugnunk az interw ebet, m ie l tt kapcsoldhatnnk a webhely-konfiguratortorhoz.
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
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
60
2 fejezet
kapcsolds a M yS Q L-hez
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
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.
61
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 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.
>
63
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)
informM m i i , H l * "
64
2. fejezet
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 \
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.
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
Q None
Q p ip p e d 3
3 gombra a tbla
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
Itt tov'bbi
lo p n e v e k
eve. O en esetben w
J
I
aens_ai>duc#ion.
3Z INSERT H SQ lTO
kulcsszavak kezdik.
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.
66
2. fejezet
A sorrend szmt!
A beszrand rtkeket ponto
san ugyanabban a sorrendben kell megadni . mint a z oszlop neveket!
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',
o your
'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
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
67
^ ^ 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.
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.
! 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 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 ,
('Sally',
' 3 d a y s a g o 1,
'sally@ gregs-list.net )
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.
t0W aft S
= f rintett J j .
most itt vagy
69
bemutatkozik a S E L E C T utasts
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 -
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
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
nY er hatokat
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:
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
f irst_ na mo | Sally
| how_long I 1 da y
I ho w m a n y | four
1 row in s e t
(0.0005
sec)
adatokat lthatod.
71
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
r c ,,;s a f c t d
<0.000-
t -t
Agytorna
Mit gondolsz, hogyan lehelne megoldani Ow en MySQL-adatbeszrsi problmjt?
72
2. fejezet
kapcsolds a M yS Q L-hez
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
y .9 q ii_ c lo s e (Scibc)
report, php
73
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.
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.
mysql-kapcso/at ltestse
^ 3 ",0C3
A MySQL-kiszolglm helye (IP-cm vagy llom snv):................................................ Az adatbzisban hasznlt felhasznlnevem:.................................................................. Az adatbazisban hasznait jelszavam :....................................................
1
, lA . ,
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
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.
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
<?php
"' " zr
_l dat
I)
(f irst_name,
" .
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 ) ;
Nagyon gyelj itt az aposztrfokra s ketts idzjelekre, valamint az elttk s utnuk allo szkzkre!
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 () ^
77
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.
A fenti hrom fggvny hasznlata jellem zen azonos, m egjsolhat lp sekbl ll:
m y s q l i_ jc o n n e c t ()
_______ 1
C s a t la k o z v a !
vltoz trolja.
kapcsolds a M yS Q L-hez
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!
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.
(first_name,
how_longf " .
alien_description, what_they_di.d, fang_spot:ted, other, 'Jones', r3 days a g o ' , '1 day', ' 'four*,
('Sally',
" . " .
zrjuk b e
?>
a kapcsolatot.
Nzzk meg kzelebbrl is a PHP mindegyik adadatbziskezel fggvnyt! Kezdjk a mysqli_connect. ( )-te l...
79
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.
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:
f
M to i. *
vny a helyet, a felhasznlnevet, a jelszt s adatbaZIS neVet karakterlncokknt kezeli, ezrt idzjelbe kell tenned ket.
i i
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 );
' 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 );
81
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.
aliensrool' ,
Ez nem mkdik, mert hinyzik a pontosvessz. A ketts idzjelek ugyanolyan jk, mint az aposztrfok.............
N tl ler jelleg nv egy em
adatbzis-kapcsolathoz.
'aliensrool,
..... 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.
......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.
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
$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.
83
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.
K>---n Wttb 31 -. - - r .t r - - .-
--
i M i I v U - l t o i F - l i S - *rie^ ' 15
84
2. fejezet
kapcsolds a M yS Q L-hez
A pont arra utastja a PHP-t, hogy ragassza ezt a karakterlncot a kvetkez sorban ill \ karakterlnc elejre.
J
(fir s t_ n a m e ,
la s t_ n a m e , " .
"
h o w jn a n y ,
e m a il)
( ' S a l l y 1,
'1 d ay ',
"
. II
may h a v e s e e n y o u r d o g .
C o n ta ct m e . ' ,
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.
85
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.
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:
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
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
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( $ 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?
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
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
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 .'* :
?>
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!
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
te*
f "liM W W H>
V tK
hkdb Mhiw:
.f-n :
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
$name = $ POST[1firstname' ]
$ POST[*lastname'];
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.
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!
91
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!
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
hlye krdsek
K:
Ltre kell hoznom az sszes vltozt a $_POST adatainak t rolsra? Nem lehet egyszeren kzvetlenl a $_POST-ada-
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.
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?
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.
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 ;
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 ?
$w hat_they_did =
$ e m a il
;
/
/ /
/
_p o st
[ -e m
a il
];
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 ' ) " ;
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 ;
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
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
*-------
t-* l am u *;
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?
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 / . ----------
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 S a lly ,
I Jn n o s
I -Jc-noi.
; d r
I O ay u le
W tiiM
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
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
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:
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
! ! I
' j ! ' I
! fosTr II
! .ou r ! dunno
* | 1 1
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
97
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 *
'je-'j
hcw_mdny
, f OUr
! Sally
|1 ll | l | l
Tones OudyltWstrie r Mi
l _ p e c o i a ____ t _s:araeT:l7n^ i n
|l 3 ' seconds
I dunno
-1
I on fc /.now1 | nundrets I I p io n ty 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.
-- ----------------------------------------------------------------------
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:
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
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()
99
lltsd prba!
- megolds
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
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'>
m o s t it t vagy
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
___________________
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"
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
hogf I
no
T3-______ *
Wk
Subject* B ig S a lo ! Dear Fellow Elvisonians,
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
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!
105
a levelezlista-alkalmazs felptse
addemail.html
addemail.php
W ebkiszolgl Adatbzis-kiszolgl
sendemail.php
Ezt a webes rla pot t lti ki Elmer a krlevl ltre hozshoz s elkldshez.
sendemail.html
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
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?
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
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:
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:
e lv is
s to re
108 3. fejezet
Oszlop
J 8ob m
W*rlitz Franklin I
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.
zis-kiszolgl trol.
Nincsenek
hlye krdsek
A ; adatbzisra gy gondolhatnk, mint egy trolra, amely ben informcik tallhatk. *
j
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.
Ev M y S Q L .t b z is -W !# -
Z .,..
1
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
^ ------A ltrehozand j
CREATE DATABASE
a d a tb z i s_ n ev e
adatbzis neve
A CREATE DATABASE parancs utn meg kell adnod az j adatbzis nevt, me az SQL-utasts, amellyel ltrehozhatod Elmer adatbzist:
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...
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 o s t h o z d l tre a tblt
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
2tajg@gregs-lisi*et
Ezek sorok. Mindegyikben egy Ezek oszlopok. A mi tblnk ban hrom van.
mailinglist.txt
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.
112 3. fejezet
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
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?
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
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.
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.
>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
114 3. fejezet
Nincsenek
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:
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
115
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
a C A t. HR \
Egy UFO ltal elkvetett elrabls dtuma: 2/19/2Q04 A raktron lev Elvis-barkk szma: 93
VARCHAR ( 6 0 )
j
/
e-mail cmed
DATE T M E
Amikor ebdelsz Hny idegent ltott, amikor elraboltk? Elvis szletsi ideje
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
A tbla neve
A z oszlop neve
)
Tovbbi oszlopok , ha szksg van r
A M , - s o s z lo p n e v e k b e n nem m -
j aUUtM hasznain, a
ve z se k e g ys g e se k.
teszteld a CREATE-lekrdezst
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 tbla nevnek kisbetsnek kell lennie, s szkz helyett alhzst kell hasznlnod benne.
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.
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
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.
(
first_name VARCHAR(20), last_name VARCHAR(20), email VARCHAR<60)
Nincsenek
------------K
lT 'la":
" iS Q l- lm m l
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.
119
n e fe le d d a U S E parancsot!
A USE parancs a kvetke zo SQL-utastsok alapr telmezett adatbzisaknt vlaszt ki egy adatbzist.
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:
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
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
firstjname VARCHAR(20) last_name VARCHAR(20)J emailJVARCHAR(60) I Your SQL query has been executed successfully (Query took 0.4481 sec)
>
121
a D ES C R IB E parancs
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
DESCRIBE email_list
zr
|f) s|!
h L
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 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.
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
| 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.
tbla neve.
A DROP TABLE paranes egy tblt az sszes adatval EGYTT trl az adatbzisbl.
1 2 4 3. fejezet
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
first_name
lasf_name
h
W l li. * '
**' u
' k t l* "
, f" 't /
'
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!
! Szval ha egy tblban adatok vannak, s elvetem a tblt, akkor az sszes adatom is trldik?
! Vagyis ha egy olyan tblt kell mdostanom, amiben mr van nak adatok, akkor nincs szerencsm?
az addemail.php parancsfjl
ltfohogsch
,,
------------------------------------------------------------------
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
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!
addemail.php
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,
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
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) , ..............................
| 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
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.
mm
FtTatnat^:
L a s m a rrw Oate Enatl-
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
129
Nincsenek
hlye krdsek
! A s e l e c t SQL-parancsban a csillag ugyanaz a csillag karakter, amit eddig is hasznltunk?
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).
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 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
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
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
jfrohogQQQ;
A 2. lps ksz!
131
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*
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 ...........
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,
132 3. fejezet
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
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
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
133
a sendemail.php parancsfjl
134 3. fejezet
e '
a i 1
-.a
1 k ,m
" 'S M m
V to ,
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
szksges. A kapcs
135
Ez a fggvny egy adatsort olvas ki a lekrde zs eredmnybl, s egy tmbbe rja azt.
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.
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 /
,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
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);
> 137
^ 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 ". *
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 / > \
138 3. fejezet
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.
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?
139
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 egy echo uta sfsbl ll, amely sszera gasztja a sor adatait, s egy sortrst tesz a vgkre.
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
A HTML-sortrs gondoskodik rla, hogy az egyes adatsorok kln sorba kerljenek 32 eredmnyknt kapott oldalon.
$row[last name]
$row['email']
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 karakterlncok sszegzshez valjban nem a pluszjelet, hanem a pont mveleti jelet hasznljuk.
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: 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.
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
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
143
mail ( c m z e t t ,
Ne felejtsd el ezt a sajt e-mail cmedre vltoztatni!
trgy,
zen et,
'From:
'
fela d );
<? php
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 $
from
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
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.
m o s t rtt vagy
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.
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
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
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 .
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 ' ;
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 ;
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
_ Beugrats krds! Ez a vezetknv nem idzjelben ll, ezrt egyetlen sor sem fog trldni - minden szveges rtket idzjelek kz kell tenni!
_ _
, .
A keresett rtk.
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
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.
jellst,
A DELETE lekrdezs ezt a sort trli az adatbzisbl - soha tbb nem ltod!
email list
r
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 _
\
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.
1
Tshakespeare
1
Poe
j
)1 > Gromm et
mysql> DELETE FROM email__list WHERE email = ' pr@honey-doit.com 1 row deleted_ (0^005 sec)_ _ _ _ _ _ J
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
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!
mysqli close($dbc);
?>
151
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
M a \ c ^ M ^ u v i s x m
Enter an email address to ren ov e
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
?>
152 3. fejezet
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.
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
-
:------------- --------
__________ ______
A parancsfjl elvgzi a DELETE lekrdezs kiad snak piszkos munka'jt, majd megersti a trlst.
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
s e n d e m a il.p h p
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).
156 3. fejezet
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
*
T
w
F -
S5EL
a
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
157
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 ...
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 ___
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
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
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.
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
161
-----------------------------------------------------
0 ^ 0
............-
---------
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
SXOM
S Su b ject o f emailr * m enDers.
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);
?>
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:
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.
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 .
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 .
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.
az if utasts
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.
Ez 3 M l f i i . Egy fggvnyt hv meg, amely ellenrZ*' 3 $cre<^ - car<L nu,n (hitelkrtyszm) vltoz tartalma rvnyes-e.
{
i f O
}
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
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.
if
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
vsrl Nevadban l
{ $ s h i p p i n g _ s t a t e == $ to ta i = $ to ta i
* 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.
Ellenrizheted, hogy az egyik vltoz tar talma megegyezik-e egy msik vltoz tartalmval.
A szmrtkeket ne
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
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 '; ) }
^
if
Ez a felttel hamis.
{ echo 'T ru e '; }
if
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")?
168 4. fejezet
= $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
($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
169
B u ster ; = 3; = 4.6; = T ro u b le ; = 0;
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)
T)
( j g a z y a g y ham is
Nincsenek
hlye krdsek
sszehasonlitast ( Az eredmny azrt lesz true, m a pHP mindent, arm "m 0, m * * fals, true-nak tekint.
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.
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
$body
tartalmaz szveget
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!
171
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.
...............................................................................................
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
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
if if if if if
r t k e
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.
* f
(e m p ty ($ v 3 ))
172 4. fejezet
Valszergyakorlati alkalmazsok
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!
a ! mveleti jel
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 _ {
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?
I fl
Ez a felttel ezt krdezi: A Subject mez nem res?". Vagyis: vannak benne adatok?
174 4. fejezet
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
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);
?>
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
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 ] ;
........ 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
Body of email:
Submit 1
Ahogy szerettk volna, nem r kezik megersts elkldtt le-__ v lrl. Valamilyen figyelmeztet zenet azonban hasznosabb len ne, mint az res oldal.
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?
btucoon:
Mow lonp w
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
{ { (
( ! 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: 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
, . 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.
Ez
if ({!empty($subject)) |f (!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)) {
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.
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);
?>
180 4. fejezet
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?
131
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
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 ' )
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.
az e/se zradk
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: |
if
( ( ! e m p t y ( $ s u b j e c t ))
&& ( ! e m p t y ( $ t e x t ) ) )
echo
Az else zradk kdja akkor hajtdik vgre, ha az if tesztfelttele false eredmnyt ad.
184 4. fejezet
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
' 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) ;
} }
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
/>';
else
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
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 />;
}
} else { / / Everything i s fin e, send t h e em ail
188 4. fejezet
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.
a kitiszttott if kd
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. ] ..................................... ................. ' &&
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
}
Itt pedig azt vizs gljuk, hogy sem a $subject, sem a $text vltoz nem ures-e.
.... A
. } . .................................................................................................................................................................................................................................................................
190 4. fejezet
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.
Agytorna
------------
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:
/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"
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
* ' *
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
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.
?>
<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?
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 NT res THEN rj ki hibazenetet, s lltsd az $output_form-ot true-ra
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.
A H TM U lM b, ir_ I
Jenkppen csak egy pldny szksges. I
meg az ur apt
194 4 fejezet
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 )
}
if
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
} $ o u tp u t- forTO = t r u e ;
if ( ( ! e mp t y ( $s u b j e c t ))
//
}
if
levelek et
elk id
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
?>
A HTML-kod csak egyszer szerepel, mivel az rlap megjelen,lsnek logikjt egyetlen vltozba ISotputJorm ) gymszlted.
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 .
Ez a hibazenet tudatja
Benyjtva!
sendem ail.htm l
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
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
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
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..................... ...................................... .
198 4. fejezet
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
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' ] ;
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.
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?
" 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
Radsul az rlap tovbbra sem ragads. Ezek szerint mg lesz vele munka!
Submit
rd le, hogy szerinted mirt jelent meg hibazenetet a parancsfjl az rlap els megjelentsekor:
m ost i t t vagy
201
_ 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] ) )
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
202 4. fejezet
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
/> ;
}
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
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
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:
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
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
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
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
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.
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.
207
Ennek a tblnak a szerke zetben semmi sem garan tlja a sorok egyedisgt.
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.
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.
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
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:
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.
. .
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
Az elsdleges kulcs egy olyan oszlop egy tblban, amely min den sort egyediv tesz.
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
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 ',
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
+---------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
| ^
| | | 1 |
rows i n
set
(0-0005 sec)
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
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: 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.
212 4. fejezet
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
echo 'cinput type-"checkbox" value: echo echo ' ' echo ' ' echo '<br />';
}
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
<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
mmm
Ez az rlap nhivatkoz!
<?php $dbc - mysqli_connect (data .makerneelvis.com , 'elmer*, 'theking', or d i e ( Error connecting to MySQL server.');
// 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 /> ;
?>
<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 ? -
*,
214 4. fejezet
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
- ,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
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
fo reach echo
as
Ahogy a ciklus vgighalad a tmb egyes elemein, ideiglenesen egy ilyen nev vltozba rja azokat.
{
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:
t rl se
};
Ezzel a VltOZVal
rh e te d
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
^ e oe Rmv
$_POSTrtodeletel
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.
216 4. fejezet
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 )
) {
{
// 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)) {
mysqli_close($dbc) ;
?>
re m o v ee m ail.p h p
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,
ha a z r l a p o t
b e n y jto tt k )
) { $deiete_id> {
\d
foreach (s_posTf
to d e ie te 1]
ftuery)
Jd " ; .......................................................
// 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
echo '<input type=checkbox" value-"* . $row['id'j echo $row[ ' first_name'' ; echo * 1 . $row[*last_name*]; echo ' 1 . $row[1emailfJ; echo <br / > ;
?>
re m o v e e m a il.p h p
218 4. fejezet
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
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.
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. /
> ;;
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
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
[ p fate Me.EK* - M
Ma^MgELVt^CH
PnfM
t * UaM W Etm ?*.
..........
S C S S S U ^ - .
m W i*tr **ra*'<*nuCuG'-*.a>^ J i i^
&D*nKntim
fSbmiF;
#<lwVMi*>>n>e*eB*a
Fiftinanfr
LJ* Oat
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.
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 Guitar Wars alkalmazs lehet v teszi a felhasznlknak, hogy felvegyk a sajt pontszmkat a dicsosgtblra.
Mivel nincs md az ellenrzs re, nem tudni, kinek a pontsz ma vals, s kinek nem. Belita, a szkeptikus virtulis rocker. v
224 5. fejezet
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.
345900
Name: Eddie Vanilfi Daie: 2008-04-23 09*>6;35
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:
-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,
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
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
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
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
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
?>
</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
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;< Back to high scores</ax/p>;
)
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 />
a d d s c o re .p h p
m o st Itt vagy
229
'^& 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 />
<?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 -
m y s q li
a foldalon
< /b o d y >
</html>
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
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.
< h l> / tm
Az rlapon egy < in p u t> elemre van szksg a kp fjl kivlasztshoz.
230 5. fejeze t
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.
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.
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
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
r |
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
Mivel az oszlop j, kezdet ben res (NULL rtk) a tbla minden sorban.
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
234 5. fejezet
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
d ^ d j t , majd vgrehajtod
3 9<"t*rwm.sql fjiban
at SQL-lekrdezst.
f/l a
ts ; lfedi az j
screenshot oszlopot,
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.
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...
----------C * * - A d d
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.
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...
236 5. fejezet
Nagyt alatt:
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.
<
?>" />
<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" />
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-
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.
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.
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.
2008-04-24 08:13:52
186580
238 5. fejezet
<input *:ype--"fi l e
"
$ 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
ooion
ioioiji
$ _ F I L E S [ screenshot1] [1size]
phizsscore.gif
12244
r.
Ezt a kpfjlt t lti fel az rlap f jlfeltlto mezje. $_FILES [screenshot ] [ tmp_name'] '
/ tmp/phpE 7 q jk y
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]
^S
ssEJSasafi
S ic! KU an W ly
U n v e rifie d f
186580
N aiw : li7 Lolrwon
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
re .g jf
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!
$ 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 =
$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 > ;
}
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 > ';
?>
241
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 ');
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
i f ( i s _ f i l e ( fVow CsrttKshoh']
/ > 0 )7
< A
............................ i..........
tr o w C s tr tt* sK o i'J
........................................
) e ls e |
A Guitar Wars foldal nak mdostsa, hogy a rekordok mellett megjelentse a kper nyfelvteleket is.
?>
2 4 2 5. fejezet
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 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
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
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);
WWW
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.
\oo\ lm
UiOlOt O0OIC
le t lti
phizsscore.gif
Nincsenek
hlye krdsek
K I Nem mdosthatom a feltlttt fjlok kezdeti trolhelyt a p h p . i n i fjlban?
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.
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.
246
5. fejezet
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.
Az images mappa valjban nem nagyobb a tbbi mappnl, viszont segt a kpfjlok egy Helyre rendezsben.
m o st Itt vagy
247
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.
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
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
p h izssco re .g if
p h izs sc o re .g if
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
6 7
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.
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
A feltlttt kpfjl thelye zse az ideiglenes feltolt si mappbl a kpek vg leges mappjba.
250 5. fejezet
Ashton Simpson
Knny lovita:
368420
64930
186580
p h iz ssco re
Phiz Lairston
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:
M k.
fonlsimoltmlt
0.1:
Unveri fled
185KO
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?
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
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
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
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?
a d d s c o re .p h p
m ost it t vagy
253
A parancsfjlok ltal kz sen hasznlt adatoknak kdismtls nlkl elrhe tknek kell lennik az egsz alkalmazsban.
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
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:
K
V
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:
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.
a re q u ire o n c e utasts
II
?>
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
?>
// 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 pontszjnok tmbjnek bejrsa s W / HTML-knt trtn formzsa egy ciklus // segtsgvel NAME)
else I ocho 1ctdximq src= . GW_UfLOADPATH . unverifled.gif " alt="Unverified score /X/td></tr> ;
addscore.php | y
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
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!
Cui t a r
Scores
PHiri
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
\ ame
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
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
i screensnot
FROM
FROM
m ost it t vagy
259
p h p - b m ysql-m gnesek
megolds
mysql>
SELECT
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|
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.
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
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 | 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
A Top Score fejlc vilgosan je l zi a legmagasabb elri pontsza\ mot, vagyis a clt az egymssal ferseng' gitrhosknek.
W dcore
. Gaiiar
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
Ez a stlusosztly mr hasznlat ban van, s az a szerepe, hogy ki emelje az adatbejegyzsi hibkat az Add Score parancsfjlban, i
error {
Stt httrsznt haszn lunk fehr szveggel, hogy a rekord valban kitnjn.
scoreinfo {
vertical-align: top padding-right:15px;
style.css
262 5. fejezet
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 *] .
I
else {
echo 'ctdximg src-"' . GW UPLOADPATH . Tunverified.gif' r" alt="Unverified score" /></td></tr>; .
echo
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.
// 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 .
echo ,</table>';
264 5. fejezet
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
frcorc.
Top Score:
368420
368420
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 .
m o s t i t t vagy
265
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.
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
Screen shot:
- ethtWifl*eor.3df
Add
o o i
ioioiii
ethelshugescore.pdf
n s > r>
- A d d V o w H la h S c c r e
'
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
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
_______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
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
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.
fjlok feltol*.
Ez nevetsges!
(**>
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"><< Back to high scores</a></p>' ;
)
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.
addscore.php
m ost i t t vagy
269
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
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?
270 5 . fejezet
F jlokban t ro lt a d a to k kezelse
jelenlegi legmagasabb pont szm nincs megerstve, ami nem tl bizalomgerjeszt tbbi felhasznaid szmra.
w\w
orehi7Uto.jU M
368420
op Score: 368420
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
Ashton Simpson
2 0 0 8 -0 4 -2 3 1 4 :0 9 :5 0
rd le, hogy szerinted hogyan lehetne megtiszttani a rekordlistt a meg nem erstett pontszmoktl:
m o s t i t t vagy
271
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.
Sro=^ : cc
A Guitar Wars foldalt s az Add Score oldalt a vgfelhasznlknak sznjuk, a rekordjaik feltltesere s megtekintsre.
64930
Krtiry IJ>,Q
Unveri f i e d !
S W P t T U -. W M^ C D r-.20C *04-:-*C :a
18658
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.
____
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,.......................................
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
Dali
>
B a c k IQadmin page
WWW
im ages
2008-04-23 09:12:53
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
// Csatlakozs az adatbzishoz
$dbc = mysqli_connect(DB_HOST, DBJJSER, DB_PASSWORD, DB_NAME) ;
admin.php
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
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>
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
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
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.
^ 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.
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
POST:
m o s t i t t vagy
279
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 -
---
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
matat lpsenknt
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
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
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
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
Ez a lekrdezs azo kat a sorokat trli, ahol a name oszlop ban az 'Ashton Simpson' rtk ll.
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
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 =
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
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
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
'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-23 0 9 :1 3 :3 4
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
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?
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:
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:
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.
285
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[ ) ])) (
&& isset ($_P0ST ['narae ]) && isset ($_?OST [' score ' 1)) (
// Csatlakozs az adatbzishoz
$dbc mysqli connect (DB_H0STr DBJJSER, DB_PASSW0RD, DB_NAME) ; =
F jlokban t ro lt a d a to k kezelse
LIMIT
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
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>
</head>
< b od y>
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 parancsfjl ms-ms mdon re gl, attl fggen, hogy a bejv krelem GET vagy POST-e.
$name
$score
= $_G ET[*
name' ] ;
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.
// 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.
D ELETE
FROM
fcfcguitarwars WHERE
)
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
</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
A jvhagy rlap csak akkor jelenik meg, ha ezek kzl a rekordvlto zk kzl mindegyiket belltottk.
m o st i t t vagy >
289
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*
W . 1 QWH KHOeIfn. -
O a
A nemkvnatos re kordok kivlasztsi nak megerstsrt s a rekordok trl srl egyarnt az j Remove Score olrf gondoskodik.
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
* * * ; Jrt V . n l > w v
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 --..
290 5. fejezet
F jlokban t ro lt a d a to k kezelse
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
- m egolds
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.-/'
. v ..
* '< :< 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
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.
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
ez egy u j fejezet
295
a g u ita r w ars o ld a lt fe lt rt k
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.
Jacob, a Guitar V/ars rekord-^ tartja dhs, mert eltnt a pontszma a rekordlistrl.
296 6. fejezet
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
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.
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 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!
Az adatbzisban lev rekordok most mr vdelem alatt llnak, mivel az Admin oldal vdett.
g u ita r w a r s
M
1g
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 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
$ SERVER ['PHP A U T H P W ]
t
z a vltoz trolja a hitele
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
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|| |
$ SERVER[ PHP_AUTH_USER1]
300 6. fejezet
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.
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?
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.
Agytorna
Szerinted mikor clszer az Admin oldal hitelestst elvgezni?
m o s t i t t vagy
301
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
______
X lE ^E iE T ! L >
B I
, ,))
index.php
Ugyflbngsz
Zi.ore*
Nmk rv* L i nr. 3 -1 1 *1 C#A 5 ^
1S65ts
Vgeredmnyben a fej lcek segtenek a krt oldalt sikeresen kzbe steni a bngsznek.
302 6. fejezet
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.
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.
in te rj egy fe jl cce l
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: 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: Mg mindig nem ltom, mirt fontos ez. Fejlc: Akkor kzeltsk meg gy: n szerint fontos,
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.
304 6. fejezet
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
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
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.
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
'
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
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 _____
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.
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
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:
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' ;
( 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);
admin.php
308 S. fejezet
?>
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.
?>
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
<?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 , ;
admin.phc
310 6. fejezet
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
*-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
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
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
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
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.
n n
* W h f Wm
312 6. fejezet
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?
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.
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
<?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>
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 . & 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
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*);
?>
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
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
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
f _C K ) a/ et
In '>
____ I
<<
joadm 2e m
317
rekord
pi o n
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
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:
319
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 *
iw.aaM v)
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
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.
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
X c o rc r
321
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
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
30 31 32
322 6. fejezet
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.
if
( i s s e t ( $ _ P 0 S T [ s u b m it ] ) )
// 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 );
else
echo
} )
323
<?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).
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
fname
else
e c ilo }
sdore.</p>;;
Fontos, hogy jelezd, ha egy rekord jvhagysa meghisult, ugyangy, ahogy a Guitar W/ars ms parancs fjljainak hibazeneteiben.
admin.php
..........
it
324 6. fejezet
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
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> ;
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 ] &name=' . $row [1name *] . &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
Tipp: Approve hivatkozsnak csak a jv nem nagyott rekordok mellett szabad lennie.
325
echo <tr class="scorerow,xtdxstrong>' , echo !<td> . $row['datef] . </td>; echo '<td> . $row[1score1] . ' </td>'; echo *<tdxa href="removescore .php?id=
' &name='
1 if {
. $row [ 'n am e ]
&am p; s c r e e n s h o t= '
. $ r o w [ ' s c re e n s h o t ] > (
^ ------------------ ---------------------------- ^
C id 'l
echo
'&anp;daie ; jhrowTda^J .
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
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
L :v
354190
T-6-3HC
Srnr.-*
3S*in o
3 2 2 ? 1
na1 Scor:
I
Q
*2?r,0
3 *4 4 1 30
m ost it t vagy
327
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.
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
Dac
Score
Aeon
BW Jedi
Leddy Cke Beita (Jb*vy J c a c Paui Jonw Phlz LsJrson Paco Jastorius NvO Johinssoo Keun>
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.
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
314340
N am e: 3ifT Jeck D ate: 2008-0502 20:32:54
329
Ez pontosan az a fajta rekord, aminek a megjelen st a modertornak rgtn meg kellene akadlyoznia - mg is itt van!
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
330 6 .
fejezet
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.
Agytorna
Mit gondolsz, hogyan utn l lt,el ham is rekordja a modertoron?
> 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?
ioi
[ \O \\ U
Oll< IjOlOUI
ethelsscore2.gif
332 6. fejezet
Ti -
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.
*$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
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.
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?
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.
334
6. fejezet
Az urlapmezl bizton sgi rst jelentenek a webalkalmazsokban, mert lehetv teszik a felhasznlknak, hogy adatokat vigyenek be.
^ Q P
m if
Nincsenek
hlye krdsek
K V
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
$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 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:
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 INSERT-lekrdezsek megrhatk
^ i , ^
h i
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 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:
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
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
if
is_numeric (465730)
^ 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
339
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
.........................................................................................................................................................................................
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.
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
' 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
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
I G
t a r
Name: J ACvBOUNSU
Score * MbS?3G
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.
Ethel - beltva, hogy a csatt elvesztette - gy dnt, hogy inkbb csatlako zik a gitrhskhz.
m ost it t vagy
341
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.
^ ^
342 6. fejezet
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.
>
343
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
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
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.
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.
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
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 *
\ \
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
1
I
I
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?
347
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.
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.
348 7.
fejezet
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 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.
349
141test members:
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
3 felhasznl-
mismatch user
MiDida | Hy | rta t. j_plrtO T J
hlye krdsek
K i
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 ,
mismatch user
351
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!
h P.P..password V A R C M .t)
^ 7
Az u oszloPol< M y * 'j
a ta'bla'ban az AFTER utasifssal szablyozhatod.
mi smatch__user
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?
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...
Ahhoz, hogy egy alkalma zsba be lehessen jelent kezni, egy felhasznli fe lletre van szksg, ame lyen a felhasznlnv s
[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.
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.
353
az sha() fggvny
AM ySQ LSHAO fggvnye gy fit kosit egy szvegrszletet, hogy egyedi, 4 0 karak teres kdd ala ktja azt.
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.
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.^
n o
Mismatch - View
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:
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
K: V:
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?
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
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:
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.
^ 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 ) '
rr-.Vi
- :'LECT
);
i i^ssrname i
!
Mm.
rov* in
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?!
to area
A felhasznlk szmra a szabvnyos HTTP-hitelestsi ablak - amelynek a megjelense bngszofuggo - szolgl egyszer' bejelentkezsi felletknt.
("Cancel ) ft o g in A
357
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'" ) ;
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
358
7. fejezet
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
360 7. fejezet
Ha a felhasznlnevet s a jelszt mg nem rtk be, el kell kldeni a hitele stsi fejlceket, hogy a felhasznlt
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. ? );
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
(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 ; ^ ----
Ha a felhasznlnv-jelsz prnak
)
e lse {
egyetlen sor sem felel meg, akkor jra el kell kldeni a hitelestsi fejlceket, hogy a felhasznlt ismt az adatok megadsra krjk.
(<h2>Mismatch</h2>Sorry,
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) ;
?>
r ----- ----KISZ
Egy j bejelentkezsi parancsfjl elksztse, amely a felhasznlt a felhasznlnv s a jelsz megadsra kri.
m ost it t vagy
361
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.
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
^ancei
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
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 "
/>
^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 * ) ;
< 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
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
> 363
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
Felhasznlnv? Jelsz?
364 7. fejezet
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)
********
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.
365
mm
Mismatch - Sign Up Please
Mmatcfr - S g n
A feliratkozsi rlap
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);
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[ '])); ']));
)) (
// 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( ) ) " ;
// 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
?>
< 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 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--------------------------------------------------------------------
// C o n n e c t t o t h e d a t a b a s e
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 [
m y s q l i _ _ c i o s e ($dbc) e x it ();
368 7. fejezet
? ba/ka/mazasoi
else {
^^
) 6 IsS I
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
/ x b r />
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.
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.
o t>y
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 \ * .
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
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
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
tn P *> *k
V 4i t/ &$*** **a* o v
Klassz! &e tudok jelentkezni a Mismatch rend szerbe, s megnz hetem, illetve szerkeszthetem a szemlyes profi lomatl y -" .
C: ltV
L* DJi; R O U flS
GoKltr:
Birrhdate; Uwulo-
^ na: Rb o>
Mate
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.
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
Name
s i d n e y k ________________
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
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?
373
bemutatkoznak a stik
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. >
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.
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
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) ;
$ _ C O O K IE
['username * . '.</p> ]
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
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
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 ,
$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 ) {
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 > .') ;
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
377
u s e r _ id = $ r o w [ , u s e r_ T d TT T \ ^ :~ ^ ^ ^
username ~ $ row[ 1username1 ] j y
Itt
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
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.
,/
y * k
Lm*
1o s
Female
lV rtjn; n vi dc
f in t name: Sidney
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
index.php
379
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 .........
r e q i r e _ o n c e <' c o n n e c t v a r s . p h p ' ) ;
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, 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;
}
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 parancsfjl most mar t f i teljes oldalt jelent meg, ezrt minden szabvnyos HTMl-elemre szks9 van.
a kvetkez'oldalon folytatdik...
380 7. fejezet
?>
Ha a felhasznl ezen
$_COOKI ?, { |u g r narri-s * j . V. </p > 1 ;
?>
</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.
381
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
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 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

 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.
383
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
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); ,
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 ) ;
?>
385
*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 (
, {
u, W
) - y> 00);......^
. W
, ; ; W ) . - 0 0 )i .
$home_url = 'http://* . $_SERVER [ HTTP_HOST1J . di rname ($_SERVER [1PHP_SELF* ] ) . ' header( Location: ' . $home_url);
?>
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
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
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.
387
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
L tIn 5 .L itn v
* 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:
.........
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.
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.
session start ( ; )
-------
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
g yflb ngsz
A sznfalak mgtt a mun kamenet-azonost teszi lehetv, hogy tbb oldal osztozzon a munkamenet
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 ;
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.
a kiszolgln trtnik.
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.
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
if
A munkamenet-stit gy trl jk, hogy a lejrati idejt egy rval korbbra lltjuk.
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.
------- i 1 I
; o n _ s t a r t- n , i u -
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
,1
(idfr Nlc U
HirtMaie: 1969*09-24
i Hollywood. CA
Would yt*i h ie o
392 7. fejezet
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 .^
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
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
?>
393
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!
( 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
bejelentkezs llapott most egy sti helyett egy munkameneti vltozval ellenrizzk.
) 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.
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.
/>
// 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
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
index.php
viewprofile.php
editprofile.php
395
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
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.
397
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
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
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>' ;
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
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
399
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
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
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
&
.... &
'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
Dienire
Pcrsonai Inioiroacan
First name:
J&son
,isor
Gender:
B ir t b d a t t : '- ^ - 0 0 - 2 4
City: Holk/*rood
S ta te :
ca
______
Picture:
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.
403
tgasabb!
A frusztrlt felhasz nlk sohasem sz
m tanak j jelnek.
s *
M w tsn tch
Mismatch - Wbr* oppot.
A felhasznlkat a Mismatch alkalm a-^ zs anlkl lpteti ki, hogy a Lg Out hivatkozsra kattintannak.
Dicjdrc
4 0 4 7. fejezet
Agytorna
----------
Szerinted mi okozza a felhasznlk automatikus kilptetst a Mismatch alkalmazsbl? k csinltak valamit vletlenl?
sfiket vagy munkamene teket hasznlunk, a beje lentkezs az, ami a mar*dandsagof biztostja.
r I* * * -----------------
1 1
Jl
Ha a munkameneti vlto
u sernam e s idneyk
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
.. | |
. . .
|>
d 6 3 S U t l K r k k T r t n l f i k *
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.
*'<
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
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.
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
A felhasznlk nem maradnak rkk bejelentkez ve, mert a stik 30 nap mlva megsemmislnek.
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.
410 7. fejezet
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 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
if (is s e t(
[s e s s io n name( ) ] ) ) {
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!
s e t c o o k i e ( s e s s i o n name()
t i m e () - 3600)
logout.php
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.
A legtbb felhasznl
boldog, hogy a munkame netek s a stik egyttes hasznlatnak ksznhe ten az alkalmazs job ban emlkszik rjuk.
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.
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
--------------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!
Egy munkameneti vltoz segtsgvel megllaptja, hogy a felhasznl bejelentke zett-e vagy sem. Egy sti segtsgvel megllaptja, hogy a felhasznl bejelentkezett-e vagy sem.
sha (
$ u se r_ p a s sword.1)
session destroy( )
Felismerhetetlen formra alaktva titkostja a felhasznl jelszavt. Elraktrozza a felhasznl egyedi azonos tjt egy stiben.
$ SESSION = array( )
j munkamenetet indt.
session start( )
415
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.
416
7. fejezet
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
Latest members:
Rja
lo iia
C ienl?
iass
C opyright C 2 0 0 9 M *n lch U nttptiscs.lnc.
index.php
ion*
Usernam e: jncoJcs First nam e: Johan L&<t nam e: Nettles G ender: B irth d atc: Location:
Pfciurr:
viewprofile.php
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
419
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!
-------------------------- 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:
viewprofile.php index.php
P m on tl tnfcaoarkin
F lr jo r-* name: I.a sl n*<
Gender;
?
r
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
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.
421
A sablonok lehetv teszik, hogy egy PHP-alkalmazst j rahasznosthat pa rancsfj l-sszetevo1<bol pts fel.
startsession.php
headenphp
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
footer,php
az index.php feladata egyedl a felhaszn lk listjnak megjelentse maradt; csak erre kell figyelnie.
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.
423
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
?>
header.php
a HTML-kdot.
footer, phc
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 n c e ( 1navmenu. p h p )
II
Kapcsoldj
az adatbzishoz
$ 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
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 >
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
?>
___-
425
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
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 * ,
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:
A es thn
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
ez egy j fejezet 4 2 7
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.
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
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:
429
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
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
430 8. fejezet
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
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
m* I u s e r j d | t o p f c jd
5ify_ state
p ic tu re
432 8. fejezet
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
mismatch_response
P M p o m e Jd category topic 1 resp o n se j u se r id
1 I
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
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
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.
11 11 11 11
1 2 3 4
m i s m a t c h =j e s p o n s e
user
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
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
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 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
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
1 h,_
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
Ebben a tblban minden sor egy-egy olyan tmt name) azonost a kate grijval (category) egytt, amely
toplUd
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.
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
N etties
28-6 U
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
E G V - A - > SOKHOZ
ezek kzl a sorok kzl
&t*dleges kulcs.
m i sma t ch__u s e r
M rJd O W u sw n o m e p a ssw o rd
...
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.
sok-a-sokhoz kapcsolatok
illeszkedik
d ie rd re
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
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
frie n d s
b a r to k
nv
kategria
KAPCSOLAT
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
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
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.
tcpic id
rei-poncic
I intiuj
I HG
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
\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
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
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?
(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.
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 vlemny oszlopa mg res, amikor a fe l hasznl elszr nyitja meg az rlapot. INSERT
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
// 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";
"(
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 > ' ;
PHP-mgnesek
megolds
// 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 ) -
<
$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);
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
--------- -----
mysql^.
UPDATE
mismatch_response
response -
'^response
ft
I response id
$q u e r y ) ;
Az egyetlen dolog, ami megvlto zik, amikor a felhasznl benyjt ja az rlapot, a vlemnyek tbl jnak response oszlopa, teht csak ezt kell frisstennk.
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
Az adatvezrelt (datadriven) rlapok MySQL adatbzisban trolt ada tokra tmaszkodnak a HTML-urlapmezk ellltshoz.
tonic id
< fo rm m e t h o d -" p o s t " a c t i o n = " " >
i
\
,>Lew
1 " ch.ecked*"checjted"//>Love
f^/Lovc
C Hate QHux
y/
Cowboy boots:
(L onghair: , Enienainrrcct
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
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 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
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
76 77 78 79 80 81
A (-------7 A
3 4 5
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
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.
452 8. fejezet
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;
453
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).
(. [~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).
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
Aprop, hatkonysg...
A liatkonysgot illeten nem az adatbzis hatkonysga az egyetlen, amit
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
FelttelesKifejezsi
Utastsi
Utasts2
Ha a FelttelesKifejezs rtke false, az Utasfts2 vgrehajtsra kerl sor.
fa 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
? ' checked=checked"'
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 "
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
<?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
questionnaire.php
// 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 ) ;
// 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
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']
}
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
Ezek az echo utastsok egy-egy v lasztgombot hoznak ltre - egyet a Lve", s egyet a Hat" szmra.
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.
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
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
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.
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
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
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.
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
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_______
\
|
12
| 13
Love O H ate
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?
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.
462 8. fejezet
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?
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/
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
1. A normalizlt tblkban az adatok nem ismt ldnek, ami cskkenti az adatbzis mrett.
A normalizlt adat
bzisok ltalban j tfal kisebbek a gyen gn megtervezett aidatbzisoknl. gy is mondhatnnk: a mret pnz"!
Vrjunk csak, ez le
ht, hogy gy szol:
.az
P nz
...frge lekrdezs = j!
464 8. fejezet
^ ^
Ahhoz, hogy egy oszlop valban atom i legyen, ugyanabbl a tpus adatbl nem szerepelhet
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
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 ...
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
f M *
MA SC GA AZ MS
Tupelo
t 38801 j
465
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!
user
466 8. fejezet
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.
467
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
-------------
\J,
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.
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.
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
Activities
468 8. fejezet
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
B a rb a ra Streisand
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.
O
A A
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
A kpzeletbeli irnytszm nlkl a felhasznl cmt tr l oszlopok tbb nem kzdenek fggsgi problmkkal.
470 8. fejezet
A Mismatch j t b la szerkezete
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
// 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
Ne feledd, ez a fggvny rulja el, hogy hny adatsort adott vissza a lekrdezs. m ism at<h_response mismat<h_topi<
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.
\ A p p e a ra n c e
A p p e a ra nce -/Entertainm ent'
nem dnak
472 8. fejezet
_
FROM m is m a tc h t c u i c
"
***
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
name
Appearance Entertainment
Food
People Activities
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
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,
pontokkal
1/
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
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
Ugoryjd
474 8. fejezet
Az INNER JIN egy felttel sszehasonl t mveleteivel kap csol ssze sorokat kt tblbl.
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
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
felttelnek.
Nincsenek
hlye krdsek
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.
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
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
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 ': .
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
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
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 };
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.
// 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
478 8. fejezet
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 );
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
.
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-
zetnek vizsglata szksges ahhoz, hogy megllaptsd, h o g az sszekapcsolsban mely oszlopok vesznek rszt.
! 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
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
mismakfitopU
responsejd response user_id to p ie jd fo p ic id
name
I* -
category**
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.
Hst, hogy az ada tok nem ismtldnek adatbzisban, az rlap sokkal k vetkezetesebb, s *zrt a felhasznlo'k szmra kevsb za varos.
Horn- movies:
The opera:
Peanut butter & banana sandwiches: C Love 0Haic Martinis: @Love Hrnc
i K
Sidney krdve ki
r Food-rm: Sd u lj;
Spam:
s P k \ food:
M mtc is a h
@Lovc OHaie Ol-ovc Hate
O o CHw L ve e
O L ove
0 Hafc
Love CHatc
Howard Stem:
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
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:
az (ellentt)prost logika
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:
484 8 . fejezet
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.
Ez a lekrdezs egy JIN segtsgvel a fel* hasznl sszes vlem nyt kivlasztja.
" .
m r . 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 )) {
AmiLa^ fk ciklus u n o i Amikor a int/lii* vget a $userjres|>onse$ tmb a felhasznl sszes vlemnyt tartalmazni fogja.
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;
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
486 8. fejezet
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
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.
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.
{
) (
if (
array_push($topics, $user_responses[$i][1topic_name])/
) )
488 8. fejezet
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.
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.
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
7 8 8
Hate Hate
$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.
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
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
i f (mysqli_num_rows($d ata) ! 0) {
// 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 "
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
a r r a y _ p u s h ( $ u s e r _ r e s p o n s e s , $row) ;
^mismatch u s e r i d - - 1 ;
$
rr i smat topi cs - a r r ay ( ) ; h
m ost i t t vagy
491
// 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
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 .
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.
pr
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*])
$s o o r e 4= i;
array_push ($t o p i c s , ) 1 $user_rsponses[$i]
T:opic_naine ] ) ;
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
if ($mismatch_user_id != -1} {
Mieltt m e g ji-
1Smismatch u s e r i d M T;
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 . {
echo $ro w [ c i t y 1]
}
echo f</'td></tr></table>f ;
. * to p ics:< / h 4> *
$t o p i c
/>'; <br
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
m ost it t vagy
493
lssuk a p ro ka t !
V
\
foR in* 22 top: o^
____
A n C E L ~ th *. .A ______^cl,cd n n
Johannk!
j >
m i!m *
Tan
Goid ch't Body piercicp
R irs T ca V
Tbc opera SushJ Spao>
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
h tia m
Bsrtara StrcAwJ
H u*h HcJncr M a itla Stcwitft ^
Hg Hvlixt uh
Manha S it w
H ature Soc;4ar.i
m
Yoga
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.
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
Az eredeti Guitar V/ars adatbzis, amely a felhasznlk ltal bevitt rekordpontszmokat trolja.
465730
r 3sto?
>9 4 870 im m k
N .U . m W
N ctet
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 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.
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!
496 8. fejezet
. ,^ =
: -''.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
498
8. fejezet
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/.
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.
>< >
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
Ez az egyszer keressi rlap egy parancsfjlt hv meg, amely a riskyjobs tblban keres.
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
502 9. fejezet
Minden lmom , hogy matadorknt dolgozhassak... de a Risky Jo b s keresje nem ad egyetlen t a l la to t sem!
r m
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!
rd ide a megoldst!
m o s t i t t vagy
503
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!
$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) ;
3 felhaSZ nl ltal megadott szvegnek pontosan egyeznie kell a keresettel.v > ..0
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
SELECT job_id, title, description FROM riskyjobs [ WHERE title LIKE f%fighter%f
a k
' v
. .
olyan
lyek em
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.
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 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
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?
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?
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.
Ezek a kifejezsek egyetlen tallatban sem jelentek meg. Ez a LIKE zradk egyetlen tallatot sem adott.
508 9. fejezet
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
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.
509
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.
'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
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 );
510 9. fejezet
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_words = explode(
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:
fro m
riskyjobs
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:
$ w h e re _ c la u s e = ' ;
$user_search = $_GET ['usersearch' ] ; $user_search);
$search_words = explode (1
Gyzdj meg rla, hogy a IA/HERE zradk nem res, m ieltt a keressi lekrdezsbe illesztend.
OPwr j ii
^ >
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
description L IK E 7/V|atador%'^0^\ A lekrdezs vgn egy felesleges OR ll, ami ................................................................. ........................ lehetetlenn teszi a lekrdezs vgrehajtst!
512 9 fejezet
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
....................... ................. /...... mnyt, l t e k l hoznod egy tmr el fscardK words e%p|<>deC /user search); / b t a LIKE zradkokbl.
........................... .................................. ..........................j .................. ............................................... ..................................
o'
Q,
]
AD
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.
^
^
ff
bz egyests eredmnye-
^
o
;*> 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
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?
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
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
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
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
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.
Macskaz s o n g l r
llam AZ
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?
ki a ceruzd!
rd le, hogy milyen SQL-lekrdezst kapunk Selma tightrope, walker, circus kereskifejezse nyomn, s jelezd a lehetsges problmkat!
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!
des*ipi'o* L | ^ E
i 0/o C \rC \A S , /o
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
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*.
tightrope
walker
circus
$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
$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.
$clean_search = str_replace(1,1, ?
< r
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
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
$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.
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
$ search words
bul1,matador,
cape
$search words
522 9. fejezet
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
523
Itt az eredeti tm b , amely tartalmazza a keresokifejezseket, valamint nhny res elemet a felesleges szkzk miatt.
A parancsfjlt ki kell egsztened egy kdrszlettel, amely felpt egy j tmbt a valdi, nem res kereskifejezsekbl.
524 9. fejezet
$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 -
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
)
// 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?
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
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 substrl) fggvnye lenetove , , i . i teszi, hogy kinyerd Vf eqv karakterlnc egy rszt.
^ ^ ^
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:
substr($job_desc, 4, 3)
you
substr($job_desc, 49)
ing?
substr($job_desc, 0, 9)
Are you a
528 9. fejezet
... -3 -2 -1
substr($job_desc, -53, 7)
Are you
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>;
529
Hegyezd ki a ceruzd!
- m egolds
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%"> . .
echo '<td valign="top" width="10%">1 . $row['state1] . '</td>'; echo <td valign="top" width="20%"> . echo
l/.Qi.Q).....
f</td>' ;
< /tr>
>
)
echo ' </table>';
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
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?
. . 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,
Agytorna
Hogyan mdosthatjuk az oldal szerkezett s a lekrdezst, hogy a tallatokat a felads dtuma, az llam vagy az lls m egnevezse szerint rendezze?
531
latokat. Erre lehetsget adhatsz, ha a fejlceket hivatkozsokk alaktod, ame lyekre kattintva a kvnt rendezst kapjk.
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
532 9. fejezet
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?
533
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.
. * .............................................................................................................................................................
7 ? s k y s r a p c r % ; ......................................................................................................................
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.
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
534 9. fejezet
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
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.
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.
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:
536 9. fejezet
tl ltre.
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.
m o st i t t vagy >
537
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.
538 9. fejezet
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 ?
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.
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 > ! ;
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.
O O
540 9. fejezet
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
ktl fggen,
. . .
, v r
*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
$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.
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) {
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:
.= 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
. . .
T? u s e r s e a r c h - * . S u s e r s e a r c h
$ 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^
= <td><a h r e f -
?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
543
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 =
mr rendezted
switch
c a s e 1:
($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 = "
$sort_links Ssort_lin ks 6
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
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 = "'
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
.= '< t d X a h r e i |
'
. . .
">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
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";
DESC ;
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.
:
. - 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
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
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
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?
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
546 9. fejezet
f f f ee. e
Pi n n
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?
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 _
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?
R isky
tO I
j
^
Job TWe
Description
W c cccd pCOpW
-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'*
Description
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
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
|tpa:*rzo io tfelk
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
A W/HERE zradk hinyban a lekrdezs az adatbzisban megtallhat sszes llst visszaadja, vagyis olyan ered mnyt kapsz, mintha nem adtl volna meg kereskifejezst.
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
A msodik paramter azt adja meg, hogy a lekrdezs hny sort adjon vissza tt, mint korbban.
most itt vagy > 549
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?
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?
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>
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
<-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
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.
$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.
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.
/ / 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
$ 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
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 {
/ / 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 =
. . .
'
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 > ';
$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 ) {
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.
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 ) {
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=' . (
.................................................................................
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 }
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
$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: < - .
if ( }
$page lin k s
1 . $ i;
Fontos, hogy a hivatkozsok ugyanarra a parancsfjlra mutassanak - a k lnbsg mindssze az tadott oldalszmokban mutatkozik meg.
$ c u rjp a g e
I r sort=
$num_pages
. ">-></a>';
)
else { $page_links .= 1 ->T ;
)
return $page lin k s ;
556 9. fejezet
<?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;
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 > ;
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 ) ,?>
V -
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
; 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
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?
State
VT CA
Date Posted
2008 03 11 2UU8-U3-24 2008-04 28 20084)5-22 2 0 0 8 0 6 28
< 12 3 4 >
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
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 kockzatos llsok j jelentkezsi r lapja lehetv teszi az llskeresknek, hogy adatokat adja nak meg magukrl, hogy a potencilis munkaadk rjuk ta lljanak.
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
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
// 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 ;
if
?>
k z ----------Itt megjelentjk az rlapot.
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.
$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) ) {
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
a felhasznl ltal bert adat csak akkor fogadhat el, ha biztosak lehetnk benne, hogy a telefonszm helyes formtum.
}
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.
?>
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.
% 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...
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...........................................
(<595) klk-WSZ
............. ................................
(-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.
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.
Szablyos kifejezsek
# # # - # # # - # # # #
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
555-636-4652 5556364652
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?
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.
/ 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 fenti minta, a { i o }
1 0
szm kifejezsjegy"
570
70. fejezet
Szablyos kifejezsek
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 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\
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.
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}$/
/"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
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}$/
/-\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
/ 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
Szablyos kifejezsek
* (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
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
555-612-852 -8 7 2 4
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 } $ /
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 ~
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
Egy dolgot elfelejtettel. Az amerikai telefonszmok nem kezddhetnek O-val vagy 1-gyel.
[ 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.
................................................................................
Szablyos kifejezsek
~
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} $ /
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...
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.
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.
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
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:
(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:
(5 5 5 )6 3 6 -4 6 5 2
/ A\ ( \ d < 3 } \ ) \ d { 3 } - \ d { 4 } $ /
580
10. fejezet
Szablyos kifejezsek
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
Gyakorlat - megolds
Gyakorlat - megolds
A karakterlncnak a kvetkezvel kell kezddnie:
^
s ez a karakterosztly ismtldik
^ 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.
s ngy szmjegy.
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!
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:
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,
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
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
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.
} \ .......................
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
Szablyos kifejezsek
,2 ; dfL ! U
Z
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
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.
/ 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.
/
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.
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
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
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#
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
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:
/ [\(\)
nyit zr zrjel kdt]el
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)
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 #
L iNm: m ae
" -------------
Dcnitd Job:
p re g
r e p l a c e ()
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?
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.
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
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.
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
/ A\w+/
A karakterlnc elejn...
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
'
{ }
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\
\ -& ! ? = # ] * /
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.
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.
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.
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):
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 -
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 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;
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-
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 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';
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
^
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 {
// 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 )
) (
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.
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.
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
^
A hibazenet rmutat, hogy a fel hasznl e-mail cme rvnytelen
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
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.
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
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!
R e c o n n e c t and rettuy
hvijf xperrences r with people you
pn
szemlyes gy
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
rem o v e
Rettenthetetlen Guitar Mars-modertorunk veszts re ll a robotokkal szemben akik fradhatatlanul kldz getik a hamis rekordokat.
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 ,
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:
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 /
% 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
S c o re : 9999S&<599 S c rc c n s h o r C ^ m e J ^ e >
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.
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
...............
........
'
R etinavizsglat:
| N z z e n a w e b k a m e r b a , s kattintson
M e n n y i 7 + 5?
------------------------------------------------------------------------------------------------------
N y o m j a az ujjt az rzkelre
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
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
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
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
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.
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.
m o s t i t t vagy
611
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
! 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.
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 ); ^
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.
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,
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 ) ;
5,
$ te x t_ c o lo r,
se g ts g v e l
Az jonnan ltrehozott k pek res fekete httrrel in dlnak. Mondd gyorsan h romszor: Te fekete kefe "
i ^
lenszer ponttal egsztjk ki. Miutn a bngsz megkapta a kpet, a szokvnyos < im g > HTML-cmke segtsgvel jele ntheti meg azt. ^
\O ! ** o tO
gyflbngsz
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.
magassag
Az j kp szless ge kppontban.
magassga.
A fggvny egy kpazonostt I^ ad Vissza amelyre a rajzolahhoz, hogy tnylegesen a kpre tudjanak rajzolni
fggvnyeknek van s z k s g k ^y 1
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.
A visszaadott rtk egy sznazonost, ame yet a rajzolfggvnyekben a sznnek - pldul a CAPTCHA-szveg sznnek a meghatrozsra hasznlhatunk.
616
11. fejezet
A szn vrs, zld s kk sszetevi, amelyek ebben az esetben fekete sznt adnak.
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
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);
szlessg magassag
szlessg
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.
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-
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
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.
imagedestroy ($img) ;
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.
A szveg megrajzolshoz hasznlt betmretet egy I s 5 kztti szm lltja be, ahol az 5 a legnagyobb mretet jelenti.
Mintaszveg
Sample t e x t 1, $ c o l o r ) ;
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
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 szveg llsi szge, az ramutat jrsaval szemben, fokban megadva 0 norml szveget jelent)
^
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.
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<
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 ) ;
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)/
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 ) ;
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 {
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 httr
II
}
// 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
segtsgvel ^ _______
?>
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.
captcha.php
m o s t i t t vagy
623
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
624 11 fejezet
A Guitar VJars alkalma zs modertora annyira kiakadt, hogy kpzelet beli robotokkal kzd. Azonnali megoldsra van szksg!
Mr ksz!
&
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.
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?.
/ > .
^ 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.
oo
***
Nmet Scorc:
Sercco shot: T n c s f ftle no filc e c te t^ *
C ') m
u \ M i, csak m
A CAPTGHA kp mogjolontso a Guitar W ars alkalmazs Add Scoro rlapjn, s a flhasznl felszltsa, hogy rja bo jelszt.
?> <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 >
$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 ] ;
flA
i f ($_SESSIONl pass p h r a s e ]
== $ u se r pass p h rase) {
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.
Cttar 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
no file seccieo
II -
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:
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.
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.
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 ^ ------------ --------.
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 /
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
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
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.
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.
\/alue 1
A fo tmb minden eleme egy-egy oszlopnak felel meg Oszlop t Oszlop 2 Oszlop 3 Oszlop 4
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
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
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.
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: 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.
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.
635
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
Ki kell nyernnk egy kln tmbbe azokat a kategrianeveket, amelyek az ellenttes vlaszokhoz tartoznak.
| 1
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
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...
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 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
id)
resp on $e_id
i to p ic
id
response
i to p ic
na:ne
name
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.
a tm k tm bjnek felptse
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
! 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
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.
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
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.
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?
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
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
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
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:
! 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.
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.
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 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!
// 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
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 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
* 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
V s i m g ,
" . S
/ | | 1 ( W ,L .| . ! ,
kifl,8H %
; t e P i l! l T P , w ^
// 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 ) ;
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 -
i l ^ S t o n k . ( $im 9) ;
A kpet egy
PNG fjlba
_ \ __ A memribl takaritasA
kppen trljk a kpet. \
A kiszolgl azon mappjnak, ahov a f jlt rjuk, rhatnak kell lennie ahhoz, hogy ez a fggvny mkdjn.
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
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
'y
\
Mismatch My Mismatch
________________________ (
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
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
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
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.
d ie rd re
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
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 / > ' ;
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
daiejory breakdow*v<A^V;
dv-aw_bav-_3raj>K(^, 2A O , j te gry_ W ak 5,
);
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.
Elmer nhny tnclpst tkletest, hogy ne vall jon szgyent az idelis ellenttprjval.
jjJ
C tf*cacao .
V **
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
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.
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.
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.
655
1 2 Tartalomsugrzs s webszolgltatsok
ez egy j fe je ze t
657
bctiwc'oc*in.n
loo*-06-2*
airrojt a vcek
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
Az elrablsbejelent rlap kivlan mkdik, de Owen nagyobb nyil vnossgot szeretne a webhelynek.
Fang spotted
Fang spotted
officials
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
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.
Tartalomsugrzs s w ebszolgltatsok
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.
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.
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
\ (U y
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.
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 egy jellnyelv, amelyet sugr zott Webes tartalom lersra hasznlnak.
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-
- . i ' J 11
1 -1 :'[ ! i / r1
< im g s r c = a l i e n . g i f />
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.
Nincsenek
662
12. fejezet
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 "?>
<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 >
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.
<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,
< 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 >
^ 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.
Az egyes hrekre mutat hivatkoz sok jellemzen a hrelem teljes tartalmra hivat koznak a hrfo lyamhoz tartoz webhelyen.
664
72. fe jezet
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. -
Don
Q uay'e
1991-09-14
37 seconds
dunno
Rick
N ixon
1969-01-21
just one
Bet
Chevy
2008-06-21
almost a week
27
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 ^ ^
---------------------------
.-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.
< d e s c r ip t io n > T r ie d t
\ ri**:)
RV k
-Te * * hy *
,UK
K TU tMV m
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
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>
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.
<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.
Az egyes csatornk title , link, description s language elemei a hr elemek mellett jelennek meg, mint a channel elem gyermekei. \
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
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>
s < description > elemek a hrelem rszleteit adjk meg. m tlic sl^...< /tijje> pubOare
|<e v 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?
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
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.
V
h
?>
formcik ltrehozsa.
< 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.
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
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">
newsfee<iphp
';
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 > ';
<?php he ad e r ( ' Content-Type <?php echo 1<?xml version^-" < rs s v e r s io n ~ " 2 .()">
< 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
<?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
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
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:
Ha a bngszdnek gon dt okoz a hrfolyam megjelentse, prblj fe e d ://-e t rni az URL be a h ttp :// helyett.
Td y oa
dog '"
LMrth
^ Actions:
A newsfeed.pbp parancsfjl olyan RSS hrfolyam-doku mentumot llt el, amely brmely RSS-hrolvasval megtekinthet.
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.
100 11
nioio
o o i o i.
i o io n
rssicon.png
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;
Fang spotted
A fo Aliens Abducted Me oldalon el helyezett, jl lthat hivatkozs segt a felhasznlknak, hogy gyorsan hoz zfrhessenek Owen hrfolyamhoz.
Alien description: Clumsy Unlc huggcre, had no rhythm. Alien description; green with six tentacle*
Tartalomsugrzs s webszolg/tatsok
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
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 *
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
fo /'M
678
72. fejezet
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
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:
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
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
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.
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?
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.
/ . . .
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
A kulcsszavakban nem szmt a kis- s nagybeti*___ ^ klnbzsge, teht az elvis , az E lvis s az eLvIs" ugyanazt az eredmnyt adja.
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/
---- -------, -, -
f a v o r it e s
m o st i t t vagy
683
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.
A keressi kulcsszavak mindegyike az URL vgn szerepel, s perje lek vlasztjk el okt egymstl.
Ha egy felhasznl kedvenceit keressk, az URL-ben a vides" helyett a users szt kell hasznlnunk.
T*1
Az URL a favorites"
Minden vide, ami az aliensabductedme nev felhasznl kedvenceknt van megjellve: ^
szval vgzdik.
Nincsenek
\ 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 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 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.
Tartalomsugrzs s webszo/g/tatsok
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:
Date
T itle
Source
New
Recent Articles:
All Today Yesterday Last Seven Days This Month Last Month Source: YouTube Videos Actions: Update Now
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
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 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
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 & 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
689
Y o u T llb 3 V id O k rfil*
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
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?
m o s t i t t vagy 691
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!
1. Mi a vide cme?
U'O
. f
. .^.(7.
692
12. fejezet
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:
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 & 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:
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 > *
<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 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 elemek (element) az XML-cmkk (tag) s a kzttk ll adatok elvont brzo lsnak tekinthetk.
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
Az objektum olyan klnleges adattpus a PHPben, amely adato kat s fggvnye ket foglal egyet len szerkezetbe.
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.
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.
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.
m o s t r tt vagy
az o b je ktu m a d a to k elrse
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
.=
echc $ a _t r s
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
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.
cmlns:med
'
Minden elem, ami a < mdia:" eltaggal kezddik, ehhez a nvtrhez tartozik. Ez a nvtr az < y t : " elotag elemek.
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.
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
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:
^ { .{ ^ / / ^ d s B ^ iM b J a C to n / itU e n d s /Z O O l
);
Ez a nvtr URL-je, ahogy a dokumentum elejn tallhat < feed > elemben szerepel.
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
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 ____^
& /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.
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.
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,
Tartalomsugrzs s webszo/g/tatsok
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.
Strbereknek
Az rkat nem szksges szmtsba venni, amikor kiszmtjuk egy vide hosszt, mn a YouTube jelenleg csak 10 percnl rvidebb videkat enged kzztenni.
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 );
$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;
);
/ / 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->
/ / 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 ( )
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 ;
A hinyz PHP-kd
echo '<p>bo r r y , no v id e o s were f o u n d .< / p > f
< 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 >
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 < 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
// 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
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
$ 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.
* ' <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 > - ;
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.
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^> ' " . . , ,
(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 >
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:
F a n g spotted:
3 hours
A bducted for:
no
F a n g spotted:
yes
F a n g spotted:
2 hours
yes
F a n g spotted:
almost a week
no
1 ja y
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!
Is. L !fZ
ZL
Iz
ZL:
r
in
n
t ^ }
_____ I
n z k
3^.; -g?
J
#
zi
_r
i n
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.
i. fggelk: maradkok
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!
ha p hp 4 van a gpeden
...akkor gy rd t:
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...
Ezttal az adatbzist a kapcsolat kiptsnek rszeknt vlasztjuk ki - ez olyasmi, amit a mysqlfggvnycsalddal nem lehet egy lpsben elvgezni.
A mysql-fuggvnycsala'd esetben a kapcsolat egy adott adatbzissal mindig kt utasts h3Szn|3tva( pthet ki.
m aradkok
MySQL-kapcsolat lezrsa m y s q l_ c l s e ( kapcsolat) MySQL-kapcsolat kip tse a kiszolglval m ysql_connect {lloms, felhasznlnv,
jelsz)
Az adatbzis kivlasztshoz szksg van a m y sq l_s e le c t_d b () fggvnyre.
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)
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.
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
fesS
-o n
MS t U N . v Q i.t .m
itt
Tm
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
K* O
OHMK*. *
o tVtf* .W 1
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
(1)
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:
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:
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) ;
' . $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.
kivtelkezels a PHP-ben
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.
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.
function sing() { echo 'This is called ' . $this->title . '.<br />; echo 'One, two, three...' . $this->lyrics; }
*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...
721
objektumkzpont php
722 / fggelk .
maradkok
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
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 ::------- ----------- ...
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.*
724
i fggelk
maradkok
fo ty
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
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
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
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.
a php 5 s a php 6
Nagyobb Unicode-tmogats
Ttelezzk fel, hogy egy alkalmazsodnak grg szveget kell megjelentenie.
Wro 0&4.0* . 4W aantr* 4\
Ji
- n r //O f
'
iV
<
O R E IL L Y
Ao x v tf.n m
MX V LfiL
fif
*4'0
Ez neked knai.
(Maker Faire)
14 * .Mm m w a*
iJd * i
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
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
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.
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
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 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 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.
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
e s i *f t
#
Index o f /
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,
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:
a mysql-vltozat ellenrzse
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
$ cd /usr/1ocal/mvsai
$ 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> / /
734 i i f g g e le k
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.
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
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 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 :....
Miutn letlttted a fjlt, kat tints r dupln. A Run (Futta ts) gombra kattintva m eg kezddik a telepts.
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
Az Extensions gban keresd meg a MySQLi-t, kat tints r, s vlaszd az Entire feature" lehetsget m ost it t vagy > 737
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.
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: . .
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
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
Downioas
M ySQ L 5 0 D o w ?lo a d s
rrm an>
Urne Ul c W . * *
lu r o
M ySQ L C o m m u n ity S e rv e r
s r Jv 3rd
Download
rm
o to ir ? * * :
>
K A iI lcs.it
A W^ lcH ib
M ySQ L
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
10 r ie
i h K T n c i m A Dean m o m j
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
ttdfltti a
V J r t f i f lh g 5 * 4
H? " H T i
L f i 4 BHU
F iio h) tfifc a
m mm
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.
5045
51 / U
5045 S JM 1
5 0 46 7 s. f a j 4 M
~ rro f
<<r,M
> 2 2 2 ^ I E A 2 .C lp *
I .
^.mxu'u
v j u
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.
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
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
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.
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
w . >-
> -vxw<'>
Cu*** 0?mr*x**n
CSfl> M lS ** U H fl f t e w '
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
mm mm
L- f .*vl ; liaa;L,teas. iW1*13*11fiiAy uywf W)5.t iu *
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> 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 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
$ 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
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.
745
riskyjobstable. sql
Ez itt mind
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.
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
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.
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.
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.
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.
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.
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
is h ' -
- c
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>
V UiSgL^iiaLlC^7 _ _L .[Connectors A
mytQI * S t t n * O f ) |PHP S J i
i . :3
. - , W *
:.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 $
5ze
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
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
______________
; ; ; ; ;
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.
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
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*
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 ^
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
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
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
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
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
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
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
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
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
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
773
a trgymutat
y
YouTube 681 YouTube-videkrelem 682 yt nvtr 694
Z
zrjel
166
774
Trgymutat
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
W H W I au&kir..
RSS-krfolyam o kh l bvtjk
~
i
3 webhelynket,
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
Ezt a knyvet olyan ol vasni, mintha egy iga zn 'j fej' tanrtl ta nulnnk. Az ember alig vrja az rkat!"
-
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