PH P és MySQL®

webfejlesztöknek
Hogyan építsünk webáru házat?

Lu ke Weiling Laura Thomsan

PHP és MySQL webfejlesztöknek - Hogyan építsünk webácuházat? © 2010 Perfact-Pro Kft. Minden jog fenntartva!

ISBN 978-963-9929-13-5

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

Bármilyen másolás, sokszorosítás, illetve adatfeldolgozó rendszerben történő tárolás a kiadó előzetes írásbeli hozzájárulása nélkül tilos. Az itt közölt információk kizárólag az olvasó személyes használatára készültek. Jelen mű felhasználása más köny­ vekben, kereskedelmi szoftverekben, adatbázisokban csak a kiadó előzetes írásbeli hozzájárulásával lehetséges. A szerző és a kiadó a tőle elvárható legnagyobb gondossággal járt el a könyv és a prograrnek készítése során. A könyvben, illet­ ve a programokban található esetleges hibákért, használatukból eredő esetleges károkért sem a szerző, sem a kiadó nem vállal semminemű felelősséget.

Fordította: Lénárt Szabolcs Szakmailag lektorálta: Kiss Kálmán Nyelvileg lektorálta: Kósa György Tördelte: Fontoló Stúdió

Felelős kiadó a Perfact-Pro Kft. ügyvezető igazgatója l101 Budapest, Pongrác út 9/b. Tel: 260-0990 Fax: 431-0028 info@perfact.hu
www

.perfactkiado.hu

Tarralern

III

Tartalom

Bevezetés

Változó változók
l l 2 2 2 3 4 5 5 6 6 7 7

21 21 22 22 23 23 23 25 26 26 27 28

Miért érdemes elolvasni a könyvet? Mit tanulhatunk a könyvből? Mi a PHP? Mi a MySQL? Miért használjunk PHP-t és MySQL-t? A PHP legfőbb erősségei Melyek a PHP 5 újdonságai? A PHP 5.3 főbb jellemzői A MySQL legfőbb erősségei Támogatás elérhetősége Melyek a MySQL 5 újdonságai? Hogyan épül fel a könyv? Végezetül
I. rész A PHP használata l. fejezet PHP gyorstalpaló

Állandók deklarálása és használata Változók hatóköre Műveleti jelek használata Aritmetikai műveleti jelek Karakterláncokon alkalmazható műveleti jelek Értékadó műveleti jelek Összehasonlító műveleti jelek Logikai műveleti jelek Bitműveleti jelek Egyéb műveleti jelek Az űrlap végösszegének kiszámítása Műveletek elsőbbségi sorrendje és a csoportosíthatóság Változókhoz kapcsolódó függvények Változók típusának ellenőrzése és beállítása

29 30 30 31 31 31 32 34 35 37 38 38 38

9

Változók állapotának ellenőrzése Változók típuskonverziója Döntéshozatal feltételes utasításokkal

ll ll 12 12 13 13 14 15 15 15 16 16 17 17 17 19 19 20 20 20 20 21

Kódblokkok A különböző feltételes utasítások összehasonlítása Műveletek ismétlése iterációval
Kiugrás vezérlési szerkezetből vagy kódból

Kezdés előtt: a PHP elérése Mintaalkalmazás létrehozása: Bob autóalkatrészek Rendelési űrlap létrehozása Az űrlap feldolgozása PHP beágyazása HTML-be PHP címkék PHP utasítások Fehérköz karakterek Megjegyzések Dinamikus tartalom hozzáadása Függvényhívások A da te ( ) függvény használata Az űrlapváltozók elérése Rövid, közepes és hosszú változók Karakterláncok összefűzése Változók és literálok Az azonosítók Változótípusok A PHP adattípusai Típuserősség foka Típuskényszerítés

Alternatív vezérlési szerkezetek alkalmazása A dec l a re szerkezet használata Hogyan tovább?
2. fejezet

Adatok tárolása és visszakeresése

39 39 39 40 40 40 41 42 43 44 44 44 45

Adatok elmentése későbbi használat céljából Bob megrendeléseinek el tárolása és visszakeresése Fájlok feldolgozása Fájl megnyitása A megfelelő megnyitási mód kiválasztása
Eijl megnyitása az fopen() függvénnyel

Fájlok megnyitása FTP-n vagy HTTP-n keresztül Fájlmegnyitási problémák kezelése Fájlba írás Az fwri te ( ) függvény paramécerei Fájlformátumok Fájl bezárása

IV

Tartalom

Olvasás fájlból Fájl megnyitása olvasásra: fopen () Ahol meg kell állnunk: feof()

47 48 48

Tómbön belüli navigálás: each(),current (),reset (),
end(),next (),pos

( ) és p rev() függvény

69

Függvény alkalmazása tömb minden egyes elemére: arra y_
walk()

Beolvasás soronként: fgets() , fgetss() és fgetcsv ()
48

69

Tömbelemek számlálása: count(),sizeof () és array_
count_values

A teljes fájl beolvasása: readfile(), fpassthru () és file() Karakter beolvasása: fgetc () Tetszőleges mennyiségü adat beolvasása: freact() Egyéb hasznos fájlfüggvények Fájl meglétének ellenőrzése: file_exists () Fájlméret meghatározása: fil esi z e() Fájl törlése: unlink() Fájlon belüli navigálás: rewind(), fseek () és ftell ( )
50 49 49 50 50 50 50 50 4.

()függvény

70 70 71 71

Tómbök átalakítása skaláris változókká: extract () További olvasnivaló Hogyan tovább?

fejezet
73

Karakterláncok kezelése és reguláris kifejezések
Mintaalkalmazás létrehozása: intelligens üzenetküldő űrlap Karakterláncok formázása függvény Karakterláncok formázása megjelenítés céljából Tárolni kívánt karakterláncok formázása: és stripslashes () függvény

73 75

Fájlok zárolása Egy jobb módszer: adatbázis-kezelő rendszerek Hogyan oldják meg a relációs adatbázis-kezelő rendszerek ezeket a problémákat? További olvasnivaló Hogyan tovább?
3.

51 52

Karakterláncok megvágása: tr im(),ltrim () és rtrim()
75 75

Egyszerű fájlok használata esetén jelentkező problémák 52
52 53 53

addslashes ()

78

Karakterláncok egyesítése és felosztása sztringkezelő függvényekkel Az explode(),implode () és j oin ()függvény használata
79

fejezet
55 55 56 56 56 57 57 57 57 58 59 59 62 62

79 79 80 80

Tömbök használata
Mit nevezünk tömbnek? Numerikusan indexelt tömbök Numerikusan indexelt tömbök létrehozása Tömb tartalmának elérése Tömbelemek elérése ciklusokkal Nem numerikusan indexelt tömbök Tömb inicializálása Tömbelemek elérése Ciklusok használata Tömbműveleti jelek Többdimenziós tömbök Tömbök rendezése A sort() függvény használata Tömbök rendezéseasort () és ksort () függvényekkel Fordított rendezés Többdimenziós tömbök rendezése Felhasználó által meghatározott rendezés Fordított sorrendbe történő felhasználói rendezés Tömbök átrendezése A shuffle ()függvény használata Az array_reverse ()függvény használata Tömbök feltöltése fájlokból További tömbkezelési eljárások

Az strtok ()függvény használata A substr ( ) függvény használata Karakterláncok összehasonlítása Karakterláncok sorba rendezése: strcmp(),
strcasecmp ( )

és strnatcmp() függvény
az

80

Karakterlánc hosszának megállapítása függvénnyel

strlen ()

81

Részsztringek keresése és cseréje sztringkezelő függvényekkel Karakterláncok keresése karakterláncban: strstr(),
strchr (),strrchr stristr

81

( ) és
82

() függvény

Részszering pozíciójának megkeresése: strpos () és
strrpos()

82

Részsztringek cseréje: str_replace ( ) és substr_
62 63 63 63 64 64 65 66 66 68
replace() függvény

83 83 84 84 85 85 85 85 86 86

Ismerkedés a reguláris kifejezésekkel Az alapok Karakterkészletek és -osztályok Ismétlődés Részkifejezések Számolt részkifejezések Karakterlánc elejéhez vagy végéhez rögzítés Ágaztatás Literális különleges karakterekhez illesztés

Tartalom

v

A különleges karakterek áttekintése Az eddig tanultak alkalmazása az intelligens űrlapban Részsztringek keresése reguláris kifejezésekkel Részsztringek cseréje reguláris kifejezésekkel Karakterláncok szétbontása reguláris kifejezésekkel További olvasnivaló Hogyan tovább?
5. fejezet

86 87 87 88 88 88 88

Osztálypéldányok létrehozása Osztályattribútumok használata Hozzáférés-szabályozás private és public kulcsszóval Osztálymetódusok hívása Öröklődés megvalósítása PHP-ben Láthatóság szabályozása öröklődés esetén a pr i vate és a proteeted kulcsszóval Felülírás

110 110

112 112 113

113 114

Kód többszöri felhasználása és függvényírás

89 89 89 89 90 90 90 91

Öröklődés és felülírás megakadályozása a final kulcsszóval A többszörös öröklődés Interfészek megvalósítása Osztálytervezés Az osztály kódjának megírása Haladó objektumorientált funkciók PHP-ben Osztályon belüli kanstansok használata Statikus metódusok létrehozása Osztálytípus ellenőrzése és típusjelzés Késői statikus kötések Objektumok klónozása Elvont osztályok használata Metódusok többszörös definiálása a -call() metódussal Az_autoleact {) függvény használata Iterátorak és iteráció létrehozása Osztályaink átalakitása karakterláncokká A Reflection API használata Hogyan tovább?
7. fejezet 115 116 116 117 117 124 124 124 125 125 126 126

Kód többszöri felhasználásának előnyei Költség Megbízhatóság Egységesség
A require ( ) és az include () utasítás használata Fájlnévkitetjesztések és a require {) utasítás

A require {) urasírás használata weboldalsablonokra
Az auto_prepend_file és beállítás használata
az

auto_append_file 95 96 96 97

Függvények használata PHP-ben Függvényhívás Nem létező függvény hívása Kis- és nagybetűle megkülönböztetése függvénynevekben Saját függvények definiálása Függvények alapszerkezete Függvényeink elnevezése Paraméterek használata A hatókör fogalma Cím és érték szerinti paraméterátadás A return kulcsszó használata Értékvisszaadás függvényekből Rekurzió megvalósítása Névterek További olvasnivaló Hogyan tovább?
6. fejezet

97 97 98 98 99 100 102 103 103 104 105 105 106

126 127 127 129 129 130

Hiba- és kivételkezelés

131 131 132 133

Kivételkezelési fogalmak Az Exception osztály Felhasználó által meghatározott kivételek Kivételek és a PHP további hibakezelő mechanizmusai

Kivételek Bob autóalkatrész-értékesítő alkalmazásában 135
138 138 138

Objektumorientált PHP

107

További olvasnivaló Hogyan tovább?

Ismerkedés az objektumorientált programozás fogalmaival Osztályok és objektumok Többalakúság Öröklődés Osztályok, attribútumok és metódusok létrehozása PHP-ben Osztályszerkezet Konstruktorok Destruktorok
109 109 109 110 107 107 108 108

II. rész A MySQL használata 8. fejezet 139

Webes adatbázis megtervezése

141 141 141 142

Relációs adatbázissal kapcsolatos fogalmak Táblák Oszlopok

VI

Tartalom

Sorok Értékek Kulcsok Sémák Kapcsolatok Webes adatbázis megtervezése Gondoljuk végig a modellezett, valós világbeli objektumokat! Redundáns adatok tárolásának elkerülése Atomi oszlopértékek használata Válasszunk értelmes kulcsokat! Gondoljuk végig, rnit szeretnénk az adatbázisból megtudnil Kerüljük a sok üres tulajdonságot tartalmazó kialakítást! Táblatípusok összefoglalása Webes adatbázis architektúrája További olvasnivaló Hogyan tovább?
9. fejezet

142 142 142 143 143 144 144 144 145 146 146 146 147 147 148 148

10. fejezet

Munkavégzés MySQL adatbázisunkkal

165

Mi az SQL? Adatok beszúrása adatbázisba Adatok visszakeresése adatbázisból Adott feltételeknek megfelelő adatok visszakeresése Adatok visszakeresése több táblázatból Adatok visszakeresése meghatározott sorrendben Adatok csoportosítása és összesítése V isszakapni kívánt sorok kiválasztása Egymásba ágyazott lekérdezések használata Adatbázisban lévő rekordok frissítése Táblák megváltoztatása létrehozásuk után Rekordok törlése adatbázisból Táblák törlése Teljes adatbázis törlése További olvasnivaló Hogyan tovább?
ll. fejezet

165 165 167 168 169 173 173 175 175 177 177 179 179 179 179 179

MySQL adatbázis elérése a webről PHP-vel
149

181

Webes adatbázis létrehozása

Hogyan működnek a webes adatbázis-architektúrák? Adatbázis lekérdezése a webről A felhasználótól érkező adatok ellenőrzése és szűrése Kapcsolat létrehozása A használni kívánt adatbázis kiválasztása Az adatbázis lekérdezése A lekérdezés eredményeinek visszakeresése Kapcsolat bontása az adatbázissal Új információ felvitele az adatbázisba Előfordított utasítások használata Egyéb PHP adatbázis-illesztések használata További olvasnivaló Hogyan tovább?
12. fejezet

181 184 184 184 185 185 186 187 187 189 190 192 192

A MySQL monitor használata Bejelentkezés MySQL-be Adatbázisok és felhasznáJók létrehozása Felhasználók és jogosultságok beállítása A MySQL jogosuJtsági rendszerének bemutatása A legkisebb jogosultság elve Felhasználó beállítása: a GRANT parancs Jogosultságok típusai és szintjei A REVOKE parancs Példák a GRANT és a REVOKE használatára Webes felhasználó beállítása A megfelelő adatbázis használata Adatbázistáblák létrehozása A többi kulcsszó jelentésének megismerése Az oszloptípusok Az adatbázis megtekintése a SHOW és a DESCRIBE paranccsal Indexek létrehozása MySQL azonosítók Oszlopok adattípusainak kiválasztása Numerikus típusok Dátum és idő típusok Karakterlánc-típusok További olvasnivaló Hogyan tovább?

150 150 151 151 151 151 151 152 154 154 155 155 156 157 157 159 159 160 160 160 162 162 164 164

Altalános adatbázis-illesztés használata: PEAR MDB2 190

Haladó MySQL-adminisztráció

193

A jogosultsági rendszer alaposabb megismerése A user tábla A db és a host tábla A tables_pr�v, a colurnns priv és a
-

193 194 195 196 197 197 198 198

procs_priv tábla

Hozzáférés-szabályozás: Hogyan használja a MySQL a jogosuJtsági táblákat? Jogosultságok frissítése: Mikor lépnek életbe a változtatások? MySQL adatbázisunk biztonságossá tétele MySQL az operációs rendszer szemszögéből

Tartalom

VII

Jelszavak Felhasználói jogosultságok Webes kérdések További információk begyűjtése az adatbázisokról lnformációszerzés a SHOW utasítással A lekérdezések működésének megismerése az EXPLAIN utasítással Adatbázisunk optimalizálása Optimálisra tervezés Jogosultságok Táblaoptimalizálás lndexek használata Alapértelmezett értékek használata További tippek Biztonsági mentés készítése MySQL adatbázisunkról MySQL adatbázisunk helyreállítása Replikáció megvalósítása A master kiszolgáló beállítása A kezdeti adatátvitel megvalósítása A slave kiszolgáló vagy kiszolgálók beállítása További olvasnivaló Hogyan tovább? 13. fejezet Haladó MySQL-programozás A LOAD DATA INFILE utasítás Tárolómotorok Tranzakciók Tranzakciók használata InnoDB táblákkal Külső kulcsok Tárolt eljárások Alappélda Helyi változók Kurzorok és vezérlési szerkezetek További olvasnivaló Hogyan tovább? III. rész E-kereskedelem és biztonság 14. fejezet E-kereskedelmi honlap üzemeltetése Mi a célunk? Az üzleti weboldalak típusai Fontos információ közzétételének elmulasztása Termékekre vagy szolgáltatásokra irányuló rendelések

198 198 199 199 199

felvétele Szolgáltatások vagy digitális termékek értékesítése Többletérték hozzáadása termékekhez vagy szolgáltatásokhoz Költségcsökkentés Kockázatok és veszélyforrások megismerése Crackerek A kívánt üzleti eredmény elmaradása Számítógépes hardverhibák Elektromos, kommunikációs vagy hálózati hibák Erős verseny Szaftverhibák Változó szabályozási környezet és adójogszabályok Rendszer-kapacitásbeli korlátok A megfelelő stratégia kiválasztása Következő lépések 15. fejezet Az e-kereskedelem biztonsági kérdései A birtokunkban lévő információ fontossága Biztonsági fenyegetések Bizalmas adataink kitettsége Adatvesztés vagy -rongálás Adatmódosítás Denial of Service támadás

223 226 226 227 227 227 228 228 228 228 228 229 229 229 229

lnformációszerzés oszlopokról a DESCRIBE utasítással 201 201 205 205 205 205 205 205 205 206 206 206 207 207 208 208 208

231 231 232 232 233 234 234 235 235 236 236 237 238 239 239 239 240 240 241 242 242 242 242 242 243

209 209 209 210 210 211 212 212 214 214 217 217

Szaftverhibák Le tagadás Használhatóság, teljesítmény, költség és biztonság Biztonsági házirend létrehozása A felhasználói hitelesítés alapelvei A titkosítás alapjai Privát kulcsú titkosítás Nyilvános kulcsú titkosítás Digitális aláírások Digitális tanúsítványok Biztonságos webszerverek Auditálás és naplózás Tűzfalak Biztonsági mentés készítése az adatokról Biztonsági mentés készítése általános fájlokról

A tranzakciókkal kapcsolatos definíciók megismerése 210

219

MySQL adatbázisunk biztonsági mentése és helyreállítása Fizikai biztonság

221 221 221 222

Hogyan tovább? 16. fejezet Webes alkalmazások biztonsága Biztonságkezelési stratégiák Megfelelő gondolkodásmód már a tervezéstől

Céges információ megjelenítése online katalógusként 221

245 245 245

VIII

Tartalom

A biztonság és a használhatóság közötti egyensúly keresése Biztonsági felügyelet Alapvető megközelítésünk A ránk váró fenyegetések azonosítása Bizalmas adatok elérése vagy módosítása Adatvesztés vagy -rongálás Denial of Service támadás Rosszindulatú kód befecskendezése Feltört szerver Kikkel állunk szemben? Crackerek Fertőzött gépek tájékozatlan felhasználói Elégedetlen alkalmazottak Hardvertolvajok Saját magunk Kódunk biztonságossá tétele Felhasználó által bevitt értékek szürése A kimenet értékeinek szürése védőkarakterekkel Kódjaink szervezése Mi kerül a kódunkba? A fájlrendszerrel kapcsolatos, megfontolandó szempontok A kód stabilitása és kódhibák Végrehajtó operátor és az
ex ee

17. fejezet 245 246 246 246 246 247 247 247 248 248 248 248 248 248 248 249 249 252 253 254 254 255 18. fejezet
Biztonságos tranzakciók végrehajtása PHP-vel és MySQL-lel Hitelesítés megvalósítása PHP-vel és MySQL-lel

265 265 266 267 269 270 270 271

Látogatók azonosítása Hozzáférés-szabályozás megvalósítása Jelszavak tárolása Jelszavak titkosítása Több oldal védelme Alapszintű hitelesítés használata Alapszintű hitelesítés PHP-ben Alapszintű hitelesítés az Apache
.

htaccess fájljaival 272 275 275 275 276 276 276

A mod_auth_mysql hitelesítés használata Amod_auth_mysql modul telepítése A mod_auth_mysql modul használata Egyéni hitelesítési folyamat létrehozása További olvasnivaló Hogyan tovább?

277 277 278 278 279 280 282 282 283 283 283 285 289 289

Biztonságos tranzakciók megteremtése A felhasználó gépe Az internet Saját rendszerünk A Secure Sockets Layer (SSL) protokoll használata Felhasználói bevitel szürése Biztonságos tárolás megvalósítása Hitelkártyaadatok tárolása T itkosítás használata PHP-ben A GPG telepítése A GPG tesztelése További olvasnivaló Hogyan tovább? IV. rész
Haladó PHP-módszerek

parancs

255 256 256 257 258 258 259 259 260 260 260 261 261 261 262 262 262 262 263 263 263

Webszerverünk és a PHP biztonságossá tétele Tartsuk szaftvereinket naprakészen! A php. ini fáj l tartalma A webszerver konfigurálása Webes alkalmazások hasztolása fizetős szolgáltatás igénybevételével Az adatbázisszerverek biztonsága Felhasználók és a jogosuJtsági rendszer Adatküldés a szerverre Kapcsolódás a szerverhez A kiszolgáló futtatása A hálózat védelme Tűzfalak telepítése DMZ használata Felkészülés a DoS és DDoS támadásokra Számítógépünk és az operációs rendszer biztonsága Tartsuk naprakészen operációs rendszerünket! Csak azt futtassuk, amire valóban szükség van! Kiszolgálónk fizikai biztonsága Katasztrófa -elhárítási terv Hogyan tovább?

291

19. fejezet A fájlrendszer és a kiszolgáló elérése Fájlfeltöltés A fájlfeltöltés HT ML kódja A fájlt kezelő PHP kód megírása A gyakori feltöltési problémák megelőzése Könyvtárfüggvények használata Olvasás könyvtárakból lnformációszerzés az aktuális könyvtárról Könyvtárak létrehozása és törlése A fájlrendszer elérése Fájlinformációk gyüjtése 293 293 294 295 298 298 298 301 301 302 302

Tartalom

IX

Fájltulajdonságok módosítása Fájlok létrehozása, törlése és áthelyezése Programfuttató függvények használata Környezeti változók elérése: a getenv () és a putenv () függvény További olvasnivaló Hogyan tovább? 20. fejezet Hálózati és protokollfüggvények használata A használható protokollok áttekintése E-mail küldése és olvasása Más weboldalak tartalmának felhasználása Hálózati keresőfüggvények használata Biztonsági mentés készítése vagy fájl tükrözése Biztonsági mentés készítése vagy fájl tükrözése FTP-vel Fájlfeltöltés Időtúllépés elkerülése További FTP függvények használata További olvasnivaló Hogyan tovább? 21. fejezet Dátum és idő kezelése Dátum és idő megállapítása PHP-ból A date ( ) függvény használata Unix-időbélyegek kezelése A getdate () függvény használata Dátumok ellenőrzése a checkdate ( ) függvénnyel Időbélyegek formázása Váltás PHP és MySQL dátumformátumok között Számolás dátumokkal PHP-ben Számolás dátumokkal MySQL-ben Míkroszekundumok használata Naptárfüggvények használata További olvasnivaló Hogyan tovább? 22. fejezet Képek előállitása Képi támogatás beállítása PHP-ben Képformátumok JPEG PNG WBMP GIF Képek létrehozása Rajzvászon létrehozása

304 304 304 306 306 306

Rajzolás vagy szöveg írása képre Kimenet készítése a kész grafikáról Erőforrások felszabadítása Automatikusan létrehozott képek használata más oldalakon Szöveg és betük használatával létrehozott képek A rajzvászon beállítása A szöveg hozzáigazítása a gombhoz A szöveg elhelyezése

334 335 335 336 336 338 339 341 341 341 342 348 348 348

307 307 307 308 310 313 313 318 318 318 319 319

A szöveg gombra írása Befejezés Ábrák és grafikonadatok rajzolása További képkezelő függvények használata További olvasnivaló Hogyan tovább? 23. fejezet Munkamenet-vezérlés PHP-ben Mi a munkamenet-vezérlés? A munkamenet alapjai Mi a süti? Sütik beállitása PHP-ból Sütik használata munkamenetekkel Munkamenet-azonosító tárolása

349 349 349 349 350 350 350 351 351 351 351 351 352 353 354 359 359

321 321 321 322 323 324 324 326 327 328 329 329 329 329

Egyszerű munkamenetek megvalósítása Munkamenet indítása Munkamenet- változók regisztrálása Munkamenet-változók használata Változók törlése és a munkamenet megszüntetése Egyszerű példa munkamenetre Munkamenet-vezérlés konfigurálása Hitelesítés munkamenet-vezérléssel További olvasnivaló Hogyan tovább? 24. fejezet További hasznos lehetőségek PHP-ben Karakterláncok kiértékelése az ev al () függvénnyel Végrehajtás leállítása: die (} és exit (} Változók és objektumok szerializálása

361 361 361 362 363 363 363 363 364 364 365 365

331 331 332 332 332 332 332 333 333

Információgyűjtés a PHP-környezetről Milyen bővitmények lettek betöltve? A kód tulajdonosának azonosítása A kód utolsó módosítási időpontjának megállapítása A futtatási környezet átmeneti módosítása Forráskód szinkiemelése PHP használata parancssorban Hogyan tovább?

X

Tartalom

V. rész Gyakorlati PHP és MySQL projektek fejlesztése 25. fejezet A PHP és a MySQL használata nagyobb projektekben A szaftverfejlesztés gyakorlatainak alkalmazása webfejlesztésre Webes alkalmazás projektjének tervezése és megvalósítása Kód többszöri felhasználása Kezelhetö kód írása Programozási szabályok Kódunk darabokra bontása Egységes könyvtárstruktúra használata Függvények dokumentálása és megosztása fejlesztői csapaton belül Verziókövetés megvalósítása A fejlesztőkörnyezet kiválasztása Projektjeink dokumentálása Prototípuskészítés A müködés és a tartalom szétválasztása Kódoptimalizálás Egyszerű optimalizációs lépések Zend termékek használata Tesztelés További olvasnivaló Hogyan tovább? 26. fejezet Hibakeresés Programozási hibák Szintaktikai hibák Futásidejű hibák Logikai hibák Hibakeresés a változók tartalmának kiíratásával Hibajelentési szintek A hibajelentési beállítások módosítása Saját hibák kiváltása A hibakezelés elegáns módja Hogyan tovább? 27. fejezet Felhasználói hitelesítés megvalósítása és személyre szabott tartalom megjelenítése A megoldás alkotóelemei Felhasználói azonosítás és személyre szabás A könyvjelzök tárolása Könyvjelzök ajánlása A megoldás áttekintése 391 391 391 392 392 392 379 379 379 380 384 385 387 388 389 389 390 374 374 375 375 375 376 376 376 377 377 378 378 370 370 371 371 373 373 369 369 367

Az adatbázis létrehozása A nyitóoldal létrehozása A felhasználói hitelesítés megvalósítása Felhasználók regisztrálása Bejelentkezés Kijelentkezés Jelszóváltoztatás Elfelejtett jelszó visszaállítása Könyvjelzök tárolása és visszakeresése Könyvjelzök hozzáadása Könyvjelzök megjelenítése Könyvjelzök törlése Könyvjelzök ajánlása A projekt továbbfejlesztésének lehetséges irányai Hogyan tovább? 28. fejezet Kosár funkció programozása A megoldás alkotóelemei Online katalógus létrehozása A felhasznáJók által vásárlás közben megrendelt termékek nyomon követése Fizetési rendszer megvalósítása Adminisztrációs felület programozása A megoldás áttekintése Az adatbázis létrehozása Az online katalógus létrehozása Kategóriák listázása Adott kategória könyveinek listázása A könyv részletes adatainak megjelenítése A kosár funkció megvalósítása A kosar_megjelenitese.php kód használata A kosár megjelenítése Termékek hozzáadása a kosárhoz A módosított tartalmú kosár mentése A fejlécen látható összefoglaló adatok megjelenítése A pénztárnál A fizetés feldolgozása Az adminisztrációs felület megvalósítása A projekt továbbfejlesztése Meglévő rendszer használata Hogyan tovább? 29. fejezet Webalapú levelezöszolgáltatás létrehozása A megoldás alkotóelemei Levelezöprotokollok: a POP3 és az !MAP összehasonlítása POP3 és !MAP támogatása PHP-ben

394 395 396 397 401 404 405 407 411 411 413 414 416 418 418

419 419 419 419 420 420 420 423 425 426 428 430 431 431 433 435 437 437 438 442 444 450 450 450

451 451 451 451

Tartalom

XI

A megoldás áttekintése Az adatbázis létrehozása A kód architektúrájának vizsgálata Be- és kijelentkezés Felhasználói fiókok beállítása Új felhasználói fiók létrehozása Meglévő felhasználói fiók módosítása Felhasználói fiók törlése Levél olvasása Postafiók kiválasztása Postafiók tartalmának megtekintése Levélüzenet olvasása Üzenetfejlécek megjelenítése Üzenet törlése Levélküldés Új üzenet küldése Válaszküldés vagy levél továbbítása A projekt továbbfejlesztése Hogyan tovább? 30. fejezet
Levelezölista-kezelő alkalmazás fejlesztése

452 454 455 460 462 463 464 464 465 465 467 469 472 472 473 473 474 476 476

31. fejezet
Webes fórum fejlesztése

517 517 517 518 519 521 523 525 526 530 532 538 538 538

Gondoljuk végig a feladatot! A megoldás alkotóelemei A megoldás áttekintése Az adatbázis megtervezése A hozzászólások fanézetének megtekintése Kibontás és összecsukás A hozzászólások megjelenítése A
cs

omopont osztály használata

A hozzászólások egyenkénti megtekintése Új hozzászólás írása A projekt továbbfejlesztése Meglévő rendszer használata Hogyan tovább? 32. fejezet
Perszonalízált PDF dokumentumok előállitása

539 539 539 542 542 542 544 545 546 548 550 553 553 556 562 562 562

A projekt áttekintése Dokumentumformátumok összehasonlítása A megoldás alkotóelemei

477 477

Vizsgáztatórendszer A dokumentum-előállító szoftver A megoldás áttekintése A tesztkérdések lekérdezése A válaszok értékelése RTF formátumú oklevél létrehozása PDF formátumú oklevél létrehozása sablonból PDF dokumentum előállitása PDFlib függvényekkel "Helló, világ!" kód PDFlib függvényekkel Az oklevél előállítása PDFlib függvényekkel Fejlécekkel kapcsolatos problémák kezelése A projekt továbbfejlesztése Hogyan tovább? 33. fejezet
Kapcsolódás az Amazon Web Services felülethez XML és SOAP segítségével

A megoldás alkotóelemei A levelezőlisták és a feliratkozott felhasznáJók adatbázisának létrehozása Hírlevelek feltöltése Csatolt állományokat tartalmazó levelek küldése A megoldás áttekintése Az adatbázis létrehozása A kód architektúrájának meghatározása A bejelentkezés megvalósítása Új felhasználói fiók létrehozása Bejelentkezés Felhasználói funkciók megvalósítása Levelezőlisták megtekintése Listainformációk megjelenítése Levelezőlisták archívumának megtekintése Fel- és leiratkozás A felhasználói fiók beállításainak megváltoztatása Jelszavak megváltoztatása Kijelentkezés Adminisztrátori funkciók megvalósítása Új levelezőlista létrehozása Új hírlevél feltöltése Egyszerre több fájl feltöltésének kezelése A hírlevél előnézetének megtekintése A hírlevél kiküldése A projekt továbbfejlesztése Hogyan tovább?

478 478 478 478 480 482 488 488 490 492 493 496 498 499 500 500 502 502 503 504 506 510 511 515 515

563

A projekt áttekintése: XML és a Web Services használata Ismerkedés az XML-lel Web Services A megoldás alkotóelemei Az Amazon Web Services felület használata XML értelmezése: REST válaszok SOAP használata PHP-vel Gyorsítótárazás A megoldás áttekintése Az alkalmazás magja 563 564 566 567 567 568 568 568 568 571

XII

Tartalom

Adott kategóriában lévő könyvek megjelemtése AmazonResultSet objektum lekérése Kérés intézése és az eredmény visszakeresése REST segítségével Kérés intézése és eredmény visszakeresése SOAP segítségével A kérésből származó adatok gyorsítótárazása Vásárlói kosár fejlesztése Fizetés az Amazonnál A projekt kódjának telepítése A projekt továbbfejlesztése További olvasnivaló
34. fejezet Web 2.0-s alkalmazások fejlesztése Ajax-programozással

576 578 585

Ajax elemek hozzáadása a PHPbookmark alkalmazáshoz További információ Bővebben a Document Object Modelről (DOM) JavaScript könyvtárak Ajax alkalmazásokhoz Ajax-fejlesztői weboldalak
A függelék A PHP és a MySQL telepítése Az Apache, a PHP és a MySQL telepítése Unix alatt 621 621 622 622 626 626 627 628 628 629 630 631 632 609 618 618 618 619

591 592 594 597 597 598 598

Bináris fájlok telepítése Forrás telepítése A httpd. conf fájl: kóddarabok A PHP támogatás is működik? Az SSL működik?

599 599 600 600 601 601 602 602 602 602 604 605 606 609

Az Apache, a PHP és a MySQL telepítése Windows alatt A MySQL telepítése Windows alatt Az Apache telepítése Windows alatt A PHP telepítése Windows alatt A PEAR telepítése Egyéb konfigurációk beállítása
B függelék Webes források 633 633 634 634 635

Mi az Ajax? HTTP kérések és válaszok DHTML ésX HTML Cascading Style Sheets (CSS) Kliensoldali programozás Szerveroldali programozás XML ésX SLT Ajax alapok Az XMLHTTPRequest objektum Kommunikáció a szerverrel A kiszolgáló válaszának feldolgozása Tegyük össze az egészet! Ajax elemek hozzáadása korábbi projektjeinkhez

Források a PHP-ről MySQL-lel és SQL-lel foglalkozó források Források az Apache-ról Webfejlesztés

Tartalom

XIII

Szerzők Laura Thomson vezető szoftvermérnök a Mozilla CorporationnéL Korábban az OmniTI
és a Tangled Web Design egyik vezetőjeként tevékenykedett. Rendszeresen dolgozik együtt az RMI T Universiry-vel és a Boston Consuleing GrouppaLAl­ kalmazorc tudományokból (informatika), illerve informatikai mérnöki területen szerzere egyetemi diplomát. Szabadidejében szívesen lovagol, érvel az ingyenes és nyílt forráskódú szoftverek mellett, és nagyon szeret aludni.

Luke Weiling webes fejlesztő az OmniTI-náLA nyílt forráskódú és webes fejlesztésekkel foglalkozó konferenciák, így egye­
bek közöte az OSCON, a ZendCon, a MySQLUC, a PHPCon, az OSDC és a LinuxTag rendszeres előadója.Az OmniTI előtt a webes anaütikával foglalkozó Hicwise.com-nál, az adatbázis-fejlesztő MySQL AB-nál, illetve független tanácsadóként a Tangled Web Designnál dolgozort.Alkalmazott tudományok (informatika) diplomát szerzerc, és informatikát oktatott a Mel­ bourne-i RMI T Universiry-n. Szabadidejében az álmadanságát próbálja meg tökélyre fejleszteni.

Társszerzők Julie C. Meloni a Los Altos-i (Kalifornia) székhelyű i2i I nteractive (www.i2ii.com) multimédiás vállalat műszaki igazgatója.
Az internet megszületése óta fejleszt webalapú alkalmazásokat, és soha nem fogja elfelejteni az első grafikus kezelőfelületű böngészőt övező izgalmakat. Számos könyvec és cikket írt a webalapú programozási nyelvek és az adatbázisok témakörében, amelyek közül érdemes megemliteni a Sams Teach Yourself PHP. MySQL, and Apache Ali in One című kiadványt.

Adam DeFields webes alkalmazásfejlesztésre és projektmenedzsmentre szakosodott tanácsadó.A Michigan állambeli
Grand Rapidsben él, ahol 2002-ben alapított saját cégét irányítja (Emanation Syscems, LLC - www.emanationsyscemsllc. com). Számtalan, különböző technológiára építő webfejlesztési projekeben részt vere, de leginkább a PHP /MySQL alapú fej­ lesztési munkákat kedveli.

Marc Wandschneider szabadúszó fejlesztő, szerző és előadó, aki a világ számtalan különböző pontján dolgozott már érdekes
projektekben. Utóbbi években idejének nagy részét arra fordítja, hogy robusztus és skálázható webes alkalmazásokat fejlesszen. 2005-ben írta Core Web Application Programming with PHP and MySQL című könyvét. Korábban a SWiK (http:/ /swik.net) nyílt forrású közösségi oldal vezető fejlesztője volt. Marc jelenleg Pekingben él, ahol a kínai nyelvet töri, és programoz.

Köszönetnyilvánítás
Szeretnénk köszönetet mondani a Pearson csapatának kemény munkájáért. Külön köszönjük Shelley Johnstonnak, akinek áldozatvállalása és türelme nélkül a könyv első három kiadása nem születhecett volna meg. és Mark Tabernek, aki a negyedik kiadásnál átvette Shelley munkáját. Nagyra értékeljük a PHP- és MySQL-fejlesztői csapatok által végzere munkát. Sok éve könnyícik meg a dolgunkat, és így lesz ez a jövőben is rninden nap. Köszönjük az eSec-nél dolgozó Adrian Close-nak, arniért még 1998-ban azt mondta:.,Ezt meg tudjátok csinálni PHP-ben:' Úgy vélte, szeremi fogjuk a PHP-t, és azt kell mondanunk, igaza lett. Végezetül szeretnénk köszönetet mondani családunknak és barátainknak, akik elviselik antiszociális viselkedésünket, amíg könyveinken dolgozunk. Külön köszönjük Nektek, hogy segítetek családtagjainknak: Julie, Robert, Martin, Lesley, Adam, Paul, Archer és Barton.

A magyar kiadáshoz
A könyv példáinak forráskódja és a melléklecek letölthetők regisztráció után a www.perfacrkiado.hu/melleklecek oldalról. A könyvben használt, jelenleg ingyenes szoftverek szintén letölthetőek weboldalunkról (www.perfacckiado.hu/melleklecek). Érdemes azonban az interneten megkeresni ezen szoftverek frissítéseit, újabb verzióit és azokat használni.

a mai napig meglévő műemléke. amelyek a földtől 34 mérer magasan futva elegáns képet kölcsönöznek az urcáknak. kézzel vágort gránittömbből emelték.Segovia vízvezetéke a római építészet egyik legnagyszerűbb. . és sem cementet. Segoviába. hogy vizet szállítson a ma Sierra de Guadarrama né­ ven ismert hegy lábától az onnan mintegy 18 kilométer távolságra lévő hispániai városba. az időszámításunk szerinti első században épült vezeték feladata az volt. Traianus császár uralkodása alatt. sem kapcsokat nem használtak a tömbök rögzítésére. 278 mérer hosszú szakasza duplasoros boltívekkel rendel­ kezik. A természet és az ember okozta viszontagságoknak kérezer éve ellenálló építmény az emberi ügyesség időrlen példája: a mai napig hozzájárul a város vízellárásához. A vízvezetéknek a város középpontján áthaladó. Az építményt több mint húszezer.

és korábban legalább alapszínten prog­ ramoztak valamilyen modern programozási nyelvben . tervezési és megvalósírási szakaszán: Felhasználók hitelesítése és személyre szabott tartalom a hitelesítés alapján Bevásárlókosaras online bolt .még az alapozó fejezetekben is. Amíg fizikailag nem frissírjük. A könyv első kiadását annak idején azért írtuk meg. akik összetett vagy üzleti weboldal létrehozása szándékával kivánják magas szinten elsa­ játítani a PHP-t és a MySQL-t. A tisztán HTML weboldal stati­ kus tartalma pontosan ilyen .hogy csak olyan PHP könyveket találtunk.akkor a kötet olvasása során gyorsan képbe kerülhetünk. illerve azt. Azt is megmutatjuk.napjaink két legelterjedtebb webfejlesztő eszközének.hogyan lehet az itt megfo­ galmazott elvárásokat PHP-ben és MySQL-ben megvalósítani. A könyv azokat célozza meg. Ezt követően különböző szempontok szerint megvizsgáljuk az elektronikus kereskedelmet és ehhez kapcsolódóan a bizton­ ságot..használata során szerzett minden tudásunkat.ám nem sokat segítenek.ugyanaz marad. hogyan hozzunk létre interaktív weboldalakat . hogy az olvasó saját weboldalán azonnal alkal­ mazza azokat. A könyv azon olvasóknak szól. Megpróbáltunk egyetlen alapfogalmat sem kihagyni. és átrágjuk magunkat a PHP és a MySQL különböző területein. vagyis testre szabhatóvá és valós idejű információkban gazdaggá tehetjük oldalainkat.esetleg interaktív Web 2.0-s oldal.hogy . illerve a MySQL. amelyek függvények referenciagyűjteményeként szolgáltak.mert elegünk volt abból. Ha olyan nyelvet és adatbázist használunk. Az ilyen kiadványok is hasznosak.és végigmegyünk az alább felsorolt projektek előkészítési. de nekik kicsit tovább tarthat az itt leírtak megemésztése. készíts nekem bevásárlókosaras online boltot': Ebben a könyvben minden tőlünk telhetőt megrettünk.a való világból vett alkalmazásokat. Számtalan kód készen áll arra. akik legalább a HTML alapjaival tisztában vannak. minden bizonnyal beleütköztünk már ennek a megközelítésnek a korlátaival. hogy hasznos példákkal álljunk elő. mint a PHP.képesek leszünk valóban dinamikus weboldalakat építeni. Ráadásul rnindezt nyílt forráskódú technológiák használatával tanuljuk meg előállítani. A bevezetésben az alábbiakról lesz szó: Miért érdemes elolvasni a könyvet? Mire leszünk képesek a könyv segítségéve!? Mi a PHP és a MySQL.amikor a főnök vagy az ügyfél azt kéri. hogy miként jönnek ezek elő valódi weboldal elkészítésekor. Látogatói semmilyen interaktív módon nem léphernek kapcsolatba az oldallal. Kezdő programozók is minden bizonnyal hasznosnak fogják találni a kötetet.legyen az a legegyszerűbb rendelési űrlap vagy össze­ tett.ám viszonylag gyorsan vesszük át őket. Kezdésképpen árteleintünk egy egyszerű online rendelési rendszert.vagy dol­ goztak már relációs adatbázissal. A könyv utolsó részében áttekintjük. Amennyiben dolgoztunk már más webfejlesztő nyelvvel. Ha készítettünk már honlapokat egyszerű HTML használatával. biztonságos e-kereskedelmi portál.és miért olyan nagyszerűek? Mi változott a PHP és a MySQL legutolsó verzióiban? Hogyan épül fel a könyv? Vágjunk bele! Miért érdemes elolvasni a könyvete Könyvünk megranírja. Mit tanulhatunk a könyvböH Ha elolvassuk. A könyvben szándékosan használunk .statikus. dinamikussá.rnig a többi apróbb módosítások után lesz használható.még ha az nem is feltétlenül internetes programozás volt-. hogyan érdemes közelíreni az igazi projektekhez.Bevezetés Köszöntjük a PHP és MYSQL webfejlesztöknek című kiadványunk olvasóit! Könyvünk oldalaiba igyekeztünk belesűríteni a PHP és a MySQL.

php.2 B evezetés Webalapú levelezőalkalmazás Levelezőlista-kezelök Online fórumok PDF dokumentumok előállítása Webszolgáltatások XML-lel és SOAP-pal Web 2. A világ legnépszerűbb nyílt forráskódú adatbázisa. illetve a nyelv néhány jelentős javítása jellemzi. és most a PHP Hypertext Preprocessor (PHP hiperszöveg előfeldolgozó) kifejezés rövidítését jelenti.com címen érhető el.) A PHP nyílt forráskódú projekt. Strukturált lekérdező nyelvet (Structured Query Language. A PHP jelenlegi fő változata az 5-ös. Rasmus Lerdorf munkája volt. módo­ síthatja.net címen érhető el. Ezért a MySQL röbbfelhasználós. és eredetileg egyetlen ember. A MySQL 1996 óta elérhető a nyilvánosság számára.php. és négy jelentős újraíráson ment keresztül. illetve terjesztheti azt. A HTML oldalakba az oldal minden egyes megnyi­ tásakor lefutó PHP kódot ágyazhatunk. A PHP erederileg a Personal Home Page (személyes honlap) rövidítése volt. hogy csak a jogosult Felhasználók szerezhetnek hozzáférést. nem rninden webszerver támogatja az összes programozási nyelvet stb. Amennyiben elfogadjuk a nyílt forráskódú licenc (a GPL) feltételeit. A PHP kód értelmezése a webszerveren történik. (A PHP terjedésének aktuális állását a http://www. de fejlesztési története 1979-ig nyúlik vissza. szerveroldali szkriptnyelv. MiaPHP� A PHP kifejezetten az internetre kifejlesztett.0-s alkalmazás létrehozása Ajaxszal Ezen projektek rnindegyike a könyvben megtalálható állapotában is működik. fizetős licencet kell vásárolnunk. A könyv ugyanakkor ezektől eltérő igények esetén is nagy segítséget jelenther céljaink elérésében. a szabványos adatbázis-lekérdező nyelvet használja. amíg elérkeztünk a jelenleg széles körben hasz­ nálható. gyorsabb hozzáférést kínál hozzájuk.php oldalon tekinthetjük meg.zend. júliusi adatok szerint világszerte több mint 21 millió domaínre telepíterték. hogy bárki hozzáférher a forráskódhoz. . számralan termék közül választhatunk Az alábbi kategóriákban kell döntést hoznunk: A webszervert futtató hardver Operációs rendszer A webszerver szoftvere Adatbázis-kezelő rendszer Programozási vagy szkriptnyelv Az egyes választások összefügghetnek egymással. többszálú kiszolgáló. Azért ezekre esett a választásunk.SQL). ingye­ nesen használhatjuk. relációs adatbázis-kezelő rendszer (angol rövidítéssel RDBMS). azaz a Gnu nem Unix) elfogadásával együtt ez is megválrozort. srabil. rendezését és kinyerését. ami a látogató által megtekinthető HTML-t vagy egyéb kimenetet hoz létre. A PHP honlapja a htrp://www. A PHP első verziója 1994-ben készült el. mert meglárásunk szerint ezek tartoznak a programozók által leg­ gyakrabban fejlesztert webes alkalmazások közé. ami azt jelenti. Ha MySQL-t tartalmazó nem GPL alkalmazást kívánunk terjeszteni. Ezt a verziót a nyelv mögött álló virtuális gép. A MySQL honlapja a http://mysql. és garan­ tálja. és ez a szám igen gyorsan nő. érett termékhez. Más tehetséges emberek is elkezdtek dolgozni vele. de természetesen egyéni igényeinknek meg­ felelően módosíthatók.net/usage. 2007. és ingyenesen használhatja. hogy egyidejűleg többen is használhassák az adatokat. MiaMySQU A MySQL egy nagyon gyors. A Zend Technologies weboldala a http://www. A MySQL kettős licencelési rendszerben érhető el. Például nem mindegyik operációs rendszer fut bármilyen hardveren. A MySQL kiszolgáló az adatokhoz való hozzáférést szabályozva biztosítja. amely számtalan alkalommal elnyerte a Linux Journal szaklap "Readers' Choice Award" -ját (Ol­ vasóink választása díját). de a GNU rekurzív rövidítésének (GNU= Gnu's Not Unix.com. Az adatbázis lehetövé teszi az adatok hatékony tárolását. a Zend motor teljes újraírása. Miért használjunk PHP�t és MySQL�t� Ha weboldalfejlesztésre adjuk a fejünket. keresését.

A MySQL-en túlmenően közvetlenül kapcsolódhatunk egyebek között PostgreSQL. XML-t értelmezzünk. Hyperwave. amelyek közül a legfontosabbak: Teljesítmény Skálázhatóság Csatlakozási lehetőség (interfész) számtalan különböző adatbázisrendszerhez Beépített könyvtárak a leggyakoribb webes feladatokhoz Alacsony költség Egyszerű elsajátíthatóság és használhatóság Objektumorientált programozás széles körű támogatása Hordozhatóság (platformfüggetlenség) A fejlesztői megközelítés rugalmassága Hozzáférhető forráskód Hozzáférhető támogatás és dokumentáció Fejtsük ki ezeket az erősségeket kicsit bövebben is! Teljesítmény A PHP nagyon gyors. a Ruby (Rails keretrendszeren vagy másként). sőt a kisebbek közül is sok rendszeren használható. lnterBase és Sybase adatbázisokhoz. ám ezeket egyértelműen megjelölik a kézi­ könyvekben. A PHP legfőbb erősségei A PHP elsődleges versenytársai a Perl. hogy operációs rendszerektől és webszerverektől függetlenül futtatható legyen. amely következetes hozzáférést tesz lehetövé. hogy menet közben állítsunk elő képeket. vagy PDF dokumeorumokat hozzunk létre. e-mailt küldjünk. A PHP 5-ös verziója SQLite nevű. számtalan beépített függvénnyel rendelkezik a különféle. dbm.zend.. A PHP és a MySQL egyik legnagyszerűbb tulajdonsága. olcsó szervert használva is több millió letöltése szolgálhatunk ki naponta. hogy hatékonyarr és olcsón. Oracle. a Microsoft ASP. internettel kapcsolatos feladatok elvégzésére. Sok egyéb mellett a Microsoft-termékek tartoznak ide. A PHP kódok nagy része megírható úgy. amikor ilyennel dolgozunk. Mindössze néhány sornyi kódra van szükség ahhoz.NET.com) által publikált összehasonlító adatok alapján a PHP nagyobb teljesítményre képes versenytársainál. azaz egy PHP adatbázis-objektumok nevű adatbázis­ absztrakciós réteg is tartozik. és elősegíti a biztonságos programozási megoldások használatát. webes vagy egyéb hálózati szolgáltatásokhoz kapcsoló<ljunk. lnformix. Ez azt jelenti. és mi is jelezzük. Ezekkel összehasonlírva a PHP-nak számos erőssége van. sütikkel (cookie-kkal) dolgozzunk.megosztott elem nélküli" (shared-nothing) archicektúrával rendelkezik. akár belépő szintű szerverekkel is lehet horizontálisan bővíteni. operációs rendszert és webszervert válasszunk is. beépített SQL felülettel rendelkezik az egyszerű fájlokhoz.Bevezetés 3 Ebben a könyvben alig foglalkozunk a hardverrel. A PHP-hoz a natív könyvtárak mellett PHP Database Objects (PDO). Adatbázis-integráció A PHP számos adatbázisrendszerhez tud natív módon kapcsolódni. hogy minden fő operációs rendszeren. Skálázhatóság A PHP-Rasmus Lerdorf szavaival élve-. az operációs rendszerekkel vagy a webszerver szaftveréveL Nincs rá szük­ ségünk. Egyes PHP függvények az operációs rendszertől függö fájlrendszerhez kötődnek. Még egyszerű. ODBC driverrel rendelkező adatbázishoz kapcsolódhatunk. Open Database Connectivity Standard (ODBC). Akármilyen hardvert. Beépített könyvtárak Mivel a PHP-t interneten való használatta alakították ki. vagyis nyílt adatbázis-kapcsolás használatával bármilyen. szeriotünk mindenképpen érdemes a PHP és a MySQL mellett dönteni. . A Zend Technolo­ gies (http://www. FilePro. DB2. aJavaServer Pages (JSP) és a ColdFusion.

A PHP-dokumentáció és -közösség érett és gazdag információforrás. A fizetős. megosztásta váró tartalommal bír. Melyek a PHP 5 újdonságai� A felhasznáJók többsége minden bizonnyal nemrégiben váltott a PHP valamelyik 4. Attól sem kell tartani. Forráskód A PHP forráskódja hozzáférhető.például Model-View-Controller (MVC) mintára. Néhány kevésbé gyakori fUnkciót is találunk. amely rengeteg. nyugodtan megtehetjük.com) a kereskedelmi alapon kínált támogatásból és kapcsolódó szoftverekböl fedezi a PHP fejlesztéseit.4 Bevezetés Költség A PHP ingyenes. Aki tanult már Javában vagy C++-ban progra­ mozni. továbbfejlesztett objektumorientált támogatás (lásd az Objektumorientált PHP című 6. Ha már ismerjük ezeket vagy olyan C-szerű nyelveket.net oldalról. fizetős Unix-változatokra-például Solaris és IRIX rendszerekre-. PHP kódot írhatunk olyan ingyenes Unix-szerű operációs rendszerekre. Legfrissebb változata bármikor letölthető a http:/ /www. az adatfolyamok jobb támogatása és az SQLite hozzáadása. de az 5-ös változatban sokkal teljesebb lett az objektumorientált támogatás. fejezetet!) SimpleXML az XML adatok könnyű kezelhetőségéért (lásd a Kapcsolódás webszolgáltatásokhoz XML és SOAP haszná­ latával című 33. Mindezek egy része már a PHP 3-as és 4-es verzi­ ójában is elérhető volt. elsödlegesen a C-re és a Perire épül. mint a C++ vagy a Java. mint a Linux és a FreeBSD. Ahogy egy új föverziótól elvárható. a várt fUnkciókkal (és általában a várt szintaktikával) fog találkozni. Egyszerű megtanulhatóság A PHP szintaktikája más programozási nyelvekre. ide sorolhatjuk például az iterátorokat. Hordozhatóság (platformfüggetlenség) A PHP számtalan operációs rendszeren elérhető. a Zend Technologies {www. . míg a gyártó megjelenteti a javítá­ sokat. A leg­ fontosabb új jellemzök a következők: Teljesen új objektummodell köré épített.php. vagy hozzáadnánk valamit a nyelvhez. Nem kell várnunk. vagy úgy dönt. Támogatás és dokumentáció elérhetősége A PHP-t működtetö motor mögött álló cég. amely tervezési mintákra . De ugyanilyen könnyen szolgálja nagy alkalmazások olyan megvalósírását is. ha szeretnénk módosítani valamit a PHP-n. abbahagyja a termék támogatását.x verziójáról PHP 5-re. OS X-re vagy a Microsoft Windows különbözö változataira. ez is jelentős változásokat tartalmaz. Objektumorientált programozás támogatása A PHP 5-ös verziója jól kialakított objektumorientált fUnkciókkal rendelkezik. interfészekket konstruktorokkal és destruktorokkal. fejezetet!) A további változtatások közé tartozik egyes kiterjesztések áthelyezése az alapértelmezett PHP-telepítésböl a PECL könyv­ tárba.épülö keretrendszer használatával történik. hogy a gyártó felhagy az üzlettel. akkor szinte azonnal eredményesen tudjuk használni a PHP-t is. A PHP mögött álló Zend motort áórták ehhez a verzióhoz.zend. fejezetet!) Kivételek a skálázható. Például öröklésset privát és védett tulajdonságok­ kal és metódusokkal. zárt forráskódú termékekkel ellentétben. A jól megítt kódok jellemzöen módosítás nélkül működnek a PHP-t fUttató különbözö rendszereken. A fejlesztői megközelítés rugalmassága A PHP lehetövé teszi az egyszerű feladatok egyszerű megvalósítását. fenntartható hibakezeléshez { lásd a Hiba.és kivételkezelés című 7. absztrakt osztályokkal és metódusokkal.

com/ why-mysql/benchmarks címen érhetjük el. közrük a következőkkel: Nagy teljesítmény Alacsony költség Egyszerű kanfigurálhatóság és elsajátíthatóság Hordozhatóság (plarformfüggetlenség) Forráskód elérhetősége Támogarás elérhetősége Tekintsük át most ezeket az erősségeket kicsit részleresebben is! A MySQL elsődleges versenytársai a PostgreSQL.net/language.php A libmysql-t felváltó MySQLnd driver támogatása.php. hogy a MySQL nagyságrendekkel gyorsabb versenyrársainál.phar A lileinfo kiterjesztés támogatása a jobb fájlkezelés érdekében.3 funkciói közül sorolunk fel néhányat.lileinfo. a Microsofr SQL Server és az Oracle. jobb memóriakezelés a Zend motorban) és hibajavítások • A PHP 5.sqlire3. ugyanakkor a verzió a már korábban is meglévő funkciókon végzett számos hibajavítással. . frissítéssei is büszkélkedhet: A Windows 2000-nél régebbi Windows-verziók (például Windows 98 and NT 4) támogatásának megszüntetése A PCRE.php.és időfüggvények hozzáadása A crypt(). további információ: http://forge. A fejlesztök benchmark. egyebek közöte jobb hibajelentésekkel A Zend motor finomhangolásának folytatása a gyorsabb PHP-futási sebesség és memóriahasználar érdekében A MySQL legfőbb erősségei A MySQL számos erősséggel bír.net/ manual/en/class. további információért lásd: http://www. további információért lásd: http://www. Az értékek nagy része azt mutatja.php A phar kirerjesztés támogatása beépített PHP tömörítő alkalmazás létrehozására.com/wiki/PHP_MYSQLND A fenti lista a PHP 5.net/book.net/ manual/ en/intro.3 szélesebb körben ismert új funkcióit tartalmazza. akkor természetesen bárme­ lyik nekünk tetsző verziót relepíthetjük). A következőkben a PHP 5.azaz viszonyírási értékeket mutató.php A sqlire3 kirerjesztés támogatása a SQLite beágyazható SQL adatbázismoror használatához. Teljesítmény A MySQL vitathatatlanul gyors.és időkezelés Számos frissített klienskönyvtár.php. php. hash() és md5() funkció müködésének. további információért lásd: http://www. hogy a hosting szolgálratók telepíteni kezdjék (ha mi magunk kezeljük a szerverünket. Reflection és SPL kiterjesztés állandó elérhetőségének biztosítása A dátumokkal való számolást és a dátumkezelést megkönnyítő dátum.oldalát a http://mysql. 2002-ben az eWeek ugyanazt a webes alkalmazást használva összehasonlított öt adatbázist. Ugyanakkor a PHP 6-os verzi­ ójába tervezett számos funkció megtalálható a PHP 5.ini adminisztrálásának és kezelésének fejlesztése. A PHP 5.2 számos hasznos új funkci­ óval rendelkezett: Bizronsági célokra használható új beviteli szürő • JSON kirerjesztés a JavaScript interoperabilitásért Fájlfeltöltési folyamat nyomon követése Jobb dátum. illetve az OpenSSL kirerjesztésnek a továbbfejlesztése A php.php. karbantartással.3 főbb jellem�ői Olvashatrunk már a PHP új főváltozatáról. további információért lásd: hrtp:/l www.ind.Bevezetés 5 A könyv írásakor a PHP 5. a könyv megfelelő oldalain további információt találunk majd velük kapcsolatban: Névterek támogatása.namespaces Az ind kiterjesztés támogatása az alkalmazások nemzetköziesítéséhez.mysql.2-es volt a legújabb változat. további információért lásd: http://www. de már közelgett a PHP 5. és így ahhoz is.3-as verziójában is. teljesítményfejleszrések (pl. a PHP 6-ról is. és a hosting szolgáltatók még jó ideig biztosan nem fogják tömeges használat céljából telepíteni.net/manual/ en/book.3. amely alverzió közelebb áll az elfogadáshoz. A könyv írása idején ez még nem volt a megjelenés közelében. Az eredmény döntetlen lett a MySQL és a nála sokkal drágább Oracle között.

amely támogatást. ismétlődő lekérdezések sebességét A könyver a MySQL 5. illetve Microsoft Windows alatt is használható. amely ráadásul a többi hasonló terméknél egyszerűbben beállítható. képzéseket.és a webes alkalmazások többségével ez a helyzet -. hogy hozzászokjunk a MySQL-hez. érdemes tudni. akkor nem fog gondot okozni.mysql.x verzióját vagy valamely 3.com) mindezr az előnyt kínálja a felhasználék számára. Egyszerű használhatóság A legtöbb modern adatbázis SQL-t használ. illetve szá­ mos hib. akkor fizetős licencre van szükségünk. Ez a változat már az alábbiak támogatását is tartalmazza: P artícionálás Soralapú replikáció Eseményütemezés Naplózás táblázatokba A MySQL Cluster (az adatbázis adatait tartalmazó leíró) és a biztonsági mentés folyamatainak fejlesztései.x verzióját használja. Melyek a MySQL 5 újdonságai� A MySQL 5-ben megjelent főbb változtatások: Nézetek Tárolt eljárások (lásd a Rekordmutató-kezelés A további változások közé tartozik az ANSI szabványnak való jobb megfelelés és a futási sebesség növekedése. Támogatás elérhetősége Nem minden nyílt forráskódú termékhez tartozik olyan anyavállalat. Forráskód Akárcsak a PHP.1-es (Beta Community Edition) verzióját használva írtuk. hogy a 4. Hordozhatóság (platformfüggetlenség) A MySQL számtalan különböző Unix-rendszeren. Amennyiben az olvasó MySQL szerver egy korai 4. Amennyiben a MySQL-r valamely alkalmazás részeként és nem Open Source licenccel szeretnénk terjeszteni. Ez ugyan a felhasználék többségének általában nem szempont. a MySQL forráskódja is beszerezhető és módosítható. Ha dolgozrunk már más relációs adatbázis-kezelő rendszerrel. tanácsadást és minősítése­ ket ad. illetőleg in­ gyenes vagy nyílt forráskódú szoftveren dolgozunk. kereskedelmi licenccel pedig alacsony áron használható.yavítás Haladó MySQL programozás című 13.0-tól kezdve az alábbi funkciókkal egészítették ki a terméket: Egymásba ágyazott lekérdezések támogatása GIS típusok a földrajzi adatok támogatására Nemzetköziesítés jobb támogatása A tranzakcióbiztos InnoDB tárolómotor alapértelmezetren elérhető A MySQL lekérdezési gyorsítómernéria (query cache) jelentősen növeli a webes alkalmazások által gyakran futtatott. fejezetet!) Adatbázisok alapszintű finomhangolási lehetőségeinek támogatása . a tudat mégis megnyugtató. ám a MySQL AB (www.Ha nem kívánjuk alkalmazásunkat terjeszteni . nem szükséges licencet vásárolnunk.6 Bevezerés Alacsony költség A MySQL nyílt forráskódú licenccel ingyenesen. mert garantálja a folytonosságot. és vészhelyzet esetén van hova nyúlni.

a Gyakorlati PHP és MySQL projektek fejlesztése című. a Kedves Olvasó legalább annyira élvezni fogja a könyvet. Minden példa a való világból. Aki korábban is használt már PHP-t. Végezetül Reméljük. harmadik részben a webfejlesztés bármely programozási nyelvnél előjövő általános kérdéseivel foglalkozunk. rnint amennyire a szerzők. A kiadó. A MySQL használata a MySQL és a hozzá hasonló relációs adatbázisrendszerek használata során előfor­ duló fogalmakat. illetve a PHP és a MySQL elsajátítását. mint például a nagy projektek kezelése vagy a hibakeresés. a MySQL adatbázisunkhoz való csatlakozás menetét. Olyan függvénycsoportokat válogattunk össze. Ezt követően áttekintjük. Kedvenc részünk az ötödik. naprakész információkar tartalmazó weboldalakar. illetve a munkamener (session) -válcozókról olvasha­ runk itt. mint a biztonság és az optimalizálás. amikor elkezdték használni ezeket a termékeket. újabb verzióit és azokar használni. Rövidesen az olvasó is csatlakozhar a több ezer webfejleszrőhöz. Az E-kereskedelem és biztonság című. Kedves Olvasó! Szecernénk megköszönni. jelenleg ingyenes szofrverek szintén letölthetőek weboldalunkróL Érdemes azonban az interneten megkeresni ezen szofrverek frissíréseir.hu/melleklerek oldalról. hogy kiadványunkat választotta a PHP és a MySQL megismeréséhez. A könyvben szereplő példák­ hoz tartozó forráskódokat és melléklereker regisztráció urán letöltheti a www. Haladó PHP módszerek című részben részletesebben megtárgyaljuk a PHP főbb beépített függvényeit. A negyedik. Kezdő PHP­ felhasználóknak vagy programozóknak azonban érdemes kicsivel több időt szánni rá. dárum. hasznosnak találjuk majd a hatodik. amelyeket weboldalak létrehozásához a leghasznosabbnak véltünk. Ez a rész a PHP gyorstalpaló című fejezettel indul. illetve olyan haladó MySQL-es témákat mucat be. A könyv­ ben használt. aki ezekkel a srabil és hatékony eszközökkel épít dinamikus. A való világból vett gyakorlati kérdésekkel foglalkozik. illetve olyan mintaprojekteket mutat be. nem pedig"játék" kód. Objektumorientált PHP című fejezetet is. annak elég gyorsan átfueni ezt a fejezetet. az SQL használatár. amelyek a PHP és a MySQL erejét és sokoldalúságát támasztják alá. hogyan használjuk a PHP-t és a MySQL-t felhasználóink hitelesítésére. a fordító és a szakmai lektor . A legfontosabb ilyen téma a biztonság. illetve biztonságos adatgyüjtésre.perfactkiado. Ha elég jól ismerjük már a PHP-t. A PHP használata példákon keresztül mutatja be a PHP programozási nyelv legfontosabb alkotóelemeit. mert az objektumorientált funkciók jelentősen megváltoztak ebben a verzióban. képalkotásról. Egyebek közöte a szerver és a hálózat eléréséről.és időkezelésről. Használatuk tényleg öröm. A második rész. de nem használtuk még az 5-ös verzióját. egy e-kereskedelmi oldal létrehozásából származik. -továbbításra és -tárolásra.Bevezetés 7 Hogyan épül fel a könyv: Öt nagy részből áll: Az első rész.

és kivételkezelés .I A PHP használata l PHP gyorstalpaló 2 Adatok tárolása és visszakeresése 3 Tombök használata 4 Karakterláncok kezelése és reguláris kifejezések 5 Kód többszöri felhasználása és függvényírás 6 Objektumorientált PHP 7 Hiba.

Ha jártasak vagyunk a C. Próbáljuk ki a példákat! Gépeljük be vagy töltsük le a http://www.hu/mellekletek oldalról. a szerzök igazi weboldalak létrehozása során szerzert tapasztalatai alapján összeállí­ tott példákan végígmenve fogjuk elsajátítani a PHP használatár. PHP-ben már programozó olvasóinknak is érdemes átfutni. A könyvben a valós életből származó. Az olvasóknak azt kell megérteniük. vagy kérjük meg a rendszergazdát. Az ügyfél meg­ rendelésén a végösszeget és az adótartalmat kiszámítva megtanulj uk.perfactkiado. ami semmivel sem tud többet. A PHP Unix és Windows operációs rendszerekre telepítéséhez szükséges minden összetevöt megtaláljuk a http:/ /www. Hogy minél többet kihozzunk a példákból és esettanulmányokbóL futtatnunk kell. perfactkiado. és meg kell próbálni módosí­ tanunk azokat. ahol kísérletezni tudunk. változtassuk meg. amelyre telepít­ ve van a PHP. rontsuk el. első feladatunk a telepítés lesz. Ehhez olyan tesztágyra van szükség. Ezt követően a beviteli adatokat ellenőrzö PHP kód használatával online rendelési űrlapot fejlesztünk. a műveleti jelek (operátorok) és a kifejezések PHP-beli müködését. a Perl Active Server Pages (ASP) vagy egyéb programozási nyelvben. . nem a szintaktikát és a fiiggvényeket felsoroló újabb referenciakönyvre van szükségük. Végül ismétlődő HTML táblázatokat generáló PHP kód írása közben megismerkedünk a ciklusokkaL A fejezetben az alábbi főbb témakörökkel foglalkozunk: PHP beágyazása HTML-be Dinamikus tartalom hozzáadása Űrlapváltozók elérése Azonosírók Felhasználó által deklarált változók létrehozása Változótípusok áttekintése Érték hozzárendelése változókhoz Állandók deklarálása és használata Változók hatóköre Operátorok és műveletek kiértékdési sorrendje Kifejezések kiértékelése Függvényváltozók használata Elágazások if.hu/mellekletek oldalról letölthető mappák között. hogyan müködik a nyelv. hogyan érhetjük el és kezelhetjük az űrlapváltozókat. akkor a fejezetben leírtak segítségével gyorsan képbe kerülhetünk a PHP-t illetően is. majd if és else parancsokat. majd próbáljuk megjavítani azokat! A fejezet először is egy online termékrendelő űrlap példáján keresztül mutatja be a változók. mett alkalmas lehet a tudásukban lévő fehér foltok eltüntetésére. mint az online kézikönyv. Megvizsgáljuk a Boole-változók fogalmát. A változótípusokat és az operátorok Iciértékelési sorrendjét is áttekintjük.l PHP gyorstalpaló A fejezet röviden áttekinti a PHP szintaktikáját és nyelvi alkotóelemeit. a?: műveleti jelet és a switch utasítást használó példákat nézünk át. else és switch utasításokkal Iterációk alkalmazása while. hogy tegye ezt meg nekünk! Az erre vonatkozó utasításokat A PHP és a MySQL telepítése című fejezetben találjuk a Függelék­ ben. A programozási szakkönyvek igen gyakran nagyon egyszerű példákan keresztül tanítják meg az alapvető szintaktikát. Amennyiben számítógépünkre nincsen PHP telepítve. Úgy döntöttünk. hogy más utat választunk. do és for ciklusokkal Kezdés előtt: a PHP elérése A fejezetben és a könyv többi részében szereplő példák használatához olyan webszerverhez kell hozzáférnünk.

Ez a viszonylag egy­ szerű. Bob tudni szeretné. A PHP elsajátítását egy l kitalált cég. 1. 1.12 2. az autóalkatrészekkel foglalkozó Bob autóalkatrészek rendelési űrlapjának létrehozásával kezdjük. és mennyi a rendelés végösszege. mit rendelt az ügyfél. Rendelési űrlap létrehozása Bob HTML-programozója elkészített a Bob által értékesített autóalkarrészekhez egy rendelési űrlapot. A fejezetben használt összes példa kódját megtaláljuk a letölthető melléklerek 01_fejezet mappájában. mennyi forgalmi adót kell fizetni a rendelés urán.php" method="post"> <table border="O"> <tr bgcolor="lcccccc"> <td width="l50">Tétel</td> <td width="l5">Mennyiség</td> </tr> <tr> <td>Gumiabroncs</td> <td align="center"><input type="text" name="abroncs maxlength="3" /></td> </tr> <tr> <td>Olaj</td> <td align="center"><input type="text" name="olaj_db" maxlength="3" /></td> </tr> <tr> <td>Gyújtógyertya</td> <td align="center"><input type="text" maxlength="3" /></td> </tr> <tr> <td colspan="2" align="center"><input type="submit" value="Rendelés elküldése" /></td> </tr> </table> </form> name="gyertya_db" size="3" size="3" db" size="3" .1 ábrán látható űrlap hasonló az interneten található sok másikhoz.1 példakódban láthatjuk. Az űrlap HTML kódjának egy részét az 1.1 példakód: rendelesi_urlap. illetve szeretné tudni. fejezet Mintaalkalmazás létrehozása: Bob autóalkatrészek A szetveroldali szkriprnyelvek egyik leggyakoribb alkalmazási területe HTML űrlapok feldolgozása. html - Bob kiinduló rendelési űrlapjának HTML kódja <form action="rendeles_feldolgozasa. az 1.1 ábra: Bob megrendelési űrlapjának kiinduló változata csak a termékeket és a mennyiségeket rögzíti.

és töltsük be böngészöbe azzal.2 ábra A PHP ech o ut asításának átadottszöve g megjelenik a böngészőben. vagy alulvonást használunk-e a szóközök helyett.!or. hogy miként lett beágyazva az általunk írt PHP kód a szokásos kinézetü HTML fájlba! Próbáljuk megte­ kinteni böngészőnkben a forráskódot! A következő kódot kell látnunk: <htrnl> <head> <title>Bob autóalkatrészek Rendelési eredrnények</title> . PHP-programozással töltött óráinkat jelentősen köny­ nyebbé tehetjük azzal. Az egyik a get {az adatokat az URL végéhez ruzi hozzá).o'"�. hogy értelmes.. a másik pedig a post metódus {külön üzenetben küldi el azokat).php nevű kódot. l \. -:" Bob autóalkatrészek Rendelési eredmények .. hogy az oldalon lévő minden mezönév ugyanolyan for­ mátumú legyen. hogy az űrlap action tulajdonságánál az ügyfél megrendelését feldolgozó PHP kód neve lett megadva. amely akkor töltődik be. Ideje egyszerű PHP kóddal kiegészíteni a szkriptet! PHP beágyazása HTML�be Írjuk be a fájl <h 2> fejrésze alá a következő sorokat: <?php echo ?> '<p>Rendelés feldolgozva. hogy a PHP kód megírásakor is emlékezhessünk rájuk. A felhasználó által az űrlapba begépelt adatok a rnethod tulajdonság értékéről fUggöen kétféle­ képpen küldödhetnek el ennek az URL-nek.. majd a "Rendelés elküldése" gombra kattin­ M. fontos. Nyissuk meg szövegszerkesztőnket. Egyes HTML szerkesztök olyan alapértelmezett mezöneveket gene­ rálnak. hogy kitöltjük Bob űrlapját. r--�"'"""""'"� tt. olaj_db és gyertya_ db! A PHP kódban is használni fogjuk ezeket a neveket. hogy a mezőbe begépelendö adatra utaló nevet használunk. Így könnyebb megjegyezni. Érdemes a mezönevekhez valamilyen kódolási szabályt alkalmazni. és hozzuk létre a fájlt! Ezt követően gépeljük be az alábbi kódot: <htrnl> <head> <title>Bob autóalkatrészek </head> <body> <hl>Bob autóalkatrészek</hl> <h2>Rendelési eredrnények</h2> </body> </htrnl> Rendelési eredrnények</title> Láthatjuk. -� 1.2 ábrán láthatóhoz hasonló eredményt kell kapnunk. amikor a felhasználó a"Rende­ lés elküldésé' gombra kattint.. Egy ilyet szinte lehetetlen megjegyezni.</p>'.r"' ·.u...PHP gyorstalpaló 13 Látható. hogy idáig tisztán HTML kódot gépeltünk be. tunk! Az 1.. Figyeljük meg az űrlap mezöinek a nevét is: abroncs_db. hogy vajon röviditettünk-e egy szót a mezö nevében.) Az action tulajdonság értéke az az URL. 'j Az űrlap feldolgozása Az űrlap feldolgozásához létre kell hoznunk a forrn címke {tag) action tulajdonságában említett.. mint például a field23. Mivel késöbb is szükség lesz rájuk. rendeles_ feldolgozasa. beazonosítható neveket adjunk az űrlapmezöknek.. Vizsgáljuk meg. {Rövide­ sen megírjuk ezt a kódot.��(<'�� Mentsük el a fájlt.

és visszatérhetünk a HTML kódhoz. A Függelékben találunk bővebb információt erről a címkestílusróL Használata mindazonáltal nem ajánlott. A PHP zárócímkékkel elhagyhatjuk a PHP-t. így könyvünkben is használt címkestílus. a felhasználó számítágépén lévő böngészőben értelmezett és végreh:Ytort kliensoldali technológiától távol. Az ilyen típusú címkék használarához be kell kapcsoini a coniig fájlban a short_open_tag beállítást. hol kezdődik és hol ér ezen címkéken kivüli szöveget. amit többször. ?> Ez a legegyszerűbb. különböző szerverekre fognak telepíteni. ami ismerős lehet mindenkinek. ?> Ez a preferált. A címkék közörti minden szöveg PHP-ként értelmezhető. hogy PHP-ből bármilyen böngészővel megtelcinthető. és a"nagyobb. Ez azt jelenti.</p>'. A PHP értelmezése és végrehajtása a webszerveren történt. PHPcímkék Az előző példában a PHP kód a <?php karakterekkel kezdődött és a ?>karakterekkel ért véget. A most következő kódrészletek egymással egyenértékűek: véget a PHP kód. ha a többi címkestílus használarakor problémákat jelez a HTML szerkesztő. Különböző címkestílusok közül választhatunk Vizsgáljuk meg részletesebben is ezeket a címkéket! A PHP címkéknek négy különböző stílusa létezik. a JavaScripttől vagy más. arnikor olyan alkalmazást írunk. így biztosak leherunk benne. fejezet </head> <body> l <hl>Bob autóalkatrészek</hl> <h2>Rendelési eredmények</h2> <p>Rendelés </body> </html> feldolgozva. Ezeket a szimbólumokat (<?php és ?>) PHP címkéknek (tag) nevezzük. mint ( <) szimbólummal kezdődnek. tiszta HTML kódot tudunk előállítani. </script> Ez a leghosszabb címkestílus. Ez a példa egyszerűen szemiéitette a szerveroldali programozás fogalmát. mert a PHP fordító végigfutort a szkripten. Ez a stílus az Extensible Markup Language (XML) dokumentumokkails használha­ tó. hiszen azok mind a"kisebb. mert a kód számos környezetben nem fog működni. hogy minden szerveren elérhető. Ez a HTML címkékhez " hasonló. ez akkor különösen fontos.</p> A nyers PHP kód itt nem látható. A példában lévő sorok többsége egyszerű HTML. Akkor érde­ mes ezt választani. Általánosságban ez az ajánlott stílus. SCRIPT stt1us <script language='php'> echo '<p>Rendelés feldolgozva.14 2. A webszerver egyszerű HTML-ként kezeli az XMLstt1us <?php echo '<p>Rendelés feldolgozva.</p>'.</p>'. A fájlban levő kód négyféle szöveget tartalmaz: HTML PHP címkék (tag) PHP utasítások Fehérköz karakterek A kódhoz megjegyzéseket is adhatunk. a Standard Generalized Markup Language (SGML) utasításfeldolgozó stílusát követő címkestílus­ nem mellesleg ez az. . Más sza­ vakkal: a felhasználó böngészőjének nem kell értenie a PHP-t. Rövid stt1us <? echo '<p>Rendelés feldolgozva. és a fordítás eredményére cserélte a PHP kódot. A kiszolgáló rendszergazdája nem kapcsolhatja ki. Tudatják a webszerverrel. aki használt már JavaScriptet vagy VBScriptet. vagy a rövid címkék bekapcsalásával kell a PHP-t lefordítani. mint" ( > ) szimbólum zárja le öket. amelyik a legkevesebb gépelést igényli. rnivel a stílus alapértelmezetten már nincsen bekapcsolva.

mint a sortörés. Ha programoztunk már C-ben.</p>'.NET keretrendszerben használtral. Fehérköz karakterek Az olyan elválasztó karaktereket. Utolsó módosítás időpontja: A kód a vevő i megrendeléseket dolgozza fel. hogy mi a teendője. szöveget.NET-re kihegyezett szerkesztőt használunk. Például az echo 'helló '. l PHP utasítások A nyitó és záró címkék közé helyezett PHP utasításokkal közölhegük a PHP fordítóval. Csak akkor van értelme ezt a tag-stílust választani. Szerencsére ugyanilyen egyszerűen megralálható és javítható is. amit a nevük sugall: a kódot olvasó emberek számára szánt megjegyzések. hogy ki írta. ha ASP-re vagy ASP. Akkor dolgozhatunk vele. könnyen elkövethető szintaktikai hiba. mert ügyesen használva növelhetik a HTML kód olvashatóságát. az ech o használara nagyon egyszerű eredménnyel járt: a neki áradott sztringer. C-stílusú. Vizsgáljuk meg az alábbi két HTML kódrészleret: <hl>Köszöntjük a Bob autóalkatrészek boltjában!</hl><p>Mit szeretne rendelni ma?</p> és <hl> Köszöntjük a Bob autóalkatrészek boltjában!</hl> <p> Mit szeretne rendelni ma?</p> Ez a kér töredék egyforma kimenetet produkál. ugyanúgy jelennek meg a böngészőben. A PHP feldolgozó lényegében átugorja a megjegy­ zéseket.fehérköz (whitespace) karaktereknek nevezzük. ahogy az írott szövegben a mondatokat pontra!. a böngészők figyelmen kívül hagyják a HTML-ben levő ilyen karaktereket. vagyis a böngésző­ ablakban megjelenő Rendelés feldolgozva. ha bekapcsoltuk az asp_tags konfigurációs beállítást.ja a megjegyzésekben levő szöveget. teljesen megegyezik. Az 1. Fontos tudni. miért úgy írta. echo 'világ'.</p>'. ha minden utasí­ tást külön sorba írunk. de sokkal könnyebben olvasható lesz a kód. Mint bizonyára tudjuk. ahogy.echo 'világ'. bizo­ nyára ismerősnek fogjuk találni a pontosvessző ilyen használatár. közölhegük. Mint láthattuk. %> Ez a címkestílus megegyezik az Active Server Pages (ASP) vagy ASP. innen az angol echo kifejezés). és az echo 'helló '. Az alábbi. mikor módosította stb.ha­ sonlóan ahhoz. Ennek ellenére érdemes fehérköz karaktereket alkalmazni. a szóköz és a tabulátor. Figyeljük meg az ech o utasítás végén levő pontosvessződ PHP-ben pontosvesszőkkel válaszguk el az utasításokat. Az előző példa egyeden utasítást tartalmazott: echo '<p>Rendelés feldolgozva. illetve a shell szkript stílusú megjegyzéseket támogatja. A legegyszerűbb PHP kódok kivételével szinte mindenhol találunk megjegyzéseket. Használhatjuk őket a kód céljának elmagyarázására. A PHP fordító figyelmen kívül hagr. Javában vagy Pascalban. Ugyanígy jár el a PHP motor is. *l . azaz karakterláncot kiírja a böngészőben (vagyis visszaadja neki. A lefelejtett pontosvessző gyakori. Nem szükséges fehérköz karaktereket raknunk a PHP utasítások közé. Megjegyzések A megjegyzések pontosan azok. többsoros megjegyzéssel például PHP kód elején találkozhatnánk: /* Szerző: Bob Smith április 10.PHP gyorstalpaló 15 ASP stt1us <% echo '<p>Rendelés feldolgozva. de az első változat könnyebben olvasható. a fehérköz karakterekkel egyenértékűnek tekinti azokat. hogy alapértelmezésben nincs bekapcsolva ez a círnkestílus. Ugyanez igaz a PHP-re is. A PHP a C-típusú nyelvek stílusában írt.2 ábrán látharjuk az eredményt.

11-. és a függvények maguk is valamilyen értékkel térnek vissza. hogy a megjegyzés szimbólum ( # vagy ll) után a sor végéig vagy a záró PHP címkéig tart a megjegyzés.</p>'. az e z itt nem HTML kódnak tekintendő. Ez az információ a kód minden egyes lefutásakor más és más lesz. A szerveroldali szkriptnyelvek használatának elsődleges oka. *l karakterekkel érnek véget. fejezet A többsoros megjegyzések l* karakterekkel kezdődnek és megjegyzések nem ágyazhaták be. PHP-vel könnyen elérhetjük ezt. Az 1. php fájlban levő kódot a következőre: <?php echo "<p>Rendelés feldolgozásának id6pontja: echo date('H:i. jS F'). ?> jS ". Akárcsak C-ben. F Y'). Nézzük meg újra ezt a függvényhívást: date('H:i. a többsoros l Használhatunk egysoros megjegyzéseket is."</p>".3 ábrán a kód egy adott időpontban történő lefuttatásának kimenetét láthatjuk. A PHP webes alkalmazások fejleszté­ sekor használható függvények széles választékával rendelkezik. //Megrendelés nyomtatása indul akár shell szkript stílusban: echo '<p>Rendelés feldolgozva. Ez igen fontos alkalmazási terület. A kódban használt.date('H:i.:. Induljunk ki egy egyszerű példábó!! Cseréljük le a rendeles_ feldolgozasa. A következő kódsorban a záró címke előtti szöveg. ?> jS F Y') .</p>'. mert a felhasznáJók igényei szerint vagy rendszeresen változó carealom újra és újra visszavonzza a látogatókat. echo "</p>". ��� ������-Bob autóalkatrészek Rendelési nedmények t. #Megrendelés nyomtatása indul Mindkét stílusra igaz.16 2.) használva egyetlen sorba is írhatnánk ugyanezt: <?php echo "<p>Rendelés feldolgozásának id6pontja: ". A záró címke utáni szö­ veg. Függvényhívások Vizsgáljuk meg a date () függvény meghívását! Ez a függvényhívás álcalános formája. azt egyszerű HMTL-lel is elérhettük volna.ll � tttaf ���* - ··?r-:-. Az összefűző operátort (.3 ábra: A PHP date () függvénye formázott dátumot ad vissza. az ez itt megjegyzés a megjegyzés része. A függvények többségének valamilyen adatot (paramétert) kell átadni. .w 1. mivel a záró címkén kivül esik: ll ez itt megjegyzés ?> ez itt nem Dinamikus tartalom hozzáadása Amire idáig PHP-t használtunk. beépített date () PHP függvény közli a vevővel rendelése feldolgozásának dátumát és idejét. akár C++: echo '<p>Rendelés feldolgozva. hogy lehetövé teszik számunkra dinamikus tartalom megjele­ nítését az oldalon.

közepes és hosszú stílusnak fogjuk nevezni őket. Hogy megalapozott dönrést hozhassunk.ként használhatj uk. Nem lenne értelme egy új kódban használni. Meg kell említenünk. hogy a hívással egy karakterlánc (szöveges adat) adódík át a zárójelek közt a függvénynek. hogy a PHP kódnak elküldött oldalon levő űrlapmezők mindegyike elérhető az adott kódban. hogy újabban sokat kifogásolják. Rövid. az i a percek (szükség eserén szinrén bevezető nullával). nem pedig auto­ matikusan tesszük ezt. kivéve. Korábban ez volt a leginkább platformfüggeden stílus. ini fájlunk egyik beállírásától függ. () függvény által támogatott formáromok teljes list:iját a Dátum és idő kezelése ámű 21.PHP gyorstalpaló 17 Láthatjuk. ám az egyszerűség kedvéért a változók rövidebb változatát is létrehozzuk. A stílus használarakor könnyen követhetünk el a kódot megbízhatarianná (nem biztonságossá) tevő hibákat. rá­ A hosszú stílus ( $HTTP _POST_VARS [ 'abroncs_db' l) a leginkább szószáryár. Amennyiben a közepes stílus alapján a változó nevek rövid változatát hozzuk létre (ahogy tesszük a könyvben is). közepes és hosszú változók A PHP kódon belül az űrlapmezőket az azok nevéhez kapcsolódó nevű PHP változókként érhetjük el. Új kódban . Az ügyfelek által begépelt adatokat könnyen megsze­ rezhetjük PHP-ben. Az abroncs_db mező tartalmát az alábbi módokon érhetjük el: $abroncs_db ll rövid stílus $_POST['abroncs_db'] ll közepes stílus $HTTP_POST_VARS['abroncs db'] ll hosszú stílus Példánkban és a könyv egészében a közepes stílussal (vagyis a $_POST[ 'abroncs_db' ] formával) fogunk hivatkozni az űrlapválrozókra. Ezek­ nek a módszereknek nincsen hivatalos nevük. ami meghatározza a kivánt kimenet stílusát. A változókhoz való ilyen kényelmes hozzáférés vonzó lehet. hogy szoftverünket csak régi szerverekre fogják telepíteni. Mindháromra igaz. de használata a register _globals konfigurációs beállítás bekap­ csolását igényli. de a ténylegesen alkalmazandó módszer az általunk használt PHP verziójáról és php. Nem a függvények megkapják paramétereiket. ám mielőrt egyszerűen bekapcsolnánk a regis ter_ globals adásul változóink viszonylag könnyen használhatók lesznek. Ha ezt a stílust választjuk. például $abroncs_db . Lényegében úgy adódnak ár a kódnak. Az ajánlott megközelírés a közepes stílus ( $_POST [ 'abroncs_db' l). mert automatikus létrehozásuk biztonsági problémát vetne fel a kódban. így hosszú rávon minden bizonnyal el fog tűnni. az S a sorszárnnév képzője ( jelen esetben ez th. ha biztosak vagyunk abban. hiszen angolul írjuk ki a dátumot). A karakterlánc minden betűje a dátum és idő egy-egy részét jelképezi. De a kódban. hogy a PHP fejlesztői csapata miért döntött annak kikapcsolása mellett. Rövid stílus használata esetén a kódban lévő változók neve megegyezik a HTML űrlapon lévő űrlapmezők nevével. fejezerben találjuk meg.) A használt PHP-verziótól és annak beállírásairól függően háromféleképpen érhetjük el az űrlapadarokat változókkal. nem kell biztonsági kérdésekkel foglalkoznunk. éppen ezért ez a stílus napjainkban már nem igazán ajánlott. érdemes végiggondolni. Ez a beállirás biztonsági okokból alapértelmezésben ki van kapcsolva. a változókat egyszerűen. kell a változókar a kódban deklarálni vagy bármilyen művelertel lérrehozni. Az ilyen paramétereker a függvény bemeneti adarként használja valamilyen konkrét eredmény (kimenet) elöállítására. hogy dollárjellel ($) kezdődnek.ezt sem érdemes már használni. tekintsük ár a különböző módszereket: A rövid stílus ( $abroncs_db) kényelmes ugyan. az A date F pedig a hónap teljes neve. . mert a PHP 6-os verziójából valószínűleg el fog tűnni. Az űrlapváltozók elérése A megrendelési űrlap használatának célja az ügyfélrendelések begyűjtése. de ma már a teljesítményt növelő register _l ong_arra ys konfigurációs dírektívával kiikratható. A zárójelben lévő elemet a függvény paraméterének. Az űrlapon lévő abroncs_ db mező létrehozza az űrlapot feldolgozó kód $abroncs_db változóját. A változók neveit on­ nan ismerjük fel könnyen a PHP-ben. (A dollárjel kiírásának elmulasztása gyakran elkövetett programozói hiba. A H az óra a 24 órás időformátumban (az egyszámjegyű órák előtt bevezető nullával). más néven argumentumának hívjuk. l A da te ( ) függvény használata A date () függvény formázó karakterláncot (formar string) vár paraméterként. a j a hónap napja (mindíg nulla nél­ kül).a rövid stílushoz hasonlóan . Saját kódjaink esetében választhatunk ettől eltérő megközelítést. mi ezért rövid. ahogy beállítást.

E fogalomhoz a későbbiekben. A $_GET vagy $_POST tömb közül az egyik tárolja az űrlapváltozók minden részletét. akkor a felhasználék saját változóinkkal keveredő változókat és értékeket adhatnak át űrlapválrozókénr. A beviteli adatokat szűrnünk kell. hogy létrehoz egy új.' flakon olaj<br />'. adjuk az alábbi sorokat PHP kódunk végéhez: echo '<p>Rendelése az alábbi: </p>'. <?php ll rövid változónevek létrehozása $abroncs_db $olaj_db ?> = = $_POST['abroncs_db').18 2. Amennyiben az űrlap a POST metódussal lett elküldve. a kód kimenere az 1. hogy a kódok biztonságát veszélyezterő hibákar kövessünk el. echo $gyertya_db.4 ábrán láthatóhoz kell hasonlítson. Helyezzük az alábbi kódblokkot a feldolgozó kód elejére! A könyv összes. hogy az űrlap elküldése GET vagy POST metódussal történe-e. és beállítja. echo $abroncs_db. amelyben a változók egyszerűbben használható másolatát hozzák létre! Egy változó ércékének egy másikba másolásához az értékadó (hozzárendelő) műveleti jelet (operátorr) használjuk. mint az egyenlőségjel (=). - Karakterláncok kezelése és reguláris ki­ fejezések című -fejezetben kezdünk foglalkozni. A GET vagy POST metódussal elküldött min­ den adat kombinációja elérhető a $_REQUEST tömbön keresztül is. Biztonsági szempontból kockázatos dolog a közveclenül a felhasználék által bevitt adatokat a böngészőnek kimenetként átadni.Az adat mindkét esetben elérhető a $_REQUEST [ 'abroncs_db' l gyaljuk. $ POST['olaj db'). az abroncs_ db mezőbe bevitt adat a$_POST [ 'abroncs_ db' J elemben lett eltárolva. a biztonság kérdéskörét pedig a Webes alkalmazások biztonsága című 16. . akkor nem l lehet egyértelműen megkülönböztetni az általunk létrehozorr és a közverlenül felhasználéktól érkező. űrlapból érkező adatokat kezelő kódja hasonló blokkot tartalmaz az elején. ügyeljünk arra. hogy az űrlapból a POST metódussal átküldött adarokat tartalmazzák.A következő utasítás annyir tesz. $_GET vagy $_REQUEST tömb valamelyikéből keressük vissza. még visszatérünk. Próbáljunk meg szándékosan rossz adarokat bevinni. Ha az elküldés GET metódussal történt. hogy valóban értelmes adatokat vittek-e be az űrlapmezőkbe.' gyújtógyertya<br />'. hogy valamiképpen megpróbáljuk kódunkkal ellenőrizni az adatok érvényességét. és figyeljük meg. tömbelemben is. Hogy melyik tömböt használjuk. hogy mit adtunk meg az űrlapon. $olaj_db és $gyertya_ db -hoz létre. ez PHP-ben nem más. fejezer A változókhoz való ilyen közverlen hozzáférés igen kényelmes lehet. Mivel ez a kód nem állít elő semmilyen kimenetet. Amennyiben a változók elérésének kényelmes. Ha nem járunk el kellő gondossággal. Ha most betöltjük a fájlt böngészőnkbe.' gumiabroncs<br />'. nem megbízható vál­ tozókat. és belemásolja a$ POST ['abroncs_db' J $abroncs_db = tartalmár: $_POST['abroncs_db'). mindegy. az attól függ. A könnyebb megtalálhatóság érdekében mi általában a kód elejére szaktuk helyezni az ilyen blokkokat. az adarot a$_GET['abroncs_db' l elemben fogjuk megtalálni. Egyelőre nem ellenőriztük a változók tartalmár. amikor a változók hatókörét tár­ Nézzünk meg egy példát. Az ilyen adatok szűrésével a negyedik fejezerben fogjuk részletesen megrárgyalni. echo $olaj_db. $gyertya db =$ POST['gyertya db'). A kód három új változót - abroncs_db. Ezek a tömbök aszuperglobális tömbök közé tartoznak. $abroncs_db nevű válrozót. hogy valami látható dolgot h*son végre. hogy minden saját változónak kezdőértéket adjunk! A közepes stílus esetén az űrlapváltozókar a $_POST. Annak érdekében. és nem rendelünk minden változóhoz kezdőértéket. hogy a <html> és az oldalt indító más HTML címkék alá vagy fölé helyezzük. Ha az űrlapváltozókar automatikusan ilyen globális változókká alakítjuk. ám lehetőséger ad arra. hogy mi történik! A fejezet hátralevő részének elolvasása után minden bizonnyal azon leszünk. A pontos értékek ter­ mészetesen attól függnek. rövid stílusár használjuk.

Egyszeres idézőjel esetén a változó neve vagy bármilyen más szöveg változatlanul lesz elküldve. � Bob autóalkatrészek Rendelési eredmények R. A következő kódsor echo '$abroncs_db gumiabroncs<br />'.l9.(A tömbök kissé bonyolultabbak. amely a Perl­ felliasználóknak már ismerős lehet.' gumiabroncs<br />'. A következő példa egy háromsoros karakterláncot hoz létre és jelenít meg: echo <<<vege l. A heredoc szintakszis a karakterláncot befejező jel használatával teszi lehetövé hosszú sztringek egyértelmű meghatározását. ami a korábban bemutatott viselkedést eredménye­ zi. Mindkét formátum helyes. mert így elkerülherjük több echo parancs begépelését..PHP gyorstalpaló 19 'lk>!> "tl'o.. mint például itt: echo $abroncs_db. litereiinak hívjuk... Emlékszünk még az előző rész második példájára� A PHP a karakterláncban lévő $abroncs_ db változónevet a változó értékére cserélte.. a karakterláncok pedig önmaguk is adatok. Ez teljesen egyenértékű az előbb elsőként bemutatott utasítással. egyszerű változókat kettős idézőjellel körbefogott karakterláncokba is helyezhetjük. a felhasználó által begépelt adatot jelképező szimbólum..4 ábra: A Jelhasználó által begépelt ürlapváltozók egyszerüen elérhetők a rendeles_ feldolgozasa. hogy megkülönböztessük a változóktóL Az $abroncs_db egy változó. Gyakran fogjuk használni.TIII�I>r<'>� ':-1�-:. Emlékezzünk vissza a korábban említett kétféle karakrerláncra: a kettős idézőjelet és az egyszeres idézőjelet használóral A PHP a kettős idézőjelben lévő karakterláncokat megpróbálja kiértékelni.. " -�···t-. Fontos tudni. Ha közelebbről megvizsgáljuk ezeket az echo utasításokat.l'lt!. 6o)ócwty�� ú 1. hogy az interpoláció csak a kettős idézőjellel közrefogott karakterláncok eserén működik. A változók adatok szim­ bólumai. sor 2. Gumiabroncs<br />' viszont !iterál. Vagyis majdnem vehetjük.·j l . php kódban. amikor egy karakterláncban a tartalmára cseréljük a változót. amikor az echo utasítással küldünk a böngészőnek kimenetet._. Egyszeres idézőjelet használó szeringekbe nem helyezherjük ezzel a módszerrel a változók nevét.. ami egymáshoz adja a karakterláncokar (szövegdarabokat). ezért a tömbök és a karakterláncok kombinálásával a Karakterláncok kezelése és reguláris kifejezések című 4.) Gondoljuk végig a következő példát: echo "$abroncs_db gumiabroncs<br />". . fejezetben foglalkozunk majd. hogy a változó neve és az azt köve­ rő szöveg között egy pont(.. A .. A megjeleníteni kívánt... és csak személyes ízlésünktől függ. lefuttatása egyszerűen az "$abroncs_db gumiabroncs<br />" karakterláncot küldi el a böngészőnek A kettős idé­ zőjelen belül lévő változónév helyén a változó értéke jelenik meg. Az egyszeres idézőjelben lévő sztringeket valódi literálként kezeli. Amikor ilyen nyers adatdarabot használunk egy programban.. Karakterláncok összefűzése A példakódban az echo utasítás megjeleníti a felhasználó által az egyes űrlapmezőkbe gépelt értéket.. sor vege . Ez a pont a karakterláncokat összefűző műveleti jel. hogy melyiket használjuk. illetve az azt követő magyarázó szöveget. Vehetjük a névértékét. Ezt a folyamatot.. A következő részekben a példa néhány érdekes elemét vizsgáljuk meg. vagyis azt. láthatjuk. sor 3.r:ao:ir:lts��IO.) látható. Változók és literálok A mintakód echo utasításaiban összefűzött változók és karakterláncok különböző típusú dolgok. in­ terpolációnak nevezzük.1!-k R{'!Hio��i('r('d>"'ll'f•olo. A karakterláncok meghatározásának harmadik módszere a heredoc szintakszis ( <<< ) használata....-...1<kll� ReoxldtKuiiiM!tt .

A PHP adattípusai A PHP a következő alapadattípusokat támogatja: Integer. és paraméterként gyakran más függvénynek kell átadnunk ezeket. mint egy függvénynek. További részletekért olvassuk el a következő részt! Az értékadó műveleti jellel ( = ) rendelhetünk a változókhoz értéket. berűket. Gyakori programozói hiba. Mindkét sor létrehoz egy-egy változót. Változó értékét is rendelhetjük változókhoz. $osszmennyiseg. A PHP megkülönbözteti az azonosírókban a kis.00. A HTML űrlapból áradott változókon túlmenően saját változókat is deklarálhatunk és használhatunk. fejezetet!) Object .karakterek sorozata. A változók a legtöbb programozá­ si nyelvben csak egyféle típusú adatot tartalmazhatnak. és ezt a típust a változó használata előtt deklarálni kell (például C-ben). számokat és alulvonást tartalmazhatnak. A lényeg csupán annyi. ahogy tetrűk azt akkor is. Az $abroncs_db és az $Abroncs_db nem egyezik meg. Az ilyen használat azonban zavaró és éppen ezért kerülendő. amikor egyik változó értékét egy másikhoz másoltuk. ám egyes függvények ezeket adják vissza. A PHP egyik jellemzője.és nagybetűvel is írhatjuk. a függvényekkel és osztályokkal a Kód több­ szöri felhasználása és függvényírás című ötödik és az Objektumorientált PHP című hatodik fejezetben foglalkozunk.tömb. osztálypéldányok tárolására használt változó (lásd a 6. (A függvények és az osztályok nevi is azonosító. Közveclenül valószínűleg soha nem fogunk resource változót módosítani. Ugyanakkor nem lehet egy másik függvény nevével megegyező nevű függvényt létrehozni.egész szám Float (másnéven double). Bob honlapján szetetnénk kiszámolni a rendelt tételek számát és a fizetendő teljes összeget. . Két vál­ tozót hozhatunk létre ezen értékek tárolására. Először is PHP kódunk aljához a következő sorokat hozzáadva állítsuk be ezen változók kezdőértékét nullára! $osszmennyiseg $vegosszeg = = 0. PHP-ben viszont a változónak adott érték határozza meg a változó típusát. lánc lezárásához helyezzük a lezáró jelet a sor elejére! l A heredoc sztringek a kettős idézőjelben lévő karakterláncokhoz hasonlóan interpolálhatók. A PHP-ban többféle adattípus használható. hogy a szövegben ne jelenjen meg. A kezdőérték nélküli vagy NULL értékű változók NULL típu­ súak. Az azonosírók számjeggyel nem kezdődhetnek. Heredoc karakter. másképpen fogalmazva dinamikusan típusos nyelvnek nevezzük. fejezet A vege jel teljesen tetszőlegesen választható. több adatelem tárolására használható változó (lásd a Tömbök használata című 3. 0. hogy a változókat nem szükséges használatuk előtt deklarálni. hogy ugyanannak tekintik ezt a két azonosítót. ahogy az alábbi példa muratja: $osszmennyiseg $vegosszeg = = 0. Változónak lehet ugyanaz a neve.true (igaz) vagy false (hamis) értéket felvehető logikai változó Array .20 2.objektum.) Érvényes azonosírók meghatározásához az alábbi egyszerű szabályokkal szükséges tisztában lennünk: Az azonosírók tetszőleges hosszúságúak lehetnek. Ezek külső erőfor­ rásra (például adatbázis-kapcsolatokra) hivatkoznak.valós (lebegőpontos) szám String. Változótípusok A változó típusa a benne tárolt adatéra ural. karakterlánc Boolean. Akkor jönnek létre. Típuserősség foka A PHP-t gyengén típusos. A függvénynevek kivételt képeznek e szabály alól: ezeket kis. fejezetet!) Két különleges adattípus is használható: NULL és resource. Egyes beépített függvények (például az adatbázisfüggvények) resource típusú változókat adnak vissza.és nagybetűket. Az azonosítók Az azonosírók a változók nevei. amikor először értéket rendelünk hozzájuk. A különböző adatokat különböző adattípusokban tárolhatjuk. és literálértéket rendel hozzájuk.

. Minden egyes űrlapváltozó egyenkénti lisrázása és használata helyett ciklussal és változóval automatikusan feldolgozhatjuk öket. Ne feledjük.00. define ( 'OLAJAR'. Ugyanilyen egyszerűen deklarálha­ runk állandókat (konstansokat). A konstansokat a define függ­ vénnyel határozharjuk meg: define ( 'ABRONCS AR' . define ( 'GYERTYAAR' . Ez a funkció ugyanúgy működik itt is. 4) . Amikor például az $osszmennyiseg és a $vegosszeg változót létrehozruk. Minden nyelvben megváltoztathatjuk a változók értékér. Ezt követően az $abroncs_db helyert használhatjuk a $$valto z o_neve-t is. 0. átlátható módon történő módosításának lehetősége igen hasznos. ezekről a függvényekről a fejezet későbbi részé­ ben olvashatunk. de csak néhány nyelv engedi a változótípus módosítását. de akár a következő sorral is folytathatnánk kódunkat: $vegosszeg = l 'Helló'. A típusok menetközben. mint a változók. ez most egy integer típusú változó. és még kevesebb nyelvben megengedett a változónév vál­ toztatása. Változó változók A PHP még egy válrozótípust használ: a változó változót.PHP gyorstalpaló 21 . 10). hogy a PHP varázs­ ütésre rudja. Típuskényszerítés Típuskényszerítéssei (type casting) elérhetjük. és a kódban sehol máshol nem lehet azokat megváltoztatni. ám értéküket egyszer állítjuk be. A PHP a változóban tárolt érték típusa alapján változtatja a változó típusát. Az állandók ugyanúgy értéket rárolnak. A változó változó úgy müködik. így az $osszmennyiseg integer típusú marad. Beépített függvénnyel is ellenőrizhetjük és beállíthatjuk a változók típusát. Az előző részben lévő két válrozót átalakírással is deklarálhartuk volna: $osszmennyiseg $vegosszeg = = 0. a for ciklusokat bevezető részében példán keresztűl fogjuk ezt bemutatni. Az átalakírandó változó típusa nem változik. Kicsit furcsának tűnhet. ugyanolyan adattípusú adatot ad vissza. hogy milyen adattípust tárolrunk el a változókbal Amikor visszakeressük a változót. kezdőértéküket az alábbiak szerint adtuk meg: Sosszmennyiseg $vegosszeg = = O. A változó változók lehetövé teszik a változónév dinamikus módo­ sításár. (float)$osszmennyiseg. azaz egész számot rendeltünk az $osszmennyiseg-hez. Egyszerűen zárójelben az átalakítani kívánt változó elé írjuk az ideiglenes típust. Ez pontosan a következővel egyenértékű: = 5. Vegyük például az alábbi értékadást: $valtozo_neve = 'abroncs_db'. Állandók deklarálása és használata Ahogy korábban már láttuk. A $vegosszeg pedig ugyanilyen logika miatt float típusú. de a későbbiekben még visszatérünk használatára. hogy egy változó vagy érték más típusúként viselkedjen. Mint látni fogjuk. Ez a megközelítés egyelőre Icicsir megfoghatatlannak tűnhet. A feje­ zet későbbi. és tárold el a $vegosszeg változóban!" A $vegosszeg változó ezzel float rípusú lesz. hogy egy változó értékét használja egy másik nevekénr. könnyedén megváltoztathatjuk a változókban tárolt értéket. mint C-ben. l O O) . A második sor a következőt jelenti: "Vedd az $osszmenn yiseg változóban tárolt értéket. A mintaalkalmazásban állandóként lehet elmenteni például a forgalmazott termékek árát. Mivel a O-t. A $vegosszeg változó ekkor string típusú lenne. Az $abroncs_ db értékét például a követ­ kezőképpen is beállíthatjuk: $$valtozo_ne ve $abroncs_db = 5. a PHP elég nagy mozgásteret ad ezen a területen. értelmezd float típusúként.

fejezet Adjuk ezeket a sorokat kódunkhoz! Így van már három állandónk. némelyikkel mi magunk is találkozni fogunk. A ha­ tókört részletesebben is megtárgyaljuk a fejezet egy későbbi. Ezeket a legegysze­ rűbben úgy tekinthetjük át. nem kell dollárjelet rakni elé. amikor relevánssá válnak. Ezek szuperglobális vagy autoglobális változók. A következő részekben a mü­ veleti jelek celjes listáját áttekintjük. integer. hogy a függvényeken belül és kívül is használhatók. a függvényeket és osztályokat bemutató részében. Nem kötelező. hat alapvető szabálya a következő: A beépített szuperglobális változók a kódon belül bárhol elérhetők. Az állandók és a változók közöte egy fontos különbség. Deklarálásuk után az állandók globálisan elérhetők. float és string ópusú adatokat tárol­ hamak. amit a vevői rendelés végösszegének kiszámítására fo­ gunk használni. hogy amikor állandóra hivatkozunk. Egyelőre rnin­ den változó. ha lefuttatjuk a phpinfo ( ) függvényt: phpinfo(). Ezeket az adattípusokat együttesen skaláris értékeknek nevezzük.0 verziója óta a$_F I LES változókat nem tartalmazza) $_ SESSION- A könyvben még többször visszatérünk ezekhez a szuperglobális változókhoz.) A függvényekben bevezetett változók az adott függvényre nézve helyiek. A globálisként deklarált függvényekben lévő változók az ugyanolyan nevü globális változókra hivatkoznak. A PHP-nek a hatókörre vonatkozó. A PHP az általunk meghatározott állandókan kívül számtalan saját (beépített) állandóval rendelkezik. a következöket gépelnénk be: echo ABRONCSAR. l Vegyük észre. Műveleti jelek használata A müveleti jelek. ha a global kulcsszóval deklaráljuk azt. csak a függvényeken belül nem. Ha szükségünk van az állandó értékére. (De függvényen belül csak akkor érhető el az adott globális változó. függvényeken belül és kívül is láthatók. akkor és ott. A szuperglobális változók teljes listája a következő: $GLOBALS -az összes globális változót tartalmazó tömb (a global kulcsszóhoz hasonlóan ez is lehetövé teszi a glo­ bális változókhoz való. Ahogy haladunk a könyvben. hogy az utóbbiak csak boolean. Változók hatóköre A hatókör (scope) kifejezés a kód azon területeire utal. ez azt jelenti.22 2. alapértelmezésben globális lesz. ám a függvény két meghívása közöte megőrzik értéküket. ahol az adott változó elérhető. fejezetben részletesebben elmagyarázzuk ezt a müködést.3. rajtuk müveletet végrehajtva.) A kódban deklarált globális változók a kódban bárhol elérhetők. más néven operátorok olyan szimbólumok. (Az 5. Ha például az imént létrehozott konstansok közül az elsőt szereménk használni. amit használunk. A függvény -sok más hasznos információ mellett -a PHP előre definiált változóinak és állandóinak listáját adja vissza. illetve néhány különleges változó egyéni hatókörszabályokkal rendelkezik. A függvényekben bevezetett és static kulcsszóval deklarált változók a függvényeken kívülről nem érhetők el. köztük a$_GET. az értékadó ( = ) és a karakterlánc-összefűző ( . A változók és állandók közötti másik különbség.$_POST és$_COOKIE változókat magában foglaló munkamenet (session) -változók tömbje $_COOKIE $_FILES $_ENV -a környezeti változókat tartalmazó tömb $_ REQUEST beviteli tartalmat tartalmazó tömb (amely a PHP 4. függvényen belüli hozzáférést-például így: $GLOBALS [ 'sa j a t_val toz o' $_SE RVER • l) -a kiszolgáló által elérhetővé tett változók tömbje POST $_GET $_POST -a kódnak GET metódussal átadoct változók tömbje -a kódnak metódussal átadoct változók tömbje -böngészősütik változóinak tömbje -fájlfeltöltésekhez kapcsolódó változók tömbje -az összes felhasználói bevitele. A $_GET és a$_POST tömb. . ránézésre megkülönböztet­ hecövé tes:d a változókat és az állandókat. amelyek rnindenhol. mégis érdemes ragaszkodni ehhez. ) operátor. amelyekkel értékeket és változókat kezel ünk. hogy az állandók nevét nagybernvel írtuk! Ez a C-ből átvett szokás egyszerüen. Két müveleti jel került eddig szóba. mivel könnyebben olvashatóvá és áttekinthetővé teszi kódunkat. csak a nevét kell használnunk. A vevői rendelés végösszegének és adótartalmának kiszámításához egyes müveleti jelek használatára lesz szük­ ségünk. és a függvény végén megszünnek létezni.

.$b $a $a $a * * $b l % l $b % $b Ezekkel az operátorokkal műveletek eredményét tárolhatjuk el. akkor a PHP megkísérli a karakterláncot számmá alakítani. táblázat tartalmazza. A szorzás és az osztás is nagyrészt úgy működik . = $eredmeny $a. Az $eredmeny változóban eltárolt érték a 27 tízzel való oszrásakor kapott maradék. hogy a matematikában megszokott szorzásjel helyett csillagot használunk szorzásmüveleti jelként. osztásjel helyett pedig perjelet! A maradékképzés (modulus) müveleri jel az $a változó $b változóval történő osztásakor kapott maradékot adja vissza. többségük azonban kettőt. hiszen ezek a jól ismert matematikai műveleti jelek. a karakterlánc értéke nulla lesz. A kivonás szimbólumát (-) egyoperandusú műveleti jelként is használhatjuk. Az értékadó műveleti jel is két paraméterrel müködik: az =jel bal oldalán tárolási helyet. tudományos jelölésként értelmezi. hogy az aritmetikai müveleti jeleket általában egész vagy lebegőpontos számokra alkalmazzuk. Értékadó műveleti jelek Az alapvető értékadó müveleti jellel ( = ) már találkoztunk. kettő vagy három paramétert használnak.-ra van állítva"! Például: $osszmennyiseg = 0..1 táblázat: A PHP aritmetikai müveleti jelei Műveleti jel + Neve Összeadás Kivonás Szorzás Osztás Maradékképzés Példa $a + $b $a . Karakterláncokon alkalmazható műveleti jelek A karakterláncokon használható egyetlen müveleti jellel már találkoztunk és dolgoztunk is.vagyis 7. Mindig értékadó műveleti jelként tekintsünk rá. mint az alábbi példában: $a = -1.PHP gyorstalpaló 23 A műveleti jelek általánosságban egy. illetve kivonása. 1. Az összeadás és a kivonás a várt módon müködik. Gondoljuk végig a következő kódrészletet: $a $b = 27. és float rípusú. $b = "autóa1katrészek". 10. A PHP aritmetikai műve­ leri jeleit az 1. Ha például string rípusú adatra alkalmazzuk őket. ha nincsen számjegy. és a következőkép­ pen olvassuk: . A karakterlánc-összefűző mü­ veleti jelet az összeadás operátorhoz hasonlóan használva összeadhatunk két karakterláncot. ahogy gondolnánk. = = $eredmeny $a%$b. Figyeljük meg. Ha e vagy E betűt tartalmaz. Ennek a kér műveleri jelnek az eredménye az $a és $b változóban eitá­ rolt érték összeadása. Az $eredmeny változó ekkor a "Bob autóalkatrészek" karakterláncot tartalmazza. illetve elmenthetjük ennek eredményét: $a = "Bob ". máskülönben egész számmá. l Aritmetikai műveleti jelek Az aritmetikai operátorok magától értetődőek. ekkor a negatív számokar jelöli. azaz lebegőpontos számmá alakítja azt. mint az alábbi példában: $eredmeny = $a + $b. és értéknek tekinti azt. A PHP számjegyet keres a karakterlánc elején. Ezeket a paramétereket tényezőknek (műveletértéknek vagy operandusnak) hívjuk.1. Fontos megjegyezni.$b. jobboldalt pedig egy kifejezést találunk.

(Vegyük észre.2 táblázat. *.4.2 táblázat: A PHP összetett értékadó müveleti jelei Használata $a $a Sa Műveleti jel +.4. Mivel egyenlő� $a Sa $a Sa $a $a $a $a $a +.az $oss zmenn y i seg változó nullára van állírva:' Ennek okár a fejezet egy későbbi. Hasonlóképpen azt is írharjuk. hogy $a + $b akkor ennek a kifejezésnek az értéke az $a és a $b változó összeadásának az eredménye. rnint a matematikában. $b $a %. Az ilyen összetett értékadó operátorokat és használatuk eredményét foglalja össze az 1. Ez a sor ll-re állírja a $b változó értékér. Ez a módszer lehetövé teszi az alábbihoz hasonló kifejezések használatár: $b . és-. echo $a++. Vizsgáljuk meg a következő kódrészlerer: $a. hogy az $a változóban tárolt érték ténylegesen megválrozott: nem egyszerűen Sa + l-et ad vissza!) Ha azonban a++ az $a után helyezkedik el. összetett értékadó operátorhoz hasonló. amit azért hívnak így. . Az ilyen viselkedés általánosságban igaz az értékadásra: a teljes értékadási utasítás értéke a bal oldalon levő tényezőhöz rendelt érték. hogy valamilyen műveletet hajrunk végre a változón. echo ++Sa. zárójeleket használva szabályozharjuk a műveletek sorrencljét. 5). Az összetett értékadó műveleti jelek az aritmetikai operátorokhoz. arninek más a hatása. majd az operátor visszaadja az értékér. $b $b $b - + $b Sb Sb * *.24 2. $a l. ám ha egyenlőnek olvassuk. 6 + ($a . Gondoljuk át a következőket: $a. 0. A második sor az előzetes növelés (pre-increment) müveleti jelet használja. illerve a karakterlánc-összefűző müveleti jelhez alkalmaz­ hatók. Összetett értékadó műveleti jelek Az egyszerű értékadó müveleri jelen túlmenően összetett értékadó operátorok is alkalmazhatók.. Ezek rnindegyike azt rövidíti le. és az utasítás megjeleníti azt. Sa . hogy $a . Ez azzal egyenértékű. Az operátor eredménye az Sa értékének növelése eggyel. A teljes kifejezés értéke 5. l. Sb $a $b $a l $b $a % $b $a $b Előzetes és utólagos növelés és csökkentés Az előzetes és utólagos növelés (++ ) és csökkentés ( ) műveleti jel a+. Nézzük a követke­ ző példát: Sa +. majd a műveler eredményét rendeljük a válrozóhoz. Ennek a reljes kifejezésnek az értéke nulla. mert a++ az $a változó előtt jelenik meg. Ha azt írjuk. %. az össze­ hasonlíró müveleti jeleket tárgyaló részében fogjuk megvilágírani. akkor utólagos növelés (post-increment) müveleti jelet használunk. illerve a megnövelt érték visszaadása. 5. fejezer Ezr a sort úgy kell olvasni. Sa 1. Amikor egy kifejezés értékét számítjuk ki. előbb-utóbb összezavarodunk. Jelen esetben az $a értéke 5-re nő. né­ -hány különbség azonban megfigyelhető közöttük. mintha ezt írtuk volna: + 5. Minden növelés műveleti jelnek kettős hatása van: értéknövelés és értékadás. ahogy a fenti pél­ dában is tettük. l Értékadás által visszaadott értékek Az értékadó müveleri jel a többi operátorhoz hasonlóan egy értéket ad vissza. hogy . Ez pontosan úgy müködik.

akkor a 0==0 igaz lesz. $b = $a. hogy a megfelelő operátort választottuk-e! Könnyen elkövethető hiba. ám minden bizonnyal nem kívánt eredményhez vezet. Vegyük például a következő kód­ részletet: $a = 5. .a-ben az müveleri jel hasonlóan müködik. ellenkező esetben false (hamis). Jól gondoljuk.majd megnöveli azt.és" jel) az értékadással együttesen használhatjuk.Tegyük fel. A feloldás nem változtatja meg a $b értékét (7).3 táblázatban talál­ juk. ha a két tényező értéke és típusa is megegyezik. // az $a és a $b értéke is 7 lesz A hivatkozások kicsit trükkös dolgok. Felhívjuk a figyelmet az azonos müveleti jelre (=== ).és eltárolják a $b változóban.Ha például az egyik nulla integer.A támogatott operátorok összefoglalását az 1. Ennek a teljes kifejezésnek az értéke 4. $b = &$a. A nem nulla értékek általánosságban igazként.Ne feleelj ük. ami egyébként hamis. $b = 7. Ezek a sorok létrehozzák az $a változó értékének második másolatát. Mivel a 7 nem nulla. másikhoz rendelünk.hogy a hivatkozás inkább alias.a 0===0 viszont hamis. Használata azonban nem növeli. az első változó másolata jön létre és tárolódik el a memória más helyén.hogy a következő értékeket adtuk az alábbi két változónak: $a = 5.a nullák ha­ misként értékelődnek ki. Az echo utasítás először visszaadja és megjeleníti az $a értékér.Például: $a = 5. amit minden bi­ zonnyal sokszor megtehetünk programozói pályafutásunk során.A követ­ kező kifejezéssel: $a== $b azt ellenőrizhetjük.A kifejezés által visszaadott érték egyenlő­ ség esetén true (igaz). hanem megszünteti az $a és a memóriában tátolt 7-es érték közötti kapcsolatot.hogy az értékadó müveleti jel helyett egyenlőség összehasonlítást használunk. jelen eser­ l $a értékér. Hivatkozási műveleti jel A hivatkozási müveleri jelet ( & . Az urasírás végrehajtása után azonban 5 lesz az $a értéke. mintsem mutató! Az $a és a $b ugyan­ arra a memóriahelyre mutat.Amikor alapesetben valamely változót egy -. Összehasonlító műveleti jelek Az összehasonlító müveleti jelek két értéket hasonlítanak össze.PHP gyorstalpaló 25 Itt a müveleti jel hatása fordított. Az== operátort könnyü összekeverni az értékadás müveleti jelével (=). Az egyenlő műveletí jel Az egyenlő összehasonlító müveleti jel ( ==-két egyenlőségjel) segítségével két érték egyenlőségét állapíthatjuk meg. akkor rendkívül nehezen megtalálható logikai hibát vétettünk volna a progra­ mozásban.Az ilyen müveleti jeleket használó kifejezések az összehasonlí­ tás eredményétől függő logikai értéket adnak vissza ( true vagy false. a $b változóé nem változik: $a = 7.Ha rossz operátort választunk. hogy az $a és a $b változóban tárolt értékek megegyeznek-e.hanem csökkenti a változó.a másik pedig string típusú.A hivatkozási müveleti jel hatását a következőképpen oldhatjuk fel: unset ($a).Hogy miért? Az $a = $b értéke a bal ol­ dalához rendelt érték.Ha ezt követően meg­ változtatjuk az $a értékér. További összehasonlító műveleti jelek A PHP számos egyéb összehasonlító müveleti jelet támogat.a kifejezés igazként értékelődik ki. azaz igaz vagy hamis).Mindig ellenőrizzük e két müveleti jel használatár.Ha az $a == $b kifejezést szerertük volna tesztelni. illetve azt. Ezt az értéket fogja megjeleníteni.amely akkor ad vissza true értéket. $a= 7. a kód hiba nélkül lefut ugyan. Ha ezt követően tesztelnénk az $a = $b kifejezést. ami jelen esetben 7. az eredmény true lenne. // a $b értéke továbbra is 5 lesz A másolat készítését hivatkozási müveleti jel használatával kerülhetjük el.

ha $a és $b is igaz. ahol $a és $b közül legalább az egyik azon bige '1'-es. mint Nagyobb. Ezeket. ha $a vagy $b igaz. Minden más biten 'O'.4 táblázat: A PHP logikai müveleti jelei Műveleti jel && Név NEM Használat !$b $a && Eredmény Igaz.3 táblázat: A PHP összehasonlító müveleti jelei l Műveleti jel Név Egyenlő Azonos Használat $b $a -- $a --- $b != !== <> < > <= >= Nem egyenlő Nem azonos Nem egyenlő (összehasonlító műveleti jel) Kisebb. mint az & &. de a műveletsorrendben hátrébb van Ugyanaz.5 táblázat: A PHP bitmüveleti jelei Műveleti jel & Név Bit ÉS BitVAGY BitNEM Használat $a & $b $a -Sa $b Eredmény Ott lesz 'l' az eredményben. de ha mindkettő igaz vagy hamis. de a műveletsorrendben hátrébb van Igaz. máskülönben hamis Igaz. Ott lesz T az eredményben. mint (összehasonlítá műveleti jel) Kisebb vagy egyenlő Nagyobb vagy egyenlő $a != $b $a !== $b $a <> $b $a < $b $a > $b $a <= $b $a >= $b Logikai műveleti jelek A logikai operátorok logikai feltételek eredményeit vonják össze. akkor hamis lesz az értéke operátor mögött helyezkedik el. akkor két feltétel teljesülését kell megállapítanunk ($a >= O és $a <= l 00} az ÉS műveleti jel használatával: $a >= O && Sa <=100 A PHP a logikai ÉS. A kiértékdési sor­ ÉS VAGY $b ll Sa ll $b $a and $b $a $a or x and or x or ÉS VAGY KIZÁRÚ VAGY $b or $b Az and és az or műveleti jel a kiértékdési sorrendben az && és 1 1 rendről a fejezet későbbi részében olvashatunk. 1. Ha például azt szerernénk megállapítani. illetve használatukat az 1. hogy az egész számokat az őket alkotó bitek sorozataként kezeljük. Minden más biten 'O'. ha $b hamis Igaz.4 táblá­ zat foglalja össze. mindazonáltal az 1. $a összes bitjét invertálja.26 2. hogy PHP-ban túl sokat használnánk ezeket a bitműveleti jeleket. . mint a l l. Bitműveleti jelek A bitműveleti jelek (bitwise operator) lehetövé teszik.VAGY.5 táblázat összefoglalja öket. 1. KIZÁRÚ VAGY ésNEM műveleti jelet támogatja. máskülönben hamis Ugyanaz. ha $a vagy $b vagy mindkettő true.Nem valószínű. hogy az $a változó értéke O és 100 közé esik-e. fejezet 1. ahol $a és $b mindegyikében az a bit '1'-es.

Az@ operátor nélkül ez a sor nullával történő osztáshibát jelezne.) függvényparamétereket és más listaelemeket választ el. a $php_errormsg globális változóha kerülnek a hibaüzenetek A végrehajtó műveleti jel � A végrehajtó operátor iga:z:ából egy pár fordított idézőjel(' '). A műveleti jel használata figyelmen kivül hagyja(elnyomja) a hibát. amit osztály. hogy parancsokat hajtsunk végre a kiszolgálón. hogy egyáltalán mikor következnek be a figyelmeztetések. '</pre>'. Ezeket a 6. • Amikor ilyen módszerrel figyelmen kívül hagyjuk a figyelmeztetéseket. fejezetben (Afájlrendszer és a kiszolgá­ ló elérése) fogjuk áttekinteni ezeket. Egyszerű példa a használatára: ($vizsgaeredmeny >= 50? 'Atment' : 'Megbukott') A fenti kifejezés a hallgatók vizsgaeredményét minősíti átment vagy megbukott kategória szerint. illetve hozzáférési osztály tagjainak értékadására haszná­ lunk. A lapesetben magától értetődően használjuk.nálat $a A Eredmény Ott les:z. A vessző műveleti jel(.PHP gyorstalpaló 27 Műveleti jel Név Bit Has:z. Minden más biten 'O'. ini fájljában bekapcsoljuk a track_errars beállítást. a new és a ->. amely ellenőrzi. hibakezelő kódot kell írnunk. A hibakezelő műveleti jel A hibakezelő műveleti jelet ( @) értéket előállító vagy értékkel rendelkező kifejezések előtt használhacjuk Nézzük a:t alábbi példát: $a = @(57/0). Mindkét kód fogja a könyvtárak listáját és elmenti az $out változóban. Windowsos kiszolgáló esetén a fenti megfelelője: $out echo = 'dir c: '. de másképpen is dolgozharunk vele. '<pre>' . << Biteltolás balra Biteltolás jobbra $a << $b $a bitjeit $b számú bittel balra tolja(minden bitnyi elto­ bitjeit $b s:z. fejezetben részletesebben meg fogjuk vizsgálni. Például Unix-szerű operációs rendszerek esetén használhatjuk a:t alábbi kódot: $out = 'ls -la'. általában a tilde( megegyező billentyűn található a klaviarúrán(magyar billentyűzet esetén pedig a 7 -es billentyűn). '</pre>'. Más módszerek is léteznek arra. A 19. Ezt követően megjeleníthetjük a:tt böngészőben. A háromoperandusú műveleti jel ha igaz : érték. . A kifeje­ zés éttéke a parancs eredménye lesz. Ez nem egyszeres idézőjel. amellyel a fejezet későbbi részében foglalkozunk.ámú bittel jobbra tolja(minden bitnyi elto­ l lás 2-vel való s:torzást jelent). 'l' a:t eredményben. Létezik két különleges műveleti jel. echo '<pre>'. ahol $a és $b közül csakis pontosan az KIZÁRÓ VAGY $b egyikben 'l' állt. >> $a >> $b $a lás 2-vel való egész osztást jelent) Egyéb műveleti jelek Az eddig bemutatott műveleti jelek mellett továbbiakat is alkalma:z:harunk. A mennyiben a PHP php. Ez az operátor a:t if-else utasítás kifejezéses megfelelője. A következökben röviden bemutatunk még néhány műveleti jelet.$out. ) karakterrel A PHP a fordított idézőjelek közötti szöveget parancsként próbálja meg végrehajtani a kiszolgáló parancssorában. ha hamis A háromoperandusú(ternary) műveleti jel? : ) a következő formában működik: ( feltétel? érték.$out.

A tömbelem-operátorokkal ( [ J ) a tömbelemeket érhetjük el. + $olaJ_db + $gyertya_db. . fejezet Tömbműveleti jelek Tóbbféle tömbmüveleti jel létezik. Írjuk be ehhez PHP kódunk aljára a következőket: $osszmennyiseg = 0.noha a müveleti jel matematikai értelemben eltérő en müködik a két esetben. echo "Részösszeg: $adokulcs = 0. A tömböket és a skaláris típuso­ kat nem lehet egymással értelmesen összehasonlítani. Amennyiben megjegyezzük. Ezekkel az operátorokkal a 3.) Az instanceof müveleti jellel kideríthetjük. Típusműveleti jel Egyetlen típusmüveleti jel létezik: instanceof.$b $a != $b $a <> $b $a !== $b Eredmény Az $a és $b tömb minden elemér tartalmazó tömböt ad vissza Akkor igaz. 1. Bizonyos tömbök esetén a => l müveleti jelet is használhatjuk. készen állunk arra. $vegosszeg = $".$osszmennyiseg. ll a helyi forgalmi adó 10% $vegosszeg * (l + $adokulcs). hogy a + összeadást jelent skaláris változók és uniótömbök esetén. Ha frissítjük a böngészőablakban az oldalt. az összefűzés müveleti jelet (. hogy az 1. 10) . Az űrlap végösszegének kiszámítása Most.6 táblázatban szereplő tömbmüveleti jeleknek létezik skaláris változókon alkalmazható megfelelőjük. fejezetben. (Az objektumorientált programozással a 6. $sajat_Objektum = new mintaOsztaly().5 ábrán láthatóhoz hasonló kimenetet kell kapnunk. hogy kiszámítsuk Bob megrendelési űr­ lapján a végösszeget és az adótartalmat. Objektumorientált programozásban használjuk. További tömbmüveleti jelek is használharók. $vegosszeg = $abroncs_db + * $olaj_db * + $gyertya_db GYERTYAAR. ha $a és $b nem egyenlő Akkor igaz. ha $a és $b nem egyenlő Akkor igaz. 4) . ám a teljesség kedvéért az 1.10. akkor analógiát találhatunk a kettő között . ha az $a és $b tömb elemei és azok sorrendje megegyezik Akkor igaz. Ezeket is részletesen megtárgyaljuk a 3. hogy egy objektum egy adott osztály példánya-e. define( 'ABRONCSAR' define('OLAJ AR'. ha az $a és $b tömb elemei kalcsonként megegyezők Akkor igaz. itt csak a teljesség kedvéért említjük. fejezetben foglalkozunk."<br l>". ha $a és $b nem azonos != <> !== Nem egyenlő Nem egyenlő Nem azonos Látni fogjuk.2). ".2) . hogy megismertük a PHP műveleti jeleinek a használatár."<br l>". l 00) .00. $osszmenny1seg = $abroncs db echo "Rendelt termékek száma: $vegosszeg = 0. ) pedig a böngészőnek küldött kimenet beállírásához használjuk.6 táblázatban is szerepeltetjük öket. például: class mintaOsztaly{}."<br l>". fejezerben ismerkedünk majd meg.number_format($vegosszeg. Láthatjuk. az 1. if ($sajat_Objektum instanceof mintaOsztaly) echo "a sajat_Objektum a mintaOsztály példánya".$b $a --. Az összeadás (+) és szorzás ( ) operátorok segitségével számol­ * juk ki a végösszeget. ABRONCSAR OLAJAR * define( 'GYERTYAAR'.6 táblázat: A PHP tömbműveleti jelei Műveleti jel + Név Unió Egyenlő Azonos $a Használat + $b $a -. hogy a kódrész számos müveleti jelet tartalmaz. echo "Végösszeg áfával: $". .28 2.number_format($vegosszeg.

A táblázatban a legalacsonyabb el­ Műveleti jelek elsőbbségi sorrendje PHP-ben Műveleti jelek or xor and print = += -= *= /= ? ll && Csoportosíthatóság bal bal bal bal jobb bal bal bal bal bal bal bal nem értelmezhető nem értelmezhető bal bal bal jobb jobb nem értelmezhető nem értelmezhető < << + & %= &= l= A= -= <<= >>= : != === <= > >= !== >> * l ! [] new () - % ++ -- (int) (double) (string) (array) (object) @ .00 V�ÁFA-Ylll:$29040 l 1.5 ábra: A vevői megrendelés végösszegét kiszámoltuk. lefele haladva nő az elsőbbségük. hogy miért ebben a sorrendben hajtjuk végre azokat. Ez a függ­ vény a PHP Math könyvtárából származik. 7 táblázat: jobb) vagy irreleváns. Ha jobban megvizsgáljuk a szánútásokat. felmerülhet a kérdés. formáztuk és megjelen ítettük.IIT. A kód a number_ forrnat () függvénnyel formázza a végösszeget két tizedesjegyet tartalmazó karakterlánccá. ami azt határozza meg. Ez a sorrend általában balról jobbra (röviden bal). Müveletek elsőbbségi sorrendje és a csoportosíthatóság A műveleti jeleknek (azaz a műveleteknek) létezik egy általános elsőbbségi sorrendje. Az 1. A mű­ veleti jelek csoportosíthaták ( asszociatívek) is lehemek.1-41h� R.jobbról balra (röviden sőbbségi sorrenddel rendelkező műveleti jelek találhatók felül.l2 ��$:264.7 ábra a műveletek PHP-beli elsőbbségi sorrencljét és csoportosíthatóságát mutatja.34.eodet�SDiom. amely szerint kiértékelésük történik. hogy az ugyanolyan elsőbbségű operátorok kiérté­ kelése milyen sorrendben történik. de miért az összeadások előtt végeztük el a szorzásokat? A válasz a műveletek elsőbbségében vagyis kiéttékelésük sorrendjében . Vizs­ gáljuk meg például a következő utasítást: $vegosszeg = $abroncs_db * ABRONCSAR + $olaj db * OLAJAR * + $gyertya db GYERTYAAR. l. A végösszeg helyesnek tűnik.PHP gyorstalpaló 29 Bob autóalkatrészek Rendelési eredmények Rmddk�id6pga!JI'.rejlik.

hogy először az l + $adokulcs kifejezés legyen kiértékelve. • Megjegyzés: A könyv. Mindkettő kezelhető műveleti jelként: a használni kivánt szöveget egyszerűen az echo vagy a print kulcsszó mögé írjuk. A settype () függvénynek két paramétere van: először átadjuk neki a változót. nyugodtan válassza azt! Sem az előbbi. echo gettype($a). A settype () hívása után típusa double-ra változik. string tipus). ennek ellenére tekinthetjük öket a zárójelben paramétert tar­ talmazó függvénynek is. még nem beszéltünk a sorrendben legelső műveleti jelröl. A PHP először a legbelső párban lévő kifejezést értékeli ki. amelynek meg kívánjuk változtaeni a típu­ sát. Mindegyiknek egy változó a paramétere. akárcsak a php. hogy: $vegosszeg = $vegosszeg * l + $adokulcs. hogy a táblázatban szereplő egyik operátorral még nem foglalkoztunk! Ez nem más. majd a tí­ pusnevet tartalmazó szöveget ad vissza. 'double'). és mit adnak vissza-a követ­ kező: string gettype(mixed valtozo). ami bool. double (float típusok).30 2. A két legáltalánosabb függvény a gettype () és a settype (). de ha a Kedves Olvasó a pr int-et szimpatikusabbnak találja. amikor összetettebb kifejezésen belül kívánunk kimenetet generálni. is_double(). hogy a változó float típusú-e.obj ect. Változók típusának ellenőrzése és beállítása A változókhoz kapcsolódó függvények legtöbbje a változó típusának ellenőrzéséhez kötődik. bool settype(mixed valtozo. A zárójelek használatával kikényszeríthető.array. amely kimenetet generál. de mivel a PHP igen rugalmasan kezeli a típusokat. de az echo-nál árnyalatnyival lassabbá teszi. ami helytelen eredményhez vezet. akkor az összeadáshoz képest magasabb elsőbbségi szintű szorzás művelet lesz először végrehajtva. is_ string()-Megállapítja.print nyelvi alkotóelem. A PHP adott típusok ellenőrzésére alkalmas függvényeket is kínál. Ha ehelyett azt ítjuk.Ezzel szükség esetén tudatosan kezelhetjük és alakíthatjuk az elsőbbségi l szabályokat. hogy a változó tömb-e. sem az utóbbi nem igazán függvény. Amennyiben a változó típusa nem szabványos. A gettype( ) használatához rnindenképpen át kell adnunk változót. többször hivatkozik "mixed'. Ilyen adattí­ pus nem létezik.resource vagy NULL lehet. is_long(). azaz vegyes adattípusra.echo-val egyenértékű. vessünk egy pillantást a PHP változókkal kapcsolatos függvényeirel A PHP egyik függvénykönyvtára a változók különböző módon történő kezelését és ellenőrzését lehetövé tevő függvényeket kínál.Ezek prototípusa-vagyis az. a függvény az unknown type szöveget adja vissza.is_real() (ugyanaz a függvény)-Megállapítja.Ez hasznos lehet. Emlékezzünk vissza az előbbi példa következő részére: $vegosszeg = $vegosszeg * (l + $adokulcs). A kifejezésekben tetszőleges számú zárójelpárt használhatunk. A következőképpen használhatjuk ezeket a függvényeket: $a = 56.is_integer() (ugyanaz a függvény)-Megállapítja. Könyvünkben általában az echo-t használjuk. string. Változókhoz kapcsolódó függvények Mielőtt elhagynánk a változók és műveleti jelek világát. Az alábbi függvények tartoznak ide: is_array()-Megállapítja. sok függvény szinte bármilyen adattípust elfogad. settype($a.is_int(). A függvény meghatározza annak típusát. és true vagy false értéket ad vissza. '<br />'. echo gettype($a). mint az. A gettype () első hívásakor az $a integer típusú.net dokumentáció. '<br />'. majd az új adattípust tartalmazó karakterláncot (a típust az előző listából választhatjuk ki). mert értéket (l) ad vissza. hogy a változó string típusú-e. hogy rnilyen paramétert várnak. a jó öreg zárójelről! A zárójel használata megnöveli az általa közrefogott tartalom elsőbbségi sorrendjét. . int. A print azért tekinthető függvénynek.is_float(). A sokfé­ " le adattípust elfogadó paramétereket jelöljük "mixed típusként. Figyeljük meg. hogy a változó integer típusú-e. fejezet Vigyázat.

hogy a változó resource típusú-e. '<br />'. hogy nem üres. Feltételes utasításokra (elágazásokraJ és ismétlődő szerkezetekre ( ciklusokraJ bonthatók.empty($nincs i lyen). ]]) A fuggvény változónevet fogad paraméterként. és annak megfelelő típusra alakított értékét adja vissza.empty($abroncs_db). hogy a változó skaláris-e (integer. isset($nincs ilyen). is_object () -Megállapítja.mixed valtozo[. hogy a változó object típusú-e.ha semmilyen értéket nem adtunk meg az űrlapon. hogy a felhasználó kitöltötte-e egy űrlapon a szükséges mezőket. [.]]) A fuggvény eltávolítja a neki áradott változót.. amelyekkel a program vagy kód végrehajtásának menetét szabályozhatjuk. Változók típuskonverziója A változók típusalakítását fuggvényhívással is elérhetjük. is_numeric() .Megállapíga. l Változók állapotának ellenőrzése A PHP számos fuggvénnyel segíti a változók állapotának meghatározását. string strval(mixed valtozo). Nézzünk példát ennek a három fuggvénynek a használatára! Átmenetileg adjuk kódunkhoz a következő sorokat: echo ech o echo echo 'isset($abroncs_db): 'isset($nincs_i lyen) : 'empty($abroncs db): 'empty($nincs_ilyen): '. .amelynek prototípusa a következő: bool isset(mixed valtozo). Mindegyik változót fogad paraméterként. Ha szeretnénk reagálni a felhasználó által megadott értékre vagy válaszra. ezért az isset() fuggvény üres ( false ) eredményt. és true értéket ad vissza létező változó esetén. hogy a változó egy érvényes fuggvény neve-e.nem nulla értékkel bír. Az első ilyen az is set (). is_resource() . A prog­ ramot döntéshozatalra késztető programnyelvi elemeket Jeltételes utasításoknak nevezzük.PHP gyorstalpaló 31 is_bool () -Megállapítja. '.ha az összes változó létezik. egyébként pedig false-t. kódunknak tudnia kell döntéseket hozni. hogy a változó null típusú-e.boolean. '. . Az empty () fuggvény által visszaadott érték viszont attól fugg. és nézzük meg az eredményt! Az isset() fuggvény az űrlapmezőbe bevitt értéktől fuggedenüll-et (true ) ad vissza az $abroncs_db változóra. Az empty ( ) fuggvénnyel ellenőrizhetjük változó meglétét és azt. is_ null () . A fuggvény prototípusa a következő: void unset(mixed valtozo). '<br />'.mixed valtozo[. Frissítsük az oldalt. hogy a változó valamilyen szám vagy numerikus szöveg-e.) Döntéshozatal feltételes utasításokkal A vezérlési szerkezetek olyan programnyelvi elemek. Ezek a fuggvények akkor tudnak igazán hasznunkra válni. is_scalar() .. Az unset() fuggvénnyel megszüntethetünk változókat. hogy mit gépeltünk be. [. int alap]).amikor ellenőriznünk kell. float floatval(mixed valtozo).isset($abroncs db). Prototípusa a következő: bool empty(mixed valtozo). .Megállapíga. is_callable ()-Megállapítja.Megállapíga. Az intval() fuggvény­ nél még a konvertálás alapját is meghatározhatjuk. string vagy float típus valamelyike).még akkor is. Az alábbi három fuggvény használható erre a célra: int intval(mixed valtozo[. ennek megfelelően true vagy false értéket ad vissza. '<br />'. ha az átalakítani kívánt változó szöveg. A $nincs_ilyen változó nem létezik. Ha változónevek vesszővel elválasztott listáját adjuk az is set ()-nek.az empty() pedigl-et (true) ad vissza. . '<br />'. . (Így például egész számmá alakítha­ runk hexadecimális karakterláncokat. '.Megállapítja.a fuggvény akkor tér vissza true értékkel. hogy a változó boolean típus ú-e.

.32 2. jobb lenne. utasítások e ls e Gyakran nem csak arra van szükségünk. sem olajat. Tegyük fel. például az if teljesülésétől függöen egynél több utasítást szecetnénk végrehajtani. Ameny­ echo 'Egyetlen tételt sem rendelt az előző oldalon!<br />'. hogy figyelmeztetni szeretnénk Bob ügyfeleit. fejezet if utasítások Az if utasítást döntéshozásta használhatjuic A döntéshez meg kell adnunk a kiértékelendő feltételt. hogy mely sarok hajtódnak végre az ifjeltételek teljesülésekor. A feltétel teljesülése esetén rnindhárom sor végreh:Ytódik. Ha a feltétel nem teljesül. a PHP-t nem érdekli kódunk elrendezése. Amikor a látogató egyetlen tételt sem rendel. • Megjegyzés: Mint már utaltunk rá. akkor az alkalmazás nem foglalkozik ezzel a három sorral. Ekkor ahelyett. mint az értékadó operátor ( = ) ! Az $osszmennyiseg == O feltétel akkor teljesül és lesz true. Az if utasítás feltételét zárójelek {) közé írjuic Ha például a látogató nem rendel Bobtól sem gumiabroncsot. a vásárló lépésétől függöen figyelmeztetést vagy a rendelés össze­ foglalását is megjelenítheljük számára: if {$osszmennyiseg == 0) { echo "Egyetlen tételt sem rendelt az előző oldalon!<br />". akkor elképzelhető. Az else utasítással meghatározhaljuk azt a müveletet. A blokkot kapcsos zárójelekkel fogjuk körül: if {$osszmennyiseg == 0) { echo '<p style="color:red">'. utasítás lesz végrehajrva. A következő kód esetén a figyel­ meztetés akkor jelenik meg. Emlékezzünk vissza. ha üresen küldik el a megrendelést! Ha viszont rendel­ nek valamit. amennyiben a vevő az adott termékből rendelt valamennyit: if ($osszmennyiseg == 0) { echo "Egyetlen tételt sem rendelt az előző oldalon!<br />". hogy az if utasítástól függő utasítás. echo $olaj_db. és mely utasítások képezik ciklusok vagyJüggvények részét. ha az oldal hasznos üzenetet jelenítene meg számára. A kapcsos zárójelek által közrefogott három sor immár egy kódblokkot képez. .Rendelés küldése" gombra. hogy feltételes utasítás. akkor a figyelmeztetés helyett a rendelésüket szeretnénk megjeleníteni számukra. hogy véletlenül már az űrlap kitöltésének befejezése előtt rákattintott a. hogy eldönthessük. hanem a vizs­ gált feltétel nem teljesülésének esetére is szecetnénk megadni a lehetséges tennivalókat. Az if utasítások egymásba ágyazásával bonyolultabb logikai müveleteket is végrehajthatunk. Amennyiben az true. hogy az $osszmennyiseg == hogy az egyenlő müveleti jel ( ==) eltérően müködik. l vagyis igaz. hogy. a feltétel nem teljesül." gyújtógyertya<br />". Az itt használt feltétel az. echo '</p>' . atrtit az if utasításban megadott feltétel nem teljesülése esetén kell végrehajtani. A feltétel teljesülése esetén az echo Kódblokkok Gyakran előfordul. közölheljük vele például azt. Behúzás használatával szempillantás alatt láthatjuk. mely utasítások vannak az adott blokkokba csoportosítva. szereménk-e egy müveletet végrehajtani vagy nem. nyiben az $osszmennyiseg értéke nem nulla. azaz false lesz." flakon olaj<br />". echo 'Egyetlen tételt sem rendelt az előző oldalon!'. Olvashatósági okokból azonban érdemes behú­ zásokkal tagolni kódunkat. Egyetlen tételt sem rendelt az előző olda­ lon!" Ezt egyszerűen megteheljük az alábbi if utasítással: if{ $osszmennyiseg == O ) O. echo $gyertya_db. Ha átdolgozzuk a kódot. ha az $osszmennyiseg == O feltétel teljesül. illetve a blokkat alkotó utasítások behúzva jelennek meg. sem gyertyát. else echo $abroncs db. vagyis a rendelt tételek összege nulla." gumiabroncs<br />". hogy megrendelését feldolgoztuk. a rendelés összefoglalásának sorai pedig csak akkor jelennek meg. Az előző példákban láthatjuk.. akkor a következő kódblokk fog végrehajtódni. és else utasítással egészíljük ki. hogy közölnénk a vevövel. ha az $osszmennyiseg nullával egyenlő. Az utasításokat blokkokba csoportosíthatjuk.

" gyújtógyertya<br />". hogy írhatunk elseif és else if formát is. Minden egyes kezelni kívánt ér­ tékhez case utasítást adunk. mett a feltételek kölcsö­ nösen kizárják egymást.egészen addig." gumiabroncs<br />". feltéve. Bob kedvezményt ad a nagytételben vásárolt gumik után.nincs kedvezmény 10-49 gumiabroncs vásárlása. hogy az egyszerű típusként (integer. illetve if és elseif utasítások használatával írhatjuk meg. ezért még egy kérdést kell adnunk a megrendelési űrlaphoz. amíg valamelyik igaznak nem bizonyul. amely egy else és egy if utasítás kombinációja. amely a case utasítás­ sal nem lefedett értékek esetén lesz végrehajtva.6 ábrán láthatóhoz hasonlóan fog megjelenni: <td>Honnan h allott Bob autóalkatrész-boltjáról?</td> <tr> <td><select name="honnan. barát tól</option> . Bob tudni szeretné. hogy a feltétel kettőnél több értéket vegyen fel. de lehetövé teszi. && elseif (($abroncs db >= $kedvezmeny = 5." if ($gyertya_db > 0) echo $gyertya_db.h allott-rolunk"> <option value <option value <option value <option value </select> <ltd> </tr> "a">Visszatér6 vásárló vagyok</option> "b">Tévéreklám</option> "c">Telefonkönyv</option> "d">Ismer6st61. hogy csak az első reljesült feltételt köverő blokk vagy utasítás lesz végrehatjva.PHP gyorstalpaló 33 } else { if {$abroncs_db > 0) echo $abroncs_db.mindkét változat egyaránt helyes. elseif utasítások Számos olyan döntés létezik. A switch utasításbeli feltétel tetszőleges számú különböző értéket felvehet. ($abroncs_db <= 99)) Érdemes tudni. amelyek közül egyszerre egynél több is teljesülhet. && elseif (($abroncs_db >= 50) $kedvezmeny = 10.10 %kedvezmény 100 vagy több gumiabroncs vásárlása.99 gumiabroncs vásárlása.15 %kedvezmény A kedvezményeket Iciszámoló kódot feltételek. l echo $olaj_db. elseif ($abroncs_db >= 100) $kedvezmeny = 15. ne felejtsük el. Szúrjuk be az űrlapba a következő HTML kódot. amikor kettőnél több lehetőségünk van. Különböző kimenetek sorozatát teremthetjük meg az elseif utasítással. A kedvezmények rendszere a következőképpen müködik: 10-nél kevesebb gumiabroncs vásárlása . egyszerre csak az egyik teljesülhet. Amikor feltételek sorozatát határozzuk meg. Az if utasításban szereplő feltétel csak igaz vagy hamis lehet. Ebben az esetben az AND műveleti jellel $kedvezmeny = (&&) kombinálhatjuk össze a két feltételt: 10) if ($abroncs_db < { 10) ($abroncs db <= 49)) O. akkor már van jelentősége annak.5 %kedvezmény 50. switch utasítások A switch utasítás az if utasításhoz hasonlóan működik. Ha több elseif utasítást írunk. hogy melyik hirdetései váltak be. a prog­ ram mindegyiknek a teljesülését ellenőrzi . hogy a blokkok vagy utasítások közül csak egy lesz végrehajtval Ez itt nem okoz gondot. ekkor az űrlap az 1. illetve érdemes egy alapértelmezett ( default ) esetet is meghatározni. if {$olaj_db > 0) fiakon olaj<br />". string vagy float) értékelődik ki. Ha azonban olyan feltételekkel dolgozunk.

</p>". hogy a $_POST tömbből nyerrük ki a $honnan_hallott_relunk változót. break. elseif vagy switch utasítással megrehetünk. Amit egy vagy több else. break.</p>". .</p>". == "d") baráttól hallott Bobról. hogy az adon szituációban melyik utasítást kell választanunk.</p>". fejezet l 1.</p>". case "d" : baráttól hallott Bobról.</p>".</p>". elseif ($honnan_hallott_rolunk == "c") echo "<p> Telefonkönyvben találta Bobot. feltehemé a kérdést. úgy lesz egyre könnyebb ráérezni. echo "<p> break. else echo "<p>Nem tudjuk. Nem igazán létezik jó válasz erre. Ugyanezt érjük el egy switch utasítás segítségével is: switch($honnan_hallott_rolunk) case "a" : l echo "<p>Visszatér6 vásárló. honnan hallottak Bob alkatrészbolljáról. elseif ($honnan hallott relunk == echo "<p> Tévéreklámban hallott Bobról.) A switch utasítás az if és elseif utasítástól kissé eltérően működik.34 2. echo "<p>Ismer6st61. break utasítás nélkül a switch a teljesült feltétel utáni összes utasítást végrehajtja. Ahogy egyre több tapasztalatot szerzünk. elseif ($honnan_hallott_rolunk echo "<p>Ismer6st61. Az adon helyzetben a programozó számára legjobban olvasható (értelmezhető) feltételes utasítást kell használnunk. honnan ismeri Bobot. honnan ismeri Bobot.ő feltételes utasítások összehasonlítása Aki nem használta még az előző részekben bemutaton utasításokat. case "c" : echo "<p> Telefonkönyvben találta Bobot. a switch utáni következő sorral folytatja a kód végrehajtását.6 ábra: A rendelési űrlap azt kérdezi a látogatóktól. (Mindkét példa azt feltételezi. if és A HTML kód új változót vezet be (neve honnan_hallott_rolunk) .</p>".</p>".</p>". hogy melyik a legjobb. break. 'b'. értéke 'a'. A különböz. Amikor egy switch utasításban lévő case utasítás aktiválódik. case "b" : Tévéreklámban hallott Bobról. default : echo "<p>Nem tudjuk. az if utasítások sorozatával is elérhető. A switch éppen ellentétes módon működik. a PHP a következő break utasításig található összes kódot végrehajtja. 'c' vagy 'd' elseif utasítások sorozatával a következőképpen kezelhetjük ezt az új változót: == if ($honnan hallott_rolunk "a") l "b") echo "<p>Visszatér6 vásárló. lehet. Amikor eléri a break utasítást. break. Az if utasítás egyeden utasításra vagy kapcsos zárójelekkel létrehozon kód­ blokkra hat.

hogy hosszú és ismétlődő. akkor ciklussal ismételhetjük meg a program adott részeit. A költség egyszerű képleetel kiszámítható. � "':. hogy a kiszállírási táblázat ll nll•l• . A Bob által igénybe vett futárszolgálatnál a kiszállírási dij a távolságtól függ.. html <html> <body> <table border="O" cellpadding="3"> <tr> <td bgcolor="#CCCCCC" align="center">Távolság</td> <td bgcolor="ICCCCCC" align="center">Költség</td> </tr> <tr> <td align="right">SO</td> <td align="right">S</td> </tr> <tr> <td align="right">lOO</td> <td align="right">lO</td> </tr> <tr> <td align="right">lSO</td> <td align="right">lS</td> </tr> <tr> <td align="right">200</td> <td align="right">20</td> </tr> <tr> <td align="right">250</td> <td align="right">25</td> </tr> </table> </body> </html> - Bob kiszállítási táblázatának HTML kódja . Láthatjuk.PHP gyorstalpaló 35 Műveletek ismétlése iterációval A számítógépek nundig is kiválóan alkalmasak voltak az ismétlődő feladatok automatizálására. Azt szeretnénk.IM <> l l az 1. 100 150 200 2�0 10 IS 20 2S 1. hogy a távolság növekedésével együtt emelkedik a kiszállítás költsége. Bob szeretné a kiszállírási költséget tartalmazó táblázatot megjeleníteni és hozzáadni a vevői megrendeléshez. - ..2 példakód: kiszalli t as. 1. � . Az 1.2 példakód az ezt a táblázatot megjelenítő HTML kódot mutatja.7 ábrán láthatóhoz hasonló legyen.7 ábra: A táblázat azt mutalja. Ha valamit ugyanúgy kell meghatározott alkalommal végrehajtani.

1. wh i l e ciklusok A legegyszerűbb ciklus a PHP-ben a while. ha a kimenet nem teljesen egyezik meg a várttal. A while ciklusok ennél hasznosabb dolgokra.3 példakód: kiszallitas. érdemes inkább a for ciklust használni.3 példakódban \n karaktereket láthatunk egyes szetingeken belül."<br />". ha a megadott feltétel teljesül. érdemes az olcsó és fáradhatatlan számítógépet használni erre.36 2. gyakran kell a HTML kódot böngésznünk. hogy az utóbbi csak egyszer hajtja végre az utána levő kódot. a bön­ gészők ugyan figyelmen kívül hagyják a fehérköz karaktereket.($tavolsag </tr>\n". hány ismétlődés fog bekövetkezni addig. fejezet Ahelyett. ?> </table> </body> </html> A kód által generált HTML olvashatóvá tételéhez új sorokat és szóközöket kell beillesztenünk. Az utasításokat ciklusba helyezve kiadjuk a PHP-nek. amíg a feltétel igaznak bizonyul. Ha kettős idézőjelben lévő szövegben szerepel. Hiszen. amikor nem tudjuk. hogy órabérben fizetett és könnyen fásulttá váló alkalmazottal gépeltetjük be a HTML kódot. Ahogy már jeleztük. A while ciklus mindaddig ismétlődően végrehajtja a blokkot. Ha meghatározott számú ismétlődésre van szükség. például az 1. és csak akkor.$tavolsag. "</td> 50.php -Bob kiszállátási táblázatának előállítása PHP-vel <html> <body> <table border="O" cellpadding="3"> <tr> <td bgcolor="#CCCCCC" align="center">Távolság</td> <td bgcolor="#CCCCCC" align="center">Költség</td> </tr> <?php $tavolsag = 50. .7 ábrán levő. ám az emberek rniatt szükség van rájuk. amíg a feltétel teljesül. és véget ér a ciklus."</td> <td align=\"right\">". 250) { while ($tavolsag <= echo "<tr> <td align=\"right\">".3 példakód while ciklussal állítja elő a díjtáblázatot. Az if utasításhoz hasonlóan ennek müködése is egy feltételtől fligg. ismétlődő táblázat megjelenítésére is képesek. Az 1. while ($num <= 5 ) { echo $num. A while ciklus alapstruktúr:ija a következő: while( feltétel ) kifejezés. A while ciklus és az if utasítás között az a különbség. a blokk nem hajtódik végre. $tavolsag += l 10). hogy ismétlődően hajtsa l végre az utasítást vagy kódblokkot. $num++. Ha a feltétel hamís. A while ciklust jellemzően akkor használjuk. Az 1. akkor ez a karaktersor újsor karaktert jelent. A ciklus utáni következő utasítással folytatódik a kód futása. A következő while ciklus 1-tőlS-ig jeleníti meg a számokat: $num = l. Minden ismétlődés elején a kód teszteli a feltétel teljesülését.

Kiugrás vezérlési szerkezetből vagy kódból Ha szereménk leállítani egy kódrészlet végrehajtását..J { ?> Működésüket tekintve a while és a for ciklust használó változatok egyenértéküek. A for ciklus alapszerkezere a következő: for( kifejezésl. while( feltétel } . $tavolsag <= 250.3 példakódban szereplő wh ile ciklust átírhatjuk for ciklussá. a végénél pedig módosítjuk annak értékér.. Ez általában egy kódblokk. amivel a ciklus indul. l feltétel."<ltd> <ltr>\n". nev2. hogy a feltétel ellenőrzésére a végén kerül sor (hátultesztelős ciklus). kifejezés2) kifejezés]. akkor a következőképpen dolgozhatjuk fel ezeket: for ($i=l . do{ echo $num. for ciklus segítségével ennél rövidebben is írhatunk ilyen stílusú ciklust. mint a másik. Min­ den ismétlődése előtt a feltételben ellenőrizzük a számlálót.."<ltd> <td align=\"right\">". Még a következő példában is. Az 1. }while ($num < l ) . Minden helyzetben azt a ciklust használjuk. Minden egyes ismétlődés előtt a feltétel ben szereplő kifejezés értékelődik ki. Itt általában a számláló kezdeti értékét állíguk be. Kezdéskor végrehajtódik a kifejezés l. Beállírunk egy számlálót. $i++} { $temp= "nev$i". két sort megspórolhatunk vele. mielőtt ellenőrizné a feltételt és leállna: $num = 100.és soha nem is fog-. amely a ciklus kódjának lényegér tartalmazza. az ismétlődés - véget ér. ($tavolsag l 10) .. A do. while ciklus esetén a benne levő urasírás vagy blokk minden esetben legalább egyszer végrehajtódik.PHP gyorstalpaló 37 for és fo reach ciklusok Aw hile ciklusokat gyakran használjuk az előző részben látott módon. Ebben az esetben a PHP kód a következőképpen néz ki: <?php for ($tavolsag = 50. amelyben a feltétel már az elején nem teljesül. amit kifejezetten a tömbökkel végzett munkára alakírottak ki. Minden ismétlődés végén végrehajtódik a kifejezés2. egyik sem rosszabb vagy jobb. $i <= $nevek_szama. az elérni kívánt eredményről függően három megközelítés közül választharunk. fejezetben ismerkedünk meg. hogy a do. nevü ürlapmezőkkel dolgozunk.while ciklusok Az urolsóként bemutatandó ciklustípus enyhén eltérő módon viselkedik.while általános szerkezete a következő: do kifejezés. Itt általában egy értékhatárral hasonlígak össze a számlálót. Ha a kifejezés hamis. amir ösztönösen választanánk! Változó változókat for ciklussal kombinálva ismétlődő ürlapmezők sorozatát járhatjuk be.. Akér ciklustípus egyenértékű. nev3 stb.$tavolsag. Ezt azt jelenti. ll vagy amilyen más feldolgozási módszerre van szükségünk Aváltozónevek dinamikus létrehozásával az összes válrozót egyenként elérhegük.'<br l>'. echo $$temp. $tavolsag += 50} echo "<tr> <td align=\"right\">". . Ha például nevl.. do . a ciklus egyszer lefut.while ciklus abban különbözik a while ciklusról. A do . Afor ciklus mellett foreach ciklus is létezik."<br l>". Itt általában módosíguk a számláló értékér. Használatá­ val a 3.. Akifej e zés3 ismétlődésenként egyszer hajtódik végre. A for ciklus valamivel tömörebb..

endswitch. Ha ciklusorr belül break utasítást használunk. "Egyetlen tételt sem rendelt az el6z6 oldalon!<br l>". a declare-t a mindennapi programozás során a többihez képes ritkábbarr használ­ juk. A do .akkor a continue utasítást kell alkalmaznunk.más néven az utasítás zárójel helyett kettőspontot (:). (PHP és MySQL használata nagyobb projektekhez) és a 26. az if és endif kulcsszóval átírhag uk a másik szintaktikára is: 0) : "Egyetlen tételt sem rendelt az el6z6 oldalon!<br l>". fejezetben (Hibakeresés) találkozunk. endif.a tick nevű futtatási direktíva van beállítva. Hogyan további Mosr már tudjuk. Ha a ciklus következő ismétlődésére kívánunk ugrani. A declare szerkezet használata A PHP egy másik vezérlési szerkezetét. Ez a faj ra megközelítés jellemzőerr hibaellenörzéskor lesz hasznos. endwhile. A tick függvények használatát bemutató példákkal a 25.akkor az ex it utasítást használjuk. A következő fejezerben megranuljuk. sorában futtassunk egy adott függvényt. Ha a teljes PHP kód végrehajrásár akarjuk befejezni. hogyan fogadjuk és kezeljük a vevők megrendeléseit. Jelenleg egyetlen. A ticks=n direktíva beszúrásával kapcsoljuk be.akkor a switch utasítást bemutató részben tárgyalt break utasí­ l tást kell használni.38 2. Ez abból áll. A declare vezérlési szerkezeter itt csak a teljesség kedvéért említettük meg.. 0) { "Egyetlen tételt sem rendelt az el6z6 oldalon!<br l>". hogy a kezdő kapcsos záró­ jel({). hogyan fusson le a következő kód. fejezet Amennyiben ciklus végrehajtását akarjuk megállítani. amely elsősorban a profilozás és hibakeresés esetén hasznos. Alternatív vezérlési szerkezetek alkalmazása Az eddig áttekintett összes vezérlési szerkezethez létezik egy alternatív szintaktika is.. Például a következőképpen módosírhaguk az előző példát: if($osszmennyiseg == echo exit. Az ex it meghívása megakadályozza.hogy a későbbiekben visszakereshetök és teljesírhetők legyenek. while ciklus esetén az ilyen vezérlési szerkezer nem használható. Lehetövé teszi. { Például az alábbi kódot: if ($osszmennyiseg == 0) echo exit. hogyan tároljuk el azokat. if ($osszmennyiseg == echo exit. endfor vagy endforeach lehet. . amely a használt vezérlési szerkezettől függőerr endif.hogy a kódblokk rninden n. hogy a PHP leftmassa a kód hátralevő részér. Ennek az általános formája a következő: declare (direktíva) ll blokk } Ezzel a szerkezetteljuttatási direktívákat állítunk be-vagyis szabályokat arra vonatkozóan. a kód végrehajtása a ciklus utáni következő kódsorral fog folytatódni.a záró kapcsos zárójel helyett pedig egy új kulcsszót használunk.

hogyan érjük el és kezelhetjük a HTML űrlapba bevirt adatokat. érdemes inkább adatbázis-kezelő rendszert. Ha jelentős mennyiségü információval dolgozunk.pontosan ez a célunk: a későbbi visszakereshetőség érdekében eitároini az adatokat. A fejezetben az alábbi főbb témaköröket érintjük: Adatok elmentése későbbi használat céljából Fájl megnyitása Fájl létrehozása és fájlba írás Fájl bezárása Olvasás fájlból Fájlok zárolása Fájlok rörlése Egyéb hasznos fájlfüggvények használata Egy jobb módszer. A példában az ügyfelek megrendeléseit fogjuk eltárolni. A fejezet példájá­ ban szöveges fájlba írjuk az ügyfelek megrendeléseit úgy. és bizonyos helyzetekben jól jön. ahogy azt a fejezet későbbi részében látni fogjuk. nézzük meg. ha tudjuk használni öket. Bob megrendeléseinek eltárolása és visszakeresése Ebben a fejezetben az előzőben megismert megrendelő űrlap kissé módosítort változatával fogunk dolgozni. ám nagymértékben beszükiti majdani lehetőségeinket. hogy minden sorba egy megrendelés kerül. A fájlba írás és fájlból olvasás folyamata sok programozói nyelvben hasonló. Az egyszerű fájl sokféle formátumú lehet. de az ilyen fájlok alatt általában egyszerű szöveges fájlt értünk. Kezdjük a munkár ezzel az űrlappal.hu/mellekletek oldalról letölthető mellékletek OlJejezet mappájában taláijuk. majd később betölteni. hogy egyszerűen megtudhassuk a vevő szállítási címét is. Módosítorták számunkra az űrlapot. adatbázis-kezelő rendszerek használata • • Adatok elmentése későbbi használat céljából Az adartárolás két alapvető módja az egyszerű fájlokban és az adarbázisban történő tárolás.1 ábrán láthatjuk. Az is kiderül. ismerősnek fogják találni ezeket az eljárásokat. akik programoztak már C-ben. A megrendelések ilyetén tárolása igen egyszerű.2 Adatok tárolása és visszakeresése Most. illetve hogyan olvas­ hatjuk vissza azokat. Ebben a fejezetben megranuljuk. . célszerűbbnek fogjuk találni adatbázis hasz­ nálatát. miként lehet későbbi felhasználás céljából eitároini azokat! Az esetek többségében . illetve a megrendelési adatok feldolgozására írt PHP kóddal! • Megjegyzés: A fejezetben használt HTML és PHP kódokat a http:/lwww. A módosítort űrlapot a 2. Azok. hogyan írhatjuk az előző példából származó megrendeléseket fájlba. Ha nagyszámú megrendeléssel dolgo­ zunk. például MySQL-t használni. vagy írtak már Unix shell szkripteket.perfactkiado. Az egyszerű fájloknak is megvan azonban a maguk haszna. hogy miért nem minden esetben lesz ez jó megoldás. hogy már tisztában vagyunk azzal.ahogy az előző fejezet példájában is .

Egyelőre azonban kezdjük a dolgot a legele­ jén. hogy jelezzük a felhasználónak a fájl meglétét. Létező fájl ese­ tén felülírás helyerr azt is megcehetjük. ezt fel kell ismernünk. Amikor megnyirunk egy állományt. hogy binárisként vagy szövegesként akarjuk-e kezelni a fájlt. mert nem létezik a fájl). 3. Amennyiben a bináris és szöveges fájlokat megkülönböztető rendszeren próbálunk meg fájlba írni. 2. Fájlok feldolgozása Az adatok fájlba írásához három lépésre van szükség: l. hogy miként kivánjuk használni. 2. A fájl megnyitása. más kód egyáltalán megnyithatja-e. Amikor fájlba írunk. Amikor fájlból kivánunk adatokat beolvasni.--=. A fijl megnyitása. vagy új adatokat fűzhetünk a végéhez. a fájl megnyitásáva!! Fájl megnyitása A fájlok PHP-beli megnyitásához az fo pen ( ) függvényt használjuk. felülírhatjuk a meglévő fájl jelenlegi tarcalmát. majd a fájl módosítása nélkül kilépünk a programból. Amennyiben a megnyitás nem lehetséges (például azért.__-----------. A fájl bezárása. Fájl megnyitásakor három döntést kell hoznunk: l. azt is meg kell határoz­ nunk.$ POST [ 'szalli tasi_eim' l vagy$_GET ['szalli tasi_eim' l for­ ' _ mában érjük el. 2. hogy egyszerre a fájl mekkora részét olvassuk be. 2 _ 2. (A részletekért lásd a PHP gyorstalpaló című l. hogy van-e hozzáférésünk és jogosultságunk az adott fájlhoz. Amennyiben a fájl még nem létezik. A fájlt megnyithatjuk csak olvasásra. A fijl bezárása. amivel meg tudják határozni. létre kell hoznunk. fejezetet!) A mostani fejezet során ugyanabba a fájlba írjuk a beérkező megrendeléseket. A megfelelő megnyitási mód kiválasztása A szerver operációs rendszerének tisztában kell lennie azzal. fejezet Bob autóalkatrészek Rendelési urbp �====::::J ����---. csak írásra. . és módszert kínálnak annak ellenőrzésére. Ezt a megnyitási mód segítségével tehetjük meg.40 2. Hasonlóképpen három lépést igényel a fájlban lévő adatok beolvasása is. Adatok olvasása a fájlbóL 3. Az így kapott változót az űrlap adaeküldési metódusától függően$ REQUEST ['szalli tasi_eim ] . Ezt követően elkészítjük Bob alkalmazottai számára az internetes felületet. illetve hogy mi (vagy a kód tulajdonosa) rendelkezünk-e egyáltalán jogosultsággal a kivánt módon használni a fájlt. Tudnia kell. A leggyakoribb lehetőségeket részletesen bemutatjuk.-- ��� -=.cd. hogy amíg általunk meg van nyitva az állomány. vagy írásra és olvasásra is. hogy mit szerernénk tenni az éppen megnyírni kivánt fájllal. l. 3. meg kell határoz­ nunk. A megnyitási módok lényegében olyan mechanizmust adnak az operációs rendszernek. _ A szállítási címhez tartozó űrlapmező neve szalli tasi eim. és a megfelelő visszajelzést kell adni a felhasználónak.1 ábra: A megrendelési űrlapjelen változata a vevő szállítási címét is kéri. Adatok írása a fájlba. Az fopen ( ) függvény e három lehetőség tetszőleges kombinációját támogatja. miként kezelje a más felhasználóktól vagy kó­ doktól érkező hozzáférési kéréseket. többféle választási lehetőségünk van arra vonatkozóan. ahol megtekinthetik a beérkezett megrendeléseket.

\\rendelesek\\rendelesek.interneten keresztül elérhető legyen. Fájl megnyitása olvasásra és írásra a fájl elején kezdve. fopen ( ) függvénnyel Tegyük fel. Hagyományos perjelek alkalmazása eserén minden módosírás nélkül használharjuk a kódot windowsos és unixos gépekeil is. hogy megrendelést szeretnénk írni Bob rendeléseket eltároló állományába! A következökkel tudjuk megnyieni a fájlt írásra: = $fp fopen ("$DOCUMENT_ROOT/. a PHP pedig figyelmeztetést generál. A szerzök már megfizették a tanulópénzt. Ahogy az űrlapadatok elérésének is több módja lehetséges. Létező fájl eserén törli a meglévő tartalmat. Windowsos platform eserén ha­ gyományos (/)és fordírott perjeleker ( \) is alkalmazhatunk. hogy . ez azt jelenti. Ez a gyökérkönyvtárból (Unix-rendszeren l. hogy rnir sze­ reenénk tenni a fájllal. megpróbálja létrehozni. mert az azt eredményezi. három vagy négy paramétert vár. megpróbálja létrehozni. karakterekkel. Az első paraméter a megnyitni kivánt fájl legyen! Megadhatjuk elérési útvonalát. Ez a változó a webszerver dokumentumfájának tetejére mutat. Jelen esetben a paramétert adjuk az f o p e n () függvénynek. hogy megfelelöen értelmezze azokat. most is az alábbi sort kell a kód elején szerepeltetnünk ahhoz. ha valamilyen CGI wrapperen (értelmezön)keresztül futtaguk a PHP-t.1 táblázat A:�. Ha a fájl nem létezik.txt". mint az alábbi példában: $fp = fopen("$DOCUMENT ROOT\\. Ez határozza meg. az fopen() false értékkel tér vissza. 2. Védökarakrerkénr egyszerűen egy másik fordítorr perjelet kell eléjük írnunk.a fájl megnyitása írásra:' A megnyitási módok összefoglalásár a 2.a dokumentum gyökérkönyvtárá­ nak szülökönyvtárára" utal.. Nagyon kevesen használnak fordított perjeleket a PHP-beli elérési útvonalakban. 'w' Az fopen () második paramétere a megnyirási mód. Fájl megnyitása írásra a fájl elején kezdve. txt". Kiszolgálónk beállításától függöen (a részleteket lásd az l. A fájlokhoz abszolút elérési útvonalat is megadhatunk. A kódsor a . rövidebb nevet rendeltünk hozzá. jelen esetben a r endele sek. Ez a könyvtár biztonsági okokból a dokumentumfán kivül helyezkedik el. windowsos rendszeren álcalában C:\) induló elérési útvonal. de akárcsak az űrlapváltozók körülményes teljes neveinél.1 táblázarban találjuk. mint ebben a példában is. Ezzel a megközelítéssel az a gond. fejezetben)a következökkel jutharunk a dokumenrumgyökérhez: $_SERVER['DOCUMENT_ROOT'] $DOCUMENT_ROOT $HTTP_SERVER_VARS['DOCUMENT_ROOT'] Az űrlapadatokhoz hasonlóan itt is az első stílus ajánlott. Létező f. Ha a fájl nem létezik.efoglalása Jelentése Fájl megnyitása olvasásra a fájl elején kezdve. 'w').. txt fájl a rendelesek mappában található. hogy átmásoljuk vele a hosszú stílusú változó tartalmát a rövidebb nevűbe: $DOCUMENT_ROOT = 2 $_SERVER['DOCUMENT_ROOT']. vagy ott fogja az operációs rendszer keresni. Létező fájl eserén törli a meglévő tartalmat. hogy ez a fájl.különösen akkor. 'w'). Jelen esetben nem szeret­ nénk. és függ a szerverbeállírásoktól is. amelynek karakterláncnak kell lenni. mint a fenti kód­ sorban is. Ezt az eléré­ si útvonalat relatív elérési útvonalnak nevezzük.. Fájl megnyitása írásra és olvasásra a fájl elején kezdve. Unixos szerverünkön ez az útvonal valami ilyesmi lenne: /home/book/rendelesek. Az fopen ( ) függvény meghívásakor kettő. ha nem saját kiszolgálónkon tároljuk oldalunkar. A kárcsak az űrlapváltozókhoz rendelt rövidebb nevek esetén. hogy a kód csak windowsos környezetben fog működni... Unixos környezetben hagyományos perjeleker (/)használunk az elérési Útvonalakban.Adatok tárolása és visszakeresése 41 Fájl megnyitása az. és ezért kényeelek voltunk a teljes kódban módosítani az abszolút elérési útvonalakat. fopen ( ) Mód r r+ w fiiggvény megnyitási módjainak öss:�.az általunk készítendő internetes felületet leszámítva. az előre definiált szerverváltozókat is különbözőképpen érhetjük el. Általában kettőt láthatunk. Az utóbbi eserén különleges karakterként kell jelölnünk öket az fopen () függvény számára. hogy . Módneve Olvasás (Read) Olvasás (Read) Írás (Wrire) Írás (Write) Óvaros írás (Cautious write) w+ x .az abszolút elérési útvonal módosulhat. Fájl megnyitása írásra a fájl elején kezdve. Ha nincsen elérési útvonal meghatározva. mert egyszer a rendszergazdák értesítés nélkül megvál­ toztatták a könyvtárstrukrúrát. A használt könyvtár eltérő lesz.ijl eserén nem nyitja meg azt. mert a dokumentumgyökérhez viszonyítva mucat a f. a fájl abban a könyvrárban jön létre./rendelesek/rendelesek. ahol a kód maga található. A $ _ SERVER [ 'DOCUMENT_ROOT' l beépített PHP válto- zót használtuk.ijlrendszer adott helyére.

a+ 2 b Bináris (Binary) t Szöveg (Text) A többi médokkal együtt használható. lásd Függelék: A PHP a paramétert l-re! Ha utasítjuk a PHP-r. Mivel ennek így nem sok értelme van. minr az alábbi példában: hrtp://www. A PHP-fejleszrők azt ajánlják. Ha a fájl nem létezik. fejezet Mód x+ Módneve Óvacos írás (Cautious wrice) Jelentése Fájl megnyitása írásra és olvasásra a fájl elején kezdve.Irendeleseklrendelesek. Az fopen ( ) függvény lehetövé teszi. Amennyiben a f. vagyis a per­ jelet tartalmazó címre küld bennünket. a unixosak nem. amivel a fájira hivatkozunk. Fájl megnyitása hozzáfilzésre (írásra) és olvasásra a meglévő tartalom végénél kezdve . Fájlok megnyitása FTP�n vagy HTTP�n keresztül Az fopen () függvénnyel a helyi állományok olvasásra és írásra való megnyitásán túlmenően FTP-n. Ha a fájl nem létezik.com.ini fájl allow_url_fopen beállítását kikapcsolva kiiktarhatjuk f open ennek leherőségét.pelda.. ha a fájlrendszerünk megkülönbözteti a bináris és a szöveges fájlokat. Próbáljuk ki ezt böngészőnkben l Ne feledjük. Minden új megrendelés felvétele felülírja az előző rendelést. ha szeretnénk rákeresni a fájl inelude_path beállírására (amir a PHP konfigurációi közörr adhatunk meg. Ám mindez a szerverbeállírásokról függ. Létező fájl esetén nem nyitja meg azt. Ez az alapértelmezett mód. HTTP kapcsolat nyílik a megadott szerverhez.és nagyberük között. A többi médokkal együtt használható. nyilvánvalóan jobban járunk a hozzáfilzés (és az ajánlott bináris) mód kiválasztásával: $fp = fopen("$DOCUMENT_ROOTI.amennyiben van tartalom. HTTP-n vagy más protokollon keresztül is megnyithatunk fájlokat. Mi a ' w ' módot választottuk. hogy az URL-ben a domainnevek nem tesznek különbséger a kis.com/ nem pedig http://www. azaz bináris mód. az fopen() false értékkel tér vissza.ijlnév h ttp : ll -vel kezdődik. és a függvény a fájl elejére muraró fájlazonosíróval rér vissza. és távoli helyen nyissuk meg az állományokat. megpróbálja létre­ hozni. a PHP pedig figyelmezce­ tése generál. Ez a mód csak windowsos rendszere­ ken érhető el.txt". ahol értelmezett az előbbiekben leírt 'b'. a Hozzáfilzés (Append) Hozzáfilzés (Append) Fájl megnyitása csak hozzáfilzésre (írásra) a meglévő tartalom végénél kezd­ ve. Amennyiben az fopen () sikeresen megnyitja a f. hogy a maximális átjárharóság érdekében mindig használjuk ezt az opciór. Az fopen () függvény harmadik paramétere opcionális. amikor ténylegesen olvasni akarjuk. 'ab'). Ehhez állítsuk ezt include_path -ra. ha olyan környezetbe visszük át a kódot.ijlr. a webszerver általában HTTP átirányítással az első. a függvény pedig a válaszra mutaró fájlmutaróval tér vissza. A negyedik paraméter is opcionális. 'ab'.ez jelen esetben a $ fp. Amikor utóbbi formájú (perjel nélküli) címer adunk meg. akkor meg kell adnunk egy könyvtárnevet fopen('rendelesek. ám az elérési útvonalak és fájlnevek igen! . hogy a fájlnevek elé előtagként protokollt he­ fopen lyezzünk (például h ttp: ll) . passzív átviteli módú FTP kapcsolat nyílik az általunk megadott fájlhoz. Az fopen () () függvény ilyen használatár a fejezer következő részében tekintjük át. hogy keressen rá az vagy elérési útvonalat: $fp = és a MySQL telepítése!). és szigorú rendszerüzemeltetés mellett számolnunk kell az HTTP-s müködésének riltásával. amely egyetlen megrendelés tárolását teszi lehetövé a fájlban.pelda. Akkor választjuk ezt a módot.ini állományt! Ha a használt fájlnév ftp: ll -vel ph p. A a ph p. meg kell adnunk a könyvtárne­ vek utáni perjelet is. A fájlerőforrásr változóban tároljuk . a függvény visszarérési értéke egy fájlerőforrás. true). ellenőrizzük kezdődik. hogyan fogjuk a rendszert használni. Ha problémáink jelentkeznek a távoli fájlok () függvénnyel történő megnyitásakor. Csak abban az esetben ajánlott. Amikor a HTTP módot a PHP régebbi verzióival használjuk. A példában alkalmazandó megnyitási mód attól függ. Akkor használjuk. vagy írni szeretnénk bele. Ezt a változár használva érjük el a fájlt.txt'.42 2. Egyes protokollok egy további paramétert is megengednek. megpróbálja létrehozni. A windowsos rendszerek így tesznek. ami lényegében fájlazo­ nosíró.

._ --s. A biztonsággal részletesebben foglalkozunk majd a 15. fejezetben találkozhatunk.. hogy hibaelnyomó műveleti jelet használunk. . és befejezi a kód futtatását. és ne próbáljunk meg adatokat olvasni belőle vagy írni bele! Amennyiben az fopen () függvénnyel végzett megnyitási kísérlet sikertelen. A közvedenül az internetről elérhető könyvtáraknak nem szabad írhatóknak lenniük..141li1�20\0 Raodtll. így kissé megnehezítheti kó­ dunkban a hibakeresést._�_.. ám jelen esetben máshol fogjuk kezelni a problémát. html/02 _fejezet/ könyvtárban található. amelyben található.00 S�doo:�Nou-. láthatjuk. ám halaeljunk szépen sorjában! Az if utasítás ellenőrzi az $fp változót. amit könnyen elkövethetünk... Elegánsabb módszerével a című 7. exit....... a PHP a 2.2 ábra: A PHP figyelmeztetéssei jelzi.. az fopen függvény érvényes fájlmutatóval tért-e vissza... hogy tisztában legyünk ezzel.. A fenti megközelítés által adott kimenetet a 2.��11.. A kiszolgáló beállításától függően a kód futhat a webszerver felhasználójaként vagy azon Legtöbb rendszeren a kód a webszerver használójaként fut.Jll w��. (1$fp) { echo "<p><strong> Megre�delését jelen pillanatban nem tudtuk feldolgozni. Hiba.. 'ab'). hogy lezárruk a HTML címkéket (tag)._oors.txt"._. ha elnyomjuk a PHP hibaüzenetet. a függvény false értékkel tér vissza.co.. ám messze nem az egyeden fájlmegnyitási hiba.. 2. Ha nem rud­ juk megnyitni a fájlt./rendelesek/rendelesek. &. A hibát sokkal inkább felhasználóbarát módon kezdhetjük. Amikor így teszünk. hogy lássuk.3 ábrán látjuk. ./rendelesek/rendelesek. �� -� ��··��-18''i2 2 Bob autóalkatrészek Rendelési eredmlnyek a-.2 ábrán látható figyelmeztetéshez hasonlót ad..j ·­ ��$264.... hogy elnyomja a függvényhívásból eredő hibákat.... A következőképpen is írhatjuk ezt a sort: $fp = @fopen("$DOCUMENT_ROOT/. Az fopen () meghívása előtti @ szimbólum utasítja a PHP-t.U . ám alkalmanként Windows alatt is találkozhatunk vele). Ilyen hiba esetén meg kell bizonyosodnunk arról.39. amihez nem rendelkezünk olvasási vagy írási jogosultsággal. ha olyan fájlt próbálunk meg megnyitni. �� � �� (>11 �� .. A rendelesek könyvtárunk pontosan ezért két alkönyvtárral feljebb.. A rossz jogosultsági beállítás talán a leggyakrabban elkövetett.. Ezzel a módszerrel talán kevésbé nyilvánvaló.:kd<.. . igen veszélyesek lehetnek. Amennyiben kódunk Unix-rendszeren mondjuk a -/public_ könyvtár rulajdonosaként. amelyekbe bárki írhat.y ia� .. fejezetben (Az e-kereskedelem biztonsági kérdései).... akkor a következőképpen hozhatunk létre bárki által írható könyvtárat a meg­ rendelések tárolására: mkdir -/rendelesek chrnod 777 -/rendelesek Egy pillanatra sem szabad elfelejteni. ha nem. Az itt bemutatott módszer a hibakezelés túlzottan leegyszerűsített módja._ 4!1obm. ... 'a').és kivételkezelés .. " Kérjük.-�.... txt". a pub li c_html felett helyezkedik el.. amikor a fájlt nem lehet megnyitni... próbálkezzon kés6bb!</strong></p></body></html>". hogy a kódot futtató felhasználó rendelkezik-e hozzáférési jogosultsággal az általunk használni kívánt fájlhoz...a....q�����Wed•.. Álta­ lában hasznos rudomást szerezni arról. fontos. (Ez a hiba a Unix-szerű operációs rendszerek esetében gyakran előfordul... _. ha a dolgok nem megfelelően működnek. hogy érvényes HTML kódot kapjunk...-. hogy az olyan könyvtárak és fájlok. hibaüzenetet ír kí..Adatok tárolása és visszakeresése 43 Fájlmegnyitási problémák kezelése Az egyik hiba. Mivel az oldal itt véget ér... _ � -. és a sajárunkat használjuk: @ $fp if = fopen("$DOCUMENT_ROOT/ ...

A függvény közli a PHP-vel. hogy írja a $kimeneti_sztring változóban tárolt karakterláncot az $fp által mutatort fájlba.3 ábra: A �. A flags és a context nem kötelező paramétert leginkább akkor használjuk.!lieg... annak szabályait is figyelembe kell vennünk.-... A függvény prototípusa a következő: int fwrite ( resource eroforras_valtozo.. Ennek a következő a protorípusa: int file_put contents ( string fajlnev.::����:. Fájlformátumok Arnikor a példában szereplő adatfájlhoz hasonlót hozunk létre. Az fwrite() (file write) vagy az fputs () (file put string) függvényt használhat­ juk erre.. Ezen egyszerű példa esetében a rendelési rekordokat a fájl külön soraiban tároljuk. A rekordokat soronként írva egyszerűen adódik rekordelválasztónak az újsor karakter." gumiabroncs \t".- _ ... Ez utóbbi függvényt is rövidesen be­ mutatjuk.." olaj\t" . Az fwrite( ) lehetséges alternatívája a file _put_contents () függvény.. amely az adatfájl egy rekordját jelképezi! A következőképpen tehetjük ezt meg: $kimeneti sztring $datum.. r. A harmadik paramétert akkor érdemes használni.�s..) Most pedig hozzunk létre egy karakterláncot. amikor távoli fájlokba írunk például HTTP vagy FTP segítségéveL (E függvényeket a Hálózati és protokol!függvények használata című 20.. .. ·­ a.. Ha megadjuk ezt a paramétert."\t"..) Az f w r i t e ( ) fiiggvény paraméterei string string Az fwrite () függvény három paramétert fogad. mivel segít elkerülni a platformok közörti kompatibilitás problémáit. amikor bináris módban írunk. az fwrite() függ­ vény addig írja a string karakterláncot az ero forras_valtoz o által mutatort fájlba. string adat [. [. teljes mértékben a saját döntés ünk. az fputs () az fwrite () függvény álneve (aliasa)."\t"..$olaj_db. ám ezek közül a harmadik nem kötelező."\n".._ _. strlen($kimeneti sztrlng))..o: '1·::1.44 2... amíg el nem éri a string végét vagy a hossz mennyiségü bájtot.. (Ha azonban más alkalmazásban készülünk használni az adatfájlt.oo 2 2..-_.. Mivel ezek láthatatlanok. int flags resource contextlll Ez a függvény az fopen () (vagy felcse ()) meghívása nélkül írja az adat változóban tárolt karakterláncot a fajlnev nevü fájlba. •' !.$abroncs db. mégpedig a következőképpen: fwrite($fp.-...-. $kimenetl_sztring.$abroncs_db. hogy milyen formátumban tároljuk az adatokat.�-12 .-�Nocrwalll PHP hibaüzenete helyett sajátunkat használva Jelhasználóbarát visszajelzést adhatunk. A függvény a PHPS újdonsága és a file_get_contents() függvény párja. .. Az fwrite () hívása a következőképpen történik: fwrite($fp. . a hossz az írni kívánt bájtok maximális száma. $kimeneti_sztring). int hossz]) A harmadik paraméter. Bob autóalkatrészek R�odtlési uedmbyek .. $szallitasi_cim. Fájlba írás A fájlba írás viszonylag egyszerű PHP-ben.$osszmennyiseg .. a "\n" vezérlő szekvenciával jelképezzük őket.. [. fejezet �c:_ l�} t4f _ tll' ." gyújtógyertya\t\$".__. Egy karakterlánc hosszát a strlen () beépítert PHP függvénnyel deríthetjük ki. fejezetben tárgyaljuk ..

00 22 Short St. de nem lehetetlen. be kell zárni.Adatok tárolása és visszakeresése 45 Az egész könyvben végig ugyanúgy írjuk az adatmezőket. A harmadik (Tömbök használata) és a negyedik fejezetben tárgyaljuk ezt a témát.date('H:i. A fájl sikeres bezárása esetén a függvény true. A bemeneti adatok fel­ dolgozásával a Karakterláncok kezelése és reguláris kifejezések című 4. 31st March 2008 l gumiabroncs O olaj O gyújtógyertya $100. hogy nem ellenőrizzük. Mivel a ta­ bulátor karakter szimén láthatatlan. $ SERVER['DOCUMENT_ROOT']. a "\t" vezérlő szekvenciával jelöljük. jS F Y') . 2. Y'). ellenkező esetben hamissal (false).2 példakód: rendeles feldolgozasa. ezért jelen esetben úgy döntünk. jS F date('H:i. Ez a fo­ lyamat a megnyitásnál sokkal kisebb valószínűséggel vált ki bármilyen problémát. 20:43. Bármilyen értelmes elválasztót alkalmazhatunk. csak legyen könnyen olvasható! Az elválasztó vagy határoló karakter csak olyan lehet. Néhány megrendelés feldolgozása után a fájl tartalma a 2. azaz igaz értékkel tér vissza. php-A _ megrendeléseket feldolgozó kód végleges változata <?php ll rövid változónevek létrehozása $abroncs db = S_POST['abroncs_db']. $gyertya_db $ POST['gyertya_db']. hogy a felhasználó tabulátort vagy új sort szúr egy egysoros HTML bemeneti mezőbe. Egyelőre elég azt feltételezni. hogy hasonlítson. = $szallitasi_cim $DOCUMENT_ROOT $datum ?> <html> <head> = = $ _POST['szallitasi eim']. Az fclose () függvény alábbi használatával tehetjük ezt meg: fclose($fp). 2. 2 -Példa a rendelesek. 31st March 2008 O gumiabroncs l olaj 4 gyújtógyertya $26. Itt azonban minden megrendelést egyetlen karakterláncként kezelünk. amikor visszaolvassuk öket.00 33 Main Rd. Solaj_db = $ POST['olaj = db']. Különleges mezőelválasztó használatával egyszerűen külön változékba bonthatjuk az adatokat. és tabulátor karakterrel választjuk el őket egymástól.1 példakód: rendelesek.Rendelési eredmények<ltitle> <lhead> <body> <hl>Bob autóalkatrészek</hl> <h2>Rendelési eredmények</h2> <?php echo "<p>Rendelés feldolgozásának id6pontja: ". 20:42. txtfájl lehetséges tartalmára 31st March 2008 4 gumiabroncs l olaj 6 gyújtógyertya $434. hogy senki nem fog tabulátort leütni a rendelési űrlapon. Smalltown Newtown Springfield Fájl bezárása Ha befejeztük a fájlon végzett munkát. és el kell távolítani belőlük az elválasztó minden előfordulását. A 2.2 példakód mutatja a rendeles_ feldolgozasa. txt 20:30. ami a bevitt adatok között egyáltalán nem fordul elő. ph p kész változatának teljes kódját. leckében foglalkozunk majd. . <title>Bob autóalkatrészek ."</p>". Bonyolult ugyan.1 példakódban láthatóhoz kell.00 127 Acacia St. Ellenkező eset­ ben fel kell dolgozni a bevitt adatokat.

txt". 100)."\t"."<br />". Kérjük."\n". define('OLAJAR'. if ($olaj_db > 0) echo $olaj_db. $szallitasi cim. 4) .$vegosszeg. /rendelesek/rendelesek. t l ) . echo "<p>A rendelés végösszege: $".$olaj_db."</p>".. . 2. define('GYERTYAAR' ." gyújtógyertya\t\$". 'ab'). flock($fp.46 2.$vegosszeg . $osszmennyiseg = 0." gyújtógyertyacbr />". $kimeneti sztring $datum.00. echo "<p>Szállitási cim:". LOCK_EX). ABRONCSAR define( 'ABRONCSAR'." olaj\t" . próbálkezzon később!</strong></p></body></html>". $osszmennyiseg = $abroncs db + $olaj db + $gyertya_db." gumiabroncs<br />".$abroncs db. $vegosszeg = $abroncs_db + + * $olaj db * OLAJAR * $gyertya_db GYERTYAAR. if ($gyertya_db > 0) echo $gyertya_db." gum1abroncs \t". echo "Rendelt termékek száma: ". if ($osszmennyiseg == 0) { 2 echo "Egyetlen tételt sem rendelt az előző oldalon1<br />".$szallitasi_cim."</p>". exit. if (!$fp) echo "<p><strong> Megrendelését jelen pillanatban nem tudtuk feldolgozni." flakon olaj<br />"."\t". else if ($abroncs_db > 0) echo $abroncs db. 10). $vegosszeg = 0.$osszmennyiseg. $vegosszeg=number format($vegosszeg.$gyertya_db. fejezet echo "<p>Rendelése az alábbi: </p>". ll fájl megnyitása hozzáirásra @$fp = fopen("$DOCUMENT ROOT/.

Kérjük. while (! feof($fp)) { 999). $kimeneti_sztring./rendelesek/rendelesek. olvas belőle. strlen($k1menet1_sztring)).4 ábrán láthatóvaL . majd bezárja.3 példakód mutatja. A 2. hogy Bob vevői megrendeléseker adhatnak az interneten. LOCK_UN). fclose ($fp). txt". echo "<p>Rendelés ?> </body> rögzitve.1 példakódban szereplő adatfájl használata esetén a kód kimenere megegyezik a 2. amelyen keresztül Bob alkalmazottai egyszerűen elolvashatják a fájlokat! Az ezt a felü­ leret létrehozó kódot a 2.</p>". @$fp = fopen("$DOCUMENT_ROOT/. ph p. $megrendeles= fgets($fp. 'rb'). if (!$fp) { próbálkezzon kés6bb!</strong></p>". ?> </body> Ez a kód is a korábban bemutatott sorrendet követi: megnyirja a fájlt. 2..Adatok tárolása és visszakeresése 47 fwrite($fp. 2 Olvasás fájlból Egyelőre ott tartunk. saját maguknak kell a fájlokat megnyitni uk.Kezelőfelület az alkalmazottak számára a megrendeléseket tartalmazó fájlhoz <?php //rövid változónevek létrehozása $DOCUMENT_ROOT ?> <html> <he ad> <title>Bob autóalkatrészek </head> <body> <hl>Bob autóalkatrészek</hl> <h2>Megrendelések</h2> <?php Megrendelések</title> = $_SERVER['DOCUMENT_ROOT']. de ha Bob alkalmazottai szerernék megnézni a rendeléseket."<br />". flock($fp.3 példakód: rendelesek_megtekintese. echo "<p><strong>Nincsen függő megrendelés. echo $megrendeles. Készítsünk egy olyan webes felületet. exit.

string [megengedett_cimkek]).ll•lol.. ha másvalaki által írt vagy felhasználói bevitele tartalmazó fájlt olvasunk be.. fejezeeben fogjuk részleeesen megtárgyalni. vagy a fájlból beolvasott adat mennyisége el nem éri a 998 bájcoc. Ebben az eseeben (illetve általánosságban.So. felbontja azt.. és a szövegec darabonként kívánjuk kezelni. az fgetcsv( ) függvénnyel egyszerűen megtehetjük.. A fájlban lévő. Ha valamilyen konkrét címkét meg szeretnénk tartani. Ez a kód lekér egy sort a fájlból.. hogy az angol File End Of File szavak kezdőbetűiből adódik. /rendelesek/rendelesek. fejezet Bob autóalkatrészek i\Jegnodelkek :G". Prototípusa a következő: array fgetcsv ( resource fp. PHP kód korládan használata esetén a rosszin­ dulatú felhasználó majdnem celjes mértékben árveheti az irányítást kiszolgálónk felett. "\t"). A maximális beolvasott mennyiség a meg­ határozott érték mínusz l bájt . Sok más függvénye is használhatunk fájlból olvasásra...)O.. . int hossz [.. ph p 2 kód megjeleníti böngészőben a rendelesek. int hossz. 'rb'). azaz fájl vége) eléréséig olvasunk a f:ijlból. .­ »tl. nem korlátozott HMTL kód megzavarhatja a gondosan eltervezett formázásunkac._So&l400l:SIIai. [. így az 'rb' megnyitási módoc használjuk: $fp = fopen("$DOCUMENT_ROOT/. hogy a szövegben találc minden PHP és HTML címkét kiszed.It4.di�O. amikor a fájlmutató a fájl végéhez ér.. el nem éri a fájl végét.do:»XI�O . az EOF (end of fájl. Ez a függvény egyszerre egy sort olvas be a fájlbóLJelen eseeben addig olvas... amikor fájlból olvasunk). amíg újsor karakterrel ( \n) nem találkozik. txt fájlban levő aktuális megrendeléseket.ll•"'-do"lt.ll•w..4 ábra: A rendelesek_megtekintese. Például: Smegrendeles = fgetcsv($fp._. . ha tudjuk. Amennyiben külön-külön szeretnénk a megrendelésben szereplő változókat rekonstruálni. amíg el nem érjük a végét. string hatarolo string mezohatarolo]]) Ez a függvényhatároló karakter például a korábban ajánlott tabulátor vagy . de át kell adni neki a mezők elválasztására használc határolóc. A tömböket a 3. fgetss () és fgetcsv ( ) A példában az fgets () függvénnyel olvasunk a fájlból: Smegrendeles= fgets($fp.táblázatkezelő és egyéb alkalmazások által gyakran használt. akkor a megengedett_ eimkek karakterláncban kell megadnunk azt.vessző alkalmazása esetén szécbontja a fájl sorait. Az fgets ()-hez hasonlóan kell meg­ hívni.. Az fgets () függvény például akkor hasznos.1 . majd ahol tabulátort (\t) talál. 100.. Ahol meg kell állnunk: feof ( ) A példában while ciklussal olvassuk be az adatokat mindaddig. 2. O�SI000033W. 6. 999).._. Visszatérési értéke true. Az fgets () érdekes változata az fgetss () függvény.IM4_... Bár a függvény neve kicsic furcsának tűnhet. Vizsgáljuk meg részletesen a kódban szereplő függvényeket! Fájl megnyitása olvasásra: fopen () A f:ijlc megint csak az fopen () függvénnyel nyitjuk meg. Akkor érdemes használni.e. amikor egyszerű szöve­ gec tartalmazó fájlokkal dolgozunk. Jelen esetben csak olvasásra nyitjuk meg az állományt..I..48 2..�­ )Ul. Beolvasás soronként: fgets () ... A függvény az fgets ()-hez hasonló azzal a különbséggel. A ciklus az feof ( ) függvénnyel keresi a fájl végét: while (!feof($fp)) Az feof () függvény egyeelen paramécere a fájlmucacó.j'�S!dOOI:1Aucio$t. Az fgetcsv () függvény az fgets () egy másik változata.txt". talán könnyebben megjegyezhető.. aminek az alábbi a prototípusa: string fgetss(resource fp. Az eredményeket tömbben adja vissza (ami­ nek példánkban Smegrendeles a neve).

lrendeleseklrendelesek. txt". hogy a böngészőben való megjelenítés helyett karakterláncként adja vissza a fájl tartalmár.. Ez csak azt szolgálja. mint például az újsorok. Ezt követően formáz egy kicsit. A korábban írt szinte teljes kódot lecserélhetjük egyeden sorra: readfile( "$DOCUMENT _ROOTl. Ez a kód a filearray nevű tömbbe olvassa be a teljes állományt. Ehhez először az fopen () függvény­ nyel meg kell nyimi a fájlt. A teljes fájl beolvasása: readfile () . visszatérési értéke pedig a fájl következő karaktere. txt"). Ha végzett.ini include_path paraméterében meg­ határozott könyvtárában kell-e keresnie a fájlokar.Az fgetc( ) függvénnyel tehetjük meg ezt. Az fpassthru() függvény visszatérési értéke sikeres beolvasás esetén igaz.Adatok tárolása és visszakeresése 49 A hossz paraméternek nagyobbnak kell lennie. és teszi ezt rnindad­ éri a fájl végét. megjeleníti rartalmát a szabványos kimeneten {a böngészőben). Négyféleképpen tehetjük meg ezt. A függvény visszatérési értéke a fájlból beolvasott bájtok teljes száma. . Működését részletesebben megvizsgáljuk majd a tömbökkel foglalkozó 3. mint a beolvasni kívánt fájlban lévő leghosszabb sor karakterszáma. [int use include_path [. mert az EOF karaktert nem szeretnénk megjeleníteni a böngészőben. Egyeden paramétere a fájlmutató. A teljesség kedvéért nézzük. Az első lehetőség a readfile () függvény használata.. if (' feof($fp)) echo ($char=="\n" ? "<br 1>": $char). { Próbáljuk ki. az ilyen jellegű használatot a 20. hogy a szöveg sorvégér jelölő karaktereket (\n) HTML sortö­ résekre cserélje { <br l>). fejezetben mutatjuk be részletesen. rnint az fopen (). Karakter beolvasása: fgetc () A fájl feldolgozásának egy másik módja. A negyedik módszer a file _get_ conten ts () függvény használata. Ez annyiban tér el a readfile () függvénytől. amelynek rninden sora a tömb egy-egy elemében tárolódik el. Érdemes tudni. 'rb'). hogy rendbe rakja a formázását. A readfile () függvény prototípusa: int readfile(string fajlneve. Az eredeti kódban lévő while ciklust a követke­ zőképpen cserélhetjük az fgetc ( ) függvényt használóra: while (!feof($fp)) { $char = fgetc($fp). ám a fájl szabványos kimene­ ten való megjelenírése helyett tömbbé alakítja azt. fpassthru($fp). resource kezelesi_mod]] ). hogyan hívnánk meg: $filearray = file ($DOCUMENT_ROOT/ . hogy az fgetc () az EOF karaktert adja vissza. amit az fgets() nem tenne. A readfile() hívása megnyitja az állományt. txt") . A mezohatarolo paraméter határozza meg a sorban lévő mezőket határoló karaktert. például HTTP-n keresztül nyitjuk meg a fájlokat. Az előző kód helyett az alábbit is használhatjuk: $fp = fopen("$DOCUMENT_ROOT/ .lrendeleseklrendelesek. és ugyanúgy működik. Ha megtekintjük a fájl kimenetét a rekordok között újsorokkal. Ezt követően a fájlmutatót átadjuk paraméterként az fpassthru () függvénynek. amikor távolról. hogy a függvény a PHP korábbi verzióiban bináris adatokat nem tudott kezelni {nem volt. bezárja a fájlt. fejezetben. Az fgets() függvény helyett az fgetc () használatának mellékharása. máskülönben hamis. Ez a readfile () függvényhez hasonló. ha karakterenként olvassuk be. eltárolja a $char változóban. 2 ' Az opcionális második paraméter azt határozza meg.binary safe"). amely a szabvá­ nyos kimenetre küldi a fájlnak a mutató utáni tartalmár. A karakter beolvasása után újból ellenőrizni kell az fe of() függvényt. A harmadik lehetőség a file() függvény használata. dig. alap­ értelmezésben a "-t {kettős idézőjelet) használja. akkor a teljes fájlt egyeden sorban látjuk megjelenni..lrendeleseklrendelesek. fpassthru () és file () A soronkénti beolvasás helyett egyszerre is beolvashatjuk a teljes fájlt. és győződjünk meg róla saját szemünkkel!) A böngészők nem fog­ lalkoznak az olyan fehérköz karakterekkel. amíg el nem A kód az fgetc() függvénnyel egyszerre egy karaktert olvas be a fájlból. majd bezárja a fájlt. ezért HTML sortörésekre (<br l>) kell cserélni azokat.A szintén opcionális kezelesi_ mod paramétert csak akkor kell megadni..Amennyiben nem adjuk meg. A háromoperandusú műveleti jelet alkalmazzuk erre. A teljes fájl beolvasásának második módszere az fpassthru() függvény meghívása. hogy a PHP-nek a php.

filesize("$DOCUMENT_ROOTI. int hossz).Irendeleseklrendelesek. echo Fájlméret meghatározása: files i z e () A fájiméretet a filesize() függvény segítségével határozhatjuk meg: echo filesize("$DOCUMENT_ROOTI. a file_exists () függvényt kell a következők szerint használni: if (file exists ("$DOCUMENT_ROOTI. A teljes eredeti kód helyett az alábbit is használhatjuk: $fp = fopen("$DOCUMENT_ROOTI. echo nl2br(fread( $fp. fejezet A fájlok karakterenkénti beolvasása általában értelmeden és nem igazán hatékony megoldás..txt")) echo else 'Ezek a feldolgozásra váró megrendelések. ' <br l> ' .txt". /rendeleseklrendelesek.) Például: unlink("$DOCUMENT_ROOTI. a függvény hamis értékkel tér vissza. fseek () és ftell () A fájlmutató fájlon belüli helyzetét a következő függvényekkel kezdhetjük. Visszatérési értéke a b:ijtban kifejezett fájlméret.'. ha a fájl nem törölhető. vagy pedig a fájl nem létezik. Ez jellemzően akkor fordulhat elő. Fájl törléset unlink () Ha a megrendelések feldolgozása után törölni kivánjuk az azokat tartalmazó állományt.txt").lrendeleseklrendelesek.(ftell($fp)). Egyéb hasznos fájlfüggvények Létezik néhány további fájlfüggvény.'.mennyit mozdult előre az állományban a fájlmutató. Az fread () függvénnyel együtt használva alkalmas a teljes fájl (vagy egy részének) egyszerre történő beolvasására.. fclose( $fp ).. (Delete. ha valamilyen oknál fogva kifejezetten karakterenként szükséges feldolgoznunk az állományokat. azaz törlés nevű függvény nem létezik. 'rb'). amelyek időről időre hasznosak tudnak lenni.50 2. Fájlon belüli navigálás: rewind (). A hossz paraméter által bájtban meghatározott maximális adatmennyiséget olvassa be (de legfeljebb a fájl vagy a hálózati csomag végéig olvassa az adatokat). illetve állapíthatjuk meg: ftell() . az unlink() függvénnyel tehetjük meg. kivéve akkor. fseek( ) és A rewind () függvény a fájl elejére viszi vissza a f:ijlmutatót. hogy egy adott fájl ténylegesen létezik-e.. hogy. Az ftell () függvény azt mutatja meg. Irendeleseklrendelesek. l> ) Az n 12 br() függvény HTML sortörésekre ( <br alakieja át a kimenetben szerepiő \n karaktereket. ha nin­ csen jogosultságunk a törlésre. rewind (). rewind($fp). Ezek közül mutatunk be néhányat. amellyel tetszőleges mennyiségű adatot olvasharunk be a kiválasztott állományból. { 'Jelenleg nincsenek megrendelések.txt"). A függvény prototípusa a következő: string fread(resource eroforras_valtozo.bájtokban kifejezve.Irendeleseklrendelesek.txt" ))). Fájl meglétének ellenőrzése: file_e x i sts () Ha megnyitás nélkül szeretnénk meggyőződni arról. Például a következő sorokat írhatnánk az eredeti kód aljához (az fclose () parancs elé): echo echo 'A fájlmutató utolsó poziciója: '. . Tetszőleges mennyiségű adat beolvasása: fre ad () A fájlból beolvasás utolsó móclja az fread () függvény használata.. Abban az esetben.

l) LOCK _EX (korábban 2) LOCK_UN (kc-rábban 3 ) LOCK _NB (korábban 4) . ami gyakorlatiLag a fájl eleje.0. Az fseek () segítségével megtalálhatjuk például egy adott fájl középső rekordját. int muvelet [.SJOOOOllM-Rd. A rewind függvény hívásával visszatér kiinduló pozíciójába (O). a fájL nem megosztható. hogy legyen. 267 bájtnyival mozdult el. A zároLás létrehozása alatt megakadályozza a blokkolást. így a táblázatból mindkét értékkészlete[ kiolvashatjuk..)1•"'-dol1XIIO_..5 ábrán láthatóhoz hasonló kell.}\ll�l0014_. amikor két vásárló egyszerre próbálja ugyanazt a terméket megrendelni. Az flo ck () prototÍpusa a következő: bool flock (resource eroforras_valtozo. Meglévő zárolás feloldása. küLönösen akkor nem. Az ilyen problémák eLkerülése érdekében zároini érdemes az érintett fájlt.. péLdául a két megrendelés valami keszekusza összevisszaságban r A válasz operációs rendszerünktől függ.11•lolaodolOOII. '. A rewind ( ) függvény azzal egyenértékű. Az fseek( ) függvénnyel a fájl tetszőleges pontjára állíthatjuk a fájLmutatót.0 .1 .. sokkal jobban járunk.1 változatának megjelenésével módosultak.. és elkezd írni. Ezt kell meghívnunk a fájl megnyitása után. illetve a zároLástípusokat a 2.. és ő is elkezd írnir Mi lesz a fájl tartalmar Az egyik. :!0"4l.. de gyakran teljesen kiszámíthatatlan.2 tábLázat tartalmazza. de még közveclenül az előtt. vagy bináris keresést hajtharunk végre.. ha jelentős forgalom van honlapunkon. A böngészőnkben megjelenő eredmény a 2.. hogy ilyen dolgokra van szükségünk. ha adatbázist használunk. ·�--�1"6 ..2 táblázat: Az flo ck () muvelet paraméterének értékei Művelet értéke LOCK_SH (korábban Jelentés Megosztott zárolás.. mintha meghívnánk nulla eltolással (offset) az fseek () függvényt.. A fájl olvasásra megosztható más folyamatokkal. Kizáró zároLás. Ez a művelet kizáró...5 ábra: A megrendelések beolvasása után a fájlmutató afájl végére mutat. hogy a függvény megvárja-e a sikeres lezárást.... Amikor azonban már annyira bonyolulttá váLik az adatfájl kezelése.. Bob autóalkatrészek Meereadt'ltsd: 6��001J'*-'St. hogy bármilyen adatát beolvasnánk._. (Ez egyáltalán nem olyan ritka szituáció.. 2.� lll"l0.. PrototÍpusa a következő: 1nt fseek ( resource fp. másodíkként pedig a zároLás kívánt típusát jelképező állandót kell átadni.) Mi történik akkor. A függvény visszatérési értéke sikeres zároLás esetén igaz.. afájl elejére. vagy azonnal térjen vissza: A muvelet paraméter lehetséges értékeit. majd a másik is meghívja az fopen ()-t. int eltelas [. 01Jitio0amy. További lehetséges érték a SEEK_CUR (a fájLmutató pillanatnyi helyzete) és a SEEK _END (a fájl vége). ha az egyik vevő meg­ hívja az fopen () függvényt.. egyébként pedig hamis. A lehetséges értékek a PHP 4.Adatok tárolása és visszakeresése 51 echo 'Visszaállítás után a pozíció: echo '<br />'..� �1..-S. (ftell($fp)). A PHP ezen funkciója az flock ( ) függvénnyel érhető el... int eltelas kezdopontja) Az fseek ( ) meghívása az elto las_kezdepontj a paraméterben megadott ponttóL számítva eltolas bájtnyival eL­ tolva helyezi el az fp fájLmutatót.. Az opcionális harmadik paraméterben meg­ adható....s._. vagy írnánk a fájLba.� .-.-•pooiciá•D 2 2. majd a másik megrendelésr Esetleg éppen fordítvar Vagy csak az egyik megrendelésr Vagy csak a másikr Esetleg valami teljesen értelmetlen.I*i4�lUOOU'Ik. int &varakozzon_e]) Első paraméterként egy megnyitott fájl muratóját. Nem blokkoló zárolás. Az opcionális eltolas_ kezdepontj a paraméter alapértelmezett értéke SEEK_SET. Fájlok zárolása Képzeljiik el azt a helyzetet.

Ha komoly forgalom van egy honlapon. ll fájl zárolása olvasásra 'r'). hogy mi lesz ennek a kímenete. hajlamosak lesznek máshol elkölteni a pénzüket. Ha szűrni szeretnénk a rekordokat (például az összes olyan vásárlót szeretnénk megralálni. Egy ilyen helyzet további problémákat vet fel. Felmerülhet a kérdés. Könyvünk második részéből megtudjuk. fejezet Amennyiben használni kívánjuk az flock () függvényt. egy relációs adarbázis-kezelő rendszert (RDBMS). Láttuk. fclose($fp). fwrite($fp. Egyszerű fájlban bonyolult lehet egy adott rekord vagy rekordok egy csoportjának megkeresése. akí egy adott településen lakik). különben értelmetlen lesz alkalmazása. amivel így nekünk. Jobban járunk. ll olvasásra zárolás feloldása fclose($fp). flock($fp. .txt". ám még mindig nem tökéletes. és bizonytalan. amelyben a folyamatok a zárolásért versenyeznek. $kimenet1 sztring). És a könyvünkben használt adatbázisrendszer. és ellenőrizni kell őket. hogy képes legyen feladni megrendelését. LOCK_UN). minden egyes rekordot egyenként be kell olvasnunk. hogyan használjunk helyettük MySQL-t. a következőképpen módosíthaguk a rendeles_feldolgozasa. LOCK_EX). Rekordokat a fájl közepébe szúrni vagy kitörölni onnan (véletlenszerű hozzáférés) bonyolult dolog. Ha a rekordok sorrend­ ben vannak. mert először a teljes fájlt be kell olvasni a memóriába . Mi történik akkor. és-röbbszálú szerver API alkalmazása esetén nem megfelelően fog működni. zárolást nem támo­ gató fájlrendszerekkel (például FAT) sem működik. A jogosultságok korlátozott lehetőségein túlmenően nem létezik egyszerű módszer az adarokhoz való különböző szintű hozzáférések betartatására. A régebbi. Szűk keresztmetszetet is okozhat. ll írásra zárolás feloldása LOCK_UN). majd újra kiírjuk a reljes állományt.végrehajtjuk a változtatásokat. Ha használni szeretnénk a megrendeléses példában. ez azt jelenti. programozóknak nem kell foglalkoznunk. LOCK_SH).txt".52 2. 2 flock($fp. Nem árt tudni. valamilyen bináris keresés és rögzítert szélességű rekord együttes használatával rákereshetünk valamelyik kulcsmezőre. Ha ez a várakozás túl hasz­ szúra nyúlik. ha egy időben két kód próbál zárolást végrehajtani? Ez versenyhelyzetet teremt. a MySQL ilyen tekintetben a leggyorsabb rendszerek közé tartozik. php fájlhoz is hozzá kell adni: $fp = fopen("$DOCUMENT_ROOT l .. Nagy adatfájlok eserén mindezen lépések jelentősen megterhelhetik a rendszert. több felhasználó is várhat a fájl zárolásának feloldására. Hogyan oldják meg a relációs adatbázis�kezelő rendszerek ezeket a problémákat� A relációs adatbázis-kezelő rendszerek (RDBMS-ek) megoldást kínálnak mindezen problémákra: Az RDBMS-ek az egyszerű fájloknál sokkal gyorsabb hozzáférést nyújtanak az adarokhoz. Irendeleseklrendelesek. Az RDBMS-ekből egyszerűen lekérdezhetünk adott kritériumoknak megfelelő adatkészlereket. hogy a fájl elejétől indulva a végéig olvassuk őket.. lrendeleseklrendelesek. php fájlt: $fp = fopen("$DOCUMENT_ROOTI . hogy az flock() NFS és egyéb hálózati fájlrendszerek esetén nem működik. Az eddig megismert fájlfeldolgozási módszerek szekvenciális feldolgozással nyúltak a fájlokhoz. miért bajlódjunk a MySQL-lel? Egyszerű fájlok használata esetén jelentkező problémák Egyszerű fájlok használata esetén számtalan problémába futhatunk bele: Amikor a fájl mérete megnövekszik. Az RDBMS-ek beépített mechanizmusokkal kezelik az egyidejű hozzáférést. a fájlt használó összes kódhoz hozzá kell adni. nagyon lelassulhat a vele végzert munka. Az egyidejű hozzáférés kezelése is gondot okozhat. ha adatbázis-kezelő rendszert (DBMS) alkalmazunk. hogyan lehet a fájlokat zárolni. ll fájl zárolása íráshoz 'ab'). Egyes operációs rendszereken folyamatszinten valósul meg. Egy jobb módszer: adatbázis�kezelő rendszerek Az eddig árrekíntert összes példában egyszerű fájlokkal dolgoztunk. ám a zárolás a korábban bemutatort versenyhelyzethez vezethet. ll olvasás a fájlból flock($fp. flock($fp. A kód most már robusztusabb. A zárolásokat a rendelesek_megtekintese.

mi magunk is megírhatnánk a PHP függvények saját könyvtárát.net/ filesystem címen érhető el. és úgy érezzük.php. illetve konkrétan azt. amely a hrcp://www. A MySQL különösen erős ezen a területen. de szeretnénk elkerülni az egyszerű fájlok használatából eredő zároJási és egyéb problémákat. illetve azt.php. A könyv azon részében megrárgyaljuk. hogyan lehet megváltoztaeni egy fájl jogosultságát. mérlegeljűk a PHP SQLire bővítményének használatár! Ez lényegében SQL kezelőfelüleret nyújt egy egyszerű fájlhoz. hogyan dolgozhatunk a könyvrárakkal. hogyan használhatók a PHP kódokban lévő adatok feldolgozására. tulajdonosát és nevét. fejezetből (A fájlrendszer és a kiszolgáló elérése). miként lehet a MySQL-t adarbázissal támogatott weboldalak létrehozására beállítani és használni. .ner/ sqlite oldalról! 2 További olvasnivaló A fájlrendszerrel való kapcsolatról további információt kapharunk a 19. A relációs adatbázis-kezelő rendszerek használatának talán legfontosabb oka.org/ és a http://www. és hogyan léphetünk kapcsolatba a fájlrendszer környezetével. nincs szükségünk minden funkciót tartalmazó adatbázisra. Az RDBMS-ek beépített jogosulrsági rendszerekkel rendelkeznek. de mi értelme lenne újra feltalálni a kereket? Könyvünk második. Könyvünkben a MySQL használatára fordítjuk figyelmünket. de ha szecetnénk többet megtudni az SQLite-ról. Hogyan tovább: A következő fejezetben megismerjük a tömböket.Adatok tárolása és visszakeresése 53 Az RDBMS-ek véletlenszerű hozzáférést nyújtanak adatainkhoz. Ha egyszerű rendszert építünk. tájékozódjunk a http:/ /sqlite. A MySQL használata című részében bemuratjuk a relációs adarbázisok működését általánosságban. Érdemes lehet elolvasni a PHP online kézikönyvének a fájlrendszerrel foglalkozó részét. hogy egy adattároló rendszertől elvárt minden (vagy legalábbis majdnem minden) funkcióval bírnak. Persze.

ezt a rendkívül fontos programozási szerkezetet. Számtalan eleme lehet. Minden tömbelemhez index (más néven kulcs ) tartozik. ha ugyanazt a műveleter a tömb minden elemén végrehajt­ juk. térképeknek (map) vagy könyvtáraknak nevezett. Ekképpen rövidebb.) Gumiabroncs Olaj termék Gyertya 3. Az l. számtalan hasznos módon dolgozharunk vele. hozzájuk hasonlóképpen a tömb is névvel ellátott hely. A tömbben tárole értékeket a tömb elemeinek nevezzük. Ily módon egyetlen sornyi kóddal például a tömbben szereplő összes értéket átadhatjuk egy függvénynek. . névvel ellátott helyek. az valószínűleg az asszociatív tömbökről sem hallott még . Miurán tömbben eltároltuk az információt. Tegyük fel. hogyan lehet ilyen változót létrehozni.1 ábrán tömbformában cárolva láthatjuk a három termékből álló listát. A 3. Az előző fejeze­ tekben egyetlen értéket tároló skaláris változókkal dolgoztunk. hasonló szerkezetekkel. Fejezetünkben továbbfejlesztjük Bob autóalkatrész-kereskedésének példaprojektjér. tömbök segítségével könnyebben elbol­ dogulunk majd az olyan ismétlődő információkkal. hogyan használjuk a tömböt.1 ábra: Bob termékei tömbben is tárolhatók. és ezek mindegyike konkrét értéket.ugyan máshol találkozhatott már hasheknek. amit az egyes elemek elérésére használunk. A tömböket tartalmazó tömböt többdimenziós tömbnek nevezzük. fejezetben olvashattunk a skaláris változókróL Ezek változó érték tárolására szolgáló. ahol értékek halmazár tároljuk. mint a teljes tömböt átadni a PHP sort ( ) függvényének.3 Tombök használata E fejezetből megrodhatjuk. rendezerrebb kódot írva hajguk végre az előző fejezetben a fájlokon végrehajtott művelerek egy részét. például szöveget vagy számot vagy akár egy másik römbör is tartal­ mazhat. hogy ábécésorrendbe kívánjuk rendezni a termékeket! Ehhez nem kell mást tenni. fejezetben megismert ciktu­ sokkal jelentős mennyiségü munkától kímélhetjük meg magunkat. A más programozási nyelveken már dolgozó olvasók bizonyára találkoztak numerikusan indexele römbökkel. (Rövidesen eláruljuk. mint a vásárlók megrendelései. A fejezetben Bob terméklistáján keresztül mutatjuk be a tömböket. A fejezerben a következő főbb témaköröket tárgyalj uk: Numerikusan indexelt tömbök Nem numerikusan indexelt tömbök Tömbmüveleri jelek Többdimenziós tömbök Tömbök rendezése Tömbfüggvények Mit nevezünk tömbnek� A PHP gyorstalpaló címü l. A tömb értékek halmazár vagy sorozatát tárolni képes változó. ám aki nem használt PHP-t vagy Perlr.$ termekek nevű változóban tároljuk. A számszerű index helyett hasz­ nálharunk szavakat vagy más tartalmas információt. A teljes információhalmaz egyetlen egységként kezelhető. Ezt a három terméket egyetlen. lehetövé téve ezáltal a skaláris értékek csoportosítását. A PHP a numerikusan (számmal) indexele és az asszociatív (társításos) tömböket egyaránt támogatja. Az asszociatív tömbökben a számoknál informatívabb értéket alkalmazhatunk indexként. A legtöbb programozási nyelvben a tömbök nullával vagy eggyel kezdődő numerikus inde­ xekkel rendelkeznek.

a Java és sok más nyelvben. Ha emelkedő számsorozatot kivánunk tömbben tárolni.amely az l és 10 közötti páratlan számokat tartalmazza. végrehajtása című részében ismerkedünk meg.hashekkel vagy könyvtárakkal. 'Olaj' és 'Gyertya'-tartal­ mazó tömböt.illetve átrendezhetjük tartalmukat. például: = Amennyiben a kivánt információt valamely fájlban tároljuk. Akárcsak más változóknál. A tömbben tárolandó tartalomtól függően elképzelhető.Egyéb tömbműveletek Tömb tartalmának elérése A változók tartalmának elérésére a változók nevét használjuk. Ha egy másik tömbben rendelkezésünkre áll a szükséges adat.ad a tömb végéhez. Amennyiben ez a változó történetesen tömb. Tömbök feltöltése fájlokból címü részében foglalkozunk. Ezekkel a függvényekkel a fejezet egy későbbi. 3 Numerikusan indexelt tömbök létrehozása A 3. majd onnan lépünk tovább a felhasználó által meghatározott kulcsok használatára.'Biztositek = 'Biztositek'.akik más programozási nyelvekben dolgoztak már asszociatív tömbökkel. hogy a hagyományos. = müveleti jellel egyszerűen másik tömbbe másol­ A range() függvény harmadik. a range () függvény automatikusan létrehozza számunkra a töm­ böt. Ezzel a témakörrel a fejezet későbbi. mintsem függvény. ll. Az indexet szögletes zárójelben írjuk a tömb neve után.nem saját kezűleg kell létre­ hozni azt. . közveclenül ebből az állományból is betölthetjük a tömb tartal­ már. Ez a kód létrehozza a$termekek nevü.1 ábrán látható tömb létrehozására a következő PHP kódsort használjuk: $termekek = array( 'Gumiabroncs'. Ugyanezt a számozási sémát használják a C. numerikusan indexelt tömbökkel vagy a némileg izgalmasabb indexértékeket használó tömbökkel dolgozunk.hogy az echo-hoz hasonlóan tulajdonképpen az array () is inkább nyelvi szerkezet. Ha a tömbbe szánt adatok adatbázisban tárolódnak. fejezetben mutatjuk be. Dolgozharunk hagyományosan számokkal indexelt tömbökkel.) A programozói megközelítés is kissé eltérő lehet attól függően. $betuk range ('a'. A range( ) függvény karakterekkel is használható. . a C++. hogy -az előző példával ellentétben . A $termekek tömb tartalmát a $ termekek[O]. A tömb első elemének indexe alapértelmezésben nulla.eltarthat egy kis ideig.$ termekek[l J és $termekek[2J kifejezéssel érjük el.a három adott értéket-'Gumiabroncs'. hogy a tömb melyik értékét kivánjuk elérni. Megfelelő függvényekkel kinyerhetjük a tömbök egyes részeit.56 3. 1-től lO-ig terjedő elemek sorozatát tartalmazó tömböt állítja elő: $szamak = range(l. 2).ám ha eddig még nem találkoztunk vele. Ha például olyan tömbre van szükségünk. Érdemes megemlíteni. az harunk bármely tömböt. Először a numerikusan indexelt tömbökkel ismerkedünk meg. 10. amíg hozzászokunk. 'Gyertya' ). A következő utasítás.a tömb elemeinél is az $termekek[OJ $termekek[3J 'Biztositek'. amely így összesen már négy elemmel bír: A tömb tartalmának megjelenítéséhez gépeljük be a következő sort: echo "$termekek[OJ $termekek[lJ $termekek[2J $termekek[3J". A következő sorral a tömb első elemér cseréljük le 'Gumiabroncs'-ról 'Biztositek' -ra: = A következő sor kódja új elemet .de tartalmasabb és hasznosabb indexet is rendelhetünk a tömbelemekhez. (Ez a megközelítés ismerős lehet azok számára.hogy tömbök indexeiként számokat és karakterláncokat egyaránt használjunk.lO). Az index-más néven kulcs-mutatja meg. opcionális paraméterével az értékek közötti lépésköze határozhatjuk meg. tér­ képekkel.a következőképpen hozhatjuk létre: $paratlan_szamok = range(l. PHP-ben az indexek alapértelmezésben nullával kezdődnek.akkor a változó nevével és a megfelelő indexszel érhetjük el tartalmár.de ezt az értéket tetszés szerint módosíthatjuk. ' = müveleti jellel módosíthatjuk tartalmukat. Numerikosan indexelt tömbök A programozási nyelvek többsége támogatja a számmal indexelt tömböket. 'Olaj'.a tömb tartalmát közveclenül az adatbázisból is betölthetjük.a s zarnak nevü. Ennek folyamatát a MySQL adatbázis elérése a webről PHP-vel címü. 'z'). fejezet A PHP lehetővé teszi.

könnyen összezavarodhatunk. azaz a tömb nevével és a kulccsal érjük el. Ez az átméretezési lehetőség a programozási nyelvek többségében nem érhető el. hogy egy nagy tömb minden egyes elemér kezelni tudjuk. Első használatukkor auto­ matikusan létrejönnek. A következő kód ugyanezt az $arak tömböt eredményezi. $i<3. $i++) { echo $termekek[$il . Nem numerikusan indexelt tömbök A $termekek tömbnél hagytuk a PHP-t. hogy egyszerű ciklusokkal a tömbök minden egyes elemér könnyen elérjük. fejezetben tekintjük át. ám sokkal kevesebbet kell gépelnünk ahhoz. Ez azt jelentette. A kulcsok és az értékek közötri szimbólum egyszerűen egy egyenlőségjel és az azt követő nagyobb szimbólum. $termekek[2l = 'Gyertya'. vagyis az arak (azaz árak) tömbben tárolt információt az alábbiakkal kapjuk vissza: $arak['gumiabroncs' l. majd két további elemet ad hozzá: $arak = array( 'gumiabroncs'=>lOO ). Tömb inicializálása A következő kód által létrehozott tömb a terméknevet használja kulcsként. hogy az elsőként hozzáadott elem indexe O lett. { A fenti kód minden egyes elemet egyenként eltárol az $aktualis változóban. . és kiírja azt. Ahogy elemeket adunk a tömbhöz. A következő kód ugyanazt a$ termekek tömböt hozza létre. hogy a PHP nem megfelelöen értelmez egy olyan tömböt vagy változót. $arak['gyertya'] = 4. 'gyertya'=>4). Amennyiben a $termekek még nem létezik. a tömb elemeinek értéke pedig az adott termék ára: $arak = array('gumiabroncs'=>lOO. a másodiké l. Ebben a példában a következöképpen kellene használnunk: foreach ($termekek as $aktualis) echo $aktualis. Elővehetjük a kifejezetren a tömbökkel való munkához kialakított foreach cik­ lust is. ám a fejezet későbbi részében sok olyan összetettebb példát látunk. és így tovább. A tény. ahol a változókat az idézőjellel köz­ refogott karakterláncon kívül találj uk. $arak['olaj'] = 10. mint amit korábban az array () utasítással állítotrunk elő: $termekek[Ol = 'Gumiabroncs'. Az előző ech o utasítás megf elelően müködik. amely kettős idézőjelek közötti karakterláncba van ágyazva." ". $arak['olaj 'l és $arak ['gyertya']. A többi PHP változóhoz hasonlóan a tömböket sem kell inicializálni vagy előzetesen létrehozni. A PHP olyan tömböket is támogat. új tömböt. hogy alapértelmezett indexet rendeljen minden elemhez. amelyekben tetszőle­ ges értékű kulcsot vagy indexet rendelherünk az egyes elemekhez. A ciklus a kettővel ezelőtti kódhoz hasonló kimenetet eredményez. vagy használjunk összetett szintaktikát! Ez utóbbit a Karakterláncok kezelése és reguláris kifejezések című 4. Tömbelemek elérése A tartalmat ebben az esetben is a változó." ". akkor helyezzük öket az idézőjelen kívül. hogy a PHP meglehetösen intelligensen dolgozza fel a karakterláncokat. vonzóvá teszi a tömbök használatár. az első sor létrehoz egy egyetlen elemű. az dinarnikusan változtatja méretét. 3 Tömbelemek elérése ciklusokkal Mivel a tömb indexeléséhez növekvő számok sorozatát használjuk. $termekek[ll = 'Olaj'.Tömbök használata 57 Annak ellenére. Ez a változat azonban nem három elemmel hozza létre a töm­ böt. Amennyiben azzal a problémával találkozunk. 'olaj'=>lO. a for ciklussal könnyedén megjeleníthetjük tartalmár: for ($i = 0. hanem csak egyetlen eggyel. A következő sorok érté­ keket adnak a tömbhöz.

. indexén érhető el. ám az előzővel egyenértékű kódot! Irt közvedenül egyálralán nem hozzuk létre a tömböt. a tömbbel való munkához nem vehetünk igénybe egyszerű számlálót alkalmazó for ciklust. A foreach ciklus asszociatív tömbök eserén kissé eltérő szerkezettel működik. majd leáll. vagy bevehetjük a kódba a kulcsokar is: foreach ($arak as $kulcs => $ertek) echo $kulcs. 10. echo " . echo "<br />". tömbkém visszaadja azt. négy ércéket és a tömbön belüli elhelyezke­ désre utaló négy indexet tartalmazó értéket kapunk. Az $elem ebben a kódban tömb.2 ábrán látható. ahogyan az előző példában tettük. $ar) = each($arak)) echo "$termek . Gyakran ennél elegánsabb megközelírést alkalmazunk ugyanerre. while (list($termek. Használharjuk ellenben a foreach ciklust. egyenkém visszaadja a tömb minden elemér. hogy a számozott helyett a névvel jelölt pozíciót ( indexet) használjuk." . $ar) = each($arak)) { echo "$termek . A kulcs az $elem tömbváltozó O. amellyel ez idáig nem találkoztunk. Amikor meghívjuk az each() függvényt. amikor elérjük a tömb végét.". és megjeleníthetjük tartalmár: reset($arak). az érték az $elem tömb l. illetve a list() és az each () szerkezeret.58 3. Mindegy ugyan. Használhatjuk poncosan úgy. { 3 A következő kód az each () szerkezerer igénybe véve lisrázza ki az $arak tömb tarralmát: while ($elem = each($arak)) { echo $elem[O]. majd a következő elemet teszi az akcuálissá. A következöképpen választharunk szét kettőt az eae h() függvény által visszaadott értékek közül: while (list($termek. Ez a sor az eaeh() függvényt használva fogja az $arak aktuális elemet. indexén.". A list ( ) segítségével a $termek és $ar nevű két változóvá alakítja az each () által visszaadott tömb nulladik és első elemeit. Az előző kód az each() függvényt használja. fejezetben megvizsgáltuk a while ciklusokat és az echo utasítást. fejezer Nézzünk még egy kissé eltérő. Az alábbi rövid kóddal a teljes $arak tömböt bejárhatj uk. Ennek a kódrészletnek a kimenere a 3. Mivel while ciklusan belül hívjuk meg az each() függvényt. echo $elem[1]. = 4.$ertek. Az l.$ar<br />". A list () szerkezettel adott számú értékre oszthatunk egy tömböt. A függvény egy adott tömb aktuális elemér adja vissza. majd a következő elemet teszi az aktuálissá. 3. hogy melyiket választj uk. hanem az első elem hozzáadása hozza létre: $arak['gumiabroncs'] $arak['o1aj'] = = 100. mi most úgy döntöttünk."<br />". $arak['gyertya'] Ciklusok használata Mivel a tömbben használt indexek jelen esetben nem számok.$ar<br />".2 ábra: Az eaeh () utasítással végiglépkedhetünk a törnhökön.

Ez azt jelenti. akkor azokat nem fogja hozzáadni. Látni fogjuk. a res et () függvénnyel vissza kell állítani az aktuális elemet a tömb elejére. az oszlopok az eltárolt termékjellemzőt tartalmazzák. 3. ahogy ez a 3. és ezzel lehetövé teszi. Tómhműveleti jelek A tömbökön különleges müveleri jelek alkalmazhatók. vagy az elemek típusa és/vagy sorrendje nem egyezik meg. $ar ) = each ( $arak ) ) ech o "$termek . A tömböket nem lehet értelmesen összeha­ Tóbbdimenziós tömbök A tömbök nem szükségszerűen csak kulcsok és értékek egyszerű listái. ám könnyebben olvasható. Az ilyen tömböket mátrixként képzelheljük el. A $b tömböt hozzáfüzi $a-hoz. ha az $a és $b tömb ugyanazokat az elemeket tartal­ mazza. kétdimenziós tömböt kell használnunk. ráadásul azok típusa és sorrendje is megegyezik. csak az unió szorul némi további magyarázatra. Ha megjegyezzük azt. Az ea ch () használarakor ügyeljünk arra. működésüket akkor is értelmezni tudjuk. Az arak tömb ismételt bejárásához gépeljük be a következőket: reset ($arak). ha nem kívánunk elmélyedni a mögöttük álló matematikában. hogy a sonlítani a skaláris típusokkal. Ez a kód visszaállíga az aktuális elemet a tömb elejére. Akkor igaz. amelynek szélessége és magassága is van . Akkor igaz. Az unió müveleri jel megkísérli hozzáadni a $b elemeit az $a végéhez.3 ábrán kétdimenziós tömbként látjuk Bob termékskáláját.Tömbök használata 59 Ennek kimenere megegyezik az előző kódéval. hogy nevet rendel­ jünk a válrozókhoz.ezek a sorok és az oszlopok. hogy a 3. A 3. amelyben a sorok egy-egy terméket. mert a l ist () lehetövé teszi. ha $a és $b nem ugyanazokat az elemeket tartalmazza. a tömb minden egyes eleme akár egy másik tömböt is tárolhat. hogy a tömb számon targa az aktuális elemér! Ha ugyanabban a kódban kétszer kívánunk használni egy tömböt. Akkor igaz.1 táblázatban lévő tömbműveleri jelek rnindegyikének létezik skaláris változókon működő megfele­ lője. hogy újra végiglépkedjünk a tömbön.$ar<br />". Ha a $b valamely elemei az $a tömbben is megtalálható kulcsokkal rendel­ keznek. $a == $b $a === $b != <> Nem egyenlő Nem egyenlő Nem azonos $a ! = $b $a <> $b $a !== !== $b Ezek a tömboperátorok nagyrészt magától értetődőek.1 táblázat: A PHP tömbműveleti jelei Név Unió Egyenlő Azonos 3 E redm ény $b Műveleti jel + Példa $a + \" Az $a és a $b uniója. while ( list ( $termek. Így hozhatunk létre kétdimenziós tömböket. Ha egynél több adatot szereménk tárolni a Bob által forgalmazott termékekről. rnint a!=. Akkor igaz. . + összeadást hajt végre a skaláris típusokon és uniót tömbök esetén. Többségüknek van skaláris megfelelője. ha az $a és $b tömb ugyanazokat az elemeket tartal­ mazza. Ugyanaz.1 táblázatból kiderül. de az azonos kulcsú elemeket nem adja hozzá. ha $a és $b nem ugyanazokat az elemeket tartalmazza. hogy a művelet nem írja felül az $a elemeit.

echo 'l'.'l<br />'. fejezet Kód TIR OIL Megnevezés Gumiabroncs Olaj Gyertya termékjellemző Ár 100 10 4 SPK 3. mintsem azt.$termekek(2] (l]. 'Ar' => 10 )' array( 'Kod' => 'SPK'. echo 'l' . ha értelmes sor.3 ábrán is látjuk. array( 'OIL'.'l'.$termekek[l) [l). hogy a$ termekek tömb most három tömböt tartalmaz.60 3. oszlopban. egy sor.$termekek[1)[0).3 ábrán látható tömböt: $termekek = array( array( 'TIR'.' l'. hogy nagyobb tömb esetén a második változat sokkal kevesebb gépelést igényel.$termekek[0)[2). Könnyebb megjegyezni. 'Gyertya'. a következőképpen érnénk el az egyes elemeket: echo 'l'.$termekek[$sor) [$oszlop). A dolog kétdimenziós tömb eserén is hasonlóan működik annyi különbséggel. az alábbi kódot kellene megírnunk: $termekek = array( array( 'Kod' => 'TIR'. 'Megnevezes' => 'Gyertya'. Emlékezhetünk rá.$termekek(2] (2].'l' . Könnyedén megtaláljuk a keresett adatot.$termekek[0)[1).és egy oszlopindexszel bír.'l<br />'.3 ábrán látható oszlopnevekkel szeretnénk eltárolni.és oszlopnevekkel hivatkezunk a tárolási helyére.$termekek[2)[0). echo 'l<br />'. nem szükséges megjegyezni.$termekek[1)[2). $oszlop < 3.' l<br />'. 'Gumiabroncs'.) Ha ennek a tömbnek az elemeit kellene megjelenítenünk. Egy ciklusba egy másik for ciklust helyezve sokkal elegánsabban is elérhetjük ugyanezt az eredményr: ( $oszlop++) for ($sor = 0. ahogy ezt a 3. 'Megnevezes' => 'Gumiabroncs'. hogy núnden elem kettő. 3 Ebből a meghatározásból látható. 'Ar' =>4 ). hogy egy adott elemet az [xJ [yJ helyen tárolunk. hogy a megne­ vezést a "Megnevezés" oszlopban tároljuk.$termekek[O] [0]. Ha ugyanezeker a termékeker a 3. Érdemes lehet az oszlopoknak a számok helyett nevet adni. hogy egydimenziós tömbökben lévő adatok eléréséhez a tömb nevére. 'Olaj'. 10 ).' l'.'l'.' l'. Az alábbi PHP kóddal hozharjuk létre a 3. hogy az l. 4 ) ). oszlop. $sor++) for ($oszlop = 0. . 100 ) . array( 'SPK'. ha egyetlen értéket szeretnénk visszakeresni. a bal szélső oszlop pedig a O. (A legfelső sor a O. Ez a tömb egyszerűbben kezelhetö. Mindkét kód ugyanazt a kimenetet eredményezi böngészőnkben: ITIRIGumiabroncsl1001 IOILIOlajl101 ISPKIGyertyal41 A két példakód között az az egyetlen. 'Ar' => 100 )' array( 'Kod' => 'OIL'. sor.3 ábra: Egy kétdimenziós tömbben több információt tárolhatunk Bob termékeiről. Ha beszédes nevű indexeket használunk. ám nem elhanyagolható különbség. $sor < 3. illetve az elem indexére van szük­ ség. for echo 'l'. 'Megnevezes' => 'Olaj'.

. ezekbe a töm­ bökbe is rakharunk újabb tömböket. O 100} . 'Gumiabroncs'. $ertek} = while list( ( each( $termekek[$sor]}} { echo "l$ertek". ' laj'. T 'VAN_ OIL'.' l' . '0 ·s }:J e j zo t ll l Teberautó-alkatréaak Kód l Kiateherautó-alkalrisulr. A 3.'l<br />'. 'Gyertya'. Ugyanúgy. 'Gumiabroncs'. Ezek szerint egy while ciklusra van szükségünk a for ciklusban: for ( $sor = fUggvénnyel lépkedhetünk végig a belső 0. T 'CAR_ OIL'.Tömbök használata 61 Ezzel azonban elvesztjük annak lehetőségét. $sor < 3. 10 } . ' laj'. ' laj'. $sor+ +} { $kulcs.4 ábra: A $kategoriak = CAR_TIR CAR_OIL CAR_SPK termékjellemző háromdimenziós tömbben már kategóriák szerint is csoportosíthatjuk a termékeket. akkor képzeljük el. Egy while ciklusba helyezett each} list(} ( és tömbökön. Egy háromdimenziós tömbnek magassága. 'CAR_SPK'. 'TRK 'CAR_IR'. Néz­ zük meg e tömb megjelenítésének egy lehetséges módját: for ( $sor = 0. 3 Nem szükséges megállnunk két dimenziónál. Ha Bob kategóriákra bontaná termékeit.$termekek[$sor] [ 'Kod' l. hogy egyszerű for ciklussal egyenként végiglépdeljünk az oszlopokon. } . echo 'l<br />'. ahogy ezeket a táblázatokat egymásra pakoljuk! Az egyes elemekre azok rétege. 'TRK_ OIL'. Ennek a tömbnek minden sora leíró nevű indexekkel rendelkezik. $sor < 3. O 120 ) ' 12 } ' 'Gyertya'. numerikusan indexelt$ termekek tömbön. 'VAN-SPK'. 5} 150} ' 'Gumiabroncs'. $sor+ +} { echo 'l' . Az ezt a tömböt meghatározó kódból láthatjuk. háromdimenziós tömbben tárolhatná azokat. Egy for ciklussal végiglépkedhetünk a külsö. sora és oszlopa alapján hivatkozhatunk. Ha a kétdimenziós tömbökre oszlopokból és so­ rokból álló táblázatként gondolunk.$termekek[$sor] [ 'Megnevezes']. 'VAN-IR'. 'l' . szélessége és mélysége is van.4 ábra háromdimenziós tömb­ ben mutatja a Bob által forgalmazott termékeket.$termekek($sor] ['A r']. ahogy a tömbelemek tömböket is tartalmazhatnak. hogy egy háromdimenziós tömb tömbök tömbjét tartalmazza: array( array ( array( array( array( } array ( ' array( array( array( } ' array ( array( array( array( 'TRK_TIR'. Kód l Met!Devez& l l Ár 100 10 4 Ár Ár l M AatóaJka� Megnevez& Gumiabroncs Olaj Gyerrya l--ll--lt-- Kód 1[ 3. 4} 'Gyertya'. O 15} ' 6} -SPK'.

Gyertya. SORT_NUMERIC és SORT_STRING. echo ' l<br />'. . A valós világban jelentkező problémák legtöbbje három vagy kevesebb dimenzióval kezelhető. Olaj sorrendben jelennek meg. 2 '-t. amely az érték helyert a kulcsot tekinti a rendezés alapjának. 100 sorrendben jelennek meg. mint 12 ' megelőzi a . $sor++) 0. Vagyis az A a Z előtt van. for ($sor = O. ha számokat tartalmazó karakterláncokat. A tömb elemei mostantól a Gumiabroncs. 'Olaj ' ) .vagy akár hatdimenziós tömb megalkotását is. asort($arak). Ebben a tömbben az árak az értékek. 4 ). Az értékeket numerikusan is rendezhetjük. Egydimenziós tömb esetén ezt igen könnyen megtehetjük. Érdemes megjegyezni. hogy megadjuk a rendezés típusát. hogy a kulcsok és az értékek rendezés közben is együtt maradjanak. Az árak ekkor a 4. A következő kód három terméket és azok árát tartalmazó tömböt hoz létre. Az asort () az elemek értéke szerint rendezi a tömböt. és a Z is megelőzi az a-t.és nagybetűket. $arak = array( 'gumiabroncs'=>100. ksort($arak). $oszlop < 3. a ksort () függvényt használjuk.például 2 és 12 a 12. ám háromnál több dimenziójú szerkezeteket nehezen rodunk vizuálisan magunk elé képzelni. beágyazort for ciklusokkal jeleníthetjük meg a tartalmár: for ($reteg = 0. a kulcsok pedig a szö­ veges leírások. 'olaj '=>10.62 3. Tómbök rendezése a sort () és ksort () fiiggvényekkel Amennyiben jelentéssei bíró kulcsokat használó tömbben tároljuk el az árucikkeket és azok árát. A 2 számszerűen kisebb. sort($termekek). öt. fejezet Mivel ez a tömb csak numerikus indexeket tartalmaz. másmilyen rendező függvényt kell választanunk ahhoz. for ($oszlop Sreteg < 3. sort($arak). hogy a sort () függvény megkülönbözteti a kis. de szeringként a . A következő kód eredményeként a tömb kulcsai lesznek ábécérend szerint rendezve Gumiabroncs. Gyertya. $oszlop++) echo 'l' . = Sreteg++) { { echo "Réteg $reteg<br />". 'gyertya'=>4 ). A sort () fiiggvény használata A sort() függvényt bemutató következő kód eredménye egy ábécérend szerint növekvő sorrendben lévő tömb: $termekek = array( 'Gyertya'. A prog­ ramozási nyelv szempontjából nincsen korlátja a dimenziók számának. egymással összefüggő adatokat. - hasonlírunk össze. Olaj: 'olaj '=>10. 'Gumiabroncs'. ha rendezni rodjuk az egy tömbben levő. A többdimenziós tömbök létrehozási módja lehetövé teszi négy-. 3 Tómbök rendezése Gyakran jól jöhet. 10. majd árak szerint növekvő sorrendbe rendezi a tömböt: $arak = array( 'gumiabroncs'=>lOO. Az alábbi állandók valamelyikét adhatjuk neki: SORT_ REGULAR (ez az alapértelmezert).$kategoriak[$reteg] [$sor] [$oszlop]. A nagyberuk az összes kisbetÜt megelőzik. Amennyiben tömbünk Bob termékeinek az árát tartalmazza. $sor < 3. akkor nyer értelmet. 10. a következöképpen rendezhetjük növekvő számsorrendbe: $arak = array( 100. Ha ár helyert cikknév szerint kívánunk rendezni. A lehetőség. 'gyertya'=>4 ). A függvény egy opcionális második paraméterrel is rendelkezik.

ezért tekintsük az alábbiakat pusztán rövid bevezetésnek! Függvényt a function kulcsszóval definiálunk. Amikor a függvény véget ér.emelkedő sorrendbe rendezi a tömböt.azaz csökkenő sorrendbe . amely fordított sorrend szerint. A könyv eddigi részében számos beépített PHP függvényt hívtunk meg. Ez az osszehasonli tas(} függvény két paramétert fogad: az egyiknek $x. de többdimenziós tömb esetén az egyes elemek maguk is tömbök. 'Gumiabroncs'. így mi magunknak kell elöállítani az összehasonlításuk módszerét. a krsort (}pedig az egyes elemek kulcsa alapján rendezi csökkenő sorrendbe az egydimenziós tömböket. Mind­ egyik függvénynek létezik egy párja. megnevezéssel és árral együtt tárolja el a Bob által forgalmazott három terméket: $termekek = array( array( 'TIR'. A függvény visszatérési értéke $x és $y értékétől függő en O. A fordított sorrend szerint rendező függvényeket az emelkedő sorrendbe rendező párjukkal egyező módon használjuk. a másiknak $y a neve. hogyan hasonlírsa össze az elemeket. amely egy-egy terméket jelképez. 'SPK' . 1 osszehasonli tas 1} . l vagy -l. A return l. A PHP képes ugyan összehasonlítani két számot vagy két karakterláncot. mint hogy vesz két értéket. Ha rendezzük ezt a tömböt. A PHP nem tudja. A következő kód a tömb második oszlopát. Az rsort(} függvény egydimenziós. 4 } }. illetve az ábécérendről és a számsorrendtől eltérő elv alapján történő rendezés ennél bonyolultabb feladat. többszörifelhasználása és függvényírás című 5. Ezt nevezzük a függvény hoz a return kulcsszót használjuk a függvényben. az osszehasonlitas(} függvénynek össze kell hasonlítania $x-et és $y-t. usort($termekek. mi alapján hasonlítson össze két tömböt. amennyiben az a nagyobb. ám összetettebb objektumok esetén problémásabbá válhat a rendezés. fejezet­ visszatérési értékének. if ($x[l) == $y} l $y[l)} l < return 0. Tómbünk rendezéséhez definiálnunk kell saját függvényünket. else l return l. Az $x tömb Megnevezes ele­ mér az $x[l) kóddal érjük el. 100 } . legalább kétféle értelmes sorrend létezik. negatív szám. A tömb kóddal. A szavak vagy számok sorrendje az esetek többségében viszonylag magáról értető­ dó. A függvény célja nem más. ha $x a kisebb. Ezek neve rsort (}. 'Olaj'. Tóbbdimenziós tömbök rendezése Az egynél több dimenziós tömbök rendezése. numetikusan indexelt tömböt rendez csökkenő sorrendbe. hogy az usort(} használhassa. jelen esetben nevezzük például osszehasonl itas(} -nak! A függvények többsége paraméterrel működik. 'Gyertya'. Az arsort (} függvény az egyes elemek értéke. a megnevezést használva rendezi ábécérendbe tömbünket: function osszehasonl itas ($x. Érdemes függvényeinknek értelmes nevet adni. milyen sorrendben jelennek meg az értékek� Mivel tudjuk. . Ehhez saját összehasonlító függvényt kell írnunk.sort(}.asort (} és ksort (} . és megha­ tározza sorrendjüket. A függvény visszatérési értéke O legyen akkor. 10 }. és pozitív. Példánkban az $x és az $y a fő tömbön belüli két tömb.rendezi a neki áradott töm­ böt. A függvényírással részletesen foglalkozunk majd aKódok ben. mit jelent a tömb tartalma. Ahhoz. arsort (} és krsort(}. hiszen a Megnevezes a tömb második eleme. else if ($x[l) $y[l)} return -1. Mindkét rendezés lehetséges. de az usort(} függvényt kell használnunk. Az $x[l) és $y [l) kifejezésekkel összehasonlíthatjuk a függvénynek a tömb által áradott megnevezéseket. 3 Felhasználó által meghatározott rendezés Az alábbi kódrészlet a korábban használt kétdimenziós tömb meghatározása.Tombök használata 63 Fordított rendezés A három különböző rendező függvény. ha $x és $y egyenlő. választ ad az őt meghívó kódnak. a számozás pedig nullával kezdődik. és közölni kell a PHP-vel. Hasznos lehet a termékeket megnevezésük szerint ábécérendbe vagy áruk szerint numeriku­ san rendezni. array( array( 'OIL'. Meghatározásá­ sor az l-es értéket adja vissza a függvényt meghívó kódnak.

jelezvén. Az előbbit akkor vegyük igénybe. paraméterként a rendezni kívánt tömböt ( Stermekek) és az összehasonlító függvényt ( osszehasonlitas ())átadva neki. ha az értékek egyszerű számok vagy szöveg. akkor definiáljunk összehasonlító függvényt. .64 3. mint $y.a sort() és ksort( ) függvénynek megvan a csökkenő sorrendbe rendező párja. hogy használatához felhasználó által megírt összehasonlító függvényre van szükség. például tömbök. hogy bizonyos alkalmazásokhoz máshogyan szeretnénk kezelni a tömb elemeinek sorrendjét. akkor definiáljunk összehasonlító függvényt. 3 • Ha tesztelés gyanánt Juttatnánk ezeket a kódrészleteket. else { return -1. majd használjuk az uasort() függvényt! Felhasználói rendezés fordított sorrendben A sort().l . megírhatjuk úgy. A shuffle ( ) függvény véletlenszerű sorrendbe rakja a tömbelemeket. Például: function fordított_osszehasonlitas($x. Tómbök átrendezése Előfordulhat. vagyis felhasználó szóra utal. ennek ellenére fordítort sorrendbe is rendezheg ük a többdimenziós tömböket. fejezet A kód utolsó sora az usort () beépítert függvényt hívja meg. például tömbök. hogy ellentert értékkel térjen vissza. összehasonlító függvényeket. és az alábbi összehasonlító függvényt kell megírni: function osszehasonlitas($x. if (Sx[2] == $y) { $y[2]) { return 0. 'fordí tott_osszehasonlí tas') meghívása ekkor azt eredményezi. Az asort() függvényhez hasonlóan az uasort() függvényt is nem numerikusan indexelt tömb érték szerinti rendezésé­ hez használjuk. Ár szerinti ren­ dezéshez a tömb harmadik oszlopát kell venni. semmilyen kimenetet nem kapnánk. Ha az értékek összetertebb objek­ tumok.nevében egy r betűvel. amelyben az elemek fordított sorrendben szerepelnek. egyszerűen másmilyen összehasonlító függvényt írunk neki. Csökkenő sorrend szerinti rendezéshez függvényünk visszatérési értéke akkor legyen l. ha a kulcsok egyszerű számok vagy szövegek! Ha a kulcsok összetertebb objektumok. Az array_reverse( ) függvény az eredeti tömb másolatát adja visz­ sza. A fel­ használó általi rendezéseknek nincsen fordítort változata. Az asort és ksort függvény fordítort sorrend szerint rendező változata. Mivel az összehasonlító függvényt mi magunk állig uk elő. majd használjuk az uasort () függvényt! A ksort () függvényhez hasonlóan az uk sort () függvényt is nem numerikusan indexelt tömb kulcs szerinti rendezé­ séhez használjuk. mint $y. < $y[2]) Az usort($termekek. else if ($x[2] return l. az uasort() ésazuksort () is igényli a felhasználó által definiált. ha $x nagyobb. hogy a tömb ár sze­ rint csökkenő sorrendbe lesz rendezve. else if ($x[2] return -l. else { return l. Az előbbi akkor alkalmazható. ha $x kisebb. if ($x[2] == $y) { $y[2]) { return 0. Ezek a kódok egy nagyobb programba valók. Ha máshogyan szereménk rendezni a tömböt. és akkor legyen . 'osszehasonlí tas') ár szerint emelkedő sorrendbe rendezi a tömböt. < $y[2]) Meghívásakor az usort($termekek. Megjegyzés: Az usort () függvény nevében levő u az angol user.

'kormanykerek. ?> </tr> </table> </div> </body> 3 Mivel a kód véletlenszerűen választ képeket. echo "\"/></td>".php -Din amikus nyitóoldallétrehozás a PHP-vel Bob al katrész-kereske dés éhez <?php Skepek array('abroncs. majd megjeleníti első három elemér.1 példakód három. hogy a nyitó­ oldalon csak három. hogyki emeljünkhárom.jpg'. i t . hogy ez a három kiválasztott termék minden látogatásnál más és más legyen. A 3. Célját egyszerűen elérheti.5 ábra). Si < 3.1 példakód: bob_nyi to_oldala. ám azt akarja. azt szeretné. 3.Tombök használata 65 A shuffle ( ) függvény használata Bob szereme kiemelni néhány terméket honlapjának nyitóoldalán. ?> <html> <he ad> <title>Bob autóalkatrészek</t itle> </head> <body> <hl> Bob autóalkatrészek</hl> <div align="center"> <table width = 100%> <tr> <?php for ($i = 0. Hogy a törzsvendégeket ne untassa. $i++) { echo "<td align=\"center\"><img src=\"". szinte minden egyes betöltéskor más és más oldalt látunk (3.jpg'. 'fekbetet. Széles termékválasztékot kínál. véletlenszerűen kiválasztott képet jelenít meg azzal.jpg'. Bob autóalkatrészek 9--3. 'gyujto_gyertya.5 ábra: A shuffle()függvénnyellehetövé válik. 'ablaktorlo_lapat.jpg'.jpg'). véletlenszerűen kválasz ott t erméket. ha termékeit egyetlen tömbbe rakja. hogy véletlenszerű sorrendbe rendezi a töm­ böt. shuffle ($kepek). véletlenszerűen kiválasztott elem jelenjen meg. echo $kepek[$i].

Ne feledjük. $szamok = range(lO. hogyan tároljuk az ügyfelek megrendeléseit fájlban. A tömböt elemenként is előállíthatjuk for ciklus segítségéve!: $szamok = array(). Ennek az állománynak minden sora a következőhöz hasonlóan nézert ki: 15:42. majd az elemeket az array_push() függvénnyel hozzáadjuk a römbhöz. ám az elemeket fordított sorrendbe rakva létrehoz egy újat. A 3. mindegyiket annak végéhez.3-as példakódja (kimenete a 2./rendelesek/rendelesek. próbálkozzon kés6bb!</strong></p>". (Zárójelben jegyezzük meg.. 0) == { echo "<p><strong>Nincs fligg6 megrendelés. $i++) { echo $rendelesek[$i) . Tombök feltöltése fájlokból Az Adatok tárolása és visszakeresése című 2. Irt létrehozunk egy üres tömböt. hogy visszatöltsük egy tömbbe.lO). -1). if ($rendelesek szama Kérjük. 3 A for ciklus a következőképpen eredményezhet csökkenő sorrendet: megadunk egy nagy kezdeti értéket. amit az array_reverse () vagy az rsort( ) függ­ vénnyel rendezhetünk fordítort sorrendbe. és visszatérési értéke is ez az eltávolítort elem lesz. .műveleti jellel. array_push($szamok. és ugyanazzal a tartalommal.2 példakód a meg­ rendelési fájl jelenlegí változatát mutatja. A range() használata általában emelkedő sorrendet eredményez."<br />". l. Ez a függvény eltá­ volítja az adort tömb végén lévő elemet.00 22 Short St. amivel megfordíthatjuk a range() függvénnyel létrehozort tömbben az elemek sorrendjét: $szamok = range(l.) Használhatjuk az array_reverse( ) függvényt is. ha a r ange () opcionális lépésköz-paraméterének a -l-et adjuk meg. $rendelesek= file("$DOCUMENT_ROOT/. mint az előző fejezer 2. fejezet Az array_reverse ( ) függvény használata Az array_reverse() függvény fogja az adott tömböt. $rendelesek_szama = count($rendelesek). akkor a másolarot egyszerűen írjuk az eredetibel Ha adaraink egyszerűen egész számok egy tartománya. 3. A kód a count() függvény használarával állapítja meg. Ez a kód majdnem teljesen ugyanazt a kimeneter produkálja. 20th April 4 gumiabroncs l olaj 6 gyertya $434. php-Bob <?php //rövid változónevek létrehozása $DOCUMENT_ROOT = megrendeléseinek megjelenítése PHP-vel $ SERVER['DOCUMENT_ROOT').66 3. akkor fordítort sorrendben úgy állíthatjuk öket elő. hogy az array_reverse ( ) a tömb módosírott másolatával tér vissza! Ha nincsen szükségünk az eredeti tömbre. Smalltown A megrendelés feldolgozásához vagy teljesítéséhez szükség lehet arra. mint ahogy az a példában is volt. Tóbbféleképpen állítharunk elő például egy 10-től l-ig való visszaszámlálást tartalmazó tömböt. Ez alkalommal a kód a file() függvényt használja. ami a reljes fájlt egy tömbbe rölri be. hogy hány elemből áll a tömb. $i>O.txt"). A fájl minden egyes sora a tömb egy-egy eleme lesz. $i--) { $i). majd a ciklus minden egyes lefutásának végén eggyel csökkentjük a -.4 ábrán volt látható). for($i=10. for ($i=O. hogy az array_push () ellentéte az array _pop () függvény. $szamok = array_reverse($szamok). fejezetben megtanultuk.2 példakód: rendelesek_megtekintese. $i<$rendelesek_szama.

$sor[2). ll Megszámolja a tömbben levő rendeléseket. == 0) { echo "<p><strong> Nincs függő rendelés.. A 3.txt"). Ez lehetövé teszi az egyes részek elkülönített feldolgozását. intval($sor[2]). for ($i=O.$sor[l) .Tömbök használata 67 A megrendelési sorok egyes részeit elkülönítve is betölthetjük a fájlt.3 példakód: rendelesek_megtekintese2. 3. echo "<tr><th bgcolor=\"ICCCCFF\">Rendelés időpontja</th> <th bgcolor=\"ICCCCFF\">Gumiabroncs</th> <th bgcolor=\"ICCCCFF\">Olaj</th> <th bgcolor=\"ICCCCFF\">Gyertya</th> <th bgcolor=\"ICCCCFF\">Végösszeg</th> <th bgcolor=\"ICCCCFF\">Szállitási cim</th> <tr>". illetve tetszetősebb formázását. Srendelesek= file("$DOCUMENT_ROOT/. //Minden megrendelés a tömb egy-egy eleme lesz. if ($rendelesek_szama Kérjük.3 példakód pontosan ezt végzi el.$sor[3). $rendelesek[$i)). ll Minden megrendelés megjelenitése."</td> <td align=\"right\">".$sor[O] . ll Csak a rendelt elemek mennyiségét tartja meg. Si++) { //Az egyes sarok felbontása./rendelesek/rendelesek. $rendelesek_szama = count($rendelesek). $sor[l) $sor[2) $sor[3) = intval($sor[l)). próbálkozzon később!</strong></p>".php-Bob megrendeléseinek elkülönítése. J' 3 \.formázása és megjelenítése PHP-vel <?php //rövid változónevek létrehozása $DOCUMENT_ROOT ?> <html> <he ad> <title>Bob autóalkatrészek . külön tömbelemekbe helyezve a tartalmat. $sor = explode("\t"."</td> <td align=\"right\">". = S_SERVER['DOCUMENT_ROOT')."</td> ."</td> <td align=\"right\">". intval($sor[3])."</td> <td align=\"right\">". $i<$rendelesek_szama. echo "<tr> <td>". echo "<table border=\"1\">\n".Megrendelések</title> </head> <body> <hl>Bob autóalkatrészek</hl> <h2> Megrendelések</h2> <?php //A teljes fájl beolvasása.$sor[4).

ioa. hogy nyomtatás előtt feldolgozzuk és formázzuk tartalmukat."4 gyertya"."0 gumiabroncs". hogy mit je­ lentenek a számok. �� -:::-" ��•IIO:rrf� _. fejezet <td>". és a táblázat fejlécében tájékoztat arról.. Többféleképpen Icinyerhetnénk a karakterláncokból a számokat. Időről időre a többire is szükségünk lehet. A kód kimenetét a 3. Jelen esetben az intval () függvényt válaszguk erre. a példa csak megjeleníti a rendelési mennyiségeket. Az explode függvény az alábbi prototípussal rendelkezik: array explode(string elvalaszto. 31st March 2008\tO gumiabroncs\t1 olaj\t4 gyertya\t$26. ezért közülük a fontosabbakat most bemutaguk. Ahelyett. az olajat és a gyertyákat."<ltd> </tr>". hogy az opcionálislimit paraméterrel korlátozhaguk a függvény által visszaadott részek maximális számát.6 ábra: A megrendelési rekordok explode () f üggvénnyel való szétbontása után a megrendelések minden részét külön-külön táb­ lázatcellába helyezve tetszetősebb kimenetet kapunk. A ka­ rakterláncok feldolgozásának különféle módjaival a következő fejezetben foglalkozunk majd. A tabulátor karakter lesz a szomszédos elemek közötri elválasztó.��'9-z!� � ."1 olaj". int limit]) Az előző fejezetben tabulátort használrunk a tárolni kívánt adatokat elválasztó karakterként. Springfield az alábbi részekre bontja a függvény: "20:43.$sor[5]. ez a függvény egész számmá alakítja a karakterláncokat.� Bob autóalkatrészek Meerendelfuk ­ 3 � 4l. _ ll7 .2 példakóddal ellentétben itt az explode () függvénnyel szétbont­ juk a sorokat. 31st March 2008". Springfield". echo "</table>".lla�:l001 ��(.� s. Ez a kód nem igazán alkalmas a megrendelések feldolgozására. ?> </body> A 3.. $rendelesek[$i] ) Ez a kód részekre bontja a bevitt karakterláncot.do}OOI . de a 3.. Például a következő sztringet: "20:43. Ahogy az l."$26.A"_St.SI. . ) S04.így jelen példában a címkét-. hogy minden sorba Iciírja a gumiabroncsokat.t. Az átalakítás kellően intelligens. ezért a következő formában kell meghívni a függvényt: explode( "\t".� l SIOOJJ01M.li•M.6 ábrán láthaguk.3 példakód a teljes fájlt egy tömbbe tölti be. és figyelmen kívül hagyja azokat a részeket. Érdemes megjegyezni. string szoveg [.68 3.00" &"127 Acacia St..00\t127 Acacia St. 4 l ji"JO. amelyeket nem lehet egész számmá konvertálni. fejezetben elmondtuk. További tömbkezelési eljárások Idáig a tömbkezelő függvények mintegy felével ismerkedtünk meg. 3.00o1l5iai.u.

felhasznaloi_adat nevü paraméter opcionális. majd ezt az új aktuális elemet adja vissza. amely az aktuális elemére mutat.current (). A következő kód a felhasználó által megírt sa j at_kiiratas () függvényt a $tomb minden elemével meghívva új sor­ ban jeleníti meg az egyes elemeket: function sajat_kiiratas($ertek) ( echo "$ertek<br />". a következő elemre lépteti a mutatót.pos () és prev () függvény Ernlírettük korábban. Függvény alkalmazása egy tömb minden egyes elemére: array_walk () Előfordulnak olyan helyzetek. [mixed felhasznaloi_adat]) A korábban használt usort () függvényhez hasonlóan az array_walk() is megköveteli.end().next(). A felhasználó által definiált ügyes kis függvény lehet olyan. hogy a reset() a tömb első elemére küldi vissza a mutatót. Korábban láthattuk.current(). amikor az each() függvénnyel dolgoztunk. A har­ madik. Előfordulhat az is. hogy saját függvényünket dek­ laráljuk. Rövidesen látni fogjuk. mindez hogyan müködik. A prev() függvény a next( ) ellentettje. $ertek = prev($tomb). PrototÍpusa a következő: bool array_walk(array tomb. és a következőképpen hívja meg a függvényt: sajat_fuggveny(ertek. Amennyiben használjuk. Látható. amely a tömb núnden elemér meghatározott formázással jeleníti meg.next (). illetve a felhasznaloi_adat paraméterként általunk megadott valamit. illetve utolsó elemér a reset() és end ( ) függvénnyel kaphatjuk vissza. A következő kód például fordított sorrendben jelenít meg egy tömböt: $ertek = 3 end ($tomb). vagy ugyanúgy módosítanánk azokat. A felhasználó. Ebben az esetben a fenti kód böngészőbeli kimenere a következő lenne: 3 2 Az each(). Koráb­ ban.reset(). A $tomb tömböt például a következőképpen deklaráljuk: $tomb = array(l. 3). közvetve már használtuk ezt a mutatót. .end (). felhasznaloi_adat) Függvényünk az esetek többségében csak a tömbben levő értékeket fogja felhasználni. vagyis a mi magunk által írt függvénynek adott núntát kell követnie. 2. amit a tömb minden elemére alkalmazni kívánunk. Eggyel visszább lépteti a mutatót.res et (). Az each($tomb_ neve) meghívása a mutató előreléptetése előtt adja vissza az aktuális elemet. Az első. a tomb a feldolgozni kívánt tömb.Tombök használara 69 Tómbön belüli nav igálás: each (). 'saJat_kiiratas'). amikor egy tömb núnden elemével ugyanúgy kívánunk dolgozni.pos () és prev () függvénnyel tömbjeinket az általunk kivánt tet­ szőleges módon bejáró kódot hozharunk létre. A next() függvény ettől kissé eltérően viselke­ dik: a next($tomb _neve) előrelépteti a mutatót. Új tömb létrehozásakor az aktuális mutató a tömb első elemére mutat. hogy az array_ wa lk() három paramétert fogad. Az array_ wa lk() függvény pontosan ezt teszi lehetövé. hogy a felhaszna l oi_adat paraméter segítségével valamilyen paramétert acljunk át függvényünknek. string fuggveny. az end () és prev () függvényt kell használnunk. Ennek megfelelően a tömb első. A current($tomb_neve) függvény meghívása az első elemmel tér vissza. ám közvetlenül is kezdhetjük. Ha fordítva szeretnénk bejárni egy tömböt. while ($ertek) { echo "$ertek<br />". hogy minden tömb egy belső mutatóval {pointer} rendelkezik. majd az új aktuális elemet adja vissza. A második. fuggveny nevü paraméter a felhasználó által definiált függvény. A next() vagy az ea ch () függvény meghívása eggyel előre. A tömb núnden eleme esetén az array_ walk függvény fogja a tömbben tárolt kulcsot és értéket. amelynek meghívásával a tömb végére küldjük a mutatót. a rray_walk ($tomb. Ennek párja az end($tomb_neve). függvényünk paraméterként megkapja. Egyes helyzetek megkövetelherik. kulcs.

hogy a kulccsal nem foglalkozunk. hogy a hivatkozás szerinti átadáshoz és (&)jelet helyezünk a változónév elé. A saj at_szorzo_ fuggveny () függvény deklarálásában a változó neve előtti és (&)jel azt jelenti. echo "$kulcsl $kulcs2 $kulcs3". Mindkét függvény a neki áradort tömb elemszámát adja vissza. $ac = array_count_values($tomb). l. l). egy $ac nevű tömböt hoz létre. 5. a harmadik paraméter fogadásához a kulcsot is fogadnunk kell: function sajat szorzo fuggveny(&$ertek. $szorzotenyezo) { $szorzotenyezo. Például az alábbi kód: $tomb = array(4. l. az extract () függvénnyel skaláris változók halmazává alakíthatjuk őket. 3). si z e of ( ) és ar ra y_coun t_va l u es () fiiggvény Egy korábbi példában arra használtuk a count ( ) függvényt. 2. amely módosítja a tömbben lévő értékeket. 'kulcs2' => 'ertek2'. A függvény prototípusa a következő: extract(array valtozo tomb [. string elotagJ ). és működé­ séhez paramétert vár! Bár a kulcsra nem lenne szűkségünk. Aztán persze dönthetünk úgy. A kód definiálja a sa j at_szorzo_ fuggveny() függvényt. 3. illerve. hogy a kulcs hányszor fordul elő a $tomb tömbben. E vál­ tozók értékének a tömbben tárolt értékeket rendeli. a 2 pedig kétszer. Az array_count_values() függvény ennél kicsit bonyolultabb. hogy a 4. amely szorzótényezőként fogja felhasználni azt. 'sajat szorzo fuggveny'. amely a következőket tartalmazza: Kulcs 4 5 l 2 3 Érték l l 3 2 l Az eredmény tudatja velünk. írjunk olyan függvényt. amely azt közli.)A tömb egy gyakorisági táb­ lázatot tartalmazó asszociatív tömböt ad vissza. array_walk(&$array. A sizeof() függvény pontosan ugyanezt a célt szolgálja. Az elemszámot általános skaláris változóként kapjuk vissza. hogy fogja a tömböt. hogy a függvény módosíthassa a tömb tartalmár. Dönthetünk úgy. a tömb elemének kulcsát ($kulcs) és a paramétert ($szorzotenyezo) . Ha meghívjuk. az l háromszor. Minden kulcshoz egy számszerű érték tartozik. akkor egyelőre elég annyit megjegyezni. Tó�bök átalakítása skaláris változókká: extract () Amennyiben egy nem numerikasan indexelt tömbben adott számú kulcs-érték párral találkozunk. a függvény megszámolja. hogy az itt megadott értéket pa­ raméterként továbbítsa a függvénynek. fejezetben részletesebben is foglalkozunk. 1nt extract_tipusa] [. hogy függvényünk-a sa j at_ kiiratas () függvényhez hasonlóan. hogy három paramétert fogadjon: a tömb elemének értékét ($ertek) . és a benne lévő kulcsok neveivel skaláris változókat hozzon létre. úgy kell deklarálni a sajat_szorzo_fuggveny () függvényt. eredményül nullát kapunk. hogy megszámoljuk a rendelések tömbjében levő elemeket. 3 Érdemes felfigyelni az $ertek átadásának módjára. Nézzük ezt az egyszerű példát: $tomb = array( 'kulcsl' => 'ertekl'. amely a tömb minden eleméc megszorozza a megadott szorzótényezővel. opcionális paraméterét. $ertek *= $kulcs. extract($tomb). 'kulcs3' => 'ertek3'). . hogy az $ertek paraméter hivatkozásként adódik át.70 3. 2. A hivatkozás szerinti paraméterátadással az 5. A hivatkozás szerinti átadás lehetövé te­ szi. Az extract() függvény célja. fejezet hogy az érték mellett az adott elem kulcsára is szükségünk van.figyelmen kívül hagyja a kulcsot és a felhas znaloi _adat paramétert. Mivel szükség van erre a paraméterre. (Ezt a tömb számasságának nevezzük. az 5 és a 3 egyszer fordul elő az $array tömbben. Ez a tömb kulcsként tartalmazza a $tomb egyedi értékeit. Használnunk kell az array_wa lk ( ) harmadik. Ha nem ismerős számunkra ez a fogalom. hogy az egyedi értékek hányszor fordulnak elő a $tomb nevű tömbben. Tómbelemek számlálása: coun t () . Hogy lássunk egy kicsit összetettebb példát. amennyiben üres tömböt vagy egy még be nem állított változót adunk át a függvénynek.

hogy az itt létrehozott változók neve elötag-alulvonás-kulcsnév: = $tomb array ( 'kulcsl' = > 'ertekl'. EXTR PREFIX ALL Az elotag paraméterben meghatározott előtaggal látja el a változóneveket. hogy miként kezelje az összeütközéseket. az elem kulcsának érvényes változó­ névnek kell lennie. Megismerkedünk a reguláris kifejezések függvényeivel. EXTR PREFIX INVALID EXTR IF EXISTS Csak a már létező változókat nyeri ki (vagyis a tömbben lévő értékeket létező változókba írja).Ezek az értékek az eredeti tömbből származnak. hogy egy adott ütközés be fog kö­ vetkezni. A http://www. Az extract_ tipusa lehetséges értékeit a 3. Az extract () függvény két opcionális paraméterrel bír: extract _tipusa és elotag. Hogyan további A következő fejezetben a karakterláncokat feldolgozó függvényekről tanulunk. 'sajat_elotag'). Ez a paraméter például a $ REQUEST érvényes változók halmazára konvertálásá­ _ nál alkalmazható.net/array címen elérhető online PHP kézikönyvben rnindegyiknek megtaláljuk rövid leírását. Ehhez meg kell adni az elotag 3 paramétert. Ütközés esetén $elotag_ kulcs nevű változót hoz létre. Azokkal a függvényekkel foglalkozunk. extract ($array. 'kulcs3' => 'ertek3'). vagy előtaggal kivánjuk ellátni az adott kulcsot. 'ertek2' és 'ertek3 '. előtaggal ellátott változatát hozza létre. Ez a kód is a következő kimenetet eredményezi: ertekl ertek2 ertek3 Jegyezzük meg.2 táblázat: Az extract ( ) lehetséges extract tipusa paraméterei _ Típus EXTR OVERWRITE EXTR SKIP EXTR PREFIX SAME Jelentés Ütközés esetén felülírja a meglévő változót. echo "$sajat_elotag_kulcsl $sajat_elotag_kulcs2 $sajat_elotag kulcs3".Tömbök használata 71 A kód a következő kimenetet eredményezi: ertekl ertek2 ertek3 A tömb három elemmel rendelkezik. Szándékosan nem vállalkoztunk a az összes tömbfüggvény tárgyalására. A paraméter két leghasznosabb értéke az EXTR_OVERWRITE (az alapértelmezett) és az EXTR_PREFIX_ALL. vagyis a számmal kezdődő vagy szóközöket tartalmazó kulcsokat a függvény átugorja! További olvasnivaló Ez a fejezet a PHP általunk leghasznosabbnak vélt tömbfüggvényeit mutatta be. ame­ lyekkel szinte bármilyen műveletet elvégezhetünk a karakterláncokon. Az alapértelmezett lehetőség a meglévő változó felülírása. $kulcs2 és $kulcs3. EXTR-PREFIX-IF-EXISTS EXTR REFS Ha a változó előtag nélküli változata már létezik. illetve felosztják és egyesítik őket. Az elotag paraméterben meghatározott előtaggal látja el a máskülönben érvénytelen változóneveket (például a csak számokból álló neveket). $kulcs2 és $kulcs3 értéke rendre 'ertekl '. cserélnek. hogy a $kulcsl. ezek kulcsa rendre: kulcsl. ame­ lyekben már létezik a kulccsal egyező nevű változó. A kimenetből láthatjuk. Az extract () függvény há­ rom skaláris változót hoz létre: $kulcsl. az EXTR_PREFIX_ ALL értéket használó példát! Figyeljük meg. amikor risztában vagyunk azzal. EXTR_PREFIX_ALL. . Ehhez meg kell adni az elotag paramétert. 3. Hivatkozásként nyeri ki a változókat.php. és ki akarjuk hagyni.2 táblázat mutatja. Lássunk most egy egyszerű. 'kulcs2' = > 'ertek2'. például olyankor. Alkalman­ ként a többi lehetőség is hasznos lehet. Ehhez meg kell adni az elotag paramétert. amelyek szeringeket keresnek. Ezek azok az esetek. Ütközés esetén kihagyja az adott elemet. kulcs2 és kulcs3. Az extract_tipusa változó közli a függvénnyel. hogy ha az extract () függvénnyel szeretnénk egy elemet kinyerni.

. hogy az űrlapot egy olyan általános e-mail címre küldenénk.-------------­ � -------------- -- '------------------.. Ha az e-mail Bob legnagyobb ügyfelé­ től jött. Ha elkészültünk..4�-. Gyakran van szükség arra... e-mail címét és észrevételeit kéri... l 4. akkor mehet egyenesen Bobhoz._ ------ ---- ·- -. majd az eredmény alapján Bob megfelelő alkalmazortjához irányítjuk az e-mailt.. hogyan használjuk a PHP szeringkezelő függvényeit szöveg formázására és kezelésére.2 .. hogy adatbá­ zisban tárolandó felhasználói inputot rendbe tegyünk vagy árformázzunk. Bob alkatrész-kereskedésének a korábbi fejezetekben fejlesztett honlapjához a<ljuk ezeket a kódokat. Ahelyett.-�-._...---. Ezek a függvények számtalan különbözö helyzetben igen hasznosak rudnak lenni.. � .. hogy kulcsszavakat vagy kife­ jezéseket keresünk a szövegben. Ha például az e-mail a reklám szót tartalmazza.. A fejezeeben az alábbi főbb témaköröket tárgyaljuk: Karakterláncok formázása Karakterláncok egyesítése és szérválasztása Karakterláncok összehasonlítása Részszrringek keresése és cseréje szeringkezelő függvényekkel Reguláris kifejezések használata • • • Mintaalkalmazás létrehozása: intelligens üzenetküldő űrlap Ebben a fejezerben intelligens üzenerküldö űrlap létrehozásához fogunk karakterláncokat és reguláris kifejezéseket kezelő függvényeket használni..6.. miként lehet szeringkezelő függvényekkel és reguláris kifejezések függvényeivel szavakra... Azt is meg­ cárgyaljuk.. ----- ---- -- - - -- .1 ábra: Bob visszajelzést váró űrlapja az ügyfelek nevét... A keresőfüggvények kiválóan alkalmasak .�. _ __ Vásárlók üzenetei �koeeljr� .. akkor a vissz:Yelzést a marketingosztálynak címezzük. ����: �_� e... Ez alkalommal egy lényegre törő és gyakran használt üzenerküldö űrlapot fogunk elkészíteni. .. kifejezésekre vagy karak­ cerláncon belüli egyéb szövegmintákra keresni (és Icicserélni azokat).hu. Az űrlapot a 4.. .. .egyebek között keresőmotor-alkalmazások fejlesztésére....1 ábrán láthatjuk. to.. Ez az alkalmazás azonban bizonyos te­ kintetben felülmúlja az interneten ralálható számralan hasonszőrű űrlapot.. amelynek segítségével Bob ügyfelei panaszaikar és dicséreteiker közölhetik vele...4 Karakterláncok kezelése és reguláris kifejezések Ebből a fejezetből kiderül.. mint az info@cegnev. megpróbáljuk a folyamatot intelligensé tenni azáltal.. �-U � ..

string Az első három.com".com címre. ?> <html> <head> <title>Bob autóalkatrészek . nézzük meg először is azt. hogy hogyan működik! Talán nem meglepö. A negyedik paraméterrel további érvényes e-mail fejléceket küldhetünk. fejezet Induljunk ki a 4. ''Vevő neve: ''. (Az RFC. Az opcionális ötödik paraméterrel az üzenetküldésre beállítort programnak adhatunk át paramétert. "Vevő üzenete:\n". string targy. //mail() függvény meghívása az üzenet elküldésére mail($cimzett. Használhatnánk még egyebek között a Válaszcím: és Másolat: mezöt is. Kódunkból a tömörség kedvéért kimaradt ennek a függvénynek a meghívása. leckében foglalkozunk velük. Az érvényes e-mail fejlécek leírását az RFC822 dokumentumban találjuk.magyarui. "Üzenet a honlapról". illetve magát az üzene­ tet adjuk meg. string [tovabb1 fejlee [."\n". cseréljük ezt saját e-mail címünkre! Mivel idáig még nem használtuk a mail( ) függvényt. $level tartalma.$uzenet. $uzenet=$ POST[ ' uzenet '].több internetszabványnak a forrása. azaz Request for Comment.' '\n'' . Ha egynél több további fejlécet kivánunk az üzenethez adni.) A negyedik paraméter jelen esetben Feladó: címer ad az üzenethez. A kódból látható.hogy a felhasználó az űrlap minden kötelező mezöjét kitöl­ .Üzenet elküldve</title> </head> <body> <hl>Üzenet elküldve</hl> <p>Üzenetét elküldtük.</p> </body> </html> $targy. string uzenet. ' Válaszcím: bob@pelda. hogy a függvény e-mailt küld. .1 példakód: uzenet_ feldolgozasa. hogy az űrlapmezöket összefüztük.74 4.paraméterben az e-mail címzettjét. $email=$_POST[' email'].$email. és olvasás közben bövítsük és fejlesszük azt! 4.com\r\n " .1 példakódban található.$nev. "Vevő e-mail címe: ". Prototípusa a következöképpen néz ki: bool mail(string címzett. egyszerű kódból. Ez egy minta e-mail cím. és a PHP mail () függvényével elküldtük e-mailben az u zenet@ pelda. Általában ellenőriznénk-például az isset( ) függvénnyel.ph p.com". //statikus információk beállítása $címzett "uzenet@pelda.Megjegyzés kérésé'."\n". $felada). tovabbi_parameterek]]). a tárgysor szövegét.com". $targy $level_tartalma 4 $felada = "Feladó: webszerver@pelda.Az űrlap tartalmának elküldéséhez használt kiinduló kód <?php //rövid változónevek létrehozása $nev=$ POST['nev ']. tötte-e. a karakterláncon belül újsor és kocsi vissza karaktert (\n\r) használva választhatjuk el öket egymástól. Részletesen a Hálózati és pro­ tokol!függvétJyek használata című 20.nem mellesleg kötelező. mint például itt: $tovabbi fejlecek="Feladó: webserver@pelda. Amennyiben tesztelni szeretnénk a fejezetben fejlesztert kódot. amely-ha további részleteket szeretnénk megtudni-online elérhető.

igen hasznos lehet. amikor fájlban vagy adatbázisban kivánjuk tárolni. és a formázott sztringet adják vissza. az rtrim() csak a végéről (jobb olda­ láról) távolítja el a fehérköz karaktereket. Karakterláncok formázása Gyakran előfordul. Kiválóan használható hosszú karakterláncok böngészőben való megjelenítésénéL Használhatjuk például arra. A PHP három. erre a célra alkalmas fiiggvénnyel rendelkezik. Az adott céltól fug­ gően használhatjuk az l trim () vagy az rtrim () fiiggvényt is. Mindkettő a trim () fiiggvényhez hasonló. amely ugyanazt teszi. Karakterláncformázása nyomtatáshoz Idáig az echo nyelvi szerkezettel jelenítettük meg a böngészőben a karakterláncokat. A függvény által alapértelmezésben eltávolított karakterek közé az újsor és a kocsi vissza karakterek ( \n és \r) . $uzenet = trim($_POST['uzenet'). illetve a reguláris kifejezések függvényeinek alkalma­ zásával tökéletesíteni. $email = trim($_POST['email']). hogy az üzenetküldő alkalmazásunkra mutasson.bevitt karakterláncokat. hogy a trim () a karakterlánc elejéről és végéről. a szóban forgó karakterláncot fogadják paraméterként. Karakterláncokmegvágása: tr im (). ?> </p> Ne feledjük. vagy más szeringekkel szetetnénk összehasonlítani a ka­ rakterláncot. A három fuggvény között az a különbség.l tr im () és rtrim () függvény A rendrakás első lépése a karakterlánc megszabadítása a felesleges fehérköz karakterektőL Bár ez a lépés soha nem kötelező. ahol rövid neveket adunk az űrlap bemeneti változóinak. Az eredményt a 4. ám rendelkezik visszatérési értékkel (amí az eredménytől fuggően true vagy false ) . akkor valamelyik telepítési beállítás lehet a Iudas. és a benne lévő összes újsor karakterr az XHTML <br /> címkére (rag) cseréli. A PHP a print ( ) fiiggvényt is tá­ mogatja.jellemzően HTML űrlapon keresz­ tül . Ha a kód jelenlegi állapotában nem működik a rendszerünkön. tekintsük át a Függe­ lékben A PHP és a MySQL telepítését! A fejezet során ezt a kódot fogjuk a PHP szeringkezelő fiiggvényeinek. a szering vége karakter (\0 ) és a szóközök tartoznak. A most következő részekben az ilyen célra rendelkezésünkre álló fiiggvények közül mutatjuk be a fontosabbakat. 4 A trim() fiiggvény eltávolítja a karakterlánc elejéről és végéről a fehérközöket.Karakterláncok kezelése és reguláris kifejezések 75 A mai l () fiiggvény használatához be kell állítanunk a PHP-t. Egy második. a böngészőablak által esetlegesen kikényszerített sortöréseket leszámítva egyetlen sorban fog megje­ lenni. így ha nem szűrjük meg a kimenetet a nl2br ( ) fiiggvénnyel. Karakterláncokformázása megjelenítés céljából A PHP számtalan fiiggvényt kínál a karakterláncok különféle átformázására. mint az echo. HTMLformázás alkalmazása: az nl2br ()függvény Az nl2br() fuggvény a karakterláncot fogadja paramétereként. . hogy a HTML figyelmen kívül hagyja a sima fehérköz karaktereket. és az így kapott sztringer adja vissza. az l trim () csak az elejéről (bal oldaláról).opcionális -paraméterben megadhatjuk az ezen alapértelmezett karakterek helyett eltávolítandó karakterek listáját. a vízszintes és függőleges tabutátorok (\t és \xOB ) . hogy formázás után megjelenítsük az ügyfél észrevételét: <p>Lent látható üzenetét elküldtük. a következőképpen tisztíthatjuk meg a bemeneti adatokat a t rim() fiiggvénnyel: $nev = trim($ POST['nev']).</p> <p><?php echo nl2br($level_tartalma). A kód elején. hogy használatuk előtt rendbe kell szednünk a felhasználék által.2 ábrán látjuk.

Az alapértelmezerr kitöltő karakter a szóköz. akkor általában n argumentum szerepel a formátumszering után..Amennyiben lecserélni az átformázott argumentumok.. mixed parameterek .]) Mindkét függvény első paramétere egy formátumsztring.."..��·�·--. akkor látni fogjuk... A .]) (string formatum mixed parameterek..... A következő kóddal érhetjük ezt el: printf ("A rendelés végösszege: %. .-:_..2f (szállitással együtt: %..karakterlánccal helyettesítendő': Jelen esetben a karakterláncként értelmezett $total változó helyettesíti. $total. hogy . $total)._ . Ha programozrunk már korábban C-ben.... Azt állítja be. hogy a printf () megjeleníti a böngészőben a formázott sztringet._.szimbólum szintén opcionális. A további paraméterek a formárumsztringbe helyettesített változók. ám igen hasznosnak és hatékonynak fogjuk találni öket.. Mindegyik konverziós specifikáció ugyanazt a formátumot követi..Vigyázzunk azonban.76 4. Ha ugyanezt a printf () függvénnyel szeretnénk elérni. akkor az utasítás 12. Nézzük az alábbi példát: printf n konverziós specifikációt használunk._ 4...... [. .Iq)-�-. � _ ."...Ha ténylegesen a % szimbólumot kivánjuk megjeleníteni. ahogy az alábbi példa is mutatja: echo "A rendelés végössszege: $total._ -­ VM>-..Célja. hogy pontosabb konverziós specifikációt használharunk annak meghatározására..Milu.. hogy a mezőben lévő adat az alapértelmezett jobbra igazítás helyett balra igazítva jelenik meg.'-oH.Ez azt jelenti. az sprintf ()pedig visszatérési értékként adja vissza. a második a $total_ szallit as változór használja. Ha az ebben a változóban tárolt érték mondjuk 12.\-�-....:1... A formátumsztringben lévő %s-t konverziós specifikációnak nevezzük. akkor a %% karaktereket kell használni.\'""'�.Ha szóközt vagy nullát határozunk meg. ..4 az eltárolt érték. ami a következő: %['kitolto_karakter][-][szelesseg] [.... 4 jelenik meg a böngészőben.2f"...:-. $total). "'"'4-. míg megszakjuk használarukat.W.4. Az ee ho függvény esetében használhatjuk soron belül a megjeleníteni kivánt változókat.. hogy a változót az általunk meghatározott szélességre töltse ki.....2f) ". azaz aktuális formájában nyomtatja ki a karakterláncot.2 ábra: A PHP nl2br () függvényével tetszetősebbé tehető a hosszú karakterláncok HTML-en belüli megjelenítése. A printf () alkalmazásának előnye. akkor mindkét módszer esetén a 12 .. amely változók helyett formázó kóddal írja le a kimenet alakját. azzal a különbséggel. Itt az első konverziós specifikáció a $total.A konverziós specifikációkat a listabeli sorrendben fogják ("A rendelés végösszege: %. a következő formában kell használni: printf ("A rendelés végösszege: %s... A formátumsztringben több konverziós specifikációt is megadhatunk.. mert szintaktikájuk nem teljesen azonos! Ha nem dolgozrunk még ezekkel a függvények­ keL némi időre lehet szükség.Bármilyen más kitöltő karaktert előtagként aposztróffal kell ellátni. hogy ezek a függvények müködésüket tekintve C-beli társaik­ hoz hasonlóak.pontossag]tipus Minden konverziós specifikáció a % szimbólummal kezdődik..as is'. hogy tartalmazzon.-.Példa lehet rá egy számláló elé rakott nullák sorozata..A printf ( ) és a sprintf () függ­ vénnyel némileg kifinomultabb formázást is végrehajthatunic Alapvetőerr ugyanúgy müködnek. �::::::.. Mindkét módszer .. 4 O-ként fogja azt megjeleníteni. $total szallitas).. 4 A két függvény prototípusa a következő: string sprintf void printf (string formatum [. hogy a $total valójában egy lebegőpontos szám. nem szükséges elé aposztrófot ( ' ) helyezni. Ha ilyen formázás esetén a $total változóban 12. fejezet t. A kitolto_karakter opcionális. _. amely a tizedespont (magyar jelölés esetén tizedesvessző) után két tizedesjegyet kell.

és tartalmaznia kell a tizedespont (tizedesvessző) után megje­ leníteni kivánt tizedesjegyek számát. A specifikáció utolsó része a típus kóclja. és decimális számként jeleníti meg Double típusként értelmezi.az argumentumok tömbjét.a változó számú paraméterek helyett . Például: printf ("A rendelés végösszege: $total). és bináris számként jeleníti meg. és lebegőpontosként jeleníti meg.1 táblázatban találjuk. ebben a példában a 2\$ azt jelenti. és előjel nélküli decimális számként jeleníti meg. 4.helyettesítsd a listában második argumentummal!': Ezzel a módszerrel ismételni is lehet az argumentumokat. hogy miként kell a $targy karakterlánc esetén használni. a máso­ dikban eredményét. és nyolcas számrendszerbeli számként jeleníti meg. hogy (karakterben számolva) mennyi helyet hagyjon az ide be­ helyettesítendő változónak. Egészként értelmezi.2f) ". 4 Stotal_szallitas. Karakterláncként értelmezi és jeleníti meg. és vizsgáljuk meg. s mögé egy védőka­ rakterrel. hogy az argumentum listabeli pozícióját közvetlen ül a% jel után írjuk.1 táblázat: A konverziós specifikáció típuskódjai Típus b c d Jelentés Egészként értelmezi. és hexadecimális számként jeleníti meg kisbetűs a-f számjegyekkeL Egészként értelmezi. Kis. Egészként értelmezi. A lehetséges típusok kódját a 4. a harmadikban azt. Ez azt jelenti. Ezek két paramétert fogadnak: a formátum­ sztringer és . A fuggvény két alternatív változarának vprintf () és vsprintf () a neve.2 táblázat foglalja össze. alfabetikus karakterrel kezdődő szavának első karakterét Használat $targy strtoupper($targy) Érték Üzenet a honlapról ÜZENET A HONLAPRÓL üzenet a honlapról Üzenet a honlapról strtolower() ucfirst() strtolower($targy) ucfirst($targy) ucwords() ucwords ($targy) Üzenet A Honlapról . hogy . Egészként értelmezi.és nagybetűs írásmód megváltoztatására alkalmas függvények és hatásuk Függvény strtoupper() Leírás Nagybetűssé alakítja a karakterláncot Kisbetűssé alakítja a karakterláncot A karakterlánc első karakterét nagybetűssé alakítja (amennyiben az alfabetikus karakter) Nagybetűssé alakítja a karakterlánc minden. %2\$. hogy egy része vagy egésze kis. hogy argumentumainak nem szükséges a konverziós specifikációkkal megegyező sorrendben lenniük.2f (szállitással együtt: %1\$. A pontos sag paraméternek tizedesponttal kell kezdődnie. Az első oszlopban a függvény nevét látjuk. vagyis \jellel ellátott $ szimbólumot helyezünk. és karakterként jeleníti meg. Egészként értelmezi.és nagybetűs írásmód megváltoztatása a karakterláncban Bármely karakterláncban megváltoztathatjuk. Csupán annyit kell tennünk.. Egészként értelmezi. Az utolsó oszlop a fuggvény által visszaadott értéket mutatja. és hexadecimális számként jeleníti meg nagybetűs A-F számjegyekkeL f o u x x A printf () függvény konverziós típuskódokkal való használata esetén alkalmazhatunk argumentumszámozást.Karakterláncok kezelése és reguláris kifejezések 77 A szelesseg paraméter közli a printf () függvénnyel.2 táblázat: Kis. 4. Mintaalkalma­ zásunk esetén ennek ugyan nem sok haszna van.vagy nagybetűvel legyen szedve. ám mégis nézzünk meg néhány rövid példát! Induljunk ki az e-mail tárgyát tartalmazó karakterláncból ($targy). hogy milyen függvényekkel változ­ tathatjuk meg írásmódját l E függvények hatását a 4.

) A PHP két olyan függvénnyel rendelkezik. Az ilyen karaktereket a visszaper védőkaraktert eléjük írva emelhetjük ki. .. \ Meg kell találni a módját annak. A szeringkezelő függvények többségéhez hasonlóan az adds lashes( ) is paraméterként fogadja a karakterláncot.. amely a PHP új telepítéseinél alapértelmezésben be van kap­ csolva._" ... 4 . hogy különleges...78 4. . fejezet Tárolni kívánt karakterláncok formázása: addslashes () és stripslashes () fiiggvény A sztr. az addslashes( ) függvénnyel kell az alábbiak szerint átforrnázni azt (feltéve persze.. A stripslashes( ) eltávolí�a a visszaperjeleket... különben megjelennek a visszaperjelek is..lu�����---. hogy megjelöljük vagy védökarakterrel kiemeljük ezeket a karaktereket. a\ (visszaper) pedig\\ ( visszaper visszaper). A " (kettős idézőjel) például \" ( visszaper kettős idézőjel) lesz. .ngkezelő függvényeket nem csak a karakterláncok vizuális formázására használhatjuk. ha adatbázisba helyezzük ezeket az adatokat. hogy a PHP úgy lett beállítva. a POST és a cookie szóra utal.. CI'91-t-.. s így a MySQL és az ahhoz hasonló adatbázisok tisztában legyenek azzal. Bár az adatbázisba írással egészen a MySQL használata című 2. A funkcióról részletesebben olvasharunk az Egyéb hasz­ nosfunkciók című 24. hogy PHP-beállitásaink között nincs ez a funkció alapértelmezésben bekapcsolva): $uzenet = addslashes(trim($_POST['uzenet'])).. akkor\\\\ formában kell szerepeltetnünk. a visszaper ( ) és a NULL karakter. ugyanakkor gondot is okozhatnak.... majd átformázott karakterláncként aclja vissza.. hogy automatikusan eltávolírja a visszapetjeleket.. a GET. a felhasználói adatok megjelenítése előtt meg kell hívnunk a stripslashes () függvényt. ez azt jelenti. 4. _ ..4 ábrán láthatóhoz hasonló eredményt kapunk..4 ábra: Minden problémás karakter duplán lett kiemelve... részig nem foglalko­ zunk. A 4.. Ez azt jelenti. A gpc. hogy az ezekből a forrásokból származó változók esetében automatiku­ san visszaperjel kerül a problémás karakterek elé. hogy a 4.3 ábra: Az addslashes ()függvény meghívása után az idézőjelek visszaperjellel lettek kiemelve. így ha\\ szerepel karakterláncunkban. a karakterláncok adatbázisban tároláshoz szükséges formázását itt és most fogjuk áttekinteni.. Mielőtt bármilyen karakterláncot adatbázisba írnánk.. Egyes karakterek teljesen értelmesek és megfelelőek karakterlánc részeként.. hogy a magic quotesfunkció be van kapcsolva. A magic quotes funkció használata hordozhatóbbá teszi kódunkat. Ha saját szerverünkön is kipróbáljuk a függvényeket. leckében.. (Ez a szabály egyetemlegesen érvényes a különleges karakterekre. elképzelhető. hanem adatbázisban tárolni kívánt szeringeket is átalakítharunk velük.3 ábrán ezeknek a függvényeknek a karakterláncra gyakorolt hatását lárhatjuk. Ezt a funkciót a magi c_quotes_gp c konfigurációs beállítás szabályozza. mivel az vezérlő karakterként értelmezheti öket.. 4._. �. � ... Ez az utóbbi eredmény azt jelzi. nem pedig vezérlő karakternek szántuk ezeket. különösen akkor... A problémás karakterek az idézőjelek {egyszeres és kétszeres). amit kifejezetten"védökarakterrel ellátásra" alakítottak ki..-s-. Amennyiben a beállítás be van kapcsolva rendszerünkön.

com".hanem az elválasztó karakterlánc minden egyes karaktere mentén elválasztja.és az elvalasz to sztring által meghatározol:t elválasztó karakter mentén darabokra bontja. Az explode (). $email tomb).com") 1 4 "bob@pelda. "uzenet@pelda. A függ­ vényt az explode ()-hoz hasonlóan hívjuk meg. Például: $uJ_email = az implode('@'. ahogy azt a prototípus alapján gondolhatnánk. Most már képesek vagyunk a domainnevet ellenőrizve megállapítani. A z így kapott darabokat egy tömbbe helyezi.két paraméterrel.hogy szavanként szeretnénk megnézni egy mondatot (például helyesírás-ellenőrzés céljából). Ha vissza akarjuk állítani a mutatót a karakterlánc elejére. illetve a domainnévre.de a bemeneti karakterláncot-az explode függvénnyel ellentétben. Ez az utasítás fogja az $email_tomb tömbelemeket. "uzenet@pelda.és az első paraméterként megadott sztringgel egyesíti azokat. $email). A darabok számát az opcionális limit paraméterrel korlátozhatjuk.com") { "bob@pelda. hogy a karakterláncból az ezt követő tokeneket is megkapjuk.hogy a karakter­ láncból megkapjuk az első tokent. A következő kódot kell használnunk arra.com". A hhoz. string elvalaszto). . array explode(string elvalaszto. már csak egyeden paramétert adunk a függvénynek-az elválasztót. A strtok () meghívása nem annyira egyszerű. Amennyiben azonban a domainnév nagybetűvel vagy kis. Ahhoz. implode () és j o in () fiiggvény használata A fenti célra alkalmas első függvény az explode (). Tegyük fel.és nagybetűvel vegyesen van szedve. Példánkban Bob azt szeretné.amely az $email_tomb [l] tömbelemben tárolódik el. hogy a domainnév csupa nagybetűre vagy csupa kisbetűre konvertálása után ellenőrizzük az egyezőséget: if (strtolower($email_tomb[l]) $cimzett e lse { $cimzett = == "nagyugyfel. a karakterlánccal és az elválasztóval hívjuk meg a strtok() függvényt. A függvény fogja az in put paraméterben meghatározott karakterláncot.amely az alábbi prototípussal rendelkezik: int limit]).amely az $email_tomb[O l. Az explode () függvény fenti paraméterekkel történő meghívása két részre bontja az ügyfél e-mail címét: a felhasználói névre.és üzenetét ennek megfelelően továbbítani a célszemélynek: if ($email tomb[l] $cimzett else { $cimzett = == "nagyugyfel.hogy külön-külön szeretnénk egy karakterlánc részeit vizsgálni.nem a reljes elválasztó karakterláncon.com címről érkező üzenetek közvetlenül hozzá fussanak be. ám hatása pont ellentétes. Az strtok () fiiggvény használata A neki áradott karakterláncot egyszerre darabokra bontó explode () függvénnyel ellentétben a strtok ( ) egyenként vesz belőle tokennek nevezett darabokat. implode () vagy a j oin() függvénnyel fordíthatjuk vissza (a két függvény egymással Az explode() függvény hatását egyenértékű).paraméterként újra átadjuk a függvénynek. A függvény a karakterláncon belül megőrzi saját belső mutatójának helyét.com".vagy elemekre kivánunk bontani egy domainnevet vagy e-mail címet! A PHP számos olyan szeringkezelő függvénnyel (és egy reguláris kifejezéseket kezelő függvénnyel) rendelkezik. amikor egyenként kell egy karakterlánc szavait feldolgozni.amelyek lehetövé teszik ezt. Az elválasztó lehet karakter és karakterlánc is.hogy az ügyfél e-mail címéből megrucijuk domainnevét: $email_tomb = explode ( '@'. A strtok() az explode() függvény kiváló alternatíváját jelenti minden olyan esetben. A strtok() függvény prototípusa: string strtok(string input.hogy a küldő Bob nagy ügyfelénél dolgozik-e.hogy a nagyugyfel. Úgy tudjuk kezelni ezt a problémát.melyik vállalatnál dolgozik az ügyfél. string input [.ezért az ügyfelek által begépelt e-mail címet részekre bontva megpróbáljuk kideríteni.Karakterláncok kezelése és reguláris kifejezések 79 Karakterláncok egyesítése és felosztása sztringkezelő függvényekkel Gyakran megesik.ez a megközelítés nem fog műk ödni.com".

amelyre az intelligens űrlap továbbfejlesztéséhez szükségünk lesz. A fejezetben hasz­ nált példában ugyan nincs rá szükség. Ha az str l ábé­ cérendben az str2 után következik (vagy nagyobb nála). while ($token ' n n}.jelen esetben az igen karakterláncot. 6}. int start[. Általában érdemes ellenőrizni. != nn} ( $token = strtok (n n}. pozíció. függvény a karakterlánc utolsó hat karakterét adja vissza. strcasecmp ( ) és strnatcmp ( ) fiiggvény Az strcmp (}.80 4. 18. Az első karakter a O. A hossz paramétert arra használhatjuk. hogyan használjuk a == műveleti jelet két karakterlánc egyenlőségének megállapítására. Az strcmp (} függvény prototípusa: int strcmp (string strl. Egyenlőségük esetén visszatérési értéke O. ezt például az empty (} függvénnyel te­ hetjük meg. Ügyfélszolgálatuk igen kiváló karakterláncot adja vissza. -6}. illetve a visszaadott karaktersor utolsó karakterét (negatív érték esetén). A függvény két karakterláncot fogad. majd ezt követően térünk rá a részleges egyezőségre. az l}. A substr ($teszt. A következő példák az alábbi tesztsztringer használják: 4 $teszt = 'Ügyfélszolgálatuk igen kiváló'. A függvény asztring karakterláncból kimásolt részsztringet ad vissza. Az echo substr ($test. int hossz] }. A PHP ennél kis­ sé kifinomultabb összehasonlításokra is lehetőséget ad. amikor rögzített formátumú karakterláncok részeihez kell jutnunk. A karakterláncon belüli pozíció a tömbökhöz hasonló­ an O-val indul. a karakterlánc utolsó start karak­ terét kapjuk vissza. A substr ($test. függvény ennek megfelelően a kiv ál ó karakterláncot eredményezi. -7}. kód a negyedik és a hátulról hetedik karakter közötti karaktereket aclja vissza. pozíció a tizenkilencedik karaktert jelöli. O. string str2}. Karakterláncok összehasonlítása Idáig csak azt láttuk. Amennyiben a substr (} függvényt csak egy negatív start paraméterrel hívjuk meg. hogy az ügyfél írt-e bármilyen üzenetet az űrlapra. ám hasznos lehet. és mindaddig fut a ciklus.az strcasecmp (} és az strnatcmp (} függvénnyel karakterláncokat rendezhetünk sorba. Először az egyebek kategóriával foglalkozunk. Az egyszerűség kedvéért a példából kihagytuk ezeket az ellenőrzéseket. A substr (} függvény prototípusa a következő: string substr (string sztring. echo $token.és végpontja közörti részsztringeket érhetünk el. Két kategóriába csoportosítottuk ezeket: részleges egyezőség és egye­ bek. hogy meghatározzuk a visszaadandó karakterek számát (pozitív érték esetén). fejezet A strtok (} függvényt jellemzően a következőképpen használjuk: $token = strt ok ($uzene t' echo $token. így a 18. A substr ( ) függvény használa ta A substr (} függvénnyel egy karakterlánc adott kezdő. akkor az strcmp (} függvény egy nullánál nagyobb számmal tér . Karakterláncoksorba rendezése: strcmp (). és összehasonlítja ezeket. Ez a képesség adatok rendezésénél válik igen hasznossá. amíg van token. Amennyiben a függvényt a start paraméternél csak egy pozitív számot megadva meghívjuk. Például a: substr ($teszt. Az üres karakterláncokat automatikusan átlépi e folyamat közben. a start pozíciótól a karak­ terlánc végéig tartó részsztringet adja vissza.n<br />n.ami jelen esetben az ügyfél.n<br />n. Az előző kód külön sorban jeleníti meg az ügyfél üzenetében lévő minden egyes cokent.

hogy azstlen () függvény nem jól kezeli a több-bájtos kódolású (UTF-7. az s trcmp () visszatérési értéke nullánál kisebb. ) ll a PHP kód végrehajtásának megszakitását kényszeríti ki 4 Érdemes megemlíteni. hogy egy adott részszering megtalálható-e egy nagyobb karakterláncban. int mb_strlen ( string $str Ű betüket tartalmazó karakterláncok esetén hibásan a<lja vissza l ) a szering hosszát. amelynek prototípusa a következő: [. Ha a felhasználó által megadott e-mail cím nem éri el ezt a karakterhosszt. to. így kérjük a rendszergazdát. A következő részben finomabb mód­ s zereket fogunk megvizsgálni. Karakterlánc hosszának megállapítása az st r l e n ( ) függvénnyel A karakterláncok hosszát az strlen() függvénnyel deríthetjük ki. naturalordersort. Egy e-mail cím legalább hat karakter hosszú: például a@a. mivel lexikografikusan nagyobb. A következőkben egyenként megvizsgáljuk ezeket a függvénycsoportokat. Ez a részleges egyezés jellemzően hasznosabb.org/ oldalon.mbstring. Ö.és nagybetűket.. ő. az opcionális $kodolas paraméterrel pedig megadhatjuk. mint str2. 'Bbit') echo 'Érvénytelen e-mail cím'.mb_" családba tartozó függvények nem alapértelmezett PHP könyvtárban vannak.php oldalán találunk. Amennyiben a Bob üzleteivel foglalkozó üzeneteket például a kereskedelmi vezetőnek kívánjuk továbbítani.. Ö. A fenti megközelítés az információ ellenőrzésének rendkívül leegyszerűsített módja. Tapasztalatok szerint elsősorban az ó. hogy az üzlet szó vagy annak toldalékos változatai előfordulnak-e a levélben. Ha átadunk a függvények egy karakterláncot.és nagybetűk között. Az strcasecmp () fuggvény pontosan ugyanígy viselkedik. Amennyiben str l kisebb. 6) ( echo 'Érvénytelen e-mail cím'. Részsztringek keresése és cseréje sztringkezelő függvényekkel Gyakran végzett müvelet annak megállapítása. akkor azt kell megállapítani.Karakterláncok kezelése és reguláris kifejezések 81 vissza. Az előző példa UTF-8 kódolású szövegre: if (rnb_strlen($email) < 6) ( ll vagy mb strlen($email. A természetes rendezésről bővebben is olvasharunk a http://www . és ezek megléte alapján küldjük a levelet a megfelelő részlegnek. azonban nem tesz különbséget a kis. amennyiben ez a fuggvény a karakterlánc-illesztő vagy reguláriskife­ jezés-illesztő (regular expression-matching) függvények valamelyike. hogy az.net/ manual/ en/book. Gondoljunk bele a mintaürlapon lévő e-mail címbe. mint teljes egyenlőség ellenőrzése a karakterláncokban. amit az $email vál­ tozóban tárolunk! Az e-mail cím ellenőrzésének legegyszerűbb módszere a hosszának megállapítása. Unicode kódoláskor használjuk inkább az mb_strlen () függvényt.php. az strnatcasecmp () a. mint a 12. visszatérési értéke annak hossza lesz. A függvény beviteli adat ellenőrzésére is alkalmas. illetve a szervernév és a felhasználó címe egy-egy betűből áll. majd az== műveleti jellel vagy az strcmp() fuggvénnyel összehasonlíthatnánk azokat. hogy telepítse a Mulribyte String könyvtárat! További információt a PHP kézikönyv http://www. Unicode) sztringeket.. UTF-8. A fuggvény megkülönbözteti a kis. A már megismertek közül az explode () vagy az strtok() függvénnyel kaphatjuk vissza az üzenet szavait. akkor hiba következik be: if (strlen($email) < . . Ugyanezt egyeden függvény meghívásával is elérhetjük. Az strcmp( ) szerint például karakterláncok esetén a 2 nagyobb. Fontos megjegyezni. amelyben az országkódhoz nem tartozik második szintű domain. ü. exit. ami jobban megfelel az ember hagyományos rendezési elveinek.és nagybetüket nem megkülönböztető testvére. hogy hány bites az áradott karakterlánc. exit. string $kodolas A függvényben a $str paraméter a vizsgálandó karakterláncot tartalmazza. Ezek a fuggvények mintát keresnek a karakterláncokban. Az strnatcmp() pont fordítva rangsorolja őket. Az strnatcmp () fuggvény és a kis. Intelligens űrlapunk esetében bizonyos kulcskifejezéseket keresünk az ügyfél üzenetében.termé­ szetes rendezésnek" megfelelően hasonlítja össze a karakterláncokat. Például a következő kód eredménye 5 lesz: echo'strlen("hello").

és meglétük eserén a megfelelő személynek továbbírja azt. "Kiszállítás". fejezet Karakterláncok keresése karakterláncban: strstr (). PHP-ben az strchr () függvény pontosan megegyezik az strstr () függvénnyel.' a kód észleli a "kiszállirás kulcsszór. Részsztringpozíciójánakmegkeresése: strpos () és strrpos () Az strpos () és az strrpos() függvény az strstr ()-hez hasonlóan működik. 'o'. mivel a PHP az 5. strchr ().amelyikben keressen ( szenakazal ) .és a keresett karakterlánc állhar akár egyeden karakterből is.bár neve azt sugallja. A legáltalánosabb ezek közül az strstr ().ám a tu utolsó előfordulásáról adja vissza a szenakazal szrringer. A következő kód például a 4-es értéket íratja ki a böngészővel: $teszt = "Helló.és nagybetük közört. a másik pedig az. ha nincs egyezőség. else if (strstr($uzenet. pozícióról kezdve keresi az o karaktert. "o"). A kód adott kulcsszavakar keres az üzenetben.ami súnrén majdnem megegyezik az eredetivel. Az strstr() prototípusa a következő: string strstr(string szenakazal. string tu). pozícióban levőt. int [offset] ). amir keressen (tu).com'. világ!". 'bolt')) $címzett = 'kiskereskedelem@pelda.mert az utóbbi gyorsab­ ban fut.akkor false értékkel tér vissza.a visszaadott karak­ terlánc az első előfordulásával kezdődik.az strstr (). Ez a 7 -es értéker írarja ki a böngészővel.Amennyiben rökéleres egyezőséger talál. Vegyük például a következő kódot: echo strpos($teszt. . a szenakazal karakterláncon belüli pontot határoz meg. Intelligens űrlapunkban például meghatározhatjuk.és nagy­ betük tetszőleges keverékét használhatja a kulcsszavakban (például" kiszállítás". echo strpos($teszt.mert az ügyfél a kis.ám részszering helyerr a tu sztring szám­ szerű pozíciójár adja vissza a szenakazal karakterláncon belül. A függvény által visszaadott egész szám a tu karakterlánc szenakazal sztringen belüli első előfordulásának pozícióját mutatja. Az strstr() függvénynek kér variánsa is létezik. Jelen alkalmazáshoz ez a változar inkább megfelelő. Az első az stristr (). strrchr () és str istr () függvény Ha karakterláncon belül keresünk másik karakterláncot. Az opcionális offset paraméter egy. Amennyiben a tu egynél többször előfordul.és ennek megfelelően a szallitas@pelda.com'.com'.amellyel nagyobb karakterláncban kereshetünk szrring. Amennyiben az " ügyfél üzenere például az alábbi:"Még mindig nem történt meg urolsó rendelésemnél a kiszállírás. string tu.hogya C-programnyelvbeli változarához hasonlóan . 'kiszállítás')) $cimzett = 'szallitas@pelda. 4 else if (strstr($uzenet. így nem fogja megtalálni a 4.az strrchr () vagy az stristr () függvényt használhatjuk. Érdekes módon a PHP kézikönyv az strstr () függvény helyett az strpos () használatát javasolja egy szering karakterláncon belüli meglétének ellenőrzésére.karakter szrringen belüli keresésére használjuk.az strchr ().com'.82 4. Az strpos () függvény prototípusa a következő: int strpos(string szenakazal.hogy adott feltérelek reljesülése eserén hova címeuük az e-mailt: $címzett = 'uzenet@pelda. noha az bármilyen hosszú karakterlánc is lehetne.vagy karakreregye­ zőséger.ami maJdnem teljesen megegyezik vele.ám nem tesz különbséget a kis. 5). Ez a kód egyeden karaktert ad át keresési kifejezésként.a függvény a tu-ről indulva visszaadja a szenakazal karakter­ láncot. Az első karakter pozíciója szokás szerím O. PHP-ben mindkét függvény alkalmas karakterláncon belüli karakterlánc keresésére. ll az alapértelmezett e-mail cím ll Az adott feltétel teljesülése esetén módosítsa a $címzett értékét! if (strstr($uzenet. A második változar az strrchr ().ahonnan a keresés indi­ tandó.com címre küldi az üzeneter. "KISZÁLLÍTÁS" ) . $címzett = 'számla')) �---�' 'penzugy@pelda. A függvénynek kér paramétert adunk ár: az egyik a karakrerlánc.

php. Ha a teszt értéke nulla.például nyilvános fórumok vagy akár a most fejlesztett intelligens űrlapunk eseté. hogy Bob különböző részlegeit bármilyen módon zaklassák.Az alábbi prototipussal működik: string substr_replace(string sztring. if ($eredmeny else === false) echo "Nincs találat". A függvény a tu minden előfordulását a szenakazal karakterláncban az uj_tu sztringre cseréli. mixed uj_tu. Erre a célra a sztringkezelő függvények és a reguláris kifejezések függvényei is megfelelnek. ez a POSIX és a Perl. A leggyakrabban használt sztringcserélő függvény az str_replace (). Mindkét típust alapértelmezetten támo­ gatj a a PHP. ha az === műveleti jellel ellenőrizzük a visszaadott értékeket: $eredmeny = strpos($teszt. akkor a cseresztring a meglévő karakterlánc felülírása nélkül lesz beszúrva. maJd a szenakazal új változatával tér vissza.karakterlánc végéről számított. Ha nem határozzuk meg érté­ két. ' % ! @*'.A következő prototípussal rendelkezik: mixed str_replace(mixed tu. Mivel az emberek reklamálásra is használhatják intelligens űrlapunkat. $uzenet) . negatív értéknél a sztring végétől számítódik. At­ adhaljuk a cserélendő szavak tömbjét. azt a start és az opcionális hossz paraméter értékével határozhatjuk meg. A substr_replace() függvény pozíciója alapján keresi meg és cseréli ki egy karakterlánc adott részsztringjét. a Perl-programozók vagy a PCRE típusról www. mixed szenakazal[. A hossz opcionális érték. Nézzük a példát az str_replace() függvény tömbbel történő alkalmazására: $uzenet = str_replace( $nyomdafesteket_nem_turo.n is. a negatív tes zt értékek pedig azt a.net/pcre oldalon elérhető online kézikönyvet! többet megtudni kívánó olvasók tanulmányozzák a http:/ J . Ismerkedés a reguláris kifejezésekkel A PHP a reguláris kifejezések kétféle szintakrikáját támogatja. Jelen probléma elkerülhető. az <add res s>-t pedig címére cserélve. ám a tu utolsó előfordulásának a pozícióját adja vissza. 4 8 Megjegyzés: Minden paraméter átadható tömbként. Nulla vagy pozitív érték eseté. ahol a PHP abbahagyja a cserét. Segítségével egyéniesíthetünk (perszonalizálhatunk) PHP által létrehozott dokumentumokat. mivel egy olyan gyengén típusos nyelvben.Alkalmas konkrét kifejezések moderálására. Hogy pontosan melyik rész lesz lecserélve. ahol a karakterek cseréjét abba kívánjuk hagyni. és azt a pontot határozza meg. A függvény a csere sztringre cseréli le asztring karakterlánc egy részét. ha a sértő kifejezéseket összegyűjtjük egy $nyomdafesteket_ nem_turo nevű tömbben. string csere. A pozitív teszt érté­ kek az új karakterláncra lecserélni kívánt karakterek számát jelentik.3-as verziótól kezdve a Perl (PCRE) típus nem kapcsolható ki. echo "Találat helye: ".Karakterláncok kezelése és reguláris kifejezések 83 Az strrpos () függvény szinten teljesen megegyezik az strpos ()-sal. az ezeket cserélő szavak tömbjét. 'X'. $eredmeny.pontot határozzák meg. int start. a false a O-val egyenértékű­ ami jelen esetben a sztring első karakterét jelenti. Itt azonban az egyszerűbb POSIX stílust fogjuk megismerni. "H"). A függvény ezt követően az átdolgozott karakterláncok tömbjét adja vissza. int [hossz] ). int &szamlalo])).n a csere kez­ dőpontja a karakterlánc elejétől. -l). Az alábbi kódsor például X-re cseréli a $teszt utolsó karakterét: $teszt = substr_replace($teszt. hogy a karakterláncon belül hol kezdődjék a csere. Amennyiben a keresési kifejezés nem található a karakterláncban. nyomdafestéket nem tűrő szavak is előfordulharnak üzeneteikben. A start érték mutatja meg. amelyekre a cserét alkalmazni kívánjuk. és az str_replace ()függvény módfelett intelligensen működik. Az opcionális negyedik paraméter. a szamlalo a végrehajtott cserék számát tartalmazza. Programozóként megakadályozhatjuk. mint a PHP. Részsztringek cseréje: s tr_replace () és subs tr_replace () függvény A keresés és csere funkció rendkivül hasznos tud lenni karakterláncok esetén. a csere a start pozíciótól a karakterlánc végéig tart. Ez akár problémát is jelenthet. illetve azon karakterláncok tömbjét. az strpos () és az strrpos () is false értékkel tér vissza.például a <name> címkét a személy nevére. és az 5.

például így: [a-zA-Z) Ezek a tartományok a kis.és nagybetűs alfabetikus karaktereket fedik le. A A készletek és tartományok felsorolása mellett előre meghatározott karakterosztályokat is használhatunk a reguláris kifejezé­ sekben. A karakterek pontos illesztésén túlmenően különleges karaktereket használva jelölhetünk értelmezési tartományokat. Különleges karakterek literális előfordulá­ saira is illeszthetünk. A szögletes zárójeleken kívül más jelentéssei bír. hogy az adott rnintának a karakterlánc elején vagy végén kell elöfordulnia. karaktert az új sort ( \n) leszámítva bármilyen különálló karakter dzsókerkaraktereként használhatj uk. A reguláris kifejezések illesztése PHP-ben sokkal inkább egy strstr ( ) illesztéshez. 4.3 táblázat: POSIX stílusú reguláris kifejezésekben használható karakterosztályok Osztály [[:alnum:)) [[:alpha:]) [ [ : lower: ll Benne foglalt karakterek Alfanumerikus karakterek Alfabetikus karakterek Kisbetűk . A mintaillesztésekhez idáig szeringkezelő függvényeket használtunk. Ha a és z közötti karakterre szereménk korlátozni. a következöképpen kell meghatároznunk: [a-z)ap A szögletes zárójelek ( [ és J ) által közrefogott valami egy karakterkészlet A készletet felsorolással is megadhatjuk. Meghatározhatunk tartományt. mintsem egyenlőség megállapításához hasonlít. rövidesen azt is megvizsgáljuk. reguláris kifejezéseknek is. Korábban például olyan reguláris kifejezésekre kerestünk. Ha összetettebb rnintaillesztésre van szükségünk. A [A a-z] készlet például a nem az a és z közé eső karaktereket foglalja magában. az [aeiou) . készlet például az angol ábécé magánhangzóit tartalmazza. Fontos. amelyek közé az il­ lesztett karakternek tartoznia kell.ap reguláris kifejezés például egyebek között a "lap". 4 Karakter készletek és �osztályok A karakterkészletek használata a kifejezések pontos egyezőségénél hatékonyabbá teszi a reguláris kifejezéseket. hogy a szögletes zárójelben lévő kifejezéshez csak egyetlen karakter illeszkedhet.3 táblázat ezeket az osztályokat mutatja. milyen karakterkészleebe kell az adott karakternek tartoznia. fejezet • Megjegyzés: A POSIX reguláris kifejezések könnyebben és gyorsabban elsajátíthatók.) A "bolt" karakterlánc például megfelel a "bolt" reguláris kifejezésnek. Az eddig látott pontos egyezőség a reguláris kifejezések egyik formája. Készletek segítségével azt is megadhatj uk. A következökben ezen lehetőségeket fogjuk áttekinteni. A karakter­ készleteket használhatjuk adott típus bármely karakterének illesztésére. Az ilyen dzsókerkarakter-il­ leszrést gyakran használják az operációs rendszer fájlneveinek keresésére. rnivel valahol egy másik karakterláncon belüli sztringet illesztünk. Ugyanígy megfe­ lel az "o". hanem a" itap" karakterláncnak is.84 4. A . "ol" stb. "nap" és "pap" karakterláncnak felel meg. ahogy tettük azt az imént a különleges kötőjellel vagy tartományok készletét. vagy a mintában lévő karaktereknek adott típusúnak kell lenniük. A 4. A regulá­ ris kifejezések működését elsőre nem könnyű megérteni. reguláris kifejezéseket kell használnunk. (Ha másképpen nem határozzuk meg. mint a "bolt" vagy a " kis z áll í tás". A . és pontosan meg­ adhatjuk. ám a bináris adatokat nem mindig helyesen kezelik (nem "binary safe" kifejezések). hogy a karakter ne legyen az adott készlet tagja. de alkalmazásuk rendkivül hasznos tud lenni.olyan karakterek készlete. A reguláris kifejezésekkel azonban sokkal konkrétabban megadhatjuk a kivánt karakterillesztés típusát. Az előző példában lévő reguláris kifejezés nem csak a "nap" és a "pap" szónak felel meg. Pontos egyezöségre vagy részsztringek pontos egyező­ ségére voltunk korlátozva. Kü­ lönleges karakterekkel jelölhetjük azt. Azalapok A reguláris kifejezések szövegdarabban levő rninták leírásának egy módszerét jelentik. A szögletes zárójeleken belül elhelyezett beszúrási jel ( ) nem et jelent. akkor a ka­ rakterláncon belül bárhol lehet. a rninta egy része ismétlődhet. ezek valójában egyfajta dzsókerkarakterek.

hogy egy adott karakterlánc vagy karakterosztály több előfordulása lehetséges. amire vonatkozik.z J mintának bármilyen kisbetűs. } legalább két isméclődést jelent). Megadharjuk az ismét­ lödések konkrét számát (a {3} pontosan három ismétlődést jelent). Számolt részkifejezések Kapcsos zárójelek ( { } ) közé írt számszerű kifejezéssel meghatározhatjuk. hogy meghatározzuk például a következőket:. Az [[:alnum:))+ * szimbólum azt jelenti.. hogy a sztring mindössze egy karakter hosszú vagy hosszabb karakterlánc. karakterláncok felelnek meg. hogy reguláris kifejezésünkben jelezzük ezt. a és A [a-z)$ z közötti karakterből állnak: . alfabetikus karaktert tartalmazó karakterlánc megfelel. amely egyetlen megfelelő karaktert tartalmaz. hogy a karakterlánc végén kell találkoznunk vele. hogy a bob karakterláncnak a szering elején kell lennie: A bob Az alábbi mintának pedig azok a karakterláncok felelnek meg. hány ismétlődés lehetséges. a + szimbólum azt. A következő kifejezés például azt jelenti. A (nagyon} {l..legalább egy alfanumerikus karakter:· Részkifejezések A kifejezések részekre bontásának képessége lehetövé teszi.. hogy egy vagy több alkalommal ismétlődhet. nagyon nagyon nagyon" karakterláncok felel­ Karakterlánc elejéhez vagy végéhez rögzítés Az [a.pontosan úgy. A azon része után kell elhelyezni. . lődése jelent). hogy a min­ ta nulla vagy több.. végén. .nagy". . hogy egy adott részkifejezés a karakterlánc elején.nagyon". nagyon nagyon" és nekmeg. amikor meg akarunk bizonyosadni arról. A reguláris kifejezés elejére helyezett beszúrási jellel (A) azt határozhatjuk meg. hogy . hogy a keresett karakterlánc elején kell meg­ jelennie. 4} kettő-négy ismét­ 3} " reguláris kifejezésnek például a . ahol a com a sztting végén helyezkedik el: com$ A következő mintának pedig olyan karakterláncok felelnek meg... Nem számít. Ugyanakkor meghatározhatjuk azt is. A reguláris kifejezés végére Írt $ jel azt közli. amelyek egyetlen.nagyon nagy". ahogy matematikai kifejezések esetén használjuk őket.nagyon nagyon nagy" stb. esetleg mindkét helyen elő­ forduljon. Ennek megfelelően a (nagyon ) *nagy 4 reguláris kifejezésnek például a . illetve ismétlödések nyíltvégű tartományát (a {2. A szimbólumot a kifejezés közvetlenül például azt jelenti. Ez a lehetőség akkor nyer értelmet.Karakterláncok kezelése és reguláris kifejezések 85 Osztály [[:upper:l l [[:digit:]] [[: xdigit: ll [[:punct: ll [ [ :blank: ll [ [ :space: ll [[:cntrl:)) [[:print:l l [[:graph:]] Benne foglalt karakterek Nagybetük Decimális számjegyek rfexadecünális szárrYegyek Írásjelek Tabulátorak és szóközök Fehérköz karakterek Vezérlő karakterek Minden nyomtatható karakter A szóköz kivételével minden nyomtatható karakter Ismétlődés Gyakran azt is meg szeretnénk határozni.ezen karakterláncok közill legalább egyet pontosan ez követ': A kifejezéseket zárójelekkel tudjuk felbontani . ismétlödések tartományát (a {2. hogy csak és kizárólag a keresési kifeje­ zés jelenik meg a karakterláncban.. Két különleges karakter áll rendelkezésünkre.

4 táblázat: POSIX reguláris kifejezésekben szögletes zárójeleken kívül használt. Ügyeljünk. A com. vagy { vagy $ . 4 A különleges karakterek áttekintése A 4. A PHP visszaperjelet használ a különleges karakterek. nem pedig kiemelésről van szó. A 4. visszaperjelet (\)kell eléjük helyezni. ha literális visszaperjelet szeretnénk kettős idézőjelek közőrt lévő PHP karakterláncba írni.5 táblázatban a különleges karakterek összefoglalását találjuk.például .5 táblázat: POSIX reguláris kifejezésekben szögletes zárójeleken belül használt. a PHP \$-ként fogja feldolgozni. Ugyanígy. különleges karakterek összefoglalása Karakter \ Jelentés Kiemelő karakter NEM.5 táblázat a szögletes zárójeleken belüli jelenrésüket tartalmazza. Ha literilis $ jelhez szeretnénk illeszteni egy rnintában. a 4. kerrőt kell használni belőle. A kettős idézőjellel ellátott szeringekben lévő reguláris kifejezések használara felesleges komplikációkkal járhat. amit a reguláris kifejezés értelmezője dollárjelhez fog illeszteni. kér visszaperjellel rudjuk jelezni. Ezt követően a reguláris kifejezés értelmezője egyetlenként dolgozza fel ezt a megmaradt kettőt. akkor két visszaperjellel (\\)kell helyettesíteni. fejezet Ágaztatás A reguláris kifejezésen belüli választási lehetőséget fuggőleges vonallal jelöljük. mennyiségjelző kezdere Min. a "\\\$" sztringet kell használnunk.4 és a 4. mennyiségjelző vége + ? Részrninta megjelölése opcionálisként 4.86 4. 4. A PHP értelmező két visszaperjelként fogja feldolgozni a né­ gyet.kivánunk illesz­ teni. A kettős idézőjelekben lévő PHP karakterláncok és reguláris kifejezések esetén a dollárjel is különleges karakternek szárnit.csak kezdő pozícióban használható Karaktertartományok meghatározására használható . Ha visszaperjelet kivánunk jelölni. hogy a literális visszaperjelet tartalmazó reguláris kifejezést jelképező PHP karakterlánchoz négy visszaperjelre van szükség. hogy lirerális visszaperről. Amennyiben visszaperjelet kivánunk sze­ repelterni a rnintában. ed u vagy net domainvégződésnek pél­ dául az alábbi kifejezés felel meg: comledulnet Literális különleges karakterekhez illesztés Amennyiben a korábbi részekben említert különleges karakterek valamelyikéhez . Ezeknek a szabályoknak a kissé zavaró végeredménye az.4 táblázat a szögleres zárójeleken kivül használt különleges karakterek jelentését./max.köztük a visszaperjel./max. különleges karakterek összefoglalása Karakter \ $ Jelentés Kiemelő karakter A karakterlánc elejénél történő illesztés A karakterlánc végénél történő illesztés Újsor karakter (\n)kivételével bármilyen karakterhez illesztés Alternatív elágazások kezdete (VAGY-ként olvasandó) Részrninta kezdete Részminta vége * Ismétlés nulla vagy több alkalommal Ismétlés egy vagy több alkalommal Min. Mivel kettős idézőjelek között van. hogy PHP-ben egyszeres idézőjellel körülvert karakterláncokba helyezzük a reguláris kifejezések mintáit.kiemelésére.

Ehhez reguláris kifejezésbe kódoljuk az e-mail címek szabványosított formátu mát. Az egyik lehe­ tőség adott kifejezések keresése az ügyfél üzenetében. A következöképpen kódolhaguk ezt: '[a-zA-ZO-9 \-. Ügyeljünk azonban.com".Az ereg () függvény prototipusa a következő: A függvény kereses helye karakterláncban keres a minta reguláris kifejezésnek megfelelő sztringet. alulvonásból.]+$ részkifejezés jelképezi. hogy amikor a pontot karakterosztály elején vagy végén használjuk. else if (eregi("számla". hogy alapszínten megismerkedtünk a reguláris kifejezésekkel. amennyiben a "bolt". Karakterosztályokon kívül használjuk a pontot. = { "szallitas@pelda. A minta részkife­ string kereses helye. mégis érvénytelenek. ismét alfanumerikus karakterekből és kötőjelekből álló sztring. Részsztringek keresése reguláris kifejezésekkel Az előbbiekben kifejlesztett reguláris kifejezések fő alkalmazási tetűlete részszttingek keresése. hogy elő tudunk állítani olyan e-mail címeket. [a-zA-ZO-9\-. Az eregi() függvény teljes méctékben hasonlóan működik azzal a kivétellel. így ki kell emelnünk ahhoz. _ array [talalatok]). hogy "legalább egy betűből.l+@ [a-zA-ZO-9\-l +\. Sokféleképpen linomithatjuk ezt a kifejezést.com". = . mint egy olyan. kötöjelböl.és nagybe­ tük között. Felsorolhaguk például a legfelső szintű tartományneveket l4 (TOL). ll az alapértelmezett érték $uzenet)) térjen vissza az el6z6 oldalra. { és próbálkezzon újra!<lp>". számokat. l + részkifejezés azt jelenti.<lp>". és egyszerű ponttá válik. egy pont. A PHP-ben elérhető két függvény a POSIX srílusú reguláris kifejezések illesztésére az e reg () és az e regi ().[a-zA-Z0-9\-\. amelyek illeszkednek ehhez a reguláris kife­ jezéshez. mert egy olyan ellenőrzö függvény.Karakterláncok kezelése és reguláris kifejezések 87 Az eddig tanultak alkalmazása az intelligens űrlapban Imeiligens üzenerküldö alkalmazásunkban legalább kétféleképpen vehegük hasznát a reguláris kifejezéseknek. "ügy félszolgálat" vagy" kiskereskedelem" kifejezés után kutatnánk az üzenetben. amely az érvényes adatok akár csak l százalékát is kiszűri. Ez utóbbiak alkalmazása esetén három különbözö keresést kellene végrehajtani. kötőjelet és szükség esetén több pontot is tartalmaz a karakterlánc végéig. exit. amely betüket.) felel meg. "<p>Kérjük. pontból _ vagy ezek tetszőleges kombinációjából álló karakterlánc:· Érdemes megjegyezni. hogy megvizsgáljuk az azokat hasz­ náló PHP függvényeket. A @ szimbólum a literálls @ jelnek felel meg. $cimzett $cimzett $cimzett = "kiskereskedelem@pelda. Az alábbi reguláris kifejezéssel mind a három egyszerre kereshető: boltiügyfélszolgálatlkiskereskedelem A második alkalmazási lehetőség az ügyfél e-mail címének ellenőrzése. amikor tovább szűkígük a megfelelöséget. ez utóbbi kettő többször ismétlődhet. ám ezzel az ellenőrzéssei valamennyit javít­ ható a helyzet. $email)) _ echo "<p>trvénytelen e-mail cim.com". kombináció egyszerű pontnak (. számból.. elveszti különleges dzsókerkarakter jelentését. ezt követi egy @ szimbólum. A formátum a következöképpen épül fel: alfanumerikus karakterek vagy írásjegyek soro­ zata. alfanumerikus karaktereket és kötőjeleket tartalmazó részét jelképezi. majd egy alfanumerikus karakterekből és kötőjelekből álló karakcerlánc. készen állunk arca.com". Fi­ gyeljük meg. hogy a kötőjelet visszaperjellel kiemeltük. int ereg(string minta.l+$ _ A A[a-zA-Z O -9 \. Szinte lehetetlen minden hamis e-mail címer kiszűrni. $uzenet)) else if (eregi("kiszállitáslteljesités". _ jezéseire adódó találatok esetén a függvény a talalatok tömbben tárolja azokat. tömbelemenként egy részkifejezést. mivel szögletes zárójeleken belül a kötőjel különleges karakternek minösül! A \. A domainnév többi részét a [a-zA-ZO -9\-\ . sokkal zavaróbb lehet. megint egy pont.]+$'. majd újra karakterlánc. A reguláris kifejezések némileg intelligensebb módszert kínálnak erre. hogy csak az egyszerű (literális) pontnak feleljen meg. Némi gondolkodás után belátható. hogy nem tesz különbséget a kis. mint a szeringkezelő függvények. Az intelligens űrlap esetén a következöképpen használhaguk ki a reguláris kifejezéseket: if (!eregi('A[a-zA-Z0-9 \-\. $címzett "uzenet@pelda. amely átenged akár 10 százaléknyi érvénytelen adatot is. = if (eregi("boltlügy félszolgálatlkiskereskedelem".]+@[a-zA-Z0-9\-]+\. Most. A [a-zA-ZO-9\-]+ részkifejezés a hosztnév első. $uzenet)) "penzugy@pelda.

annál biztosabbá válunk használarukban. Részsztringek cseréje reguláris kifejezésekkel A reguláris kifejezések arra is alkalmasak. A függvény a minta reguláris kifejezést keresi a kereses_helye karakterláncban. int max]). A példa öt alkotóelemre bontja felhasznaloi nev @ pelda az e-mail címer. Az eregi_replace() müködése ezzel szinte teljesen megegyező.és kiváló írásokat találunk a devshed.com". kezdherjük a kutatást a regexp ma n oldalán. string kereses_helye). ám nem tesz különbséget a kis. Amennyiben Jeladatunk kellően egyszerű ahhoz. Ehhez a feladathoz két függvény áll rendelkezésünkre: ereg_replace () és eregi_replace ().hogy. hogy létezik-e számunk­ ra megoldást jelentő függvény.com".com". string ereg_replace(string minta. A reguláris kifejezések témakörében bőséges irodalomban válogathatunk. A függvény a minta reguláris kifejezés alapján részsztringekre bontja a kereses_helye karakterláncot.domainnevek vagy dácumok szétbontására. minél több példát nézünk meg és futtatunk. További olvasnivaló A PHP számtalan szeringkezelő függvénnyel rendelkezik. . Karakterláncok szétbontása reguláris kifejezésekkel A reguláris kifejezések egy másik hasznos függvénye a split (). de ha külön­ [eges igényünk van (például cirill karakterekre alakítás).amelynek a következő a prototípusa: array split(str1ng m1nta. tegyünk így! Ez nem szükségszerüen érvényes azokra az egyetlen reguláris kifejezés függvénnyel elvégezhető felada­ tokra.hasonlóképpen ahhoz. $tomb = split ("\. Ha Unixor használunk.és nagybetük között. illetve elkerülnünk a redundanciát. amelyekhez máskülönben több sztringkezelőfüggvényre lenne szükség. amíg kellően elmélyülünk a reguláris kifejezésekben.A max egész számmal korlátozhatjuk a tömbbe kerülö elemek számát. while (list($kulcs.és soronként jeleníti meg öket. hogy sztringkifejezés használatával megoldjuk. Tekintsük a következő példát: 4 $eim= "felhasznaloi_nev@pelda. $ertek) = each ($tomb)) echo "<br />".com és phpbuilder.és a találatokat a csere szrringre cseréli. fejezet if (eregi("nagyugyfel\. hogy a reguláris kifejezések függvényei kevésbé hatékonyan Jutnak le.Az e reg_replace () prototípusa a következő: string csere. ahogy az str_replace () függvényt használruk­ segítségükkel részsztringeket keressünk és cseréljünk.$ertek.zend. a PHP online kézikönyvében ellenőrizhetjük.és tömbben adja vissza a részsztringeket. Neve MailVal (). string kereses helye[.php?ozid=88&single=l címen érhető el. mint a ha­ sonló funkciójú sztringkezelőJüggvények. A függvényt használhatjuk például e-mail címek. Némi időre van szükség. A Zend w eboldalán az itt fejlesztettnél összetettebb és hatásosabb e-mail-ellenőrző függvényt is találunk.com címen is.com/code/codex.1@". $cimzett = $email)) "bob@pelda. com 8 Megjegyzés: Általánosságban megállapítható.88 4. Ebben a fejezetben csak a legfontosabbakat tárgyalruk. hogyan lehet meglévő kód többszöri felhasználásával programozá­ si időt és energiát megspórolnunk. Hogyan tovább? A következő fejezetben több módszert is megismerünk arra.és a hrrp://www. $eim).

rnint amennyit eredetileg megírásával töltörtek. módosítására. törekednünk kell arra. A kevesebb kód alacsonyabb költséget jelent. miért jobbak ezek a beillesztések a szerveroldaliaknál. Költség Minden szaftver hasznos élertartama alatt sokkal több időt fordítanak fenntartására. hogyan lehet meglévő kóddarabok többszöri felhasználásával egységesebb. hogy kor­ látozzuk az adott cégnél vagy szervezetnél használatban lévő kódsorok számát. szerezzük be azt! Meglévő szoftver megvásárlásának a költsége szinte mindíg alacsonyabb. hogy minden egyes feladathoz teljesen új kódot írnánk. tesztelésére és dokumen­ tálására. hogy újraírása esetén elkerüli figyelmün- . A fejezetben az alábbi főbb témaköröket tárgyaljuk: ° 0 0 Kód többszöri felhasználásának előnyei A require () és az include () utasítás használata Ismerkedés a függvényekkel Függvények definiálása Paraméterek használata A hatókör fogalmának megismerése Érték visszaadása Cím és érték szerinti paraméterátadás Rekurzió megvalósítása Névrerek használata o o 0 ° o o Kód többszöri felhasználásának előnyei A szoftverfejlesztők egyik fő célja. és egységesebb lesz a program. Ha meglévő szoftver megfelel az új projekt követelményeinek. rnint egy azzal egyenértékű termék kifejlesztéséé. közrük a require () és include () utasítás egyszerű használatár. Ráadásul azt is Jámi fogjuk. A meglévő kód újbóli felhasználásával csökkennek a költségek. ha ahelyett. Óvatosan bánjunk azonban az olyan esetekkel. akkor korábban feltehetőleg már gondosan tesztelték azt. hogy ezzel nem kevés munkától kímélhetjük meg magunkat. kezelhetőbb progra­ mot írni. hogy új kód írása helyett újra és újra felhasználják meglévő programrészleteiket. Megbízhatóság Ha valamely kódmodul már használatban van az adott szervezemél. ami lehetövé teszi.és űrlapkészítő függvények példáján kereszrül azt is megrodhatj uk. hogy egynél több weboldalon alkalmazzuk ugyanazt a kódot. A fejezetben bemutatott példa f:ijlbeillesztések által teszi egységessé a teljes honlap megjelenését és használatár. Oldal. Ez nem azért van így. amikor egy meglévő szoftver majdnem megfelel számunkra! Meg­ lévő kód módosítása sokszor bonyolultabb feladat. mint új kód írása. Amennyiben üzleti célra fejlesztünk. javul a megbízhatóság. megbízhatóbb. Bemutatjuk a kód modulárissá tételének és többszöri felhasználásának különböző módszereit. mert a szoftverfejlesztő különösen lusta embertípus lenne. Elmagyarázzuk.5 Kód többszöri felhasználása és függvényírás A fejezetből kiderül. igyekszünk meglévő kódjainkat vagy programrészleteinket újból felhasználni. Új projekt létrehozása ideális esetben meglévő és többször felhasználható alkotóelemek kombinálását jelenti. Ezt a célt legpraktikusabban úgy teljesíthetjük. amit a lehető legkevesebb újonnan írt kód egészít ki. még akkor is fennáll a lehetősége. Ha ez a modul csak néhány sornyi kódot tartalmaz. hogyan lehet saját függvényeinket léttehozni és meghívni.

hogy a szóban forgó fájlt csak egyszer lehessen beil­ leszteni. mivel ezek az utasítások gyorsabban hajtódnak végre. nem kevés munkára van szükség._ Erilcry. A rendszer többi részének működéséhez illeszkedő új kód megírásához elhatározásra és. mégis nagyon hasznos utasítással teszi lehetövé bármilyen úpusú kód többszöri felhasználását.<br />'.jobban járunk a require (} vagy az include (} használatával.. Amennyiben kellően figyelmesek vagyunk kódolási gyakorlarunk­ ban. amit máskülönben a kódba írnánk be-PHP utasítást... Munkánk során próbáljuk meg beazonosítani azokat a kódrészlete­ ket. Az eddig említert példákban-honlap fejléce és lábléce ..azd"""'"'et -:..php betöltésekor valami érdekesebb történik.arra valók... Az utasí­ tások ezen variánsaival elkerülhető. -----� . nem meglepő módon az Ez it t egy nagyon egyszerű ábrán láthatjuk... szöveg jelenik meg böngészönkben. Az így betöltött fájl bármit tartalmazhat. illetve include one e (}. php nevü fájlban lett eltárolva: <?php echo 'Ez itt egy nagyon egyszerű PHP utasítás.. A require (} és az include (} utasítás majdnem tökéletesen megegyezik.php fájlt.._. szöveget.Ezek a konstrukciók-mint azt nevük is sugallja. feltéve persze.�� � lloo . PHP függvényt és PHP osztályt is.1 Cf · a l_��--� lu6. hogy az eredeti kód moduláris és jól megírt... Amennyiben a rendszer másik részét futtató kódot használunk fel. A require (} és az include (} utasítással fájlt tölthetünk be PHP kódunkba. Az irt látható kódot pedig a fo. Fájlnévkiterjesztések és a requ ire () utasítás A következő kód az ujrahasznalhato..amivel az eredeti szerzö kiegészítette.. így a kezelőfelületeknek és a külsö rendszerekre mutató felületeknek egyaránt egységesnek kell lenniük. HTML címkét (tag). bizony. A require (} és az include (} utasításnak két variánsa is létezik. .. hogy a meglévő kód többszöri felhasználása kevesebb munkával jár.éretlen': Egységesség A rendszerünkhöz kapcsolódó külső csarolófelületeknek.. hogy véletlenül kétszer illesszük be ugyanazt a függvénykönyvtárat. ugyan­ akkor az include (} csak figyelmeztetést ad. fejezet ket valami apróság. PHP utasítás. Az egyetlen különbség közöttük. ami óhatatlanul hibát eredményezne.1 ábra: A fo. Mindezen előnyök mellett nem elhanyagolható az sem._-t�PtiP--.php nevü fájl tartalmazza: <?php echo 'Ez a fő fájl. hiszen azzal újradefini­ álnánk a függvényeket.<br ?> />'.. A fo. vagy amit a tesztelés alatt észrevert bármilyen hiba miart hozzáadtak...90 5. require( echo ?> 'A 'ujrahasznalhato.. Ezek az utasítások hasonlóan műkődnek a sok webszerveren elérhető szerveroldali beillesztésekhez és a C vagy C++ prog­ ramnyelv #include utasításához. Ha betöltjük az uj rahasznalhato.. AW. mint a friss.=. Akkor 5 válik hasznossá.. 5. ezek neve require_once(}. még. ha a beilleszteni kivánt fájl nem található-a require (} utasítás hibával leállÍI:ja a program futását. amikor a requ ire (} és inelude (} utasításokkal függvények könyvtárait kezdjük el beilleszteni. hogy hiba esetén-például. akkor az egységes müködés automatikusan adódik..<br />'. amelyeket esetleg a későbbiekben újból meghívharunk! A require () és az include () utasítás használata A PHP két igen egyszerű. kód ezzel véget ér.ennek a funkciónak nem volt különösebb jelentősége...php' }. kiforrort kód jellemzöen megbízhatóbb..php fájl kimenele a require (} utasítás eredményét mutaija. A meglévö. tlf ______ . A kód kimenetét az 5.

• Megjegyzés: A példában az újrafelhasználható fájlt (ujrahasznalhato. és ekként hajtódik végre.html fájlt. PHP echo "Ez itt egy nagyon egyszerű echo ?> " A utasítás. .. A PHP-t jellemzően csak a meghatározott. száz vagy akár ezer. Amikor a require ( ) utasítást használjuk a fájl betöltésére. Ha nem nyitunk PHP címkét. . php nevű állományt használtuk. ". PHP használata esetén megrehetjük. és nem hajtódik végre. kivágja a fájl közepéről az ott lévő szöveget. ha azt sze­ retnénk. liZI!···� o TLA Consultmg t!J!IIII . Az előző példában az ujrahasznalhato. 5 A require ( ) utasítás használata weboldalsablonokra Amennyiben cégünk weboldalainak egységes a kinézere és működése.!MUJ . hogy részben módosítanák a honlap megjelenését.. 1 . Gondoljunk bele az alábbi helyzetbe: a honlapot már jó ideje használják. Amikor futtatjuk a kódot.<br />". az abban levő összes PHP utasítás fel lesz dolgozva.Kód többszöri felhasználása és függvényírás 91 A require ( ) utasítás használatához fájira van szükség. ezek mindegyike az 5. az lényegében egy PHP fájl részévé válik. inc vagy más. . mintha a kód a következőképpen lenne megírva: <?php echo " Ez a f6 fájl. és a felhasznáJók közveclenül betöltik azokat a böngészőbe.. Ehhez a szabályhoz nekünk is ragaszkodnunk kell. egyszerű szövegként fogják Jámi a kódot. Arnikor új oldal hozzáadására van szükség. (Ezt módosíthatjuk webszerverünk konfigurációs fájljában.html nevű fájlban lennének eltárolva. majd végrehajtódik a kód.) Ha viszont require () utasíráson keresztül töltjük be az oldal. utasítás helyét a kért fájl tartalma veszi át. a fejlesztő megnyit egy meglévő oldalt. kódunk szövegként vagy HTML-ként lesz kezeive. akkor alaphelyzetben nem kerülnének feldolgozásra... A PHP-t nem érdekli a kért fájl fájlnévkiterjesztése... majd más néven elmenti a fájlt. Ez azt jelenti. 5. inc vagy a . így a cég most több tíz. Így bármilyen. és benne az esetleges jelszava­ kat. Nem árt tudni. Amennyiben a PHP utasítások például egy oldal.aztell��e���OrtiS�IIOIIOCI� •• _. hogy az oldalak sablonját és állandó elemeit a require () utasítással adjuk hozzá.<br />". például . kód ezzel véget ér..2 ábra: A TLA Consuiting honlapjának minden oldala egységes képet mutat.. vagy szabványos kiterjesztéseket használjunk. a require( 'ujrahasznalhato. ?fi . ugyan­ olyan stílust követő oldallal rendelkezik. hogy nem tervezzük közvedenül meghívni. ?> A PHP kódot PHP címkék között helyezték el a f:ijlba. nem szabványos kiterjesztéssei végződő f:ijlokat tárolunk a webes dokumentumfában. Éppen ezért fontos.<br />". hogy ha .. php fájlt... .. hogy a kért fájlban lévő PHP kód akként legyen kezeive. A require () használatakor figyelembe kell vennünk a fájlnévkiterjesztések és a PHP címkék (tag) kezelése közötti kü­ lönbséget. beírja az újat.il AM O �·TlAC«ncanghonlltA6nii<*JfktD!pllilosiCMI. A képzeletbeli TLA Consuiting cég honlapja számos aloldallal rendelkezik.61S1111!1Je1'1'18QctgOrQCI N. hogy amikor betöltjük a fo.php' ) .. php Iciterjesztésű fájlok feldolgozására uta­ sírjuk...2 ábrán láthatóval meg­ egyező módon néz ki és működik. .php) a következőképpen írták meg: <?php echo "Ez itt egy nagyon egyszerű PHP utasítás. a változtatás ..feltéve. Ez azt jelenti.. ám érdemes ragaszkodni az . � . nekünk tetsző kiterjesztést használ­ harunk a f:ijlok beillesztésére. php kiterjesztés használatához. Wlt{jllfip. hogy tetszőleges nevet adhatunk fájlunknak . .<br />". hogy a beillesztett fájlokat a dokumentumfán kívül tároljuk. úgy fut le.. Az a döntés születik.

menü --> <table width="lOO%" <tr > <td width="25%"> <img src="s-logo.sans-serif. text-align:center. font-size:12pt.gif" alt="" height="20" width="20"> <span class="menu">Kapcsolat</span></td> <td width="25%"> <img src="s-logo.gif" alt="TLA logo" height="70" . font-family:arial.1 példakód: kezdalap.gif" alt="TLA logo" height="70" width="70"></td> <td> <hl>TLA Consulting</hl> </td> <td align="right"><img width="70"></td> </tr> </table> <1-.sans-serif} p. Jó lenne.92 5. száz vagy akár ezer oldalon végrehajtani a másolás-beillesztés monoton lépéseit. font-weight:bold} font-family:arial.2 ábrán látható nyitóoldal ( kezdolap. ha ezt az apróbb módosítást több tíz. például egy e-mail cím hozzáadása a minden egyes oldal alján látható lábrészhez vagy új elem hozzáadása a navigációt lehetövé tevő menühöz. mint több tíz.html -A TLA Consuiting nyitóoldalát előállító HTML kód <html> <head> <title>TLA Consulting Pty Ltd</title> <style type="text/css"> hl {color:white. Az 5.menu {color:white.a:visited. td p {background:blackl {color:black. text-align:center. font-size:12pt.gif" alt="" height="20" width="20"> <span class="menu">Kezd6lap</span></td> <td width="25%"> <img src="s-logo. text-align:center.gif" alt="" height="20" width="20"> <span class="menu">Szolgáltatások</span></td> <td width="25%"> <img src="s-logo. html) for­ ráskódja az 5.foot {color:white. font-weight:boldl font-family:arial.sans-serif.oldal fejrész --> <table width="lOO%" cellpadding="l2" cellspacing="O" border="O"> <tr bgcolor="black"> <td align="left"><img src="logo. font-family:arial. font-size:24pt.1 példakódban látható.sans-serifl . text-align:justify. száz vagy akár ezer oldalon végre kellene haJtanunk� A rninden oldalon megtalálható HTML szakaszok újbóli használata sokkal jobb megközelítési mód.a:active </style> </head> <body> {color:white} 5 <!-.gif" alt="" height="20" width="20"> <span class="menu">Oldaltérkép</span></td> bgcolor="white" cellpadding="4" cellspacing="4"> src="logo. a:link. fejezet lehet egészen apró. font-size:9pt. 5.

azaz beillesztés szóra utal). a. az"oldal tartalom'' az adott oldal egyedi szövegér jeleníti meg.oldal tartalom --> <p>Köszöntjük a TLA Kérjük. Az. A kezdelap. php fájlt töltik be. � 5 <p>Az üzleti igények kielégítésére szakoso dtunk. Azért követendő ez a stratégia. hogy ennek a könyvtárnak a we­ bes dokumentumfán kivül kell elhelyezkednie. és ismerje meg cégünket1</p> reméljük. de a fájl egy oldalnak vagy kódnak csak egy részér tartalmazza.php.2 példakód: kezdelap.</p> <!-.php">jogi nyilatko zatát!</a></p> <ltd> </tr> </table> </body> </html> Az 5. hogy a késöbb más fájlokba heilleszrendő állományoknak a valami. és a részeinek a fejlee. ha a webszerveren ezt kifejezetren beállították. rövidesen Önt is ügyfeleink között tudhatjuk. hogyan lesznek feldolgozva a reguire () utasítás általi meghívásuk esetén. Ahogy korábban már jeleztük. A kezdelap. php fájl átveszi a kezdelap. Érdemes felosztani ezt a fájlt.oldal fejléc" círnkéjü rész a cégne­ vet és a logót. <p>Az üzleti igények kielégítésére szakosodtunk.2 mintakódból látjuk. mert megakadályozza e fájlok egyenkénti betöl­ tését.php és lablec. vagy (b) egyéb kiterjesztés használata esetén mások számára olvashatóvá teszi a forráskódot.inc fájlok csak akkor értelmezödnek PHP kódként. Consulting honlapján! szánjon rá kis időt.ph p is olyan kódot tartalmaz. Bevett szokás. és ismerje meg cégünket!</p> reméljük.inc nevet adják (az inc itt az include. php-A TLA nyitóoldalát előállító PHP kód <?php reguire('fejlec.php. egyenkénti betöltését. <p class="foot">Kérjük. A HTML fejrész az oldal által használt caseaciing scyle sheet- (CSS).php nevet adni.Kód többszöri felhasználása és függvényírás 93 </tr> </table> <!-. de az nem engedélyezi a heillesztési fájlok webszerveren keresztüli. mivel az .menü" az oldal navigációs sávját. php fájlban lévő reguire ( ) utasítások a fejlee. A fejlee.oldal lábléc --> < table widt h="lOO%" bgcolor="black" cellpadding="l2" border="O"> <tr> <td> <p class="foot">&copy.1 példakódban láthatjuk. Általánosságban nem ajánljuk ennek követé­ sét. ha a fájlkiterjesztés . szánjon rá kis időt. az ezeknek a fájloknak adott név nincs hatással arra.php'). amelyet a különböző oldalakon újra és újra felhasználhatunk. azaz egymásba ágyazott stíluslap-definíciókat tartalmazza.php'). 5.</p> olvassa el honlapunk <a href="legal.. ami (a) hibákat eredményezne. amit kódjaink látnak ugyan. kezdelap. ?> <!-. tartalmazza az egyedi oldaltartalmat és a kér reguire () utasítást.</p> <?php require('lablec. hogy a fájl számos elkülönülő kódrészletből áll. Ez alatt ralálha­ tó az oldal lábléce.php és a l ablee. html helyét: ahogy az 5.php és lablec . Ha mégis így teszünk. . Ez azt jelenti. rövidesen Önt is ügyfeleink között tudhatjuk. a heillesztési állományainkat olyan könyvtárba helyezzük el. TLA Consulting Pty Ltd.oldal tartalom --> <p>Köszöntjük a TLA Consulting honlapján! Kérjük..

text-align:center.sans-serif.sans-serif. font-family:arial.gif" alt="TLA logo" </tr> </table> height="70" width="70" /></td> <!-.gif" alt="TLA logo" height="70" width="70"></td> <td> <hl>TLA Consulting</hl> <ltd> <td align="right"><img src="logo. php fájl az egyes oldalak alján látható láblécet megjelenítő táblázatot tartalmazza.php fájlban az oldal által használt CSS definíciókat. illetve a cégnevet és a menüelemeket tartalmazó táblázato­ kat találjuk {lásd 5.sans-serif} .gif" alt="" height="20" width="20" /> <span class="menu">Szolgáltatások</span></td> <td width="25%"> <img src="s-logo.menu {color:white.gif" alt="" height="20" width="20" /> <span class="menu">Kezd6lap</span></td> <td width="25%"> <img src="s-logo.foot {color:white. font-size:24pt. text-align:center.a:visited. font-weight:bold} font-family:arial. a:link. font-size:l2pt.3 példakód l). text-align:justify.gif" alt="" height="20" width="20" /> <span class="menu">Kapcsolat</span></td> <td width="25%"> <img src="s-logo.gif" alt="" height="20" width="20" /> <span class="menu">Oldaltérkép</span></td> </tr> </table> A lablec. 5. font-weight:bold} font-family:arial. . A fájlban lévő kód az 5.menü --> <table width="lOO%" bgcolor="white" cellpadding="4" cellspacing="4"> <tr > <td width="25%"> <img src="s-logo.php <html> <head> <title>TLA Consulting Pty Ltd</title> -Az összes TLA-oldal újból felhasználható fejléce <style type="text/css"> hl {color:white.3 példakód: fejlee.oldal fejléc --> <table width="l00%" cellpadding="l2" cellspacing="O" border="O"> <tr bgcolor="black"> 5 <td align="left"><img src="logo.4 példakódban olvasható.sans-serif} p. fejezet A fejlee. text-align:center.94 5. font-family:arial. font-size:l2pt.a:active </style> </head> <body> {color:white} <!-. td p {background:black} {color:black. font-size:9pt.

illetve nincsen egyenlőségjel.php" Unix alatt pedig így: auto_prepend _file = "/home/username/incluctel fejlee. Ha require másképpen is megtehetjük ezt. és semmilyen readfile ( ) PHP kód nem fut le.php" php_value auto_append_file "/home/username/include/lab lee. l 5 ' Az a uto_prepend_file és az a uto_append_file beállítás használata () vagy az include () utasítást.ini-beli változatától: a sor elején a php_ value található. <p class="foot">Kérjük. akár teljesen átalakítjuk az oldal megjelenését.php" Amennyiben ezeket a beállításokat használjuk. Ha Apache webszervert használunk. könyvtáranként adhatjuk meg az ilyen kon6gurációs beállításokat. azt érjük el.és utáncsatolást (prepend és append). Akár apró szövegváltozatásról van szó. mivel minden oldal a fejléc. ?> Ide kerül ennek az oldalnak a tartalma <?php require ( 'lablec. hogy valamely fájlt egyszerű szövegként vagy HTML-ként kezelünk.oldal lábléc --> -Az összes TLA-oldal újból felhasználható lábléce <table width="100%" b gcolor="black" cellpadding="12" border="O"> <tr> <td> <p class="foot">&copy. Ha szeretnénk biztosak lenni abban. A php. Az így beillesztett fájlok úgy viselkednek. használjuk inkább a függvényt! Ez feldolgozás nélkül jeleníti meg a fájl tartalmár.php" Figyeljük meg. hogy ezek a fejléc.ini kon6gurációs beállítás is módosítható így. nem kell begépelnünk az include () utasításokat.és láblécfájlokra mutassanak. hozzunk létre benne egy . ám ekkor a fejlécek és láblécek többé nem opcionális elemek lesznek az oldalakon.php <!-. Hogy beállítsuk valamely könyvtárnál az automatikus elé.Kód többszöri felhasználása és függvényírás 95 5.php" auto_append_file = "c:/Program Files/Apache Group/Apache2/include/lablec.2//include/fejlec. amennyiben felhasználótól származó szöveggel dolgozunk. a többivel megegyező stílusú oldalt: <?php require ('fejlee. TLA Consulting Pty Ltd. Ehhez be kell állíta­ nunk kiszolgálónkat. hogy a szintaktika kissé eltér ugyanennek a beállításnak a php. hogy engedje fő kon6gurációs fájljának vagy fájljainak a felülírását.</p> olvassa el honlapunk<a href="legal. vagyis hiányzó fájl esetén figyelmeztetést kapunk.php" auto_append_file = n /home/username/include/lablec. Érdemes észben tartani ezt a biztonsági óvintézkedést. fájl két kon6gurációs beállítása az auto_prepend_file és az auto_append_ Ha arra szeretnénk használni a file.4 példakód: lablec. könnyedén módosíthatjuk a fej­ léc és a lábléc fájljait. hogy fejlécet és láblécet acljunk minden oldalhoz.és láblécfájlokkal töltődik be. php') .php"> jogi nyilatkozatát!</a></p> <ltd> </tr> </table> </body> </html> Ezzel a megközelítéssel igen egyszerűen kapunk egységes megjelenésű weboldalt. ini beállítjuk. . csak egyszer kell végrehajtani a módosítást. Windows alatt a beállítások így néznek ki: auto_prepend_file = "c: /Program Files/Apache Software Froundation/Apache2. Számos más php. hogy rninden oldal előtt és után betöltődnek. fejlécben és láblécben. Az oldal részeinek dinamikus előállítására használhatnánk PHP utasításokat is ezekben a fájlokban. és például az alábbi szöveg begépelésével könnyedén létrehozhatunk egy új. Nem feltétlenül mindig ez a helyzet. Az itt bemutatott példa csak egyszerű HMTL-t használ a törzsben (body).php') . htaccess nevű fájlt! Ennek az állo­ m ánynak az alábbi két sort kell tartalmaznia: php_value auto_ prepend_file "/home/username/include/fejlee. mintha az include () utasítással lettek volna hozzáadva. Nem kell a honlap minden egyes oldalát egyenként megváltoztatni. ?> Ami talán a legfontosabb: miután számtalan oldalt létrehoztunk ezzel a fejléccel és lábléccel.

96

5. fejezet

Azzal, hogy a beállirásokat a php. ini állomány vagy a webszerver-konfigurációs fájl helyett a . htaccess állományban adjuk meg, rugalmasabban dolgozhacunk. Megosztott gépen úgy módosíthatjuk a beállításokat, hogy az csak a saját könyv­ tárainkra vonatkozzon. Nem szükséges újraindítani a webszervert, és nincs szükségünk rendszergazdai hozzáférésre sem. A . htaccess módszer hátránya, hogy a fájlok sorsa nem csak elinduláskor, hanem a könyvcárban lévő bármely fáJl lekérése esetén is a beolvasás és a feldolgozás, így e rugalmasság ára a teljesítmény csökkenése lehet.

Függvények használata PHP,ben
A függvények a programnyelvek többségében megralálhatók; egyetlen, jól meghatározott feladatot végreh:ytó kódrészletet kü­ lönítenek el. A kódot könnyebben olvashacóvá teszik, és álcaluk lehetövé válik, hogy az adott kódrészletet újra meg újra felhasz­ náljuk, amikor ugyanazt a feladatot kell végreh:ytanunk. A függvény olyan önálló kódmodul, amely előír egy hívó interfészt, végrehajt valamilyen feladatot, és opcionálisan valamilyen eredménnyel tér vissza. Számtalan függvénnyel találkoztunk már. A korábbi fejezetekben rutinszerűen híveunk meg jó néhány, beépített PHP függ­ vényt. Mi magunk is írtunk néhány egyszerűbb függvénye, ám nagyvonalúan elsiklottunk a részletek felett. A következő részek­ ben alaposabban áttekintjük a függvényhívás és -írás témakörét.

Függvényhívás
Az alábbi sorban a lehető legegyszerűbb függvényhívásr látjuk:
fuggveny_nev();

Ez a kódsor a fuggveny _nev nevű, paramétert nem igénylő függvényt hívja meg. Nem foglalkozik a függvény által esede­ gesen visszaadott értékkel sem. Számos függvényt pontosan ezen a módon hívunk meg. Teszteléshez gyakran jól jön a phpinfo() függvény, mert meg­ jeleníti a telepített PHP verziószámát, információt ad a PHP-ről, a webszerver beállításáról, illetve kiírja különböző PHP és szerverváltozók értékér. Ez a függvény paramétert nem fogad, és jellemzően figyelmen kívül hagyjuk a visszatérési értékér, így

5

a phpinfo () meghívása a következőképpen néz ki:
phpinfo();

A legtöbb függvény azonban egy vagy több paramétert vár - ezek a függvények inpugai, azaz bemeneti adatai. A paramé­ terek átadása úgy történik, hogy az adatot vagy az azt tartalmazó változó nevét a függvénynév utáni zárójelek közé helyezzük. Egyetlen paramétert fogadó függvényt a következőképpen hívhacunk meg:
fuggveny_nev('parameter');

Az itt használt paraméter egy, a kizárólag a parameter szót tartalmazó karakterlánc, de a függvény által várt paramétertől függöen az alábbi függvényhívások is megfelelök lehetnek:
fuggveny_nev(2); fuggveny_nev(7.993); fuggveny_nev($valtozo);

Az utolsó sorban látható $valtozo bármilyen típusú PHP változó lehet, akár tömb vagy objektum is. A paraméterek bármilyen adattípusúak lehetnek, de egy adott függvény általában meghatározott adattípust vár. A függvény prototípusából kiderül számunkra, hogy a függvény hány paramétert vár, mit jelképeznek ezek a paraméterek, és milyen adattípusúak kell, hogy legyenek. Könyvünkben az egyes függvények bemutatásánál gyakran megadjuk prototípusukat is. Az fopen () függvény prototípusa a következő:
resource fopen ( string fajlnev, string mod

[,

bool use include_path

[,

resource kezelesi_mod]])

A prototípus temérdek információt közöl velünk, ezért különösen fontos, hogy megfelelöen értelmezzük. Jelen esetben a függvénynév előtt látható resource szó jelzi, hogy a függvény forrást (vagyis egy nyitott fájlválcozót) fog visszaadni. A függvényparaméterek a zárójelek közöte találhatók. Az fopen( ) esetében négy paramétert mutat a prototípus. A faj lnev és amod paraméter string, a use_include_path Boolean, a kezelesi_mod paraméter pedíg resource típusú. A use_
include_path és kezelesi_mod paramétert körülvevő szögletes zárójelek jelzik, hogy opcionális, vagyis nem kötelező

paraméterrel állunk szemben. Az ilyeneknél vagy megaeljuk értéküket, vagy nem foglalkozunk velük, és akkor alapértelmezett értéküket fogják használni. Fontos tudni azonban, hogy több opcionális paraméterrel rendelkező függvény esetén csak jobbról haladva hagyhatjuk ki ezeket a paramétereket. Az fopen () használata esetén például kihagyhaguk csak a kezelesi_mod paramétert vagy a use_include_path és a kezelesi_mod paramétert; az azonban nem lehetséges, hogy a use_
include_path paramétert kihagyjuk, a kezelesi_mod - ot viszont nem.

Kód többszöri felhasználása és függvényírás

97

A fuggvény protoópusának áttekintése után már tU<ljuk, hogy a következő kódrészlet az fopen ( ) függvény érvényes hívása:
$nev = 'sajatfajl.txt'; 'r'; $megnyitasi_rnod =

$fp

=

fopen ($nev,

$megn y it asi rnod) ;
az

A fenti kód az fopen () nevű függvényt hívja meg. A függvény által visszaadott érték

$fp

változóban tárolódik el.

A példában úgy döntöttünk, hogy a függvénynek a string rípusú $nev változóban átadjuk a megnyitni kívánt fájl nevét,

a $megn yitasi_rnod nevű, szintén string rípusú változóban pedig a kívánt fájlnyitási módot határozzuk meg. A példában a harmadik és a negyedik paramétert nem adtuk meg.

Nem létező függvény hívása
Ha nem létező függvényt próbálunk meghívni,
az

5.3 ábrán láthatóhoz hasonló hibaüzenetet kapunk.

F&�a�.....-c.IIIO_......_..._.......O•"'-"-�.,..-""-•:J.,.ro�_foto-ol
--�---j

5.3 ábra: Nem létező függvény hívása esetén ez a hibaüzenet lesz az eredmény. A PHP által adott hibaüzenetek jellemzően nagyon hasznosak. Az ábrán lévő közli, hogy pontosan melyik fájlban, a kód

melyik sorában következett be a hiba, és mi a neve a függvénynek, amir megkíséreltünk meghívni. Ezen információ birtokában viszonylag egyszerűen megtalálható és orvosolható a probléma. Ha hibaüzenetet kapunk, ellenőrizzük az alábbiakat:

Pontosan írtuk a függvény nevét? Létezik-e ez a függvény a PHP általunk használt verziójában?

Előfordulhat, hogy nem jól emlékszünk rá, hogyan kell az adott függvény nevét írni. Például egyes, két szóból álló függ­ vénynevek esetén alulvonás van a szavak között, másoknál nincsen. A stripslashes () függvénynél egybeírjuk a két szót, a strip_ta gs () esetében alulvonás kerül közéjük. Ha függvényhíváskor elírjuk a függvény nevét, az 5.3 ábrán láthatóhoz hasonló hibaüzenetet kapunk.
A könyvben használt függvények némelyike nem létezik PHP4-ben, mert feltételezzük, hogy olvasóink a PHP 5-ös verzió­

l 5

ját használják. Minden egyes új verzióban új függvények jelennek meg, és

amennyiben a program régebbi változatát használjuk,

a több funkció és a jobb teljesítmény rniatt érdemes frissíteni. Az online kézikönyvből megrudhatjuk, hogy egy adott függvény mikor jelent meg. Az éppen futtatott verzióban nem deklarált függvény meghívása az 5.3 ábrán látható hibához hasonlóhoz vezet.
A hibaüzenet megjelenésének egy másik lehetséges oka, hogy a meghívott függvény egy be nem töltött PHP bővítmény ré­

sze. Ha például a gd (képkezelő) könyvtár függvényeit próbáljuk meg használni, de nem telepítettük a gd-t, akkor is a fentihez hasonló hibaüzeneret kapunk.

Kis- és nagybetűk megkülönböztetése függvénynevekben
Jó, ha tudjuk, hogy a függvényhívások nem tesznek különbséget a kis- és nagybetűk között, így a fuggveny_nev ( ) ,
Fuggven y _nev

( ) és FUGGVENY_NEV ( ) rnind érvényes és ugyanazt

az

eredményt hozó függvényhívás. Tetszés szerint, a szá­
az

munkra legkönnyebben olvasható módon használhatjuk a nagybetűket, ám törekedjünk

egységes és következetes használat­

ra! E könyv - akárcsak a PHP dokumentációk nagy része - csupa kisbetűvel szedi a függvényneveker. Fontos megemlíteni, hogy e tekintetben a függvénynevek a változónevektől eltérően viselkednek. A változónevek esetében megkülönbözte�ük a kis- és nagybetűket, így a $Nev és a $nev két eltérő változó, de a Nev ( ) és a nev ( ) ugyanaz a függvény.

Saját függvények definiálása
A korábbi fejezetekben számos példát láttunk a PHP beépített függvényeinek használatára. Egy programozási nyelv valós ere­

jét azonban saját, egyéni

függvények létrehozásának a lehetősége adja.

98

5. fejezet

A PHP beépített függvényei lehetövé teszik a fájlkezelést, adatbázisok használatár, grafikák létrehozását és a más kiszolgá­ lókhoz csatlakozást. Munkánk során azonban gyakran előfordul, hogy a nyelv megalkotói álcal előre nem látható feladatot kell elvégeznünk. Szerencsére a függvények használata nem korlátozódik pusztán a beépítercekre; saját függvényeket írva tetszőleges feladatot hajtharunk végre velük. Kódunk jellemzően a meglévő és s:Yát, az előttünk álló feladatra írt függvények kombinációjából áll össze. Ha olyan kódblokkot írunk egy konkrét célra, amit kódunkban és esetleg programjainkban többször is használni kívá­ nunk, érdemes függvényként deklarálni. A függvényként deklarálás lehetövé teszi, hogy saját kódunkat a beépített függvényekhez hasonlóan vegyük igénybe. Egy­ szerűen meghívjuk függvényünket, és megadjuk a számára szükséges paramétereket. Ezt azt jelenti, hogy kódunkat bármikor meghívhatjuk, és használhatjuk függvényeinket.

Függvények alapszerkezete
A függvénydeklarálással új függvénye hozunk létre. A deklarálás a funetion kulcsszóval kezdődik, majd megadjuk a függvény nevét, a függvény által várt paramétereket és a függvényhíváskor végrehajtandó kódot. Nézzünk példát egy triviális függvénydeklarálásra:
funet1on sajat fuggveny()

{

eeho 'Meghívtuk függvényünket';

A függvénydeklarálás azért kezdődik a funetion szóval, hogy a programozó és a PHP értelmező egyaránt tisztában legyen azzal, hogy felhasználó által definiált függvény következik. A függvény neve saj at_fuggveny. Az új függvény a követ­ kező utasítással hívható meg:
sajat fuggveny();

Mint bizonyára ki találtuk, e függvény meghívása azzal az eredménnyel jár, hogy böngészőnkben megjelenik a Meghí v tuk
függvényünket szöveg.

A beépített függvények minden PHP kódból elérhetők, ám ha saját függvényeket deklarálunk, csak azon kód(ok) számára

5

lesznek elérhetők, amely(ek) ben deklaráltuk azokat. Célszerű a gyakran használt függvényeinket egy vagy több fájlban eltárol­ ni. Ha így teszünk, kódjainkban a require () utasítással elérhecövé tehetjük az éppen szükségessé váló függvényeket. A függvényen belül kapcsos zárójelek közé kerül a kívánt feladatot végrehajtó kód. Ezen kapcsos zárójelek közé a PHP-ben érvényes bármilyen kódot írharunk, legyen az függvényhívás, új változók deklarálása, függvény, require () vagy inelude () utasítás, osztálydeklarálás vagy egyszerű HTML. Ha függvényen belül ki szeretnénk lépni a PHP-ből, és egyszerű HTML kódot szeretnénk beírni, ugyanúgy tehetjük meg ezt, mint a kód bármely más részén- a HTML elé záró PHP címkét (tag) kell helyeznünk. A következő kódrészlet az előző példa megengedett, ugyanazt a kimenetet eredményező módosítása:
<?php funetion sajat_fuggveny() ?> Meghívtuk függvényünket <?php

)
?>

Figyeljük meg. hogy a PHP kód a nyitó és záró PHP címkepár közé került! A könyvben szereplö, kódrészleteket használó példák többségénél nem írjuk ki a címkéket. Irc azért szerepelnek mégis, mert a példában, illetve előtte és utána is szükség van rájuk.

Függvényeink elnevezése
Függvényeink elnevezésénél a legfontosabb szem pont, hogy rövid, mégis beszédes nevet találjunk ki. Ha függvényünk oldalfej­ lécet hoz létre, akkor az oldalfejlee() vagy az oldal_fejlee() név egyaránt megfelelő lehet. Az alábbi korlátozásokat mindenesetre figyelembe kell vennünk: Függvényünk neve nem egyezhet meg már meglévő függvényéveL A függvénynév csak betüket, számjegyeket és alulvonást tartalmazhat. A függvénynév nem kezdödhet számmal. Sok programnyelv megengedi a függvénynevek újbóli használatár. Ezt a funkeiét Jüggvények

többszörös definiálásának

(function overloading) nevezik. A PHP azonban ezt nem támogatja, így függvényünknek nem lehet ugyanaz a neve, mint egy

Kód többszöri felhasználása és függvényírás

99

beépített vagy felhasználó által deklarált, meglévő függvényé. Ne feledjük azonban azt sem, hogy a beépített függvényeket min­ den PHP kód ismeri, a felhasználó által definiált függvények viszont csak azokban a kódokban léteznek, ahol deklarálva lettek! Ez lényegében azt jelenti, hogy másik fájlban ugyan újból felhasználhatjuk ugyanazt a függvénynevet, ám ez kavarodáshoz vezethet, így ajánlott elkerülni. A következő függvénynevek mind érvényesek:
nev() nev2() nev_harom() nevnegy()

Az alábbiakat azonban nem használhaguk:
Snev() nev-hat () fopen ()

(Az utolsó akkor lenne megengedett, ha nem létezne ugyanilyen nevü, beépített függvény.) Érdemes megjegyezni, hogy bár a $nev név függvénynek nem adható, egy
$nev();

nevű függvény a $nev értékétől függöen minden további nélleül végrehajtódhat. Ez azért lehetséges, mert a PHP veszi a $nev változóban eltárolt értéket, ilyen nevü függvényt keres, majd megpróbálja meghívni. Az ilyen típusú függvényeket függvényválto­ zóknak (variable function) nevezzük, és bizonyos helyzetekben igen hasznosak lehetnek számunkra.

Paraméterek használata
Feladatuk végrehajtásához a függvények többsége egy vagy több paramétert igényel. A paraméterekkel adatot adhatunk át a függvényeknek. Nézzünk példát paramétert váró függvényrel Az irt látható függvénynek egydimenziós tömböt adunk át, amit táblázatként jelenít meg:
function tablazat keszitese($adat) echo "<table border=\"1\">"; reset($adat); $ertek
=

{

ll Ezzel az utasítással mutatunk a tömb elejére

5
"

current($adat); {

while ($ertek)

echo "<tr><td>".$ertek."<ltd><ltr>\n"; $ertek
=

next($adat);

echo "<ltable>";

Amennyiben a következöképpen hívjuk meg a tablazat_keszitese() függvényt:
$sajat_tomb
=

array('Első sor.', 'Második sor.', 'Harmadik sor.');

tablazat_keszitese($sajat_tomb);
az

5.4 ábrán látható kimenetet kapjuk.

lr �.':��=� �..: �-��fl:'Jtt:l ·

�IF��
adatokat adjuk a függvénynek.

-

5.4 ábra: A tablazat_kes zitese ( ) meghívásának eredménye az alábbi HTML táblázat.

A paraméterátadással a függvényen kívül létrehozort adatot viherünk a függvénybe.Jelen esetben az $adat tömbben lévő A beépítert függvényekhez hasonlóan a felhasználó által írt függvények is fogadhatnak több paramétert, és lehetnek ezek közt opcionálisak is. A tabla z at_keszitese() függvényt többféleképpen továbbfejleszthegük; az egyik lehetőség, ha a függvényt meghívó programozó beállíthatja a táblázat szegélyét vagy más tulajdonságát. Nézzük a függvény egy bővítert válrozatát, amely az előzőhöz hasonló, ám lehetövé teszi, hogy opcionálisan meghatározzuk a táblázat szegélyének vastagságát, illetve a cellák közötti távolság ( cellspacing) és a behúzás (a cella szegélye és tartalma közötti távolság- cellpadding) értékéti

100

5. fejezet

<?php function tablazat keszitese2{$adat, $border=l, $cellpadding=4, $cellspacing=4 )

{

echo "<table border=\"".$border."\" cellpadding=\"".$cellpadding."\" cellspacing=\"".$cellspacing."\">"; reset{$adat); $ertek = current{$adat);
w

hile {$ertek)

{

echo "<tr><td>".$ertek."</td></tr>\n"; $ertek
=

next{$adat);

echo "</table>";

$sajat_tomb = array{'Első sor.', 'Második sor.', 'Harmadik sor.'); tablazat_keszitese2{$sajat_tomb,

3,

8,

8);

A tablazat_keszite se2{) első paramétere továbbra is kötelező. A következő három viszont opcionális, mivel megha­ tároztuk alapértelmezett értékeiket. Az 5.4 ábrán láthatóhoz hasonló kimenetet hozunk létre a tablazat_keszitese2{) függvény alábbi meghívásával:
tablazat keszitese2{$sajat_tomb);

Ha ugyanezeket az adatokat szellősebben szetetnénk megjeleníteni, a következő paraméterekkel kellene meghívni az új függvénye:
tablazat_keszitese2{$sajat_tomb,

3,

8,

8);

Nem szükséges rninden opcionális ércéket megadnunk; megtehecjük, hogy némelyiket megadjuk, másikakat nem. A para­ méterek kiosztása balról jobbra történik. Ne feledjük: nem tehetjük meg azt, hogy az egyik opcionális paramécert kihagyjuk, de egy attól jobbra eső paramétert megadunk! Ha példánkban szeretnénk megadni a cellspacing tulajdonság értékér, akkor a cellpadding értékét sem

5

hagyhatjuk ki. Gyakori ez a programozási hiba. Ez az oka annak is, hogy az opcionális paraméterek a paraméterlista végére kerülnek. Az alábbi függvényhívás:
tablazat_keszitese2{$sajat_tomb,

3);

teljesen helyes, eredményeképpen a$ border ércékét 3-ra, a$ cellpadding és a $cellspacing tulajdonságot pedig alapértelmezett ércékére állitjuk. Változó számú paramétert elfogadó függvényeket is deklarálhatunk. Három segédfüggvény használatával deríthetjük ki, hogy hány paraméter átadása történt meg, és rnik ezeknek az értékei. E három segédfüggvény a következő: fune_num_
args{),func_get_arg{) ésfunc_get_args{).

Gondoljuk végig például az alábbi függvény müködését:
function var_args{)

{

echo "Paraméterek száma:"; echo func num_args{); echo "<br />"; $args = func_get_args{); foreach {$args as $arg) echo $arg."<br />";

{

A függvény közli a neki átadoct paramécerek számát, illetve megjeleniti azokat. A fune_num_args{) függvény az áradott függvények számát, a fune_get_args{) függvény pedig az argumentumok tömbjét adja vissza. A fune_get_arg{) függ­ vénnyel egyenként érhetjük el a paramétereket, mégpedig úgy, hogy a függvénynek az elérni kivánt argumentum számát adjuk át. (Az argumentumok számozása nullával kezdődik.)

A hatókör fogalma
Észreveheccük, hogy arnikor beillesztett vagy beágyazott fájlon belül kellett használnunk a változókat, egyszerűen a require{) vagy az inelude{) utasítás előtt lévő kódban deklaráltuk azokat. Függvény használatakor közvetlenül a függ-

Kód többszöri felhasználása és függvényírás

101

vénynek adtuk át a változókat, egyrészt azért, mert nincsen mechanizmus arra, hogy explicit módon adjunk át változókat beol­ vasott vagy beágyazott fájlnak, másrészt pedig azért, mert a változóhatókör függvények esetén másképpen működik. A változó hatóköre szabályozza, hogy az adott változó hol látható és használható. Az egyes programozási nyelvek eltérő szabályokat alkalmaznak a változók hatókörének meghatározására. A PHP viszonylag egyszerű szabályokat használ:

A függvényerr belül deklarált változók hatóköre a változókat deklaráló urasírástól a függvényzáró kapcsos zárójeiig ter­ jed. Ezt függvényszintű hatókörnek (funcrion scope), az ilyen változókar pedig helyi változóknak (local variable) nevezzük. A függvényeken kívül deklarált változók hatóköre a változókat deklaráló utasításról a fájl végéig terjed, de függvénye­ ken belül nem láthatók. Ezt globális hatókörnek (global scope), az ilyen változókat pedig globális változóknak (global variable) nevezzük. A különleges szuperglobális változók függvényeken belül és kívül is láthatók. (Az ilyen változóktól további információt az első- PHP gyorstalpaló című- fejezerben találunk.) A require () és az include ( ) utasítás használata nem befolyásolja a harókört. Ha az utasírásokat függvényerr belül acijuk kí, a függvényszintű hatókör lesz érvényben. Amennyiben függvényerr kívül használjuk, a globális hatókör lesz érvényben. A global kulcsszóval saját kezűleg állíthatjuk be, hogy a létrehozott vagy függvényerr belül használt változó globális harókörrel rendelkezzék. A változókat az un set ($valto z o_neve) függvény meghívásával saját kezűleg törölhegük. Az így kikapcsolt változó­ nak nincsen haróköre.

Az alábbi példák még egyértelműebbé tehetik a hatókör fogalmát. A következő kódnak nincsen kimenete. Itt az fn () nevű függvényben deklarálunk egy $var nevű változót. Mivel függvé­ nyerr belül deklaráljuk, a változó függvényszintű hatókörrel bír, és csak az azt deklaráló utasítástól a függvény végéig létezik. Ha a függvényerr kívül újrahivatkozunk a $var változóra, egy újabb $var nevű változó jön létre. Ez az új változó globális hatókö­
rű, és a fájl végéig látható. Ha csak az ech o utasítást használjuk ezzel az új változóval, akkor, sajnos, soha nem fog értéket kapni.
function fn ()

{

$var = "tartalom";

fn () ; echo $var;

5
{
\$var = ".$var."<br />"; \$var = ".$var."<br />";

A következő példa ennek fordítorga. Itt a függvényerr kívül deklaráljuk a változót, majd megpróbáljuk a függvényerr belül használni:
<?

function fn ( )

echo "függvényen belül, $var echo
= n

"tartalom 2"; függvényerr belül,

$var fn ();

=

"tartalom

l";
\$var ".$var."<br />";

echo "függvényen kivül,

E kód kimenere a következő:
függvényerr belül, függvényerr belül, függvényerr kivül, $var $var $var
= =

tartalom 2 tartalom

l
=

A függvények meghívásukig nem hajcódnak végre, így az első végrehajtott utasítás a $var

'tartalom l';. Ez a $var

nevű, globális hatókörű és "tartalom l" tartalmú változót hozza létre. A következöként végrehajtott utasítás az fn () függvény meghívása. A függvényerr belüli sorok sorban hajtódnak végre. A függvényben az első sor a $var nevű változóra ural. E sor végrehajtódáskor nem láthatja a korábban létrehozort $var válrozót, így létrehoz egy új, függvényszintű változót, és megjeleníti azt. Így jön létre a kimenet első sora. A függvényerr belüli következő sor a $var tartalmát

tartalom 2 -re állítja. Mivel függvényerr belül vagyunk, ez a sor

a helyi, nem pedig a globális $var értékét változtatja meg. A kimenet második sora tanúsítja, hogy a változtatás megrörtént. A függvény ezzel véget ért, így a kód utolsó sora hajtódik végre. Az itt lévő echo utasítás mutatja, hogy a globális változó értéke nem módosulr. Ha azt szerernénk, hogy egy függvényben létrehozott változó globális legyen, a global kulcsszór kell használnunk az aláb­ biak szerint:

102

5. fejezet

function fn () global $var; $var

{

"tartalom"; \$var ".$var."<br

echo "függvényen belül,

/>";

fn(); echo "függvényen kivül, \$var = ".$var."<br />";

Ebben a példában a $var változót kifejezetten globálisként definiáltuk, ami azt jelenti, hogy a függvény meghívása után a változó a függvényerr kivül is létezik. A kód kimenere a következő lesz:
függvényerr belül, függvényerr kivül, $var
=

tartalom

$var = tartalom

Ne feledjük, hogy a változó hatóköre a g lobal $var;

sor végrehajtása után kezdődik! A függvényt meghívása fölött és

alatt is deklarálhatjuk. (A függvények hatóköre egyáltalán nem úgy müködik, mint a változóké.) A függvény deklarálásának helye lényegtelen; ami számít, hogy hol hívjuk meg a függvényt, és ezáltal hol hajtjuk végre a benne levő kódot. A global kulcsszót azon kód elején is alkalmazhatjuk, ahol a változót először használjuk, hogy ezzel deklaráljuk: a válto­ zó hatóköre az egész kódra kiterjed. Ez a kulcsszó használatának talán leggyakoribb módja. Az előző példákból kiolvashattuk, hogy elméletileg semmilyen problémát nem okoz, hogy ugyanazt a változónevet függvé­ nyen belül és függvényen kivül, két különböző változónak adjuk. Azonban mégsem célszerű ezt tenni, mert kódunk gondos végigolvasása és a hatókör átgondolása nélkül mások azt feltételezhetik, hogy a két változó egy és ugyanaz.

Cím és érték szerinti paraméterátadás
Ha egy noveles () nevű, értéknövelő függvényre lenne szükségünk, elképzelhető, hogy a következöképpen próbálnánk megírni:
function noveles ($ertek, $mennyiseg
=

l)

{

$ertek = $ertek +$mennyiseg;

5

Ennek a kódnak semmilyen haszna nincsen, hiszen a következő példakód kimenere l O lesz:
$ertek
=

10;

noveles($ertek); echo $ertek;

Az $ertek értéke a hatókör szabályai rniatt nem változott. A fenti kód létrehoz egy $ertek nevű változót, amelynek értéke
10. Ezt követően meghívja a noveles () függvényt. A függvényen belüli $ertek változó a függvény meghívásakor jön létre.

A függvény hozzáad egyet, így az $ertek értéke a függvényen belül lllesz a függvény végéig; ezt követően visszatérünk a függ­ vényt meghívó kódhoz. Az ebben a kódban lévő $ertek egy másik, globális hatókörű változó, amelynek így nem változott az értéke. A probléma egyik lehetséges megoldása, ha globálisként deklaráljuk a függvényben az $ertek változót, de ez azt jelenti, hogy a függvény használatához a megnöveini kívánt változónak $ertek nevűnek kellene lennie. A függvényparaméterek meghívásának általános módja az értékszerinti paraméterátadás (pass by value). Paraméter átadása­ kor egy új, az áradott változó értékét tartalmazó változó jön létre. Ez az eredeti másolata. Tetszés szerint módosíthatjuk ennek értékér, de az eredeti, a függvényen kívüli változó értéke változadan marad. (Valójában ez enyhe leegyszerűsítése annak, amit a PHP ténylegesen végez.) Ennél jobb megközelítés azonban a címszerinti paraméterátadás (pass by reference). Ebben az esetben paraméterátadáskor a függvény - új változó létrehozása helyett - az eredeti változóra mutató hivatkozást kap. Ez a hivatkozás egy dollárjellel ( $ ) kezdődő változónévvel bír, és bármilyen más változóhoz hasonlóan használható. A különbség annyi, hogy saját értéke nem lévén pusztán hivatkozik az eredeti változóra. A hivatkozásen végrehajtott minden módosítás az eredeti változót is érinti. A cím szerinti paraméterátadáshoz és (&) jelet helyezünk a függvény definiálásakor a paraméter neve elé. A függvénymeghí­ vás ugyanúgy történik. Ha az előző noveles () függvényt úgy módosítjuk, hogy az egyik paraméterátadás cím szerint történik, máris hibátlanul müködik:
function noveles(&$ertek, $mennyiseg
=

l)

{

$ertek = $ertek +$mennyiseg;

Kód többszöri felhasználása és függvényírás

103

Immár működő függvényünk van,és a megnöveini kívánt változónak tetszés szerinri nevet adhatunk. Ahogy korábban em­ lítettük,zavaró lehet az emberek számára,ha ugyanazt a nevet használjuk függvényen belül és kívül, ezért adjunk a fö kódrész­ letben lévő változónak új nevet! A következő példakód a neveles () meghívása előtt 10-et, utána azonban ll-et ír ki:
$a =

10;

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

A r e t u r n kulcss2;ó has2;nálata
A return kulcsszó megállítja a függvény végrehajtását. Amikor egy függvény véget ér- vagy azért, mert minden benne lévő
utasítás végrehajtódott, vagy a return kulcsszó használata miatt-,a végrehajtás visszatér a függvényhívás utáni utasításra.

Ha meghívjuk a következő függvényt,csak az első
function teszt return

ech o utasítás hajtódik végre:

()

{

echo "Ez az utasitás végrehajtódik"; return; echo "Ez az utasitás soha nem fog végrehajtódni";

Nyilvánvalóan ez nem túl értelmes módja a return használatának. Normális esetben csak adott feltétel teljesülése esetén kívánunk a függvény közepén kilépni. Amikor például olyan függvényt írunk,amelyik meghatározza,hogy két szám közül melyik nagyobb,érdemes lehet kilépni, ha bármely szám hiányzik:
function nagyobb( $x, if ( $y )

{
két számra van szükség.";

(! isset($x)) l l

(! isset($y))) {

echo "Ehhez a return;

függvényhez

if ($x>=$y) echo $x."<br/">; else echo $y."<br/">;

5

Az isset() beépített függvény közli,hogy az adott változó létre lett-e hozva,illetve rendelkezik-e értékkel. A kód hiba­ üzenetet ad és visszatér, ha a paraméterek bármelyikéhez nem rendeltek értéket. Ezt az
1

isset () használatával ellenőrizzük,

amelynek jelentése,.NEM isset ();·így az if utasítás a következőképpen olvasható:,.ha x nem létezik, vagy y nem létezik:'

Ha ezek bármelyike teljesül,a függvény kilép. A
return utasítás végrehajtása esetén a függvényben utána következő sorok nem hajtódnak végre. A programvégrehajtás

visszatér a függvény meghívásának pontjára. Ha mindkét paraméter létezik,a függvény kiírja a kettő közül a nagyobbat. Az alábbi kód:
$a =

l;

$b =

2.5;
$b); $a); $a);

$c =

1.9;

nagyobb($a, nagyobb($c, nagyobb($d,

kímenete a következő:

2.5 1.9
Ehhez a függvényhez két számra van szükség.

Értékvisszaadás függvényekből
A return használatának nem a függvényekből való kilépés az egyetlen oka. Sok függvény return utasításokkal kommu­
nikál az őket meghívó kóddal. A nagyobb () függvény valamivel hasznosabb lenne, ha a benne lévő összehasonlítás eredmé­ nyének kiírása helyett a választ adná vissza. Ekkor a függvényt meghívó kód eldöntherné, hogy megjeleníti vagy felhasználja az eredményt, illetve hogyan teszi mindezt. Az ennek megfelelő max() beépített függvény is így működik.

104

5. fejezet

A nagyobb() függvényt a következöképpen is megírhatjuk:
function nagyobb($x, $y) { if ((!isset($x)) ll return false; else if ($x>=$y) return $x; else {!isset($y)))

{

return $y;

Itt a függvény a két átadoct érték közül a nagyobbat adja vissza. Hiba esetén nyilvánvalóan más értékkel tér vissza. Ha bár­ melyik szám hiányzik, visszatérési értéke hamis. (Ennél a megközeÜtésnél a függvényt meghívó programozónak=== operá­ torral kell ellenőriznie a visszaadott érték típusát, hogy a hamis értéker ne keverje össze a nullával.) Összehasonlításképpen: a max() beépített függvény semmit nem ad vissza, ha egyik változó sem létezik, ha pedig csak az egyik létezik, akkor azt adja vissza. Az alábbi kód:
$a = l; $b = 2.5; $c = 1.9; $b). '<br />'; echo nagyobb($a, echo nagyobb($c, echo nagyobb($d,

$a). '<br />'; $a). '<br />';

a következő kimenetet eredményezi, mivel a $d nem létezik, és a false nem látható:
2.5 1.9

Az olyan függvények, amelyek valamilyen feladatot végrehajtanak, de értéket nem kell visszaadniuk, gyakran true vagy
false visszatérési értékkel jelzik, hogy sikerült-e a feladatot végrehajtaniuk. A true és false, azaz igaz és hamis boole-i

érték az l, illetve O egész értékkel is jelképezhető, bár ezek más típusúak.

5

Rekurzió megvalósítása
A PHP támogatja a rekurzív függvényeket. Rekurzív függvényeknek az önmagukat meghívó függvényeket nevezzük. Különösen hasznosak az olyan dinamikus adatszerkezetekben való navigáláshoz, mint a láncolt lisrák és a fák. Mindazonáltal kevés webes alkalmazás igényel ilyen összetettségü adatszerkezetet, így kevés esetben fogjuk a rekurziónak hasznát venni. Sok esetben használharunk iteráció helyett rekurziót, mert mindkét folyamat lehetövé teszi, hogy ismétlődően hajtsunk végre valamit. A rekurzív függvények azonban lassabbak, és több memóriár használnak, mint az iteráció, ezért ahol csak lehetséges, érdemes ez utóbbi mellett dönteni. A teljesség kedvéért tekintsük át az 5.5 példakódban lévő, rövid példát!
5.5 példakód: rekurz i o. php
<?php

-

Karakterlánc megfordítása rekurzióval és iterációval

function fordit r($str) if (strlen($str)>0)

{ l));

{

fordit_r(substr($str,

echo substr($str, return;

0,

l);

function fordit i($str) for ($i=l;

{ $i++)

$i<=strlen($str); -$i,

{

echo substr($str,

l);

return;

Kód többszöri felhasználása és függvényírás

105

fordit r('Hello');

fordit_i('Hello');

Az 5.5 példakód két függvényt hoz létre. Mindkettő fordítva írja ki a neki áradott karakterláncot. A rekurzív, a A
fordit _i

ford i t_r

() függvény

() pedig iteraóv.

fordit_r()

függvény karakterláncot fogad paraméterként. Meghívásakor meghívja saját magát, minden egyes alkalom­

mal a karakterlánc másodiktól az utolsóig terjedő karaktereit átadva. Ha például a
fordit_r('Hello');

függvényt hívjuk meg. többször meghívja saját magát az alábbi paraméterekkel:
fordit_r('ello'); fordit_r('llo'); fordit_r (' lo'); fordit_r('o'); fordit_r('');

A függvény minden egyes saját meghívása a függvény kódjának újabb másolatát hozza létre a szerver memóriájában, minden esetben azonban más paraméterrel. Olyan, mintha azt tettetnénk, hogy minden alkalommal egy másik függvényt hívunk meg. Ezzel előzi meg. hogy a függvény példányai összekeveredhessenek. Minden meghívásnál teszteli az átadoct karakterlánc hosszát. Amikor elérjük a szering végét ( strlen ()==0), a feltétel nem teljesül. Ekkor a függvény legutolsó példánya

( fordit_r('') ) továbblép, és végrehajtja a következő kódsort, amely kiírja
fordit_r ('o')

a neki áradott karakterlánc első karakterét; jelen esetben nincs ilyen karakter, mivel a karakterlánc üres. Ezt követően ezen függvénypéldány visszaadja a vezérlése az őt meghívó példánynak, jelesen a nek. Ez kiírja a karakterláncának" "o -

függvény­

első karakterét, majd ez is visszaadja a vezérlése az őt meghívó példánynak.

A folyamat- egy karakter kiírása, majd visszatérés a meghívási sorrendben felette lévő függvénypéldányhoz- mindaddíg folytatódik, amíg a vezérlés vissza nem tér a fő programhoz. A rekurzív megoldások bizonyos szempontból nagyon elegánsak és matematikaiak. A legtöbb esetben azonban jobban járunk az iteratív megoldás választásával. Egy ilyennek a kódját is láthatjuk az 5.5 példakódban. Megfigyelhetjük, hogy nem hosszabb (bár ez nem minden esetre lesz igaz), és pontosan ugyanazt teszi. A legfontosabb különbség. hogy a rekurzív függvé­ nyek másolatot készítenek maguktól a memóriába, és több függvényhívással terhelik a szervert. Abban az esetben dönthetünk a rekurzív megoldás mellett, arnikor a kóclja sokkal rövidebb és elegánsabb, mint az iteraóv változaté, de ez az általunk készített alkalmazások esetén viszonylag ritkán fog előfordulni. Bár a rekurzió elegánsabbnak hat, a programozók gyakran elfelejtik megadni hozzá a záró feltételt. Ennek eredményeképpen a függvény a maximális végrehajtási idő eléréséig vagy a szerver memóriájának elfogyásáig ismédődik.

5

Névterek
A névtér (namespace) általánosságban azonosírók csoportját tartalmazó absztrakt tároló; PHP-ben ez azt jelenti, hogy a név­ terekben az általunk meghatározott függvényeket, állandókat és osztályokat tárolhatjuk. Rendezési és szervezési szempontból számos előnnyel jár, ha az általunk definiált függvényekhez és osztályokhoz névtereket hozunk létre: Az ugyanabban a névtérben lévő minden függvény, osztály és állandó előtagként automatikusan megkapja a névtér nevét. A nem minősített osztály-, függvény· és állandónevek feloldása futásidőben történik, és a keresés először a névtérben megy végbe, csak utána a globális térben. A névterek PHP-beli használatáról további információt, illetve gyakorlati példákat találunk a PHP kézikönyvének hrtp://www.php.net/language.namespaces címen elérhető részében.

További olvasnivaló
Az include(), require(),
function

és return utasítás használatát az online kézikönyv is részletesen bemutatja. Ha

szeretnénk mélyebben megismerni az olyan, több nyelvet érintő fogalmakat, mint a rekurzió, a cím és érték szerinti átadás vagy a hatókör, érdemes fellapozni egy jó általános informatikai szakkönyvet, például Paul Deitel és Harvey Deitel C++ How to
Program címü kiadványát

106

5. fejezet

Hogyan tovább:
Mivel már képesek vagyunk a kódunkat kezelhetőbbé és újrahasználhatóvá tevő fájlbeillesztésekkel és függvényekkel dolgozni, a következő fejezetben megismerkedünk az objektumorientált programozással, illetve annak PHP-beli támogatásávaL Objek­ tumok használatával az ebben a fejezetben bemutatott fogalmakhoz hasonló célokat érhetünk el, ám összetett projektek esetén az objektumok további előnyöket kínálnak számunkra.

5
_

J

6
Objektumorientált PHP
A fejezet az objektumorientált

(00) fejlesztés fogalmait ismerteti meg. illetve bemutatja PHP-beli megvalósításukat.

A PHP a teljes mértékben objektumorientált programozási nyelvektől elvárt minden ilyen funkciót nyújtani képes. Ahogy végighaladunk a fejezeten, e funkciók mindegyikét egyenként bemutatjuk. Az alábbi főbb témaköröket tárgyalj uk: Objektumorientált programozási fogalmak Osztályok, attribútumok és metódusok Osztálytulajdonságok Osztályon belüli konstansok Osztálymetódus hívása Öröklődés Hozzáférés-módosírók

Statikus metódusok Típusjelzés Késői statikus kötések Objektumklónozás Elvont osztályok Osztálytervezés Osztálytervünk megvalósírása Haladó objektumorientált funkciók

Ismerkedés az objektumorientált programozás fogalmaival
Amodern programozási nyelvek jellemzőerr támogatják, sőt akár meg is követelik a szoftverfejlesztés objektumorientált meg­ közelítését. Az objektumorientált programozás a rendszeren lévő objektumok osztályozásainak, kapcsolarainak és tulajdonsá­ gainak felhasználásával segíti a programfejlesztést, és teszi lehetövé a kód többszöri felhasználását.

Osztályok és objektumok
Objektumorientált programozásban objektum szinte bármilyen elem vagy fogalom lehet - fizikailag létező objektum, például asztal vagy ügyfél; vagy kizárólag szoftverben létező fogalmi objektum, például szövegbevireli terület vagy fájl. Általánosságban
az

olyan objektumok fognak bennünket leginkább érdekeini - legyenek azok valós világbeli vagy fogalmi objektumok-, ame­ Az objektumorientált programot önálló (se!f-contained), az elvárásainknak megfelelően viselkedő tulajdonságokkal és

lyeker valamiképpen jelképezni kell a programban. művelecekkel rendelkező objektumok halmazaként tervezzük meg és építjük fel. Az attribútumok (attribute) az objektummal kapcsolatban álló tulajdonságok vagy változók. A műveletek (operation) az objektum olyan metódusai, eljárásai vagy függvényei, amelyeket végrehajtva az objektum képes saját magát módosítani vagy valamilyen külső hatást elérni. (Az attribútum kifejezés­ sel egyenértékű a tagváltozó és a tulajdonság, a művelet kifejezéssel pedig a metódus.) Az objektumorientált programozás egyik legfőbb előnye a zártság (encapsulacion) támogatása és ösztönzése. (Adatrejtésként (data hiding) is szokás hivatkozni erre az elvre.) Ez lényegében annyit tesz, hogy egy objektumorr belüli adathoz csak az objek­ tum művelecein, más szóval interfészén (interface) kereszrül lehet hozzáférni. Bármely objektum működése az általa használt adatokra korlátozódik. Az objektum megvalósírását szabályozó részletek módosításával egyszerűen növelhecjük a teljesítményt, adhatunk programunkhoz új funkciókat, vagy végezhecjük el például a hibakeresést - s mindez az interfész megváltoztatása nélkül is lehetséges. Az interfész megváltoztatása az egész projekten végig-

108

6.

fejezer

gyűrűző hatást válchar ki, de a zárrság elve garanrálja, hogy a projekt többi részér érinredenül hagyva hajtsuk végre válroztatá­ sainkar, és kijavítsuk hibáinkar. A szofrverfejleszrés egyéb terülerein az objektumorientált programozás az alap - a procedurális vagy strukrurálr program elavulrnak tekinrett. A webes kódok nagy részét azonban még mindig a strukturált módszerrant követő ad hoc megközelítéssel tervezik és írják. Számos oka van ezen megközelítés használatának. A webes projektek nagy része viszonylag kicsi és egyszerű. Mindennemű tervezés nélkül foghatjuk a fűrészt, és elkészírhetünk egy fa fűszertartót, és kis méretükből adódóan ugyanilyen sikeresen be­ fejezhetjük a webes programozási feladataink többségét is. Ha azonban megragadjuk a fűrészt, majd minden előzetes tervezés nélküli megpróbálunk felépíteni egy házat, minden bizonnyal gyatra végeredménnyel zárjuk a munkát, már ha egyáltalán bár­ milyen végeredményről beszélhetünk. Ugyanez igaz a nagy szofrverprojektekre is. Sok olyan webes projektről rudunk, amely egymásra mutató oldalak halmazából fejlődött komplex alkalmazássá. Az ösz­ szetett alkalmazások - mindegy, hogy párbeszédablakokon vagy dinamikusan előállított HTML oldalakon keresztül tekintjük meg őket - kellően átgondolt fejlesztési módszert igényelnek. Az objekrumorientált programozással könnyebben kezelhetjük az összetett projekteket, elősegíti kódjaink többszöri felhasználhatóságát, és ezáltal programjaink működtetési költségei is csökkenrhetők. Objektumorienrált programozás esetén az objekrum eltárolt adatok és az azokon az adarokon működő műveletek egyedi és azonosítható gyűjteménye. Lehet, például, a gombokat jelképező két objekrumunk. Még ha mindkettőnek OK is a felirata, 60 képpont szélesek és 20 képpont magasak, és minden más tulajdonságuk is megegyezik, akkor is tudnunk kell kezelni őket. Programozáskor külön változók működnek az objektumok kezelőjekéne (handle), vagyis egyedi azonosítójakénr. Az objektumok osztályokba csoporrosírhatók. Az osztályok egyenként eltérő, ám valamilyen szempontból egyforma objektu­ mok csoportját jelképezik. Egy adott osztály olyan objektumokat tarralmaz, amelyek ugyanúgy működő, egyforma műveletekkel és ugyanazt jelentő, egyforma tulajdonságokkal rendelkeznek, noha e tulajdonságok ércékei objekrumonként eitérők tehernek. Gondoljunk a bicikli főnévre a közös funkciókkal vagy tulajdonságokkal (például két kerék, szín és méret) és műveletekkel (például mozgás) rendelkező, különböző kerékpárokat leíró objektumok osztályaként l A szerző biciklijére gondolhatunk úgy, mint egy, a bicikli osztályba illő objektumra. Rendelkezik az összes biciklire jellemző, közös funkciókkal, köztük a moz­ gás művelettel, amely a többi bicikli mozgásához hasonlóan működik - csak éppen a többi biciklinél talán kicsit ritkábban. Ennek a bringának a tulajdonságai egyedi érrékekkel rendelkeznek, merr a bicikli zöld, és nem mindegyik kerékpár ilyen színű.

Tóbbalakúság

6

Az objektumorientált programozási nyelveknek támogarniuk kell a többalakúságot (polymorphism), ami azt jelenti, hogy a kü­ lönböző osztályok eltérő viselkedésekkel rendelkezhetnek ugyanarra a műveletre. Ha például a bicikli osztály mellett autó osz­ tályunk is van, mindkettőnek kell, hogy legyen a másiktól eltérő mozgás művelete. Valós objektumok esetén ez aligha okozhat problémát. A biciklik nem valószínű, hogy összezavarodnak, és egy autó mozgás műveletével próbálnak meg elindulni. Progra­ mozási nyelvben azonban nem mindig számíthatunk a valós világ józan eszére, így a nyelvnek támogatnia kell a többalakúságot, hogy tudjuk, mely mozgás műveletet alkalmazzuk egy adott objekrumon. A többalakúság jellemzőbb a viselkedésekre, mint az objekrumokra. PHP-ben csak az osztály tagfüggvényei leheenek többalakúak. Egy valós világból vett példa erre az emberi nyelv igéi, amelyek ilyen szempontból a tagfűggvények megfelelői. Gondoljuk végig, a valóságban mit tehetünk egy kerékpárral l Sok egyéb mellett takarírhatjuk, mozgarhatjuk, szétszerelhetjük, megjavírhatjuk vagy lefesrhetjük. Ezek az igék általános cselekedeteket írnak le, mert nem tudjuk, hogy milyen típusú objektumra alkalmazzuk őket. (Az ob­ jektumok és műveletek ilyen típusú absztrakciója az emberi intelligencia egyik megkülönböztető eleme.) Egy kerékpár mozga­ tása például teljesen másmilyen műveleteket igényel, mint egy autó mozgatása, bár ezek alapjaikban egyező fogalmak. A mozgat ige csak akkor társítható konkrét műveletekkel, ha tudjuk, hogy milyen objektumon kívánjuk alkalmazni.

Öröklődés
Az öröklődés (inheritance) lehetövé teszi, hogy a/osztályok (subclass) használatával hierarchikus kapcsolatot hozzunk létre osztályok között. Az alosztály örökli az alaposztály (superclass) tulajdonságait és műveleteit. Az autónak és a biciklinek vannak közös vonásai. Például egy jármű nevű osztályban tárolhatjuk azokat a dolgokat, amelyekkel núnden jármű rendelkezik (példá­ ul szín, tulajdonság és mozgás művelet), majd az autó és a bicikli osztályt örökíthetjük a járműbőL Az alosztály, a származtatott osztály (clerived class) és a gyerek (child) kifejezés ugyanazt jelenti. Hasonlóképpen az alaposz­ tály és aszülő (parent) jelentése is megegyezik.

az osztálynak attribútumokra és metódusokra van szüksége. mint például az attribúrumok megfelelő kiinduló értékre állítása vagy az objektum által megkövetelt egyéb objektumok létrehozása. mert nem minden jármű autó. A következő kód az osztalynev nevű osz­ tályt hozza létre két attribútummal. Metódusokat úgy hozhatunk létre. Az öröklődéssei munkát takaríthatunk meg azáltal. hogy használható legyen. hogy objektum létrehozásakor automatikusan meghívócljék. Így az autó örökíthető a jár­ műbőL Osztályok. Ezt a fejezet későbbi részében részletesen áttekingük. hogy az osztálydefiníción belül függvényeket deklarálunk. illetve kiegészíthetjük azokat. de"A jármű egy autó:' nem. A konstruktort ugyanúgy deklaráljuk. Egy egyszerű alaposztályból összetettebb és specializáltabb osztályokat származtathatunk. ami az objektumorientált megközelítés egyik legfőbb előnye. amelynek neve konstruktor (létrehozó függvény). Osztályszerkezet A legegyszerűbb osztálydefiníció így néz ki: class osztalynev Ahhoz. A valós világbeli kapcsolatok pontosabb modellezését is lehetövé teszi. Attribútumokat úgy hozha­ runk létre. Konstruktort hívunk meg az osztály objektumainak létrehozására. két metódust tartalmazó osztályt hozunk létre. a class kulcsszót használjuk. és a konsttuktor általában elvégzi az olyan hasznos inicializálási feladatokat. Ha bármely két osztály esetében értelmes a". ha szükségünk van rájuk. Az alábbi kóddal egy osztalynev nevű. mint bármelyik másik metódust. a metodus2 () viszont kettőt is: class osztalynev fu nction metodusl() function metodus2($paraml. A következő kód konstruktorral bíró osztályt deklarál: class osztalynev function con struct($param) .. • Az autó egy jármű:' mondat értelmes. A metodusl() nem vár paramétert. ám különleges neve van:_const ruct (). hogy az osztálydefiníción belül a láthatóságuknak megfelelő kulcsszavakkal (public.. Ez a lehetőség még inkább újrafelhasználhatóvá teszi kódunkat. és így nem kell az egyes alosztályokkal egyenként bíbelődni. public $attributum2. $param2) Konstruktorok A legtöbb osztály rendelkezik egy különleges típusú metódussal. egy .. private vagy protected ) változókat deklarálunk." mondat.. amelynek metódusai semmit nem csinálnak. akkor az öröklődésnek minden bizonnyal van légogosultsága .Objektumorientált PHP 109 Öröklődéssei építherünk meglévő osztályokra. hogy a műveleteket elegendő egy alaposztályban egyszer megírni. attribútumok és metódusok létrehozása PHP�ben Ez idáig igen elvont módon tárgyaltunk az osztályokróL Amikor PHP-ben létrehozunk egyet.Bár a konstruktort saját kezűleg is meghívhaguk.$attributuml és $attributum2: class osztalynev public $attributuml. fő célja.

$param. new osztalynev(). A példában nincsen korlátozva az attribútumokhoz való hozzáférés. Els6 Mivel a konstruktor minden objektumlétrehozáskor meghívódik. A következő kód egy osztályon belüli változó beállítását és elérését mutatja be: class osztalynev public Stulajdonsag. meg kell határoz­ nunk. Osztálypéldányok létrehozása Az osztály deklarálása után objektumot . illetve meg kell adnunk a konstruktor által várt paramétereket. function metodus($param) Sthis->tulajdonsag $param = echo Sthis->tulajdonsag. Destruktorok A konstruktor ellentéte a destruktor.hozzáférés-módosítók határozzák meg. a PHP azonban nem. konstruktorral rendelkező osztályt deklarálja. A következő kód az osztalynev nevü. A függvények többszörös definiálása (function overloading) azt jelenti."<br />". azt a ."<br />".) A fejezet egy későbbi részében még lesz szó erről. new osztalynev("Második"). ami automatikusan bekövetkezik.kell létrehozni ahhoz. hogy egynél több ugyanolyan nevü és különbözö számú vagy típusú paraméterrel rendelkező függvényt megadhatunk. hogy az objektum melyik osztály példánya lesz. Hogy egy attribútumot az osztályon kívülről is elérhetünk-e. különleges mutatóval rendelkezünk. majd létrehoz három osztalynev típusú objektumot: class osztalynev function echo construct($param) ". a fenti kód a következő kimenetet állítja elő: 6 A konstruktort meghívtuk az alábbi paraméterrel: A konstruktort meghívtuk az alábbi paraméterrel: A konstruktort meghívtuk az alábbi paraméterrel: Második Osztályattribútumok használata Az osztályokon belül egy $this nevü. amikor egy osztályra mutató összes hivatkozást megszüntetünk. fejezet echo "A konstruktort meghívtuk az alábbi paraméterrel: ". "A konstruktort meghívtuk az alábbi paraméterrel: Sa $b Sc new osztalynev("Els6"). akkor e változó beállításakor vagy az osztályon belüli müveletböl való elérésekor a Sthis->tulajdonsag formában hivatkozhatunk rá. vagy azok kiesnek a hatókörbőL A konstruktorok elnevezéséhez hasonlóan kell a destruktorokat is elnevezni:_ destruct ().11O 6.fejezet egy későbbi részében részletesen bemutatandó . Paraméterük nem lehet. hogy bizonyos funkciók végbemenjenek közvetlenül egy osztály megsem­ misítése előtt. Objektumot a new kulcsszóval lehet létrehozni.az osztály egy konkrét tagját . Ezt osztálypéldány létrehozásának nevezik. Lehetövé teszi. (Ezt a funkciót sok objektumorientált nyelv támogatja. hogy dolgozhassunk vele. Amikor ezt tesszük. Ha aktuális osztályunk valamely attribúturnát $tulajdonsag-nak nevezik. így a következö­ képpen az osztályon kívülről is elérhetjük öket: .$param.

hogy értelmes adatot tárolunk. a $nev-et. .különleges jelentéssei bírnak PHP-ben. $ertek) && módosítani: function if ( ($nev="tulajdonsag") ($ertek >= 0) && ($ertek <= 100) ) $this->tulajdonsag = $ertek. hogy visszatérjen az értékkel. De akkor hogyan működnekr Ha létrehozzuk az osztály egy példányát: $a = new osztalynev(). de az elérő függvények létre­ hozásának egyszerű oka van: használatukkor egyetlen kódrészlet van. $a->tulajdonsag = "ertek". azok a következőképpen nézhetnek ki: class osztalynev public $tulajdonsag.. A mi dolgunk megírni a_get() függvényt úgy. mielőtt engedélyeznénk a változtatásokat. illetve beállíthatjuk artribútumai értékér. hogy a_get() egy paramétert fogad.. Jelenlegi formájában ez talán igaz is. echo $a->tulajdonsag.Objektumorientált PHP lll class osztalynev public $tulajdonsag. Az objektumorientált megközelítés egyik előnye. ez 6 ' a kifejezés áttételesen meghhja a_set() függvényt. Ha beírjuk a következőket: $a->$tulajdonsag = 5. amit rendelni kívánunk hozzá. áttételesen meghívja a_get() függvényt. csak egyszer kell néhány sort hozzáadni és ellenőrizni. hogy kikényszeríti a zártság elvének betartását. hogy megváltoztatjuk a $tula jdonsag tárolási módját. az $ertek értékét pedig 5-re A _get() függvény hasonlóan működik. ami az adott attribútumhoz hozzáfér. A_set () függvényt kellene a következőképpen set ($nev. hogy a $tulajdonsag értéke csak O és 100 között lehet. Ha egy osztály attribútumainak közvetlen elérése helyett elérő függvényeket (accessor function) írunk. Ha később eszünkbe jut.az attribútum nevét-. a hozzáféréseket egyetlen kódrészen keresztül biztosíthatjuk. annak $nev paraméterér. Figyeljük meg. Ezt a_get és a_set függvény használatával érhetjük el. Amikor először megírjuk elérő függvényeinket. Ezeket a függvényeket nem közvetlenül hívjuk meg. $ertek) $this->$nev = A fenti kód egyszerű függvényeket ad a $tulajdonsag nevü attribútum elérésére. A kivánt hibaellenőrzéshez meg kell írnunk a_set() függvényt. hogy. function get($nev) return $this->$nev. a_get() és a_set() függvénnyel ellenőrizhetjük. A nevük előtti dupla alulvonás jelzi. és az attribútum értékével tér vissza! A_set() függvény ugyanakkor két paramétert vár: az attribútum nevét és az értéket. function set ($nev.tulajdonsag"-ra állítva. Egyeden hozzáférési pont esetén érvényességí ellenőrzések megvalósításával megbizonyosodhatunk arról. Kódunkban az alábbi kifejezés: $a->tulajdonsag állítva. $ertek. és csak egyetlen helyen kell kódunkat módosítani. a hozzáférési függvények lehetövé teszik ezt. Első ránézésre ez a kód nem sok értékkel bír számunkra. Általában nem célszerű a tulajdonságokhoz osztályon kívülről közvetlenül hozzáférni. Egyeden hozzáférési ponton meg tudjuk változtaeni a mögöttes megvalósítást.a_ construct()és a_ destruct () függvényhez hasonlóan. a_set() pedig új értéket rendel a $tulajdonsag-hoz. Ha bármilyen okból úgy döntünk. A_get() nevű függvény egyszerűen a $tulajdonsag értékét aclja vissza. $a = new osztalynev().tulajdonsagra"-ra.

Egyelőre úgy képzeljük el a protected módosítót. A PHP a következő három hozzáférés-módosítót támogatja: Az alapértelmezett opció a public (nyilvános).$a nevű objekrumot: $a = new osztalynev(). ha azok csak az osztályon belül használandó segédfüggvények. akkor minden attribúrumra alkalmazhatjuk. illetve az általunk el­ várt függvényeket zárójelbe helyezve. Mivel ezek a műveletek a hagyományos függvényeknél jobban kapcsolódnak egy adott .hogy a leíró függvényeket úgy változtatjuk.kiszámírjuk akruális értékér minden egyes alkalommal. egyszerűen módosíthatjuk az elérő függvényeket. Osztálymetódusok hívása Az osztálymetódusokat az oszrályattribúrumok hívásához igen hasonló módon hívhatjuk meg. $ertek) $this->$nev = $ertek. Ezt követően ugyanúgy hívhatjuk meg a metódusokat.hogy ha nem harározunk meg hozzáférés-módosírót egy attribúrumhoz vagy metódushoz.vagy kisebb adattípusként kódoljuk az adatot. hogy az általa megjelölt elem csak az osztályon belülről ér­ hető el. A public hozzáférés-módosítóval rendelkező elemek osztályon belül­ ről és kívülről is elérhetők.ami azt jelenti. minr ami a private és a public közört félúron helyezkedik el! Az alábbi példakód a public hozzáférés-módosító használatát muratja be: class osztalynev public $tulajdonsag. Ha nem hasz­ nálunk _get() és_set ( ) függvényt.és metódusdeklarációk elé írva szabályozzák az attribúrumok és metódusok láthatóságát. mert ez az alapértelmezett lehetőség. hogy az adott elem csak az osztályon belülről érhető el. $param2) és az alábbiakkal létrehozunk egy osztalynev rípusú. fejezer Dönehetünk úgy. más attribúrumok értékeiből származtatjuk az értékér. public function _get($nev) return $this->$nev. A kód többi részér ez nem érinti. hogy van egy ilyen osztályunk: class osztalynev function metodusl() function metodus2($paraml. A protected (védett) hozzáférés-módosító azt eredményezi. az öröklődéssei foglalkozó részében). Hozzáférés#szabályozás p r i v a t e és p ub l i c kulcsszóval A PHP hozzáférés-módosírókar használ. hogy belső vagy nyilvános. mint bármilyen más függvényeket: nevükkel.ám használata egyéb módosítók alkalmazása esetén könnyebben olvashatóvá teszi a kódot. Tegyük fel.hogy a $tulajdonsag változóként történő tárolása helyett adarbázisból keressük vissza akkor. A public kulcsszó elhagyható. public function set ($nev. akkor az public lesz. Ezek az elemek nem öröklődnek (a fejezet egy későbbi részében erre még részletesebben visszatérünk). hogy a program többi része által elvárt módon érik el vagy adják vissza az adatokat. Alosztályokban is lérezik (ehhez is visszatérünk majd a fejezer későbbi. A private (belső) hozzáférés-módosító azt jelenti. Ezeket az attribúrum. amikor szükségünk van rá.112 6. Döntherünk úgy is. 6 Ebben minden osztályrag hozzáférés-módosítóval van ellárva. Akármilyen változtatás mellett dönrünk.feltéve persze. amikor szükségünk van rá.jelezvén. hogy egyes metó­ dusokat priva te módosítóval lárunk el.

Fontos megemlíteni. Tekintsük át az alábbi példát: <?php class A . Öröklődés megvalósítása PHP�ben Amennyiben az osztályt egy másik alosztályává kívánjuk tenni. A védett (protected) attribútumok és metódusok az osztályon kívül nem lesznek láthatók (akárcsak a pr i va te elemek). más néven gyerek örökli a szülö vagy az alaposztály funkcióit. "teszt"). $a->metodus2(12. $b->metodus1(). A következő kód egy B nevű osztályt hoz létre. $a->attributum2 = 10. amely egy korábban definiált. hogy ezeket az A osztályban deklaráltuk. Sy= $a->metodus2(12. Az A osztálynak nincsen sem metodus2 () metódusa. hogy mi öröklődik. de a szülő nem örökli a gyerekéit. nem fog öröklődni. $a->metodus2(). function metodus2() Amennyiben az A osztályt a következőképpen deklaráltuk: class A public $attributum1. annak ellenére hivatkozhatunk metodusl () metódusra és $attributum1 l 6 attribútumra. $b->attributum2 = 10. Ebből az következik.minthogy az A alosztálya. $a->attributum1 = 10. hogy melyik objektumhoz tartoznak. a B ugyanazokkal a funk­ ciókkal és adatokkal rendelkezik! Ezeken túlmenően a B osztályhoz egy saját tulajdonságot és egy saját metódust is deklarál­ runk. például így: $a->metodus1(). amelyhez private módosító lett rendelve. $b->attributum1 = 10. mint egy objektumattribútumot. Az alosztály. function metodus1() akkor az alábbi. a következőképpen kaphatjuk el ezeket az adatokat: $x = $a->metodus1(). $b->metodus2(). Láthatóság szabályozása öröklődés esetén a p r i v a t e és a p r o t e c t e d kulcsszóval A pri vat e és a protected kulcsszóval szabályozhatj uk. Az olyan attribútum vagy metódus. A nevű osztályból származik: class B extends A public $attributum2. az extends kulcsszó segítségével érhetjük ezt el. meg kell határoznunk. Sa->metodusl (). de örök/ödnek. egy $b = new B típusú objektum metódusaihoz és attribútumaihoz való hozzáférések mind érvényesek lennének: B(). Amennyiben a műveleteknek van visszatérési értéke. Az objektum nevét ugyanúgy használjuk. hogy az öröklődés csak egy irányba működik. hogy mivel a B osztályt az A-ból származtattuk. hogy az alábbi kód utolsó két sora hibás: $a = new A(). Ne feledjük. "teszt").Objektumorientált PHP 113 objektumhoz. sem attributum2 tulajdonsága.

114 6. fejezet private function metodusl() echo "metodusl meghívva". A B konstruktorában megpróbáljuk a műveleteket a szülőből meghívni. $this->metodus3(). public function metodus3() echo "metodus3 meghívva". Az alábbi sor: $this->metodusl(). mert a müveletet nyilvánosként deklaráltuk. védett és belső típusút. Így az alosztály adott attribútumaihoz az alaposztályban lévő ugyanezen attribútumok alapértelmezett értékétől eltérő értékeket rendelhetünk. Ha megkíséreljük a fájl végéhez az alábbi sort hozzáadni: $b->metodus2(). A protected függvény öröklődik. ám csak a gyermekosztályon belülről használható. $b ?> = new B. hogy a belső metódusokat gyerekosztályból nem lehet meghívni. 'B' osztályból) A fenti függvényhívás azért lehetséges. amely új attribútumokat és metódusokat deklarált. végzetes hibát eredményez: Fatal error: Call to (Végzetes hiba: Az A: private method A: :metodusl ()from context 'B' 'B' osztályból) :metodusl () private metódus meghívása a 6 A példa azt szemlélteti. ahogy azt a példában is tettük. A B az A-ból öröklődik. a másik két függvényhívás működni fog. Tegyük fel példáuL hogy van egy A osztályunk: class A $tulajdonsag "alapértelmezett érték". A fenti kód háromféle műveletet hoz létre az A osztályban: public. Felülírás A fejezetben láttunk már olyan alosztályt. Ugyanazokat az attribútumokat és metódusokat lehetséges és esetenként hasznos is újradeklarálni. public . azaz nyilvános. class B extends A construct() function $this->metodusl(). protected function metodus2() echo "metodus2 meghívva". Ezt az eljárást Jelülírásnak ( overriding) nevezik. vagy az alosztály metódusainak az alap­ osztály megfelelő metódusaitól eltérő funkcionalitást adhatunk. $this->metodus2(). Ha megjegyzésként kiemeljük ezt a sort. protected és private. a következő hibaüzenetet kapjuk: Fatal error: Call to protected method A::metodus2 () from context (végzetes hiba: Az A: :metodusl () protected metódus meghívása a 'B' A metodus3 () metódust azonban az osztályon kívülről meghívhatjuk: $b->muvelet3().

és meghívják metodus ( ) függvényét. a PHP az aktuális osztály tulajdonság­ értékeit használja. $b -> metodus()."<br />". a követ­ kező B osztályt hozhatjuk létre. Ezért az alábbi kimenetet kapjuk: Valami A $tulajdonsag értéke: más érték Az öröklődés több réteg mélységű lehet. az attribúrumok vagy metó­ dusok alaposztálybeli felülírása sincsen rá hatással. más végeredmény­ hez jurunk. A parent kulcsszó lehetövé teszi. echo " A \$tulajdonsag értéke: " $this->tulajdonsag. amely így a B osztály és az ő szülője. hogy a metódusnak a szülőosztályban lévő eredeti változatát hívjuk meg. echo "A \$tulajdonsag értéke: " $this->tulajdonsag. Tanulmányozzuk most az alábbi két kódsort: Sa = new A(). Az így előállt kimenet azonban eltérő. $a -> metodus(). A C osztályban megint eldönthetjük. az A osztály funkcióit. Ha cserét definiálunk. Bár a szülőosztályból hívjuk meg a metódust. amely felülírja a $tulajdonsag attribútumot és a metodus() metódust: class B extends A publ i c $tulajdonsag function metodus() echo "Valami más<br />". ha lecseréljük azokat. Öröklődés és felülírás megakadályozása a final kulcsszóval Rendelkezésünkre áll a PHP-ben a final kulcsszó is.Objektumorientált PHP 115 function metodus() echo "Valami<br />". A következőképpen adhatjuk az előző példában szereplő A osztályhoz: class A publ ic $tulajdonsa g "alapértelmezett érték". a B-ből származtatott osztályt."<br />". A B deklarálása nincs hatással az A eredeti deliníciójára. metódusait örökli. és felülírja az eredeti definíciót. kivéve. Amennyiben szeretnénk megváltoztaeni a $tulajdonsag értékét és új funkeiét adni a metodus () metódusnak. Amikor függvénydeklarálás elé helyezzük. a függvény egyeden alosztály­ ban sem írható felül. = final function metodus() . Például az A: 6 :metodus B osztályon belülről való meghívásához az alábbi kódot használnánk: parent: :metodus(). Deklarálharunk egy C nevű. E sorok egy A típusú objektumot hoznak létre. "más érték". Egy alosztály alaposztálya minden amibúrurnát és metódusát örökli. hogy B létrehozása nem változtatta meg A-t. Ennek a kódnak: $b = new B(). a kimenete: Valami más A Stulajdonsag értéke: más érték l" Miképpen egy alosztályban létrehozott új attribútum vagy metódus nem érinti az alaposztályt. hogy a szülők mely attribútu­ mait és metódusait kívánjuk felülírni és lecserélni. Ennek kimenete: Valami A $tulajdonsag értéke: alapértelmezett érték bizonyítja. az elsőbbséget élvez. Amennyiben létrehozunk egy B típusú objektumot.

nem. amely viszont az A osztályból öröklődik. Az interfészekre a többszörös öröklődés áthidaló megoldásaként tekinthetünk. Mindegyik osztály legfeljebb egy szülővel rendelke­ B zik. B és C nevű osztály öröklődésének három lehetséges módját mutatva segít tisztává tenni a képet. amelyeknek képeseknek kell lenniük önmaguk megjelení­ tésére. vagyis többszörös öröklődéssei állunk szemben. . hogy olyan osztályok csoporgát hozzuk létre. Mindegyik osz­ tály legfeljebb egy szülővel rendelkezik. Ebben az esetben a C osztály két szülővel bír. így ez szabályos. echo "A \$tulajdonsag értéke: Ezzel a megközelítéssel elkerülhető a me tod us () művelet hibaüzenetet kapjuk: Fatal error: B osztálybeli felülírása. így ez egy PHP-ben teljesen szabályos.a többséggel egyetemben . hogy egy szülő hány gyerekosztállyai rendelkezhet. Ahelyett. egyszeres öröklődés. hogy létrehoznánk egy megjelenites() függvénnyel rendelkező alaposztályc. A jobboldalt lévő kombinációban a C osztály az A és osztályból öröklődik. Például úgy döntünk. a következöképpen valósíthaljuk meg az interfészt: interfé­ szeken (interface) keresztül tehetjük ezt meg. hasonlóan a többi objektumorientált nyelv.1 ábra: A PHP nem támogatja a többszörös öröklődést. az alábbi Cannot override final method A::metodus() Az A::metodus () final metódus nem felülírható) (Végzetes hiba: A final kulcsszó használatával azt is megakadályozhatjuk. A bal oldali kombinációban a C osztály a A középső kombinációban a B B osztályból származik.. fejezet echo "Valami<br />". amelyből az osztályok örök­ lődnek. Ez így elsőre talán nem teljesen világos. hogy núnden osztály csak egyeden szülőtől származtatható. Egyszeres öröklódés Tóbbszörös öröklód és 6 Egyszeres öröklődés 6. de a PHP . Interfészek megvalósítása Amennyiben többszörös öröklődés példányaiban látott funkcionalitást kell megvalósítanunk (kifejtenünk) PHP-ben.1 ábra az A. hogy az interfészt alkotó osztályokban megvalósítandó metódusok halmazár hozzuk létre. hogy egy osztályból alosztályokat származtassanak. a következőhöz hasonló hibaüzenetet kapunk: Fatal error: Class B may not inherit from final class (A) (Végzetes hiba: A B osztály nem örökíthető final osztályból (A)) A többszörös öröklődés Néhány objektumorientált programozási nyelv (mindenekelőtt a C++ és a Smalltalk) támogatja a többszörös öröklődést. egyszeres öröklődés. ami PHP-ben nem érvényes. Ez azt jelenti. l Ha ezt követően megpróbálunk az A osztályból örökíteni.116 6. és C osztály az A osztályból öröklődik. Ha megkíséreljük a felülírást. de a 6. " $this->tulajdonsag."<br />". . A követke­ zőképpen teheljük ezt meg: final class A { . Az interfész alapgondolata az. Arra vonatkozóan viszont nincsen korlátozás. és felülírják az öröklött elemeket. köztük a Java által támogatott interfészmegoldáshoz.

Az osztály elsődleges célja. olyan intelligens funkciókat is hozzáadhatunk. míg a mindenhol egységesen megjelenő elemeket automatikusan kell. Az aktuálisan megjelenített oldal felismerése és a navigációs elemek ennek megfelelő módosítása (a nyitóoldalon nincs értelme a nyitóoldalra mutató gombot elhelyezni). Az Oldal nevű osztály deklará­ lásához írjuk be a következőket: . érdemes megvizsgálni. hibakezelés. hogyan lehet használható osztályokat tervezni.anélkül. végzetes hiba követ­ kezik be. mint a cím vagy a metaadatok. hogy hogyan nézzen ki kódunk kimenete. A webfejlesztés során használt osztályok közé weblapok. hogy az alkotás szabadságát bármiben korlátozná. • • Az osztály kódjának megírása Azt már eldöntöttük. a változtatást csak egyetlen helyen kelljen végrehajtanunk. nevezzük Oldal-nak. hiszen a webOldal osztály örökölhet egy osztályból. Azaz. lehes­ sen egyéni értékeket beállítani az olyan elemekhez.Objektumorientált PHP 117 interface Megjelenitheto function megjelenites(). termékkategóriák vagy vásárlók tartozhatnak. hogy a honlap különböző tartalmainak megfelelőerr tudjuk módosítani ezeket az oldalakat. Mivel oldalt jelképez. nem pedig statikus HTML kódból generáljuk mint például: • az oldalt. Osztálytervezés Most. A János által megvásárolt minden cikket egy-egy objektum jelképez. Egyelőre összpontosítsuk figyelmünket az objektumorientált PHP-programozásra vonatkozó részekre! Az osztálynevet logikusan kell kiválasztanunk. vagy még egy gombot kívánunk az oldalakhoz adni. hogy nagy projektek esetén hogyan megy a tervezés és a projektmenedzsment. Osztályokkal és a számunkra rengeteg időt megtakarítani képes öröklődéssei ugyanennek a honlapnak fejlettebb változatát is elő tudjuk állítani. online bevásárlókosarak. egy adott gombot vagy az adott időpontban Kovács János bevásárlókosarát. Adott oldalakon az állandó elemek lecserélésének lehetősége. és szükség esetén bármelyik elemet tudjuk módosítani. hogy előállítsa. Mivel programból. illetve a PHP-beli megvalósí­ tásukhoz szükséges szintaktikával. Ha például másmilyen navigációs gombokat szetetnénk elhelyezni a honlap egy adott részén. Kovács urat pedig egy vasa rlo tÍpusú objektum jelké­ pezheti. és megvalósíthat egy vagy több interfészt. Kódunk számos osztálya a valós világ objektumainak osztályait vagy kategóriáit fogja jelképezni. Az előző fejezetben egyszerű fájlbeillesztéssei értük el a képzeletbeli TLA Consuiting cég honlapjának egységes megjelené­ sét. ha átírjuk a szerzői jogi nyilatkozatot. Ha nem fejtjük ki az interfészben meghatározott metódusokat ( jelen esetben a Megjelenites ()-t). és rnilyen funkciókat tudjon. hogy tegye az oldalról oldalra változó részek módosítását. Lehetövé kell. kezelőfelületi komponensek. class webOldal implements Megjelenitheto { function megjelenites() ll o o o Ez a példa jól szernlélteti egy. hogy mérsékelje egy új oldal létrehozásához szükséges HTML kód mennyiségét. hogy gyorsan tudjunk ugyanúgy kinéző és működő oldalakat létrehozni a TLA számára. de hogyan valósítsuk meg? A könyv későbbi részében áttekintjük. a többszörös öröklődés hiányát áthidaló megoldást. akkor le tudjuk cserélni az állandó elemeket. Oldalelemek egyetlen helyen történő módosításának lehetősége. hogy már tisztába kerültünk az objektumok és osztályok mögötti fogalmak némelyikével.például a nyitóoldalt. amelyek valamely kategóriába vagy osztályba tartoz­ nak. A példa kedvéért létrehozunk egy Oldal nevű osztályt. Képesnek kell lennünk arra is. Célunk most az. A kódban szereplő objektumok az előbb említett osztályok konkrét példányait jelképezik majd . Az osztálynak rugalmas keretrendszert kell l 6 nyújtania új oldalak létrehozására . Az oldal legtöbb részének legyen alapértelmezett tartalma.

Az üzleti célú weboldalak metacímeket (mecatag) tartalmaznak. Súrnos okunk volt azonban elkülönítésükre. $this -> MegjelenitesFejlec(). Példánkban az oldalról oldalra változó elemeket fogjuk osztálytulajdonságok­ ként beállítani. $this -> MegjelenitesLablec().nem tartalmaz hibaellenőrzés c. Eze a címer minden bizonnyal meg fogjuk válroztacni. $tartalom-nak nevez­ zük. hogy hasznosak legyenek. amely HTML címkék (rag) és szöveg kombinációjából épül fel. Ahogy nevükből gondolhatjuk. Az eredeci oldalt mucacó 5.} A függvény néhány egyszerű echo utasítással jeleníti meg a HTML-c.php" ). Az alábbi kódsort az oszcálydeliníción belülre írva deklarálhatjuk eze az accribúcumot: public $tartalom. $this -> MegjelenitesCim(). az osztálynak mecódusokra is szüksége van. ám ez a funkció szükség esecén később egyszerűen hozzáadható. Mivel nem valószínű. $this -> MegjelenitesMenu($this->gombok). Kezdésképpen adjuk meg az imént definiált tulajdonsá­ gok értékeinek beállításához és leolvasásához az elérő függvényeket: public function set($nev.rnint ahogy itt is tettük. Hárombetűs rövidítés.118 6. Az oldal címéc tároló accribúcumokat is beállíthatunk. Ezeket a különálló függvényeket egyszerűen egy nagy függvénybe is egyesíthecrük volna. "Kapcsolat" => "kapcsolat.a _get () függvénye nem adjuk meg. echo "</body>\n</html>\n". echo $this->tartalom. hogy ne zavarjuk össze a felhasználót. Ah­ hoz. Itt is megadhacunk alapértelmezett értéket: public $kulcsszavak = "TLA Consulting. arnire mutacnia kell: public $gombok = array ( "Kezdőlap" => "kezdelap. és tároljuk el a gomb szövegét meg az URL-c. annál könnyebb lesz meg­ írni és tesztelni a függvénye. Minél egyszerűbb a feladat. Üres címek helyett azonban érdemes az alábbi kódsorral alapértelmezert címer megadni: public $eim = "TLA Consulting Pty Ltd". a következőképpen néz ki: public function Megjelenites() echo "<html>\n<head>\n". nehezen olvasható lesz. Minden egyes függvény jól körülhatárole feladacoe kell. Hogy működni tudjon. hogy a látogató álca! megjelenített oldal tartalmát tükrözze. echo "</head>\n<body>\n". A függvények ilyerén felbontása nem szükségszerű. a keresőoldalak a legjobb barátaink".php".2 ábrán (lásd az előző fejezetet!) látható navigáló gombokat rninden bizonnyal érdemes rninden oldalon változatlanul hagyni. hogy. Az osztály elsődleges célja HTML oldal megjelenícése. "Szolgáltatások" => "szolgaltatasok. fejezet class Oldal Az osztálynak tulajdonságokra van szüksége. $ertek) $this->$nev = $ertek. de elsődlegesen az osztály más függvényeinek meg­ hívásaiból áll. Az oldal fő tartalmár. $this -> MegjelenitesKulcsszavak(). a mecacímeknek oldalról oldalra eleérőknek kell lenniük. ezek a függvények az oldal részeit jelenítik meg. hogy ezen értékek bármelyikét az osztályon kívülről meg fogjuk kérni. . $this -> MegjelenitesStilusok(). használjunk tömböt. ám az egyszerű változcachacóságuk érdekében hozzunk létre ezekből is egy tulajdonságot! Mivel a gombok száma változhat. Függvényünk. hogy ellásson.php". ehhez függvényre van szükség. A _set () függvény- az egyszerűség kedvéért.php". dönthe­ 6 rünk úgy. Azonban ne essünk át a ló másik oldalára sem! Ha túlságosan apró egységekre bontjuk fel a prog­ ramot. ezzel segítenek a keresőmocoroknak az oldal indexelésében. amelynek a Megjelenites() nevet adtuk. "Oldaltérkép" => "terkep.

inc. $this -> MegjelenitesStilusok().1 példakód az oldal.$this->cim. public function Megjelenites() 6 echo "<html>\n<head>\n". hogy szereménk az egész oldal megjelenítési módját megváltoztatni. $this -> MegjelenitesKulcsszavak(}. public $ gombok = array( "Kezdőlap" => "kezdalap. $this -> MegjelenitesMenu($this->gombok). "Szolgáltatások" => "szolgaltatasok. public $ kulcsszavak = "TLA Consulting. inc. Érdemesebb a megjelenítési funkeiét né­ hány különálló feladatra felbontani.MegjelenitesFej lee (). public $eim = "TLA Consulting Pty Ltd". MegjelenitesStílusok(}. "Kapcsolat" => "kapcsolat. php". $ertek) $this->$nev = $ertek. echo "<lhead>\n<body>\n". némi HTML-t.php". A Megjelenites() függvény a MegjelenitesCím(). hogy meghívhassuk őket. vagyis meghívásuk a függvény tényleges kódja előtt is megrörrénhet. "Oldaltérkép" => "terkep. A 6. a keresőoldalak a legjobb barátaink". de nem valószínű. $this -> MegjelenitesLablec(). public function MegjelenitesKulcsszavak() . 6. A metódusok többsége nagyon egyszerű. A meródusokar vagy függvényeker ebben a logikai sorrendben is írhatjuk. hogy megjelenírsék. teljes osztálykódot mutatja."<ltitle>". php -A Page osztály a TLA weboldalainak egyszerű és rugalmas létrehozását teszi lehetövé <?php class Oldal ll az Oldal osztály tulajdonságai public $tartalom. $this -> MegjelenitesFejlec().php néven elmentett és ezáltal f:ijlként beilleszthető.1 példakód: oldal. echo "<lbody>\n<lhtml>\n".php" ). hogy definiálnunk kell ezeket a metódusokar. Ez azt jelenti.Objektumorientált PHP 119 Öröklődés alkalmazásával felülírhatjuk a metódusokat. Sok más nyelvben a függvényeker vagy metódusokat előre meg kell írni ahhoz.MegjelenitesKulcsszavak(}. $this -> MegjelenitesCim(). Lecserélhetünk ugyan egy nagy Megjelenites () függvényt. hogy képesek legyünk kizárólag a változtaeni kivánt részeket felülírni. Hárombetűs rövidítés.MegjelenitesMenu () és MegjelenitesLablec() függ­ vényt hívja meg. ll az Oldal osztály metódusai public function __ set($ nev. public function MegjelenitesCim() { echo "<title>". illetve esetenként a tulajdonságok rarralmár kell.php". echo $this->tartalom.

fejezet echo "<meta name=\"keywords\" content=\"".menu { font-size:l2pt. font-weight:bold color:white.120 6. font-size:24pt. public function MegjelenitesStilusok() ?> <style> hl color:white. text-align:justify. echo "<tr>\n".sans-serif p.sans-serif .a:visited. td background:black p color:black.gif" /></td> Pty Ltd</hl> l public function MegjelenitesGombok($gombok) echo "<table width=\"100%\" bgcolor=\"white\" cellpadding=\"4\" cellspacing=\"4\">\n". a:link. text-align:center.gif" /></td> <td> <hl>TLA Consulting <ltd> <td align ="right"><img src = </tr> </table> <?php "logo.a:active color:white </style> <?php 6 l public function MegjelenitesFejlec() ?> <table width="lOO%" cellpadding="l2" cellspacing="O" border="O"> <tr bgcolor ="black"> <td align ="left"><img src = "logo.sans-serif. font-family:arial. text-align:center. font-family:arial. text-align:center.$this->kulcsszavak. ."\"/>". font-family:arial.sans-serif. font-size:l2pt. font-weight:bold color:white. font-family:arial.foot { font-size:9pt.

"</span> </td>".$url. <p class="foot">Kérjük. $this -> MegjelenitesGomb($szelesseg. public function IsURLCurrentPage($url) if(strpos($_SERVER['PHP_SELF']."%\"> <a href=\"". while (list($nev.$url. else return true.$nev. TLA Consulting Pty Ltd.gif\"> <span class=\"rnenu\">". echo "</table>\n". $url )==false) { return false.$nev.$szelesseg."</span></a> </td>"."\"><span class=\"rnenu\">". $url) = each($gombok)) $nev. $url.$szelesseg. !$this->IsURLCurrentPage($url))."\"> <irng src=\"s-logo.$url.$nev."%\"> <irng src=\"side-logo."\" border=\"0\" /></a> <a href=\"". public function MegjelenitesGomb($szelesseg. echo "</tr>\n". else echo "<td width=\"".php"> bgcolor="black" cellpadding="12" border="O"> jogi nyilatkozatát1</a></p> <ltd> </tr> </table> <?php ) . l" 6 \.</p> olvassa el honlapunk<a href="legal.Objektumorientált PHP 121 //gombrnéretek kiszámítása $szelesseg = 100/count($gombok).$nev. public function MegjelenitesLablec() { ?> <table width="lOO%" <tr> < td> <p class="foot">&copy.$active true) if ($active) { echo "<td width = \"".gif\" alt=\""..

Két másik mecódust definiálunk az osztályban. Ez persze azzal jár. A 6.3 példakódban lévő program úgy éri ezt el. php-Ez a <?php require("oldal. begépeljük a HTML kódot.122 6. Tegyük fel. amely e második sávba szánt gombokat és hivatkozásokat tartalmazza.MegjelenitesFejlee() és MegjelenitesLablec () mecódusnak nagyobb blokknyi statikus HTML-c kell megjelenítenie PHP feldolgozása nélkül! Ezért a függvényeken belül egyszerűen egy PHP zárócímkével ( ?> ) kezdünk. hogy az adott URL megtalálható-e a szerver által beállított változók között.Létrehozza az Oldal osztály egy példányát. 2.) 4. A Megjeleni tesGomb () egy egyszerű menügombot jelenít meg. inc. Ha a gomb az aktuális oldalra mutatna. ine. Beállíga a tartalmat.ph p nevű állományba. $kezdolap = new Oldal(). csak a módosítani kivánt részt írjuk fel: a Megjeleni tes( ) metódust. oldal2. Az osztály ilyetén alkalmazása azt eredményezi. majd egy PHP kez­ dőcímkével ( <?php) visszatérünk PHP-be. az Oldal osztál)•ból származtatott. . hogy ezen Oldal osztály segítségével új oldala­ kat állítsunk elő. A 6. Az strpos( $ SERVER [ PHP_SELF l 1 1 . amely az oldalt megjelenítő szövegből és HTML címkékből áll.php tartalmár.2 példakódból látszik. (Ez egyben a_set( ) metódust is meghívja. a szolgálcatásokat bemutató oldalon egy má­ sodik navigációs sávra van szükség! A 6. hogy az összes oldalnak nagyon hasonlónak kell lennie. nem szabad elfeledkeznünk. hogy létrehoz egy új. Az IsURLCurrentPage() metódus állapíga meg. hogy a gomb URL-je az aktuális oldalra mutat-e. sehova nem mutató.</p> $kezdolap->Megjelenites(). Jelen esetben az strpos ( ) szeringkezelő függvénnyel nézzük meg. hogy az oldal megjelenjen a látogató böngé­ szőjében. Létrehozunk egy $sor2gombok nevű új tömböt. Jobban járunk. hogy milyen kevés munkára van szükség ahhoz. és az 5. 3. amennyiben az $ur l karakterlánc benne van a$_SERVER [ 'PHP_SELF' ] pedig false lesz a visszatérési értéke. <p>Az üzleti igények kielégítésére szakosodtunk. A 6. rövidesen Önt is ügyfeleink között tudhatjuk. szánjon rá kis időt. $url ) utasítás számmal tér vissza.2 példakód a TLA Consuiting nyitóoldalát hozza létre. és ismerje meg cégünket!</p> reméljük. akkor egy kissé eltérően kinéző. hogy a TLA honlapján.2 ábrán látható. azonban az eltérőnek kívánt részeket felülírj a. és ott végrehajthaguk a kívánt módosí­ tásokat. $kezdolap->tartalom ="<p>Köszöntjük a TLA Consulting honlapján! honlap az Oldal osztályt Jelhasználva végzi el az oldal előállításának nagy részét 6 ?> Kérjük. A $kezdelap objektumon belül meghívja a Megjelenites () mecódust. inc.2 példakód: kezdolap. php fájlt egy kódba. ha öröklődést használva hozzuk létre az új osztályt. hogy a MegjelenitesStílusok(). Ha azt szeretnénk. hogy ha az oldal. php bizonyos részeit frissígük vagy javítjuk.inc. amely az Oldal funkcionalitását nagy részben örökli. Így megőrizzük az egységes oldalelrendezést.php"). egyszerűen lemásolhatjuk az oldal.inc.php fájlban is végrehajtsuk. korábban generálthoz hasonló kimenetet eredményez. Ennek neve $kezdolap . és vizuális útmutatást adunk a lácogatóknak. szuperglobális változóban. hogy az új osztály nagyrészt változatlan módon műkö<ljék. fejezet ?> A kód olvasása közben vegyük észre.inc. 6. Szelgal tatasokOldal nevű osztályt.2 példakód a következőket hajtja végre: L A require használatával beilleszti az Oldal osztály definícióját magában foglaló oldal. php fájlt egy új. ellenkező esetben Az Oldal osztály használatához be kell illeszteni az oldal. M ivel azt szeretnénk. Számtalan médszer­ rel Icideríthetjük ezt. inaktív gombot jelenítünk meg. inc. hogy ugyanezen módosításokac az oldal2. hogy a honlap egyes részei az álcalános oldalszerkezet módosított változatát használják. majd meg kell hívní a Megjelenites () függvényt.

6jrafogalmaznia.</p>".inc. $this -> MegjelenitesStilusok().php"). majd meghívjuk a Megjelenites( ) függvényt. $szolgaltatasok = new SzolgaltatasokOldal(). ''Varázsszavak'' => ''buzzword. Csak a módosított részekhez kellett új kódot írnunk. $this -> MegjelenitesLablec(). hogy a 6.Objektumorientált PHP 123 6.php-A szolgáltatások oldal az Oldal osztályból öröklődik.3 példakód: szalgal tatasok. Ez a sor másodszor is meghívja a Megjelen i tesMenu() függvényt. Lehet. "Küldetés" => "mission. $this -> MegjelenitesFejlec(). $this -> MegjelenitesKulcsszavak(). beállítjuk azon tulajdonságait. $szolgaltatasok -> tartalom ="<p>A TLA Consulting számos szolgáltatást nyújt ügyfeleinek. amelyeknél nem az alapértelmezett értékeket szeretnénk használni. "Szabványoknak való megfelel6ség" => "standards. echo $this->tartalom.2 ábra az általános oldal új változatát mutatja.php". de a Megjeleni tes() metó­ dust Jelülírva módosítja a kimenetet <?php require ("oldal.php" ). . Láthatjuk.php". de az is lehet. echo "</body>\n</html>\n". és létrehoz egy második menüsort. Üzleti folyamatainak újjáalakitásával növelhet6 az alkalmazottak munkavégzésének hatékonysága. public function Megjelenites() echo "<html>\n<head>\n". $this -> MegjelenitesMenu($this->gombok). class SzolgaltatasokOldal extends Oldal private $sor2gombok = array( "Folyamat-újjáalakitás" => "reengineering. $this -> MegjelenitesMenu($this->sor2gombok). ám eggyel több sort tartalmaz: $this -> MegjelenitesMenu($this->sor2gombok). $this -> MegjelenitesCim(). ?> A felülíró Megjelenites () igen hasonló. hogy vállalkozásának csak a küldetését kell hogy új üzleti varázsszavakra van szükségük.php ''. Az osztálydefiníción kívül létrehozzuk a SzalgaltatasokOldal osztály egy példányát. echo "</head>\n<body>\n". 6 $szolgáltatások -> Megjelenites().

és törekedni kell vagy statikus HTML oldalakat használni. Az oldalak PHP osztályokon keresztüli létrehozása nyilvánvaló előnyökkel jár. Metódusokra alkalmazva lehetövé teszi.p. és osztálypéldány létrehozása nélkül meghívhatjuk a következő kóddal: class Math static function negyzetre_emeles(Sinput) return $input*$input. Mint az életben szinte mindig.sg. echo " Math::pi ?> = Az osztályon belüli állandókat a : : műveleti jellel az állandó osztályát meghatározva érjük el. .wn.124 6. fejezer O liji$. az általános oldal nagy részét újra Jelhasználva hoztuk létre."!".:. most sem ingyen jutunk ezekhez az előnyökhöz. Vegyük például az előző részben létre­ hozott Math osztályt! Hozzáadharunk például egy negy zetre_eme les ( ) függvényt. Egy nagy forgal­ mú honlapon ez fonros szempont lehet. l l echo Math:: negyzetre emeles(8).ahol lehetséges a kódok kimenetének gyorsítótárazásával csökkenteni a kiszolgáló terhelését. akkor értelemszerűen kevesebber kell dolgozunk az új oldalak lérrehozásán. ..Math::pi. . Az oldalak kódból történő előállítása jobban igénybe veszi a számítógép processzorát. hogy osztálypéldány létrehozása nél­ kül hívjuk meg azokat. Haladó objektumorientált funkciók PHP�ben A következő részekben a PHP haladó objektumorientált funkcióit mutatjuk be.•pJI - hi#' . egyetlen mozdu­ lattal módosíthatjuk az összes oldalt. hogy az öröklődés előnyeiről le kellene mondanunk._ __ class Math const pi 3. Ha a munka dandárjár egy osztály végzi el. Ez az osztályon belüli állandó metódusokon belüli megfelelője. Osztályon belüli konstansok használata A PHP lehetövé teszi osztályon belüli állandók használatár. Az osztályt frissítve egyszerűen.g. Az ilyen állandókat osztálypéldány létrehozása nélkül is használ­ hatjuk. mint az alábbi példában: <?php 6 . Öröklődés segítségével az eredeti osztály különböző változatait származrathatjuk anélkül..2 ábra: A szolgáltatások oldalt öröklödéssel.:••. vagy . ".1$ ' TLA Consuiting Pty Ltd O billilli @iN'9 c. Statikus metódusok létrehozása A PHP engedi a static kulcsszó használatár.. 6.14159.. ahogy a fenti példában is látható. mint egy statikus HTML oldal betöltése és elküldése a böngészőre."\n".

Osztálytípus ellenőrzése és típusjelzés Az instanceof kulcsszóval ellenőrizhetjük objektumunk típusát. Ezen túlmenően alkalmazhatunk az osztályokra típusjelzést ( rype hinting) is. statikus metódusokat. Érdemes megemlíteni. Késői statikus kötések A PHP 5. és amennyiben az nem egyezik a ténylegesen átadoct típussal.3 verziójában bevezetett késői statikus kötések lehetövé teszik a statikus öröklődésseilétrehozott példányban az osz- cályra való hivatkozást. ?> A fenti példa kimenete: B . a PHP kézikönyvből származó. Például a korábbi esetekben. A típusellenőrzés egyenértékű az instanceof kulcsszóval. hiszen nincsen objektumpél­ dány. Álcalában amikor paramétert adunk át PHP­ ben egy függvénynek. mert a B osztály A-ból öröklődik. hogy a $valamilyenosztaly a egy példányát adjuk át: hint_ellenor($a). az B osztály példánya kell. Ha ezt követően az A osztály alábbi végzetes hibát kapjuk: Argument Az Fatal error: l must be an instance of B paramétere a B osztály példánya kell. hogy statikus metóduson belül nem használhatjuk a this kulcsszót. ($b instanceof A) ($b instanceof Megjelenithetol A fenti példák feltételezik. hogy legyen) (Végzetes hiba: l. a B és a Megjelenitheto az aktuális hatókörben található.Objektumorientált PHP 125 Érdemes megjegyezni. máskülönben hiba következik be. hogy A típusjelzése és B egy példányának átadása esecén nem történt volna hiba. hogy legyen. E példa azt sugallja. class B extends A public static ( function ki() { echo CLASS B::teszt(). hogy valamely objektum egy adott osztály példánya-e. hamis. hogy milyen típusú osztályt kell átadni. Megtudhatjuk. ahol a B osztályt az A alosztályaként hoztuk létre. igaz. amire hivatkozhat. hogy az A. a paraméter típusát nem adjuk át. akkor hiba köveekezik be.. alapszintű példa müködés közben mutat egy késői statikus kötést: <?php class A l 6 { static function ki() CLASS public { echo public static function teszt() //Itt jön a késői statikus kötés static::ki(). Gondoljuk végig például a következő függvényt: function hint ellenor(B $valamilyenosztaly l l . vagy felületet valósít-e meg. Típusjelzéssel meghatározhatjuk. Az instanceof kulcsszó lényegében egy feleételes műveleri jel. Az alábbi.. a ($b instanceof B) igaz. az alaposztályok használhatnak a gyerekosztályok által felülírt. valamely osztályból öröklődik.

az alapértelmezett módszerrel létrehozott tökéletes másolat elké­ szülte után hívódik meg. és ekkor lehetőségünk van rá. hogy megvalósítsuk a metódusok többszörös definiálását {method overloading). Ilyen volt a _get(}. Ha megpróbálunk lemásolni egy objekrumra való hivatkozást tartalmazó osztályt. ahogy tesszük ezt a következő példában: public function if ($metodus call($metodus. $param2}. A_clone(} metódushoz leggyakrabban olyan kódot adunk hozzá. Az előbbiekből nem lehet pél­ dányt létrehozni. Ez annyiban hasonló a konstruktorhoz és a destruktorhoz. hogy nem változtarunk meg semmit. hogy minden alosztály tartalmaz és felülír egyes meghatározott metódusokat.ahogy ezt a következő példa is mu· tatja: abstract class A 6 abstract function metodusX($paraml. Például a Sc = clone $b. az osztályhoz kapcsolódó mögöttes adatbázisrekord frissítését. A késői statikus kötésekről további információkat és példákat találunk a PHP online kézikönyvének http:/ /www. az eredeti objekrumra mutató második hivatkozást. Elvont osztályok használata A PHP lehetövé teszi az elvont osztályok {abstract class). fejezet A futásidőben meghívott.late-static-bindings. A többszörös definiálás sok objektumorientált nyelvben megralálható. Az elvont metódusokat tartalmazó osztályoknak önmaguknak is elvontnak kell lenniük. Használatához létrehozunk egy_call(} metódust.osztályokra mutató hivatkozások lehetősége további funkciona· litással gazdagíthatja osztályainkat.126 6.ám PHP-ben kevésbé hasznos. az utóbbiak kifejtés nélkül adják a metódus kereteit. létre kell hoznunk az alaposztályban egy_clone(} nevü metódust. $param2}. Akkor hívódik meg. Ugyanezt interfésszel is elérhetjük. A_clone(} metódu­ son belül ezt követően pontosan meghatározhatjuk a kívánt másolási módszert.Ezek közé tartozik a_call(} me­ tódus is.a_construct(} és a_destruct (}. Metódusok többszörös definiálása a c a ll ( ) metódussal Korábban már számos különleges jelentésű osztálymetódussal találkoztunk.a _set (}.illetve elvont metódusok használatár. amelyeknek kettős alulvonással (_) kezdődött a nevük.mivel érdemes helyet­ te rugalmas típusokat és {könnyen létrehozható) opcionális függvényparamétereket alkalmazni. Objektumok klónozása A PHP-ben is használható clone kulcsszóval meglévő objektumot másolharunk le.akár felülírt. például egy. . nem pedig egy. ugyanolyan attribútumértékekkel rendelkező másolatát hozza létre. hogy egy. Például: abstract metodusX($paraml. A_clone(} metódus szépsége abban rejlik. akár nem felülírt. utasítás a $b objektum ugyanolyan osztályú.amely biztosítja a hivatkozásként kezelt osztálytulaj­ donságok helyes másolását. Pontosan ezért érdemes hozzáadni ezt a_clone(} metódushoz.minden bizony­ nyal ennek az objektumnak a másolatát szeretnénk eredményül kapni. else if (is_array($p(0]}} { $this->megjelenitesTomb($p[O]}. A klónozás nem csak így működhet. Az elvont metódusokat és osztályokat elsősorban olyan összetett osztályhierarchiában használjuk.amit arra használunk PHP-ben.hanem valarnilyen más müveletet hajrunk még végre.oop5.net/ manual/ en/ language. amelynél biztosak kí­ vánunk lenni abban. $p} { == "megjelenites"} if (is_object($p(0]}} { $this->megjelenites0bjektum($p[0]}. Ha a clone kulcsszó nem alapértelmezett működésére van szükség. Dönthetünk úgy is.php címen elérhető részében.php. arnikor a clone kulcsszót az itt látható módon használjuk. hogy csak a módosítani kívánt dolgokon változtassunk. hogy nem köz­ veclenül hívjuk meg.

hogy a fenti kód müködéséhez nincs szükség a Megj elenites() metódus mögöttes kifejtésére. 2. Az _ au t o l o a d ( ) fiiggvény használata A PHP egy másik különleges függvénye az _a utoload ().fu. Ennek az osztálynak létre kell hozni az Iterator felületet.hozzunk létre iterátort! Ehhez az iterálni kívánt osztállyal létre kell hozni az IteratorAggregate interfészt. Gondoljuk végig a következő példát: function _autoload($nev) include_once $nev. amely Icifejtendő metódusok sorozatával rendelkezik. neki az overload nevet). akkor a megjelenitesSkalaris () metódust.hogy foreach() ciklussal ugyanúgy lépkedhetünk végig egy objektum rulajdonságain.végzetes hiba történik. ez azt jelenti. Ha azonban nem hozzuk létre. ha tömböt adunk át.és ha valami mást adunk át. = public $c = $x = new sajatOsztaly.4 példakódban az osztályra és az iterátorra látunk egy példát . $ov->megjelenites(tomb (l.".rnint egy tömbön. "7". Jelen esetben.az iterátorosztály egy példányát visszaadó metódust. . hanem különálló függvény.Objektumorientált PHP 127 else { $this->megjelenitesSkalaris($p[0]). Nézzünk egy példát: class sajatOsztaly 6 public $a public $b = "5".automatikusan meghívódik. A_call () metódus két paramétert fogad. lterátorok és iteráció létrehozása A PHP objektumorientált motorjának okos.) Amennyiben ennél kínnomulrabb működést igénylünk.nkciója.ahogy az alábbi példában is látjuk: $ov = A fenti kód meghívásához először létre kell hozni az ezt a_call ( ) metódust tartalmazó osztály egy példányát (acljuk new overload. "9". A 6.hogy melyik mögöttes metódust hívjuk meg.a kód tökéletesen müködík.php". a mögöttes megj elenitesObjektum () metó­ dust hívjuk meg. Az első a meghívott metódus nevét.ám ha ezt tesszük. foreach ($x as $tulajdonsag) echo $tulajdonsag.és hozzá kell adni egy getiterator nevü. Az _a utoload ( ) használatának elsődleges célja megpróbálni beilleszteni a kívánt osztály példányának létrehozásához szükséges fájlt vagy fájlokat."<br />".Nem osztálymetódus.ha objektumot adunk át a Megjeleni tes() metódusnak.a másodík pedig az ennek a metódus­ nak áradott paraméterek tömbjét tartalmazza.a második pedig a megjelen itesSkalaris () metó­ dust hívja meg.a megj eleni tesTomb () metódust hívjuk meg.} A fenti kód megpróbálja beilleszteni az osztállyai megegyező nevű fájlt. $ov->megjelenites('macska'). Ezt követően eldönthetjük. hogy osztálydeklaráción kívül deklarálhatjuk Ha létrehozzuk. amikor még nem deklarált osztály példányát próbáljuk meg létrehozni. A Megjelenites() első meghívása a megjelenitesTomb (). Érdemes megjegyezni. 3)).és ezt követően hívjuk meg a Megj eleni tes ( ) metódust. (Kötetünk írásának idején a PHP kézikönyv szerint a foreach felület müködéséhez létre kell hozni az üres Traversable felületet.

fejezer 6. function ervenyes() return $this->aktualislndex < $this->szarnlalo. $sajatlterator->ervenyes(). . function getlterator() return new Objekturnlterator($this). private $szarnlalo.128 6. private $aktualislndex. 8. function kovetkezo() 6 $this->aktualislndex++.4 példakó d: <?php iterator . for($sajatlterator->visszaallit(). function kulcs() return $this->aktualislndex. php - Példa alaposztályra és iterálarosztályra class Objekturnlterator irnplernents Iterator { private $obj. $sajat0bjekturn new Object(array(2. function visszaallit() $this->aktualislndex 0. function aktualis() return $this->obj->data[$this->aktualislndex]. = $this->szarnlalo szarnlalo($this->obj->data). $sajatlterator = $rny0bject->getlterator(). 6. 10)). function __ construct($obj) $this->obj = $obj. class Objektum irnplernents IteratorAggregate public $data = array(). function __ construct($in) $this->data = $in. 4.

ha a mögöttes meg­ valósítás igen. általános Iterator használatával is elérhernénk ezt. Gondoljunk például az ebben a fejezetben deklarált Oldal osztályra! Az osztályról minden információt megkapharunk a Ref!ection API által. echo $p. amikor megkíséreljük kínyomtarni az osztályt. bár ekkor az Iterator kódja megváltozna."<br />". ez fog meghívódni. echo $kulcs. de egy egyszerű példa áttanulmányozása után némi fogalmunk lehet arróL mire használható. illetve az aktuális adatelemre mutató hivatkozást állítsunk be. Az echo utasítás azt fogja megjeleníteni. Az ertek(} függvény az adatmutató aktuális helyénél tárolt értéket adja vissza. • Osztályaink átalakítása karakterláncokká Ha létrehozunk osztályunkban egy _toString(} nevű függvényt. Egy ilyen iterátorosztály használatának oka. ahogy tesszük azt az alábbi példában: $p = new Nyomtathato. Példánkban az IteratorAggregate osztály egyszerű tömb. hogy többet tudjunk szerkezerükről és tartalmukróL Ez a lehetőség akkor igazán hasznos.Objektumorientált PHP 129 $sajatiterator->kovetkezo(}} $key = $sajatiterator->kulcs(}. TRUE}}. ahogy ezt a 6. hogy az adatokhoz mutató interfész akkor sem változik. public $tesztketto. A kovetkezo(} függvény mozgatja az adatmutatót az adatban. Az API rendkívül összetett. Az ervenyes(} függvény közli. Ha úgy dönrünk. $ertek = $sajatiterator->aktualis(}. A visszaallit(} függvény állítja vissza a belső adatmutatót az adat elejére.$ertek. A PHP . amit a_toString(} függvény visszaad. de nyilvánvalóan megfelelő hely arra. A refection a meglévő l osztályok és objektumok lekérdezésének képessége.) A Reflection API használata objektumorientált funkciói közé tartozik a RejlectionAPI (alkalmazásprogramozási interfész). például amikor kódolt PHP szkriptekkel tesszük ezt.} ?> Az Objektumiterater osztály az Iterater interfésznek megfelelő függvénykészlettel rendelkezik: A konstruktor nem kötelező." => ". hogy az iterálni kívánt elemek számához értékeket. hogy van-e további adat az adarmutató aktuális helyénéL A kulcs(} függvény adja vissza az adatmutató értékér.5 példakódból láthatjuk. amikor ismeretlen vagy nem dokumentált osztályokhoz alakírunk kí interfészt. (A var_export(} függvény az osztály összes tulajdonságértékét kíírja. hogy hash táblává vagy hi­ vatkozott listává (linked list) alakítjuk. public function _toString(} 6 return(var export($this. Például a következőképpen hozhatjuk létre: class Nyomtathato public $tesztegy.

. • . ft) h-n-.·•-·.l' - � 6. hogy a <pre> címkék külön sorokban vannak..."</pre>".._... . hogy ne zavarják össze a_toString () metódust! A kód első képernyőnyi kimenetét a 6....5 példakód: reflection. Figyeljük meg..UN_r•l•-"&U&J......1 �l.) ..U .$osztaly.._ __._-�au oo_. •Ilu-fUI) l --l�·-·---� l U ... Hogyan tovább: A következő fejezet a PHP kivételkezelő lehetőségeit mutatja be.-_.. $osztaly = new ReflectionClass("Oldal")....3 ábra: A Rejlection API meglepően részletes kimenete.....acltuuo�J -nr l "'*Ucl<'�l ""-rorl �olftlca.6. ?> Ebben az esetben a Reflection osztály_ toString ( ) metódusával íratjuk ki az adatokat... A kivételek elegáns lehetőséget adnak a futásidejű hibák ke­ zelésére._.�_.-u -1 ..inc... .3 ábrán láthaguk ...php -Az Oldal osztályra vonatkozó információk megjelenitése <?php require once("oldal.php").. echo "<pre>".

az Exception osztályból öröklődő kivételpéldányokat használni. A legegyszerűbb esetben a beépített Exception osztály egy példányát hozzuk létre. A kivétel bármilyen tÍpusú lehet. felhasználó által meghatározott. Ez általánosságban a következőképpen néz ki: catch (típusjelzés kivétel) ll kivétel kezelése Egy try blokkhoz egynél több catch blokk is társítható. Egyes programozási nyelvek... A fejezetben az alábbi főbb témakörökkel foglalkozunk: Kivételkezelési fogalmak Kivételkezelési szerkezetek: try . ha minden catch blokk más cípusú kivételt készül elkapni. kód). Ha például az Exception osztály kivételeit szándékozunk elkapni. A try blokk alatt legalább egy catch blokkra is szükség van.throw. A kód ezen része így nézi ki: try ll ide kerül a kód Ha valami nem stimmel a try blokkban. mindazonáltal értéket kell átadni neki. ahogy tettük ezt a fenti példában is. hogy a kód egy úgynevezett try blokkon belül hajtódik végre. hogyan tudjuk saját kivételeinket meghatározni.7 Hiba� és kivételkezelés A fejezetben a kivételkezelés fogalmát. A kivétel kiváltása a következőképpen történik: throw new Exception('üzenet'. Objektumot vár. A kivételek egységes mechanizmust szol­ gáltamak a hibakezelésre. Ezen osztály konstruktora két paramétert fogad: egy üzenetet és egy kódot. PHP-ben ezt saját kezűleg kell megrenni. illetve PHP-beli megvalósírását mutatjuk be. amely saját. objektumorientált alapokon nyugvó hibakezeléssei egészíthető ki. bizonyos esetekben automatikusan kiváltják a kivételeket.. Ezek egy hibaüzenetet és egy hibakódszámot szándékoznak jelképezni. Inkább nyelvi alkotóelem. Mindkét paraméter opcionális. mintsem függvény. (A fejezet egy későbbi részében megmutat­ .. catch blokkunk a következő­ képpen nézhet ki: catch (Exception $e) ll kivétel kezelése A catch blokkba áradott (és általa elkapott) objektum a kivételt felismerő throw utasításnak áradott (és általa kiváltott) objektum.) az Exception osztály példányair vagy a saját. köztük a java is. A throw kulcsszó indítja el a kivételkezelő mechanizmust. de érdemes vagy juk.catch Az Exception osztály Felhasználó által meghatározott kivételek Kivételek Bob autóalkatrész-értékesítő alkalmazásában Kivételek és a PHP további hibakezelő mechanizmusai Kivételkezelési fogalmak A kivételkezelés alapgondolata. Ez akkor nyer értelmet. kivételt válthatunk ki (throw exception).

Ennek konstruktora. .. . php-Kivétel kiváltása és elkapása <?php try { 42)... Látható.. Hogy az eddig elmondorrakat világosabbá tegyük. ... Egynél röbb catch blokk eserén a ne­ kik áradorr objektumoknak különbözö típusúaknak kell lenniük..1 példakódban egy egyszerű kivételkezelési pél­ dát találunk.1 példakód: alapszintu_kivete l. sorában<br />". hogy az Exception objektumot egyszerűen ki!ratva a fenri metódusok álral nyúj­ getTrace getTraceAsStr ing mázva azt.. mely függvények végrehajtásakor következerr be a kivétel. a PHP a megfelelő catch blokkor kezdi keresni.l példakódban a fentiek közül az első négy metódust használtuk. ahol a kivétel bekövetkezett. �Q�---­ . és jelzi. fejezer Amikor egy kivérel bekövetkezik.l ábra: A catch blokk közli a kivétel hibaüzenetét. throw new Exception("Szörnyű hiba történt".. Érdemes megemlíteni... (Ezeket rövidesen részletesen is megismer­ hegük._ . getMessage getFile() -Annak getLine ()-A kódfájl azon sorának a számát adja vissza.. hogy a 7. />".. a kódfájlnak a reljes elérési útvonalát adja vissza.. _toStr ing ( ). " fáj l " echo "Kivétel ". A visszakövetés (backtrace) azt mutatja. E beépíterr osztály a catch blokkban hasznos hibaüzenerek megjelenítésére alkalmas meródusokkal rendelkezik. urasírás végrehajtásával is.. " a ". hol történt a kivétel. két paramétert 7 fogad: egy hibaüzenetet és egy hibakódor...) A kód futtatásának eredménye a 7.. .. 7 . ?> A 7. hogy az Exception osztály kivételét váltjuk ki.. hogy catch blokkon belül nem lehet további kivételeket kiváltani. ()-A konstruktornak áradorr üzenetet adja vissza.. __. $e->getCode().1 példakódból látható.01_. A konsrruktoron túlmenően az oszrály az alábbi beépíterr metódusokar tartalmazza: getCode ()-A konstruktornak áradorr kódot adja vissza. mint azt már jelezrük.... catch (Exception $e) { $e->getMessage(). ()-A getTrace metódus álral visszaadorr információval megegyezöt ad vissza karakterláncként for­ teszi....Lehetövé torr összes információt megszerezzük.."<br $e->getLine() . ()-A kivétel bekövetkezrének visszakövetésér tartalmazó tömböt ad vissza.132 7. 7. ahol a kivétel bekövetkezett.. $e->getFile() . nézzünk egy példád A 7. hogy az Exception osztály metódusait használtuk. hogy a PHP értelmező ki tudja deríteni..�. A példakódban látható._""'-""-.1 ábrán látható. hogy melyik catch melyik blokkon menjen keresztül. ".. Az Exception osztály A PHP rendelkezik egy Exception nevű beépíterr oszrállyal.... Mindezen információt (és a visszaköve­ tésr) megkaptuk volna az echo $e.. _..

7 final function getTraceAsString() return self::TraceFormat($this). és hib�avírási céllal kivánjuk áradni. static private function StringFormat(Exception $exception) kódokban nem elérhető függvény.erre számíthatunk öröklődéskor <?php class Exception function { int $code=0) construct(string $message=NULL. ll a hibakezelés egyéb beállitása $this->line = $this->trace = debug_backtrace(). protected $file.Fontos megemlíteni. PHP kódokban nem elérhető függvény. { ll .A PHP kézikönyvben megtaláljuk az Exception osztály vázát jelképező kódot. $this->code $this->file = = $code. amire öröklődéskor számirhatunk 7. { if (func_num_args()) { $this->message = $message.php oldalról származó kódot a 7. Az.php.Hiba. private $trace.2 példakód: Exception osztály.2 példakódban . bármilyen tetszőleges objektumot áradha­ runk. private $string. protected $line. ll kivétel üzenete ll felhasználó által meghatározott kivételkód ll kivétel forrásfájlneve ll kivétel forrássora ll kivétel visszakövetése ll csak belső! 1 final function getMessage() { return $this->message. ll a hibakezelés egyéb beállitása . protected $code = 0.. protected $message = "Ismeretlen kivétel".zör azonban az Exception alaposztályt fogjuk kiterjeszteni. final function getTrace() return $this->trace. A throw mellékággal bármilyen más objektumot is áradhatunk Erre akkor lehet szükség. function toString() { return $this->string. hogy ez nem a tényleges kód.A http:/ /us.. final function getCode() return $this->code. ll amely karakterláncként adja vissza a visszakövetést . Legtöbbs. hanem azt mutatja. hogy létrehoznánk és átadnánk az Exception alaposztály egy példányát. esetek többségében az Exception osztályból származtatott saját kivéreiosztályokat fogunk létrehozni.net/ manual/en/language oopS. final function getFile() return $this->file. ha problémáink adódnak vala­ milyen konkrét objektummal.és kivételkezelés 133 Felhasználó által meghatározott kivételek Ahelyett. $this->string = StringFormat($this).. PHP ll amely karakterláncként ad vissza minden fontos információt static private function TraceFormat(Exception $exception) { ll . láthatjuk.. FILE LINE .

php <?php class sajatKivetel extends Exception - Példa Jelhasználó által definiált Exception osztályra function toString() return "<table border=\"1\"> <tr> <td><strong>Kivétel ".3 példakód: felhasznala_altal_definialt_ kivetel. 7. Létrehozharjuk saját Exception alosztályainkat. hogy észrevegyük: a nyilvános (public) metódusok többsége vég­ leges (final).3 példakód felhasználó által definiált Exception osztályra mutat példát.$this->getLine() . Jegyezzük meg.134 7. catch (sajatKivetel $m) echo $m. ?> 7 Ebben a kódban új kivételosztályt deklarálunk. hogy a _toSt ring () függvény felülírható. 7.$this->getCode() .$this->getFile() . Ennek neve saja tKivete l. és az Exception alaposztályból öröklődik. A kód futtatásának kimenere a 7." a ". try { throw new sajatKivetel("Szörnyű hiba történt". de nem módosíthaguk az alapmetódusok viselkedését." . fejezet "?>" Elsősorban azért vizsgáljuk meg ezt az osztálydefiníciót.2 ábrán látható. Ez azt jelenti. szépen formázva íratjuk ki a kivételt. hogy nem felülírharók. sorában <ltd> </tr> </table><br />".. Ez és az Exception osztály között az a különbség. hogy a_toString () metódust felülírva." fájl ".szépen Jormázva" jeleníti meg a kivételeket."<br />". megjelenítési módját! Ugyanígy saját metódusaink hozzáadására is van lehetőség." </strong>: ". .2 ábra: A saja tKivetel osztály .$this->getMessage() . így megváltoztathatjuk a kivétel A 7. 42).

_ A 2. n a n $this->getMessage(). láthatjuk. Ezek kódját a 7. Az új változar a 7. $this->getLine() return nfajlZarolasiKivetel n n: ''. n.és kivételkezelés 135 A fenti példa igen egyszerű. Kivételek Bob autóalkatrész�értékesítő alkalmazásában A 2. n . n.Hiba.4 példakód: fajl_kivetelek. $this->getFile(). n<br $this->getFile().4 példakódban találjuk. példakódban látható. soráb an '' ''<br $this->getLine() class fajlZarolasiKivetel extends Exception function __ toString() 7 $this->getCode() />n. hogyan lehet különböző hibatípusokat kezelő. amely közli. hogy háromféle probléma következhet be fájlba íráskor: a fájl nem nyitható meg. soráb an '' ''<br $this->getLine() class fajlirasiKivetel extends Exception function toString() return nfajlirasiKivetel n. de az alap Exception osztály is megfelelő lenne. hogy milyen típusú kivétel történt. n a n n fájl n. n: ''. Mindazonáltal minden alosztályhoz létrehoztunk egy _toString() metódust. Mint azzal bizonyára tisztában vagyunk. n<br n fá j l /> ''. ahol gyakran jelentkeznek hibák. hogy beépítsük a kivételeket. fejezetből (Adatok tárolása és visszakeresése) megcudhattuk. Ha visszagondolunk az eredeti kódra. . másmilyen kivételeket létrehozni. soráb an '' ''<br ?> Ezek az Exception alosztályok semmi különlegeset nem tesznek. />''. fejezetből ismert rendeles feldolgozasa php fájlt átírtuk. n $this->getFile(). n: ''. php. n $this->getMessage(). $this->getCode() />n. a fájlkezelés egyike azon területeknek. Ezért kiváló terep ez kivételkezelés alkalmazására és szemléltetésére. n<br n fájl n.Fájlkezeléshez kapcsolódó <?php class fajlNyitasiKivetel extends Exception function __ kivételek toString() return nfajlNyitasiKivetel n. Jelen alkalmazáshoz akár üres alosztályként is felhasz­ nálhattuk volna őket. A következő részben megvizsgáljuk. n a $this->getMessage(). hogyan tároljuk Bob rendelési adatait egy egyszerű fájlban. nem lehet zárolni. Mindhárom lehetőséghez létrehoztunk egy-egy kivételosztályt.5 . 7. / >''. vagy nem lehet írni bele. $this->getCode() />n.

echo '<p> Rendelése az alábbi: </p>'. $szallitasi_cim = $_POST['szallitasi eim'].00.136 7. ". define('ABRONCSAR'. jS F'}. ll rövid változónevek létrehozása $abroncs_db = $_POST['abroncs_db']. echo $gyertya_db.php"}." gumiabroncs<br />". l0}.$datum. 2. $vegosszeg = $abroncs_db + + * ABRONCSAR OLAJAR * $olaj_db * $gyertya db GYERTYAAR.__ __ echo $olaj db. l ' $vegosszeg=number_format($vegosszeg. if( $osszmennyiseg == 0} { echo " Egyetlen tételt sem rendelt az el6z6 oldalon!<br />". $olaj_db = $ POST['olaJ_db']. Rendelési eredmények</title> echo "<p>Rendelés feldolgozásának id6pontja: ". fejezet 7. $vegosszeg = 0. <html> <he ad> <title>Bob autóalkatrészek </head> <body> <hl>Bob autóalkatrészek</hl> <h2>Rendelési eredmények</h2> <?php $datum = date('H:i.$osszmennyiseg. $DOCUMENT_ROOT ?> $ SERVER['DOCUMENT_ROOT']." flakon olaj<br />". $osszmennyiseg = 0.5 példakód: rendeles_feldolgozasa. ). 4}. $osszmenny1seg = $abroncs_db echo " Rendelt termékek száma: + $olaJ db + $gyertya db. . if ( $olaj_db > O } { 7 . define( 'OLAJAR'. php .. else if { { ( $abroncs_db > O } echo $abroncs_db. if ( $gyertya_db > O } { _". $gyertya_db = $ POST['gyertya_db']." gyújtógyertya<br />"."<br />". define('GYERTYAAR' ."</p>". 100}.B ob rendeléseket Jeldolgozó kódja kivételkezelés beépítése után <?php require_once("fajl kivetelek.

catch (Exception $e) echo "<p><strong>Megrendelését jelenleg nem tudjuk feldolgozni. A catch blokkok kivételekkel párosítása ugyanolyan alapon történik. Igy könnyebb a kivételkezelő kód megírása és kezelé- se.$gyertya_db. if (1fwrite($fp." gyújtógyertya\t\$". mint az instanceof operátoré. ha nem tudjuk zároini a fájlt."</p>". Kérjük. LOCK_UN). ?> </body> </html> A kód fájlkezeléssei foglalkozó részét try blokk veszi körül. ezeket a második catch blokk fogja elkapni."\t". $outputstring. lépjen kapcsolatba a webmesterünkkel'</strong></p>". strlen($outputstring))) throw new fajlirasiKivetel(). akkor fajlZarolasiKivete l-t. illetve mindegyik után a megfelelő kivétel elkapása. próbálkezzon kés6bb!</strong></p>". ll fájl megnyitása hozzáiráshoz try if (1($fp = @fopen("$DOCUMENT_ROOT/. a másik az Exception kivételeket. fclose($fp). echo "<p>Rendelés megirva. 'ab'))) throw new fajlNyitasiKivetel()." gumiabroncs \t"." olaj\t" . Végezetül egy fontos figyelmeztetés: ha olyan kivételt váltunk ki. Mivel a többi kivétel az Exception osztályból öröklődik. catch (fajlNyitasiKivetel $foe) echo "<p><strong>A rendeléseket tartalmazó fájlt nem lehet megnyitni. flock($fp. akkor fajlirasiKivetel-t idézünk elő. Kérjük. Ha nem tudjuk megnyitni a fájlt."\n"."</p>". l 7 Vizsgáljuk meg a catch blokkokat! Nem véletlenül csak kettő van belőlük: az egyik a fajlNyitasiKivetel kivételeket kezeli. $kimeneti sztring = $daturn. Az általá�os és követendő programozási gyakorlat kis try blokkok alkalmazása./rendelesek/rendelesek.$vegosszeg .Svegosszeg. Sabroncs_db. hiszen mindig pontosan látjuk.txt". LOCK_EX)) throw new fajlZarolasiKivetel(). Ezért is érdemes saját kivételosztályainkat egyetlen osztályból származtatni. Sszallitasi cim. amelynek nem írtunk megfelelő catch blokkot. fajlNyitasiKivetel-t váltunk ki. ha pedig nem tudunk írni bele. if (!flock($fp. a PHP végzetes hibát jelez. </p>". hogy mivel foglakozunk."\t".Hiba. ..$szallitasi cim.$olaj db. ".és kivételkezelés 137 echo "<p> A rendelés végösszege: echo "<p>Szállitási eim: ".

További olvasnivaló Mivel a kivételkezelés a PHP egyik újdonsága. hogy az fopen ( ) függvény meghívása előtt továbbra is ott találjuk a @ hibaelnyomó operátort! Sikertelen meghívás esetén a PHP figyelmeztetést ad ki. 7 .html oldalról érhető el. Érdemes megemliteni. hogyan hozzunk létre és töltsünk fel MySQL adatbázist. amellyel a Hibakövetés címü 26.5 példakódban.anyag a http://java. nem túl sokat írtak még a témában. A Sun kiváló oktatóanyaggal rendelkezik a kivételekről. Figyeljük meg a 7. A kivételkezelésről általánosságban azon­ ban bőséges információ lelhető fel. Hogyan tovább: A könyv következő része a MySQL-lel foglalkozik.sun. Ezeket a beállításokat a 26. fejezet Kivételek és a PHP további hibakezelő mechanizmusai A fejezetben bemutatott kivételkezelő mechanizmusan túlmenően a PHP összetett hibakezelő támogatással rendelkezik. majd mindezt a PHP-ről tanultakkal összekapcsolva hogyan lehet az adatbázist az internetről elérni. hogy a kivételek kiváltásának és kezelésének folyamata egyáltalán nem befolyásolja ezen hibakezelő mechanizmus müködését. miért érdemes hasz­ nálni azokat. fejezetben foglalkozunk. de fontos tudni. illetve arról. Megtudjuk. fejezetben részletesen megismerjük. vagy nem.természetesen a Java szemszögéből íródott . A . amely a php.com/docs/books/tutorial/essential/ exceptions/handling. hogy a PHP a kivételkiváltástól függetlenül kiadja a figyelmeztetést. ini hibaJelentő beállításaitól függően vagy megjelenik és naplóba kerül.138 7.

II A MySQL használata 8 Webes adatbázis megtervezése 9 Webes adatbázis létrehozása 10 Munkavégzés MySQL adatbázisunkkal ll MySQL adatbázis elérése a webről PHP-vel 12 Haladó MySQL-adminisztráció 13 Haladó MySQL-programozás .

A Haladó MySQL-programozás című 13. Az RDBMS-ek beépített mechanizmusokat kínálnak az egyidejű hozzáférések kezelésére.. Az RDBMS-ek beépített jogosultsági rendszerekkel rendelkeznek. fejezet MySQL adatbázis internethez kapcsolásának alapvető beállítását mutatja be. A könyv előttünk álló részében MySQL adarbázist fogunk használni. mely termékek fogynak a legjobban. és segítsen megtartani őket. Az RDBMS-ek véletlen hozzáférést biztosítanak az adatokhoz. táblákat és indexeket. Megtudjuk.adarokból álló táblázat. hogyan tudunk rekordokat hozzáadni. hogyan lehet lekérdezni az adatbázisból. Az ilyen adatbázisok a relációs algebra szilárd elméleti alapjaira épülnek. fejezet bemutatta. amit a neve sugall . relációs adatbázis használatával gyorsan és egyszerűen választ kapunk az olyan lekérdezésekre. Relációs adarbázis használatához nem szükséges. hogyan hozhatunk létre felhasználókat.egy egyszerű fájlból igen nehezen kinyerhető . fejezet bemutatja. megvizsgáljuk a következőket: Relációs adatbázisokkal kapcsolatos fogalmak és szakkifejezések Webes adatbázis megtervezése Webes adarbázis architektúrája A könyv ezen részében az alábbi területekkel ismerkedünk meg: A Webes adatbázis létrehozása című 9. a teljes szövegben kereséssel és a tárolt eljárásokkal. így programozóként nem szükséges ezzel foglalkoznunk. Az RDBMS-ekből lekérdezéssel egyszerűen kinyerherők adott kritériumoknak megfelelő adathalmazok. hogy mélyrehatóan ismerjük a relációs elméletet (ez min­ denképpen jó hír). Relációs adatbázissal kapcsolatos fogalmak A relációs adatbázis messze a leggyakrabban használt adatbázistípus. A Haladó MySQL-adminisztráció című 12. hogyan lehet a PHP-t és a MySQL-t össze­ kapcsolva adatbázisunkat webes kezelőfelületről elérni és használni. MySQL Improved Extension" (mysqli) kiterjesztését. ám bizonyos alapvető adatbázis-fogalmakkal tisztában kell lennünk. Emlékez­ hetünk rá. milyen előnyökre számíthatunk. hogy röbb felhasználót vonzzon. foglalkozik a tranzakciók lefedettségével. hogyan tudunk kócljainkba adatbázist beépíteni. fejezet a tárolómotorokat mutatja be részletesebben. mint a jogosultságí rendszer. és megísmerjük a MySQL különböző tárolómotorjait. A tábla pon­ tosan az. A Munkavégzés MySQL adatbázisunkkal című 10.információk birtokában fejleszthetjük oldalunkat. hogy honnan érkeznek vásárlóink. a biztonság és az optimalizálás. ilyen . Ha használtunk korábban táblázatkezelő alkalmazást. Két módszert ismerünk meg erre: az egyik a PHP . adatbázisokat. a másik a PEAR:DB adatbázis-absztrakciós réteget használja.8 Webes adatbázis megtervezése A PHP alapjainak megismerése után figyelmünket afelé fordítjuk. és milyen típusú vásárlók költe­ nek a legtöbbet. . Táblák A relációs adatbázisok kapcsolatokból épülnek fel. törölni és frissíteni .mindezt parancssorbóL A MySQL adatbázis elérése a webről PHP-vel című ll. Hogy néhány kézzelfogható példát is nézzünk. olyan területeket érint­ ve. amelyeket tábláknak vagy táblázatoknak (rable) szokás nevezni. akkor táblákkal is dolgoztunk már. Mielőtt a következő fejezetben elmélyednénk a MySQL részleteiben. ha az egyszerű fájlok helyett relációs adatbázist használunk: A relációs adatbázis-kezelő rendszerek (RDBMS) az egyszerű fájloknál gyorsabb hozzáférést tesznek lehetövé az adatokhoz. hogy az Adatok tárolása és visszakeresése című 2. fejezetből kiderül. fejezer részletesebben taglalja a MySQL-felügyeletet.

Oszlopok A tábla minden oszlopa egyedi névvel bír. Varos és Nev osz­ lopból áll.fejezet Vessünk egy pillamást a 8. A táblázatos forma miatt minden sor ugyanazokkal a tulajdonságokkal ren­ delkezik. és túlságosan hivatalos­ nak hat. A táblának van neve (vasarlok). kiderül. hogy ki a szóban forgó vásárló.1 ábra: A Book-O-Rama vásárlóinak adatai táblázatban tárolva. megszámlálhatatlan sok ilyen nevü embert találunk. A 8. nem más. amely a vásárlók által jelzett megrendeléseket tárolja.1 ábrán látható Vasarl ok táblából kiderül. A gyakori névvel megáldott olvasók núnden bizonnyal jól tudják ezt. Többféleképpen megkülönböztethetjük közöttükJulie-t. Ha ezt követően ránézünk a Vasarlok táb­ lára. Sorok A tábla mindegyik sora egy-egy vásárlót jelképez. amely a Book-O-Rama nevü könyvesbolt vásárlóinak nevét és címér tartalmazza! VASARLOK VasariolD l 2 3 Nev Julie Smith Alan Wong Michelle Arrhur Lakeim 25 Oak Street 1/47 Haines Avenue 357 Norrh Road Varos Airporr West BoxHiU Yarraville 8. Gyakran még az sem szavatolja az egyedi azonosítást. . akkor a kulcs a Lakcim. láthatjuk. A sorokat szokás rekordoknak ( record) is nevezni. Az adatbázisok jellemzően több táblából állnak. Minden oszlop megfelelő adattípusú. Az oszlopokat esetenként mezőknek (field) vagy tulajdonságoknak. Értékek Minden sor az egyes oszlopoknak megfelelő értékek készletét tartalmazza. Amit a példában tettünk.2 ábrán egy. Airport West alatt lakó Julie Smith"-ként hivatkozunk. attribútumoknak (attribute) is szokás nevezni. Ráadásul használatához a tábla egynél több oszlopára is szükség lenne. és különböző adatokat tartalmaz. A kulcs több oszlopot is tartalmazhat. mivel VasarloiD néven eitáraijuk az ügyfélazonosítóját. Egyszerűbbé teszi adataink adatbázisban tárolását. és kulcsot használva hivatkoznak az egyik tábláról a másikra. Ha megnézzük például a 2-es rendelési azonosítójú (RendelesiD) A táblázat azonosító oszlopát kulcsnak vagy elsődleges kulcsnak nevezzük. Nagyon kevés valódi adat rendelkezik ezzel a tulajdonsággal. hogy az l-es ügyfélazonosítójú vásárló adta. és ebben az esetben nem feltétlenül lesz egyedi azonosító.Gondoljunk például aVasar lok táblában szereplő Julie Smith-re! Ha kinyitunk egy amerikai a telefonkönyvet. Kulcsok Szükség van az egyes vásárlók azonosítását lehetövé tevő módszerre. a másik három oszlop karakterláncokat tartalmaz. A 8. aki a megadott lakcímen él. Mesterségesen kiosztott azono­ sító számnál garantálhatjuk az egyediséget. és különböző adatokat tartalmazó oszlopokból és az egyes vásárlóknak megfelelő sorok­ ból áll. eséllyel ő az egyetlenJulie Smith. Az Jó 8 például az "Oak Street 25. Minden adatnak az oszlopa által meghatározott adattípusúnak kell lennie. A Megrendelesek tábla minden sora egy adott vásárló egy konkrét megrendelését jelképezi. és amit núnden bizonnyal s:Yát alkalmazásainkban is tenni fogunk. mint egyéni vásár­ lóazonosító (Vasar lo I D) hozzárendelése az ügyfelekhez. hogy a Vas arl o I D (vagyis vásárlóazonosító) egész számokat. HaJulie-ra rendelést. A nevek általában nem alkalmasak erre.1 ábrán látható mintatáblára. " "Oak Street 25.142 8. ehhez az adatbázishoz adott második táblát látunk.Tudjuk. Ugyanezen elv alapján kapjuk egyedi bankszámlaszámunkat vagy tagsági számunkat a DVD-kölcsönzőben. hogy az l-es ügyfélazonosítótJulie Smith kapta. ha több ilyen adatot kombinálva használunk. Airport West alatt lakó Julie Smith néven emlegetni őt azonban kicsit körülményes.

Sok a sokhoz típusú kapcsolat esetében az egyik tábla több sora kapcsolódik a másik tábla több sorához. Ezek mutatják. Háromféle kapcsolat létezik a relációs adatbázisokban. Lakcim. Az ilyen típusú kapcsolatban általában egy minden adatot tartalmazó táblázat is létezik. illetve az egyes táblák elsődleges kulcsát és idegen kulcsait tartalmazza. A Megrendelesek tábláról a Vasarlok táblára mutató nyíl például a Megrendelesek tábla sorai és a Va sarlak tábla sorai közötti kapcsolatra utal. Ebben a harmadik táblában csak a másik két tábla kulcsait találjuk idegen kulcsként párokban. Ebben az esetben az ügyfélazonosítót betesszük a megrendeléseket tartalmazó táblába. amelyben alá vannak húzva. Szerzok és Konyvek_ Szerzok tábla is. A relációs adatbázis az idegen kulcs (foreign key) kifejezést használja az ilyen kapcsolatta. Datum) Megrendelesek(RendelesiD. A sémában az aláhúzott kifejezések elsődleges kulcsok abban a relációban. Egy a sokhoz típusú kapcsolat esetén az egyik táblázat sora(i) a másik több sorához kapcsolódhat(nak). egy az egyhez típusú kapcsolat lenne közöttük.99 74.ben-idegen kulcsként hivatkezunk rá. A kapcsolat lehet egy az egyhez (one-to-one). Felvetődhet a kérdés. A sémákat megjeleníthetjük informális ábrákon (ahogy az imént tettük). de értelmezését meg­ könnyítendő mintaadatokat helyezhetünk bele. Nev. Ilyen kapcsolatnál a sok sort tartalmazó táblázat idegen kulcsa mutat az egy sort tartalmazó táblázatra. amelyben dőlten jelennek meg. Az egy az egyhez kapcsolat azt jelenti. A séma az összes táblát és azok oszlopait. miért érdemes két külön táblát használni. egyed­ kapcsolat diagramban (amivel könyvünkben nem foglalkozunk). AVasarlok táblában a VasarloiD az elsődleges kulcs. így a fenti példánál maradva lesz Konyvek. akik más könyveket is írtak-egyedül vagy más szerzőkkel. amit két szerző jegyez. A dőlttel szedett kifejezések pedig külső kulcsok abban a relációban. egy a sokhoz (one-to-many) vagy sok a sokhoz (many-co­ many) típusú. Példánknál maradva: a vásárlók több megrendelést is leadharnak. Adatok ugyan nincsenek benne. Sémák Az adatbázis összes táblatervét együttesen adatbázissémának (schema) nevezzük. hogy mutassa a kapcsolatot. A három típust a kapcsolat két oldalán lévő elemek száma szerint különbözteljük meg. a másik szerzőket ( Szerzok) tartalmaz. de más táblában-a példában a Megrendelesek. hogy mindkét dologból egy-egy alkolja a kapcsolatot.99 Datum 02-Apr-2007 15-Apr-2007 19-Apr-2007 01-May-2007 l 8.Webes adatbázis megtervezése 143 VASARLOK VasariolD l 2 3 Nev JulieSmith Alan Wong Michelle Arthur Lakeim 25 OakStreet Varos Airport West BoxHill Yarraville l l 4 7 Haines Avenue 357 North Road MEGRENDELES RendelesiO 2 3 4 � 3 2 3 VasariolD l Üsszeg 27. hogy mely szerzők mely könyvekben érintettek. Létezik olyan könyv. Kapcsolatok Az idegen kulcsok táblában lévő adatok közötti kapcsolatot jelképeznek.2 ábra: A Megrendelesek táblában szereplő minden egyes rendelést a Vasar/ok táblában lévő valamelyik vásárló adta le. VasarloiD. illetve szöveges formában. például: Vasarlok(VasarloiD. A Cimek táblából egy idegen kulcs mutatna a Vasa rl ok táblába vagy fordítva. l 8 .00 6.50 12. Varas) Osszeg. Ha például a lakcímeket a Vasarlok táblából külön táblába tennénk. Miért nem tároljukJulie címét egyszerűen a rendeléseket tartalmazó Megrendelesek táblában? A következő részben részletesen foglalkozunk ezzel. Képzeljünk el két táblát. az egyik könyveket ( Konyvek) .

4 ábrán láthatóhoz hasonló tábla adódna.99 24. hiszen .3 ábra: A kiinduló séma Vasarlok. Redundáns adatok tárolásának elkerülése Korábban feltettük a kérdést:.00 6. Minden könyvhöz tartozik ISBN-kód.672-31509-2 Michael Morgan ThomasDown Pruitt.50 12.kiderül például az. könnyedén létrehozharunk az adatoknak megfelelő táblát. valós világbeli objektumokat! Adatbázis létrehozásakor általában valós világbeli elemeket és kapcsolatokat modellezünk. végösszeg és rendelt könyvek. Java 2 for ProfessionalDevelopers Installing GNU/Linux Teach Yourself GIMP in 24 Hours 34. hogy a modellezett. Általánosságban azt mondhatjuk. és mi­ lyen címre indítottuk a rendelést. A fentiekből az következik. amely témakörök meghaladják jelen kötet tartalmi lehető­ ségeit. akkor adatait többször eltároljuk. Az adatbázis kezdeti sémáját a 8. (Ugyanakkor egy ilyen adattárolásnak is meglehetnek az előnyei. Megrendelesek és Konyvek táblából áll. és mi legyen a kulcs. Az esetek többségében azonban elegendő néhány alapvető tervezési elvet betartani. és ezekről az objektumokról és kap­ csolatokról tárolunk el információt. Gondoljunk csak bele: ugyanazt az információt kivánjuk tárolni minden vásárlóról! Ha egy adatkészlet ugyan­ olyan formájú. mely könyveket választották az egyes rendelésekben.3 ábrán láthatjuk VASARLOK VasariolD Nev Lakeim Varos l 2 3 Julie Smith 25 Oak Street 1/47 Haines Avenue 357 North Road Airport West Box Hill Yarraville Alan Wong MEGRENDELE RendelesiO � 3 l 2 3 Michelle Arthur VasariolD Üsszeg Datum l 2 3 4 27. fejezet Webes adatbázis megtervezése Bizonyos tekintetben művészet tudni azt.99 02-Apr 2007 - 15 Ap r-2007 - 19-Apr-2007 01-May-2007 KONYVEK ISBN Szerzo Cim Ar 0-672-31697-8 0-672-31745-1 o. valós világbeli objektumok minden egyes osztályának külön táblára van szüksége. Vizsgáljuk meg most ezeket a fenti példákban szereplő könyvesbolt kontextusában l Gondoljuk végig a modellezett.99 8. a forgalmazott könyvekről és a rendelésekről szetetnénk információt tárolni. hogy mikor van szükség új táblára. címe és ára. Rengeteg könyvet találunk az egyed-kapcsolat diagramokról és az adatbázis-normalizálásról. A Book-O-Rama könyvesbolt példájában a vásárlókról. A modellből egyelőre nem tudjuk megmondani.et al. a 8. Rövidesen azonban 8 ezzel is foglalkozni fogunk.144 8.Miért ne tároljukJulie Smith lakcímét a Megrendelesek táblábant HaJulie többször is rendel a Book-0-Ramától.) . ahogy azt reméljük. hogy legalább három táblára van szükségünk az adatbázisban: Vasarlok. Ebben az esetben végeredményként egy.99 74. hogy rendeléskor rnilyen szállítási címet adott meg a vásárló. Minden megrendelésnél van dátum.99 24. van szerzője.a példánál maradva . Minden vásárlóhoz tattozik név és cím. Megrendelesek és Konyvek.

Általánosságban úgy kell adatbázisunkat megrervezni.50 12. és amikor legközelebb rendel valamit a Book-0Ramától. Ez a Rendelesi tetelek nevű tábla látható a 8. a másik sor pedig azt sugallja.00 15.5 ábrán. mert adatok beszúrása esetén fordulhat elő. könnyen lesz két olyan sorunk. Például tudnunk kell azt.99 23.50 43. Atomi oszlopértékek használata Atomi oszlopértékek használata esetén núnden sor núnden tul:Ydonságánál csak egyeden dolgot tárolunk. ismét be kell kérnünk minden adatát. egyszerűen annyit kell tenni. hogy azok megegyeznek-e a tábla meglévő soraiban lévő adatokkal. amely a megrendelt k önyveket tartalmazza. hogy Airport Westben lakik. hogy milyen könyvekből állnak össze az egyes rendelések. ami így létrejött.99 Oa tum 02-Apr-2007 15-Apr-2007 19-Apr-2007 01-May-2007 Rendelt konyvek 0-672-31697-8 0-672-31745 -l. ha elég lenne csak egyszer is? A másik. Egy ilyen adatbázisnál két alapvető probléma merül fel: Az egyik a helypazarlás. Az adatbázis ilyen kialakítása esetén Julie adatait minden egyes rendelésfelvételnél be kellene szúrni.akkor jelentkezhet. amely egymásnak ellentmondó információt tárolJulie-róL Az egyik sorban például az szerepel.99 74. Könnyen megfeledkezhetünk erről. sokkal nehezebbé válik megválaszolni az olyan kérdéseket. HaJulie másik lakásba költözik. Ha elmulasztjuk az ellenőrzést. Egy ilyen helyzet jellemzöen információvesztéshez vezet. hogy a megrendelés kiszállírása után töröljük azt az adatbázis ból! Julie aktuális megrendeléseinek teljesítése után azok mind törlödnek a Megrendelesek táblábóL Ez azt jelenti. és csak egyeden helyen módosítjuk a lakcímét. és nem tudjuk megállapítani. Mivel az. Itt tulajdonképpen az történik. amely a megrendeléseket és a könyveket kapcsolja össze. hogy melyik adat helyes és melyik nem. A harmadik típust törlési anomá/iának nevezik.00 6. tulajdonképpen tábla a táblában. hogy új táblát hozunk létre.bármilyen meglepő . akkor címét egy helyett három he­ lyen kell frissíteni. így núnden alkalommal ellenőriznünk kellene. 8 Ez a megoldás több okból sem szerencsés. Többféleképpen is elérhetjük ezt.Webes adatbázis megtervezése 145 RendelesiO 12 13 14 15 üsszeg 199. Az ilyen esetet beszúrási anomá/iának nevezzük. Miért tároljukJulie személyes adatait háromszor. ami háromszor annyi munkát jelent. hogy a későbbiekben nincsen rekordunk Julie címével.4 ábra: A redundáns adatokat tároló adatbázis nagyobb tárhelyet igényel. hogy ez frissítési anomáliákhoz vezethet . mert akkor jelentkezhetnek. MEGRENDELESEK RendelesiO l VasariolD 3 üsszeg 27. hogy egy egész táblázatot ágyazunk egyetlen osz­ lopba . hogy a fenti anomáliák egyike se következzék be. miközben egyes megrendelései még függöben vannak. Ha így alakítjuk ki az oszlopokat. amelyekben az adatbázis módosítása inkonzisztens adatokat eredményez.75 Oatum 25-Apr-2007 29-Apr-2007 30-Apr-2007 01-May-2007 VasariolD Nev Julie Smith Julie Smith Julie Smith Julie Smith Lakeim 25 üak Street 25 üak Srreer 25 üak Street 25 üak Street Varos Airporr Wesr Airporr Wes r Airporr Wesr Airporr Wesr l l l l 8. ami inkonzisztens adatot eredményez adatbázisunkban (ami nem kifejezetten örvendetes számunkra). hogy hozzáadunk a Megrendelesek táblához egy olyan oszlopot.vagyis olyan helyzetekhez. mint a "Hány példányt rendeltek a Java 2 for Professional Developers című kiadványból?': A rendszer így nem cuclja egyszerűen csak összeszámolni az egyező mezőket. hogy Airportban. ha sorokat törlünk ki egy adatbázisbóL Képzeljük el.0-672-31697-8 2 3 4 l 2 3 8. a beszúrási és a törlési anomáliákat. Háromféle frissítési anomáliát sziikséges elkerülni: a módosítási. Az egyik megoldás az lehetne. Nem küldhetünk neki tájékoztatót a különleges ajánlatainkról. és anomá/iákat okozhat az adatokban. o -672-31509-2 0-672-31697-8 0-672-31745 -l. 0-672-31509-2.6 ábrán. Az adatintegritás sérül. . Az ilyen problémákat módosítási anomáliáknak nevezzük.5 ábra: flyen kialakítás esetén a Rendelt konyvek tulajdonságnál soronként több érték fordulhat elő.egy olyan táblázatot. Ezt az esetet látjuk a 8. mert . amikor megkíséreljük módosítani az adatbázist. Helyette núnden tulajdonságérté­ ket meg kell vizsgálnia az egyezőség megállapítására.

Érdemes elkerülni azt. mit szeretnénk az adatbázisból megtudni! Következő lépésként gondoljuk végig. Ezt a két megkö· zelítést láthatjuk a 8.146 8. Ilyen táblákkal akkor találkozunk. Ez a tábla kapcsolatot teremt a Megrendelesek és a Konyvek tábla között. fejezet RENDELESI TE TELEK - Rendelesi D l 2 2 3 4 4 4 ISBN 0-672-31697-8 0-672-31745-1 0-672-31509-2 0-672-31697-8 0-672-31745-1 0-672-31509-2 0-672-31697-8 D arabszam l 2 l l l 2 l 8. vagy létre kell hozni egy külön táblát kifejezetten az értékelések számára. KONYVEK ISBN o-672-31697-8 0-672-31745-1 O. amikor sok a sokhoz típus ú kapcsolat áll fenn két objektum között. A könyvekhez nem szükséges egyedi azonosítót létrehozni.az ISBN-kód formájában. gondoskodjunk róla. Ha az adatbázis számos könyvet tartalmaz. mert egy rendelés több könyvet tar­ talmazhat. hogy melyek a Book-O-Rama legjobban fogyó könyvei. vagy egyéb függvényeket alkalmazunk numerikus értékeket tároló oszlopo- . ám a RendelesiD és az egy sorként kezeljük a rendelést. ha adatbázisunk választ tudna adni! (Ilyen kérdés lehet például az. hogy megkapjuk a kért információt.99 Ertekeles KONYV_ERTEKELESEK ISBN 8 l Ertekeles 8. és a megfelelő kapcsolat legyen a táblák közört! Kerüljük a sok üres tulajdonságot tartalmazó kialakítást! Ha a könyvekről szóló értékeléseket szeretnénk adni az adatbázishoz. hogy adatbázisunkban sok üres érték legyen. másrészt problémákat okoz.7 ábra: Az értékelések tárolásához vagy Ertekeles oszlopot kell hozzáadni a Konyvek táblához.) Annak érdekében.672-31509-2 Szerzo Michael Morgan Thomas Down Pruirt. Válasszunk értelmes kulcsokat! Ügyeljünk arra. és bármely könyvet többen is megrendelhetnek.99 24. mert ezek a valós világbeli objektumok nem szükségszerűen rendelkeznek egyedi azono­ sítóval.99 24. Az első módszer esetén egy Ertekeles oszlopot kell hozzáadni a Konyvek táblához.már megtették számunkra. Az egyes rendelésekhez (Rendelesi_tetel) adhatnánk ugyan még egy kulcsot. Gondoljuk végig.et al.6 ábra: Ez a kialakítás megkönnyíti. legalább kétféleképpen tehetnénk meg. hogy üres értéke (null value) van. és az értékelésért felelős személy nem fog mindegyikkel foglalkozni. hogy núnden egyes könyvhöz hozzáadjuk az Ertekeles mezőt. Ezt úgy hívjuk.7 ábrán. jelen esetben ez azért van így. Konyvcim Java 2 for Professional Developers Installing GNU/Linux Teach Yourself GIMP in 24 Hours Ar 34. hiszen ezt. Pontosan ezért rendelkezik a Rendeles i_ tetelek tábla Darabszam ISBN tulajdonság együttesen garantálja az egyediséget. milyen kérdésekre szeretnénk. amelynek ennél a tulajdonságnál nem lesz értéke. Egyrészt pazarolja a tárhelyet. Ez azt jelenti. amikor összesített értékeket számolunk ki. amennyiben ugyanabból a könyvből egynél több példány rendelése esetén is oszloppal. hogy a megrendelt könyvek között keressünk. hogy egyedi kulcsokat válasszunk! Példánkban különleges kulcsot hoztunk létre a vásárlóknak (vasarloiD) és a rendeléseknek (RendelesiD). akkor sok olyan sor lesz. hogy az adatbázis minden szükséges adatot tartalmazzon.

8 ábrán látjuk. Ha több értékelés tartozhat ugyanahhoz a könyv­ höz. Ehhez a 8. nem fogja tudni. akkor már egy a sokhoz típusú kapcsolarról beszélünk. Meg kell említenünk. 3. hogy egy az egyhez típusú kapcsolat áll fenn a könyvek és az értékelések között. A könyv olvasása során fejlesztendő. Egy vásárlónak például több rendelése lehet. a parancsfájlmotorból (PHP) és az adatbázis-kiszolgálóból áll. l Böngésző l• � . a webes kiszolgálóból. Ezért a rendelésbe a vásárlóra uraló hivatkozást helyezünk.Webes adatbázis megtervezése 147 kan. webes adatbázist használó alkalmazás a 8. 2 PHP motor J. és ekkor csak a második adatbázisterv jöhet szóba.. • Webes adatbázis architektúrája Miurán áttekintettük az adarbázis belső szerkezerér. Összekapcsoló táblákat.8 ábra: A böngésző és a webes kiszolgáló közötti kliens-szerver kapcsolat kommunikációt igényel.9 ábra: Az alapvető webes adatbázis-architektúra a böngészőböl. hogy adatbázistervünk végül kétféle táblát tartalmaz: Valós világbeli objektumot leíró. Böngésző l• .9 ábrán látható általános szerkezethez hason­ lót követ.9 ábrán is megraláljuk): A felhasználó böngészője HTTP kérést intéz egy adott weboldalhoz. Ha a felhasználó üres mezöt lát egy táblában. könyvenként több éteékelésnél azonban egyedi azonosítót kell bevezetnünk mindegyikhez.7 ábrán javasolt második kialakírást célszerű követni. A PHP megnyitja a kapcsolator a MySQL kiszolgálóhoz. A háttérben adatbázissal müködö weboldalak azonban ennél némiképpen összetettebb környezetet igényelnek.. 8 . vizsgáljuk meg a webes adarbázisrendszerek külsö archirekrúrájár és a we­ bes adarbázisrendszer fejlesztésének módszertanát! A webszerverek alapverő müködésér a 8. egyszerű objektumokra mutató kulcsokat tar­ ralmazhatnak. visszakeresi a fájlt. php-re vonatkozó kérésr. Ez az architektúra kiválóan megfelel a statikus oldalakat kezelő kiszolgálóknak. házon belüli személy által írt értékeléssel számol. A PHP motor elkezdi vizsgálni a kódot. de egy adott rendelést csak egyetlen vásárló adhatott fel.l valasz k rés Webes kiszolgáló l 8. hogy a tulajdonság irreleváns. Webes kiszolgáló 6 ' • l l 5 . Egy tipikus webes l. Például HTML űrlap segítségével ráke­ res a Book-O-Rama adatbázisában a Laura Thomsan által írt könyvekre. Itt csak a már értékeléssel bíró könyveket soroljuk fel a Konyv Ertekelesek táblában . sok a sokhoz típusú kapcsolatot írnak le. Könyvenként egyeden értékelés esetén a Konyv Ertekelesek tábla elsődleges kulcsaként használhatjuk az ISBN-kódot. egyszerű táblákat. E srrukrúra nagy része minden bizonnyal már ismerős számunkra.l . amely megküldi a választ. az adatbázis hibát tartalmaz. p hp. A sok üres érték okozta problémákat másmilyen adarbázisterv alkalmazásával kerülhetjük el. vagy az adat egyszerűen még nem lett beírva. A böngésző kérést intéz a kiszolgálóhoz. amely az adatbázishoz csatlakozásta és a lekérdezés végrehajtására (a köny· vek keresésére) irányuló parancsot tartalmaz. A rendszer két objektumból áll: egy böngészöböl és egy webes kiszolgálóbóL Kommunikációs kapcsolatra van szükség közörtük. ez azt jelenti. és elküldi a megfelelő lekérdezést. hogy ennek az az oka.l 4 3 MySQL kiszolgáló 8. . ilyen például a rendelések és a könyvek közötti kapcsolat. Ezeker a táblákat gyakran valamilyen valós világbeli tranzakcióval társítjuk. adarbázis-tranzakció az alábbi szakaszokból áll (a számozásr a 8. majd feldolgozás céljá­ ból átadja a PHP motornak...természetesen az értékelésükkel együtt. A keresési eredmények lapjának neve eredmenyek. A webes kiszolgáló megkapja az eredmenyek. amelyek kér valós objektum közötti. Ezek olyan egyéb. 2. _ _ Táblatípusok összefoglalása Általában azt fogjuk tapasztalni. hogy a fenti szerkezet egyetlen. amelyekkel egy az egyhez vagy egy a sokhoz típusú kapcsolarban állnak.

hogyan futtassunk rajta lekérdezéseket. az üzleti logikát követő rétegre. A PHP motor befejezi a kód futtatását. További olvasnivaló A fejezetben a relációs adatbázis tervezéséhez kaptunk alapszintű iránymutatást. akár adatbázis-kiszolgálót használunk.a PHP motornak. a nagyobb kapacitás vagy a terhelés megosztása lehet.148 8. Ezt követően az eredményül kapott HTML-t visszaküldi a webes kiszolgálónak. A MySQL kiszolgáló megkapja az adatbázis-lekérdezést.a könyvek listáját . Ha szerernénk jobban elmélyedni a relációs adatbázisok mögött álló elméletben. ám az utóbbi jelentős előnyöket kínálhat a teljesítmény terén. megjelenítő rétegre. ami általában a lekérdezés eredményeinek HTML-beli formázását is magá­ ban foglalja. Mindazonáltal az is legalább ennyire elfogadott. Egy ádagos webes adatbázis jellemzően nem ennyire összetett. A 8. Először megtanuljuk. Date! Nem árt tudni. az alkalmazás magját tartalmazó. 8 . illetve a HTML kimenetet kezelő. 5. hogy az adatbázis-kiszolgálót másik gépen futtassuk Ennek oka a biztonság. mint például C. hogyan állítsunk be interneten keresztűl elérhető MySQL adatbázist. fejezet 4. a MySQL-hez kapcsolódó adatbázisrétegre. A folyamat alapvetően megegyezik akár szkriptfuttató környezetet. feldolgozza. ahol a felhasználó láthatja a kért könyvek listáját. egy. Fejlesztési szempontból ugyanúgy kell dolgozni mindkét megközelítéssel. elkezdjük majd PHP alkalmazásainkat rétegekre bontani: jellem­ zően egy. és nem szükségszerűen lesz azonnal releváns az üzleti célú webfejlesztök számára. csupán mélyebb struktúrát adunk a PHP részéhez. és visszaküldi az eredményeket . olvassuk el olyan relációs guruk könyveit. majd hogyan tegyük meg ugyanezt PHP-ból. 6. Hogyan tovább: A következő fejezetben elkezdjük létrehozni MySQL adatbázisunkat. a PHP motor és az adatbázisszoftver gyakran ugyanazon a gépen fut. Ahogy alkalmazásaink mérete és bonyolultsága növekszik. A webes kiszolgáló visszaadja a HTML-t a böngészőnek.9 ábrán látható alapszerkezet azonban ekkor is érvényben marad. A webes ki­ szolgáló szoftvere. J. hogy az ezekben a kiadványokban olvasható anyag meglehetősen elméleti jellegű.

Érdemes a könyv olvasása idején a legfrissebb. Emlékezte· résül álljon itt a Book-O-Rama alkalmazás sémája: Vasarlok(VasarloiD. Ebben az esetben ellenőrizzük a fenti !istác. Cirn. majd közölje velünk a választott felhasználói nevet. és tekintsük át a Függeléket. Konyv_Ertekelesek(ISBN. Természetesen más kliensek is megfelelnek a célnak. jelszór és adarbázisnever. Darabszarn) Rendelesi_tetelek(RendelesiD. továbbléphetünk és -olvashatjuk a fejezetet. Ez a kliens a MySQL bármilyen telepítése után rendelkezésre áll. A PHP és a MySQL telepítése című Függelékben segitséger találunk végrehajtásukra. amelyek a felhasználók és adarbázisok beállítását mutarják be.1-es verziójú MySQL-lel építettük fel és teszreltük. hogy hozzon létre számunkra egy felhasználót és egy adatbázist. a rendszergazdák jellemzően a phpMy Admin böngészöalapú felületet kínálják fel . amit nem mi kezelünk (nem mi vagyunk a rendszergazdái)­ webes hoszring szolgáltarás vagy munkahelyi gép használata esetén ez igen valószínű. A MySQL aktuális verziója a http://www. Egyes mire van szükségünk. Daturn) Megrendelesek(RendelesiD. Ertekelesek) Az előző fejezerből emlékezhetünk rá. Ha a fejezet bármilyen pontjánál problémába ütközünk. korábbi verziók kevesebb funkcióval rendelkeznek. telepítenünk kell webes kiszolgálónkra. Ha a MySQL-t például hasztolt webes környezetben használjuk. hogy a MySQL rendelkezé­ sünkre álljon. hogy A fejezerben szereplő példákat a könyv írása idején legfrissebb. Ar) ISBN. mert az így megszerzett információ birtokában pontosabban el rudjuk magyarázni rendszergazdánknak. De ez esetben is érdemes lehet elolvasni ezeker az oldalakat. hogy az elsődleges kulcsokar aláhúzással. Lakcirn. könnyen lehet. hogy olyan gépen férünk hozzá a MySQL-hez. VasarloiD. 5. Az ebben a részben szereplő témakörök feldolgozásához MySQL-hozzáférés szükséges. hogy MySQL rendszerünk nem megfelelően lett beállítva. hogyan állítsunk be weboldalon használni kívánt MySQL adatbázist. Konyvek(ISBN. Book-O-Rama online könyvesbolt alkalmazást folytatva haladunk végig a fejezeten. Szerzo. hogy meggyőzödjünk beállításaink helyessé­ géröl! Elképzelhető. Ekkor a fejezet azon részeit.com oldalról tölthető le.9 Webes adatbázis létrehozása Az előrtünk álló fejezerből megrudharjuk.mysql. Könyvünkben a MySQL manitornak nevezett parancssori kliens használarával érjük el a MySQL-r. akár át is ugorhatjuk. Nev. az idegen kulcsokat pedig dőlt betűvel jelöljük. Ha a fenti lépések nem magáról érterődök szá­ munkra. Ebben az esetben a példák köveréséhez vagy saját adatbázisunk létrehozásához meg kell kérni a rendszergazdát. Ahhoz. stabilan működö változatot telepíteni vagy arra frissíteni. Ez a lépés a következöket foglalja magába: • A fájlok installálása Felhasználó beállítása a MySQL futtatására Elérési útvonal beállítása Szükség eserén arnysql_install_db • futtatása • Adminiszrrátori (root) jelszó beállítása A névtelen felhasználó rörlése és az adatbázis tesztelése A MySQL kiszolgáló első indírása és automatikus futásának beállírása • Ha mindezzel megvagyunk. Varas) Osszeg. A főbb téma· körök: • Adatbázis létrehozása Felhasználók és jogosultságok beállítása A jogosultsági rendszer megismerése Adarbázistáblák létrehozása Indexek létrehozása Oszloptípusok kiválasztása MySQL-ben • • Az előzőekben megismert.

ellenőrizzük. hogy a MySQL kiszolgáló fut-e. amely a következöképpen néz ki: rnysql> grant select -> Ez a szimbólum azt jelenti. Your MySQL connection id is l to server version: Community Server or \g. Könyvünkben azért éltünk ezzel a lehetőséggel. mivel a parancssorban bevitt jelszó egyszerű szövegként jelenik meg a képernyőn. az operációs rend­ szerbe bejelentkezéshez használt felhasználói név lesz az alapértelmezett. Ellenkező esetben a hostnev paramétere helyett annak a gépnek a nevét kell megadnunk. Bejelentkezés MySQL�be A MySQL-be történő bejelentkezéshez menjünk számítógépünk parancssori kezelöfelületére.) ér véget. Az előző parancs után az alábbihoz hasonló választ kell kapnunk: Enter password: (Ha nem müködik a parancs. A MySQL monitor használata A mostani és a következő fejezet MySQL-es példáiban rninden parancs pontosvesszővel (. A pontosvessző utasítja a MySQL-t a parancs végrehajtására. Ha ugyanazon a gépen adjuk ki ezt a parancsot. nyomatékosan javasoljuk.ameny· 9 nyiben arra szükség volt-.25-rc-cornrnunity MySQL (GPL) Type '\c' to clear the buffer. 5. és gépeljük be a következőket: rnysql -h hostnev -u felhasznaloi_nev -p A rnysql parancs meghívja a MySQL monitort. kövessük a következő részben leírtakat! Ha más gépénél dolgozunk. hogy mikor használtuk. Ha saját gépet használunk. az alábbihoz hasonló választ kell lámunk: Welcome to the MySQL rnonitor. A -h határozza meg a gépet. Jól látható. ha nem itt adjuk meg. A -p kapcsoló közli a kiszolgálóval.1. beállítottuk és helyesen gépeltük-e be a root jelszót! Ha nem saját gépünkön fut a MySQL. ellenőrizzük. és nem állítottunk be jelszót ehhez a felhasználéhoz. rnysql> Ha gépünkön nem a fentihez hasonló válasz jelenik meg. Cornrnands end with . készen állva az adatbázis létrehozására. amelyen a MySQL kiszolgáló fut.és nagybetűk közöte-nem úgy az adatbázisok és a táblák nevei (erről késöbb még bövebben is olvashatunk majd). amelyikkel dolgozhatunk. Ha root-ként jelentkezünk be.150 9. A -u kapcsoló határozza meg a felhasználói nevet. amellyel csatlakozni szereménk. hogy jelszó használatával kívánunk csatlakozni. semmi sem fog történni.vagyis amelyen a MySQL kiszolgáló fut. fejezet számunkra. Nem szükséges a jelszót ebben a sorban megadnunk. root-ként (adminisztrátorként) kell bejelent­ keznünk. amelyhez csatlakozni kívánunk. ami a bennünket a MySQL szerverhez csatlakoztató parancssori kliens. amelyiken a MySQL szerver található. Amennyiben saját gépünkre vagy kiszolgálónkra telepítettük a MySQL-t. A kezdő felhasználék ezt a hibát követik el leg­ gyakrabban. Ha nem adjuk meg. és a rnysql parancs az elérési útvonalban van-e valahol!) Ekkor adjuk meg jelszavunkat! Ha rninden jól megy. hogy a MySQL további inputot vár. majd létrehoznunk az ebben a fejezetben használandó adatbázist. A pontosvessző elmaradásának eredményeként új sorokat kezdhetünk a parancsokon belül. győ· zödjünk meg róla. így akár A megfelelő . Amennyiben a bejelentkezéshez hasz­ nált felhasználói névhez nincsen jelszó beállítva. Tulajdonképpen jobb is. hogy az SQL utasítások nem tesznek különbséget a kis. az alábbi lépéseket már elvégezték számunkra. Más grafikus kezelőfelületű kliensek nyilvánvalóan az itt leírtaktól kissé eltérő eljárásokkal dolgoznak. a fenti két karaktert látjuk megjelenni. ám a fejezet utasításait követve viszonylag könnyedén elboldogulhatunk azokon a felületeken is. rnivel a MySQL folytatás jelet használ. Type 'help. a MySQL kiszolgáló úgyis kérni fogja. hogy a megfelelő jelszót adruk-e meg! Ekkor a MySQL parancssornál kell len nünk. hogy futtattuk-e a rnysql_install_db-t. Más rendszergazda által kezelt gépen futó MySQL esetén a rendszergazda által adott felhasználói nevet kell használnunk. Ha lefelejtjük. Érdemes megjegyezni azt is. hogy most azonnal lapozzunk a Függelékhez l Rendszerünk root jelszó nélkül egyáltalán nem biztonságos. ezt a kapcsolót kihagyhatjuk. Első telepítés esetén a root lesz az egyetlen felhasználó. ez a kapcsoló és a hostnev paraméter kihagyható. Ha a pontosvessző begépelése nélkül ütjük le az Enter bil­ lentyűt.' or '\h' for help. mert könnyebben olvashatóvá teszi a példákat. így más felhasználék is egyszerűen leolvashatják azt.

aki csak az általunk imént létrehozott adatbázishoz való hozzáféréshez szükséges jogosultságokkal bír. A dolog a fájl­ kezelési jogosultságokhoz hasonló. Amikor létrehozunk a MySQL-en belül egy felhasználót. Érdemes különböző jelszavakat beállítani a rendszerhez és a MySQL-hez. Alkalmazásonként jellemzően egy adatbázis­ sal fogunk dolgozni. Ahhoz például. hogy minden. Gépeljük be a MySQL parancssorba a következőt: mysql> CREATE DATABASE adatbazis neve. és ő következik. A legkisebb jogosultság elve A legkisebb jogosultság elvét követve bármilyen számítógépes rendszer biztonsága javítható. mégis erősen ajánlott. és mindig egy adott felhasználóhoz van társírva. hogyan használjuk ezeket. Felmerülhet bennünk a kérdés. jogosultságokkal felruházva hatá­ rozzuk meg. l row affected (0. Általános formája a következő: l 9 . MySQL-ben ez éppen úgy igaz. és jogosultságokat ad nekik. és fokozottan érvényes ez a root jelszavára. Ha nem ezt a választ kapjuk. nem sziikségesek olyan jogosultságok. hogy beírtuk-e a sor végére a pontos­ vesszőt! Ez közli ugyanis a MySQL-lel. A legkönnyebb az adatbázis létrehozása. A MySQL jogosultsági rendszerének bemutatása A MySQL egyik legnagyszerűbb jellemzője. A root felhasználó biztonsági okokból jellemzően csak rendszer­ ga zdai feladatokat lát el. A Book-O. hogy lekérdezéseket futtassunk az internetről. hogy kifinomult jogosuJtsági rendszert támogat. hogy ezek a MySQL-en kivüli felhasználói nevekkel és jelszavakkal (például a unixos vagy NT-s felhasználói nevekkel és jelszavakkal) egyezök legyenek. Érdemes lehet ugyanakkor a köztes részeket is átolvasni. A következőképpen szól: Minden felhasználónak (vagy folyamatnak) a hozzárendelt feladat elvégzéséhez szükséges legalacsonyabb szintű jogosult­ sággal kell rendelkeznie.0 sec) Ez azt jelenti. hogy végrehajtsa a parancsot. illerve megfoszthatjuk őket azoktól az alábbi négy jogosuJtsági szinten: Globális (Global) • Adarbázis (Database) Tábla (Table) Oszlop (Column) • • Rövidesen látni fogjuk. Ugyanez érvényes a root esetében is. Webes adatbázis beállítása céljából érdemes webes alkalmazásonként legalább egy felhasználót is létrehozni. hogy minden rendben ment. Felhasználók és jogosultságok beállítása Egy MySQL rendszer sok felhasználóval rendelkezhet. Nem szükséges. mégis rendkívül fontos elv. (Vagy legalábbis nem lenne szabad. hogy készen vagyunk. hogy futtatni tudjuk!) Adatbázisok és felhasználók létrehozása A MySQL adatbázisrendszer számtalan különböző adatbázist képes támogatni. A rendszerrel dolgozó minden egyes felhasználó számára felhasználói nevet és jelszót kell beállítani.Rama-s példában az adatbázis neve Kon yvek lesz. Alapvető. _ Az adatbazis_neve helyére a létrehozni kívánt adatbázis nevét kell írnunk. Az alábbihoz hasonló választ kell látnunk (a végrehajtási idő minden bizony­ nyal ettől eltérő lesz): Query OK. Felhasználó beállítása: a GRANT parancs A GRANT és REVOKE paranccsal jogosultságokat adhatunk a MySQL-felhasználóknak.Webes adatbázis létrehozása 151 adatbázis használata című részre is ugorhatunk. A jogosultság (privilege) adott művelet adott objektumon történő végrehajtásának lehetősége. Ezért egy másik felhasználót kell létrehoznunk. mint amilyenekkel adminisztrátorként a root rendelkezik. amit gyakran hagynak figyelmen kívül. általunk létrehozott felhasz­ náló esetében megtegyük ezt. hogy mi értelme van ennek? A válasz a jogosultságokban rejlik. A GRANT parancs felhasználókat hoz létre. mint bárhol máshol. hogy mit lehet és mit nem lehet megtennie a rendszerben. bár az azokban meg­ adott parancsokat nem leszünk képesek futtatni. Ugyan nem kötelező a felhasználókhoz jelszót beállítani. A Book-O-Rama-s példa megkezdéséhez hozzuk létre a Konyvek nevű adatbázist! Ennyi. ellenőrizzük.

Ha nem egy konkrét adatbázist használunk. ahol a felhasználó­ kat. Az SSL-en keresztüli MySQL-hez csatlakozásról a MySQL kézikönyvben találunk további információt. db. Arra való. Jogosultságok típusai és szintjei MySQL-ben a jogosultságok három alapápusa létezik: az általános felhasználék számára Iciosztható jogosultságok. az összes adatbázisra megaelj uk a jogosultságokat. hogy a jelszó ne legyen könnyen kitalálható! Vagyis ne legyen szótárban előforduló szó. A felhasznaloi_nev az. tabla _neve. egyelőre elég annyi. hogy . frissítések vagy kapcsoládások számát korlá­ tozhatjuk. és mely táblákat vagy adatbázi­ sokat érhetik el az adott helyről. mert a különböző domainekből érkező felhasználóknak gyakran ugyanaz a ne­ vük. a Hala­ dó MySQL-adrninisztráció című 12. com felhasználói nevet. Ezt globális jogosultság kiosztásának nevezzük. Csak azokra az adatbázisokra és táblákra adjunk a felhasználék számára jogosultságokat. Ez igen hasznos tud lenni. Használhatunk egy vagy több oszlopnevet. A jelszavak kiválaszrására a szokásos szabályok vonatkoznak. hogy a felhasználónak Secure Sockets Layer (SSL) protokollrétegen keresztül kell csatlakoznia. amelyre az új jogosultságok vonatkoznak. mysql. ám a legkisebb jogosultság elvének megfelelően érdemes a rendszergazda rípusú jogosultságo­ 9 kat a rendszergazdák számára fenntartani. fejezet GRANT jogosultsagok ON elem [oszlopok) [IDENTIFIED 'jelszo'] ) TO felhasznaloi nev [REQUIRE ssl_opciok) [WITH [GRANT OPTION l BY korlatozo opciok] A szögleres zárójelben lévő mellékágak (clause) opcionálisak. akkor ugyanezt egy* megadásával is megtehetjük. és ne egyezzen meg a felhasználói névvel! Ideális esetben kis­ és nagybetűk és nem alfabetikus karakterek kombinációjából áll.152 9. columns _priv A GRANT parancs alkalmazása helyett megreherjük. hogy oszloponként határozzunk meg jogosultságokat. majd az oszlopok felsorolása az oszlopok helyőrzőben J adjuk meg. amelyeket ténylegesen használniuk kell! A rendszergazdán kívül senkinek nem szabad hozzáférést adni a mysql adatbázishoz. egyetlen táblára (adatbazis _neve. host. A MySQL jogosultságok meghatáro­ zott készleteivel rendelkezik.*). honnan csatlakozhatnak a felhasználók. Az os z lopok helyőrző opcionális. leckében tekintjük át. Az első. Ne feledjük. hogy hogyan lehet közvetlenül ezeket módosítani. amivel a felhasználót be kívánjuk léptetni. Ezek neve mysql. fejezetben alaposabban is megvizsgáljuk ezt az adatbázist. ezeket a következő részben mutatjuk be. A WITH GRANT OPTION beállirással megengedhetjük a felhasználónak. a tabla_neve önmagában az aktuális adatbázis egy táblájaként lesz értelmezve.a jogosultságok vesszővel elválasztott listáját jelöli. A je lszo helyére az a karaktersor kerül. utóbbi esetén vesszővel kell elválasztani azokat. Bármelyik felhasználóhoz hozzárendelhetjük ezen jogosultságok bármelyikét. amivel a felhasználónak a MySQL-be be kell jelentkeznie. Ezzel megkülönböztethetjük mondjuk a laura (amit a MySQL laura@ localhost-ként értelmez) és a laura@valahol. Ennél gyakrabban fordul elő. hogy ez a rendszerbe való bejelentkezéshez használt névtől eltérő is lehet! MySQL-ben a felhas znaloi_nev hostnevet is tartalmazhat. tabla_ neve ) vagy egyes oszlopokra (adatbazis _neve. tables_pr iv és mysql. hogy a jo­ gosultságokat egy adatbázis núnden táblájára (adatbazis_neve. A biztonsággal később részleresebben is foglalkozunk. Ha adott adatbázist használunk e parancs kiadásakor. a jelszavakat stb. illetve további SSL-beállításokat adharunk meg. hogy másoknak kioszthassa saját jogosultságait. Az elem azt az adatbázist vagy táblát jelöli. mysql. Ha elem-ként a*. tábla. illetve oszlop. közvetlenül ezeket a táblákat módosírjuk.* karaktereket acljuk meg. Működésüket. hiszen ez az. mysql. tároljuk. A biztonságot is növeli. A jogosultságok tárolása a mysql nevű adatbázis öt rendszertáblájában történik. mivel meghatározhatjuk. A REQUIRE mellékágban meghatározhatjuk. illetve néhány különleges jogosultság.) . Megosztott rendszerek esetén kiválóan alkalmasak az egyes felhasználék által kiváltott terhelés korlátozására. a rendszer­ gazdák számára megfelelő jogosultságok. illetve azt. user. A WITH mellékágat az alábbiakkal is megadhatjuk: MAX_QUERIES PER_HOUR n vagy MAX UPDATES PER HOUR n vagy MAX CONNECTIONS PER HOUR n Ezekkel a mellékágakkal a felhasználó által óránként végezhető lekérdezések. Ezek a példák a másik három jogosultsági szintet mutatják: adatbázis. Számos helyőrzöt (placeholder) találunk a fenti szintaktiká­ ban. (A 12.a jogosul tsagok.

Megengedi a felhasználóknak. STATUS RE LOAD REPLICATION CLIE NT REPLICATION S LAVE Megengedi a repiicaeion slave kiszolgálóknak. hogy adatbázisokat vagy táblákat töröljenek. Ha konk­ rét adatbázis vagy tábla meg lett határozva a GRANT utasításban. hostok. hogy sorokat (rekordokat) válasszanak ki táblák­ ból.1 táblázat: Felhasználói jogosultságok Jogosultság SE LECT Mire érvényes� Leírás táblák. Megengedi a felhasználóknak. Megengedi a felhasználóknak meglévő táblasorok törlését. Replikációk használatakor a master és a slave szerver esetén is megengedi a SHOW használatár.2 táblázat: Rendszergazda i jogosultságok Jogosultság CREATE T ABLES FILE LOCK TABLES PROCESS TEMPORARY Leírás Megengedi a rendszergazdának a CREATE nálatát. hogy ugyanazon a néven létre lehessen hozni. de érdemes tudni.1 táblázatban az alapvető felhasználói jogosultságokat láthatjuk. oszlopok táblák. INSERT UPDATE DE LETE INDEX ALTER CREATE adatbázisok. RE FERENCES A 9. Az ALTER jogosultság ugyan a táblázatok átnevezésén keresztül alkalmas lehet a jogosultsági rendszer megkerülésére. GRANT és az EXECUTE jogosultság. táblák Megengedi a felhasználóknak új adatbázisok vagy táblák létrehozását. hogy a felhasználók gyakran megkapják ezt a jogosultságot. naplók és táblák frissítését. hogy master kiszolgálóhoz csatlakozzanak. A replikációval a 12. hogy bármely felhasználóhoz tartozó szerverfolyamatokat megtekintsen. A biztonság és a használhatóság közőrt minden esetben átváltás áll fenn. Megengedi a felhasználóknak. TABLE utasításban a TEMPORARY kulcsszó hasz­ Megengedi az adatok fájlból táblába és táblából fájlba olvasását. akkor az adott nevű adatbázis vagy tábla csak akkor hozható létre. 9. Megengedi. Ellenke­ ző esetben először törölni kell. A 9. 9. A replikációval a 12. Megengedi a rendszergazdának. A normál felhasználók jogosultságainak nagy része a rendszerbiztonság szempontjából viszonylag ártalmatlan. amelyekre az ilyen típusú jogosultságok kioszthatók. A "Mire érvényest oszlopban találjuk azokat az objektumokat. Megengedi a felhasználóknak. ám a felhasználók széles körének szüksége van erre a jogosultságra. hogy új sorokat szúrjanak be a táblákba. hogy adott táblákra indexeket hozzanak létre és megszüntessék azokat. hogy meglévő táblasorokban lévő értékeket mó­ dosítsanak. E jogosultság nélkül a felhasználók csak azokat az adatbázisokat láthatják. oszlopok táblák. amelyekre másmi­ lyen jogosultsággal rendelkeznek. hogy a fel­ használó futtathatja-e ezeket. ha még nem létezik.2 táblázat a rendszergazdák (adminisztrátorok) által igényelt jogosultságokat tartalmazza. DROP adatbázisok. hogy például oszlopok hozzáadásával. fejezetben foglalkozunk majd.Webes adatbázis létrehozása 153 Az álcalános felhasználók jogosultságai közvetlenül az SQL parancsok adott típusaira vonatkoznak. A következő fejezetben részletesen áttekintjük ezeket az SQL parancsokat. Egyelőre csupán működésük elméleti leírását nézzük át. A OPTION-nel történik. oszlopok táblák táblák táblák Megengedi a felhasználóknak. Az ALTE R esetében önálló döntést kell hoznunk. fejezetben foglalkozunk majd. oszlopok vagy táblák átnevezésével és az oszlopok adartípusának a megváltoztatásával meglévő táblák szerkezetét módosítsák. táblák Megengedi a felhasználóknak. hogy a SHOW DATAB ASES SHOW DATAB ASES utasítással az összes adatbázis listáját megtekintsük. Megengedi a rendszergazdának a jogosultságtáblák újratöltését és a jogosultságok. 9 .1 táblában felsorolt jogosultságok mellerc létezik még a nincsenek használatban. ám ezek jelenleg WITH GRANT jogosultság kiosztása pedig a jogosul tsagok lista helyere inkább a A 9. Megengedi a L OCK TABLES utasítás explicit használatár. illetve arra.

Figyeljük meg. A fenti jogosultságok nem rendszergazdák számára is kioszthatók. fejezet Jogosultság SHUTDOWN SUPER Leírás Megengedi az adminisztrátornak a MySQL leállítását. A REVOKE parancs A GRANT ellentére a REVOKE. Használatával jogosultságokat vonhatunk meg a felhasználóhóL Szintaktikájában a GRANT­ hez hasonló: REVOKE jogosultsagok ON elem FROM felhasznaloi nev [(oszlopok}) A WITH GRANT OPTI ON mellékág használata esetén az alábbival vonhatjuk vissza az ott kiosztott jogosultságot (a többi­ vel egyetemben): REVOKE All PRIVILEGES. ALTER. köztük más felhasználókhoz tartozó adatbázisok. Jó eséllyel nem szereménk. amikor így teszünk. hogy bejelentkezzen. GRANT -> FROM fred. és megrudruk. Az ALL helyett írhatunk ALL is. mit szereme csinálni. amikor megadjuk ezt a jogosultságot.* -> TO sally IDENTIFIED BY 'magic123'. Megengedi a rendszergazdának. ezeket a 9. INDEX. vagy ajánljuk fel a felhasználónak az adatok betöltését! Két különleges jogosultság is létezik. FROM felhasznaloi nev GRANT Példák a GRANT és a REVOKE használatára Adminisztrátori felhasználó beállításához gépeljük be az alábbiakat: mysql> GRANT ALL 'mnbl23' -> ON * -> TO fred IDENTIFIED BY -> WITH GRANT OPTION. mert az adatok fájlból való betöltésével rengeteg időt megspórolhatnak.2 táblázatban felsorolt összes jogosultságot megadja. CREATE. és megengedi számára a jogosultságok továbbadását. aki nem rendelkezik jogosultságokkal: mysql> GRANT USAGE -> ON konyvek. ám a felhasználó ezen túlmenően semmire nem jogosult. PRIVILEGES-t USAGE Nem jogosultságot ad. az mnb12 3 jelszóval rendelke­ ző felhasználónak. Miután beszéltünk Sallyvel.3 táblázat mutatja. DELETE. ezért rajta. hogy a jogosultságok kiosztásához nem szükséges megadnunk Sal!y jelszavát l . INSERT. és megengedi. Ez a parancs rninden adatbázisra vonatkozóan megadja az összes jogosultságot a Fred nevű. ám fokozott óvatossággal érdemes eljárni. vonjuk vissza: mysql> REVOKE ALL PRIVILEGES. Icioszthatjuk neki a megfelelő jogosultságokat: 9 mysql> GRANT SELECT. A FILE jogosultság ebből a szempontból kicsit eltérő.1 és a 9.* -> TO sally. mert nem kell azokat újra bevinniük az adatbázisba. hanem felhasználót hoz létre.154 9. hogy bármely felhasználó folyamatait leállítsa. UPDATE. Legyünk elővigyázatosak. hogy legyen egy ilyen felhasználó a rendszerünkben. DROP -> ON konyvek. 93 tábla: Különleges jogosultságok Jogosultság ALL Leírás A 9. Azért lehet hasznos a felhasználóknak. Most már létrehozharunk egy általános felhasználót. A fájibetöltéssel azonban a MySQL kiszolgáló által látható bármilyen fájl betölthető. sőt akár a jel­ szófájlok is.

a MySQL hibaüzenetet ad. INSERT. hogy csökkentjük jogosultságainak a körét: mysql> -> -> REVOKE ALTER. hogy a telepítési folyamat részeként nem töröltük a névtelen felhaszná­ lókat. ahol az adatbaz is_neve az adatbázis nevét jelöli. ennek általában az az oka. * 'bookoramal23'. INDEX. hogy Sal!y valamiben mesterkedik az adatbázisban. aki csatlakozni képes a MySQL-hez. Jellernzően ugyanazt a felhasználói nevet és jelszót kapjuk parancssori használatra (táblák létrehozására srb. DROP BY > ON konyvek . dönthetünk úgy. REVOKE ALL Később. Bejelentkezéskor az első lépés a használni kívánt adatbázis meghatározása. CREATE. Webhoszting-szolgáltatás esetén általában a többi felhasználói jogosultságot is megkapjuk a szolgáltatás által számunkra lét­ rehozott adatbázison. felhasználói szintű MySQL felhaszná­ lói fiókba. amelyből megtudhatjuk. A use parancsra nem feltétlenül van szükség. hozzunk létre egy ilyen felhasználót. DELETE és UPDATE lekérdezést kell futtatniuk. Az alábbiakat kell ehhez begépelni: mysql> USE adatbazis_neve. hogy kódjaink képesek legyenek? Az esetek többségében csak a SELECT. a mintakód tesztelésére készen álló. INSERT.Webes adarbázis létrehozása 155 Ha úgy látjuk. amikor már egyáltalán nincs miért használnia az adatbázist. hogy meggyőződ­ hessünk arról. A parancs begépelése után a MySQL az alábbihoz hasonló választ ad: Database changed Ha a munka megkezdése előtt nem választjuk ki az adatbázist. Csak minimálisan csökkenti a biztonságot. A következőket kell ehhez beírnunk: mysql -D adatbazis_neve -h hostnev -u felhasznaloi_nev -p Példánkban a konyvek adarbázist kívánjuk használni: mysql> USE konyvek. ->TO beokorama IDENTIFIED Biztonsági okokból természetesen az itt láthatónál erősebb jelszót kell választani. Lépjünk vissza root-ként. ALTER. hogyan törölhetjük ki ezeket! Ezt követően már minden bizonnyal be tudunk lépni webes felhasználóként is. DELETE.) és webes szkriptcsatlakozáshoz (az adatbázis lekérdezéséhezJ. mert a következő részben szükségünk lesz rá! A qui t begépelésével léphetünk ki a MySQL monitorból. A következőképpen állít­ harjuk be ezeket a jogosultságokat: mysql> - GRANT SELECT. * 'bookorama123'. akkor be kellett lépnünk egy. Webes felhasználó beállítása PHP kódjainkhoz létre kell hoznunk egy felhasználót. mivel belépéskor is meghatározhatjuk az adatbázist. A megfelelő adatbázis használata Ha eljutottunk idáig. A következő utasítással állíthatunk be egy ilyen szintÜ jogosultsággal GRANT SELECT. amit vagy s:Yát magunk hoztunk létre. ha rnindkettő­ höz ugyanazt a felhasználói név-jelszó párost rendelkező felhasználót: mysql> - használjuk. * FROM sally. UPDATE BY > ON konyvek . DROP ON konyvek. * FROM sally. CREATE. UPDATE. Jelentkezzünk vissza webes felhasználóként. például az alábbihoz hasonlót: ERROR 1046 (3D000): No Database Selected 9 . rninden rendben müködik! Ha végrehajtódik az általunk kiadott GRANT utasítás. m:Yd lapozzunk a Függelékhez. DELETE. vagy a webes kiszolgáló rendszergazdája állított be számunkra. INSERT. de bejelentkezési kísérletün­ ket a kiszolgáló elutasítja. teljesen visszavonhatjuk jogosultságait: mysql> -> -> ON konyvek . ->TO beokorama IDENTIFIED Hajrá. Itt is érdemes a legalacsonyabb jogosultság elvét követni: rnire kell.

hogy már létrehoztuk a konyvek nevü adatbázist. Ennek • Megjegyzés: Jó. varas CHAR(30) NOT NULL CREATE TABLE megrendelesek rendelesiO INT UNSIGNED NOT NULL auto inerement vasarloiD INT UNSIGNED NOT NULL. Minden oszlopnál meg kell adni annak nevét. A tabla_neve helyére a létrehozni kívánt tábla nevét. Ez feltételezi. ha tudjuk. Cim. inerement PRIMARY KEY. szerzo CHAR(50). Varas) Osszeg. Szerzo. fejezet Adatbázistáblák létrehozása Az adatbázis beállitásának következő lépése a táblák létrehozása. asszeg FLOAT(6. sql CREATE TABLE vasarlok -A Book-O-Rama alkalmazás tábláit létrehozó SQL kód VasarloiD INT UNSIGNED NOT NULL auto nev CHAR(50) NOT NULL. Konyvek(ISBN. lakeim CHAR(l00) NOT NULL.perfactkíado. A általános alakja a következő: CREATE TABLE tabla_neve(oszlopok) CREATE TABLE SQL paranccsal tehetjük ezt meg.2).1 példakód a fenti táblák létrehozásához szükséges SQL kód. Datum) Megrendelesek(RendelesiD. Ertekelesek) A 9. A táblatípusokat a Haladó MySQL-programozás című B. hogy a MySQL-ben nem csak egyféle táblatípus vagy tárolómotor érhető el.sql (Ne feledjük el a host helyére beírni hosztunk nevét és meghatározni a boakorama. mert futtatás előtt nekünk tetsző szövegszerkesztőben dolgozha­ tunk az SQL kódon.hu/mellekletek oldalról letölthető mellékletében a sql 9_ fej ezet/bookorama. fejezetben tárgyaijuk meg. ar FLOAT(4. a MyiSAM-et használja. majd típusát.2) CREATE TABLE rendelesi tetelek . datum DATE NOT NULL ). Ar) ISBN. 9 ). PRIMARY KEY. Emlékeztetésként álljon itt ismét a Book-O-Rama adatbázis sémája: Vasarlok(VasarloiD. az oszlopok helyére pedig a táblába szánt oszlopok vesszővel elválaszton listáját kell beírnunk.156 9. Darabszam) Rendelesi_tetelek(RendelesiD. Lakeim. 9. CREATE TABLE konyvek isbn CHAR(l3) NOT NULL PRIMARY KEY. VasarloiD. eim CHAR(l00). például a mellékletekből betöltött SQL fájlt a következőképpen futtathatunk a MySQL-lel: > mysql -h host bookorama. fájlban találjuk ezt az SQL-t. Egyelőre adatbázisunk minden táblája az alapértelmezett tárolómotort.1 példakód: boakorama. Konyv_Ertekelesek(ISBN. -u boakorama -D konyvek -p < Meglévő. sql fájl teljes elérési Útvonalát!) A fájlátirányítás (file redirection) azért praktikus dolog. Nev. hanem tranzakcióbiztos típusokat is választhatunk. ) . A könyv http://www.

és az azonosíróknak nem negatív értékeknek (UNSIGNED ) kell lenniük. NOT NULL. amit egész típusú oszlopokon használhatunk. Ez a típus rögzített szélességű mezőket határoz meg. 9 . akkor is. Tábla létrehozásakor döntést kell hoznunk az oszlopok típusáróL Avasarlok tábla-mint azt a séma is meghatározza. hogy az oszlopba csak nulla vagy pozitív érték kerülhet. akkor a MySQL automatikusan egyedi azonosító értéket fog előállítani. Ez az oszlopban található maximális értéknél eggyel nagyobb lesz. hogy a megadott méretűvé tegye. Az összes többi oszlop karakterlánc (string) típus ú adatot fog tárolni. Minden táblát külön CREATE TABLE utasítás hoz létre. Eldöntöttük. Ahol a 9. a vasarloiD az elsődleges kulcs. AzAUTO INCREMENT-tel meghatározott oszlopokat indexeini kell. A szélességet zárójelben adhatjuk meg. Az oszloptípusok Példaként vizsgáljuk meg az első táblát: CREATE TABLE vasarlok vasarloiD INT nev CHAR(50) UNSIGNED NOT NULL auto_increment PRIMARY NOT NULL. A má­ sik lehetőség a rendelesi _tetelek utasítás végénél látható PRIMARY KEY mellékág használata.) Az egész típus után írt UN SIGNED kulcsszó azt jelenti. amikor sorokat szúrunk a táblába. ha nem mindet használjuk fel. Ez azt jelenti.1 példakódban használták-nevesen a vasarlok tábla vasarloiD oszlopában-. PRIMARY KEY (rendelesiD. hogy a tábla minden sorában értéknek kell lennie ennél a tulajdonságnáL Ha nem adjuk ki ezt a kulcsszót. A két típus között az is a különbség. A MySQL automatikusan indexeli ezt az oszlopot. Ez az adattípus minden esetben 50 karakternyi tárolóhelyet oszt ki a névre. CREATE TABLE konyv_ertekelesek isbn CHAR(l3) ertekeles TEXT NOT NULL PRIMARY KEY.négy oszlopból áll. hogy a VARCHAR kevesebb helyet használ. Az elsődleges kulcs auto­ matikus indexe gondoskodik azAUTO INCREMENT által elvárt indexről is. mert a tábla elsődleges kulcsa a két oszlopból jön ki. AzAUTO _INCREMENT típusú mezőből min­ den táblában csak egy lehet. egyes oszlopok pedig további specifikálókkal is rendelkeznek. ). hogy ha üresen hagyjuk a mezőt. AzAUTO_INCREMENT olyan különleges MySQL funkció. ). a mező lehet üres (NULL ) . Ezekhez a CHAR adattípust választottuk. hogy ez az oszlop a tábla elsődleges kulcsa.Webes adatbázis létrehozása 157 rendelesiO INT UNSIGNED NOT NULL. (Ez az indexet is a két oszlop alapján hozza létre. így a MySQL automatikusan kezelni fogja számunkra az azonosítókat. KEY. Az adattípus lehetséges alternatívája a V ARCHAR. Minden oszlop neve után megjelenik az adattípusa. isbn) darabszam TINYINT UNSIGNED. _ Az oszlop mögé írt PRIMARY KEY kulcsszó azt jelzi. AzAUTO _INCREMENT funkció nyújtotta előnyöket is kihasználjuk. azAUTO_INCREMENT kulcsszóval együtt jelent meg. Azért ezt alkalmaztuk itt. ám a CHAR gyorsabb. A többi kulcsszó jelentésének megismerése A NOT NULL azt jelenti. ezt közvedenül meghatároztuk. e szerint a nev például legfeljebb 50 karak­ ter hosszú lehet. és eggyel kevesebb dologra kell figyelnünk. Ebben az oszlopban egye­ di értékeknek kell lenniük. isbn char(l3) NOT NULL. Az első. amely csak a ténylegesen szükséges tárolóhelyet használja (és még egy bájtot). _ Az egy mezőből álló elsődleges kulcsot tartalmazó tábla esetén az oszlopnév mögé írjuk a PRIMARY KEY kulcsszót. hogy a séma minden táblája az előző fejezetben kiala­ kított oszlopokkal jön létre. hogy egész (INT) adattípusú lesz. lakeim CHAR(l00) varas CHAR(30) NOT NULL ). Láthatjuk. A MySQL szóközökkel tölti fel az adatot.

mint címét ( eim) . 9 majd tekintsük át az oszlopokhoz választott adattípusakad Először azonban nézzük meg a létrehozott adatbázist! . például cikkekhez alkal­ mazható.2). fejezet Láthatjuk. A lebegőpontos adattÍpusok nagy ré­ szénél meghatározhatjuk a megjelenítés szélességét és a tizedeshelyek számát. ertekeles TEXT ). azaz nem üresként határoz meg. Korábban már jeleztük. Ez a típus O és 255 közötti egész számot képes tárolni. szerzo CHAR(SO). korábban még nem tárgyalt adattípust használ: a TEXT hosszabb szövegekhez. mert általa kicsit gyorsabban futnak a dolgok. majd kiszámítjuk a végösszeget. ). A:z. ar FLOAT (4. darabszam TINYINT UNSIGNED. A rendelesi_tetelek tábla megmutatja. Itt nem szükséges elsődleges kulcsot generálni. V izsgáljuk meg a megrendelesek táblát létrehozó kódot: CREATE TABLE megrendelesek rendelesiO INT UNSIGNED NOT NULL auto vasarloiD INT UNSIGNED NOT NULL. A példában a rendelés értékét dollárban számít­ juk ki. Mi ennek az oka? Amikor rendelést viszünk az adatbázisba. Végezetül vizsgáljuk meg a konyv_ ertekelesek táblát: CREATE TABLE konyv_ertekelesek isbn CHAR(l3) NOT NULL PRIMARY KEY. PRIMARY KEY (rendelesiD. A dátumot tartalmazó datum oszlop DATE adattÍpusú. Pontosan ezt alkalmaztuk itt. vagyis üres legyen. datum DATE NOT NULL inerement PRIMARY KEY. hozzáadjuk a rendelt tételeket a rendeles i_t etelek táblához. hogy NULL . A többi mezőt azért hagy­ juk üresen. 2) ). Más CREATE utasításoknál eltérő szintaktikát láthatunk. Ezt az apró optimalizálási lépést minden lehetséges helyen érdemes alkalmazni. amit a fejezet egy későbbi részében részletesebben bemutatunk. a megrendelesek táblában kell létrehozni. hogy a többoszlopos elsődleges kulcsokat különleges elsődlegeskulcs-mellékággal határozzuk meg. mert az ISBN-kódok előállítása máshol történik. A táblák létrehozásának mélyebb megismerése érdekében vizsgáljuk meg az oszlopneveket és azonosítókat általánosságban. fejezetben részletesebben is foglalkozunk. osszeg FLOAT(6. hogyan kell többoszlopos (multicolumn) elsődleges kulcsokat létrehozni: CREATE TABLE rendelesi tetelek rendelesiO INT UNSIGNED NOT NULL. ). A konyvek tábla részben hasonló tulajdonságokkal bír: CREATE TABLE konyvek isbn CHAR(l3) NOT NULL PRIMARY KEY. ezért a végösszegnek kellően nagy (6 karakter szélességű) helyet. optimalizálással a 12. hogy minden oszlopot a NOT NULL kulcsszóval deklarál tak. szerzőjét ( szerzo) vagy árát (ar). Létezik néhány változata. így megengedjük.158 9. A tábla az osszeg kivételével minden oszlopot NOT NULL-ként. isbn) A tábla TINYINT UNSIGNED tÍpusúként határozza meg az adott könyvek mennyiségét. osszeg oszlop a meghatározás szerint float rípusú lebegőpontos számot tárol. eim CHAR(l00). A:z. Ez a tábla egy új. isbn char(l3) NOT NULL. A rendelés létrehozásakor nem tudjuk a végösszege t. a centeknek pedig két tizedeshelyet határoztunk meg. mert egy könyvesbolt hamarabb megtudhatja a könyvek ISBN-kódját.

hogy sok lekérdezést futtarunk egy olyan oszlopon.Webes adatbázis létrehozása 159 Az adatbázis megtekintése a SHOW és a DESCRIBE paranccsal Jelentkezzünk be a MySQL monitorba. probléma oka. 9 . mert az elsődleges kulcsok kijelölése indexeket hoz létre azokon az oszlopokon. akkor csak azon adatbázisok listáját látjuk. vagy navigálni rudjunk a nem általunk létrehozott adatbázisokban.00 sec) Ezek a parancsok kiválóan alkalmasak arra. fejezetben mutatjuk be. az adatbázisban lévő összes táblát tartalmazó listát jelenít meg: +-------------------+ l Tables in konyvek konyv_ertekelesek konyvek vasarlok rendelesi tetelek megrendelesek l +-------------------+ +-------------------+ 5 rows in set (0. A MySQL ekkor egy.) Az opcionális hoss z mezővel megadhatjuk. lndexek létrehozása Röviden beszéltünk már az indexekről. A MySQL ekkor megjeleníti az adatbázis létrehozásakor általunk megadott adatokat: +--------+------------+------+-----+---------+-------+ l Field isbn szero eim ar l Type l Null l Key l Default l Extr a l +--------+------------+------+-----+---------+-------+ char (13) char (50) char (100) float(4..(Táblákat ugyanis elsődleges kulcsok A vagy indexek nélkül is létre lehet hozni. Az új MySQL-felhasználók gyakran panaszkodnak az adatbázis gyenge teljesítményére.. amelyekhez jogosult­ sággal bírunk. hogy villámgyors.Ha a későbbiekben azt tapasztal­ juk. amely nem kulcs.2) NO YES YES YES PRI NULL NULL NULL NULL +--------+------------+------+-----+---------+-------+ rows in set (0. További információt kapharunk egy adott tábláról. hogy csak a mező első hossz karaktere legyen indexelve.] ) (A FULLTEXT indexek szövegmezők indexelésére szolgálnak. használarukat a 13.) Kezdésképpen tökéletesen megfelelnek számunkra az automatikusan létrehozott indexek. hogy eszünkbe juttassák egy adott oszlop típusát. A CREATE INDEX utasítással tehetjük ezt meg. hogy az index emelkedő ( ASC ) vagy csökkenő (DESC ) legyen. érdemes lehet a teljesítménynövelés érdekében inde­ xet adni az oszlophoz. pedig azt hallották a MySQL-ről. Azt is meghatároz­ hatjuk. a csökkenő az alapértelmezett. és válasszuk ki a konyvek adatbázist! Az ebben lévő táblákat a következő utasítás begépelésével tekinthetjük meg: mysql> SHOW TABLES. például a konyvek-ről a DESCRIBE paranccsal: mysql> describe konyvek.06 sec) A show paranccsal az adatbázisok listáját is kiírathatjuk: mysql> show databases. Ha nem rendelkezünk SHOW DATABASE$ jogosultsággal. . hogy nem hoztak létre indexeket az adatbázisukban. Az utaSítás általános alakja: CREATE [UNIQUEIFULLTEXT] INDEX index neve ON tabla_neve (index_oszlop_nev [(hossz) l [ASC l DESC].

160 9. A következő táblázatokban szögletes zárójelek közötti M betűvel jelölrük az ilyen adattípusokat.amelyekkel a következő fejezetben fogunk foglalkozni.a táblák pedig a fájloknak felelnek meg. Az M maxi­ mális értéke 255 lehet. egy pedig a tizedesjegynek) közül a kisebb.2 (vagyis a maximális meg­ jelenítési hosszúság mínusz kettő . nem biztos.hogy arnikor létrehozunk egy adott típusú oszlopot.az oszlopokat és az indexeket . A most következő leírásokban szögletes zárójelben jelöljük az opcionális értékeket. . Utóbbi esetén meghatározhatjuk a tizedespont (tizedesvessző) utáni 9 tizedesjegyek számát. általánosság­ Numerikus típusok A numerikus típusok egész vagy lebegőpontos számok. Erre a 9.és nagybetűket. Még egy kikötés van. Az adatokat tartalmazó mappa és fájlok helyét a konfiguráció határozza meg.1 példakódban láthatunk példát. \ és . Bármilyen karakter Bármilyen karakter Bármilyen karakter 255 Ezek a szabályok rendkivül megengedök.hogy rendszerünkön ez hol található: > mysqladrnin -h host -u root -p variables Ezt követően keressük meg a datadir változót! és ASCII(255) karaktereket. fejezet MySQL azonosítók Ötféle azonosítót használunk MySQL-ben: az adatbázisokat.valamint az aliasokat.illetve idézőjeleket nem használhatunk az azonosírókban (őszintén szólva nem is igazán értjük.erősségeikről és gyengeségeikről a ban azt a legkisebb típust kell választani. Ezen kategóriákon belül számos to­ vábbi típus található.4 táblázatban a lehetséges azonosírók összefoglalását találjuk meg. Ezt az értéket könyvünkben D-vel jelöljük. Egész típusoknál azt is meghatározhatjuk. nevezetesen az. Ennek közveclen hatása van az ezeknek adott nevekre.akkor az adatbázis.ám ugyan­ azon SQL utasíráson belül nem használhatjuk ugyanannak a névnek különbözö változatát.és táblanevek is így tesznek (például Unix alatt). 9. Mindhárom tÍpust különféle tárolási méretben választhatjuk.mint bármilyen programozás esetén: használjunk értelmes azonosítókarl Oszlopok adattípusainak kiválasztása Az oszlopok három alaptípusa MySQL-ben a numerikus. 12. hosszúság 64 64 64 64 Kisbetű-nagybetű-érzékenység Megengedett karakterek Adatbázis Tábla Oszlop Index Alias az operációs rendszerrel egyező az operációs rendszerrel egyező nem nem nem Az operációs rendszer által a mappanevekben meg­ engedett összes karakter.meghatározhatjuk a maximális megjele­ nítési hosszúságot.és nagybetűk között. Pusztán azért. mert egy adatbázisnak akár a 'create database' nevet is adhatjuk.amelyben elférnek az adataink.a táblákat. Sok adattípus esetén fennáll. A D legnagyobb értéke 30 vagy M. Az oszlop. egyéb­ ként nem (például Windows alatt). Az operációs rendszer által a fájlnevekben megen­ gedett összes karakter.hogy ezek alkalmazása esetén fordított aposztrófok (backtick) közé kell raknunk öket.kivéve: l és .és aliasnevek nem tesznek különbséget a kis. Természetesen a józan ész határain belül érdemes élni ezzel a szabadsággal.illetve azok kisbetű-nagybetű-érzékenységét is befolyásolja: ha az operációs rendszer mappa.amelyeket már mind jól ismerünk -.a dátum és idő és a karakterlánc.at: MySQL azonosítók Típus A 9. miért akarnánk ezeket használni).kivéve: l. A mysqladrnin parancs alábbi használatával deríthetjük ki.és fájlnevei megkülönböztetik a kis. Például: create database 'create database'. Amikor valamelyik oszloptípus mellett dönrünk. Ugyanaz az elv érvényes itt is. Az egyetlen megkötés. Az azonosírókban akár fenntartott szavakat és bármilyen különleges karaktert használhatunk. fejezetben olvashatunk részletesebben. Itt csak összefoglaljuk ezeket.4 tábláz.egy karakter a tizedespontnak. A MySQL adatbázisok a mögöttes fájlszerkezet mappáinak.hogy tényleg ezt kell választani.hogy UN SIGNED (nulla vagy pozitÍv) számok legyenek. hogy ASCII(O) Max.

5 táblázat tartalmazza..402823466E+ 38 4 Egyszeres pontosságú lebegőpontos szám.32767 vagy 0. Amikor ZEROFILL oszlopból származó értéke­ ket jelenítünk meg. Ezek a számok megegyeznek a FLOAT (4) típusúakkal. A DOUBLE[ (M. DOUBLE [ (M.65535 -8388608.. amely CHAR-ként tárolódik.175494351E-38 ±3.D)] ±1. Ezek a számok megegyeznek a FLOAT (8) típusúakkal. D) ] DECIMAL [ (M [. . 8388607 vagy 0 . FLOAT [ (M. Az egész típusokat a 9.l vagy 0.D) l DEC [ (M.. NUMERIC [ (M.l 8 A lebegőpontos tÍpusokat a 9.D)] Mint fenn Mintfenn Mintfenn A DECIMAL típussal megegyező. D) ] REAL [ (M. A DECIMAL típussal megegyező. 9.6 táblázatban találjuk. 9 .232.l 2 3 az előjeles (signed).7976931348623157E+ 308 ±2.2250738585072014E-308 8 Kettős pontosságú lebegőpontos szám.. A DECIMAL típussal megegyező.D)] FI XED [ (M. vezető nullával lesznek kitöltve..Webes adatbázis létrehozása 161 Minden numerikus tÍpusnál megadhatjuk a ZEROFILL tulajdonságot.16777215 -231 231. D) l tÍpussal meg­ egyező. Ha egy oszlopra beállítjuk a ZEROFILL tulajdonságot.D)] ±1.6 táblázat: Lebegőpontos adattípusok Típus FLOAT(pontosság) Tartomány A pontosságtól függ Tárolási mé­ ret (bájt) Változó Leírás Egyszeres vagy kettős pontosságú le­ begőpontos számok meghatározására használható. ám megha­ tározott megjelenítési szélességgel és meghatározott számú tizedesjegyekkel rendelkeznek. automatikusan UNSIGNED is lesz. Lebegőpontos szám.128 vagy 0 . 9. A tartomány a megjelenítési szélességtől ( M) függ. D) l típussal meg­ egyező..264 . A táblázatban közölt tartományok közül az első sor sik az előjel nélküli ( unsigned).5 táblázat: Egész adattípusok Típus TINYINT [ (M) l BIT BOOL SMALLINT [ (M) l MEDIUMINT [ (M)] -32768.255 Tárolási méret (bájt) l Leírás Nagyon kicsi egész számok A TINYINT típussal megegyező A TINYINT típussal megegyező Kis egész számok Közepes méretű egész számok Normál egész számok Az INT típussal megegyező Nagy egész számok INT[ (M) l INTEGER [ (M)] BIGINT [ (M)] •• 4 -263 263 •• - l vagy 0..D]) l Mintfenn Mintfenn Változó M+2 A DOUBLE [ (M. ám megha­ tározott megjelenítési szélességgel és meghatározott számú tizedesjegyekkel rendelkeznek. a má­ Tartomány -127. DOUBLE PRECISION[ (M.

hogy rarrománya sokkal nagyobb. A B LOB-ok.és négyszámjegyű formárum választható. Mivel ezek az oszloptípusok nagy mennyiségű ada­ 9 rot képesek tárolni. hogy az adott oszlopban lévő értékeknek meghatározorr értékhalmazból kell származniuk Az oszlopban lévő érrékek a halmaz egynél több értékét tartalmaz­ hatják. A gyakoriarban a BLOB és a TEXT típusú oszlopok megegyeznek. 9. hogy a BLOB kisberű-nagyberű-érzékeny. illetve bináris adarokhoz valók. Ez a CHAR (meghatározott karakrerhosszúságú) és a VARCHAR (változó karakrerhosszúságú) típus. A CHAR típusú oszlopokban lévő adatok mérerűkről függetlenül szóközökkel vannak a maximális szélességre kirölrve. Tranzakcióköverésre hasznos időbélyeg. Ezzel a kérdéssel a 12. Az első csoportba az egyszerű karakterláncok. arniről részlete· sebben olvasharunk majd a 12. fejezetben foglalkozunk részleresen. fejezer Dátum és idő típusok A MySQL sokféle dátum és idő típusr támogat.8 ráblázaror!). Év. hogy egy adorr sor TIMESTAMP oszlopának érréke a soron végzerr legutolsó műveler dárumár és időponcjár fogja murarni . A SET típus azt írja elő.vagyis a rövid szövegda­ rabok-tartoznak. használarukat érdemes különösen megfontolni.7 táblázat: Dátum és idő adattípusok Tartomány 1000-01-01 9999-12-31 -838:59:59 838:59:59 Típus DATE Leírás YYYY-MM-DD formárumban megjelenő dárum.7 táblázarban Járjuk ezeket. az egyeden különbség közörrük. hogy a MySQL CHAR típusú adatok visszakeresésénél és VARCHAR típusú adatok eltárolásánállevágja azokról a sor· végi (záró) szóközöker. A harmadik csoportba kér különleges típus tartozik: a SET és az ENUM. A második csoportba a TEXT és a BLOB típus tartozik. Egy adott halmaz legfeljebb 64 elemből állhat. 9. bárrnir képesek tárolni -így képet vagy hangadator is. TIME HH: MM: SS formárumban megjelenő idő. Kér.162 9.8 táblázat a TIMESTAMP különböző megjelenítési típusair tartalmazza. amelyek eltérő rarrománnyal rendelkeznek. A megjelenítési for­ márum az M ércékéről függ (lásd a következő. Minden típusnál karakrerlánc. ha saját kezűleg más érrékre állítjuk Ez a funkció a rranzakciók rögzítésénél lesz igazán hasznos.Ol. Figyeljük meg. 9. a 9. TIMESTAMP [ (M) l YEAR [ (2 l 4) l 70-69 ( 1970-2069) 1901-2155 A 9. fejezetben. (Irr kell megemlíteni. minr amire valaha is szükségünk lehet! YYYY-MM-DD HH: MM: SS DATETIME 1000-Ol.Ol 00:00:00 9999-12-31 23:59:59 1970.8 táblázat: A TIMESTAMP megjelenítési típusai Megjelenítés YYYYMMDDHHMMSS YYYYMMDDHHMMSS YYMMDDHHMMSS YYMMDDHHMM YYYYMMDD YYMMDD YYMM yy Kiválasztort típus TIMESTAMP TIMESTAMP(14) TIMESTAMP(12) TIMESTAMP(lO) TIMESTAMP(S) TIMESTAMP(6) TIMESTAMP(4) TIMESTAMP(2) Karakterlánc�típusok A karakterlánc-típusok három csoportba sorolhatók. Ezek a különböző mérerekben elérhető típusok hosszabb szöveghez. A tartomány felső harára a Unix koriárjáról függ. amelyek a bitiary large object (nagy bináris objekrumok) kifejezésből kaprák nevüket. Mind­ kerrőnek meghatározhatjuk a szélességét.kivéve. Érdemes megjegyezni.) A kér típus közörtí választáskor a tárhely és a sebesség közörti árváitással szembesülünk.Ol 00:00:00 Valamikor 2037-ben formárumban megjelenő dárum és idő. .és numerikus formárumban is bevihetjük az adatokat. a TEXT nem az. a VARCHAR oszlopok szélessége ugyanakkor a bennük lévő adarról függőerr változik.

l (vagyis 255) 28 -l (vagyis 255) 216..Webes adatbázis létrehozása 163 Az ENUM az angol enumeration. 1.l (vagyis 16 777 215) 224 -l (vagyis 16 777 215) 232-1 (vagyis 4 294 967 295) 232. A rípusokat találjuk. . CHAR [NATIONAL] VARCHAR(M) A CHAR (l) típussal megegyező. (A kisbetü-nagybetű-érzékenység az alap­ értelmezett. ám az köztük a kü­ lönbség. azért szerepel mégis. 9. 9.l (vagyis 65 535) 216-l (vagyis 65 535) 224. 9. .255 karakter Leírás M rögzített hosszúságú karakterlánc. 9. ximális száma 65 535 64 .11 táblázat: Az ENUM és a SET típus Típus ENUM (ertekl'. hogy az alapértelmezett ka­ rakterkészletet kell használni..11 táblázatban foglaltuk össze. csak változó hosszúságúak. hogy az ilyen típusú oszlopok a megadott értékek és a NULL közül egyet vehetnek fel. Az ilyen típusú oszlopok a meghatározort értékek egy halmazár vagy a NULL értéket tárolhatják.9.255 karakter [BINARY] Mint fent. ahol M O és 255 közé esik.) SET (ertekl'. azaz felsorolás kifejezésből adódik. A BINARY kulcsszó azt eredményezi.) 9 . merr az ANSI SQL szabvány része. A NATIONAL kulcsszó meghatározza. és a felsorolás legfeljebb 65 535 elemet tartalmazhat.9 táblázatban az egyszerű karakterlánc­ Tartomány O.l (vagyis 4 294 967 295) A 9. A karakterlánc-adattípusokat a 9. .10 táblázat a TEXT és a BLOB típusokat mutatja be.. hogy az adatot kisbetű-nagybetű­ érzékenyként kell kezelni.10 táblázat: A TEXT és a BLOB típusok Típus TINYELOB TINYTEXT BLOB TEXT MEDIUMBLOB MEDIUMTEXT LONGBLOB LONGTEXT Maximális hossz (karakterekben) Leírás Apró nagy bináris objektum (BLOB) mező Apró TEXT mező Normál méretű BLOB mező Normál méretű TEXT mező Közepes méretű BLOB mező Közepes méretű TEXT mező Hosszú BLOB mező Hosszú TEXT mező 28.11 táblázat az ENUM és a SET típusr mutatja be. Egy TEXT mező karakterekben kifejezett maximális hossza az abban a mezőben tárolható fájl bájtokban kifejezert maximális méretéve[ egyenlő.) Az ASCII kulcsszó azt határozza meg.10 és 9..ertek2'. A halmaz elemeinek ma­ Leírás Az ilyen típusú oszlopok a felsorolt értékek és a NULL közül egyet tárolhatnak. A 9. hogy az oszlop· ban latinl karakterkészlet lesz használva. Ez is az alapértelmezett MySQL-ben. Az UNICODE kulcsszó az ucs karakterkészlet használatát jelzi.9 táblázat: Hagyományos karakterlánc-típusok Típus [NATIONAL] [BINARY l UNICODE] CHAR(M) ASCII l 9. A SET típushoz nagyon hasonló.ertek2'.

mysql. illetve hogyan kérdezhetünk le az adatbázisbóL 9 . fejezet További olvasnivaló Az adatbázisok létrehozásáról a MySQL online kézikönyvében (http:/ /www. hogyan frissíthetjük és törölhetjük azokat. hogyan hozharunk létre felhasználókat. hogyan vihetünk adatokat a táblába. Hogyan tovább� Miután megtudruk. figyelmünket az adatbázissal való mun­ kára fordítjuk. A következő fejezetben megnézzük. adatbázisokat és táblákat.com) olvashatunk bővebben.164 9.

mert az az SQL-nek az adatok adatbázisban tárolásához és adatbázisból visszakereséséhez szükséges része. a Sybase és a Microsoft SQL Server. és az adott sor oszlopértékei tárol­ ják a valós világbeli objektumra vonatkozó információkat. Adatsorokat INSERT utasítással helyezhetjük az adatbázisba.10 �unkavégzés�yS�L adatbázisunkkal A fejezetben bemutatjuk az SQL-t. hogy az RDBMS-ek táblákból állnak. Az SQL rnindkettőt lefedi. illetve az. fejezetben találkoztunk az SQL-beli adatdefinícióval (DDL). Többek között olyan adatbázisrendszerek használják. amelyek pedig oszlopokba rendezett adatok sorait tartalmazzák. A 9. Ha eddig még nem hoztuk volna létre a Book-O-Rama adatbázist. beállításakor van szükség. Emlékezhetünk. azaz a strukturált lekérdező nyelv rövidítése. megtanuljuk. hogy miért érdemes használni. adatokat kell el tárolni benne. A MySQL által használt SQL és az ANSI SQL közörri különbségek celjes lisrája a MySQL online kézikönyvben található meg. fejezeeben találjuk. A fontosabb eltérések­ re menetközben kicérünk majd. illetve hogyan kérdezhetünk le az adatbázisbóL A fejezetben az alábbi főbb témakörökkel foglalkozunk: Mi az SQU • Adatok beszúrása adatbázisba Adatok visszakeresése adatbázisból Táblák összekapcsolása Egymásba ágyazott lekérdezések használata Rekordok frissítése az adatbázisban Táblák módosícása létrehozásuk után Rekordok rörlése az adatbázisból Táblák törlése • • • Először is bemutatjuk. hogyan lehet adatokat beszúrni. Adatok beszúrása adatbázisba Mielőtt komoly munkát végezhetnénk az adatbázissal. az A táblák egy-egy sora általában valamilyen valós világbeli objektumot vagy kapcsolatot ír le. Bizonyára találkoztunk már lekérdezésére használt az.1/ en/ comparibiliry. Az SQL-hez ANSI-szabvány tartozik.adatbázisok -Data Manipulalion Language (DML) kifejezéssel. és valamennyir már dolgozrunk is vele. Folytatjuk a Book-O-Rama adat­ bázis fejlesztését. . az Oracle. törölni és frissíteni. mi az SQL. Az SQL DML oldalát sokkal gyak­ rabban használjuk. MiazSQL: Az SQL a Structured Query Language. másik részük azonban szándékos. mint a MySQL. különben nem fogjuk tudni nmatni a fejezetben lévő SQL lekérdezéseket! Az erre vonatkozó utasításokat a Webes adatbázis létrehozása címü 9. A leggyakrabban az SQL INSERT urasí­ rását fogjuk használni erre. a PostgreSQL.egyebek között . tegyük meg most. A D DL-re az adarbázis kezdeti létrehozásakor. A legelterjedtebb nyelv relációs adatbázis-ke­ zelő rendszerek (RDBMS) elérésére. majd kiderül az is. Az SQL-lel adatokat tárolhatunk az adatbázisban. Ezen különb­ ségek egy részét a MySQL későbbi verzióiban tervezik megszüntetni.htrnl. Az adott oldalt .adarbázisok definiálására használt Data Definition Language (DDL).az alábbi címen érhetjük el: http:/ l dev. illetve áttekintjük használatát az adatbázisok lekérdezésére. illetve a hozzá hasonló adatbázisrendszerek általában ennek a szab­ ványnak a megvalósítására törekszenek. és a MySQL.mysql.com/ doc/re&nan/5. Néhány apró eltérés van a szabványos SQL és a MySQL SQL-je között. az utóbbié pedig - adatkezelő nyelv. Az előbbi jelentése adatdefiníciós nyelv. illetve visszakereshetjük azokat.

. '2007-04-02'}. 'Julie Smith'. vasarlok VALUES '25 Oak Street'. amikor nem olvas adatokat a táblából. (5. Például ahhoz. 3. 'Michelle Arthur'.. (Könyvünkben egyszeres és kétszeres idézőjeleket egyaránt haszná­ lunk. . '2007-04-15'}. INSERT INTO (3. Ha csak egyes oszlopokba szeretnénk adatot rakni. a többi ügyfél hozzáadásakor pedig figyelmen kívül hagytuk az oszlopot! Emlékezzünk vissza. hogy a rendszer várhat a beszúrással addig. Minden sort zárójeleken belülre kell írni. ahova adatokat szetetnénk pakolni. az ertekl. hogy a Book-O-Rama adatbázis vasarlok táblájába szúrjunk be egy rekordot.) Számok és dárumok esetében nincsen szükség az idézöjelekre. ' Ez a megközelítés akkor nyer értelmet. láthatjuk. }] [INTO] VALUES 10 (ertekl.. (4.. oszlop2. nem kell megvárni. ertek2 (NULL. amelyek az egyszerre többsoros beszúrást alkalmazzák. amelyben a mezöNULL értékű vagy érték nélküli. az utasítás oszlopokra vonatkozó részében fel kell sorolnunk ezeket az oszlopokat.}.99. 24. Az előbbi azt jelenti. vagy másmilyen sorrendben szeretnénk meg­ határozni azokat. Egyszerre több sort is beszúrharunk egy táblába.98. Ez azt jelenti. amig azINSERT Közveclenül ezt követően opcionálisan használharjuk azIGNORE kulcsszót. 'Julie Smith'. helyére pedig a konkrét értékek mennek. 'Alan Wong'. hogy a t abla helyére annak a táblának a nevét írtuk. vagy a rekord egyes mezöi nem kötelezően kirölrendök. Például: INSERT INTO vasarlok (nev. Figyeljük meg. . AzINSERT utasítás néhány további változatban is létezik. Ha a kiszolgáló elfoglalt. hogy amikor létrehoztuk az adatbázist. Összeállítortunk néhány egyszerű mintaadatot. hogy ha olyan sorokat pró­ bálunk beszúrni. Az INSERT utasítással kapcsolarban érdemes néhány érdekességet megemlíteni. 98. Látható. '2007-04-19'}. 'Leeton'. N ar Nar Goon North') . '357 North Road'. (NULL. hogy Julie Smith adatainak megadásakor NULL értéket határozrunk meg a vasarloid oszlopnak. (NULL. 'Airport West'}. '1/47 Haines Avenue'. folytathatjuk a lekérdezések művelet befejeződik. Egy további lehetőség azINSERT nosUPDATE utasítás végén azON DUPLICATE KEY UPDATE használata. oszlop3. '2007-05-01'}. kulcsszó azt jelenti. hogy egy általá­ utasítások sorozatát utasítással (amellyel a fejezet egy későbbi részében foglalkozunk) megváltoztassuk a duplikált értéket. 49. 'Airport West'}. sql fájljában találjuk.1 példakód: konyv_beszuras. Ezt a kódrészletet a könyv letölthető mellékletének \l O_ 10. varos} VALUES (Melissa Jones'. így ez kissé furcsának tűnhet. EgyszerűINSERT fej ezet \konyv _ beszuras. hogy a beszúrt adatunk pufferbe kerül. 'Box Hill'}. l. a MySQL az előző értéket automatikusan eggyel megnövelve hozza létre és szúrja be az értéket. akkor azokat a rendszer csendben figyelmen kívül hagyja. stb. ertek3. amelyek duplikált egyedi kulcsot eredményeznek.. Példánkban az értékek idézőjelek közé kerültek. Ez arra jó.99. 2. megrendelesek VALUES 69. Ez azt eredményezi. ertek2. a következöket kell begépelni: INSERT INTO vasarlok VALUES '25 Oak Street'. illetve a 10. 74. amelyekkel feltölthető az adatbázis. a vasarloid oszlopot a vasarlok tábla elsődleges kulcsaként határozruk meg. A karakterláncokat MySQL-ben mindig egyszeres vagy kétszeres idézőjelek közé kell rakni. és a sorokat tartalmazó zárójele­ ket vesszővel kell egymásról elválasztani. Az irt megadort értékek sorban fogják a táblázat oszlopait kitölteni. futtatását. (NULL. hogy amikor olyan sort szúrunk be.sql. A mezőt azonbanAUTO _INCREMENT-ként határozruk meg.166 10. Ugyanezt a végeredményt érjük el a következő szintakrikával is: INSERT INTO lakeim varos = vasarlok SET nev = 'Michael Archer'. Igen hasznos funkciója ez a MySQL-nek. = '12 Adderley Avenue'. AzINSERT szó után aLOW _PRIORITY ADELAYED vagy a DELAYED kulcs­ szó is használható. ha csak részleges adataink vannak egy adott rekordhoz. INSERT INTO 3.A Book-O-Rama tábláitjeltöltö SQL kód USE konyvek. fejezet Az INSERT INSERT utasítás általános formája a következő: tabla [(oszlopl. (NULL.1 példakód is ezt mutatja. 'Yarraville'}.

két INSERT példautasítást. ('0-672-31745-1'. l)' l)' 3). 24.99). 10 'Thomas Schenk'.99). Amennyiben betöltöttük a 10. Elös�ör uonban néz�ünk egy olyan. 49. akkor a lekérde�és eredménye a következő les�: l varos +-----------------+--------------------+ l nev Julie Smith Alan Wong Michelle Arthur Melissa Jones Michael Archer +-----------------+--------------------+ Airport West Box Hill Yarraville Nar Nar Goon North Leeton +-----------------+--------------------+ Láthatjuk.sql Adatok visszakeresése adatbázisból Az SQL igáslova a SELECT utasítás. (2.99). 'Michael Margan'. '0-672-31745-1'. 'Installing et al. opcionális mellékágak nélküli lekérdezést. (Lehetnek ugyanakkor MySQL kifejezések eredményei is. '0-672-31697-8'' '0-672-31769-9'' '0-672-31769-9'' '0-672-31509-2'. 34.99). 'Pruitt. ( '0-672-31769-9'. ('0-672-31509-2'. .i. Debian GNU/Linux'. A következöképpen futtathatjuk át MySQL-en a fenti szkriptet a parancssorból: > mysql -h host -u bookorama -p konyvek < /path/to/konyv_beszuras. Néhány has�nosabb kifejezéssel a következő rés� végén megis­ merkedhetünk. 2)' l)' (3. 'Morgan könyve jól érthető. INSERT INTO konyv_ertekelesek VALUES ('0-672-31697-8'.) A� alábbi lekérdezés a vasarlok tábla nev és varos os�lopának tartalmát listáz�a ki: SELECT nev. hogy a táblá�at meghatározott kritériumoknak megfelelő sorainak k. amely néhány elemet válogat le egy adott táblából! E�ek a� elemek jellemzöen a táblázat os�lo­ pa. 'Teach Yourself GIMP in 24 Hours'. Arra has�náljuk. System Administration Unleashed'.'). (4 . 'Java 2 for Professional Developers'. 24.'.1 példakód rnintaadatait. A SELECT alapvető formája a következő: SELECT [opciokl elemek [INTO fajl reszleteil FROM tablak WHERE feltetelek l GROUP BY csoport_tipusa HAVING feltetel l ORDER BY rendezes_tipusa [LIMIT korlatozasi_feltetel l l [PROCEDURE eljaras_neve(parameterek)l [zarolasi_opciokl A következő rés�ekben u utasítás minden egyes mellékágát bemutatjuk. (3. hogy a fenti tábla a megadott tábla ( vasarlok ) kiválas�tott elemeit ( nev és va ros) tartalmu�a. E�ek a� ada­ tok a vasarlok tábla minden sorából meg lettek jelenítve.Munkavég�és MySQL adatbázisunkkal 167 INSERT INTO konyvek VALUES ( '0-672-31697-8' . 'Thomas Down'. illetve végrehajtottuk a fejezet korábbi részében bemutatott. varos FROM vasarlok. 'Caldera OpenLinux INSERT INTO rendelesi tetelek VALUES (l.iválas�tásával adatokat kapjunk viss�a u adatbázisbóL Rengeteg különbö�ö lehetőség és módszer van a SELECT utasítás alkalmuására. tartalma messze meghaladja a piacon levő alapszintű Java könyvek anyagát.

1 táblázatban találjuk. mint Nagyobb egyenlő Kisebb egyenlő Nem egyenlő Példa vasarloid = Műveleti jel > < >= <= = vagy<> Leírás 3 Két érték egyenlőségér állapítja meg. figyeljük meg. könnyen összezavarodharunk! Az egyenlőségen túlmenően a MySQL műveleti jelek és reguláris kifejezések széles skáláját támogatja. Az alábbi kód például: SELECT * FROM megrendelesek WHERE vasarloid = 5. Megállapítja. hogy a mező tartalmaz-e értéket.00 osszeg < 60.00 mennyiseg 1 != o IS NOT NULL lakeim is not null . A WHERE mellék­ ágakban leggyakrabban használrakat a 10. amelyeknek vasa r lo i d-je 5. Megállapíga. Ha például a rendeles i_tetelek tábla összes oszlopát és sorát szetetnénk visszakapni.98 24. mint a másik. amely a következő kimenetet eredményezi: +------------+---------------+-----------+ l rendelesid l 2 3 3 4 l isbn 0-672-31697-8 0-672-31769-9 0-672-31769-9 0-672-31509-2 0-672-31745-1 l mennyiseg 2 l l l 3 l +------------+---------------+-----------+ +------------+---------------+-----------+ Adott feltételeknek megfelelő adatok visszakeresése Hogy a táblázat sorainak részhalmazához férjünk hozzá. A lista nem teljes. Ennek a lekérdezés­ nek a kimenete: +------------+------------+--------+------------+ l l l rendelesid l 4 l l l vasarloid 5 5 l l l összeg 69. hogy az egyik érték nagyobb vagy egyen­ lő-e. akkor az alábbi SQL kódot kellene használnunk: SELECT * FROM rendelesi tetelek. Jelen esetben azokat a sorokar választor­ ruk ki. ha nem találjuk itt. hogy a két érték nem egyenlő. Nagyon hasznos a dzsókerkarakter ( * ). mint a másik.168 10. Megállapíga.00 osszeg <= 60. Megállapítja. Az egyszeres egyenlőségjelet az egyenlőség ellenőrzésére használjuk. mint a má­ sik.99 l l l datum 2007-04-02 2007-05-01 l l +------------+------------+--------+------------+ +------------+------------+--------+------------+ A WHERE mellékág határozza meg az adott sorok kiválaszrására használt feltételt. hogy az egyik érték kisebb vagy egyenlő-e.1 táblázat: WHERE mellékágakban gyakran használt összehasonlító műveleti jelek Név (ha van) Egyenlőség Nagyobb. os szeg > 60. mint a másik. nézzük meg a MySQL kézikönyvben! 10. a megrendelesek összes oszlopát kiválaszga.00 osszeg >= 60. hogy az egyik érték kisebb-e. fejezet Az oszlopokat a SELECT kulcsszó után tetszőleges számban felsorolhaguk. és ha egyszerre használjuk a kér nyelvet. valamilyen kiválasztási feltételt kell meghatároznunk A WHERE mel­ lékágban tehetjük meg ezt. mint Kisebb. hogy ez eltér a PHP-beli használattól. Számos további lehetőség közül választha­ runk a lekérdezés kialakításakor. amit keresünk. hogy az egyik érték nagyobb-e. amely a megadott tábla vagy táblák összes oszlopát 10 kiválasztja. Megállapíga. Megállapítja. ám csak azokat a sorokat. ahol a vasarloid értéke 5.

Részleresebben a Karakterláncok kezelése és reguláris kifejezések címü 4. fejezerben ismertünk meg. Ahhoz. hogy pontosan mit rendeltek.Munkavégzés MySQL adatbázisunkkal 169 Műveletijel IS NULL BETWEEN Név (ha van) Példa lakeim is null osszeg between Leírás Megállapítja. Például: SELECT * FROM megrendelesek WHERE vasarloid = 3 OR vasarloid = 4.rendelesid. hogy két vagy több táblát összekapcsolva követhetjük az adatok közötti kapcsolatokat. hogy az érték nagyobb vagy egyenlő-e a minimum értékkel. Bár az összekapcsolás elvileg egyszerű dolog. illetve a tetszőleges számú speciális karaktert helyettesítő% (százalék) jelből és az egyetlen karaktert helyettesítő_ (alulvonás) karakterből épülhernek fel. Megállapítja. "Moe") LIKE Mintaillesztés Minraillesztés Reguláris kifejezés nev like (Fred %") NOT LIKE nev not like (Fred REGEXP " % ) nev regexp A táblázat utolsó három sora a LIKE és a REGEXP kulcsszóra hivatkozik. hogy az érték illeszkedik-e egy adott mintához. IN varos in (Carl ton'. amit a Webes adatbázis megtervezése című 8. a kettő egymás szinonimája. Egyszerű SQL mintaillesztéssel ellenőrzi. hogy mező nem tartalmaz értéket. majd a megrendelesek táblában az ahhoz tartozó megrendeléseket. hogy ezeket az információkat összerakjuk SQL-ben. és mindegyik más célra alkalmazható. megrendelesek. Ha például azt szereménk tudni. megrendelesek = megrendelesek. "Moe") NOT IN city not in (Carlton". _ Egyszerű. . a rendelesi tetelek táblát is meg kell néznünk. Ellenőrzi.osszeg.datum WHERE vasarlok. Ha szeret­ nénk megtekinteni például a Julie Smith vásárló által feladott megrendeléseket.vasarloid megrendelesek. Adatok visszakeresése több táblázatból Hogy valamely kérdésünkre választ kapjunk egy adatbázisból. Ez a jó adatbázis­ tervezés egyik alapelve. Ellenőrzi. A POSlX-féle reguláris kifejezéseker PHP­ ben is használjuk. O and 60.00 IlO \.vasarloid. Ez egyszerűen azt jelenti. fejezerben olvashattunk róluk. Megállapítja. mégis egyike az SQL finom és összetett területeinek. hogy egy érték illeszkedik-e egy reguláris kifejezéshez. gyakran egynél több tábla adarait szükséges felhasználnunk. egy összekapcsolás (join) nevü müveletet kell végtehajtanunk.nev 'Julie Smith' = AND vasarlok. az AND és OR segitségével pedig még összetettebb szürőfelréreleket hozhatunk létre. hogy az érték nem illeszkedik egy adott mintához. hogy az érték megtalálható-e az adott halmazban. Ezek az elemek külön táblákban helyezkednek el. és kisebb vagy egyenlő-e a maximum értékkel. A REGEXP kulcsszó helyett az RLIKE is használható. a vasar l ok és a megrendelesek táblát kell megnéznünk. mert a valóság különböző objektumaihoz kapcsolódnak. Egyszerűen a müveleti jelek és a mintaillesztési szintakrika használatával többféle feltételnek megfelelő lekérdezéseker hajt­ harunk végre. FROM vasarlok.Julie Smith-szel kapcsolatos lekérdezés SQL kódját: SELECT megrendelesek. Mindkettő a mintailleszrés egy-egy formája. A LIKE egyszerű SQL mintailleszrésr alkalmaz. Ha arra is szükségünk van. ki kell keresnünk a vasarlok táblábanJulie ügyfél-azonosítójár ( vasarloid) . Számos különböző ösz­ szekapcsolási típust valósíthatunk meg MySQL-ben. kéttáblás összekapcsolás Kezdésképpen nézzük meg az imént említett. A minták szabályos szövegből. . A REGEXP kulcsszór reguláris kifejezéshez illeszrésre használjuk. Megállapítja. hogy melyik vásárló adott le rendelést ebben a hónapban. A MySQL POSlX-féle reguláris kifejezésekkel dolgozik. hogy az érték nem ralálható meg az adott halmazban.

hogy melyik tábla oszlopára hivatkozunk. vasarloid pedig a megrendelesek tábla vasar l o id oszlopát jelöli. hogy reklámot küldjünk neki egy újonnan megjelenő Java kiadványról). és csinálj belőlük egy nagy táblát! A nagy tábla sorai a felsorolt táblák sorainak összes lehetséges kombinációját tartalmazzák. így igazából nem szükséges meghatároznunk. Pél­ dánkban a tabla. Figyeljük meg. 99 2007-04-02 2007-05-01 l l 4 +------------+--------+------------+ Érdemes néhány dolgot megemlíteni. hogy a táblákat párosával kell az összekapcsolási feltételekkel összekapcsolni. akár nincs!" Más szavakkal olyan táblát kapunk.98 2 4 . mivel a lekérdezés végrehajtásához két tábla adataira is szükség van.170 10. Végül a rendelesi tetelek _ . függetlenül attól. hogy a megrendelesek táblából eljussunk a rendelesi tetelek tábláig.például egy adott vásárló által feladott megrendeléseket. a rendelésazonosítót ( rendelesid) kell használni. ha vasarlok. oszlop megnevezést használtuk. ha összekapcsolás i Jeltételt (join condition) rakunk a WHERE mellékágba. akik legalább egy olyan megrendelést feladtak.vasarloid Ez közli a MySQL-lel.vasarloid Ezt a hivatkozási módszert a lekérdezésben szereplő minden oszlopnál használhatj uk. Avasarlok táblából a vasarloid használatával jutunk el a megrendelesek táblához. Az emberek számára a nev önmagában ködös lehet. akkor különböző adatbázisok ugyanolyan nevű oszlopainak megkülönböztetésére is alkalmas. amelynek ápusa: egyenösszekapcsolás (equi-join). mint a kéttáblás összekapcsolás. Ahhoz. akár van értelmük.minden bizonnyal anélkül. ahol a vasarlok tábla ügyfél-azonosítója megegyezik a megrendelesek tábláéval. Általános szabályként el­ mondható. nev ' = Julie Smith ' feltétel esetében. vagyis a vasarlok. hogy az adott vásárló adta-e le az adott rendelést. ha egynél több táblában fordul elő. A MySQL nem igényli ezt. hogy ezt a szokást követtük az előző lekérdezés többi részében. fejezet A lekérdezés kimenere az alábbi: +------------+--------+------------+ 10 l rendelesid l l l csszeg l l l datum +------------+--------+------------+ l l l 69. mind­ két táblát ki kell listáznunk A két tábla listázásával az összekapcsolás ápusát is meghatároztuk . hogy csak azokat a sorokat rakja az eredménytáblába. hogy a pont használata teszi egyértelművé. Először is.vasarloid = megrendelesek. Ez a különleges ápusú feltételes utasítás mutatja meg.vasarloid = masik_adatbazis. nev nevű oszlop csak a vasarlok táblában fordul elő. amelynek egyik rendelési térele (rendelesi_tetelek) egy Javával foglalkozó könyv volt.nev formában hivatkezunk az adott oszlopra. Jelen esetben az össze­ kapcsoJási feltétel: vasarlok. Azt jelenti. Úgy jutharunk ilyen eredményre. ha lekérdezéseink kezdenek összetetté válni. tabla. ha az oszlop neve nem egyértelmű .például azért. hogy egy adott oszlop melyik táblából származik. Ez a nyers erő (brute-force) alapú megközelítés az esetek többségében nem túl hasznos. így egyértelműbbé teszi a lekérdezés jelentését. több táblán kell végigkövetnünk ezeket a kapcsolatokat. Ha a használatot kiterjesztjük.megrendelesek. amelyben avasarl ok tábla minden sorával a megrendelesek tábla minden egyes sorát párosították. de emberi szemmel sokkal olvashatóbbá és kezelhe­ tőbbé teszi lekérdezéseinket. Úgy képzeljük el ezt. A MySQL soha nem fog összezavarodni. amelyeknek tényleg van értelme. az alábbihoz hasonló feltételt: konyvek. de az adatbazis. A táblanevek közötri vessző az INNER JOIN vagy CROSS JOIN begépelésével egyenértékű. oszlop jelöléssei az adatbázist is meghatá­ rozzuk. Az ilyen ápusú összekapcsolást szokták teljes összekapcsolásnak (full join) vagy a táblák Descartes·szorzatának (Cartesian product) is nevezni. hogy teszteljünk egy.megrendelesek.vasarloid a vasarlok tábla vasarloid oszlopát. melyik vásárló rendelt Javával foglakozó könyveket (mondjuk azért. A pont használatára akkor van szükség. Láthatjuk. hogy mely tulajdonságok alkotják a két tábla közötti kapcsolatot. Olyan vásárlókat kell keresnünk. ahogy ezt már korábban is láttuk. a megrendelesek. Az összekapcsoJási feltétel lekérdezéshez adásával másmilyen összekapcsolást kapunk.vagyis. hogy "fogd a felsorolt táblákat. például a vasarlok. Különösen akkor érdemes ezzel élni. mintha tábláról táblára követnénk az adatok közötti kapcsolatot! Ha például arra vagyunk kíváncsiak. hogy tudrunk volna róla. Általában csak azokat a sorokat szeretnénk látni. Kettőnél több tábla összekapcsolása Kettőnél több táblát összekapcsolni semmivel nem bonyolultabb.

jelen esetben az összekapcsoJási feltétel az SQL utasítás speciális ON mellékágába kerül. rendelesi_tetelek. melyik könyv címében szerepel a java kifejezés.nev. A lekérdezés a következő kimenetet eredményezi: +-----------------+ l l nev +-----------------+ Julie Smith +-----------. hogy a példában négy különböző táblázaron keresztül követtük az adatokat. amely mindezt megvalósítja: SELECT vasarlok. hogy a bal összekapcsolás enyhén eltérő szintaktikát alkalmaz az összekapcsoJási feltételhez. vagy azokat a könyveket.isbn ' ' AND konyvek. eim LIKE %Java% .rendelesid tetelek. így az összekapcsoJási feltételek száma az összekapcsolni kivánt táblák számánál eggyel kisebb. amiket soha nem rendeltek. Ez az alapszabály hasznos lehet a nem igazán müködő lekérdezések hibakeresésénéL Ellen­ őrizzük összekapcsoJási feltételeinket. és ha mindezt egyenösszekapcsolás­ sal szeretnénk elérni. FROM vasarlok LEFT vasarlok. akiknek van rekordja a megrendelés ráblában.isbn konyvek. Ha a jobb oldali táblá­ ban nincsenek egyező sorok. Nézzünk egy példát: SELECT vasarlok. azaz volt megrendelésük. Megfigyelhetjük.rendelesid AND rendelesi = rendelesi tetelek. hogy kifejezetten a nem egyező sorokta van szükségünk . ahol egyezést talál­ runk.vasarloid. hogy az előző példákban a lekérdezés eredménye csak azokat a sorokat tartalmazta.Munkavégzés MySQL adatbázisunkkal 171 táblából a kon yvek tábla egy konkrét könyvéhez az ISBN -kód által juthatunk. olyan sor adódik az eredményhez.vasarloid. és győződjünk meg arról. LEFT vasarlok.például azokat a vásárlókat keres­ sük. mivel a valódi sorokban az nem lehet NULL: SELECT vasarlok. amit tudunk. amely NULL értékeket tartalmaz a jobb oszlopokban. Ha csak azokat a vásárlókat szetetnénk látni.rendelesid JOIN megrendelesek = ON vasarlok. Az ilyen típusú összekapcsolás a két tábla közötti meghatározott összekapcsoJási feltétel alapján keres egyező sorokat.nev megrendelesek. Az ilyen jellegű kérdések MySQL-beli megválaszolásának egyik módszere a bal összekapcsolás használata. Nézzük meg azt a lekérdezést. megrendelesek. = 10 FROM vasarlok. Ez az SQL lekérdezés bal összekapcsolást használ az ügyfelek és a megrendelések összekapcsolására. hogy összekapcsolni kívánt táblapáronként egy összekapcsoJási feltétel szükséges. Ennek a lekérdezésnek a következő az eredménye: +------------+-----------------+------------+ l vasarloid l l l l l nev l Smith Smith rendelesid l +------------+-----------------+------------+ 3 3 4 5 Julie Julie l l l 4 NULL Alan Wong Michelle Arthur l NULL +-----------+-----------------+------------+ Ez a kimenet csak azoknál a vásárlóknál tartalmaz rendelésazonosítót ( rendelesid ) . megnézzük. akik soha nem rendeltek. NULL értékeket kell keresnünk a jobb tábla (jelen esetben a rendeles id) elsődleges kulcsmezöjében. majd visszatérünk azon vásárlók nevéhez.vasarloid megrendelesek. akik még semmit sem rendeltek. Láthatjuk.vasarloid = AND megrendelesek. akik rendeltek ezekből a könyvekből.nev FROM vasarlok JOIN megrendelesek .-----+ Láthatjuk. hogy végigjártuk az utat onnan. Előfordulhat azonban az is. Ha létrehoztuk ezeket a kapcsolatokat. oda.vasarloid. konyvek WHERE vasarlok.vasarloid megrendelesek. Általánosságban igaz. három különböző összekapcsoJási feltételre van szükségünk. amit tudni szeretnénk! A feltételt nem teYesítő sorok keresése Az összekapcsolás MySQL-ben használt másik fő típusa a bal összekapcsolás (left join).

vasarlok AS v2 WHERE vl. Ezekkel a fejezet egy későb­ bi részében részletesen foglalkozunk. amikor egy táblában ugyanolyan értékű sorokat keresünk.rendelesid = v.isbn = k.nev.erre rövidesen visszatérünk még.nev != v2.2 táblázat: Név Összelwpcsolási típusok MySQL-ben Leírás Descarres-szorzat Az összekapcsolásban részt vevő összes tábla minden sorának minden lehetséges kombi­ nációja. táblaaliasokat kell használnunk.nev FROM vasarlok AS WHERE v.rendelesid m. hogy ez a példa másmilyen szintaktikát használ az összekapcsalási feltételhez! A bal összekapcsolások vagy az első példában látott ON.17:l l O. 10.varos AND vl.varos = v2.rendelesid IS 10 Az eredmény: +------------+-----------------+ l l l vasarloid l l l nev +------------+-----------------+ 4 5 Alan Wong Michelle Arthur l +------------+-----------------+ Figyeljük meg azt is.isbn ' ' AND k. vagy a második példában szereplő U SING szintaktikával működnek. W HERE mellékágat nem meghatározva hozható létre. éppen ezért a US ING használatá­ hoz arra van szükség. konyvek AS k AND rt. Más nevek használata a táblákra: az aliasok Gyakran praktikus. fejezet USING (vasarloid) NULL. Teljes összekapcsolás Ugyanaz. Ha például olyan vásárlókat keresünk. Az aliasokat oszlopokhoz is használharjuk . és összekapcsolást hajtunk végre a Varos oszlopon. A feladat bonyolultabbnak és egzotikusabbnak hangzik. egy AS mellékág hozzáadásával deklaráljuk az adott tábla aliasát. akik ugyanabban a városban laknak . Léteznek további típusok is. Képzeljük el a korábban látott hatalmas lekérdezést aliasokkal átírva: SELECT v. hogy melyik táblából jön az összekapcsalási tulajdonság.nev) is szükség van annak érdekében. vl.varos FROM vasarlok AS vl.tegyük fel. amikor az összesítő függvényeket vizsgáljuk meg. mintha a vasarlok két különböző tábla. ! = c2. A táblanevek közé vesszőt írva. a leggyakrabban használtak. Figyeljük meg.nev. ezt követően végig használhatók. WHERE megrendelesek. mint az előző. v2. hogy az utóbbi nem határozza meg. mint amilyen valójában. eim LIKE %Java% .2 táblázatban az előzőekben bemutatott különböző összekapcsolás-típusok összefoglalását láthatjuk. = megrendelesek AS m. A táblák ezen más neveit aliasoknak nevezik. Amikor egy táblázatot önmagával szeretnénk összekapcsolni.vasarloid AND m. Az ilyen jellegű kérdéseket egymásba ágyazott lekérdezésekkel (subquery) is megválaszolhatjuk. Tobbek között akkor rud hasznos lenni. ám az itt szereplők a legfontosabbak. hogy olvasó­ köre szetetnénk létrehozni -. Itt tulajdonképpen úgy teszünk. Miután meghatároztuk a használni kivánt táblákat. két különböző aliast adharunk ugyanannak a táblának ( vasarlok ) : SELECT vl.nev hogy ne önmagukkal párosítsuk a vásárlókat! Összefoglalás: összekapcsolások A 10. hogy a táblákra más néven is hivatkozni rudjunk. esetenként pedig nélkülözhetetlen. cl és c2 lenne. A lekérdezés elején hozhatjuk létre őket. . Meg kell említenünk. rendelesi tetelek AS rt. hogy a második feltételre ( cl. hogy a két tábla oszlopának ugyanaz legyen a neve.vasarloid rt.nev. Sokszor rövidítésként szolgálnak.

. ORDER BY Több oszlop szerint is rendezherünk. JOIN Szemancikailag a vesszővel egyenértékű. Egyenösszekapcsolás Bal összekapcsolás Felrételes kifejezést = jellel használva párosírja az összekapcsolásban lévő különböző NULL táblák sorair. SQL-ben ez a WHERE mellékágar tartalmazó összekapcsolás. Az összesítő fuggvényeket egész táblára vagy táblán belüli adatcsoportra alkalmazhatjuk.mivel az angolszász területen használt keresztnév-vezetéknév formában tároljuk öket . Az oszlopnevek helyett használharunk aliasokat vagy a sorszámukat is (a 3 például a tábla harmadik oszlopát jelenti). Az ORDER az BY SELECT urasírás ORDER BY mellékágár kell használnunk. Ha szeretnénk.például az átlagos rendelési érték. Adatok csoportosítása és összesítése Gyakran tudni szerernénk. az ASC kulcsszó segítségével kifejezetten megadharjuk ezt: SELECT FROM nev.a kereszrnév alapján vannak rendezve! Ha vezetéknév alapján szerernénk rendezni. W HERE feltétel nélkül a reljes összekapcsolással egyenértékű. mint az előző. FROM ORDER BY nev. hogy a kimeneret emberi szem által jól olvasható formában mellékág a SELECT mellékágban felsorolt egy vagy több oszlop szerint rendezi a sorokat. a állítsuk elő. A leggyakoribb ilyen fuggvényeket a 10. Adatok visszakeresése meghatározott sorrendben Ha meghatározott sorrendben szerernénk megjeleníteni a lekérdezés által visszaadorr sorokat. azaz csökkenő sorrendbe rendezherünk: lakeim SELECT FROM nev. két mezőben kellene tárolni a neveket. lakeim vasarlok nev ASC.3 táblázatban láthatjuk. Ez a lekérdezés ábécésorrendben adja vissza az ügyfelek nevér és címét. vasarlok nev DESC. azaz csökkenő) kulcsszó használatával pont fordírott. és a nem passzoló sorokar ki. vagy mi az oszlopban lévő értékek átlaga . hogy az összekapcsolni kivánt táblák neve közé a CROSS JOIN kulcsszavakar írjuk. Ugyanígy használharunk jobb összekapcsolást (righr join) is. Ez a funkció kiválóan alkalmas arra. SQL-ben a LEFT JOIN értékekkel tölti kulcsszavakkal használjuk.Munkavégzés MySQL adarbázisunkkal 173 Név Keresztösszekapcsolás Belső összekapcsolás Leírás Ugyanaz. hogy a nevek jelen esetben . Táblák között próbál sorokat párosítani. hogy hány sor értéke esik egy adott halmazba. így: +-----------------+--------------------+ l nev l lakeim +-----------------+ --------------------+ Alan Wong Julie Smith 1/47 Haines Avenue l l 25 Oak Street 357 North Road l Michelle Arthur +-----------------+--------------------+ Figyeljük meg. Úgy is létrehozható. hiányzó értékek megkeresésére alkalmas. ORDER BY A DESC (descending. Vegyük például alábbi lekérdezést: lakeim vasarlok SELECT nev. Az alapértelmezett rendezés az emelkedő sorrend (a-tól z-ig vagy numetikusan emelkedő). Az INNER kulcsszavakkal is meghatá­ 10 rozható. hogy valódi belső összekapcsolássá tegyük. A MySQL összesítő fuggvényei jó szalgálarot tesznek az ilyen ópusú lekérdezések lebonyolítására. Általában megha­ tározunk W HERE feltételt.

tekintsük meg az átlagos rendelési értéket. amelyekre valójában nincs szükségünk. Ugyanaz.174 10. fejezet 10. me!y vásárlóink adják a legnagyobb Ha a GROUP BY mellékágat összesítő függvényhez használjuk. Gondoljuk tovább az előző példát! Ha azt szeretnénk kideríteni. hogy van-e köztük üres értékű.990002 74. Ugyanígy. Kimenetként az alábbihoz hasonlót kapunk: +-------------+ l l avg(osszeg) l +-------------+ 54. Ha meghatározunk egy oszlopot. Támogatja a mellék­ kiterjesztett szintaktikát (extended syntax). A megadott oszlopban található legnagyobb érték. hogy csoportonként . A MySQL kicsivel nagyobb szabadságot enged irt számunkra. hogy a tábla összes rendelési értékének átlagát adná. 10 Név AVG(oszlop) COUNT(elemek) MIN(oszlop) MAX(oszlop) STD(oszlop) STDDEV(oszlop) SUM(oszlop) A megadort oszlopban található legkisebb érték. Ahelyett. A megadort oszlopban ralálható értékek összege.3 táblázat: A MySQL összesítő függvényei Leírás Az adott oszlopban lévő értékek átlaga. akkor csak az oszlopban található különbözö érté· kek számát kapjuk vissza. Közvetlenül a GROUP BY mellékág után kell következnie. megváltoztatja a függvény működését. az alábbi lekérdezéssei tudhatjuk meg ezt: SELECT vasarloid. a SELECT mellékág csak az összesítő függvény( ek)et és a GROUP BY BY mellékágban megnevezett oszlopokat tartalmazhatja. A COUNT( * ) a sorok számár aclja vissza. Ebből megtudhatj uk. mint az STD(oszlop). használjuk a GROUP értékű rendeléseket: SELECT vasarloid. hogy ellenőrizzük egy összesítés eredményét. A megadott oszlopban található értékek szórása. ha valamely oszlopot használni kívánjuk a GROUP ágban. a lekérdezés az egyes vásárlókhoz (pontosabban az egyes ügyfél-azonosítókhoz) tartozó átlagos rendelési összegről tájékoztat: +------------+-------------+ l vasarloid l avg(osszeg) +------------+-------------+ l l l 2 3 l l 49. a függvény az abban található nem üres értékek számár adja vissza. FROM megrendelesek AVG(osszeg) . mint egy WHERE mellékág. Az adatok csoportosítása és összesítése mellett arra is lehetőségünk nyílik.485002 +------------+-------------+ Egy dolgot fontos megemlítenünk a csoportosító és összesítő függvények használata kapcsán: ha ANSI SQL-ben összesítő függvényt vagy GROUP BY mellékágat használunk. Ha a DI STINCT kulcsszót rakjuk az oszlopnév elé. kezdésképpen vizsgáljuk meg az imént említert kérdést! A megrendelések átlagértékét a következö­ képpen számíthatjuk ki: SELECT avg(osszeg) FROM megrendeles.985002 +-------------+ Ha részletesebb információra vágyunk. Nézzünk néhány példát. amely csak csoportokra és összesítésekre vonatkozik.980003 47. és nem vizsgálja. Erre a HAVING mellékágat használjuk. AVG(osszeg) BY mellékágat! Ez lehetövé teszi. FROM megrendelesek GROUP BY vasarloid. és olyan. amely lehetövé teszi. hogy melyik vásárló átlagos rendelési összege haladja meg az 50 dollárt. azt a SELECT mellékágban is szerepeltetni kell. hogy a SELECT mellékágból kihagyjuk azokat az elemeket.pél­ dául ügyfélszámonként .

Haszná­ latával meghatározhatjuk.másik lekérdezésbe ágyazott lekérdezés. hogy a HAVING mellékág csoportokra vonatkozik! A fenti lekérdezés az alábbi eredményt hozza: +------------+-------------+ 10 l vasarlaid l 2 l l avg(asszeg) +------------+ -------------+ 74. amely rendkívül jó szolgálatot tehet webes alkalmazások esetén. Ez a lekérdezés az alábbi eredményt hozza: +------------+--------+ l vasarlaid l 2 l l asszeg l +------------+--------+ 74. és oldalanként tíz árucikket szereménk megjeleníteni a számára. Az alábbi lekérdezés a LIMIT használatát példázza: SELECT nev FROM vasarlak LIMIT 2. A következöképpen olvasható ez a lekérdezés:"Válaszd ki az ügyfelek nevét. Jegyezzük meg azonban. Alapszintű egymásba ágyazott lekérdezések Az egymásba ágyazott lekérdezések leggyakoribb használata az. Bár az egymásba ágyazott lekérdezések funkcióját gondosan kezelt összekapcsolásokkal és ideiglenes táblákkal is el lehet érni.98 +------------+--------+ Ebben az esetben az egymásba ágyazott lekérdezés egyetlen értéket ad vissza (a maximális rendelési összeget). hogy a kimenet első sora a nulladik számú sor lesz. . asszeg FROM megrendelesek ORDER BY asszeg DESC LIMIT l. FROM megrendelesek WHERE asszeg = (SELECT MAX(asszeg) FROM megrendelesek). ez azt jelenti. Kiváló péld:ija ez az egymásba ágyazott lekérdezések alkalmazásának.980003 +------------+-------------+ Visszakapni kívánt sorok kíválasztása A LIMIT a SELECT utasírás egyik olyan mellékága.Munkavégzés MySQL adatbázisunkkal 175 GROUP BY vasarlaid HAVING AVG(asszeg) > 50. hogy a sorok számozása nullával kezdődik. az egymásba ágyazott lekérdezések sok esetben könnyebben olvashatók és írhatók. amelynek rendelési értéke rnind közül a legmagasabb volt. a következő lekérdezéssei jutharnánk el célunkhoz: asszeg SELECT vasarlaid.mint magyar megnevezése hűen jelzi. m�d a kimenet második sorától kezdve adj vissza három sort!" Érdemes megjegyezni. hogy a LIMIT nem része az ANSI SQL-nek! MySQL kiterjesz­ tés. 3. Jegyezzük meg. amikor egy vásárló webes termékkatalógust böngész. így használata esetén SQL kódunk elveszti kompatibilitását az egyéb relációs adatbázis-kezelő rendszerek többségéveL Egymásba ágyazott lekérdezések használata Az egymásba ágyazott lekérdezés (subquery). amikor az egyik lekérdezés eredményét egy másikéval hason­ lítjuk össze. hogy a kimenet me!y sorait kapjuk meg. Ez a funkció igen hasznos például akkor. amit aztán a külsö lekérdezés összehasonlításában használunk fel. mivel ezt a konkrét lekérdezést ANSI SQL összekapcsolások használarával nem lehet elegánsan reprodukálni. Ha például azt a megrendelést szeretnénk megtalálni. Ugyanezt az eredményt adja azonban az alábbi összekapcsolásos lekérdezés is: SELECT vasarlaid. Ez a mellékág két paramétert fogad: a kezdősor sorszámát és a visszaadandó sorok számát.

Ez egyébként a korrelált egymásba ágyazorr lekérdezés definíciója: olyan belső sorokar keresünk. amely ugyanazt eredményezi.ango­ lul értő . 10. eim Ez a lekérdezés egyszerre példázza a korrelált egymásba ágyazott lekérdezések és az egymásba ágyazorr lekérdezések utolsó különleges műveleri jeiének.) Figyeljük meg. Leírás ANY IN SOME Visszarérési értéke akkor igaz. Ezeknél a külső lekérdezés elemeir felhasználhar­ juk a belső lekérdezésben.nem egyeznek meg) a külső sorokkal. ezeker a mosr következő részben muraguk be. bár sok esetben ez az érték true vagy fal se volt (így volt ez az előző. Például: SELECT isbn.isbn=konyvek. Soros egymásba ágyazott lekérdezések Az eddig látott. hogy MySQL-ben sokáig nem használharrunk egymásba ágyazorr lekérdezéseker. egymásba ágyazorr lekérdezések egyetlen értéket adtak vissza. Egymásba ágyazott lekérdezések és műveleti jelek Öt különleges müveleri jel használható az egymásba ágyazorr lekérdezésekhez. FROM konyvek WHERE NOT EXISTS (SELECT * FROM rendelesi tetelek WHERE rendelesl tetelek. Visszarérési értéke akkor igaz. amelyek egy másik- . hogy kevés olyan dolog van. hogy a belső lekérdezés csak a FROM listában tartalmazza a rendelesi_tetelek táblát. Ezt a módszert jellemzően arra használjuk. Ebből következik. (Ez ugyanaz az információ.4 táblázat tartalmazza. ha az összehasonlítás az egymásba ágyazorr lekérdezésben lévő minden sorra igaz.nélkülük megvalósírani. fejezer Mivel ez a lekérdezés a LIMIT kulcsszór használja. ám egy kevésbé hatékony. de MySQL-ben az egy­ másba ágyazorr lekérdezéses változarnál hatékonyabban hajtódik végre. hogy olyan sorokat keressünk valamely ráblában.4 táblázat: Egymásba ágyazott Iekérdezések műveleti jelei Név Példaszintaktika SELECT cl FROM tl WHERE cl > ANY (SELECT cl FROM t2). hogy a NOT EXISTS visszatérési értéke pedig akkor igaz. nem kompatibilis az RDBMS-ek röbbségével. Az IN-ben úgymond már benne van az összehasonlíró operátora (=). SELECT cl FROM tl WHERE cl IN (SELECT cl from t2). az EXI STS müveleri jelet használó példában is). Az ANY aliasa. amir nem lehet. Az általános egymásba ágyazorr lekérdezésekhez használható négy műveleri jelet a 10. bizonyos esetekben ez jobban hangzik az . amelyek megegyeznek (vagy . Négy közülük általános egymásba ágyazorr lekérdezésekhez való. Az egyik legfőbb oka annak. Korrelált egymásba ágyazott lekérdezések Korrelált egymásba ágyazorr lekérdezésekben kicsir összeterrebbek a dolgok. Az ANY-vel egyenértékű. A soros egymásba ágyazott lekérde­ zések (row subquery) reljes sort adnak vissza. Az IN kivérelével a fenti müveleri jelek csak összehasonlíró operátor urán jelenhernek meg. Azokar a könyveker adja vissza. amit azután összehasonlítharunk a külső lekérdezésben szereplő más teljes sorokkal. Ez utóbbi­ val a következő részben foglalkozunk majd. ha az összehasonlítás az egymásba ágyazorr lekérdezésben lévő bármely sorra igaz.176 10.mint jelen esetben . Az EXISTS operátor visszatérési értéke akkor igaz. SELECT cl FROM tl WHERE cl > SOME ALL (SELECT cl FROM t2).emberi fülnek. amiker még soha nem rendeltek meg. az egyik (EXISTS) pedig kizárólag korrelált egymásba ágyazorr lekérdezéseknél használható. az EXI STS-nek a használatár. szabályos ANSI SQL lekérdezést. Technikailag létrehozharunk egyerlen. Néhány külön­ leges müveleri jel is lérezik az egymásba ágyazorr lekérdezésekhez. az volt. de a konyvek. amihez korábban bal összekapcsolás használarával jurorrunk.isbn). SELECT cl FROM tl WHERE cl > ALL (SELECT cl from t2). Az egymásba ágyazorr lekérdezések értékeit minden szabályos összehasonlíró müveleri jellel használhatjuk. ha vannak egyező sorok az egymásba ágyazorr lekérdezésben. MAX-CONCAT nevü rrükkre épül. isbn oszlopra hivatkozik! Más szavakkal ezt azt jelenti. hogy a belső lekérdezés a külsőben lévő adatra hivatkozik. ha nincsenek egyező sorok az egymásba ágyazorr lekér­ dezésben.

c3 FROM t2). LIMIT mellékággal pedig az érintett sorok számát korlátozhatjuk le. mint bármilyen más táblát. mint az INSERT utasítás esetén. hogy adatbázisunk tábláinak struktúráját kell módosítanunk. Erre az igen rugalmas ALTER TAB LE utasítást használhatj uk. amely duplikált elsődleges kulcsokat eredményez. A könyves adatbázisban nem tudunk erre jó példát mutatni. . akkor a módosítás nem következik be. Táblák megváltoztatása létrehozásuk után A sorok frissítésén túlmenően megeshet.Munkavégzés MySQL adatbázisunkkal 177 ban is megtalálhatók. és a tábla visszatér a módosítási kísérlet elötti állapotába. és olyan módosítást próbálunk meg végrehajtani.. 10 Egymásba ágyazott lekérdezés használata ideiglenes táblaként Egymásba ágyazott lekérdezést használhatunk egy külsö lekérdezés FROM mellékágában. úgy. ha például csak az első tíz sort kívánjuk frissíteni. Ezt követően a külsö lekérdezésben ugyanúgy kezdhetjük. Nézzünk néhány példát! Ha 10 százalékkal szeretnénk emelni minden könyv árát. de a MySQL tetszőleges számú változtatást engedélyez. hogy ANSI SQL-ben ALTER TABLE utasításonként csak egy módosítást hajthatunk végre. Ha viszont csak egyetlen sort szeretnénk módosítani. . WHERE mellékág használatával adott sorokra korlátozhatjuk az UPDATE utasítás hatását. hogy adatokat keresünk vissza az adatbázisokból. c3 FROM tl WHERE (cl. hogy módosítani szeretnénk azokat. nev FROM vasarlok WHERE varos='Box Hill') AS box_hill_customers. hanem műveletet írunk. ugyanúgy működnek. [WHERE feltetelJ [ORDER BY rendezesi_feltetel] [LIMIT szam] A dolog lényege. Rögtön az egymásba ágyazott lekérdezés záró zárójele után aliast kell adnunk az egymásba ágyazott lekérdezés eredményének. A LOW_ PRIORITY és az IGNORE.. c3) IN (SELECT cl. hogy a megnevezett oszlopokhoz nem konkrét értéket. valtoztatas . de az általános szintaktika az alábbihoz hasonló: SELECT cl. és a többi tö�lödik. először is valamilyen sorrendbe kell rakni öket. hogy különbözö szempontok szerint módosítsuk a táblát. Ennek általános formája a következő: ALTER TABLE [IGNORE] tabla_neve valtoztatas [. Ha nem adjuk meg (ez az alapértel­ mezett mód). különbözö típusú módosításokat a 10. mintha ideiglenes táblaként kezelnénk azt. c2. hogy az egymásba ágyazott lekérdezés itt a FROM mellékágba került. például egy vásárló lakcímét frissítenénk. Az UPDATE utasítás ad erre lehetőséget. Amennyiben megadjuk az IGNORE mellékágat. a következöképpen tehetjük meg: UPDATE vasarlok SET lakeim = '250 ülsens Road' = WHERE vasarloid 4. akkor WHERE mellékág nélkül használ­ hatjuk az UPDATE utasítást: UPDATE konyvek SET ar = ar*l. Legegyszerűbb formájában ez valahogy így néz ki: SELECT * (SELECT FROM vasarloid. az is gyakran előfordul. Meg akarjuk például emelni az adatbázisban szereplö könyvek árát.5 táblázatban láthatjuk. amennyiben megadjuk öket. Bármelyik módosítási mellékágat használhatjuk (egyszerre többet is). ] Érdemes megjegyezni.l. c2. Az UPDATE utasítás általános formája a következő: UPDATE [LOW_PRIORITY] [IGNORE] tabla neve SET oszlopl=kifejezesl. hogy a t abla_neve táblát frissítjük úgy. c2. Adatbázisban lévő rekordok frissítése Túl azon. Az ezzel az utasítással végrehajtható. Ezzel a módszerrel hatékonyan kérdezhetjük le egy egymásba ágyazott lekérdezés kimenetét. akkor az első bekerül a módosított táblázatba. Láthatjuk. . A művelet elvégzésének eredménye kerül a mezöbe értékként (lásd lejjebb a példát!).oszlop2=kifejezes2..

mivel az oszlop _leiras tartalmazza az oszlopneved A CHANGE-hez hasonló. akkor mint a CREATE utasítás esetében. . Jegyezzük - meg.cs) és egybevetésre (collation) alakítja az összes. így csonkolva letrek. hogy 70 karakter hosszú legyen: ALTER TABLE vasarlok MODIFY nev CHAR(70) NOT NULL. További részletekért lásd a 13. (Az InnoDB-ről további in­ formációért lásd a 13. hogy az a megadott leírást kapja.éppúgy. fejezet 10. További rész­ letekért lásd a Haladó MySQL-programozás című 13. Indexet ad a tábla megadott oszlopához vagy oszlopaihoz. A CONSTRAINT jelölés külső kulcsokat használó InnoDB táblákhoz való.. (Figyelem: ha elkezdjük módosítani a táblát.) ADD INDEX [index] (oszlop. Avasarlok táblában például korábban 50 karakter hosszú nevek tárolását engedélyeztük. Törli a külső kulcsot (de az oszlopot nem). . Törli az elsődleges kulcsot (de az oszlopot nem).. fejezetet!) Újra létrehozza egy InnoDB tábla mögöttes táblatérfájlját.) definicioja] [index] (index [hivatkozas ALTER [COLUMN] oszlop {SET DEFAULT ertek l DROP DEFAULT) CHANGE [COLUMN] oszlop uj oszlop leiras MODIFY DROP [COLUMN] oszlop_leiras Alapértelmezett értéket ad egy adott oszlopnak.. fejezetet! Egyedi indexet ad a tábla meghatározott oszlopához vagy oszlopaihoz. hogy az oszlop_leiras-nál. vagy eltávolítja azt. ha módosítjuk az oszlop adattípusát.178 10.. . A CREATE TABLE utasítással meg­ egyező szintaktikát használ. szöveg alapú oszlopot. Oszloptípusok. [COLUMN] oszlop DROP PRIMARY KEY DROP INDEX index DROP FOREIGN KEY kulcs DISABLE KEYS ENABLE KEYS RENAME [AS] uj tabla_nev Átnevezi a táblát. Egy vagy több új oszlopot szúr be a tábla végéhez. hogy annak sorai adott oszlop szerint vannak rendezve.. Törli a megnevezett indexet. nem pedig oszlopnevek megváltozta­ tására alkalmas.. Úgy módosítja az oszlop ot.5 táblázat: Változtatási lehetőségek az ALTER TABLE utasítással 10 Szintaktika ADD [COLUMN] oszlop_leiras [FIRST Leírás" AFTER oszlop ] l Új oszlopot szúr be a megadott helyre (ha nincs hely meghatározva.. ) ADD [CONSTRAINT [szimbolum]] PRIMARY KEY (oszlop. hogy egyes nevek túl hosszúak. . . az oszlop a tábla végére kerül). Törli a megnevezett oszlopot. ) ADD [CONSTRAINT [szimbolum]] FOREIGN KEY oszlop.a nevet és típust kell megadnunk. Beállítja az alapértelmezerr karakterkészletet és egybevetést. fejezetet! ADD [COLUMN] (oszlop_leiras. A megadott oszlopot vagy oszlopokat a tábla elsődleges kulcsává teszi.. Törli egy InnoDB tábla mögötres táblatérfájlját. A CONSTRAl NT utasítás külső kulcsot használó táblákhoz való. (Az InnoDB-ről további információért lásd a 13. Újra létrehozza a táblát úgy. ) ADD UNIQUE [CONSTRAINT [szimbolum]] index] (oszlop. fejezetet!) Újra beállíthatjuk a tábla tulajdonságait. Kikapcsolja az indexfrissítést.. oszlop_leiras.. hogy ez a szintaktika alkalmas az oszlopnevek megváltoztatására. Úgy segíthetünk ezen a problémán. a sorok nem tartják a korábbi rendezést!) ORDER BY oszlop_nev CONVERT TO CHARACTER SET cs COLLATE c [DEFAULT] COLLATE c DISCARD TABLESPACE IMPORT TABLESPACE tabla tulajdonsaga1 CHARACTER SET cs A meghatározott karakterkészletre (character set. Nézzünk meg néhányat az ALTER TABLE utasítás gyakoribb felhasználási lehetőségei közül! Könnyen előfordulhat. Az adatok begyűjtése után ész­ revesszük. Fontos. . Bekapcsolja az indexfrissítést. hogy egy idő után rájövünk: egy adott oszlop nem "elég nagy" az általa tárolandó adatokhoz. To­ vábbi részletekért lásd a 13. fejezetet! Külső kulcsot ad InnoDB táblához.

vagy valamelyik vásárló már hosszú ideje nem rendelt semmit sem. ezeket a W HERE mellékágban határozhatjuk meg. ha valamelyik könyv már nem kapható. helyi értékesítési adót vezet­ nek be. hogyan teherjük a Book-O-Rama adarbázist internerről elérhetővé. A DELETE utasítással tehetjük meg. minden indexet és magát rakor nagyon körültekintően járjunk el! az adarbázist is törli. . A QUICK gyorsabb mű­ veletet eredményezhet MyiSAM táblák esetében. Képzeljük el. 10 Ugyanígy megeshet az is. amely a következőkép­ pen néz ki: DROP DATABASE adatbazis. A DROP TABLE utasítással érhetjük ezt el. hogy feleslegessé válik egy oszlop. hogyan kapcsoljuk össze a MySQL-t és a PHP-r úgy. Táblák törlése Esetenként egy egész tábláról szecetnénk megszabadulni. Ha szeretnénk többet rudni az SQL-ről. hogy egy új. A folyamat nagyon egy­ szerű. Példánknál maradva. és szetetnénk egy kicsit rendet rakni az adatbázisban: DELETE FROM vasarlok WHERE vasarloid=S.és egy kis könnyed szórakozásra vágyunk-.2) AFTER osszeg. Az utasítás a tábla minden sorát és magát a táblát is törli. amit a Book-O-Ramának hozzá kell adni a rendelés végösszegéhez. és egy teljes adarbázist megszüntethetünk a DROP DATABASE utasítással. hogy használa­ További olvasnivaló Fejezetünkben a MySQL adatbázisokkal folytatott munka során nap mint nap használt SQL utasírásokat tekintettük át.ansi. de külön kell nyilvántartania! A következöképpen adhatjuk az ado oszlopot a megrendelesek táblához: ALTER TABLE megrendelesek ADD ado FLOAT(6. A következő két fejezerből megtudhatjuk. ezért fokozott gondossággal járjunk el használata esetén! Teljes adatbázis törlése Akár tovább is léphetünk. hogy internetről hozzáférjünk adarbázisainkhoz. hogy oszlopot kell a táblázathoz adnunk. mint a korábban látott utasításoknál. A LOW_PRIORITY és az IGNORE pontosan úgy müködik. A LIMIT mellékágban korlátozhatjuk a ténylegesen törlendő sorok maximális számát.Munkavégzés MySQL adatbázisunkkal 179 Szintén gyakran előfordul. Az ANSI SQL MySQL-féle kibővítéséről a MySQL oldalán (htcp:/ /www. Az ORDER BY t jellemzően - a LIMIT összefüggésben használjuk.org/ oldalon elérhető ANSI SQL szabványt. amelynek általános alakja a következő: DELETE [W HERE [LOW_PRIORITY] felte tel] [QUICK] [IGNORE] FROM tabla [ORDER BY oszlopok_rendezese] [LIMIT szam] Ha csak ezt írjuk: DELETE FROM tabla. így már mondanunk sem kell. fejezetben áttekintjtik. Ez minden sort. Hogyan tovább� A MySQL adatbázis elérése a webről PHP-vel című ll. Egyes haladó MySQL-es technikákat is megismerhetünk majd. Rekordok törlése adatbázisból Az adatbázisból sorokat törölni egyszerű dolog. úgyhogy csak óvatosan bánjunk egy ilyen utasítás­ sal! Általában csak adott sorokat kívánunk törölni. a tábla minden sora törlődik.mysql.com) tájékozódhatunk. bármikor fellapozhatjuk a http:/ l www. minden táblát. az utasítás pedig a következöképpen néz ki: DROP TABLE tabla. A következöképpen törölhetjük: ALTER TABLE megrendelesek DROP ado.

fejezetben. Meglévő MySQL adatbázis bireokában megírhatjuk az előző lépéseker végn�hajtó PHP kódot. A PHP motor elkezdi vizsgálni a kódot. hogy MySQL-ben dolgozva már létrehoztuk adarbázisunkat. A webes kiszolgáló megkapja az eredmenyek. amely az adarbázishoz csarlakozásra és a lekérdezés végrehajrására (a könyvek keresésére) irányuló parancsot tartalmaz. hogy webes felülettel ( weboldallal) kössük össze. A MySQL kiszolgáló megkapja az adatbázis-lekérdezése. Emlékeztetésképpen fussuk ár még egyszer az ort említert lépéseker: l.a könyvek lis­ r. php-re vonatkozó kérést.. biztonságosabbá és hatékonyabbá reszik a tárolási és visz­ szakeresési feladaraink jelentős részér.. 3. és visszaküldi az eredményeker .a PHP motornak. Mosr. ami általában a lekérdezés eredményeinek HTML-beli formázását is magában foglalja. egyszerű fájlokban tároltuk az adatokat. A keresési eredmények oldal neve eredmenyek. php. hogyan érhetjük el a Book-O-Rama adarbázist PHP segítségével a webről. feldolgozza. Megcanuljuk. 6. A webes kiszolgáló visszaadja a HTML-t a böngészőnek. készen állunk arra. 2. fejezeeben vázoltuk a webes adatbázis-architektúrák működéséc. és hogyan írjunk bele. A felhasználó böngészője HTTP kérést intéz egy adott weboldalhoz. hogy a relációs adatbázisrendszerek webes alkalmazás esetén könnyebbé.iját. . Kezdjük a keresési űrlappal l Ezen egyszerű HTML űrlap kódjár a 11. Ezt követően az eredményül kaport HTML-r visszaküldi a webes kiszolgálónak. és elküldi a megfe­ lelő lekérdezése. ho­ gyan olvassunk adatokat adatbázisból. A PHP moror befejezi a kód furrarásác. illetve hogyan szűrjük ki a potenciálisan problémás adatok bevitelét. 5. Ebben a fejezeeben bemutatjuk. A fejezetben az alábbi főbb témakörökkel foglalkozunk: Hogyan működnek a webes adatbázis-archicektúrák� Adatbázis lekérdezése a webről egyszerű lépésekkel Kapcsolat beállítása Információszerzés az elérhető adatbázisokról A használni kívánt adatbázis kiválasztása Az adarbázis lekérdezése A lekérdezés eredményeinek lekérése Kapcsolat boncása az adatbázissal Új információ felvitele az adatbázisba Előfordítort utasítások használata Egyéb PHP adacbázis-illesztések használata Álcalános adatbázis-illesztés használata: PEAR MDB2 • Hogyan működnek a webes adatbázis�architektúrák? A Webes adatbázis megtervezése című 8. 4. majd feldolgozás céljából átadja a PHP morornak.1 példakód tartalmazza.iját. ahol a felhasználó láthatja a kére könyvek list. A PHP megnyitja a kapcsolacor a MySQL kiszolgálóhoz. visszakeresi a fájlt. ahol dolgoztunk már ilyen fájllal. Például a felhasználó a Book-O-Rama ol­ dalán lévő űrlap segítségével rákeres a Michael Morgan által írt összes könyvre. Az Adatok tárolása és lekérése című 2. illetve ezekből az állományokból ke­ restük vissza azokat.ll MySQL adatbázis elérése a webről PHP vel . megemlítettük. Amikor a korábbiakban PHP-vel dolgoztunk.

. Ezt a kódot a 11.. szerző és ISBN-kód szerinti keresést tesz lehetövé.1 példakód: kereses. Kérjük. . ami cím.. fejezet 11. A HTML kód kimenere a 11. és hogyan müködik ez a kód. html-A Book-O-Rama adatbázisának keresési oldala <html> <head> <title>Keresés a Book-O-Rama katalógusban</title> </head> <body> <hl> Keresés a Book-O-Rama katalógusban</hl> ll <form action="eredmenyek. if (1$keresesi tipus l l !$keresesi k�fejezes) adja meg ezeket!'... php-Ez a kód keresi vissza a MySQL adatbázisból a keresési eredményeket.2 példakód tartal­ mazza.....php" method="post"> Válassza ki a keresés típusát!:<br /> <select name="keresesi_tipus"> <option value="szerzo">Szerz6</option> <option value="cim">Cím</option> <option value="isbn">ISBN</option> </select> <br /> Írja be a keresési kifejezést' :<br /> <input name="keresesi k�fejezes" type=""text" size="40"/> <br /> <input type="submit" name="kuldes" value="Keresés"/> </form> </body> </html> Ez a HTML űrlap viszonylag magától értetődő. Keresés a Book-O-Rama katalógusban \'. majdJormázza azo­ kat a megjelenítéshez <html> <head> <title>Book-0-Rama keresési eredmények</title> </head> <body> <hl>Book-0-Rama keresési eredmények</hl> <?php ll rövid változónevek létrehozása $keresesi tipus=$ POST['keresesi tipus').. � . php fájlban található.1 ábrán látható. echo 'Nem adta meg a keresési feltételeket. A fejezet során azt fogjuk megtárgyalni.. A"Keresés" gombra kartintáskor meghívott kód az eredmenyek.!!�!. 11.el.��-----­ �-----------J 11.1 ábra: Teljesen általános keresési űrlap. hogy mir csinál..2 példakód: eredmenyek..182 ll.. $keresesi kifejezes=trim($_POST['keresesi kifejezes')). exit. .

?> </body> </html> Figyeljük meg.. a böngészőablak a keresési eredményt mutaga..wot6�C. $i++) $sor = $talalat->fetch_assoc(). $lekerdezes = "SELECT * FROM konyvek WHERE ". ll próbálkezzon később. de védőkarakterrel kell ellátni ezeket a különleges karaktereket. Book-0-Rama keresési eredmények 11. echo htmlspecialchars(stripslashes($sor['cim'])). Cim: ". $i <$talalatok_szama.$keresesi_tipus . echo stripslashes($sor['ar']). if (mysqli_connect_errno()) echo 'Hiba: exit.:Ja�l-�� s-t6�Maot158:i0-G"l-l169T-S A<. $talalatok_szama = $talalat->num_rows. echo "<br />ISBN: ". for ($i=O. echo "</strong><br />Szerző: ".$talalatok_szama. $talalat->free(). $talalat = $adatbazis->query($lekerdezes). echo "<p><strong>".. echo stripslashes($sor['isbn']). echo stripslashes($sor['szerzo']). $keresesi kifejezes addslashes($keresesi kifejezes). 'bookorama123'."</p>". ).l 99' ·- . hogy a kód megengedi a felhasználónak a MySQL dzsókerkarakterek. $adatbazis->close()..2 ábra a kód használatával végrehajtott keresés eredményét illusztrálja. hogy ne okozhassanak preblé­ mát alkalmazásunknak.($i+l).". echo "</p>". .2 ábra: Javával foglalkozó könyvek keresése az adatbázisban az eredmenyek." LIKE '%". Kérjük...I LC. Ez hasznos lehet a felhasználónak. l'! A""'-".$keresesi_kifejezes. Nem sikerült kapcsolódni az adatbázishoz.. echo "<p>A keresési feltételeknek megfelelő könyvek száma: "... 'beokorama'. echo "<br />Ár: "..p hp kóddal.-. @ $adatbazis = new mysqli('localhost'..-. A 11.MySQL adatbázis elérése a webről PHP-vel 183 if (!get_magic_quotes_gpc()) { $keresesi_tipus = addslashes($keresesi_tipus).'. a % és az_ {alulvonás) használatár."%'". 'konyvek').

hogy a keresési kifejezés meglétének ellenőrzése az után történik. és get_magic_ quotes_gp c() függvényrőL Bármilyen felhasználói inputot küldünk olyan adatbázisba. $keresesi tlpus = addslashes($keresesi $keresesl klfejezes = addslashes($keresesl klfejezes). Kapcsolat létrehozása A MySQL-hez kapcsolódásta használható PHP könyvtár neve mysqli(az i az improved.amikor A következő lépés annak ellenőrzése. Ellenőrizzük a $keresesi_tipus válrozót. A kapcsolat a konyvek nevű adatbázis használatára jön létre. így el kell távolítani azokat. Nem adta meg a keresési feltételeket. A stripslashes() függvényt az adatbázisból érkező adatokon is használjuk. A kódban az alábbi sorral kapcsolódunk a MySQL kiszolgálóhoz: @ $adatbazis = new mysqli ('localhost'. Az eredmények megjelenírése a felhasználónak. akkor előfordulhatna olyan eset. .) A függvény használatával későbbi hibákat előzhetünk meg.mert a különböző belépési pontokról érkező felhasználók miatt biztonsági problémák keletkezhetnek. amelye­ ket a trim ( ) kivétel nélkül eltávolít: if (! $keresesi_tipus echo exit. Ebből megrudjuk.minden esetben ki kell szűrni belőlük a vezérlő karaktere­ ket.védőkaraktercel kell ellátni az adatokat.hogy a trim() függvényt a rövidebb nevet adunk neki: $keresesi_kifejezes=trim($_POST['keresesi klfeJezes')).rnint(<).objektumorientált és procedurális szintaktikát egyaránt alkalmazhatunk. Kapcsolat létrehozása a megfelelő adatbázishoz. 2.így nem hoz létre hibaüzenetet sem. " l l ! $keresesi kifejezes) { Kérjük. E sor létrehozza a mysqli osztály egy példányát. $_POST [ 'keresesi_kifejezes' l értékére alkalmazzuk.(Ez elsősorban angol nyelvterületen jellemző.az alábbi alaplépéseket kell követnünk: l. Az eredmények visszakeresése. A példában a htmlspecialchars ( ) függvénnyel kódoljuk a HMTL-ben különleges jelentéssei bíró karaktereket. Ezt úgy érhetjük el.hogy a felhasználó adott-e meg keresési kifejezést.és kiválasztotta-e a keresés ópusát. adja meg ezeket!". Azért is célszerű szűrni az adatokat.amely rnind az anyacég keresési felületét használja. Figyeljük meg. 5. amelyet be kell írni.az adatok perjeleket fognak tartalmazni.mint (>) vagy dupla idézőjeleket("). viszont csupa fehérköz karakterből áll.hogy az idézőjelek hoz­ záadása automatikusan történik-e.. 'boakorama'. 'bookoramal23'.vagyis. mint a MySQL.kisebb. fejezetben olvashattunk az addslashes(). 3. Ha nem. Az adarbázis lekérdezése.hogy eltávolítjuk a felhasználó által a keresési kifejezés elé vagy után véletlenül beírt fehérköz karakte­ reket. Az Amazonnak például számos leányvállalata van. A felhasználótól érkező adatok ellenőrzése és szűrése. magyar címekre kevésbé igaz.amelyben és jel található. hogy a felhasználó keresési kifejezése nem üres.hogy eltávolítjuk a $ keresesi_kifejezes széleiről a fehérköz karaktereket! Ha fordított sorrendben szerepelne ez a két kódsor.továbbfejlesztett" szóra utal).amit arra használunk.miért érdemes bajlódni egy olyan adat ellenőrzésével.a stripslashes() Karakterláncok kezelése és reguláris kifejezések című 4. hogy több felület is kapcsolódhat adarbázisunkhoz. Nem szabad elfelejteni. amikor visszajönnek az adatbázisból.nézzük meg most ezeket egyenként! ll A felhasználótól érkező adatok ellenőrzése és szűrése A kód azzal kezdődik.noha az jelen esetben egy SELECT HTML utasírásból származik! Kérdez­ hetnénk.és boakorama felhasználónévvel és bookoramal 23 jelszóval kapcsola­ tot létesít a localhost nevű számítógéphez.184 ll. Arnikor mysqli könyvrárat használunk PHP-ben.hogy a webről érjünk el egy adatbázist. Ezeket a lépéseket követtük az eredmenyek. Ha a magic quotes funkció be van kapcsol­ va. fejezer Adatbázis lekérdezése a webről Minden kódban. Arnikor felhasználók által bevitt adatokat tervezünk felhasználni. php kódban is. 'konyvek'). A je­ lenlegi tesztadatok nem tartalmaznak és(&).nagyobb. Mint emlékezhetünk. Ebben az esetben a get_magic_quotes_gpc ( ) függvény értékét ellenőrizzük.az if (!get_maglc quotes gpc()) addslashes () függvényekkel emelhetjük ki az adatokat védőkarakterrel: { tlpus). 4.ám számtalan olyan könyvcím létezik.

. ahogy a fájlkezelő függvények. hogy az adatbázishoz kapcsolódáskor a kódsort a hibaelnyomó műveleti jellel Ne fele<ljük. Ebben az esetben a felhasználó által megadott értékre ( $ keresesi _kifej ezes ) keresünk a felhasználó által meghatáro­ zott mezőben ( $keresesi_tipus). Mindkét paraméter alapértelmezett értékét a konfigurációs fájlok szerkesztésével tudjuk módosítani. ezeket azonban ebben egyidejű MySQL kapcsolatok száma korlátozott! A lehetséges legnagyobb értéket a max_ Apache paraméternek az MySQL paraméter határozza meg. Ez a függvény objektum helyett erőforrást ad vissza. a mysql_ select_ db() függvénnyel tehetjük meg. mivel a mysqli objektum konstruktora által is létrehozhatók. hogy connections az (@) kezdjük! Ez lehetövé teszi a hibák fájdalommentes kezelését. 'konyvek'). hogy az EQUAL helyett a LIKE műveleri jelet használjuk az illesztéshez: adatbázisban keresés esetén érdemes kicsit. ezt az eröforrás-változót kell átadnunk minden más mysqli függvénynek. conf állományát kell szerkeszteni.engedékenyebbnek" !�nni. hogy utasítsák a szervert az új kapcsalódások elutasítására. hogy melyik adatbázissal tervezünk dolgozni! Egy ilyen paranccsal tehetjük meg ezt: use konyvek. A kapcsolódási kisérlet eredményét érdemes ellenőrizni. A MySQL max_ A használni kívánt adatbázis kiválasztása Ne feledjük. "% 1 ". Ez igen hasonló ahhoz. 'Hiba: az ll ellenőrzést: Kérjük. mert a kód többi része nem fog megfelelő adatbázis-kapcsolat nélkül működni. Ezt a függvényt az $adatbazis->select_db(adatbazis neve) illetve a mysql_select_db(adatbazis_eroforras. $ keresesi_tipus. Az adatbázis-kapcsalódások kivételt képeznek e szabály alól. (A fenti kód működése az objektumorientált és a procedurális megközelítés esetén is ugyanaz. $ keresesi kifejezes. A mysqli függvények többsége objektumorientált felülettel és procedurális felülettel is rendelkezik. közölni kell vele. az objektum metódusait meghívva érhetjük el az adatbázist. adatbazis_neve) formában érhetjük el." LIKE '%". A használni kivánt adatbázist paraméterként határozhatjuk meg a mysqli konstruktor vagy a mysqli _connect () függvény számára. 'boakorama'. Az Apache MaxClients con nections paraméterének megváltoztatásához rendszerünk pararméterét a my. hogy a procedurális verziójú függvénynevek mysql_-lel kezdődnek. Általánosságban az köz­ tük a különbség. hogy amikor parancssori felületről használjuk a MySQL-t. . próbálkezzon később!'. A következő kóddal hajthatjuk végre ezt 1f (mysqli connect_errno()) echo exit. conf fájlban érjük el. Ezt megelőzően azonban érdemes létre­ hozni a futtatni kivánt lekérdezést: $lekerdezes = "SELECT * FROM konyvek WHERE ". Ebben az esetben az alábbi kóddal kapcsolód­ hatunk ugyanehhez az adatbázishoz: @ $adatbazis = mysqli connect('localhost'. Figyeljük meg. 'bookoramal 23'. hogy forgalmas idöszakokban vagy szaftverprobléma esetén túlzott mértékben vegyük igénybe a gép erőforrásait. { Nem sikerült kapcsolódni az adatbázishoz. egyszerű példában nem alkalmazzuk.) MaxClients (Ugyanígy kellene eljárni a kivételekkel is. Ha meg akarjuk váltaztami az alapértelmezett adat­ bázist. Ha jobban kedveljük a procedurális megközelítést. például az fopen () működik. sikeres kapcsolódás esetén nullát ad vissza. és ha ezt a procedurális megközelítést követjük. és kéri az adatbázis-erőforrásra mutató paramétert. Figyeljük meg. és megkövetelik a mysql_connect () függvényből megkapott erőforrás-változó átadását. a mysqli ennek használatát is megengedi. Ennek és a hozzá kapcsolódó a célja. Itt láthatjuk a függvények közötti különbséget. Az adatbázis lekérdezése Az adatbázis tényleges lekérdezéséhez a mysqli_query() függvényt használhatjuk. megakadályozva azt. Ez jelképezi az adatbázishoz való csatlakozást. httpd.) A errno mysqli _connect_ az () függvény hiba esetén hibakódot. Erre internetről való kapcsolódás esetén is szükség van.MySQL adatbázis elérése a webről PHP-vel 185 Ha az objektumorientált megközelítést követjük. amire korábban utaltunk: a procedurális változat mysql_-lel kezdődik.

amely tömbben rninden kulcs egy oszlopnév. Ha a lekérdezés egyetlen sort sem ad vissza. A függvény egyenként veszi az eredményhalmaz A ciklus minden ismétlődésének a $talalat->fetch_assoc () (vagy a mysqli_fetch_assoc ())függvényt hívjuk Természetesen in is használhatjuk a procedurális megközelítést: Mivel adott a $sor tömb.a MySQL monitorba begépelendö lekérdezéssei ellentétben -a MySQL-nek küldendö lekérdezés végére nem kell pontosvesszö! Mosr már lefuttathatjuk a lekérdezése: $talalat = Ha a procedurális felüleret kívánjuk használni. és a mysqli_fetch_assoc ( ) függvényt is használtuk. az alábbi példában is: echo "<br />ISBN: echo stripslashes($sor['isbn')).) $sor = $talalat->fetch object(). ményeket. Számtalan különböző módszer létezik. akkor a ciklus nem fut le. (Hasonlóan ah­ tároljuk el az eredménye. $i++) { ll eredmények feldolgozása sorait és tömbként adja vissza azokat. A mysqli_fetch_ Mint már említettük. például így: $talalatok_szama = mysqli_num_rows($talalat).) Későbbi felhasználás céljából mindkét esetben változóban ( Stalalat) A lekérdezés eredményeinek visszakeresése a tényleges eredményt. Példánkban megszámoltuk a visszaadon sarok számát. meg. ll ben is az $adatbazis) . Procedurális megközelítés alkalmazásakor a mysqli_num_ rows() függvény adja meg számunkra a lekérdezés által vissza­ sal végiglépkedhetünk raJtuk: for ($i=O. és rninden érték az annak megfelelő érték: $sor = $talalat->fetch_assoc(). tömbértékekbe kerülnek.a procedurális felület esetén . például így: vagy így: row () függvénnyel például elnevezett kulcsokkal rendelkező tömb helyen számokkal indexelt tömbben kapjuk vissza az ered­ $sor = $talalat->fetch row($talalat). ahogy a kapcsolódási függvények működnek. hogy megkapjuk az eredményazonosítóból az eredményeket. hogy különböző módszerekkel kinyerjük az eredményobjektumból vagy -azonosítóból számát. hogy megjelenítés előtt rendbe rakjuk az értéket. a stripslashes ( ) függvényt azért hívjuk meg. mert ha tervezzük az eredmények feldolgozását vagy megjelenítését. $sor = mysqli fetch_assoc($talalat). hogy. (A mysqli_fetch_array () függvénnyel A mysqli_fetch_object() függvénnyel objektumba is tehetjük a sorokat: illetve $sor = mysqli fetch_object($talalat).186 ll. $talalat = mysqli query($adatbazis. és a következőképpen érhetjük el ezt: Az objektumorientált megközelítés használata esetén az eredményobjektum num_rows tagja tárolja a visszaadott sarok $talalatok_szama = $talalat->num_rows. hoz. módon érhetjük el a tulajdonságokat. Átadjuk a futcaeni kivfut lekérdezést és . $sor [l) stb.az adatbázisra mutató kapcsolatot (ami jelen eset­ Az objektumorientált változat eredményobjektumot. Ekkor a $sor->cim. $sor->szerző stb. minden egyes mezőn végigmehetünk. a kétféle tömb bármelyikébe rakhatjuk a sorokat. a sarok száma alapján ciklus­ $i <$talalatok_szama. Sokféle függvény áll rendelkezésünkre. adott sarok számát. fejezet • Tipp: Ne feledjük. ahogy tesszük ". . a procedurális pedig eredmény-erőforrást ad vissza. $adatbazis->query($lekerdezes). akkor a következőket kell beírnunk: $lekerdezes). Azért érdemes tudni ezt. Át kell neki adni az eredményazonosítót. A tulajdonságértékek a $sor [O]. $sor = mysqli fetch row($talalat). Hiba esetén a függvény false értékkel tér vissza. Az eredményobjektum vagy -azonosító a lekérdezés által visszaadon sarok elérésének a kulcsa. és megfelelőképpen megjeleníthetjük azokat.

html-A könyvekfelvitelére szolgáló oldal HTML kódja <html> <head> <title>Book-0-Rama .3 példakód tartalmazza.3 példakód: uj_konyv. -::. ll Új információ felvitele az adatbázisba Új elemek adatbázisba történő felvitele módfelett hasonlít ahhoz a folyamathoz. érdemes mégis egy példán kereszrül megvizsgálni. Nem feltétlen van szükség erre a parancsra. és ellenőrizzük az eredményeket. ==-::. Book-0-Rama ""' [.:. . ":L"' 11. . meghívásával szabadíthatjuk fel.php" method="post"> <table border="O"> <tr> <td>ISBN</td> <td><input type="text" name="isbn" maxlength="l3" size="l3"></td> </tr> <tr> <td>Szerző</td> <td> <input type="text" name="szerzo" maxlength="30" size="30"></td> </tr> <tr> <td>Cím</td> <td> <input type="text" name="cim" maxlength="60" size="30"></td> </tr> <tr> <td>Ár $</td> könyv felvitele</title> .MySQL adatbázis elérése a webről PHP-vel 187 Kapcsolat bontása az adatbázissal Az eredményhalmazt a $talalat->free(). mivel a kapcsolat akkor is lezáródik. vagy a mysqli_free_result($talalat).Új könyv felvitele</hl> <form action="konyv_beszurasa. vagy a mysqli_close($adatbazis).:. meghívásával szakíthatjuk meg a kapcsolatot az adatbázissal. A 11._ _ ----.:. Az oldal HTML kódját a 11..3 ábra: A Book-O-Rama alkalmazottai ilyenfelületet használhatnak a könyvek adatbázisba való fel vitelére. amivel könyveket lehet felvinni az adatbázisba._:.Új </head> <body> <hl>Book-0-Rama . 11. ha a kód befejezi a futását.3 ábrán egyszerű HTML űrlapot lárunk. Ebben az esetben azonban az elküldendő lekérdezés SELECT helyett INSERT. amikor adatokat nyerünk ki az adatbázisbóL Ugyanazokat az alapvető lépéseket követjük: kapcsolatot létesítünk.Új könyv felvitele :st����-------­ � � '-=--=--=--=--=-':::. Bár a folyamat hasonló. lekérdezést küldünk. Ezt követően az $adatbazis->close().

Nem sikerült kapcsolódni az adatbázishoz. $lekerdezes = "INSERT INTO konyvek VALUES ('". amely fogja a részleteket. Ezt a kódot láthatjuk a 11. 'konyvek'). if ($talalat) echo $adatbazis->affected_rows. exit.4 példakód: konyv_beszurasa.". ez az a kód. $eim = addslashes($cim). majd megkísérli beírni az adatokat az adatbázisba. elvégez néhány apróbb ellenőrzést. $ar=$_POST['ar']. Kérjük. $talalat = $adatbazis->query($lekerdezes)."Kérjük. $szerzo=$_POST['szerzo']. fejezet <td><input type="text" name="ar" maxlength="7" size="7"></td> </tr> <tr> <td colspan="2"><input type="submit" value="Rögzités"></td> </tr> </table> </form> </body> ll </html> Az űrlap eredményeit a konyv _beszurasa. próbálkezzon később'". $eim=$ POST['cim']. . próbálja meg újra'". if (!get magic quotes gpc()) $isbn = addslashes($isbn). A könyvet nem sikerült hozzáadni."')"."'. 'bookoramal 23'.$isbn. ' boakorama'. 11.188 ll.php-Ez <html> <head> <title>Book-0-Rama </head> <body> a kód írja be az új könyveket az adatbázisba könyvfelviteli eredmények</title> <hl>Book-0-Rama könyvfelviteli eredmények</hl> <?php ll rövid változónevek létrehozása $isbn=$ POST['isbn']. $szerzo = addslashes($szerzo). if (!$isbn l l ! $szerzo l l ! $eim l l ! $ar) echo "Nem minden adatot adott meg. $ar = doubleval($ar)."."'' '". '".<br />" . php adja tovább. if (mysqli connect_errno()) echo "Hiba: exit.$eim. else echo "Hiba történt. $szerzo. @ $adatbazis = new mysqli( 'localhost'." db könyv hozzá lett adva az adatbázishoz.$ar.4 példakódban."'' '".

4 ábra: A kód sikeresen lefut.. $eim. hogy az űrlap minden mezője ki lett-e töltve.. '". . A lekérdezést az $adatbazis->query( ) (procedurális megközelítés esetén a az mysqli_query ())meghívása hajrja végre adatbázison. illetve az adatbázisnak küldendő lekérdezés megalkotásával kapcsolódunk az adatbázishoz.php ?.MySQL adatbázis elérése a webről PHP-vel 189 $adatbazis->elose(). lett adva az adatbázishoz. Jelen esetben a lekérdezés egy SQL INSERT: $lekerdezes = "INSERT INTO k onyvek VALUES ('". majd külön küldjük el az adatokat. echo $utasitas->affeeted_rows. hogy megfelelő formában kerüljenek be az adatbázisba: { if (!get_magie_quotes_gpe()) $isbn = addslashes($isbn).. '". Ha megvizsgáljuk a az k onyv_beszurasa.$isbn. Az előző kódban a mysqli _num_ rows () segítségével állapítottuk meg. $ar = doubleval($ar). Procedurális változatban ez egy függvény. A következőképpen használhatunk előfordított utasításokat a $lekerdezes = "INSERT INTO konyvek VALUES(?. ?)".."... . Az előfordított utasítások lényege..."')". $szerzo = addslashes($szerzo)._. $ar).. Az INSERT és a SELECT között jelentős különbség van a mysqli_ affeeted_ rows () használatában..ha szükséges addslashes() függvénnyel formázzuk az adatokat. nem kivánunk perjeleket beletenni.$ar. '". hogy a könyvet hozzáadta az adatbázishoz. $utasitas->exeeute(). hogy hány sort adott vissza a SELECT lekérdezés. és közli. Book-O-Rama könyvfelviteli eredmények ... objektumorientált változatban pedig az osztály egy tagváltozója: echo $adatbazis->affeeted_rows. DELETE Ezzel áttekintettük a MySQL adatbázisok PHP-beli használatának alapjait. a mysqli_affeeted_rows ()-t Amikor az adatbázist módosító. INSERT."'. '.php hogy adatot nyerjünk vissza az adatbázisbóL Ellenőrizzük. hogy először elküldjük a MySQL-nek a végrehajtani kívánt lekérdezés sablonját. Előfordított utasítások használata A mysqli könyvtár támogatja az előfordított utasítások (prepared statement)használatár. ?> </body> </html> A 11. Irt is a mysqli példányának létrehozásával.." db könyv hozzá lett adva az adatbázishoz.' db könyv hozzá $utasitas->elose(). A függvény a felhasználó által az ürlapba esetlegesen bevitt pénznemszimbólumokra is figyel.. majd . Mivel az árat float típusú adatként tároljuk az adatbázisban. hogy nagyrészt hasonló ahhoz a kódhoz. amit azért írrunk. E numerikus mező esetében a PHP gyorstalpaló című.$eim. ll \ 11. Rengetegszer elküldhetünk ugyanolyan adatokat ugyanannak az előfordított utasításnak. $talalat = $adatbazis->query($lekerdezes)... $isbn.4 ábrán egy sikeres adatfelvitel eredményét látharjuk. kódban: ?. Ezek előnye. hogy felgyorsítják a fimatást.$szerzo. $szerzo.."'. legelső fejezetből megismert doubleval () függvény meghívásával szűrherjük ki a nem kivánt karak­ tereket. kódját. $eim = addslashes($eim). látharjuk."'. ez a le­ hetőség különösen nagy mennyiségü adat bevitelénél hasznos. amikor különböző adatokon sokszor hajtjuk végre ugyanazt a lekérdezést. Emellett az SQL injection típusú támadások ellen is védenek. "'-"'. $utasitas->bind_param(" sssd". ko nyv_besz u ras a. $utasitas = $adatbazis->prepare($lekerdezes). így kell helyette használni. és UPDATE lekérdezéseket írunk.

Általános adatbázis�illesztés használata: PEAR MDB2 Nézzünk egy rövid példát a PEAR MDB2 absztrakciós réteg használarávall Ez az összes PEAR komponens közül az egyik legszélesebb körben használt. hogyan kapcsolódjunk MySQL-hez. hasonló ahhoz. A második sor az $adatbazis->prepare() meghívása. Ha mindennel kompatibilisnek kell lennünk. Minden egyes alkalommal. A formárum karakterláncban két további karakter használható: i és b. Az utasításobjektum rendelkezik egy b ind_pa ram() nevű metódussal. sem egyéb határoló karaktert raknunk a kér­ dőjelek köré. az eredményhalmaz következő sorában lévő oszlopértékek betöltödnek ezekbe a kötött változókba. hogy még egyszer meg kellene írnunk. amelyek az integer. hogyan írnánk meg a keresési eredmények kódját MDB2-vel! 11. arnikor ciklust hasz­ nálunk tömeges adatfelvitelnéL Nem csak a paramétereket lehet"megkötni'. php-Eredmények visszakeresése a MyS� adatbázisból ésJormázásuk a megjelenítéshez <html> <head> . és az egyes adatbázisok funkcióikban különbözhetnek. amelyeket szereménk az eredményoszlopokba betöltemi.való csadako­ zásra alkalmas könyvtárakat támogat. Az MDB2 absztrakcíós réteg telepítésére A PHP és a MySQL telepítése című Függelék A Pear telepítése részében találunk információt. Egyéb PHP adatbázis�illesztések használata A PHP különbözö adatbázisokhoz . Minden meghívásakor a következő eredménysort rakja be a négy kötött változóba. Az összehasonlítás kedvéért nézzük meg. Ez a sor hozza létre az utasításobjektumot vagy erőforrást. Amennyiben olyan adatbázissal kívánunk dolgozni. ahány kérdőjel szerepel az utasítás ban.190 ll. illetve double típusú. könyvkereső kódban például a következőt használhatnánk: $utasitas->bind_result($isbn. string. hogy a négy paraméter string. Az első para­ méter egy formárum karakterlánc. $eim. hanem az eredményeket is. Az ezekhez az adatbázisokhoz való csatlakozásnak. Az ODBC. és zárjuk le az utasítást. (Procedurális változat esetén neve mysql i_ stmt_b ind_param (). amelyet a printf() függvényben használunk. string. Ugyanebben a kódban természetesen használhatnánk amysqli stmt_bind_param() és a mysqli stmt_bind_result() függvényt is. anélkül futtathatjuk le újból az utasítást.5 példakód: eredmenyek _altalanos. A PHP-ben elérhető könyvtárak mellett az olyan adatbázis-absztrakciós osztályok. procedurális változat esetén ez a mysqli _stmt_ prepare () meghívása lesz. A korábban használt. SELECT típusú lekérdezéseknél az $utas itas­ >bind_result () (illetve a mysqli_stmt_bind_result() ) függvénnyel adhatjuk meg azon változók listáját. E paraméter után annyi változót kell felsorolni. Az $utasitas->execute(). meghívása után a következő függvényt hívnánk meg a ciklusban: $utasitas->fetch(). Ezt követően férünk hozzá az érintett sorokhoz. $szerzo. fejezet Nézzük át a kódot sorról sorra! Amikor létrehozzuk a lekérdezést.) A metódus feladata közölni a PHP-vel. amikor meghívjuk az $utas itas->fetch ()-t (illetve a mysqli_stmt_fetch ()-t). Az $utasi tas->execute() (procedurális változat esetén a mysqli_stmt_execute ()) meghívása futtatja le magát a lekérdezést. hogy ugyanazokat a függvényneveket használjuk minden adatbázistípusnál. mint például az MDB2. amelyiknek nem létezik PHP-ben könyvtára. amely az Open Database Connectivity (nyílt adatbázis-összekapcsolhatóság) rövidí­ tése. az adatbázisokhoz kapcsolódás szabványa. Miért hasznos tehát a fenti előfordított utasítás? Az benne a szép. mely változók kerülnek a kérdőjelek helyére. $ar). illetve ezen adatbázisok lekérdezésének az elvei általánosságban igen ha­ sonlók.köztük az Oracle-hoz. Nyilvánvaló okokból függvénycsoportjai csak a legkorlátozottabb funkciókra képesek. illetve a blob típusokat jelölik. Az egyes függvénynevek ugyan eleérők lehetnek. akkor könnyedén alkalmazhatjuk tudásunkat más adatbázisokra is. lehetövé teszik. akkor az általános ODBC függvényeket használhatj uk. A megadott sorrendben lesznek behelyerresítve. a Microsoft SQL Serverhez és a PosrgreSQL-hez . Igen praktikus tud lenni. amit majd a tényleges feldolgozás végrehajtásához fogunk felhasználni. akkor semminek nem tudjuk kihasználni a különleges funkcióit. Ezzel a lekérdezés által majd visszaadandó négy oszlophoz köménk ezt a négy változót. hogy ha megváltoztatjuk a négy kötött változó értékér. A példában áradott érték ll (" sssd" ) azt jelenti. Nem szabad sem idézöjeleket. a korábban alkalmazott változó-behelyettesítés helyett kérdőjeleket teszünk az egyes adatok helyére. de ha tudjuk.

"l". ll visszakapott sarok számának megállapítása Stalalatok szama = $talalat->numRows(). $host = 'localhost'.$adatbazis_neve. ll visszakapott sarok megjelenitése for ($i=O. ll felkészülés a PEAR MDB2 használatára require_once('MDB2. $adatbazis_neve = 'konyvek'. $keresesi_kifejezes=trim($_POST['keresesi_kifejezes'])."@". ll kapcsolódás eredményének ellenőrzése if (MDB2::isError($adatbazis)) { echo $adatbazis->getMessage(). exit.$keresesi_kifejezes. $talalat = $adatbazis->query($lekerdezes).$host. $jelszo = 'bookoramal23'. ll az eredmény ellenőrzése if (MDB2::isError($talalat)) echo $adatbazis->getMessage(). $i <$talalatok_szama.MySQL adatbázis elérése a webről PHP-vel 191 <title>Book-0-Rama keresési eredmények<ltitle> <l head> <body> <hl>Book-0-Rama keresési eredmények<lhl> <?php ll rövid változónevek létrehozása $keresesi tipus=$ POST['kereses�_t�pus']. ll echo 'Nem adta meg a keresési feltételeket.$felhasznalo. if (!get_magic_quotes_gpc()) { $keresesi_tipus = addslashes($keresesi_tipus). ll univerzális kapcsolódási sztring vagy DSN beállítása $dsn = "mysqli:ll".$jelszo. exit. $i++) .$keresesi_tipus . $felhasznalo = 'bookorama'. exit. ll lekérdezés végrehajtása Slekerdezes = "SELECT * FROM konyvek WHERE ". $keresesi kifejezes = addslashes($keresesi k�fejezes). ll kapcsolódás az adatbázishoz $adatbazis = &MDB2::connect($dsn). Kérjük." LIKE '%"."%'".":".php'). if (!$keresesi_tipus l l 1$keresesi_k�feJezes) adja meg ezeket!'.

ll echo stripslashes($sor['ar']).$adatbazis_name. ll adatbázishoz kapcsolódás megszüntetése $adatbazis->disconnect(). . hogy elég csak az adacbázis-függvények egyik készletét megjegyezni. amely az adatbázishoz kapcsolódáshoz szükséges minden paramécert tartalmaz. ha nem. Eze követően az isError () mecódus segítségével ellenőrizzük. látogassunk el a http:/ /www. echo "<br />ISBN: ". echo stripslashes($sor['isbn']).$host. echo "<p><strong>". ezt követően létrehozzuk és végrehajljuk a lekérdezése: $talalat = $adatbazis->query($lekerdezes). sikerülc-e a kapcsolódás. Ellenőrizzük a visszaadott sorok számát: $talalatok szama = $talalat->numRows().$jelszo. További olvasnivaló A MySQL és a PHP összekapcsolásáról a PHP és a MySQL kézikönyvek megfelelő részeiben olvashacunk bővebben. az MDB2_ FETCHMODE _ASSOC paramé­ terrel azt közöljük."/". echo "</strong><br />Szerz6: ". Eze akkor láchaguk. fejezet $sor = $talalat->fetchRow(MDB2 FETCHMODE_ASSOC). hogy az általános példa igen hasonló az első kódhoz. hogy megváltozraguk az adarbázis szofcveréc. a másik pedig az. hogy asszociatív tömbként kivánjuk visszakapni a sort. Az MDB2 használarának egyik előnye. a hibaüzenet kiírása után a kód végrehajtása véget ér: if (MDB2::isError($adatbazis)) { echo $adatbazis->getMessage(). Amennyiben minden jól alakul. echo stripslashes($sor['szerzo']). hogy csak kis mértékben kell kódunkat módosítani.$felhasznalo.":".htm! oldalra! Hogyan tovább? A következő fejezetben részleeesebben foglalkozunk a MySQL-adminisztrációval.192 ll."@". ha a kapcsolódási karakterlánc formácumára nézünk: $dsn = "mysqli://". A visszakapott sorok kimenere után megszüncegük a kapcsolódást: $adatbazis->disconnect().webopedia. ha úgy döntünk. Az álcalános fetchRow() mecódus számralan formában képes kezelni a sorokat. Cím: ". és megvizsgáljuk. ?> </body> </html> Vizsgáljuk meg. echo htmlspecialchars(stripslashes($sor['cim'])). Ha az ODBC-ről szeretnénk további információt.". Mivel ez a könyv a MySQL-ről szól. Saját projekgeinkben használhacjuk az MDB2 csomagot is. a nagyobb sebesség és rugalmasság érdekében a MySQL natív könyvtáraival fogunk dol­ gozni. mert néha jó szolgálacot tehet absztrakciós réteg használata. exit. A függvény egy univerzális kapcsolódási karakterláncot fogad el. miben különbözik ez a kód korábbi változatától! Az adatbázishoz kapcsolódásra az alábbi sort használjuk: $adatbazis = MDB2::connect($dsn). echo "</p>".($i+l). echo "<br />Ar: ".com/TERM/0/0DBC. Láthatjuk. hogyan optimalizáljuk az adatbázisokat. A következőképpen keressük vissza az egyes sorokat: $sor = $talalat->fetchRow(DB FETCHMODE_ASSOC).

a szokásos módon tekinthetjük meg az ebben az adatbázisban lévő táblákat: show tables. A fejezetben érintert főbb területek: A jogosultsági rendszer alaposabb megismerése MySQL adatbázisunk biztonságossá tétele További információk begyűjtése az adatbázisokról Gyorsabb működés indexekkel Adatbázisunk optimalizálása Biztonsági mentés és helyreállítás Replikáció megvalósítása A jogosultsági rendszer alaposabb megismerése A Webes adatbázis létrehozása ámű 9. fontos pontosan tisztában lennünk azzal.. Éppen ezért ügyelnünk kell. adminisztráció A most következő fejezetben haladó szintű MySQL-témakörökkel foglalkozunk. A mysql adatbázis tartalmának megtekintéséhez jelentkezzünk be rendszergazdaként. Láttuk. utasítást! Miután ezt megtertük. Ha MySQL adatbázis adminisztrációját kívánjuk ellát­ ni. Az eredmény az alábbihoz hasonló kell.. mindezt hogyan tehetjük meg a GRANT paranccsal.12 Haladó MySQL . majd gépeljük be a use mysql. Amikor GRANT utasítást adunk ki. fejezet bemutatta a felhasználék beállításának és jogosultságokkal való felruházásának folyamatát. hogy legyen: +---------------------------+ 1 Tables_in_mysql +---------------------------+ columns_priv db event fu ne general_log help_category help_keyword help_relation help_topic host ndb_binlog_index plugin proc procs_priv servers slow_log . a biztonsággal és az optimalizálással. és hogyan működik a GRANT parancs. amikor jogosultságokat oszrunk ki az adatbázisokra. köztük a jogosultságokkal. a mysql nevű speciális adatbázis tábláit módosítjuk vele. mit tesz. hogy kinek és miért adunk hozzáférést a mysql adatbázishoz. Ezen adatbázis hat táblája jogosultsági információkat tárol.

'Y') enum('N'. A sokat érheti el a felhasználó.1 táblázatban látható. tables_priv. A tables _priv db és a host tábla határozza meg. amelyek a felhasználót.'Y') e num('N'.1 táblázat: A mysql user. 'Y') enum( 'N'.'Y') enum('N'. A A user use r tábla tábla a globális felhasználói jogosultságok részleteit tartalmazza.'Y') Mező Host User Password Select_priv Insert_priv Update_priv Delete_priv Create_priv Drop_priv Reload_priv Shutdown priv Process_priv File priv Grant_priv References_priv Index_priv Alter_priv Show_db_priv Super_priv Create tmp_table_priv Lock_tables_priv Execute_priv Repl slave_priv . de ugyanazt az általános feladarot látják el: meghatározzák.'Y') enum('N'.) Funkciójukban ugyan eltérnek egymásról. 'Y') enum('N'. host. db. utasítás segítségével ismerhetjük meg. hogy az egyes felhasználék mit jogosul­ rak megrenni. illetve rendelkezik-e bármilyen globális szintű. mely adarbázi­ táblából az derül ki.tárolja a jogosultsági információkat. hogy az adott felhasználó jogosult-e egyáltalán a MySQL kiszolgálóhoz kapcsolódni.194 12. hogy az adatbázison belül melyik táblákhoz fér hozzá. A tábla szerkezetét a describe 12.'Y') enum( 'N'. hogy a táblákon belül mely oszlopokat éri el. A user és a host táblával határozharjuk meg. A user tábla sémája a 12.'Y') enum('N'. hogy az adott felhasználó kapcsolódhat-e egyáltalán a MySQL kiszolgá­ lóhoz. és a jogosulrsági mezőker. illetve rendelkezik-e bármilyen adminiszrrárori jogosultsággal. 'Y') e num('N'. (Angolul grant táblákként is szokás hivatkozni rájuk. a columns_priv tábla pedig azt határozza meg. 'Y') e num('N'.'Y') enum('N'. Aprocs_priv táblából azt tudjuk meg. adatbázis user táblájának sémája Típusa varchar(60) varchar(l6) varchar(41) enum('N'.vagyis a rendszer összes adat­ bázisára érvényes -jogosultsággal.'Y') enum('N'. amelyikre a jogosultság vonatkozik.'Y') enum('N'. Közülük harés procs priv user.'Y') enum('N'.'Y') enum( 'N'. a kiszolgálór és az adatbázis azon részét határozzák meg. Szabályozza.'Y') e num ('N'. fejezer tables_priv time time time zone zone leap second zone name time zone transition time user +---------------------------+ zone transition_type A fenri táblák mindegyike rendszerinformációkar tárol. Mindegyik kér mezőrípust tartalmaz: harókörmezőket. amelyek azt szabályozzák. hogy az adott 12 hatókörben lévő felhasználék mely művelereker hajthatják végre. hogy milyen rutinokat futtathat a felhasználó. columns_pri v . 'Y') enum('N'. 'Y') enum( 'N'. 'Y') enum('N'.

enum('N' . úgynevezett jogosu/tsági mező (privilege fi. hogy a rendszerben lévő minden adatbázisra (így a rnysql adatbázisra is) érvényesek. de a fel­ használók többségénél N kell. amelyek a többi. Rendszergazdák esetében itt számos jogosultság eseténY értéker találunk. enum('N' . enum('N' . hogy álljon. 12. Ezek a táblázat hatókörmezői (scope fi. 'Y') 'Y') 'Y') 'Y') 'Y') 'Y') 'Y') 'Y') 'Y') 'Y') . enum('N' . User nevű. enum('N' .2. Az általános felhasználóknak a megfelelő adatbázisokra.eld) hatókörét írják le. az ahhoz tartozó oszlop értékeY . A db tábla azt határozza meg. hogy mely felhasználók melyik adatbázisokhoz és honnan (melyik hostokról) férhetnek hoz­ zá. e num('N' . Amennyiben a felhasználó rendelkezik adott jogosultsággal.2 táblázat: A Mező Host Db User Select_priv Insert_priv Update_priv Delete_priv Create_priv Drop_priv Grant_priv References _priv Index_priv Alter_priv rnysql adatbázis db táblájának sémája Típusa char(60) char(64) char(16) enum('N' . A host tábla kiegészíti a user és a db táblát. enum('N' . e num('N' . 'X509' . a user és a db tábla nem fogja felsorolni ezeket a hostokat. nem pedig az összes táblára érvényes jogosultságokkal kell rendelkezniük. fejezetben a GRANT utasítással kiosztott jogosultságoknak felelnek meg. E két tábla sérnáját a 12. akkor az ahhoz tartozó érték viszone N. Az ebben a táblában felsorolt jogosultságok az adott sorban megnevezett adatbázisra irányulnak. Ha egy felhasználó több gépről csatlakozhat.3 táblázatban láthatjuk. A user tábla által felsorolt jogosultságok mindegyike globális. Az ebben a táblában felsorolt (és a többi tábla által követendő) jogosultságok a 9. ez azt jelenti. enurn(' N' . e num('N' . enum('N' . a P assword jelszóval bejelentkező felhasználó jogosultsá­ gainak felelnek meg. illerve a 12. 'ANY' . amelyek az egyes felhasználó-host kombinációkhoz tartozó jogosultságokat szabályozzák. enum('N' . Ha a felhasználó nem kapott meg valamely jogosultságot.eld). e num('N' . 'SPECIFIED' ) b lob blob blob rnax_questions int(ll) int(ll) int(ll) unsigned unsigned unsigned int(ll) unsigned 12 A táblázat egyes sorai a Host számitógépről érkező. A Se l ect_pr iv például a SELECT parancs futtatására való jogosultság. A db és a h os t tábla Az átlagos felhasználók jogosultságainak jelentős részét a db és a host tábla tárolja. A felhasználónak ehelyett több bejegyzése lesz a host táblában. enum('N' .Haladó MySQL-adminisztráció 195 Mező Repl_client_priv Create_view_priv Show_view_priv Create_routine_priv Alter_routine_priv Create_user_priv Event_priv Trigger_priv ssl_type ssl_cipher x509 issuer x509 subject max_updates max connections max user connections Típusa enum('N' . enum('N' . 'Y') 'Y') 'Y') 'Y') 'Y') 'Y') 'Y') enum( 'N' . 'Y ' ) enurn(' ' .

illetve a 12. a 12. 'Al ter'. 'Y') 12 Host Db Select_priv Insert_priv Update_priv Delete_priv Create_priv Drop_priv Grant_priv References_priv Index_priv Alter_priv Create tmp_tables_priv Lock_tables_priv Create_view_priv Show_view_priv Create routine_priv Alter_routine_priv Execute_priv Trigger_priv A tables_pr i v. 'Y') enum('N'. fejezet Mező Create_tmp tables_priv Lock_tables_priv Create_view_priv Show_view_priv Create_routine_priv Alter_routine_priv Execute_priv Event_priv Trigger_priv Típusa enum('N'. 'Delete'.3 táblázat: A mysql adatbázis host Mező táblájának sémája Típusa char(60) char(64) enum('N'. 'Drop'. 'Update'.'Y') enum('N'.4.'Y') enum('N'.'Y') enum('N'. 'Y') enum('N'.'Y') enum( 'N'. A tables_pri v.'Y') enum('N'. 'Y') enum('N'. 'Trigger')) 'Create'. 'Y') enum('N'. 'Y') enum ('N'. 'Show view'. Ezek a táblák a user.'Y') enum('N'. a columns_priv és a procs_priv tábla sémáját a 12. 'Y') enum ('N'. a columns_priv és a procs_priv tábla a táblaszintű.'Y') enum('N'.'Y') enum('N'. 'Re ferences'.'Y') 12. 'Index'. illetve a tárolt rutinokhoz kapcsolódó jogosultságokat tartalmazza. 'Y') enum('N'. 'References') .'Y') enum('N'.'Y') enum('N'.4 táblázat: A mysql Mező Host Db User Table name Grantor Timestarop Table_priv adatbázis tables_priv táblájának sémája Típusa char(60) char(64) char(16) char(60) char(77) timestarop(14) set('Select'. oszlopszintű.'Y') enum('N'. 'Y') e num('N'. 'Y') enum('N'. db és host táblától kissé eltérő szerkezettel rendelkeznek.5.'Y') enum('N'. 'Y') enum('N'.196 12.'Y') enum('N'. 'Grant'. 'Insert'. a columns_pri v és a procs_pr i v tábla az A tables_pr iv. 'Y') enum('N'. 'Insert'. 12. 'Update'. táblázatban láthatjuk. Column_priv set ('Select'. 'Y') enum('N'. 'Create View'.6.

com. Itt a MySQL először is azt ellenőrzi. Ha azonban ily módon frissígük őket. A rendszer először globális jogosultságainkat ellenőrzi (a user táblában).Haladó MySQL-adminisztráció 197 12. a MySQL szerver nem fogja észrevenni.a a columns_pri v db és a host táblához fordul. majd. a MySQL a táblát fogja ellenőrizni. végül táblát. 'Grant') timestarop(14) pr i v 'PROCEDURE') 12 A tables_priv és procs nevét tárolja. a MySQL ellenőrzi a tables_pr i v táblát. 'Insert'. au-ra végződő összes hosztnév megfelel). A h osztnevek ) meghatározásának használhatunk dzsókerkaraktert (%. Minden egyes alkalommal. mit jogosult megtenni egy adott felhasználó: l. tangledweb. a MySQL a jegyzést. au esetén például a . ha nem engedélyezzük az üres felhasználói nevet. 'Re ferences') 12. char (77) set('Execute'. Ha a müvelet tárolt rutinokat használ. Kérés ellenőrzése. Hozzáférés�szabályozás: Hogyan használja a MySQL a jogosoltsági táblákat� A MySQL a jogosuJtsági táblákat felhasználva kétlépcsős folyamatban határozza meg. Az üres jelszómező azt jelenti. nincs szükség jelszóra. hogy minden hoszt megengedett) vagy a h osztnév egy része (a %. ezt pedig háromféleképpen tehetjük meg.ha ez nem elégséges. illetve a GRANT és a REVOKE utasítás kiadásakor automatikusan beolvassa a jogosultsá­ gi táblákat. amikor a kapcsolat létrehozása után kérést intézünk a kiszolgálóhoz. Ha nem és a columns_priv rendelkezünk elegendő jogosultsággal. Lehet ez a teljes mező tartalma (ami azt jelenti. Most. a MySQL hol és miképpen tárolja a jogosultságokat. host táblában keres megfelelő user és host be­ a MySQL ellenőrzi. Ahogy már korábban említettük. hogy egyáltalán van-e jogosultságunk kapcsolódni. Rendszerünk bizton­ ságosabb lesz. 'Alter Routine'. Kapcsolat ellenőrzése. és ha ez még mindig nem elég. Tudatnunk kell a kiszolgálóval. hogy megrudtuk. . hogy rendelkezünk-e a kérés végrehajtásához szükséges jogosultsággal. utasítást (a parancs használatához rendszergazdaként kell bejelentkeznünk).6 táblázat: A mysql Mező Host Db User Routine name Routine_type Grantor Proc_priv Timestarop adatbázis procs_priv táblájának sémája Típusa char(60) char(64) char(16) char(64) enum('FUNCTION'. hogy minden felhasználó kapcsolódhat. com. tangledweb. Ez a jogosultságok frissítésének talán leggyakrab­ ban használt módja. akár saját kezűleg is megváltoztathat­ juk ezeket. hogy a jogosultságok megváltoztak.5 táblázat: A mysql Mező Host Db User Table name Column name Timestarop Column_priv adatbázis columns_priv táblájának sémája Típusa char(60) char(64) char(16) char(64) char(64) timestamp(14) set('Select'. Az üres felhasználói név azt jelzi. Ez az ellenőrzés a felhasználói név. 'Update'. Begépelhetjük a MySQL parancssorba a FLUSH PRIVILEGES. a h osztnevekben a dzsókerkarakterek használatát és a jelszó nélküli felhasználókat. a hosztnév és a jelszó alapján történik. tables_priv táb­ la helyett a procs _priv Jogosultságok frissítése: Mikor lépnek életbe a változtatások� A MySQL a kiszolgáló elindításakor. ezt a user tábla adatai alapján dönti el. hogy változás történt. 2. A táblák tábla Grantor oszlopa a felhasználónak az adott jogosultságot kiosztó felhasználó Timestamp oszlopai a jogosultság kiosztásának dátumát és időpontját rögzítik. Ha a hosztnév üres.

ha elkezdjük MySQL adatbázisunkat és weboldalunkat összekapcsolni. Ne feledjük. . hogy szigorúbbá tegyék az oldal biztonságát. hogy megtagadjuk a jogosulatlan gépek kapcsolódását. arnikor. de webes alkal­ mazásoknál gyakran előfordul. bizony. mint amennyire szüksége van! Ezt a jogosultsági táblákban ellenőrizhetjük. amiről. amit szükség esetén beszúrunk A kódot a webes dokumentumf. meg kell bizonyosadnunk arról. hogy minden felhasználónk (különösen a root!) rendelkezzen az operációs rendszer jelszavához hasonló gondossággal megválasztott és rendszeresen változtatott jelszóvall Az alapszabály. Felhasználói jogosultságok A tudás hatalom. ügyeljünk. Ez igen fontos dolog. hogy mysql felhasználói azonosítóval (userid-vel) a mysql csoportban fusson. Gyakorlati PHP és MySQL projektekfejlesztése ámü részben a projektek megvalósításánál fogjuk kihasználni ezt a funkciór. Ezen túlmenően azt is megtehetjük. Ezt úgy lehet kellően biztonságosan megvalósítani. Széles körben ismert. akinek a jelszavát abban tátoljuk! Az adarbázishoz kapcsolódáshoz használt PHP kódoknak értelemszerűen hozzá kell férniük az adott felhasználó jelszavához. úgy akkor. MySQL adatbázisunk biztonságossá tétele A biztonság fontos tényező.198 12. A jelszavakat a MySQL password ( ) függvényével lehet (egy irányban) ritkosítani. A követ­ kező részek bemutatják. hogy az operációs rendszerben báthon­ Apache honlapját is ezzel sikerült feltörni. Számos telepítésnél a ki­ szolgáló úgy van beállítva.a felhasználó beléptetéséhez. nehogy böngészőn keresztül egyszerű szövegként megtekinthetők legyenek ezek a titkos adatok! Ne tároljuk adatbázisunkban a jelszavakat egyszerű szövegként! A MySQL jelszavak nem így tárolódnak. nem jó választás. hogy tárolni kívánjuk az oldal tagjainak felhasználói nevét és jelszavát. hogy csak az a felhasználó láthassa az adott kódot. inc vagy valamilyen más kiterjesztésű fájlban tároljuk ezeket a részleteket. az adatbázis-jogosultságok ellenőrzését a u se utasítás soron következő használata. bizony. Ezt követően a globális szintű jogosultságok ellenőrzése a legközelebbi felhasználói kapcsolódáskor fog végbemenni. hogy a 3306-os számú porton keresztül tudunk-e kivülről csatlakozni kiszolgálónkhoz! Ez az alapértelmezett port. hogy az Jelszavak Gondoskodjunk arról. MySQL az operációs rendszer szemszögéből A MySQL kiszolgáló (mysqld) adminisztrátorként (root) futtatása nem túl jó ödet Unix-szerű operációs rendszer alatt. hogy ha . hogy a webszerver risztában van azzal. hogy ellenőrizzük a felhasználó által begépelt jelszót! Az V. Győzödjünk meg arról. fejezet Megtehetjük ugyanakkor azt is. nan olvasson és bárhova ítjon fájlokat. hogy megértettük a MySQL jogosultsági rendszerét és az egyes jogosultságok Ici­ osztásának következményeit! Egyeden felhasználót se ruházzunk fel több jogosultsággal.in kívül kell tárolni. a tábla. (Szerencsére a hackerek "fehér kalaposak" voltak (vagyis jó fiúk). könnyü megfeledkezni. Ezzel ugyanis a minden jogosultsággal felruházott MySQL-felhasználó arra is lehetőséget kap. amit soha nem szabad elfelejteni. hogy operációs rendszerünkből futtatjuk a mysqladmin flush-privileges vagy a mysqladmin reload utasítást. és ezt le kell zárni tűzfalunkon.egy dbconnect. Jegyezzük meg. php nevü fájlba tesszük.. MySQL kiszolgálónk ideális esetben tűzfalunk mögött helyezkedik el. hogy a részben vagy egészben szótári szóból álló jelszó. és csak a megfelelő felhasználó számára szabad elérhetővé tenni. Ellenőrizzük.mondjuk. hogy a könyvrátakat (ahol a fi:zikai adatokat tátoljuk) csak a MySQL-felhasználó szátnáta tesszük elérhetővé. A legjobb a betük és számok kombinációja. amelyen a MySQL fut. ha a felhasználói nevet és a jelszót.és oszlopszintű jogosultságok ellen­ őrzését pedig a felhasználó következő kérése váltja ki. ugyanezt a függvényt kell használni ahhoz is. Ezzel lehetövé válik. Amennyiben kódfájlokban fogjuk rátoini a jelszavakat. különösen akkor. milyen óvintézkedésekkel védhetjük adatbázisunkat.futtatjuk a SELECT utasítást. hogy ha ebben a formában szútjuk be a jelszó t. hogy PHP-ként kell értelmeznie e fájlokat. egyeden céljuk az volt.) Érdemes létrehozni egy MySQL-felhasználót kifejezetten a mysqld futtatására.

hogyan lehet a PHP addslashes () és stripslashes () függvé­ nyével megszabadítani a karakterláncokat a problémás karakterektőL Fontos. 12 Webes kérdések MySQL adatbázisunk internertel történő összekapcsolása különleges biztonsági kérdéseket ver fel. hogy mit tesznek és mit gépelnek be más felhasználók (így jelszavuk is megszerezhetö). Úgy érhetjük ezt el. hajtsunk rajta végre általános adattisztítást. hogy ne Jeledkezzünk meg erről. hogy nem is az a j ane. A GRANT jogosultság kiosztásával is csínján kell bánni. illetve az operációs rendszerbe (például Unix rendszerben az /etc/password könyvtárba).kivéve. l Figyelmeztetés: Az előző fejezetben bemutattuk. de szimplán a j ane túl gyakori. Mivel a program parancssorból futtatható. A FILE jogosultsággal fájlokat lehet olvasni és írni az operáci­ ós rendszerből. hogyan alkalmazzuk a legkisebb jogosultság elvét. ha a MySQL daernonea--s kip-name. Hasonló okokból kerüljük a hoszmevekben a dzsókerkarakterek használatár! A biztonságot tovább erösíthetjük. hogy saját jogosultságaikat megosszák másokkal. hogy kizárólag a webes kapcsolatok céljára létrehozunk egy különleges felhasználót. lnformációszerzés a SHOW utasítással A korábbiakban a SHOW TABLES. A következökben röviden áttekintjük. Célszerű elkerülni. milyen más módokon használhatjuk ezeket. Ily módon elke­ rülhetjük a DNS kiszolgálónknál jelentkező hibák vagy crackerek okozta problémákat. ám a numerikus adatok ellenőrzését gyak­ ran elfelej tik.res olve beállítással indítjuk el. akinek gondoljuk. Amennyiben a felhasználók adatbázisunkban eltárolandó jelszavakar vagy más bizalmas információkat gépelnek be. FILE. ALTER vagy CREATE jogosultságot. Ha ez megvan. További információk begyűjtése az adatbázisokról Idáig a SHOW és a DESCRIBE utasítást használtuk annak kiderítésére. és bárhonnan bejelentkezhet . ami azt eredményezi.sőt lehet. Emlékezhetünk rá. ne feledjük. hogy a numerikus adat ténylegesen numerikus volt-e. legfeljebb rendkívül indokolt esetben! A PROCESS jogosultsággal látni lehet. SHUTDOWN és RELOAD jogosultságot az egyetlen rendszergazdán kívül más felhasználóknak. utasítással kaptuk meg az adatbázisban lévő táblák listáját.Haladó MySQL-adminisztráció 199 Különösképpen ne osszunk ki PROCESS. Ennek elmulasztása gyakori hiba. ha HTML űrlapunk csak jelölö­ négyzetekből és választógombokból áll. megváltoztathatják az URL-t. hogy megpróbálják feltörni kódunkat. a hozzáférés az operációsrendszer-jogosultságok kérdése. A SHOW DATABASES. Még akkor is. Felhasználók létrehozásánál ügyeljünk. ha Secure Sockets Layer (SSL) kap­ csolatot használunk! Erről részletesebben olvashatunk majd könyvünk egy későbbi részében. hogy csak a lehető legszükebb jogosultsággal ruházzuk fel. illetve az EXPLAIN utasítást arra. hogy csak azokról a hasztokról engedélyezzük számukra a hozzáférést. hogy a nem rendszergazda felhasználók hozzáférjenek a webszerveren futó mysqladmin programhoz. mert lehetövé teszi a felhasználóknak. és ne adjunk ennek a felhasználónak például DROP. Csak a katalogus táblákra acijunk neki SELECT. és milyen oszlopok találhatók ezekben a táblákban. és mielött bármit elküldenénk a MySQL-nek. TABLES utasítás az elérhető adatbázisok listáját aclja. hogy további információt szerezzünk a SELECT művelet végrehajtásával. a SHOW adatbázis tábláinak listáját jeleníthetjük meg: utasítással az ezek közül kiválasztott valamely . hogy a böngésző egyszerű szövegként továbbítja azokat a kiszolgálónak . hogy a doubleval () függvénnyel azt ellenöriztük. hogy minden host oszlopértéknek IP­ ámnek vagy helyi gépnek (localhost) kel! lennie. Érdemes azzal kezdeni. és csak a megrendeles táblákra INSERT jogosultságot! Ismét egy jó példa arra. milyen táblákból áll adatbázisunk. Ugyanígy érde­ mes a bejövő adatok mérerét is ellenőrizni. Minden esetben ellenőriznünk kell a felhasználóktól érkező minden adatot. ha a host táblában a domainnevek helyett IP-címeket használunk. az addslashes () használatára még csak-csak szaktak emlékezni a programozók. amelyekről csatlakozni fognak! Például egy j ane@localhost felhasználó teljesen rendben van. Így lehetősé­ günk lesz arra.

Threads_connected.megrendelesek. Használhaguk a tabla. az aktuálisan használt adatbázisra fog vo­ natkozni. ON INSERT. A SHOW utasítás egy másik igen hasznos változatával kideríthető. [FROM az adatbazis nevű adatbázis tábláinak [LIKE_vagy_WHERE) SHOW [FULL) COLUMNS FROM tabla [LIKE_vagy_WHERE) Az aktuálisan használt vagy a megnevezett adatbázis egy adott táblájának összes oszlopát lisrázza ki.200 12.1/en/show. DELETE.* TO 'bookorama'@'%' IDENTIFIED BY PASSWORD '*1ECE648641438A28El910DOD7403CSEE9E8BOA85' GRANT SELECT. fejezet SHOW TABLES FROM konyvek.* TO 'bookorama'@'%' +------------------------------------------------------------------------+ Az itt látható GRANT utasítások nem szükségszerűen azok. az adatbazis) SHOW INDEX FROM tabla adatbazis] [FROM adatbazis nevű adatbázis egy adott tábláján lévő indexek részleteit mutaga.oszlop megjelölést is: SHOW COLUMNS FROM konyvek. mysql. illetve a WHERE használatával. INDEX.html)! A [LIKE_v agy_WHERE J táblázatbeli összes előfordulása esetén megpróbálha · tunk mintát vagy kifejezést illeszteni a LIKE. A SHOW GRANTS FOR bookorama. Ha már tudjuk. A SHOW COLUMNS helyerr a SHOW FIELDS is használható. A rendszeren aktuálisan futó folyamatokat . A teljes listáért olvassunk bele a MySQL kézikönyvbe (hrrp://dev.Thread%" például a . A felhasznáJók többsége csak saját szálait láthaga. például a futó szálak számáról ad tájékoztatást.vagyis az éppen végre­ hajtort lekérdezéseket -jeleníti meg.így akár lekérdezésekben lévő jelszavakra is . amelyekkel az adott felhasználó megkapta meglévő jogosultsá­ gait.Threads running" elemeknek felel meg. [LIKE_vagy_WHERE) SHOW [FULL) PROCESSLIST .. .. SHOW [GLOBALISESSION) VARIABLES A MySQL rendszerváltozók nevét és értékét jeleníti meg (például verziószám).com/doc/refman/5. A SHOW utasítás számtalan más változatban használható.7 táblázat: A SHOW utasítás szintaktikája Változat SHOW DATABASES SHOW [OPEN) [LIKE_vagy_WHERE) [FROM adatbazis] TABLES Leírás Az elérhető adatbázisok listáját jeleníti meg. ALTER 'konyvek'.Threads created" és. Ha kihagyjuk az adatbázis nevét. CREATE. de PROCESS jogosultsággal bárki folyamata­ ira . Az aktuálisan használt vagy a SHOW KEYS is. A gyaktabban használtakat a 12. DROP.7 táblázatban láthatjuk. 12.ránézhernek Az opcionális FULL kulcsszó használatakor a teljes lekérdezések jelennek meg. amelyek a felhasználó jelenlegi jogosultsági szingét eredményeznék. hogy milyen jogosultságokkal bír egy adott felhasználó.. . Használható helyette l SESSION) STATUS [LIKE SHOW [GLOBAL A rendszerelemek. Threads_cached". A LIKE mellékággal az vagy_WHERE) elemek neveire lehet illeszteni. a következőképpen kapjuk meg az oszlopok listáját: SHOW COLUMNS FROM megrendelesek FROM konyvek. UPDATE. milyen táblák vannak. a SHOW COLUMNS utasítás az aktuálisan használt adatbázisra fog vonatkozni. a.. Az aktuálisan használt vagy listáját jeleníti meg. utasítás az alábbi eredménnyel jár: +------------------------------------------------------------------------+ l Grants for bookorama@% +------------------------------------------------------------------------+ 12 GRANT USAGE ON *. Amikor adatbázis meghatározása nélkül használjuk a SHOW TABLES utasítást. valójában több mint harminc különböző változata létezik. inkább olyan egyenértékű utasítások összefoglalása.

Az utoljára végrehajtott utasítás által generált hibákat jeleníti meg. A második és sokkal érdekesebb használati mód esetén az EXPLAIN látni engedi számunkra. figyelmezte­ téseket vagy üzeneteket jeleníti meg. (Azért függőlegesen jelenítjük meg. amikor összetett lekérdezést próbálunk működésbe hozni. mert a táblázat sorai túl szélesek ahhoz. (A tárolómotorokkal részletesebben foglalkozunk a Haladó SHOW PRIVILEGES SHOW CREATE DATABASE adatbazis SHOW CREATE TABLE tabla neve SHOW [STORAGE] ENGINES MySQL·pragramazás című 13. A fentiek miatt az EXPLAIN parancs egyben ügyes tanulási eszköz is.rendelesid konyvek. Az utasítás a tábla minden oszlopáról. hogy optimalizáljuk. Az utasítástól visszakapott kimenet alapján szükség esetén átdolgozharjuk az SQL kódot. illetve jelzi.) Az információk közört megtaláljuk a tábla típusát és az utolsó frissítése időpontját. illetve.] Az InnoDB tárolómotor aktuális állapotáról jelenít meg adatokat. A lekérdezések működésének megismerése az EXPLAIN utasítással Az EXPLAIN urasírás kétféleképpen használható. Az adott telepítésnél elérhető tárolómotorokat jeleníti meg.rendelesid AND rendelesi_tetelek. A meghatározott táblázatot létrehozó CREATE TABLE utasítást jeleníti meg. Ha komplex lekérdezést írunk. konyvek = WHERE vasarlok. és egyértel­ lő SELECT utasítás elé.Haladó MySQL-adminisztráció 201 \Táltozat SHOW TABLE STATUS [LIKE_vagy_WHERE] [FROM adatbazis] Leírás Az aktuálisan használt vagy az adathazis nevű adatbázis összes táb­ lájáról közöl információkar.) SHOW INNODB STATUS SHOW WARNINGS sorok_szama] SHOW ERRORS sz ama] [LIMIT [eltolás.cim = rendelesi_tetelek. a lekérdezés tényleges futtatása előtt ellenőrizhetjük. Próbáljuk meg például a következő lekérdezést lefuttatni a Book-O-Rama adatbázison: EXPLAIN SELECT vasarlok. 12 lnformációszerzés oszlopokról a DESCRIBE utasítással A SHOW COLUMNS utasítás alternatívájaként rendelkezésünkre áll a DES CRIBE utasítás is. melyik az alapértelmezett.az oszlop meghatározása esetén-egy adott oszlopról ad információt.) . (Az adarbázist dzsókerkarakter hasz­ nálatával is meghatározhatjuk. hogy valami nem stimmel. mint egyszerűen az EXPLAIN szót beírni a megfele­ Az EXPLAIN utasítás akkor nyer igazán értelmet. megrendelesek. Egyik formája: EXPLAIN tabla. SHOW GRANTS FOR jelhasznala A jelhasznala nevű felhasználó jelenlegi jogosuJtsági szinrjének ki­ osztásához szükséges G RANT utasításokat jeleníti meg.nev FROM vasarlok. pontosan miként értékel ki a MySQL egy adott SELECT lekérdezést. A kiszolgáló által támogatott különböző jogosultságokat jeleníti meg. Ha pontosvessző helyett \G-vel zárjuk a lekérdezést. akkor kapjuk ezt a formátumot. hogy elférjenek könyvünk oldalain. rendelesi_tetelek.vasarloid = AND megrendelesek.isbn AND konyvek.] sorok [LIMIT [eltolas. Az oszlopnévben tetszés szerint használhatunk dzsókerkaraktereket. amely igen hasonló az Oracle (egy másik RDBMS) DESCRIBE utasításához. vagy amikor egy lekérdezés feldolgozása a kelleténél sokkal tovább tart. Ez a parancs ekkor a DESCRIBE tabla vagy a SHOW COLUMNS FROM tabla utasításhoz hasonló eredményt ad. Az utoljára végrehajtott utasítás által generált hibákat.vasarloid megrendelesek. fejezetben. az EXPLAIN parancs segitségével előzetesen. A lekérdezés az alábbi kimenetet adja. Ehhez nem kell mást tennünk. Alapvető szintaktikája a következő: DES CRIBE tabla [oszlop]. A meghatározott adatbázist létrehozó CREATE DATABASE utasí­ tást jeleníti meg.isbn like '%Java%'. műen látszik.

megrendelesek. 12.8 táblázatban láthatjuk. row *************************** *************************** id: select type: - l SIMPLE vasarlok ALL PRIMARY NULL NULL NULL 3 Using where.rendelesi tetelek. row *************************** id: select type: table: type: possible keys: key: key_len: ref: rows: Extra: l SIMPLE megrendelesek ALL PRIMARY NULL NULL NULL 4 2.isbn l Using where A kimenet elsőre kicsit zavarosnak tűnhet. lehetséges Select-típusok Típus SIMPLE PRIMARY Leírás Egyszerű SELECT.rendelesid l Using index 3.8 táblázat: Az EXPLAIN utasítás kimenetében szereplö. Az oszlop lehetséges értékeit a 12. Egymásba ágyazott lekérdezések és uniók használata esetén a külső (első) lekérdezés. Vizsgáljuk meg egyenként a táblázat oszlopait! Az első.202 12. amelyre a sor hivatkozik. Using 4. row *************************** *************************** id: select type: l SIMPLE rendelesi tetelek ref PRIMARY PRIMARY 12 table: type: possible keys: key: key_len: ref: rows: Extra: 4 konyvek. table: type: possible_keys: key: key len: - ref: rows: Extra: join buffer *************************** row *************************** id: select_type: table: type: possible keys: key: key_len: ref: rows: Extra: l SIMPLE konyvek eq_ref PRIMARY PRIMARY 13 konyvek. az id oszlop az azon lekérdezésen belüli SELECT utasítás azonosító számát adja meg.f�ezet *************************** l. de nagyon hasznos lehet. A select_type oszlop a használt lekérdezés tÍpusát mutatja meg. mint amilyen példánkban is szerepel. .

ahol egy egyedi sort kapunk vissza. Jelen példában azt láthatjuk. mert az összekapcsolás olyan. 12. egymásba ágyazott lekérdezés. amikor az összekapcsolás a táblán lévő index minden részét használja. A unique _subquery összekapcsoJási típushoz hasonló. és az index UNI QUE.9 táblázat: Az Típus const EXPLAIN 12 utasítás kimenetében szereplö. ahány sort az adott táblában az összekapcsolás vég­ rehajtásához be kell olvasnia a MySQL-nek. UNCACHEABLE UNION A table oszlop egyszerűen a lekérdezés megválaszolásához használt táblákat sorolja fel. de a MySQL NULL sorokat is keres. Az összekapcsolásban szereplö más táblák minden sorkészletéhez (set of row) egyetlen sort olvasunk be ebből a táblából. A táblázatból következtethetünk. mint a különböző táblákban . Ezeket a számokat összeszorozva megkapjuk a lekérdezés végrehajtásához meg­ vizsgált sorok teljes számát. Második vagy későbbi lekérdezés unióban. más esetben a const típust használja. Ezt a típust akkor használjuk. Az összekapcsolásban szereplö más táblák minden sorkészletéhez a tábla megfelelő sorkész­ letét olvassuk be. lehetséges összekapcsalási típusok Leírás vagy system A táblából egyetlen beolvasás történik. Olyan egymásba ágyazorr lekérdezés.Haladó MySQL-adminisztráció 203 Típus UNION DEPENDENT UNION Leírás Második vagy későbbi lekérdezés unióban. Az ott szereplő értékek a lekérdezés végrehajtásának sebessége szerint a leggyorsabbtól a leglas­ sabbig terjednek. hogyan lesz felhasználva a tábla a lekérdezés összekapcsolásaiban. amely az elsődleges lekérdezéstől függ (azaz korrelált lekérdezés). A celjes index beolvasott (scanned). Rendszertábla esetén a system.9 táblázat mutatja. index_merge unique_subquery index_subquery range index ALL Az előző példában láthatjuk. vagy az az elsődleges kulcs. a vasarlok és a konyvek tábla volt érintett. erre az összekapcsoJási típusra cseréljük a ref típust. az elsődleges lekérdezéstől függö. Második vagy későbbi lekérdezés unióban. de indexelt. Egyes IN egymásba ágyazott lekérdezésekben. Belső egymásba ágyazott lekérdezés. amelynek eredménye nem gyorsítótárazható. hogy az egyik táblát (konyvek) eq_ref típus használatával kapcsolták össze. Ez a típus jön szóba. eq_ref fulltext ref fulltext index használatával végrehajtott összekapcsolás.) Az Index Merge egy különleges optimalizálás használatát jelzi. A rows oszlop is ezt támasztja alá: (nagyjából) azt a számot aclja meg. ha a tábla pontosan egy sorból áll. így minden egyes sorhoz újra ki kell értékelni. amely egy adott tartományba esik. vagy nem az az elsődleges ref or null Olyan. amikor az összekapcsolás nem tud az össze­ kapcsoJási feltétel alapján egyetlen sort kiválasztani . a lekérdezésre nézve is meg­ állapíthattuk) A type oszlop azt mutatja. egy másikat (rendelesi_tetelek) a a ref típussal. Azért kell összeszorozni a számokat. (Ezt a típust elsősorban egymásba ágyazott lekérdezésekben használjuk. Ez akkor lehetséges. nem egyedi egymás­ ba ágyazott lekérdezésekre való. hogy a megrendelesek. kulcs. hogy hány sort kell az egyes táblákból a lekérdezés végrehajtásához beolvasni. Az oszlop álca! felvehető értékek készletét a 12. amely nem gyorsítótárazható egymásba ágya­ zott lekérdezéshez tartozik. a rendelesi _tetelek.vagyis amikor csak a kulcs egy részét használjuk az összekapcsolásban. Az eredmény minden egyes sora arról tájékoztat. (Ezt már korábban. hogyan használja a lekérdezés az adott táblát. UNION UNION RESULT SUBQUERY DEPENDENT SUBQUERY eredménye. A tábla minden sora beolvasott. Belső egymásba ágyazott lekérdezés. FROM DERIVED UNCACHEABLE SUBQUERY mellékágban használt. vagy a kulcs nem UNIQUE. két másikat (megrendelesek és vasarlok) pedig az ALL típussal-vagyis tábla minden egyes sorát megnézve. rnint a ref lekérdezés. Az összekapcsolásban szereplő más táblák minden sorkészletéhez a tábla azon sorkészletét olvassuk be.

A táblák beolvasása az összekapcsalási puffer használatával részekben történik. További részletekért lapozzunk vissza a Munka MySQL adatbázisunkkal című 10. Példánkban azt láthatjuk.MYI A következő utasítás futtatásával az adatbázis minden tábláját ellenőrizhetjük: myisamchk --analyze pathtomysqldatadirectory/*/*. hogy új indexet adunk a táblához. Erre a kérdésre rövide­ sen visszatérünk majd. megrendelesek. annál jobb. fejezethez l Ne feledjük. fejezet 12 lévő sorok szorzata. érdemes komolyan elgondolkodni ezen a javítási lehetőségen. amelyet soha az életben nem fogunk még egyszer használni.204 12. de ha az adatbázis mérete növekedni kezd. hogy csak a kulcs egy része lett-e felhasználva. ha felsoroljuk öket a parancssorban. Amennyiben olyan egyszeri lekérdezésről van szó. de eltérő szélességű oszlopok típusát. ha a MySQL manitoron belül az ANALYZE analyze table vasarlok. A lekérdezés a LEFT JOIN használatára lett optimalizálva.com/ doc/refman/5. Az alábbiakat begépelve hívhatjuk meg a segédalkalmazást: myisamchk --analyze pathtomysqldatabase/table Tóbb táblát is ellenőrizhetünk.htrnl). vagy ha már az adatbázis tervezésének elején tekintettel vagyunk erre. amelyeket a kulccsal együtt a tábla sorainak kiválasztásához használtunk. a lekérdezéshez ezek nem lettek felhasználva! A key_len oszlop a használt kulcs hosszát mutatja. ha van ilyen. és meggyőződhetünk arról. majd a soro­ kat a pufferből kinyerve megy végbe a lekérdezés. vagyis a sarok tényleges ellenőrzé­ se nem történik meg.) A táblákból származó minden információ az indexből jön. Nyilvánvalóan minél kisebbé tudjuk tenni ezt a számot. Ideiglenes tábla létrehozására van szükség a lekérdezés végrehajtásához.10 táblázatban az oszlop néhány lehetséges értéket láthatjuk. azaz elsődleges kulcsok. (Ez a művelet nyilvánvalóan kétszer any­ nyi ideig tart. Using index Using join buffer Using temporary Using where Az EXPLAIN utasítás kimenetében észrevett hibákat többféleképpen orvosolhatjuk.mysql. mert más dolgokat lelassíthat. A possible_keys oszlop. hogy bár a vasarlok és a megrendelesek táblához tartoznak lehetséges elsődleges kulcsok. A kulcs hosszúsága akkor válik fontossá. hogy vizsgálja meg a kulcseloszlásokat. Ha a lekérdezés lassú vagy gyakori. ha módosítjuk a párosítani kivánt. akkor az minden bizonnyal nem fogja megérni az erőfeszítést. és csupán becslés.MYI A másik lehetőség. hogy ez a megvizsgált.1/en/ using-explain. vagy az alábbi utasítást adjuk ki: myisamchk --analyze pathtomysqldatabase/*. A sarok kiválasztása WHERE mellékág használatával történik. És végűl: az Extra oszlop az összekapcsolás végrehajtásának módjáról közöl további információt. amikor egynél több oszlopból álló kulcsokkal dolgozunk. rendelesi_tetelek. és tegye hatékonyabbá az összekapcsolásokat. valamilyen bonyolult jelentésről-. A myisamchk segédalkalmazást vagy az ANALYZE TABLE utasítást használhatjuk erre. Példánkban a teljes kulcs lett felhasználva. Két illeszrésre van szükség az adatok rendezéséhez. Harmadsorban mérlegelhetjük annak lehetőségét. A több mint 15 lehetséges érték teljes listáját a MySQL kézikönyvben találjuk (http:/l dev.10 táblázat: Az EXPLAIN utasítás kimenetében szereplö Extra oszlop néhány lehetséges értéke Jelentés Érték Distinct Not exists Range checked for each record Using filesort Az első megfelelő sor megtalálása után a MySQL abbahagyja a keresést. hogy a lehetséges kulcsok mind PRIMARY. A ref oszlop azokat az oszlopokat mutatja. Ebből az értékből megállapíthatjuk. Másodsorban utasíthatjuk az összekapcsolás-optimalizálót.ahogy azt neve is sugallja.a MySQL által a tábla összekapcsolásához használt kulcsokat mutatja. A MySQL az összekapcsolásban szereplő más táblák minden sorkészletéhez megpróbálja megtalálni a legjobban használható indexet.például a főnökünk által kért. nem pedig a visszaadott sorok száma. Ezen a problémán úgy segíthetünk. a lekérdezés végrehajtása nélkül a MySQL nem tudja a pontos számot meghatározni. TAB LE utasításnál felsoroljuk a táblákat: konyvek. a lekérdezés végrehajtási ideje is nőni fog. Egyelőre elhanyagolható mennyiségű adat található adatbázisunkban. 12. A 12. Az indexek nem hasz­ nálhatók különbözö szélességű oszlopok párosítására. hogy megegyezőek-e. Ez különösen igaz az oszlopok szélességére. A key oszlop vagy a MySQL által ténylegesen használt táblából származó kulcsot vagy NULL értéket tartalmaz ( ameny­ nyiben nem volt kulcs). .a kettő egyenértékű. Először is ellenőrizhetjük az oszloptí­ pusokat. Figyeljük meg.

További tippek Sok más apró finomsággal javíthatjuk adatbázisunk teljesítményét. azzal javíthatjuk a le­ TAB LE kérdezés teljesítményét. hogy indexet adunk a kérdéses táblához. Ezt a célt . A myisamchk segédalkalmazással a következőképpen rendezhetjük egy tábla indexét. a következöképpen hozhatjuk létre az új indexet az ALTER ALTER TABLE tabla ADD INDEX (oszlop). Optimálisra tervezés Az alapelv az. . rninimalizáljuk a NULL éttékű oszlopok számát.mysql. Az OPTIMIZE TABLE tabla neve. amilyeneket lekérdezéseink nem használnak! Ahogy korábban már említettük. utasítással: Adatbázisunk optimalizálása Az előbbi lekérdezés-optimalizálási tippeken túlmenően súrnos olyan dolgot tehetünk. A MySQL weboldalon számos jó tanácsot találunk erre vonatkozóan (http:/ /www. és csak akkor szúrjunk be adatokat. hogy adatbázisunkban minden a lehető legkisebb legyen. annál gyorsabban fog lefutni a lekérdezés. kerüljük a változó hosszúságú oszlopok (így a VARCHAR.Haladó MySQL-adminisztráció 205 Ha az EXPLAIN utasítás kimenetének possible _ keys oszlopa néhány NULL értéket tartalmaz. az EXPLAIN utasítás futtatásá­ val állapíthatjuk meg.legalábbis részben .. Korábban már szó volt arról. és tegyük az elsődleges kulcsot a lehető legrövidebbél Ha lehet.MYI myisamchk --sort-index --sort-records=l Indexek használata Ahol szükséges. illetve adatait az adott index szerint: pathtomysqldatadirectory/*/*. A töredezettség megnöveli a táblában a keresési időt. és ne hozzunk létre olyanokat. illetve kezelhetünk egyedi igényeket. hogy végrehajtásuk előtt a jogosultsági rendszer ellenőrzi a lekérdezéseket. hogy mely indexek vannak használatban. Minél egyszerűbb ez a folyamat. ha azok az alapér­ telmezettől eltérőek! Ezzel csökkenthető az INSERT utasítás végrehajtásához szükséges idő. bár az igaz. amellyel általánosságban növeljük MySQL adatbázisunk teljesítményét. utasítással vagy a parancssorba a következőket begépelve: myisamchk -r tabla segíthetünk ezen a problémán.com). Táblaoptimalizálás Egy hosszabb ideje használatban lévő táblát a frissítések és törlések feldolgozása már töredezetté tehetett. megfelelő tervezéssei érhetjük el. használjunk alapértelmezett értékeket az oszlopokban. 12 Jogosultságok Az EXPLAIN utasítással foglalkozó részben említett tanácsok mellett a jogosultságok egyszerűsítésével is növelhetjük a lekér­ ciezések sebességét. Ahol lehetséges. hogy valarnivel több helyet foglalnak el. Őrizzük meg indexeink egyszerűségét. ha a lehető legkisebb adattípust használjuk az oszlopok­ hoz. indexek használatával gyorsíthatjuk lekérdezéseinket. Ha a WHERE mellékágban használt oszlop indexelésre megfe­ lelő. TEXT és BLOB típusúak) használatár! A rögzített hosszú­ ságú mezőkkel rendelkező táblákkal gyorsabban dolgozhatunk. Alapértelmezett értékek használata Ahol lehetséges. Szintén ezt szolgálja.a redundanciát mini­ málissá tevő.

hogy több adatbázis szolgáltassa ugyanazokat az adatokat. A parancsot az operációs rendszer parancs­ sorából adjuk ki.sql nevü fájlba pakol. ismét csak több lehetséges megközelítés közül válaszrharunk.. majd a --log-bin [=logfile] beállírással újból el kell indítani azt. amelynél a fájlt dumpolruk.sql Ez az adarbázis újbóli előállírásához szükséges minden SQL kódot az a ll. Ezzel megosztható a terhelés és fokozható a rendszer megbízhatósága. parancs futtatásával megbizonyosodhatunk arról. a Biztonsági mentés készítéséhez csak olvasási zárolásta van szükség.com címen elérhető MySQL web­ oldalon olvasharunk bővebben. másoljuk vissza az adatfájlokat egy új MySQL-relepítésben ugyanarra a helyre! Ha a második megközelítést alkalmaztuk a biztonsági mentéshez. Először is le kell futtatnunk a dump fájlban a lekérdezéseket Ez a lépés előállítja az adatbázisnak azt az állapotát. A FLUSH TABLES .mysql. (A naplófájlokról természetesen bármilyen biztonsági mentés készítése esetén gondoskodnunk kell. hogy legyen egy master típusú szerver. Ezt követően egy pillanatra le kell állítanunk a mysqld folyamatot. Ha számos olyan lekérdezéssei dolgozunk. hogy a fizikai állományok máso­ lásának idejére zároljuk a táblákat. A naplófájlban tárolt frissítésekből kapjuk meg a mysql_dump parancs használata óta végbement változtatá­ sokat. A biztonsági mentés elkészítése közben a felhasznáJók és a kódok továbbra is futtathatnak csak olvasható lekérdezéseket. a master kiszolgálón az adott időpillanatban lévő minden adatot átmásolunk. amely az alábbi szintaktikát követi: LOCK TABLEStabla zarolas_tipusa [. majd a slave kiszolgálók is alkalmazzák azokat saját adataikra. tabla zarolas_tipusa .] A tabla helyére a zároini kívánt tábla (illetve táblák) neve kerül. Összetettebb architektúrák is lehetségesek. mint a master. például amelyben több master kiszolgáló dolgozik.. MySQL adatbázisunk helyreállítása Ha helyre kell állítanunk MySQL adatbázisunkar. az olvasási lekérdezéseket pedig a slave kiszolgálókon futtaguk. ha az egyik kiszolgáló tönkremegy. Beállítás után biztonsági mentések készítésére is használható. Replikációmegvalósítása A replikáció nevü technológia lehetövé teszi. [0-9)* l mysql A MySQL biztonsági mentésének és helyreállításának folyamatáról a hrrp:/ /www. Az egyik lehetőség. a lekérdezések a többin futrathatók lesznek. Ezt alkalmazásunk logikája követeli meg. A dolog lényege. több lépés vár ránk. A master a bináris naplójából továbbítja a rajta lefuttatott összes lekérdezés részleteit. futassuk a myisamchk utasírást -r (repair. hogy a biztonsági mentés létrehozása előtt az indexek minden változását lemezre írtuk. . és jellemzően valahogy így néz ki: 12 mysql dump --opt --all-databases > all. azaz javítás) beállítássalJ Ha a biztonsági mentés létrehozásához az előző rész első módszerét választottuk. Másodsorban frissíte­ nünk kell az adatbázist a bináris naplóban eltárolt állapotra.és egyben ajánlott. Ez minden elosztott adatbázisra igaz. amelyhez több slave típusút adhatunk. A biztonsági mentés készítésének (és a feladatátvételnek J utolsó lehetséges módszere az adarbázis egy replikálr másolatának müködtetése. Minden slave kiszolgáló tükrözi a mastert. amelyek módosítják az adatbázist (ilyenek lehetnek például az ügyfelek megrende­ léseiJ. Amennyiben a problémát sérült tábla okozza. Ezt a LOCK TABLESparanccsal tehetjük meg.206 12. Amikor az elején beállíguk a slave kiszolgálókat. mi azonban csak ezzel a legtipikusabb felállással foglalkozunk. zarolas _ tipusa pedig READ vagy WRITE lehet. hogy az írási lekérdezéseket a master kiszolgálón. hogy a slave kiszolgálók általában nem rendelkeznek annyira naprakész adatokkal. fejezet Biztonságimentés készítése MySQL adatbázisunkról A biztonsági mentés készítésének többféle módszere lérezik MySQL-ben. A második. Ezt az alábbi parancs futtatásával érhegük el: mysqlbinlog hostname-bin. A replikációval a fejezet egy későbbi részében foglalkozunk majd. Belátható.) A harmadik lehetséges módszer a mysqlhotcopy kód használata.módszer a mysql_dump parancs használata. akkor nem célszerű ezt a megoldást választanunk. A slave kiszolgálókat ezt követően a master alapján frissíteni kell. A következőképpen hívhatjuk meg: mysqlhotcopy database /path/for/backup Ez után kövernünk kell az adarbázis elindításának és leállításának korábban bemutatott folyamatát. Jellemzően úgy használjuk ezt a felállást.

fejezetben megismert. Ha úgy dönrünk. Hozzunk létre egy felhasználót a master kiszolgálón! Bármilyen felhasználói nevet és jelszót adharunk neki. amivel a slave kiszolgálók csatlakozni rudnak. majd a LOAD DATA FROM MASTER utasítás futtatása. de csak a kiinduló beállításhoz. a slave kiszolgálók beállításához szükség lesz ezekre.Haladó MySQL-adminiszrráció 207 A masrer és slave archírektúra felépítésének első lépésekém leellenőrizzük. Ügyeljünk.mondjukserver-id=2. de jegyezzük fel! Példánkban a r ep_ slave nevet acljuk a felhasználónak: grant replication slave on to * . ha MyiSAM táblákat használunk. a másodiké server-id=3 srb. A kezdeti adatátvitel megvalósítása Tóbbféleképpen átvihetjük az adatokat a master kiszolgálóról a slave-re. ha az adott időpontban pillanatfelvételt készítünk az adatbázisróL A fejezet korábbi részében. ahol a pillanatfelvételt készítet­ FLUSH TABLES WITH READ LOCK. A kiinduló adattovábbítás tervezett módjától függőerr átmene­ rileg további jogosultságok megadására is szükség lehet. Az alábbi utasítás futtatásával tehetjük ezt meg: SHOW MASTER STATUS. A bináris naplózás bekapcsolásáról A PHP és a A my. Nyilvánvalóan valarnilyen más jelszór kell választanunk. ini/my.) a a biztonsági menrések létrehozásához használt eljárásoknál már megmutattuk. A slave kiszolgálókhoz egy különleges. Ennek a megközelítésnek az szépséghibája. SUPER és SELECT jogosulrságra is szüksége lesz. Ennek eredményeképpen a következőhöz hasonló kimenetet kell kapnunk: +----------------------+----------+--------------+------------------+ l File llaura-ltc-bin.) A 9. hogy a bináris naplózás be van-e kapcsolva a masreren. juk. hogy fel kell jegyeznünk a szerver bináris naplójában azt a helyet. Az előbbi esetén az alábbi beállirá­ sokra lesz szükségünk: [mysqld] log-bin server-id=l Az első beállirás a bináris naplózásr kapcsolja be (ezt már be kellett kapcsolnunk. majd olcljuk fel a táblák zárelását a következő utasítással: unlock tables. A master kiszolgáló beállítása A master kiszolgálón létre kell hoznunk egy felhasználót. hogy az adatátvitel idejére zárolja a master tábláit. ha nem tettük meg. Mosr készítsük el a pillanatfelvételt. a felhasználónak RELOAD. aminr a rendszer már feláll r és fut. hogy a LOAD DATA FROM MASTER paranccsal továbbítjuk az adarokar. hogyan tehetjük meg ezr. cnf fájljához. Az esetek többségében adatbázis-pillanatfelvételt fogunk használni az 12 adatok átadására. legkisebb jogosultság elve alapján vissza kell vonni ezeker a jogosultságokat. használatát nem ajánl­ Általában jobban járunk. cnf fájlunkat a masrer és a slave kiszolgálókorr is szerkeszteni kell. repiicaeion slave nevű jogosulrsági szinr tartozik.OOOOOl l l Position l Einlog Do_DB l Binlog_Ignore_DB l +----------------------+----------+--------------+------------------+ 95 +----------------------+----------+--------------+------------------+ Jegyezzük fel a File és a Positiorr mező értékér. hogy a számok egyediek legyenek! Az első slave azonosítója legyen. (Csak akkor érdemes ezt a módszert választani. (Erről az urasírásról a következő részben olvasharunk bővebben. A második beállirás egyedi azonosítót ad a master kiszolgálónak. . ezért hasonló sort kell hozzáadnunk minden slave my. tük. A legegyszerűbb a slave kiszolgálók beállitása (ezt a a következő részben mutatjuk be). és ekkor csak a különleges replication slave jogosultságra van szükség. ini MySQL telepítése című Függelékben olvashatunk. Minden slave kiszolgáló is azonosítót igényel. * 'rep_slave'@ '%' identified by 'j els z o' . kapcsoljuk be mosr!). és rnivel ez némi időr vehet igénybe. vagy my. Először is Ilusholjuk táblákat a következő utasítással: Az olvasási zárolás indoka.

számolnunk kell licencköltséggeL Megtehetjük azt is.com). hogy az irt bemutatort eljárást követjük. a masterról származó adatokat az előző lekérdezés futtatása után a követke­ ző utasítás végrehajtásával tölthetjük be: LOAD DATA FROM MASTER.innodb. További olvasnivaló A MySQL-ről szóló eddigi fejezetekben a rendszer azon részeire és használatára fordítortuk figyelmünket. hogy a slave kiszolgálóra telepítjük! Ezt követően futtassuk a slave kiszolgálón a következő lekérdezéseket: change master to master-host='szerver'. kezd­ jük azzal. master-user='felhasznalo'. látogassunk el a hrrp:/ / www. A felhasznala és a j elszo a master kiszolgálón futtatott GRANT utasításból adódik. hogyan használjuk a különböző tárolómotorokat. a tranzakci­ ókat és a tárolt eljárásokat. a legegyszerűbb az InnoDB Hot Backup eszköz használata. és a replikálni kívánt adatbázis teljes könyvrárát lemásoljuk.208 12. amelyek a webes fejlesztés. amely az Innobase Oy oldalán érhető el (http:/ / www. A naplofaj l és a logpos pedig a master kiszolgálón futtatort SHOW MASTER STATUS utasítás kimenetéből következik.com címen elérhető MySQL weboldalral Érdemes lehet elolvasni a MySQL Press kiadó Paul Dubois MySQL Administrator's Guide and Language Rejerence című kiadványár vagy MySQL (Addison-Wesley kiadó. majd újraindítjuk a kíszolgálót. start slave. . Amennyiben nem készíterrünk pillanatfelvételt. Ha készítetrünk adatbázisunkról pillanarfelvételt. 12 master-log-file='naplofajl'. Hogyan tovább� A Haladó MySQL-programozás című. A dőlt berűvel szedert adatokat magunknak kell megadni. következő leckében a MySQL néhány olyan haladóbb funkcióját ismerjük meg. negyedik kiadás) című művét.mysql. és a táblák zárolásának feloldása előre kikapcsoljuk a MySQL szer­ vert. A szerver a master kiszolgáló neve. master-log-pos=logpos. A slave kiszolgáló vagy kiszolgálók beállítása Két lehetőség közül választharunk a slave kiszolgáló(k) beállításakor. illetve a MySQL és a PHP összekapcsolása szempongából a leginkább fontossággal bírnak. amelyek webes alkalmazások írásakor hasznosak. master-password='jelszo'. fejezet Amennyiben InnoDB táblákkal dolgozunk. A slave kiszolgáló most már fut és müködik. és feloldjuk a táblák zárolását. Ha szecernénk többet megtudni a MySQL-adminisztrációról. Megrudjuk például azt. Mivel nem ingyenes szoftverről van szó.

Támogatják az INSERT és a SELECT lekérde­ zéseket. különben a táblák a teljes memó­ riát k:isajátíthatják.a sorokat pedig újsor karakterrel (\n) kell tagolni. BLOB.. Nem tranzakcióbiztosak.hogy válasz­ rási lehetőségünk van a táblák mögöttes megvalósírását illetően. A CREATE TABLE utasításban meg kell határoznunk a MAX_ROWS beállítás (a sorok maximális száma) értékér.ami az Indexed Sequentia l Access Method (index-szekvenciális adatelérési módszer) röviditése.de a rendszer összeomlása esetén adataink elvesznek. A fájl adatmezöit alapértelmezésben rabulárorokka! kell egymástól elválasztani. Ez a sor a konyvek táblába olvassa az uj_konyvek. Az utasítás nagyon gyorsan lefut.programozás A következökben A haladó MySQL-témákról.. az UPDATE és a REPLACE műveleteket viszont nem.ezt használtuk a könyv eddigi részében is. Indexeket nem használnak. A . txt" INTO TABLE konyvek.a többi közt a táblaripusokról.és nem támogatják az idegen kulcsokat. TEXT vagy AUTO INCREMENT oszlopot nem tartalmazhatnak. A táblaripust a tábla létrehozásakor választhatjuk ki az alábbi utasítással: tabla TYPE=tipus .Ezek a táblák lehetövé teszik. fejezetben bemuta­ tort FILE jogosultsággal kell bírnia. Ezzel kikerülhetök az egyes operációs rendszerek maximális fájiméreere vonatkozó korlátozásai.indexeit pedig hasheli. Adatbázisunk akár minden táblája használhat más és más rárolómotort. A különleges karaktereket perjellel (\) szükséges kiemelni. Tárolómotorok A MySQL többféle tárolómotort támogat (amiket esetenként táblatípusoknak is szokás nevezni). MERGE. MEMORY (korábbi nevén HEAP) -Az ilyen típusú táblákat a memóriában tárolja a MySQL.hogy lekérdezés céljából egyeden táblaként kezeljünk több MyiSAM táblát. számtalan opcióval rendelkezik. A MyiSAM számos további előnyt kinál az ISAM-típushoz képest.jellernzöen azonban a követ­ kezöképpen néz ki: LOAD DATA INFILE "uj konyvek.és egyszeres idézőjel közé kell helyezni öket. és támogatják a teljes szövegre keresést (full text searching).eddig nem tárgyalt funkciója a LOAD DATA INFILE utasítás.13 Haladó MySQL . Használatával fájlból töltherünk be a táblákba adatokat. A MyiSAM a többi tárolómotorhoz képest több eszközzel rendelkezik a táblák ellenőrzésére és javítására. CREATE TABLE leggyakrabban használt tárolómotorok a következők: MyiSAM -Az alapértelmezett típus. Ezen tulaj­ donságaiknak köszönhetöen a MEMORY táblák ideiglenes vagy származtatott adatok tárolására ideálisak. ARCHIVE..a DELETE. Mindezeket a LOAD utasítás különbözö opcióival mó­ dosíthatjuk. a részleteket a MySQL kézikönyvben találjuk. A MEMORY táblák ettől tudnak rendkívül gyorsak lenni. A MyiSAM táblák tömöríthetök. Ez azt jelenti.Az ilyen táblák nagy mennyiségü adatot tárolnak kis helyen. Ez a rekordok és fájlok tárolásának szabványos módja. Rugalmas.és egyszerűen váltharunk a mororok között.. txt fájlban calálható adatokat. A hagyományos !SAM-típuson alapul. fejezet során érintett főbb témakörök: A LOAD DATA INFILE utasítás Tárolómotorok Tranzakciók Külsö kulcsok Tárolt eljárások A LOAD DATA INFILE utasítás A MySQL egyik hasznos.. A LOAD DATA INFILE utasítás használatához a felhasználónak a Webes adatbázis létrehozása című 9. a tranzakciókról és a tárolt eljárásokról olvashatunk.

hogy nem szetetnénk ezt.A tranzakciónak atominak kell lennie. vagy egyik sem. majd áthelyezzük egy másikra. Izoláció (Isolation). A MyiSAM tábláknál ugyan lassabbak. vesszővel elválasztott értéket tartalmazó fájlban tárolja ezeket a táblákat.Tranzakcióbiztos táblatípus használata esetén több mint valószínű. InnoDB-Az ilyen táblák tranzakcióbiztosak. illetve ezek keverékét használjuk. Számos webes alkalmazáshoz-egyebek között a katalógusok­ hoz is-a MyiSAM a legjobb választás. visszagörgetett (rolled back) tranzakciónak nevezzük. amikor fontosak a tranzakciók (például pénzügyi adatokat tároló táblák esetén). Hogy lássuk. Ha az egyik számláról levesszük a pénzt. vagy egyáltalán nem fut le.210 13. A könyv ezen részében leginkább MyiSAM táblákkal dolgoztunk. hogy eltávolítjuk a pénzt az egyik számláról. és elmegy az áram. mielőtt egy másik számlára ráraknánk.Ez azt jelenti. Szánjunk most kis időt arra.A kiszolgáló egyetlen. Konzisztencia (Consistency). hogy figyelmünket a tranz­ akciók használatára. Könnyen belátható. például így: ALTER TABLE megrendelesek TYPE=innodb. Az adatbázisok így a tranzakció befejeztétől függetlenül meg­ őrizhetik konzisztens állapotukat. Az ACID betűszó a tranzakciókkal szemben elvárt négy követelményre utal: Atomiság (Atomicity).Előnyük akkor jelentke­ zik. amikor jelentős számú SELECT vagy INSERT lekérdezést futtarunk egy táblán (nem vegyesen a kérféle lekérdezést).A tranzakciónak meg kell őriznie az adatbázis konzisztens állapotát. A véglegesen az adatbázisba írt tranzakciót véglegesítettnek ( committed) moncljuk.f�ezet CSV. mi történik? A pénz egyszerűen csak eltünik? Bizonyára találkoztunk már az ACID-kompatibilis kifejezéssel. például Microsoft Excelben lévő adatokat kell megtekinreni. Az autocommit mód bekapcsolt állaporában a START TRANSACTION. ám a tranzakciók hasz­ nálatának lehetősége ellensúlyozza sebességbeli hátrányukat. hogy vagy teljesen lefusson. hogy e két lekérdezés közül vagy mindkettö lefusson. amelyben pénzt szetetnénk utalni az egyik számláról a másikra! Ez a művelet magában foglalja. . Akkor érdemes MyiSAM típussal dolgozni. hogy minden lefuttatott utasítás azonnal az adatbázisba íródik (véglegesített lesz). A MEMORY táblákat ideiglenes táblaként vagy nézetek megvalósítására használhatjuk. a következőt kell begépelni: SET AUTOCOMMIT=O. amikor igazán nagy MyiSAM táblákat kell kezelnünk. vagyis befejezésükig a tranzakcióknak elkülönítve kell maradni uk. vizsgáljuk meg egy banki adatbázis példáját! Képzeljük el azt a szituációt. ez azt jelenti.A következő részekből kiderül. mett ebben ez a leggyorsabb. illetve az InnoDB táblákon belüli megvalósírásuk módszereire fordítsuk! 13 Tranzakciók A tranzakciók az adatbázis konzisztenciáját biztosító mechanizmusok. amely vagy reljes mértékben lefut az adatbázison.Akkor is a MyiSAM a nyerő. ez azt jelenti. amikor teljes szövegre keresési lehetőségre van szükségünk. Az adatbázisba nem Írt tranzakció r. ha külsö táblázatkezelő alkalmazásban. vagy pedig egymás közé ékelődő INSERT és SELECT lekérdezések használatakor (például online üzenőfalak és fórumok esetén). más szóval tartósnak kell lenniük. urasírással kezdhetünk meg egy tranzakciót. Tranzakciók használata InnoDB táblákkal A MySQL alapértelmezésben autocommit módban fut. InnoDB típusú táblára akkor van szükség. vagy egyálta­ lán ne fusson le. Rend­ kívül fontos. hogy ehhez legalább két lekérdezésre van szükség. amelyek különösen hiba vagy szerverösszeomlás esetén fontosak. ALTER TABLE rendelesi_tetelek TYPE=innodb. pontosan mik azok a tranzakciók. vagyis amikor az adarbázis visszaáll a tranzakció megkezdése elötti állapotába. A tranzakciókkal kapcsolatos definíciók megismerése Először is határozzuk meg a tranzakció fogalmát l A tranzakció olyan lekérdezés vagy lekérdezések olyan sorozata. A tábla létrehozása után az ALTER TABLE utasítással módosíthatjuk típusát. a MERGE táblákat pedig akkor. és hogyan valósíthatjuk meg öket InnoDB táblákkal. vagy dolgozni kell velük.A befejezetlen tranzakciók az adatbázis más felhasználói számára láthatatlanok kell. hogy esetükben használhatjuk a COMM IT és a ROLLBACK parancsot. Tartósság (Durability)-Az adatbázisba írásuk után a tranzakcióknak véglegesnek. miért olyan fonros ez a lehetőség. hogy legye· nek. Ha az aktuális munkamenetben ki szeretnénk kapcsoini az autocommit módot. A webes alkalmazások többségében jellemzöen MyiSAM vagy InnoDB táblákat.Az InnoDB táblák a külsö kulcsokat is támogatják.

'0-672-31697-8'. mennyiseg TINYINT UNSIGNED.00 sec) Ennek oka. Ezek az utasítások InnoDB táblákká alakítják a két táblát. Ez szükséges a külső kulcsok müködéséhez. amikor sort szúrunk bele a rendelesi_tetelek táblába! Ehhez érvényes rendelesid-ra a van szükség. Az InnoDB táblákban a külsö kulcsok használata lehetövé teszi.98. arnint beírunk egy SQL utasítást. 69. hogy a külsö kulcsok fogalmával a Webes adatbázis megtervezése címü 8. és futassuk le ugyanezt a SELECT lekérdezést! Ekkor nem fogjuk látni a megrendelést: Empty set (0. hogy a tranzakciót még nem véglegesítetrük. mert a tranzakció automatikusan megkezdődik. Ha befejeztük a tranzakciót alkotó utasítások bevitelét.) Nyissunk két kapcsolatot a konyvek adatbázishoz l Adjunk egy új rendelési rekordot az adatbázishoz: INSERT INTO megrendelesek VALUES (5. utasítással térhetünk vissza az adatbázis előző állapotához. isbn) A re ferences megrendelesek (rendelesid) szavakat írtuk a rendelesid mögé. hogy az adatbázis Hogyan állírhatjuk ezt be� Ha a táblát már erederileg külsö kulcs használatával kívánjuk létrehozni. (Kiváló példája ezt a tranzakció-izolálásnak. két ALTER TABLE utasítást most: ALTER TABLE ALTER TABLE megrendelesek TYPE=innodb.) Ha mégis látjuk. Ez azt jelenti. rendelesi_tetelek TYPE=innodb.98 l 2008-06-18 l +------------+-----------+--------+------------+ Hagyjuk nyitva ezt a kapcsolatot. (A későbbiekben ugyanezzel az utasítással visszaalakíthatjuk öket. Ellenőrizzük. MyiSAM táblák használata esetén valahol máshol. Emlékezhetünk rá. fejezetben találkoztunk. Nézzünk egy példát! Amennyiben még nem tettük volna meg. hogy látjuk-e az új rendeléseket: SELECT * FROM megrendelesek WHERE rendelesid=5. 2. Amig nem véglegesítjük a tranzakciót. isbn CHAR(l3) NOT NULL. Gondoljuk végig például azt az esetet. l). menjünk a másikra. '2008-06-18'). illetve azt. INSERT INTO rendelesi_tetelek VALUES (5. ám akkor a type=MyiSAM paramétert kell használni. . hogy az oszlop külső kulcs. MyiSAM táblák használata esetén nincs lehetőség külsö kulcsok használatára. hajtsuk végre a konyvek adatbázison a fejezet előző részé­ ben említett. pen kell megváltoztaeni a tábla DDL utasítását: CREATE TABLE rendelesi_tetelek ( rendelesid INT UNSIGNED NOT NULL REFERENCES megrendelesek(rendelesid). majd véglegesítsük a tranzakciót: COMMIT. A következöképpen jelenik meg a rendelés: +------------+-----------+--------+------------+ l rendelesid l vasarloid l osszeg l datum 13 +------------+-----------+--------+------------+ 5 l 2 l 69. Ha valamilyen okból meggondoljuk magunkat. a ROLLBACK. PRIMARY KEY (rendelesid. egyszerűen a következőt begépelve véglegesíthetjük azt az adatbázisban: COMMIT. amelynek a megrendelesek tábla rendelesid oszlopából származó értéket kell tartalmaznia. a többi felhasználó számára vagy más munkamenetekben lámatatlan lesz. akkor a következökép­ végezze el helyetrünk ezt az ellenőrzést.Haladó MySQL-programozás 211 Kikapcsolt állapot esetén nincs szükség erre a parancsra. hogy InnoDB formátumúvá alakítottuk-e a szóban forgó táblát! Térjünk vissza az első kapcsolathoz. akkor minden bizonnyal elfelejtettük kikapcsalni az automatikus véglegesítést (autocommit). Most már a másik kapcsolatban is vissza kell kapnunk a megfelelő sort. az alkalmazás logikájával kell szavatolnunk beszúrt rendelesid érvényességét. Ellenőrizzük ezt. Külső kulcsok Az InnoDB a külsö kulcsokat is támogatja. ) TYPE=InnoDB.

A pararnéterek deklarálhatókIN-ként is.1 példakód tárolt eljárás deklarálását mutatja.212 13. Erre azért van szükség. hacsak korábban meg nem változtattuk . vesszővel elválaszrott listával adhatjuk meg öket. Először vizsgáljunk meg egy egyszerű példát! 13 Alappélda A 13.ami általában pontosvessző. Ennek az eljárásnak megrendeles_osszesi to a neve. müködik-e a módosítás. Amennyiben egynél több paramétert szereménk használni. mint programozás esetén az objektumorientált megközelítésre. A FLOAT szó a paraméter típusára utal. Az elfogadható adattípusok körét a lehetséges oszloptípusok határozzák meg. a total. illetve INOUT-ként. Az alábbihoz hasonló hibaüzenetet kell kapnunk: ERROR 1452 (23000): Cannot add or update a fails a foreign key constraint Tárolt eljárások A tárolt eljárás MySQL-en belül létrehozott és tárolt programozási függvény. Jelen esetben a megrendelesek táblában lévő összes rendelés összegét adjuk vissza. ami azt jelenti. ami· kor az értéket átadjuk az eljárásba. sql# Példa egyszerű tárolt eljárásra delimiter Tárolt eljárás deklarálása ll CREATE BEGIN PROCEDORE megrendeles_osszesito (OUT total FLOAT) SELECT SUM(osszeg) INTO total FROM megrendelesek. ALTER TABLE rendelesi tetelek ADD FOREIGN KEY (rendelesid) REFERENCES megrendelesek(rendelesid). '0-672-31697-8'. ahogy azt PHP-ben is tennénk. például így: ALTER TABLE rendelesi_tetelek TYPE=InnoDB. próbáljunk meg olyan rendelesid-jú sort beszúrni. mint a kiszámítani kívánt érték. A következő sor. ami módosíthatja azt. 13. hogy az adott értéket átadjuk az eljárásba.dupla előre perjellé módosítja. így a visszaadott érték is FLOAT lesz. ami nem más. amelyhez a megrendelesek táblában nem tartozik megfelelő sor: INSERT INTO rendelesi_tetelek VALUES (77. Lehetövé teszik. . hogy a tárolt eljáráson belül anélkül használhassuk a pontosvesszöt. A megrendelesek oszlop típusa FLOAT. Az OUT szó jelzi.1 példakód: egyszeru_tarolt_elj aras. illetve funkcionalitás beágyazására is kiválóan alkalmas. Egyeden paramétere van. Adatbázisok esetén a tárolt eljárásokra tekinthetünk úgy. Hogy kiderítsük. child row: 7). hogy ezt a paramétert vissza fogjuk kapni. END ll delimiter Nézzük meg a kódot sorról sorra! Az első utasítás. hogy kontrollátjuk az adatelérés módját. a CREATE PROCEDORE megrendeles_osszesito (OUT total FLOAT) hozza létre magát az eljárást. amikor más alkalmazásokból vagy platformokról kívánjuk elvégezni ugyan­ azt a funkciót. hogy a MySQL megpróbálja soronként végrehajtani a kódot. Akkor tud hasznos lenni. fejezet ALTER TABLE utasításokkal meglévő táblán is végrehajthatjuk ezeket a módosításokat. amely SQL utasításokból és néhány különleges vezérlési szerkezetböl áll. a delimiter ll az utasítás végét jelző elválasztó aktuális értékét .

2 példakód: egyszeru_ fuggveny. A függvényhívás némiképpen eltér az eljárások meghívásátóL Tárolt függvényt ugyanúgy hívunk meg. hogy a példa nem használja aBEGIN és az END utasítást! Beírhatjuk öket. Ez az utasítás a megrendeles_osszesito tárolt eljárást hívja meg.a MySQL-hez hasonlóan. vagy SHOW CREATE FUNCTION megrendeles_osszesito. A PHP kapcsos zárójeleinek rásblokk elejét és végét jelzik. amely bármilyen érvényes MySQL típus lehet. amely a lekérdezés eredményét a total paraméterbe tölti be. Figyeljük meg. nem szükséges jelölni az elejét és a végét. A függvény csak bemeneti (input) paramé­ tereket fogad. ha egy utasításblokk egyetlen utasítást tartalmaz. Az eredmény ehhez hasonló lesz: +-----------------+ l @t +-----------------+ l 289. Deklarálása után a CALL kulcsszóval hívhaljuk az eljárást.Haladó MySQL-programozás 213 A:z. ({ } ) felelnek meg.1. Az alapvető szintaktikájuk is majdnem teljesen megegyezik. Az eljárás deklarálása után az alábbi sorral állítjuk vissza az elválasztót pontosvesszőre: delimiter . Ennek megtekintéséhez ezt a változót kell megnéznünk: SELECT @t. Ez határozza meg a visszaadandó érték típusát.itt is a RETURN utasítással adunk vissza.2 példakódban egy mintafüggvényt láthatunk. Ez az utasítás az alábbi kimenetet eredményezi: +---------------------+ l ado_hozzaadasa(100} +---------------------+ llO l +---------------------+ Deklarálásuk után az eljárások és függvények kódját a következöképpen tekinthetjük meg: SHOW CREATE PROCEDURE megrendeles_osszesito. mert mind csak IN. A:z. A 13. A paraméterlista után a RETURNS FLOAT mellékág látható. ll delimiter Látható. Akárcsak PHP­ ben. 13. azaz bemeneti paraméter lehet. A paramétereket nem kell IN vagy OUT kulcsszavakkal meghatározni. . Néhány további különbséger is meg kell említeni. de nem kötelező. ahogyan egy beépített függvényt tennénk. Például: SELECT ado_hozzaadasa(100}. hogy a fenti példa a PROCEDURE kulcsszó helyett a FUNCTION-t használja.92001152039 l +-----------------+ Az eljárások esetében használt módhoz hasonlóan függvényt is létrehozharunk. mert az utasí­ A törzsben egyszerűen egy SELECT utasítást futtatunk. eljárás törzsét aBEGIN és az END utasítás fogja közre. Értéket. és egyetlen értéket ad vissza. és átad neki egy változót az eredmény tárolására. egyetlen különbség a megszekott használatától az INTO total mellékág szerepeltetése. egész pontosan így: CALL megrendeles_osszesito(@t). sql - Tárolt függvény deklarálása 13 # Függvény létrehozásának alapszíntaktikája delírniter ll RETURNS FLOAT CREATE FUNCTION ado_hozzaadasa (ar FLOAT) RETURN ar*1.

amit a változó neve.3 példakódban. Módosíthaguk az ado_hozzaadasa függvényt például úgy. (Természetesen egy egyszerű lekérdezéssei is könnyedén kicleríther­ nénk ezt az értéket. Ezt láthatjuk a 13. RETURN ar*(l+ado). hogy helyi változót használva tárolja az adókulcsot.3 példakód: egyszeru_fuggveny_val tozokkal. DECLARE aktualis_osszeg FLOAT.4 példakód: vezerlesi_szerkezetek_ kurzorok. DECLARE l_osszeg FLOAT DEFAULT 0. amelyik kiszámolja. majd a típusa követ. illetve a DROP FUNCTION ado_hozzaadasa. Kurzorok és vezérlési szerkezetek Vizsgáljunk meg egy összetettebb példát! Ebben olyan tárolt eljárást fogunk írni. ám a példa kiválóan szemlélteti a kurzorok és a vezérlési szerkezetek használatár. end ll delimiter A fentiekből kiderül. kurzomak nevezett valamit. DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET kesz l.) A tárolt eljárás kódját a 13. . DECLARE kezelöket (amelyek a kivételekhez hasonlók) és egy fontos. változókat. 13.. Az opcio­ nális DEFAULT mellékággal kiinduló értéket adhatunk a változónak.4 példakódban találj uk. melyik rendelés értéke volt a legnagyobb. 13. Ezt követően a szokásos módon dolgozhatunk a változóval. A tárol eljárások esetén használhatunk vezérlési szerkezeteket. utasítással lehet. sql- Változókat tartalmazó tároltfüggvény deklarálása # Egyszerű függvény létrehozásának alapszíntaktikája delimiter ll CREATE FUNCTION ado_hozzaadasa (ar FLOAT) RETURNS FLOAT 13 BEGIN DECLARE ado FLOAT DEFAULT 0. Helyi változók begin . sql- Eredményhalmazfeldolgozása kurzorokkal és ciklusokkal # A legnagyobb értékű rendelés rendelesid-ját max-szal is kideríthetnénk. # ám az alábbi kóddal bemutathatjuk a tárolt eljárások elveit delimiter ll CREATE PROCEDURE legnagyobb_rendeles(OUT legnagyobb id INT) BEGIN DECLARE aktualis id INT. A következő részekben röviden áttekintjük ezeket. hogy a változót a DECLARE kulcsszóval deklaráljuk. DECLARE kesz INT DEFAULT 0.0..end blokkon belül a DECLARE kulcsszóval vezethetünk be helyi változókat. fejezet Törölni pedig a DROP PROCEDURE total_orders. DECLARE l id INT.za.214 13. és ennek a rendelesid-j át adja viss.10.

és lehetövé teszi. Ahhoz. A következő dolog. Léreznek még continue (folytatás) és exit (kilépés) kezelők. Az eredményhalmazt soronként dolgozzuk fel. Amikor elfogynak a megvizsgálandó sorok. ezek formája: WHILE feltetel DO . kurzorokat és DECLARE kezelőker használ. az. A következő sor OPEN cl. Példánkban a ciklus a következőképpen néz ki: REPEAT UNTIL kesz END REPEAT. Mivel a legnagyobb értéket úgy állapítjuk meg. rolja (például olyat. mert nagyon titokzatosan hangzik! Azt jelen­ NOT FOUND ri. REPEAT FETCH cl INTO aktualis id. Ugyanezt érjük el a FOR További lehetőség az SQLWARNING és az SQLEXCEPTION. hogy ez mit jelent. an1ikor nem talál több sort. csszeg FROM megrendelesek. az értékét l-re ( true ) állíguk. meghívjuk ezt a kezdőt. hogy mit fog tárolni. FETCH utasítást kell funamunk. A DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET kesz = l. amilyet a mysqli_query a mysqli_fe t ch_ rcw kurzor (cursor). Figyeljük meg. helyi változót deklarálunk. Az l_csszeg és az l_id változó a legnagyobb rendelési értéket és az ahhoz tartozó rendelésazonosítót tárolja. Az aktualis_id és az aktualis_ osszeg 13 változó tárolja az aktuális sor rendelesid és csszeg értékér. Az exit kezelők kilépnek a legközelebbiBEGIN. amikor elérjük az sqlstate '02000 '-t.. A következőként deklarált változó a kesz. hogy az eljárás akkor hívja meg a kezelőt. Bizonyára érdeklődésre tart számot. amelynek kezdeti értéke nulla (false ) . és ami­ kor elfogynak a feldolgozásra váró sorok. a meghatározásával is. IF NOT kesz THEN IF aktualis_csszeg SET l > l_csszeg THEN csszeg=aktualis csszeg. END ll delimiter Ez a kód vezérlési szerkezeteket (feltételes utasításokat és ciklusokat).így az itt látható is-elvégzik a meghatározorr művele­ tet. amiről beszélnünk kell. SET legnagycbb_id=l id. aktualis csszeg. END END IF. Ez a ciklus végér jelző változó. hogy egyenként megkapjuk az egyes adatsorokat. amelyik rénylegesen lefuttaga a lekérdezést. A continue kezelők. az eljáráson belül használandó. Ez pusztán annak meghatározása. majd folytatják az eljárás végrehajtását.. UNTIL kesz END CLOSE cl. () függvénnyel is tehetnénk). IF. hogy mikor lesz a kezelő meghívva. A lekérdezést ezzel még nem futtattuk le.END blokkból. Példánkban akkor. SET l id=aktualis id. Gondoljuk végig az alábbi kurzort: SELECT DECLARE cl CURSOR FOR rendelesid. A declare kezelő következő része határozza meg. Ezek a kivételekhez hasonló szerepet töltenek be tárolt eljárásokban. REPEAT. a változó kezdeti értékét nullára állíg uk. hogy soronként feldolgozzuk azt (ahogy például csszeg FROM megrendelesek. hogy a feltételt (until kesz) a ciklus végéig nem vizsgáljuk! A tárolt eljárások a while ciklusokat is támogagák. Nézzük ár sorról sorra! Az eljárás elején számos. OPEN cl. A tömbhöz hasonló kurzor lekérdezés eredményhalmazár tá­ () ad vissza). sort declare kezelőnek (deelare hand/er) nevezzük. hogy minden értéker összehasonlítunk az addig legnagyobba!. REPEAT ciklusban tesszük ezt. Ennek neve cl.Haladó MySQL-programozás 215 DECLARE cl CURSOR FOR SELECT rendelesid.

aminek a következő a formája: CASE ertek WHEN ertek THEN utasitas [WHEN ertek THEN utasitas . hogy helyes volt-e a számítás! .) Ha az itt bemutatott módon létrehozzuk az eljárást.. A lekérdezés által visszaadott két tulajdonságot a megadott két helyi változóban tárolja el. hogy a változók értékeit SET urasírással állíguk be! 13 A tárolt eljárások az IF. A CLOSE utasítás lezárja a kurzort. illetve az aktuális értéket összehasonlíthatjuk az eltárolt leg­ nagyobb értékkel: IF NOT kesz THEN IF aktualis asszeg > l asszeg THEN SET l osszeg=aktualls osszeg. Ideiglenes változóként nem használhatjuk ezt a paramétert. Két IF utasítással ellenőrizhegük. .. Az itt látharóhoz hasonló kimenetet kell kapnunk: +------+ l @l +------+ l 3 +------+ Ellenőrizzük magunknak.ELSE szerkezetet is támogagák. [ELSE utasitas] END CASE . Vegyük észre... például az Adához hasonló. utasítás segítségével léphetünk ki belőlük. Jegyez­ Ez a kód a kurzorlekérdezés egy sorát keresi vissza. LOOP ciklusokat is használhatunk. END IF. hanem leave. SET legnagyobb_id=l id.. (Az ilyen használat néhány más programozási nyelvhez. hogy a tárolt eljárásokban for ciklusokat nem használhatunk! Folytassuk példánkat! A következő kódsor egy adatsort fog meg: FETCH cl INTO aktualis_id. SELECT @l. Ez a követ­ kezőképpen néz ki: IF feltetel THEN [ELSEIF feltetel THEN] [ELSE] END IF Létezik még a CASE utasítás. Végül beállítjuk az OUT paramétert a kiszámított értékre.THEN. SET l id=aktualis id. ugyanúgy hívhag uk meg. fejezet END WHILE. ] Térjünk vissza példánkhoz! A ciklus befejeződése után egy kis rendrakás vár ránk: CLOSE cl. ahogy tettük az előző eljárással: CALL legnagyobb_rendeles(@l). zük meg. END IF.216 13. hogy visszakaptunk-e sort. amelyek az alábbi szerkezettel rendelkeznek: LOOP END LOOP Ezek a ciklusok nincsenek beépített feltételekkel ellátva. csak a végleges érték tárolására.THEN szerkezeten túlmenően az IF.. aktualis_osszeg.

Az E-kereskedelmi honlap üzemeltetése című 14. J. amelyek mögöct adarbázis áll.Haladó MySQL-programozás 217 További olvasnivaló A fejezeeben röviden megismerkedtünk a tárole eljárások működéséve!. Amennyiben a cranzakciók és az adarbázis-konzisztencia érdekel bennünket. Date által jegyzett An Introduction to Database Systems! LOAD DATA INFILE urasírásról vagy a különböző tárolómocorokról Hogyan tovább: Áttekintettük a PHP és a MySQL alapjait. keressünk egy olyan jó könyvec a relációs adac­ bázisokról. Ezt érdemes tanulmányozni akkor is. fejezetben az elektronikus kereske­ delem és a biztonság szemszögéböl vizsgáljuk meg. 13 . ha a szecernénk további információt kapni. A témáról bővebben is olvashacunk a MySQL kézi­ könyvben. minr például a C. hogyan hozzunk létre olyan weboldalakac.

.III E kereskedelem és biztonság .. 14 E-kereskedelmi honlap üzemeltetése 15 Az e-kereskedelem biztonsági kérdései 16 Webes alkalmazások biztonsága 17 Hitelesítés megvalósítása PHP-vel és MySQL-Iel 18 Biztonságos tranzakciók végrehajtása PHP-vel és MySQL-Iel 19 A fájlrendszer és a kiszolgáló elérése .

kellően részleres tervvel kell rendelkeznünk. Az üzleti weboldalak típusai Az üzleti weboldalak jellemzően az alábbi feladatok közill látnak el egyet vagy többet: Céges információ megjelenítése online katalógusként • Termékekre vagy szolgáltatásokra irányuló rendelések felvétele Szolgáltatások vagy digitális termékek értékesítése Többletérték hozzáadása termékekhez vagy szolgáltatásokhoz Költségcsökkentés • • Az egyes weboldalak különböző részei a fenti kategóriák közül többnek is megfelelnek. hogy online értékesíthető és szolgálratható termékkel rendelkezünk. hogy segitsen megfogalmazni céljainkat. hogyan lehet ezeket úgy alkalmazni. akár olcsó reklámozási lehetőségként kezelik. hogyan tarthatja el önmagát egy ilyen weboldal. Az ilyen honlap célja és létének pénzügyi oka. a lehetséges kockázatokat. illetve megnézzük. illetve az ezekhez a célokhoz elvezető. Az is lehet. vagy a jelenlegi lehetőségek egy olcsóbb alrernatíváját jelenti. hogy a potenciális ügyfelek kapcsolatba léphessenek a céggel. Mind a mai napig ez az üzleti weboldalak leggyakoribb formája. A brochureware. határozort célokkal. hogy üzleti weboldalt kívánunk készíteni. Elképzelhető. hogy weboldalunk megvalósításának részletein töprengünk. hogy abból bevétele vagy más előnye származzék szerve­ zetünknek! A könyv ezen részének célja. Közvetlen ül nem termelnek bevételt. hogy honlapunk célja nem közveclenül a bevételteremtés. Akár első internetes próbálkozásként. sok cég számára van létjogosultsága egy ilyen típusú oldal üzemeltetésének. vagy kézzelfogható termékeket szetetnénk online értékesíteni. Nézzük meg ezeknek a kategóriák­ nak a részleres leírását. illetve azt. Megvizsgáljuk a tervet. létrehozni és működtetni egy e-keres­ kedelmi honlapot. azaz a nyomtatort katalógus vagy tájékoztató füzet elektronikus változatának tekinthető honlapok a web­ oldal formájára alakítort névjegykártyáról az átfogó marketinginformációkat kínáló oldalakig terjednek.14 E�kereskedelmi honlap üzemeltetése A fejezetben azzal a kérdéskörrel foglalkozunk. Miért van szükségünk weboldalra? A weboldalunkra tervezert funkciók mivel járulnak hozzá vállalkozásunk sikeréhez? Céges információ megjelenítése online katalógusként A 1990-es évek elején szinte minden üzleti weboldal pusztán online katalógus vagy értékesítési eszköz szerepét töltötte be. hogyan lehet hatékonyan megtervezni. Könyvünkben azzal a feltevéssel élünk. Sokféleképpen közeüthetünk üzleti céllal az internethez. hanem offline tevékenységeket támogat. . Lehet. Az alábbi főbb témakörökről olvasharunk: Az e-kereskedelmi oldalunk célja Az üzleti weboldalak típusai Kockázatok és veszélyforrások megismerése A megfelelő stratégia kiválasztása Mi a célunk: Mielőrt túl sok időt fordítanánk arra. Egyik célunk így minden bizonnyal a pénzkeresés. hogy offline szolgáltatásainkat szeretnénk reklámoz­ ni. de hozzájárulhatnak a cég által hagyományos úton szerzert bevételekhez.

Sok weboldal semmilyen hasznos információt nem közöl. milyen földrajzi területet szolgál ki. hogy már milyen információkkal rendelkeznek. hu címre küldött e-mailt minden bizonnyal megkapja az utódja is. Az embereknek a válaszidő tekintetében eltérő elvárásai vannak az e-maiilel és a postai levéllel szemben.szól a régi mondás. amikor elhatározzuk azt.Az ilyen oldalak esetében leginkább az alábbi hibákat szokták elkövetni: Elmulasztják közzétenni a fontos információkat Gyenge minőségű megjelenítéssel állnak elő Nem válaszolnak a honlap által generált megkeresésekre Hagyják a honlapot megöregedni Elmulasztják nyomon követni az oldal látogatotcságát Fontos információ közzétételének elmulasztása Mit keresnek a látogatók.A marketing más területeiről ismert problémákkal kell itt is megküzdeni.1 Ugyanúgy.Kis. ahogy a kisvállalatok (vagy a kucyák) na­ gyobbnak és meggyőzőbbnek tűnhetnek az interneten. hogy a felhasználó ezt kifejezetten kérnél Bár azt nem fogjuk tudni elérni. így biztosan időben válasz születik rá. mert ezzel csökkenthető a kéreden leve­ lek száma. vagy éppen a lényegi dolgokról feledkezik meg. amatőrnek és érdektelennek. Gyenge minöségű megjelenítés 14 Az interneten senki nem tudja. és gyorsan töltödjenek le! Üzleti célú oldalon alaposan meg kell fontolni a képi elemek és színek használatát . pozícióhoz vagy céges részleghez. hogy mivel foglalkozik a cég. ha egyáltalán nem használunk. hogy látogatóink döntő többsége hiba nélkül lássa az oldalt megjelenni! Fontos. de az is lehet. mint például az elérhe­ tőség. és nem válaszolunk rájuk. és hogyan lehet felven­ ni vele a kapcsolatot. hogy olyan egyszerű adatokra. mint az üzleti világ más területein. A weboldalakra kirakott e-mail címekre minden bizonnyal rengeteg kéreden levelet. . erederileg a l Egy internettel kapcsolatos. sőt jobb. lehet. a feladók azt fogják gondolni.régi mondás" természetesen nem lehet túl régi. Ha az e-maileket nem ellenőrizzük napi rendszerességgel. minden operációs rendszeren és böngészőben pontosan ugyanúgy jelenjen meg. hogy feltüntetnek honlapukon egy e-mail cí­ mer. Vajon mi történik a kovacs. ha János már nem dol­ gozik a cégnél� A sales@minta. spamet fogunk kapni. hogy szabványos HTML vagy XHTML kódot használjunk.és nagyvállalatok egyaránt eikövetik azt a hibát. Ez az idézet Peter Sreiner humoros rajzából származik. hogy részletes termékspecilikációkra van szükségük. A honlap által generált megkeresések válasz nélkül hagyása A kiváló ügyfélszolgálat az interneten is legalább olyan fontos szerepet játszik az ügyfélszerzésben és -megtartásban. hu címre küldött e-maillel. Erre is gondol­ junk.222 14.Soha ne játsszunk le hangot anélkül. július 5-ei számában jelent meg.Egy honlapnak legalább azt tudatni kell a látogatókkal. A weboldalakon közzétett e-mail címeknek általánosnak kell lenniük.ügyelve arra. hogy megkeresés ük nem fon­ tos számunkra. hogyan továbbítsuk vagy kezeljük az ezekre a címekre küldött leveleket! A közvetlen e-mail címek helyett érdemes lehet űrlap alapú kapcsolatfelvételi lehetőséget adni az oldalon. majd elmulasztják ellenőrizni és időben megválaszolni az erre a címre érkező leveleket.f�ezet Egy ilyen honlap kifejlesztése műszaki szempontból nem túl nagy kihívás.A szöveget olyasvalaki írja és ellenőrizze le. hogy kutya vagy. hogy az oldal minden gépen. hogy többféle képernyőfelbontásban és minden elterjedt böngésző­ operációs rendszer kombinációban teszteljük az oldal megjelenését. nem pedig egy adott személyhez kell kötődniük. Ráadásul egynél több munkatárshoz is irányítható. hogy illeszkedjenek a cég által képviselni kivánt imázshoz. aki magas szinten beszéli az adott nyelvet! A képek legyenek rendezettek és jól láthatók. amely The New Yorker 1993. hogy honlapunk magas színvonalú legyen. ügyeljünk rá. a nagyvállalatok is tűnhetnek kicsinek.Az animációval csínján bánjunk. amikor megnyitják egy cég honlapját� Attól függően. ha gyenge a honlapjuk Cégünk méretétől függetlenül ügyelni kell arra. j anos@minta.

majd hozzáértö módon megincerjúvolja öket. Ha megfizetjük szakértő piackutató cég szolgálatait. hogy az eredmény megfelelöen mucacja a nagyközönség véleményét. hogy megérce-e a pénzt és az energiát< Különösen egy nagyvállalac­ nak készített honlap esetén előbb vagy utóbb nekünk fogják szegezni a kérést.beporosodocc oldal" nem ösztönöz visszatérésre. Válaszaikat és véleményeiket feljegyezve ércékes adarokhoz juthatunk.marketingcélra -használhatatlan. ha saját kezűleg frissítjük az oldalakat. A két legis­ mertebb. A csoport létszámát 6-10 fő közöte érdemes tartani. hogy bármilyen módon elfogult vagy érintett legyen a kucatás eredményét illetően. A látogatottság nyomon követésének elmulasztása Honlapunk létrehozása szép és jó. A szervezeti változásokat ugyanígy tükröznie kell a honlapnak. Egy .analog. A hatást nyilvánvalóan nehezebb mérni. Webes vállalkozásunk méretétöl és anyagi lehetőségeitől függöen az ilyen felmérések a honlap tervezését és látogatottságának értékelését is megkönnyíthetik. hogy a vásárlókból azonnali döntést csikarjunk ki. ha összehasonlítjuk az oldal elindítása elötti és utáni értékesítési szinteket. naplófájlelemző segédalkalmazásra van szükségünk. minc például a PHP. hogy értsen az emberek nyelvén. Ha saját magunk folytatunk fókuszcsoporros beszélgetése­ ket. Hagyományos markeringkampányok esetében a nagy szeevezetek több tízezer dollárt költenek piackutatásra részben a kam­ pány kezdete előtt. Ha termékeinket alkalmazottaink barátai vagy családtagjai értékelik. A fókuszcsoportos beszélgetések ugyanakkor szinte ingyen is elérhetők. és azt a gyanút kelti a lácogacókban. A visszajelzések mennyiségér úgy növelhetjük. - 14 Termékekre vagy szolgáltatásokra irányuló rendelések felvétele A lenyűgöző online megjelenés létrehozása után a következő logikai lépés lehetövé tenni ügyfeleinknek az online rende­ lést. mekkora éteéket képvisel az oldal a vállalat számára. A tartalmat rendszeresen változtaeni kell. hogy számszerűsícsük.net) vagy a WebTrends Analyrics (http://www. és nyers állapoeukban pusztán mennyiségük miacc is nehezen értékelhetök.cx/ címen érhető el) és a Webalizet (http://www. Az így kapott eredmény pontosan annyira lesz releváns és hitelt érdemlő. amennyire a csoportban résztvevő személyek mintája. akiknek a célpiachoz való viszonyuk nem ismert. ha valahogyan ösztönözzük a látogatókat. Mindazonáltal számos egyszerűbb vagy olcsóbb lehetőség közül választhacunk: A szervernaplók vizsgálata A webes szerverek rengeteg adatot tárolnak a hozzájuk érkező kérésekrőL Ezek nagy része . A beszélge­ résen elhangzottakat ajánlott rögzíteni. Hogy értelmes összegzése nyerjünk ki a naplófájlokból. de honnan fogjuk tudni. A fókuszcsoporros kuratáshoz pusztán néhány önkéntest kell összegyűjtenünk. válasszunk egy ügyes moderátort! Kiválóarr kell. hogy mérni tudják a hatékonyságát. ingyenes program az Analog (a http://www. hogyan irányítja a beszélgetést. Az értékesítésre gyakorolt hatását úgy tudjuk megbecsülni. az hozzáértően végrehajtott és használható eredményeket hozó fókusz­ csoportos kutatást eredményez. mir gondolnak honlapunkróL Ha a visszajelzéshez űrlapot készítünk számukra. minden bizonnyal örömmel elmond­ ják. Eladások figyelemmel követése . amatör is moderálhatja azokat.Online katalógusunktól azt várjuk. hogy az információk jelentős része már elavult. A naplófájlelemző megmutatja. Az értékesítők pontosan tudják. amennyiben szakértö moderátor vezeti. például nyereményr sorso­ lunk ki a válaszadók közöct. nem aktuális. akkor nem valószínű. hasznos véleményeker gyűjthetünk be. hogy értékeljék honlapunkat. ám nem ez az egyetlen járható út. aki a potenciális résztvevöket értékelve és szűrve megpróbálja garantálni. hogy honlapunk ne veszícse el akcualicásác. Az aktuális információkhoz folyamarosan hozzáférő kód segítségével oldalaink naprakészek maradhatnak. majd arra kell kérni öket.E-kereskedelmi honlap üzemeltetése Az oldal elavuLisa 223 Gondoskodni kell arról. Az olyan üzleti célú és fizetős programok.com/) reljesebb információt adnak. net/webalizer/). Adatgyűjtés reprezentatív felhasználók körében A fókuszcsoportos beszélgetések hatékony módszert kínálnak hon­ lapunk vagy a tervezett honlap prototípusának értékelésére. és mely oldalakat nézik meg a látogatók. és nem szabad. ha ugyanabban az idöszakban más marketingtevékenység is okozhatja az inga­ dozásokat.mrunix.webtrends. Az egyik módszer arra.. mint a Summary (http://summary. időben hogyan változik honlapunk látogatottsága. hogy a moderátornak csak arra kelljen figyelnie. hogy honlapunk megőrizze frissességéc és naprakészségéc. Egy másik lehető­ ség dinamikus oldalak létrehozása olyan programozási nyelvvel. mekkora annak fontossága. Felhasználói visszajelzések gyűjtése-Amennyiben megkérjük felhasználóinkat. Minél . és olyan résztvevökkel is lefolyrarhatók. hogy demográfiai jellemzőikben és személyiségükben poncosan reprezentálják az alapsokaságot vagy a célközönséget. hogy eladásokat generáljon. A fókuszcsoportos kutatás drága mulatság lehet. részben a kampány után.

CD vagy szaftver általában tökéletesen megegyezik a többi példánnyal . hogy vásárlás előtt fizikailag is megvizsgálja. hogy próbálkozzanak . amelyek online értékesítése nagy valószínűséggel nem fog számunkra sikert hozni. persze. Nem minden avokádó egyforma. romlandó árucikkek. A könyv írása idején a célközönséget a munkabérrel rendelkező. hogy szemrevételezés nélkül megrendeljék. az internet ideális módszer lehet a vásárlók elérésére. hogy mennyi információt közölhetünk. hogy kezükbe vegyék a beszerezni kivánt darabot. tagolni és összekapcsolni. Egyes termékek soha nem fognak megjelenni az e-kereskedelemmel foglalkozó kutatásokban. hogy azonnal. Ha arra kényszerítjük őket. hogy mennyire tudjuk az információtengert úgy rendezni. mozi. és leszállítani sem túl egyszerű öket. akkor megakasztjuk a folyamatot. megszagolni) az adott darabot. Az interneten az emberek hajlamosak gyorsan átfutni a tartalmat. hogy ezen költségek nagy része pontosan ugyanannyi lesz ezer és egymillió rendelés eserén is. sikertelenül. hogy ugyanaz a címük. hogy felálljanak számí­ tógépükről. Minden vállalkozás megrendeléseket szereme kapni. Az e-kereskedelmi termékeknek emellett az internet-felhasználók érdeklődési körébe kell tartozniuk. Egyes termékkategóriák tökéletesen megfelelőek arra. jellemzően nem szakták alaposan végigolvasni. Vannak olyan termékek. fiaralabb felnőttek alkotják. Figyeljünk arra. hogy a vásárló kényszert érezzen arra. fejezer több időr hagyunk nekik. Ezek a piacok már úgyis telitve vannak jól (és kevésbé jól) ismert márkákkal. A honlapokra ez nem érvényes. hogy elfogadhatóvá tegye a szállítási kölrségeket. amit keres! Arra is ügyelnünk kell. hogy átgondolják a vásárlási dönrésüket. akkor engedni kell. Az olcsó. mégis sikeresen értékesíthe­ rök online. zene. annál valószínűbb. Az online rendelésfelvétel rengeteg cég számára előnyt jelenthet. Ha valaki avokádót szereme venni. honlapunk bezárása előtt meg­ tehessék azt. hogy a lehető leggyorsabbá és legegyszerűbbé tegyük a vásárlási folyamatot. a má­ sik pedig az. jól felépített legyen! Az első alkalommal ott járó látogató könnyen megralálja. bár ez nem riasztja el az embereket. a számí­ tógépes szoftverek és hardverek.például az autók és az ingatlanok -. Az elfogadható költségszimhez éppen ezért megfelelő mennyiségben értékesíthető termékre vagy szaigáitatásra van szükség. koncert stb. próbáljuk végig­ gondolni. amelyek rengeteg utánajárást igényelnek a vásárlás előtt.többnyire. Ha az ügyfelek szerernék megszerezni rermékünker. Az online rendelésfelvétel lehetősége növelheti értékesítéseinket vagy csökkentheti értékesítőink leterheltségét. például a zöldség és a gyümölcs nem tűnik túl jó választásnak. drága árucikkek tartoznak ide . Csak azért. utazás és belépőjegyek (színház. ha minden más városban is legalább ugyanennyien gyűjtik őket. Ha online hirdetésünk meggyőzte a fogyasztókat. Az online rende­ lésfelvételhez szükséges környezet természetesen költségekkel jár: dinamikus honlap kifejlesztése. Ha lakóhelyünkön csak tíz ember gyűjt 1980-as évekbeli járékrobotokat. elég drága ahhoz. Számtalan akadályt kell leküzdenünk a potenciális vásárlók meggyözéséhez.feltéve persze. egy ezeket forgalmazó honlap akár sikeres is lehet. ezért tö­ rekedjünk a tömörségrel A hirdetési felületek többségénél gyakorlati korlátai vannak. ugyanakkor ne terheljük le túlzottan a látogatókat. Ilyenek lehetnek: Megválaszolatlan kérdések Bizalomhiány Nem egyszerű használharóság Kompatibilitáshiány Ha a felhasználókat ezek bármelyike visszatartja. hogy a látogatók be tudják . minden bizonnyal otthagyja az oldalt. túl drágák ahhoz. akkor saját érdekünk. Az online értékesítés egyik legvonzóbb jellemvonása. nagy valószínűséggel vásárlás nélkül fognak távozni honlapunkróL Megválaszolatlan kérdések Ha egy potenciális vásárló nem kap azonnal választ valamely kérdésére. vagy egyszerűen meggondolják magukat. A legjobb e-kereskedelmi termékek az árucikkek. hogy vásároljanak. de online rendelésre nem lesznek alkalmasak. hogy brochureware honlapot készítsünk hozzájuk. Nagy. vagy keressék fel üzletünket. mert termé­ künk nem tartozik ezen kategóriák közé. Mindazonáltal érdemes lehet végiggondolni. A vásárlók nem igénylik. a fizetési módok megszer­ vezése és az ügyfélszolgálat mind pénzbe kerül. hogy teljes körű információt adjunk. hogy az online közönség egyre inkább megegyezik majd a teljes lakossággal. ruhák. minden bizonnyal sze­ reené kiválasztani (megfogni. hogy oldalunk jól rendezett. Ha termékünk csak egy szűk piaci réteg számára vonzó. Ennek a megál­ lapírásnak számos következménye van. nem kell elkeserednünk. Az ideális e-kereskedelmi termék nem romlandó és egyszerűen szálütható. Egy könyv. Mielőtr nagyon beleélnénk magunkar az elektronikus kereskedelem gondolatába. akik átlag feletti jövedelemmel bírnak. de annyira mégsem drága. és tárcsázzanak egy telefonszámot. hogy termékeink alkalmasak-e online értékesítésre! Interneten keresztül leginkább olyan termékeker és szolgálratásokat vásárolunk.).224 14. Idővel azonban számíthatunk rá. Itt a két fő korlát közül az egyik az információ létrehozásának és frissítésének a költsége. hogy más üzletekben is szérnéznek. és városban 14 élnek. miért pont ezek a legkelendőbb portékák az interneten. mint a könyvek és a magazinok.

hogy rninél többet kell a vásárlóknak a megrendeléshez az egérrel kattintani. illetve gondoskodnunk kell kiszolgálónk hozzáértö és biztonságos felügyeletérőL A későbbiekben részleresebben foglalkozunk ezzel a témával. Sok online kereskedés feltétel nélkül visszaveszi a rerméker. hogy a felréteieket pontosan megjelenírsük oldalunkon! Ránk bízhatják az ügyfelek a bankkártyaadataikat� Az interneren vásárlók legnagyobb bizalmi aggálya. Ne engedjük. hogy milyen arányban állhat egymással a pénzvisszatérítés költsége és a liberális visszatérí­ tési szabályzat által okozott forgalomnövekedési Bárhogyan döntünk is ebben a kérdésben. memóriával és látásmóddal rendelkeznek. hogy kérdezzeneki Próbáljunk meg nekik azonnali vagy szinte azonnali választ adni telefonon. művelrséggel. rendelkezünk irodával. és rénylegesen biztonságosan kell kezelni ügyfeleink bankkártyáir. hol járnak! Emeljük kí azt a menüpontot. amely pusztán egy honlapból és egy postafiókcímből áll.szem­ ben egy olyan vállalkozással. Pacem and Trademark Office (Amerikai Szabadalomügyi és Márkavédelmi Hivatal). hogy honlapunkra olyan. raktárral és relefonszámmal. hogy összezavarjuk a felhasználót. 5960411 számú szabadalom: Kommunikációs hálózacon keresztüli rendelésleadás módszere és rendszere. annál valószínűbb. rnint a rendelkezésre álló rapasztalatok azt súgják.E-kereskedelmi honlap üzemeltetése 225 fogadni. akkor kevésbé valószínű. és így mások is hozzáférhernekr Fontos közölni a látogatókkal.) A szabadalmar sok honlap üzemelterője élesen támadja. Ez rninimum azt jelenti. de ne feledjük. hogy az Amazon. hogy elküld­ 14 jék-e bankkártyájuk adatait az interneten keresztül. amennyiben saját költségén. Csökkenrsük a lépések számár a minimálisan szükségesre.) Gondoljuk végig. amely ügyel a biztonságra. hogy csak átverés az egész oldal. álljon itt mégis néhány iránymutatás: Őrizzük meg honlapunk egyszerűségéti Minél több lehetőséget. e-mailben. arra használjuk. ha a vevő bármilyen oknál fogva elégedetlen azzal. Ezt az információt adatvédelmi nyilatkozatnak (privacy policy) szokás nevez­ ni. Ösztönözni kell a látogatókat. hirdetést és a figyelem elterelésére alkalmas elemet helyezünk a képernyöre. ügyeljünk. és ne feledjük. hogy végigcsinálják a folyamatot. és navigációs iránypontokkal jelezzük számukra. így vásárlóink is eltérő számítógépes tapasztalattal. . vagy nem biztonságos módon tároljuk. hogy megbízható a vállalkozás. és honlapunk könnyen megralálható részére kell kirakni. annál kevésbé valószínű. bontatlanul vagy megbontott csomagolásban. de a megrendelés már teljesen más történet. miért bízna bennünkr Bárki össze tud állítani egy honlapot. hogy mit reszünk és mit nem teszünk az adataikkal. Nagy a kísértés. hogy egy csomó reklámot küldjünk nekik. Olvasható szövegfajtát válasszunk! Tiszta. com Amerikában szabadalommal2levédette az egy kattintással történő rendelés folyamatát! (Az Amazon 1-Clicknek hívja a módszert. és nem a fentebb említett kurya áll az oldal mögöttr Online vásárláskor számos kérdés foglalkoztatja az embereket: Mi fog történni a személyes adataikkal� Értékesítjük valakínek. Éppen ezért olyan vállalkozás látszatár kell kelrenünk. Megbízható vállalkozás vagyunk� Ha vállalkozásunkat regisztráltuk a megfelelő szerveknél. soha nem alvó. hogy a különbözö típusú számítógépeken eltérő méretben jelenhet meg! Tegyük a rendelési folyamatot a lehető legegyszerűbbél A józan ész csakúgy. így segitve a tájékozódá­ sukat! 2 U. ugyanakkor rendkívül fontos az ügyfélszolgálat. ha a vásárló nem elégedett a termékkel? Milyen feltételekkel számíthar pénzvisszatérítésre? Ki fizeti a szállírási díjarr Internetes kereskedelem esetén a törvény a hagyományos vásárlás eserén érvényesnél szélesebb körű elállási jogot ad a vásárlóknak. (Magyarországon a jelenlegi szabályozás szerint a vevő 8 napon belül élhet elállási jogával. de hiánytalanul visszaküldi a terméket az eladónak.S. akínek ráadásul még fizet­ ni sem kell. nyelvtudással. Honnan tudja a látogató. A használha­ rósággal és a kezelőfelület megtervezésével kapcsolaros elvekről egész könyveket írnak. chaten vagy más kényelmes módon! Bizalomhiány Ha a látogató számára ismeretlen a márkanevünk. hogy Secure Sockers Layer (SSL) protokollon keresztül kell az adatokar a felhasználó böngészőjéből webes kiszolgálónkra továbbí­ tani. egyszerű betűtípusokar használjunk! Ne állítsuk túl kicsire a szöveget. hogy a felhasználók elveszítsék a fonalat! Adjunk nekik iránymurarást. automatikus értékesítőként gondoljunk. amelyikben éppen tartózkodnak. Nem egysurű használhatóság Nincs kér egyforma ember. már több éve működünk. Egy brochureware oldal átolvasásához nem szükséges bizalom. Ebből kifolyólag az oldalunknak a lehető legegyszerűbben használharónak kell lennie. Ne felejtsük el ezeket az adatokar megadni saját magunkról! Mi történik.

annak értékesítési költsége l és 1000 darab esetén is ugyanaz lesz. hogy ha másolható és digitálisarr értékesíthető terméket vagy szolgáltatást kínálunk. és nagyobb terhelést jelentenek a számítógépes eröforrásoknak. Ne felejtsük el oldalunkat különbözö képernyöfelbontásokban megjeleníteni! Egyes Felhasználók a nagyon nagy felbontásokat kedvelik. akkor a Felhasználók nagy többsége számára megfelelöen jelenik meg olda­ lunk: Firefax (minden operációs rendszer alatt). Komoly üzleti okai vannak annak.com) . Az így értékesített szolgáltatások közé tartozik például az internet-hozzáférés vagy a webtárhely is. Ha valamely szolgáltatást vagy árut hálózaton keresztül is lehet továbbítani. megfelelő szintű értékesítés és forgalom esetén többet kell például hardverre és sávszélességre fordítani. de a régebbi funkciókat nagyobb valószínűséggel fogja megfelelő módon támogaeni az összes böngésző és eszköz. Ha digitálisarr teljesítjük a vásárlást. Egyes információkhoz előfizetés vagy tranzakciónkénti fizetés alapján lehet hozzáférni. hogy a képernyőn mindig látható legyen egy. hogy az oldalt több változatban írjuk meg és tartjuk fenn! A szabványokkal kompatibilis HTML vagy XHTML mindenhol működni fog. csak szöveget megjelenítő böngésző. milyen böngészöket használnak a látoga­ tóink. A képügynökségek által forgalmazott képek is digitalizálhatók és letölthetők. a szállítás legalább egy napig tart. versenyelőnyhöz juttathatjuk vállalkozásunkat. mások telefont vagy P DA-t használnak. A digitális termékek és szolgáltatások kiválóarr alkalmasak az e-kereskedelemre. Ha lehetőséget adunk az ügyfeleknek. emberi beavatkozás nélkül megrendelhetö. és elveszítjük a potenciális piac jelentős részét.com) vagy a Fedex (http://www. A digitális letöltések szinte teljesen ingyenesek. vagy megrekintsék banki egyenlegü· ket. online igénybe veheti a vásárló. A letöltéseket ezzel szemben másodpercben. A digitális árucikkek közé tartoznak egyebek között az e-könyvek és az elektronikus formátumban (például MP3-ban) lévő zene. akkor amatörnek fogunk tűnni. mint például a Lynx. Az azonnali teljesítésű rendszereknél ezért inkább fennáll a csalás veszélye. hogy manuálisan dolgozzuk fel a rendeléseket. de nyilvánvalóan korlátozott az így értéke­ síthető termékek és szolgáltatások köre. Szolgáltatások vagy digitális termékek értékesítése Rengeteg terméket és szolgáltatást értékesítenek az interneten és szállítják ki a vásárlónak futárszolgálattal. hogy miért érdemes a vá· . akkor azonnal. figyeljünk rá. A számítógépes szaftvereknek sem kell szükségszerűen CD-n vagy DVD-n lenniük. azonnal kell megtennünk azt. Többletérték hozzáadása termékekhez vagy szolgáltatásokhoz Az üzleti weboldalak egyes. az Internet Explorer (Windows) és aSafari (Macintosh) legfrissebb verziója. nem közvetlen profitszerzés céljával fejlesztették ki. a webszerver naplóbejegyzéseiből megállapíthatjuk.ups. a bevásárlókosárra mutató hivatkozás! Kompatibilitáshiány Ne felejtsük el oldalunkat különbözö böngészökben és operációs rendszerek alatt tesztelnil Ha valamely népszerű böngé­ szőben vagy operációs rendszer alatt nem működik rendesen.226 14. Ez azt jelenti. legfeljebb percben mérjük.fedex. hogy ugyanaz az oldal megfelelöen nézzen ki a 2048 képpont szélességű képernyőn és a 240 pixel szélesen is. A digitális termékek és szolgáltatások könnyen értékesíthetök impulzív vásárlásként. Ez azt jelenti. Egy kisebb részü­ ket azonnal. amelyben a fizetés előtt virtuálisan tárolhatják a kíválasztott áru­ cikkeket. Ha valalá fizikai formában létező áru· cikket rendel. Nem tehetjük meg. Az így értékesített legegyszerűbb szolgáltatás 14 az információ. kífizethetö és igénybe vehető. A szervezet által kínált. mint a futárcégek-például az UPS (http://www. Ökölszabályként elmondható. hogy ha oldalunkat az alábbi böngészökben. vagy napon belül szétterítjük a csúcs· idöszakí terhelést. A fi­ zikai formában létező termék kiszállitása pénzbe kerül. Az oldalunkon megrendelt termékek fizikai kiszállitása esetén bizonyos előnyökkel és hátrányokkal kell számolnunk. Az információ gyakran teljesen ingyenes vagy hirdetésekből finanszírozott. ha vállalj uk. igen sikeres részei egyáltalán nem árulnak terméket vagy szolgáltatásokat. meglévő szolgáltatásokhoz adnak többlet· értéket. közvetlenül is letölthetők. kivéve. Ha oldalunk már működik. Nehéz elérni. Természetesen ez csak bizonyos korlátok között igaz. A támogatást kínáló fórumok is ebbe a kategóriába tartoznak. hogy a kereskedők az azonnali teljesítés terhével kénytelenek szembesülni. kézi számítógép és egy olyan. Kerüljük a vadonatúj funkciók és eszközök használatár. operációs rendszerek alatt és eszközökön ellenőrizve semmilyen hibával nem találkozunk.nyomon követési szolgál· tatásai. Az olyan funkciókat. hogy nyomon kövessék küldeményük útját. fejezet Ha a vásárláshoz kosár funkciót kínálunk a látogatóknak.

Az Egghead.com esete. mint a nyomtatott példányok előállításával és kiküldéséveL Különösen igaz ez a rendszeresen változó információkra. például biztonságos szoftverek használata és folyamatos frissítése Az alkalmazottak felkészítése a támadások célpontjainak és a gyengeségek azonosítására . a nyereség pedig nő. 2001-ben csődvédelmet kért. Ha több telephellyel rendelkezünk. lopás. Költségcsökkentés Az internet használatának gyakori oka a költségek csökkentése. a szolgáltatások lecseréléséből. rosszindulatú számítógép-felhaszná­ lóktól érkezik. termékkatalógusokat. Ez akár azt jelenti.com új vállalkozása nem jött be. ahol megtárgyalhatják a cég termékeivel kapcsolatos hibaelhárírási tippeket. és az e-kereskedelemre összpontosÍija figyel­ méc. A más vásárlók által javasolt megoldásokkal orvosolhaták az ügyfelek problémái. Bátor példája ennek az Egghead. A támogatás ilyen formája igen alacsony költség mellett növelheti a fogyaszták elégedettségét. de az e-kereskedelmi vállalkozások folyamatosan vonzzák a különböző szándékú és képességű crackereket. Megtakarítás származhat az információ online megosztásából.az eredmény ugyanaz lesz. ha egyetlen központi telephellyel bír. leggyakrabban ernlegetett fenyegetés a cracker néven ismert. Az a rninimum. Minden cég ki van téve annak a veszélynek. Az internet a kommunikáció biztosításával pénzt takaríthat meg számunkra. alkalmazottakat foglalkoztatni. Ilyen kockázatot hordoznak a: Crackerek A kívánt üzleti eredmény elmaradása Számítógépes hardverhibák Elektromos. kommunikációs vagy hálózati hibák Erős verseny Szoftverhibák Változó szabályozási környezet és adójogszabályok Rendszer-kapacitásbeli korlátok 14 Crackerek Az e-kereskedelmet érintő. Az árak csökkennek. minden bizonnyal gazdaságosabb módon is megtehernénk ezt egy weboldalon kereszrüL Akár árliscákat. Az oldal biztonságossá tételéhez az alábbiak kombinációja szükséges: Biztonsági mentések készítése a fontos információkról Olyan személyzeti politika. és fenntartja lojalitásukat. mert a legveszélye­ sebb támadások mindig belülről jönnek Szoftverekkel kapcsolatos óvintézkedések. hogy az internetet nem használó ügyfeleket elveszítjük. és mindenhol raktárkészletet kell fenntartani. ha ugyanezt az interneten tennénk elérhetővé. hogy az ügyfelek az ügynököket vagy közvetítőket kikerülve közvetlenül a nagykereskedővel vagy a gyártóval léphetnek kapcsolatba. pénz eltulajdonítása vagy a termé­ kek. specifikációkat vagy bármilyen más információt adunk át az érdeklődőknek. A pénzbe kerülő szolgáltatások elektronikus változatra cserélése költségcsökkentése eredményezhet. biztosan olcsóbban jönnénk ki. és a hivatali órákon kivüli időben is választ adhatnak egymás kérdéseire a fórumozók. A cég az 1998-as doc-com lufi idején zárta be üzleteit. a világ bármelyik pontjáról elérhető lesz. dokumentált eljárásokat. szolgáltatások ingyenes megszerzése. majd a lufi kipukkadásakor. Ám a meglévő szolgáltatások cseréje kockázatot is hordoz magában. állandóan változó fogyasztói preferenciák és természeti katasztrófák­ hogy csak néhányat említsünk a lehetséges veszélyforrások közül. akár azt. egy 80 kiskereskedelmi üzletből álló lánc sokkal nagyobb folyamatos költséggel jár. a külföldi vásárlók telefonköltség nélkül kaphacnak támogatást.E-kereskedelmi honlap üzemeltetése 227 sárlók számára olyan fórumot működtetni. hogy az ajánlatkéréseket gyorsan szécküldhetjük. Egy internetes vállalkozás elég. amely vonzza a becsületes munkavállalókat. A crackerek támadásainak oka lehet a kihívás. A központosítás is költségcsökkenése eredményezhet. Bár egy komoly e-kereskedelmi oldal létrehozása nyilvánvalóan pénzbe kerül. illetve a működés központosításábóL Ha jelen pillanatban igen sok embernek adunk tájékoztatást. a hírnév iránti vágy. Az e-kereskedelmi cégek által észlelt kockázatok egy része azonban a hagyományos vállalkozásokra alig vagy egyáltalán nem jelent veszélyt. hogy bűnözők célpontjává válik. több helyen kell bérleti díjat és rezsit fizetni. A cég úgy döntött. az oldal tönkretétele. a ko mmunikáció előmozdításából. Kockázatok és veszélyforrások megismerése Minden üzlet kockázatokkal jár: versenytársak. hogy bezárja informatikai bolchálózatát. és rövid időn belül választ kaphatunk.

amelynek elfogyott a pénze. A költségvetésünk biztosította kereteken belül dönthetünk úgy. Egy komoly e-kereskedelmi oldal kifejlesztése és piacra vitele rengeteg pénzbe kerül. mint a könnyen ki­ található jelszavak. ha naprakész biztonsági mentéseket készítünk minden adarunktóL a vál­ toztatások előtt feljegyezzük a működö szoftverbeállításokat. Viszonylag egyszerűen beállítharunk több. akkor szolgáltatók összetett hálózatára vagyunk kénytelenek támaszkodni. Számítógépes hardverhibák Ha vállalkozásunk a weboldalunktól függ. de azt jelenti. A cégek sok esetben hajlandók rövid távon pénzt veszíteni. hogy a cég sokkal többet költött. ám jelentösen megnövelik hardver-. viszonylag pontosan felmérhetjük a versenyhelyzetet. hogy ha valamelyik szolgáltató kiesik. és a rendszerműveleteket felügyelve gyorsan észleljük az esetleges . A verseny kockázata ellen nem sokat tehetünk. hogy a márka piaci megszilárdulása után az ügyfélszám és a bevétel is nőni fog. A ktitikus hibák valószínűségét megbízható szaftver választásával csökkenthetjük. Mint minden veszélyforrás esetén. Új versenytársak viszonylag ritkán jelennek meg. mert a veszteséges vállalkozások müködéséhez elengedhetetlen kocká­ zati töke egyszerűen elapadt. A dor-com lufi kipukkadása sok cég vesztét okozta. E-kereskedelem esetében kevésbé mehetünk biztosra. hálózatünfrastruktúra. mint ölhe tett kézzel várjuk. miután hat hónap alatt 120 millió dollárt tapsoltak el.leállásának esélye indokolja-e a redundáns berendezés költségét. A komoly bukták közé tartozott az európai boo.és tárhelyköltségeinket. 14 Elektromos. Apache-t. nyilvánvaló.a cserealkatrészre vagy a javításra várás ideje alatti . még mindig ott a másik. illetve érdemes a rendszer egyes részeinek megváltoztatása után elegendő időt hagyni a tesztelésre. Erős verseny Ha valamelyik utcasarkon nyitunk kiskereskedelmi boltot. hogy bármelyiknek a hibája ne lehessen hatással a teljes rendszer működésére. az e-kereskedelmi vállalkozások bukásának legnagyobb része hagyomá­ nyos gazdasági tényezökhöz köthető. Forgalmas vagy üzletktitikus weboldalak esetén létjogosultsága van redundáns rendszerek használatának. semmi mást nem tehetünk. hogy a weboldal egynapos . mint amennyi bevételt hozott. ha azokat máshol már kellöképpen leteszteltük. a baj az volt. nap mint nap új versenytársakat kaphatunk. Az internet erősen versenyző és gyorsan változó környezet. Ez többletköltséggel jár. fejezet Auditálás és naplózás a betörések és a betörési kísérletek észlelésére A számítógépes rendszerek elleni legsikeresebb támadások olyan jól ismert gyengeségeket használnak ki. Kénytelenek voltak a céget eladni. itt is azt kell mérlegelni. illetve a munkaerököltségek változásának. A rövid áramki­ maradások okozta problémákat szünetmentes tápegységbe beruházva kerülhetjük el. akkor a szaftverekben lévő hibák a sebezhetőségünket jelentik. hogy több szolgáltatást veszünk igénybe különbözö szolgál­ tatóktól.com is. illetve elérhető. mert bíznak benne. megpróbálhatjuk megőrizni versenyképességünket. Versenytár­ saink elsödlegesen a környező területen ugyanazt a termékskálát értékesítő vállalkozások. hogy szolgáltatónk helyreállítsa a szolgáltatást. A kívánt üzleti eredmény elmaradása Bár széles körben tartanak a crackerek támadásaitól. amelyek MySQL replikációval egy­ szerűen szinkronban tarthatók. a gyakran használt hibás konfigurációk és a régi szoftververziók. és ki vagyunk téve az árfo­ lyam-ingadozásoknak. PHP-t és MySQL-t futtató gépet. formális tesztdési eljárást folytatni. A szállítási költségek függvényében versenytársaink a világ bármely pontján elhelyezkedhetnek. Mérsékelhetjük a hibák káros következményeit. Ha a weboldalunkat a világ többi részével összekötő kapcsolat leáll. A problémát nem az okozta. Szoftverhibák Ha vállalkozásunk szoftverekte támaszkodik. hogy a Boonak nem voltak eladásai. A józan ész által diktált óvintézkedésekkel a nem professzionális támadások elháríthatók. Ugyanez igaz az elektromos hálózat leállásaira is. de ha nem állunk meg a fejlesztésekkel. és az éles rendszeren csak akkor végreh�tani a vál­ toztatásokat.228 14. hogy a legrosszabb bekövetkezése esetén biztonsági mentéssel rendelkezzünk. hogy bármely számítógépünk ktitikus alkatrészeinek hibája komoly következménnyel jár. kommunikációs vagy hálózati hibák Ha az internetre alapozzuk vállalkozásunkat. Ha népszerű termékkategóriában utazunk.

A kérdés az. Minden bizonnyal azt reméljük. bennünket hátrányosan érintő helyzet alakul ki. Következő lépések A következő fejezerben az e-kereskedelem biztonsági oldalával foglalkozunk. A kapacitás bizonyos mértékig egyszerűen gyorsabb hardver beszerzésével is növelhető. Szaftverünk vajon úgy lett megírva. és oldalunkat az aktuá­ lis jogszabályokkal összhangban müködterjük. az olvasóban is kezd megfogalmazódni saját stratégiája. hogy MySQL master szerverre írjuk és különböző slave szerverekről olvassuk ki az adatokatr Kevés rendszer képes probléma nélkül megbirkózni a jelentős mértékü növekedéssel. szabályozhatnak vagy ellehetetlenít­ hetnek. A jövőbeli jogszabályalkotással bizonyos üzleti modelleket megszigoríthatnak. sőt: akár az is elképzelhető. hogy hatékony tervezést tegyen lehetövé. részletesen olvashatunk a biztonsági fogalmakról. vagy agresszív módon úttörő szolgáltarást hozunk létre. A stratégia fogja meghatározni az üzleti modellt. Ez a modell általában olyan dolog. hogy éppen ezek a gyors változások teszik rendkivül fontossá a tervezést. Újabb adókat vethetnek ki. hogy ilyen szabályozás még egyáltalán nem létezik. meglévő versenytársat másolunk le. és nem választunk stra­ tégiát. De ha rendszerünket a skálázhatóság elvének figyelembe vételével tervezzük meg. a fenyegetésekről és az ellenük való védekezés módszereiről. de ese­ cenként olyan új ötlet is lehet. részekre bonthas­ suk annak érdekében. Ha valamilyen. hogy növekvő kereslet esetén bővít­ hető legyen. a változások bekövetkezte után kell azokra valamilyen választ adni ahelyett.zünk. hogy milyen országban élünk. de létezik egy határ. Most. hogy később úgy módosíthassuk. hogy megvizsgáltuk az üzleti típusú weboldalak jellemző céljait és az azokat fenyegető főbb veszélyforrásokat. arniben nagyon his. különböző gépektől érkező kérés kezelésére r Az adatbázishoz csatlakozás kódja lehetövé teszi. hogy ha elérjük ezt a pontot. hogy több rendszer közőrt megoszthassuk a terheléstr Adatbázisunk képes egyidejűleg több. Éppen ezért úgy kell kialakitanunk. az internet alapú vállalkozások szabályozása lehet kezdeti. ami valahol máshol már bevált. A megfelelő stratégia kiválasztása 14 Egyesek szerint az internet túl gyorsan változik ahhoz. Ez azonban minden bizonnyal nem sokáig marad így. kezelni pedig csak úgy lehet. Mi viszont úgy gondoljuk. ha naprakész ismeretekkel rendelkezünk. mérlegeljük egy lobbicsoporthoz csatlakozás lehetőségéti Rendszer�kapacitásbeli korlátok Rendszerünk megtervezésekor érdemes tekintetbe vennünk a növekedés lehetőségét. hogy meglévő üzleti modellünket alakitjuk az internethez. amelynél gyor­ sabb számítógépet már nem tudunk venni. hogy a változásokra számítva aktívan csele­ kedhetnénk. hogy rendszerünk egyre forgalmasabb és forgalmasabb lesz. Változó szabályozási környezet és adójogszabályok Attól függően. képesek leszünk azonosítani és elhárítani az ügyfélbázisunk növekedésével óhatat­ lanul jelentkező szük keresztmetszeteket. remél­ jük. Ha nem tűzünk ki célokat. kiforratlan állapotban. .E-kereskedelmi honlap üzemeltetése 229 problémákat. Ezeket elkerülni nem tudjuk.

illerve fontos szerepet játszharnak a vírusok és férgek terjedésében. az ellenőrzést és a hálózati események nyomon követését. és mennyire fontos a potenciális crackerek számára? Könnyen kisértésbe eshetünk. A fejezetben a következő főbb témakörökkel foglalkozunk: A birtokunkban lévő információ fontossága Biztonsági fenyegetések Biztonsági házirend létrehozása Használhatóság. milyen fontos az.15 Az e�kereskedelem biztonsági kérdései A fejezetben a biztonság e-kereskedelemben betöltött szerepével foglalkozunk. A katonai számítógépek nyilvánvalóan a magánszemélyek és a külföldi kormányzatok célkeresztjében állnak. az ilyen rendszerek ellen irányuló támadások esetiek lesznek. Ugyanígy eltérő az is. költség és biztonság Ellenőrzési elvek Oldalunk felhasználóinak ellenőrzése A titkosítás alapjai Privát kulcsú titkosítás Nyilvános kulcsú titkosítás Digitális aláírások Digitális tanúsírványak Biztonságos webszerverek Auditálás és naplózás Tűzfalak Biztonsági mentés készítése adatainkról Fizikai biztonság A birtokunkban lévő információ fontossága Mielön a biztonsággal foglalkoznánk. egy bank vagy egy katonai szervezet számi­ tógépén tárolt információ. Megnézzük a biztonsági házirendek létrehozá­ sának elveit. érdemes megfelelő informatikai személy­ zeere és egyéb erőforrásokra költení a szükséges óvintézkedések érdekében. kinek állhat szándékában meg­ szerezni a birtokunkban lévő információkat. Még a legkevésbé érdekes adatokat tároló számítógépek is felkelthetik a támadók figyelmét. Mielőtt eldöntenénk. Vajon mennyire lehet vonzó számitógépeink tartalma a rosszindulatú látogatók számára? Az otthoni felhasználóknak általában korlátozottabb lehetőségek állnak rendelkezésre rendszerük megóvására. mert kíválóan alkalmasak arra. Megvizsgáljuk. hogy milyen messzire haJlandó egy támadó elmenni azért. hogy hozzáférést nyerjen ezekhez az információkhoz. mennyi erőfeszítést és költséget kívánunk a biz­ tonságra fordítani. és azt gondolhatjuk. hogy oldalainknak minden pillanatban a lehető legmagasabb szintű biz­ tonságra van szükségük. Nyilvánvalóan eltérő értéket képvisel egy otthoni felhasználó. Mivel a számitógépeiken tárolt információk a tulajdonosukon kívül mindenki más számára valószínűleg csak alacsonyabb értéket képviselnek. Mivel az ezek ellen támadást tervező kormányzatok minden bizonnyal bőséges erőforrással bírnak. Ennek ellenére minden számítógépes hálózat felhasználójának meg kell tennie a megfelelő óvintézke­ déseket. hogy névtelen támadásokat inditsanak róluk más rendszerek ellen. és hogyan próbálkozhatnak ezzel. . teljesítmény. tudnunk kell. és a támadók vélhetően korlátozott erőfeszítéseket tesznek a feltörésükre. egy vállalkozás. amit védeni sze­ retnénk. Mennyire fontos nekünk. hogy mennyit ér a birtokunkban lévő információ. a weboldalak védelme érdekében alkalmazható technológiát. először is meg kell próbálnunk válaszolni a kérdésre. köztük a titkosítást. ám a védelem nincsen ingyen. amelyekkel elkerülhetők az ilyen jellegű problémák. illerve megismerünk néhány.

ha egy cég engedi. Sok közülük a bizton­ Bizalmas adataink k.hitelkártyaszám.hogy csökkenrsük a potenciális gyenge pontok számát. kitől érkezik a kérés. akkor minek legyen telepítve a szolgáltatás?1 Ha azt mondjuk a telepítőnek.konfigurálással.amelynek csak a nyilvánosságra tartozó vagy a közelmúltban a nyilvánosság­ tól begyűjtött információkat szabad tárolnia.amikor hálózaron haladnak keresztül.hogy az adott felhasználó jogosult-e a hozzáférésre.amelyeknek köszönherően lényegében a különböző hálózatok internetként való összekapcsolál Ha jelenleg használjuk az rep-e. Minden futtatott szolgáltatásnak lehetnek sebezherőségei. A webszerverről távolítsuk el a felesleges szolgáltatásokat is. Olyan információkat tartalmazharnak. hogy mennyire lesz vonzó a crackerek számára. Ehhez a biztonság figyelembevételével kell megtervezni a rendszert. Sokféle hitelesítési módszer közül választhatunk.és hamarosan a legnépszerűbb újságok címlapján ralálca magár. mivel Maxus széroszrorta a kártyaszámokar. Weboldalunktól függően az alábbi biztonsági fenyegetésekkel kell számolnunk: Bizalmas adataink kitettsége Adatvesztés vagy -rongálás Adatmódosítás Denial of Service támadások Szaftverhibák Letagadás Nézzük át egyenként ezeket a fenyegetéseket! honlap üzemeltetése című. akkor a főbbLinux-disztribúciók és a W indows is számos olyan szolgáltatást telepít. gondosan kell programozni. Egy magát Maxusnak nevező személy 1999-ben kapcsolatba lépett a CD Universe-zel azt állítva.alapos tesztelésre van szükség. .abban a tekintet­ ben legalábbis feltétlenül.a számítógépeinktől küldött vagy azokra érkező adatok bizalmasak lehetnek. Biztonsági fenyegetések Mi van az oldalunkon kockázarnak kitéve? Milyen fenyegetésekre számíthatunk? Az e-kereskedelmi vállalkozásokat érintő fenyegetések egy részével az E-kereskedelmi sággal kapcsolatos.csak ne a webszerver legyen az! A webszerver feladatából adódóan egy nyilvánosan elérhető gép. hogy számítógépünk hálózati kiszolgáló. A kitettség kockázarának csökkenréséhez korlátozni kell az információ elérésére alkalmas módszerek.dollárban és hírnévben mérve-. Az adatok akkor is kockázatnak vannak kitéve.amelyeket nem szereme nyilvánosságra hozni. A cég visszautasította az ajánlatot. megfelelően kell konfigurálni a kiszol­ gálót és a szoftvereker.hogy 300 OOO hitelkártya adatát lopra el a cég weboldaláróL 100 OOO dollárt követelt az adatok megsemmisíréséérr.felhasználókat.el tudja dönteni.itettsége A számítógépeinken tárolt.akkor szinre bármilyen gépet kiválaszthatunk. fejezer Az általunk üzemelterni kívánt e-kereskedelmi oldal minden bizonnyal az előbbi két szélsőség közé esik. Reméljük.senki nem tárol webszerverén olyan adatokat. Ha a bérszámfejtési adatokat vagy a szupertitkos üzleti terveinket számírógépen kívánjuk tárolni. milyen következményekkel jár. és amiket el kell távolítani.Lehetnek vásárló által megadott bizalmas adatok.illetve az arra jogosult személyek körét. 14. A Jelhasználók hitelesítése {authentication) esetén megkérjük a látogatókat. Ha soha nem használjuk például az r ep parancsot.illetve annak esélye. amiket csak bizonyos emberekkel kívánunk közölni (ilyenek például a nagykereskedelmi árlisták).de jellemzően kér fajtája szokott a nyilvános weboldalakon előfordulni: a jelszó és a digirális aláírás.és meg kell követelni a felhasznáJók hirelesítését. A fejezet egy későbbi részében mindketrőről részletesebben olvashatunk. A webszerver ki­ mondottan rossz választás titkos információk tárolására.hogy egyiknél se legye­ nek jelen ismert sebezhetőségek.232 15. A nem használt szolgálratások veszélyesebbek lehetnek. Bár a TCP /IP hálózatok számralan remek tulajdonsággal bírnak.hogy mások visszaéljenek vele. hogy azonosítsák magukat. Gondos tervezéssel. Ennek megfelelően a védelmére fordítandó erőforrá­ soknak és erőfeszítéseknek is a két szélsőség közé kell esniük.hogy információink valamilyen hiba következtében mások számára is elérherövé váljanak. akkor is érdemes elrávolírani és az scp-r {biztonságos másolás) használni helyette. amire nem lesz szükségünk. például jelszó. A CD Universe esete jó példa arra.hogy bizalmas információkar lopjanak tőle. el kell távolítani a kiszolgálóról a felesleges 15 szolgálrarásokat. kódolással és teszteléssei csökkenthető a sikeres támadások. elérhetőség. Ha a rendszer látja. Minden ilyen szolgáltatást naprakészen kell tartani. fejezetben már foglalkoztunk.

egyeden igazi védelem létezik ellene: a biztonsági mentés. hogy irodánk leég. hogy minden bizonnyal a legfontosabb merevlemez lesz az.1 ábra: Az információ interneten keresztüli továbbítása potenciálisan megbízhatatlan gépek sokaságán keresztül küldi az adatokat.Az e-kereskedelem biztonsági kérdései 233 sának szabványává váltak. gondos szakem­ berekkel dolgozzunk! Vásároljunk jó minőségű merevlemezeket! Használjuk a RAID ( Redundant Array of Inexpensive Disks -olcsó lemezek redundáns tömbje) technológiát. amíg elér a célhoz. akkor nagy sietve. fárasztó és. Murphy törvénye pedig kimon<lja. hírnévben és pénzben kifejezve. Ha hónapokat dolgoztunk oldalunk fejlesztésén. ha mindezen adatokat elveszítenénk? Ha nem rendelkeznénk biztonsági mentéssel minden adatunkról. A merevlemezek percenként több ezer fordulatot tesznek meg. mielőtt a hálózaton elindulnak. a szerver által másodpercenként kiszolgálható látogatók számát jelentős mértékben csökkenti.rongálás Az adatvesztés akár költségesebb is lehet. Gondoskodjunk arról. Közülük bármelyik gép. hogy az így kapott adatok helyreállítása biztosított legyen! Ügyeljünk. Ha ez saját országunkon belül van. az útközben érintettek száma a húszar is meghaladhaga. A bizalmas információkat védendő titkosíthatjuk azokat. Számtalan különbözö intézkedéssei csökkenthegük az adatvesztés esélyét.sajnos. a parancsot kell használ­ nunk (Unix gépen). mint ha valaki egyszerüen megszerezné azt. hogy a biztonsági mentéseket a számitógépeinktől távol tároljuk! Bár elég kicsi az esélye. amíg mind el nem érik a célállomásukat. hogy milyen Útvonalon jut el tőlünk az adat egy adott gépre. A webszerverek erre gyakran a Netscape által kifejlesztett Secure Sockets Layer (SSL) protokollt használják. A biztonsági mentések készítése nem Ürtudomány. Éppen ellenkezőleg: unalmas.haszontalan foglalatosság.megcekintheti" a rajta keresztülhaladó adatainkat. a biztonsági mentések fizikailag más helyen tárolása semmibe nem kerülő óvintézkedés. de az majdnem biztos. hogy egyszer tönk­ remegy egy merevlemezünk. ami lehetövé teszi. hogy egyszer véletlenül kitöröl valamit. a biztonság. ahogy ezt a 15. . Védjük kiszolgálóinkat a crackerek ellen! A lehe­ tó legnagyobb mértékben korlátozzuk a számítógépeinkhez hozzáférő alkalmazottak számát! Csak hozzáértő. amelyeken az adat keresztülmegy. és ne felejtsük el letesztelni a biztonsági mentés készítésének folyamatát. és olykor elromlanak. l Forrás ��Ih l l L------------------- 1 l Cél Az internet 15. vajon mennyibe kerülne az időben. Elégededen ügyfelek tömkelegér tudhatnánk magunkénak. a semmiből indulva kellene újra megírnunk weboldalunkat. hogy csomagokra bonga fel az adatokat.reményeink szerint . A TCP /IP úgy működik. majd gépről gépre továbbítja ezeket a csomagokat. megbízhatóbb merevlemezként! Mindegy. vagy valarnilyen természeti katasztrófa nyomán teljesen tönkremegy. amiről jó régen nem készítettünk biz­ tonsági mentést. mielőtt elhagyná az épületet. hogy mi az adatvesztés oka.nem tartozik ezek közé. hogy adatainkról rendszeres biztonsági mentések készüljenek. Ekkor az útvonal végén vissza kell fejteni a titkosított állományokat. Amennyiben szervezetünk nagy és összetett hálózattal rendelkezik. Az is igen valószínü. ha az adatok köztük és böngészők között utaznak. A parancs eredményeképpen megkapjuk azon gépek címét. kevés erőfeszítéssel járó módja ez az adatátvitel biztonságossá tételének. az adat akár öt gépet is érinthet. ------------------. hogy adataink útjuk során több gépen is keresztülhaladnak. és olyan csalókkal találkoznánk. és formázzák merevlemezünket. hogy több merevlemez működjék egyeden gyorsabb. Ez azt jelenti.1 ábra is mucatja. traceroute Ha látni szeretnénk. Ha a cél egy külföldi gép. akkor az adat átlagosan úgy tíz különböző gépen megy keresztül. Megeshet. a felhasználói adatok és megrendelések összegyüjtésén. hogy rendeltek valamit. Adatvesztés vagy . Viszonylag alacsony költségű. ami ugyanakkor életbevágóan fontos. akik azt állitják. ám mivel kiszolgálónknak egyszerü adatküldés és -fogadás helyett titkosítania és visszafejtenie is szükséges az adatokat. de nem kapták meg. hogy crackerek egy figyelmeden programozó vagy rendszergazda l" 15 egyszer betörnek a rendszerünkbe.

Az ártatlan célpont így dühödt levélírók ezreinek küldeményével lesz kénytelen megbirkózni. de vajon meddig tart. vagy magasabb szintű rendszerjogosultságokat oszthat ki saját magának. és zárjuk be ezeket! Routerünk képes lehet az adott protokollokat (például ICMP) használó forgalom százalékos mértékének korlátozására. A módosításokat gyakran igen nehéz észrevenni. Ha adatainkat titkosítással védjük a jogosulatlan megte­ kintéstől. az eBay.hogy felhasználóink használ­ hassák a rendszert. hogy hozzáférjenek egy szolgáltatáshoz. mint a hírnevét illetően. hogy mely alapértelmezett portokat használják a gyakori D DoS-eszközök. az úgynevezett Denial of Service (DoS) támadás.de míg a programokat a módosítás gyanúja esetén újratelepíthetjük. vagy késlelteti időkritikus szolgáltatáshoz való hozzáférésüket. amilyenekről mi nem is igen álmodhatu nk. Ha rninden hálózati rend­ szergazda megbízható módon felügyelné saját hálózatát. Kis kutatómunkával kideríthetjük. de ha a fogadó fél a fájl megérkezésekor ellenőrzi. amelyek jól meghatározható időszakban bonyolítják forgalmuk jelentős részét.például az adatbázisunkat tároló adatállományok -. lefoglalja. Léteznek olyan oldalak. Könnyebb hálózatunkon belül olyan gépeket észrevenni. Automatizált eszközök is léteznek megosztott DoS-támadások indítására. betör egy nem megfelelően védett gépbe. A célpontok közé tartozott a Yahoo!. vagy csalással előnyhöz juttassák saját magukat.majd telepíti az eszközt. hogy valaki útközben észrevétlenül módosíthassa azokat. hogy az adatok melyik verziója"tisztá: A fájlok integritását ellenőrző szoftverek. amelyeket másik gépek támadására használnak. meg tudja állapítani. Bár a eraeketeknek anyagi előnyük általában nem származik egy weboldal túlterheléséből. hogy valaki hozzáférést szerzett rendszerünkhöz. Ezek az oldalak olyan látoga­ tottsági szintekhez vannak hozzászokva. fejezet Adatmódosítás Már az adatvesztés is hatalmas károkat okozhat.hogy rendszerünk biztonsága sérült.tripwire.234 15.hogy a fontos fájlokat megváltoztatták-e? Vannak olyan fájlok. mint megvédeni számítógépeinket a támadás ellen. amíg a módosításokat észrevesszük? Ilyen módosítások az adatfájlokat és a futtatható fájlokat egyaránt érinthetik. hogy a legforgal­ masabb időszakban fogják támadni őket. így ezeket később felhasználhatjuk annak megállapítására. A DoS-támadások elleni védekezés nem egyszerű dolog. az E-Trade és a Buy.és módosította fájljainkarl Egy teljes körű törlést minden bizonnyal észreveszünk. A szóba jöhető módszerek közé tartozik olyan program telepítése a célgépre. 98 és ME soha nem voltak igazán alkalma­ sak kiszolgáló operációs rendszernek. az aláírás használatával igencsak megnehezítjük azt. A reverse spam olyan levélszemét kiküldésér jelenti. hogy hálózati forgalommal árasszák el a célt. Elegendő szá­ mú gép beszervezése után mindegyiket utasítja. Az online fogadó­ oldalak iránti érdeklődés jelentősen megugrik közvetlenül a nagy sportesemények előtt. Szolgáltarásmegtagadás akkor következik be.például közvetlenül a telepítés utáni. A futtatható fájlok szándé­ kosan megrongált változatokra cserélésével az egyszer már hozzáférést szerző cracker titkos hátsó ajtóhoz (backdoor) juthat.a D DoS egyáltalán nem jelentene problémát. A program fizetős és bizonyos feltételek mellett ingyenes verzióit a http:/ l www. ha a fájlt módosították. amely a rendszer processzoridejének nagy részét a célpont szerepel feladókén t. hogy számtalan különböző módon kivitelezhetők. a reverse spam és az automatizált eszközök használata.com. Az ilyen támadások elleni védelem nehézségét egyrészt az okozza. hogy a Windows 95. feljegyzik a fontos fájlok tudottan biztonságos . 15 A 2000-es évek elején megosztott szolgáltatásmegtagadással (DDoS) járó támadások tömkelegér inditották nagy forgalmú oldalak ellen. Különösebb tudás nélkül is bárki megteheti. hogy változatlanok maradrak-e ezek az állományok. a támadó akár gépenként öt másodperc alatt telepítheti az eszközt. Automatizált folyamatról lévén szó. adataink módosítása azonban még ennél is rosszabb lehet. 2004-ben volt: online fogadóirodákat zsaroltak meg azzal.állapotának információit. A megfelelő jogosultsági rendszer hiánya az egyik oka annak.abban nem lehetünk biztosak. de DoS-rámadással még ezeket is órákra elérhetetlenné lehet tenni. hogy valaki módosítsa az adatot. honnan fogjuk tudni. az oldal üzemeltetője jelentős veszreséggel szembesülhet úgy anyagiakban. ha valaki a cselekedeteivel megnehezíti vagy lehetetlenné teszi a felhasz­ nálók számára. hogy az aláírás még mindig stimmel-e. A prograrnak és az adatok módosítása is alattomos dolog tud lenni. mint amilyen például a Tripwire is. amikor a crackerek megpróbálrak D DoS-támadásból pénzt csinálni. hogy megváltoztassák oldalunk megjelenését. Más f:ijloknak pedig a telepítés után rnindaddig változatlannak kell maradniuk.illetve védenünk kell rendszerünket a jogosulatlan hozzáféréstőL A fájljogosultságok lehetövé teszik. Ez a megközelítés nem akadályozza ugyan meg. Ha bármikor rájövünk. de ne kapjanak szabad kezet a rendszerf:ijlok vagy más felhasználók állományainak megváltoztatásához. Denial of Service támadás Az egyik legnehezebben kivédhető fenyegetés a szolgáltatásmegtagadással járó támadás. A kiszolgálón tárolt fájlok módosítások elleni védelméhez operációs rendszerünk fájljogosultságait kell használni.amíg szándékosan nem frissítjük őket. hogy ismert sebezhetőségek után kutatva rengeteg gépet megvizsgál. Az egyik alkalom. amelyben . Képzeljük el.com oldalról tölthetjük le. A crackerek olyan céllal módosíthatnak adat­ fájlt. és a biztonsági mentésből helyreállítharjuk a törölt állományokat. A hálózaton áthaladó adatokat ellenőrző összeg (signature) használatával védhetjük a módosításoktól. az Amazon.ame­ lyek rendeltetésszerű használat esetén is időről-időre változnak.

előre nem látható helyzetekhez vezethetnek. a letagadás (repudiation). Például feltételezik. Az ilyen jellegű hibákat megfelelő teszteléssei és a kód kellően részleres átvizsgálásával megtalálhatjuk és kijavíthatj uk. amely a gyakori géptípusok reprezentatív mint:iján teszteli szaftverünk összes funkcióját. hogy hibákat fogunk találni a végtermék­ ben. mert a fejlesztök nem gondoltak arra. egy nagy költségvetéssei működő oldalnál elkövették ezt a hibát. Akármennyire feleslegesnek is tünik kikötni azt.Az e-kereskedelem biztonsági kérdései 235 A számtalan lehetséges támadási módszer miatt az egyetlen igazán hatékony védelem a szokásos forgalomviselkedés figye­ lése és olyan szakértői csapat fenntartása. hogy a beviteli adatok érvényesek lesznek. hogy az ügyfél hitelkártyájának elutasítása esetén a megrendelést nem szabad kiküldeni. mint egy egyszerű feladaté. Pontatlan specifikációk Minél felületesebb és minél félreérthetőbb a tervdokumentáció. nem tartalmaznak különleges karaktereket. Minél kevesebb tapasztalattal rendelkeznek a fejlesztök az általunk létrehozni kívánt rendszertípusban. ha a tranzakcióban szerep­ lő egyik fél letaga<lja részvételét. hogy hibát keressenek saját munkájukban. amelyek azért követeznek be. kevesen vannak. vagy az. majd letagadja. amivel foglalkozunk. Természetesen abban reménykedünk. mert az esetek többségében igazak. hogy valaki más hamisította azt a levelet. Ez a szekottnál is nagyobb mértékben igaz a webalapú rendsze­ rek esetében. például. a fejlesztök hibás feltevései és a nem megfelelő tesztelés tartozik. hogy fény derüljön a fejlesztök hibás feltevéseire. Letagadás Az utolsó kockázati lehetőség. mint a szolgáltatás elérhetetlensége. hogy felhatalmazást adott hitelkártyája megterhelésére. A projekthe friss ödetekkel érkező külső személyek jó eséllyel más­ milyen feltevésekkel fognak élni. Ráadásul a profik jellemzőerr nem égnek a vágyról. az összes lehetséges hardvertípus. A leggyakoribb hibaokok közé a pontatlan specifikációk. Előfordul azonban olyan is. bizton­ sági incidensek. Akkor következik be.akár vásároltuk. hogy az emberek hibás feltételezéseket tesznek. Vagy.komoly hibák lehetnek. 15 Nem megfelelő tesztelés Az összes lehetséges beviteli adat. akik szeretik újra meg újra ugyanazt feltörni. és azért hagyja ott az oldalunkat. hogy személynévben lehet aposztróf. ha feltörhetnek valamit. Szoftverhibák A szaftverekben . . Fejlesztök hibásJeltevései A rendszer tervezőinek és fejlesztőinek számos feltevéssel kell élniük. A tesztelés legnagyobb baja. Ideális eset­ ben mindez automatizált. Időzítéssei kapcsolatos feltevések is lehetségesek. majd azt állítja. Az ilyen feltételezések azért csúszhatnak át. A webes projektekre jellemző rövid fejlesztési idő jelentősen megnöveli az ilyen hibák esélyét. Fontos. pénzügyi veszteség vagy alacsony színvonalú ügyfélkiszolgálás. szereztük vagy mi magunk írtuk . Egy cracker azonban kihasználhatja azokat a puffertúlcsordulásokat. annál pontosabb specifikációkat kell adnunk. hogy unalmas és monoton feladat. így a kíválasztott tesztgépeken minimális erőfeszítéssel lefuttatható.vagy alkalmazásszintű gyengeségek általában a puffertúlcsordulással vagy a verseny diktálta túl gyors fejlesztésekkel álltak összefüggésben. mint amikor valaki rendel valamic egy weboldalról. az összes lehetséges operációs rendszer összes lehetséges felhasználói beállítással való tesztelése ritkán megvalósítható. hogy két egymással ütköző művelet egyide­ jűségének a valószínűsége csekély. hogy ne csak a fejlesztőket vonjuk be. Egy jól megtervezett tesztsorozat projektünk kó<ljának minden sorát legalább egyszer ellenőrzi. amely az abnormális sziruációk bekövetkezése esetén azonnal megteheti a szükséges inrézkedéseket. hiszen a tesztelés egyik leg­ főbb célja. A hibás szoftverek a számítógépes folyamatokra nagy mérték­ ben támaszkodó vállalkozásokat sebezhetövé teszik. amikor valaki e-mailben beleegyezik valamibe. A szaftverekben rejlő hibák olyan. akik élvezik. hogy megfelelően dokumentálják ezeket. és az esetek többségében igazuk lesz. Bár vannak. mert a programozó hibásan feltételezte a beviteli adat maximális hosz­ szác. annál valószínűbb. Az e-kereskedelem területéről olyan idevágó példákat említhetünk. hogy egy összetett feladat feldolgozása mindig tovább tart. Vagy egy szabályosan eljáró felhasználó azért kaphat hibaüzenetet. vagy adott mérernél kisebbek lesznek. Olyan jól előkészített tesztdési tervre van szükség. A crackerek által a korábbi időszakokban kihasznált operációsrendszer.

Ebben a doku­ mentumban különböző irányelveket fogalmazhatunk meg szervezetünk különböző egységeinek. a kiszolgálni tervezett látogatók számától és a szabályosan eljáró felhasználék által még elviselhetőnek ítélr biztonsági intézkedések mértékétől függően kell megtalálni a fenti célok közötti egyensúlyi állapotot. Kialakítása lehetövé teszi. . A biztonság erősítése számitógépeink teljesítményét is visszavetheti. A teljesítménye. mint egy tervdokumentumot vagy eljárási kézikönyvet. hogy több névtelen felhasználó intézzen szolgáltatási ké­ réseket a gépünkhöz. hogy núndig a lehető legmagasabb szintű biztonság a kívánatos. Biztonsági házirend létrehozása A biztonsági házirend olyan dokumentum. A felhasználói hitelesítés valamilyen mértékü bizonyosságat ad a másik félrőL A megbizható szervezet által kiadott digitális tanúsítványok tovább fokozhatják a bizalmat. Ezeket a teljesítménybeli veszteségeket gyorsabb gépek vagy kifejezetten titkosítás céljára kialakított hardver beszerzésével ellensúlyozhatjuk. Bár azt gondolhatnánk. A házirendnek nem szük­ séges a konkrét megvalósítással vagy megoldásokkal foglalkoznia: a környezetünk által megfogalmazott célokat és biztonsági elvárásokat kell tartalmaznia. hogy megerősítse a látogatókban a cég jó hirnevét. Ha teljes biztonságra van szükségünk. A biztonság. fejezet Ideális esetben a pénzügyi tranzakciók a leragadharatlanság biztonságát kínálják núndkér félnek. Nem jó. Egyikük sem rudja leragad­ ni részvételét a tranzakcióban. Ezek többsége teljesen szabályos. Külön dokumentumban kell szabályozni a biztonsági házirend elvárásainak teljesítését célzó irányelveket. általános filozófiája A védeni kívánt elemek . amit a cég elküldött. Ez természetesen növeli költségeinket. Használhatóság. az üzenetek aláírása vagy titkosítása megnehezíti az észrevétlen módosításukat.például titkosítás. amelyek e szabványok teljesítésének mértékét határozzák meg A biztonsági házirend létrehozása a szoftverek müködési követelményeinek megírásához hasonló. az pontosan megegyezik azzal. ami az elvárt biztonsági szint garantálásához szükséges konkrét lépéseket szabályozza. pontosabban núndkét fél hitelt érdemlően bizonyítani ruclja harmadik személy.thawte. és núnden gond nélkül kifizet néhány száz dollárt egy olyan tanúsítványkibocsátónak. hogy bizonyos mértékben lazítsunk a biztonságon. amely az alábbiakat határozza meg: A szervezet biztonsággal kapcsolatos. Egy e-kereskedelemmel foglalkozó vállalat minden bizonnyal hajlandó azonosságának bizonyítására. A titkosított munkamenet (session). hardver. Ha korlátozzuk a felhasználók lehetőségeit. Mint már említettük. de számítógépeink internethez csatlakoztarásával azt is lehetövé tesszük az embereknek. hogy amit megkaptunk. vagy azonosításra szólítjuk fel őket. Ugyanennek a vállalatnak akkor el kellene utasítania minden olyan ügyfelet. költséget és biztonságot tekinthetjük egymással versenyző céloknak. pénztárcánktól. teljesítmény. és helyezzük őket egy széfbel Szá­ mítógépeink elérhetősége és használhatósága azt követeli meg. költség és teljesítmény között szükségszerűen átváltás áll fenn. A felek által küldött üzeneteknek manipulációbiztosnak kell lenniük. hogy a Kukuryin Bt. Tanulmányozni kell a köztük fennálló átváltásokat. A rendszerünket biztonságosabbá tevő szoftver . ha túl gyakran frissíteni kell. költség és biztonság Az internet jellegéből adódóan veszélyes. víruskereső vagy teljes körű naplózás-futta­ tása erőforrásokat igényel. Egyszeri tranzakcióknál.com/) vagy a Thawte (http://www.com/). behatolásmegelőző rendszer. akkor egyúttal annak használhatóságát is csökkentjük.236 15. adat Az ezek védelméért felelős személyek A biztonság szabványai és a mérőeszközök. használhatóság. például bíróság előtt a másik fél tettét. A védeni kívánt információkról. például egy e-kereskedelmi oldal és egy hitelkártyával fizető. új vásárló közötti első kapcsolatfelvétel esetén azonban ezek nem annyira praktikusak.szoftver. és megfelelő döntéseket hozva kell kompronússzumra jutni. Úgy lehet ezt elképzelni. hogy ezzel biztonságosabbá tegyünk valamely szolgáltatást. weboldalak letöltésére vonatkozó kérés. ha bizonyítani tudjuk. hogy másféle kapcsolódási tÍpusokat kíséreljenek meg. húzzuk ki a hálózatból. minthogy elveszítsenek egy üzleti lehetőséget.például az SSL-kapcsolat egy weboldalhoz-a hagyományos 15 kapcsolamál nagyobb processzorteljesítményt igényel. A gyakorlatban azonban ritkán ez a helyzet. Folyamatos kapcsolarban lévő üzletfelek közötti tranzakciók esetén a digirális tanúsítványok és a titkosított vagy aláírt kom­ munikáció hatékony módja a letagadhatóság korlátozásának. üzenetet küldött nekünk. Nem sok hasznát vehetjük annak. de arra nincsen bizonyítékunk.verisign. mint a VeriSign (http://www. használhatóságot. ez nem feltétlenül igaz. akkor kapcsoljuk kí szánútógépeinket. aki nem hajlandó ugyanezzel a módszerrel bizonyítani azonosságát? Kis értékű tranzakciók esetében a kereskedők inkább hajlandóak elviselni a csalás vagy letagadás bizonyos szintű kockázatát.

így az ezekkel felszerelt speciális számirágépek használatára korlátozná a felhasználókat. hogy a rendszeren dolgo­ zik. Bizonyos szintű azonosítást garantálnak. A felhasználóknak el kell mondani. Rengeteg könnyen kitalálható jelszó létezik. A hitelesítési mechanizmusok a népszerűbb böngészökbe és webszerverekbe be vannak építve. de mint a biztonsági intézkedések cöbbségénél. Felhasználói név és jelszó kérése esecén böngészőnk a 15. A hitelesítési módszerek jelszavakat.például ujjlenyomat-leolvasást-. hogy saját maguk határozzák meg jelsza­ vukat. nagyjából minden második könnyen kícalálható jelszót válaszr. akkor a rendszer jogosan feltételezi.és nagybecűk használa tát. 15 �� - � Entn-usemame•od�dfor"Dft'Aiu" UsetN1me ll PMSWOrd: � Usi!! Peuword MaMget ta remBnba' this p!IHWOI'd. önmagukban nem alkalmasak erős felhasználói azonosításra. A hitelesítése többféleképpen megvalósíthacjuk. és soha ne tegyenek például olyan butaságot. Különösen akkor. hogy senkí más nem ismeri és nem tudja kitalálni a jelszót. A jelszó egyszerűen működik.felhasználói név-jelszó páro­ kat szerezni. amit annak rendje és módja szerint kiragaszeanak monicorukta. mint hogy felhasználói nevüket és jelszavukat felírják egy öntapadós jegyzeccédulára. ha az új jelszavakac összehasonlítjuk a szótári szavakkal. Elsősorban a szótári szavakat vagy a felhasználói névvel megegyező jelszót kell itt megemlítenünk.2 ábrán látható párbeszédablakhoz hasonlót jeleníthec meg. különleges beviteli eszközt nem igénylő felhasználói hitelesítése tesz­ nek lehetövé. aki azt állítja. szabálysze­ rűen eljáró felhasználó nem fogja tudni megjegyezni a jelszavát. hogy jelszava­ ik számokat és különleges karaktereket is tartalmazzanak.arra. A jelszavakat elektronikusan is meg lehet szerezni. a rendszer biztonságos. Ha megengedjük a felhasználóknak.2 ábra: A böngészők Jelhasználói nevet és jelszót kérnek a kiszolgáló védett könyvtárát Jelkeresni kívánóJelhasználóktól. Az interneten ezek közül csak két módszer.Az e-kereskedelem bizronsági kérdései 237 A felhasználói hitelesítés alapelvei AJelhasználói hitelesítés (authentication) megkísérli bizonyítani. A jelszavakta vonatkozó szigorú szabályok veszélye. Az általuk kínálc biztonsági szinc nem feleédenül felel meg a nemzetvédelem számára. A jelszavak egyszerűen megvalósítható és használható. A webszerver például fel­ használói nevet és jelszót kérhec azoktól a személyekcől. A nehezen megjegyezhető jelszavak növelik annak valószínűségéc. a jelszavak és a digitális aláírások használata terjede el. hogy valaki tényleg az. hogy a felhasználók olyan.és szaktak is . és tudja jelszavunkat. �L-ew•J 15. vagy megköveteljük bennük számok vagy különleges karakterek vagy kis. hogyan válasszanak maguknak biztonságosabb jelszóc. de ideális. A használhacóság oleárán áldozva kötelezhetjük a felhasználókat arra.mondjuk. ám nagyfokú biztonságot igénylő rendszerekhez nem elégségesek. akinek mondja magát.használó ellenőrzéseket folyeaenak le. hogy megadják jelszavukat a telefonban egy olyan személynek. hogy számos. hogy mi vagyunk ez a látogató. hogy minél biztonságosabb a kivá­ lasztott módszer. illetve hardvereszközöket. akik a kiszolgáló adort könyvtáraiban lévő fájlokta vonatkozó kérést intéznek. Mi magunk és a rendszer tudja a jelszót. A jelszavak minden potenciális hibájuk ellenére egyszerű és viszonylag hatékony módszert kínálnak felhasználóink ellen­ őrzésére. nem biztonságos lépéshez fo­ lyamodnak. ha a különböző rendszerek eltérő szabályok betartását kérik tőlük jelszavaik lécrehozásakor. hogy soha ne írják le jelszavaikat. Érdemes továbbá tájékoztatni a felhasználóinkac. de núntegy 25 százalékuk még ebben az esetben is könnyen kícalálhacó jelszót választ. itt is igaz. Ez megfelelő. sőt akár kívánatos is lehet egy szervezet belső rendszereihez való hozzáférés esetén. Feltéve. A biomecrikus ellenőrzés és a hardveres megoldások többsége egyedi beviteli eszközöket igényel.például smart kártyákat . Könnyen kitalálható jelszavak használatát úgy tudjuk megakadályozni. Mindazonálcal a jelszavak használata számos potenciális gyengeséget hordoz magában. A jelszavak ilyetén ellopásának Iehetőségéc a hálózari forgalom titkosításával lehet korlácozni. . biometrikus ellenőrzéseket. de általuk elveszne a rendszer interneten keresztüli elérhetőségéből adódó előnyök nagy része. annál körülményesebb használni. digitális aláírásokat. hogy ellenőrizzük egy ügyfélrendelés Iciszállítási állapotát. A crackerek billentyűleütéseket figyelő program futtatásával vagy a háló­ zati forgalmac csomagfigyelő (packec sniffer) segítségével megvizsgálva képesek . Ha egy látogató magunknak adja ki magát.

bár a folyamar szempontjából nincsen jelentősége an­ nak. A titkosítás alapjai A titkosítási algoritmus (encryprion algorithm) matematikai eljárás az információ látszólag véletlenszerű karaktersorrá alakítá­ sára. Számtalan különbözö titkosítási algoritmus létezik. A moror titkosírott szöveget állít elő. Így a kilencvenes években már szinte minden területen megtalálható volt. Régeb­ ben az átlagember csak II. me 2-ként eleároita ezt. hogy az egyszerű és a titkosított szöveg között semmi szemmel látható hasonlóság nincsen. A fordírott folyamatot A 15.4 ábrán a kétirányú titkosítási folyamarot láthatjuk. mint a beépített hitelesítés. A 15. például az RSA. Látható. fejezer Az Apache webszerver és a Microsoft IlS is lehetövé teszi. Az egyszerű szöveget beadjuk egy titkosíró motornak. A 15. Ehelyett kisérletnél megadott jelszót. világháborús filmekben és kémregényekben találkozott titkosírással. Létrehoztunk egy felhasználót. a rendszer titkosírja a bejelentkezési visszafejtésnek (decryprion) nevezzük. vagy a felhasználó szempontjából tetszetösebb módon állharunk elő az ellenőrzésre vonatkozó kéréssel. A felhasználó által bevitt jelszó ellenőrzéséhez nem szükséges visszafejteni az eltárolt jelszót.ténylegesen szöveget vagy más adatot. . azt alakí�a vissza egyszerű szöveggé. titkosított szöveggé alakí�a. Rengeteg jelszót tárolnak egyirányú titkosítási algoritmussal. és látszólag véletlenszerű karaktersorból álló. az Apache titkosírotta. hogy mit tartalmaz az információ . például a DES. A titkosított információt titkosított szövegnek (ciphertext) nevezzük. és látszólag véletlenszerű karaktersorból álló. akínek jelszava j els z o. (Működését a következő fejezetben mutatjuk be. A MySQL használata gyorsabb. ám az elmúlt években már az újságcikkekben is olvashattunk róla.4 ábra: A titkosítás fogja az egyszerű szöveget. PHP vagy MySQL használatával is elérhetjük ugyanezt az eredményr. Ez a titkosítási módszer nem visszafordítható. és összehasonlítja az eredeti titkosított változatával. nyilvános kulcs és külön privát kulcs segítségével müködnek. hogy honlapunk egészét vagy részeit igen egyszerűen megvédjük ezzel a módszerrel. és nap mint nap használja mindenki. A kiinduló adarot szokás egyszerű szövegnek (plain text) nevezni. A ritkosírás (kriptográfia) majdnem 4000 éves.3 ábrán a titkosítás egyszerű folyamatábráját láthat­ juk. de nagykorúságát csak a Il. Azóta a számítógépes hálózatok elterjedéséhez hasonló utat járt be: először a katonaságnál és a pénzügyi szervezeteknél. majd az 1970-es évektől kezdve egyre szélesebb körben alkalmazták. 15 15. Nem az összes. má­ sok. ma azonban szinte kivétel nélkül számítógépes program. PHP segítségével rugalmasabb ellenőrzést működtethetünk. mint például a Il. Vonatkozó példákkal a Hitelesítés megvalósítása PHP-vel és MySQL-lel című 17. majd aWDuA3X3H. világháború idején érte el. de sok ritkosírási folyamat visszafordítható. amelyik titkos (privát) kulcsot használ. A visszafejtés a titkosított szövegböl indul ki. Titkosító algoritmus 15. amely régebben mechanikus eszköz volt. Van olyan.2 ábrán látható ellenőrzési párbeszédablakot használó védett könyvtár létrehozásához az Apache legegyszerűbb el­ lenőrzési médszerét használtuk. világhá­ borúban használt Enigma. noha legkevésbé szakott szövegnek látszani. akí az interneten vásárol.238 15. fejezetben találkozunk majd.3 ábra: A titkosítás fogja az egyszerű szöveget.) Ez tárolásuk előtt titkosírja a jelszavakat. titkosított szöveggé alakí�a.

nyilvánosan megosztható. mint a DES. Ezt a módszert az IBM fejlesztette ki a hetvenes években.kulcsú titkosítás azon alapul. A titkos kulcsú titkosítás egyik nyilvánvaló problémája. a szabadalom azonban 2000 szeptemberében lejárt. a privát kulccsal pedig visszafejtjük azokat. Az. • Megjegyzés: Furcsának tűnhet. áttörés következett be ezen a téren. amellyel a kommunikáció további részét bonyolítják.Az e-kereskedelem biztonsági kérdései 239 Privát kulcsú titkosítás A privát . kitől jött az üzenet. A legszélesebb körben használt privát kulcsú algoritmus a Data Encryption Standard (DES. a küldő (aki titkosírja az üzenetet) és a fogadó (aki visszafejti azt) is ugyanazzal a kulccsal rendelkezik. hogy feljogosított személyek ismernek egy kulcsot. hogy biztonságos üzenet küldéséhez biztonságos módszerre van szükség. akinek megadjuk nyilvános kulcsunkat. így a DES körül­ belül1998 óta használaton kívül van.4 ábrán látszik. de a Triple DES kétszer olyan biztonságos. és az üzleti és nyilvános kormányzati kommunikáció amerikai szabvá­ nyává vált. . hogy harmadik személy megszerzi. Az RSA szabadalommal védett rendszer volt. aki hozzáfér a titkos kulcshoz. és nem kell aggódni. jól ismert titkos kulcsú rendszerek közé az RC2. Nyilvános kulcsú titkosítás A nyilvános kulcsú titkosítás két különböző. az RC5.Adattitkosítás-szabvány). A bonyolultabb felállást ellensúlyozza. Amennyiben csak mi rendelkezünk a privát kulccsal. ahogy neve is utal rá.más néven titkos. A számítási sebesség azonban napjainkban már nagyságrendekkel gyorsabb. Az üzenet megérkezésekor a fogadó a küldő nyilvános kulcsával tudja visszafejteni azt. Bárkí.5 ábra: A nyilvános kulcsú titkosítás külön-külön kulcsot használ a titkosításra és a visszafejtésre. Ha háromszor erősebb-védelemre lenne szükségünk. jogosulatlan személyek is olvasni tudják titkosí­ tott üzeneteinket. Digitális aláírások A digitális aláírások a nyilvános kulcsú kriptográfia témaköréhez kapcsolódnak. Ha létezik biztonságos módszer a kulcs elküldésére. Amennyibe illetéktelenek kezébe kerül. programot kellene írnunk rá. de három különböző kulccsal háromszor alkalmazza. miért nem küldjük úgy az üzenetet is? Szerencsére1976-ban. illetve hogy nem módosították-e. Gyakran vegyes rendszert működ­ temek: nyilvános kulcsú rendszerrel küldik a kulcsot a titkos kulcsú rendszerhez. mint 1970-ben volt. Shamir és Adelman által1978-ben kifejlesztett RSA. a kettes kulccsal visszafej ti. Az egyszerű szöveget az egyes kulccsal titkosírja. a nyilvá­ nos kulccsal titkosítjuk az üzeneteket. Mivel a küldő az egyetlen személy. Az egyéb. senkí más nem lesz képes visszafejteni az üzenetet. mint a DES. hogy a titkos kulcsot is elküldhessük. ám a nyilvános és privát kulcsokhoz képest forditott szerepet töltenek be. vagy hozzáfér­ nek. a fogadó viszonylagos bizonyossággal meg tudja állapítani. A küldő titkos kulcsával titkosírja és digitálisan aláírja üzenetét. vagy ötszörös DES-algoritmust kellene megvalósítanunk. az RC4. a Triple DES és az IDEA tartozik. Ezt a kulcsot titokban kell tartani. képes lesz nekünk biztonságos üzenet küldeni. Ugyanazt az algoritmust használja. 15 15. Ahogy a15. komoly előnyt jelent. A legelterjedtebb nyilvános kulcsú algoritmus az MIT-n dolgozó Rivest. Ennek ellenére a titkos kulcsú rendszereket továbbra is széles körben alkalmazzák. A rendszer előnye. amikor Diflie és Hellman előállt az első nyilvános kulcsú rendszerrel.5 ábrán is látható. hogy a nyilvános kulcsot szabadon elküldherjük. m:lJd a hármas kulccsal megint titkosítja. Ahogy a15. hogy a nyilvános kulcs. hogy a titkos kulcsú rendszerek mintegy ezerszer gyorsabbak a nyilvános kulcsúaknál. egy nyilvános és egy privát kulcson alapul. A Triple DES igen biztonságos.

hogy bár az üzenet titkosírva van. azaz természetes személyhez vagy céghez rudjuk kötni azt a felhasználót vagy kiszolgálót. aki aláírta. mint az. ha meg rudunk bizonyosadni arról.thawte.CA) nevezzük. ami szinte minden esetben megbízhatóbb. hogy ha becsapnak bennünket. A digitális tanúsírvány aláírt.titkosítási algoritmus­ sal. hogy megbízható harmadik személy ellenőrizze a résztvevők azonosságát és a tanúsítványaikban rögzített adatokat. Az aláírást a küldö nyilvános kulcsával fejtjük vissza. Secure Sockets Layer protokollon keresztüli.240 15. Fontos tisztáz­ ni. Digitális tanúsítványok Praktikus. Ha a visszafejtett hash érték megegyezik az általunk elöállí­ tottal. Nem az algoritmus által kiszámított érték a fontos. hagyományos. de sok más ilyen szervezet is működik. A szervezerek tanúsítványt adnak ki arról. A két legismertebb CA a VeriSign (http:/ /www. Fontos megjegyezni.com/). jelentősen olcsóbbak. Üzleti tranzakciók esetén arra van szükség. ha létező ( jogi) személyhez. amelyekről tu<ljuk. f�ezer A digirális aláírások rendkivül hasznosak rudnak lenni. hogy a gyors hash függvénnyel elkészítjük a teljes üzenet üzenetkivonatát. Ezt követően a küldő által használt módszerrel hash értéket hozunk létre az üzenethez. hogy a tanúsírvány nem a megbízhatóságról vagy hitelképességről szál. általában egy másik típusú algoritmust. az algoritmus pedig gyors. nem pedig a beleolvasás megelőzése. Amennyiben rni megbízunk a tanúsító szervezetben. Pusztán arról van szó. verisign. Ezért a digitális aláírás létrehozásának szokásos mó<lja. akkor viszonylag jó eséllyel birtokunk­ ban van egy valós fizikai cím és valaki. hogy a kapott üzenetet nem manipulálrák. A tanúsítvány nem garancia arra. például a Nerwork Solutiens (http:/ l www. digitális formában kombinál egy nyilvános kulcsot és az adott személy vagy szervezet adatait. és ugyanígy megbízharunk azokban is.com/) és a Thawte (http://www. hogy a kivonat nincsen manipulálva. akikben ez a szervezet megbízott.com/). vagy egy üzenetsorozat adott fel­ használóról vagy géptől érkezett. Bárki létrehozhat és aláírhat olyan tanúsítványt. a titkosítás célja itt a hamisítás és küldés letagadhatóságának megakadályozása.com) és a GoDaddy (http://www. biztonságos kommunikációhoz használharunk Apache webszervert.godaddy. és ismerjük a másik fél adatait. Jól ismert CA által kiadott tanúsírvány birtokában a böngészők figyelmeztető ablak megjelenítése nélkül rudnak SSL-kapcsolatot teremteni oldalunkhoz. Az SSL-kapcsolator lehetövé tevő webszervereket biztonságos webszervereknek nevezik. A hash függvény (magyarul hasító függvénynek is szokás nevezni) a neki áradott bármely üzenethez kiszámírja az ahhoz tartozó üzenerkivonatot (message digest) vagy hash értéket. az aláírások pedig megnehezítik a küldö számára az üzenetküldés leragadását. vagyis egy adott bemenet (üzenet) rnindig ugyanazt a kimenetet eredményezi: a kimenet kicsi. mint az IlS. Az ilyen harmadik személyeket tanúsító szervezeteknek (certifying authoriry. hogy biztosak lehetünk abban. hogy a tisztesség és megbízhatóság érzetét keltsék az e-kereskedelmi oldalak látogatóiban. hogy az üzenetet nem hamisították-e meg . majd csak ezt a rövid kivonatot titkosítjuk a nyilvános kulcsú . hogy ellenőrizték az adott személy vagy cég (személy)azonosságát. a nyilvános kulcs birtokában bárki által olvasható. Az aláírás most már az üzenettel együtt. nem biztonságos módon is küldhető. Biztonságos webszerverek A böngészökkel folytatott. hogy az üzeneret nem hamisírotrák meg. . Az üzenet és az üzenetkivonat birtokában meggyő­ ződhetünk arról. A fogadó bizonyosságer kaphat. hogy az információ csak annyira megbízható. A Thawte a VeriSign tulaj­ donában van. Microsoft liS-t vagy bármilyen más ingyenes vagy fizetős webszervert. A digitális tanúsítványok leggyakoribb használati célja. a küldö üzenetét senki sem módosította. hogy ő ez és ez. Egyes más szervezetek. hogy a kimenet egyértelmű hozzárendelés eredménye. A tanúsítványok bizalmi hálózator hoznak létre. Üzleti kapcsolatok esetén ennél is hasznosabb. Mivel a nyilvános kulcsú titkosítás nagy üzenerek esetében viszonylag lassú. Az Apache lehetövé teszi Unix­ szerű operációs rendszer használatár.nerworksolutions. A tanúsírvány birtokában rendelkezünk a másik fél nyilvános kulcsával arra az esetre. Természetesen választhatjuk azt is. úgyne­ vezett hash függvényt használnak a hatékonyság növelésére.és éppen ezért lassú . megbízható partner. hogy nem lettek megváltozrarva. ám kissé bonyolulrabban beállítható. hanem az. akikben a tanúsítvánnyal rendelkező fél is megbízott. A gond legfeljebb annyi. és kevés gyakorlati különbség van a kettő között. ha titkosított üzenetet akarunk küldeni. amely azt állítja. aki ellen jogi úton felléphetünk.feltéve. A hash függvény az adott üzenetnek megfelelő üzenerkivonatot állít elő. A leggyakrabban használt hash függvény az MDS és az SHA. akkor megbízharunk azokban is. Ezek azonosságuk ellenőrzése 15 után digitális tanúsírványokat adnak ki magánszemélyeknek és cégeknek. Aláírt üzenet érkezésekor ellenőrizhetjük azt. hogy üzletfelünk tisztességes. Noha ugyanazokar a módszereker és kulcsokar használja. hogy Windows platforrnon használjuk az Apache-t.

Az SSL használatát saját digitális tanúsítványunk létrehozása után akár azonnal megkezdhetjük. hogy eltün­ tesse nyomait. Az SSL érdemi használa­ tához tanúsító szervezet által kiadott tanúsítványra lesz szükségünk. de nem olyan egyszerűen. például a konfigurációs fájlokhoz vagy az NT-Registryhez való hozzáférések tartoznak. Az auditálási folyamatnak vagy valós időben vagy rendszeres időközönként kell megtörténnie.érdekes" események után kutamnk bennünk. az Apache és az IIS telepítési utasításait A PHP és a MySQL telepítése című Függelékben találjuk.Az e-kereskedelem biztonsági kérdései 241 Az SSL IIS-en történő használatához telepíteni kell az IlS-t. A Stronghold és az IlS párbeszédablakok segitségével vezet végig a folyamaton. és a szóban forgó domainnév a mi tulajdonunkban van. majd telepíteni kell tanúsítvá­ nyunkat. hogy tanúsítványunkat mi magunk írtuk alá. Ennek folyamata kiszolgálónként eltérő. ha az Apache fizetős változatát vásároljuk meg. Tanúsítvány-aláírási kérelmet (CSR) is elő kell állítanunk. Ha a problémák észlelésére és naplózására vonatkozó kritériumok meghatározásakor túlzott biztonságra törekszünk. amely a következőhöz hasonlóan kell. Stronghold nevű terméket. hogy valamely tanúsító szervezetnél tanúsít­ ványért folyamodjunk. hogy külön gépen naplózzuk az eseményeket. A nagy naplófájlokkal csak úgy boldogulhamnk. Ez azt jelenti. hogy hol találja. az egyes adatfájlokhoz. A végleges tanúsítvány az itt látható CSR-hez nagyon hasonló szövegfájl. A Unix lehetőséget ad arra. Apache esetében az OpenSSL csomagot is telepíteni kell. de általánosságban elmondható. ered­ ményül rendkivül nehezen kezelhető. Ilyen meg­ oldás beszerzése esetén a Linux megbízhatóságát és egy könnyen telepíthető terméket kapunk a forgalmazó müszaki támoga­ tásával kiegészítve. hogy fizikai címmel rendelkező. hogy bizonyítani kell a szervezet felé. hogy kinézzen: ---BEGIN NEW CERTIFICATE REQUEST--­ MIIBuwiBAAKBgQCLnlXX8faMHhtzStp9wY6BVTPuEU9bpMmhrb6vgaNZy4dTe6VS 84p7wGepq5CQjfOL4Hjda+g12xzto8uxBkCD098Xg9q86CY45HZk+q6GyGOLZSOD 8cQHwhloUP65s5Tz0180FB zpi3bHxf06aYelWYziDiFKp1BrUdua+pK4SQIVAPLH SV9FSz8Z7IHOg1Zr5H82oQOlAoGAWSPWyfVXPAF8h2GDb+cf97k44VkHZ+Rxpe8G ghlfBn9L3ESWUZNOJMfDLlny7dStYU98VTVNekidYuaBsvyEkFrny7NCUmiuaSnX 4UjtFDkNhX9j5YbCRGLmsc865AT54KRu3102/dKHLo6NgFPirijHy99HJ4LRY9Z9 HkXVzswCgYBwBFH2QfK88C6JKW3ah+6cHQ4Deoiltxi627WN5HcQLwkPGn+WtYSZ jG5tw4tqqogmJ+IP2F/5G6FI2DQP7QDvKNeAU8jXcuijuWo27S2sbhQtXgZRTZvO jGn89BC0miHgHQMki7vz35mx1Skk3VNq3ehwhGCvJlvoeiv2J8X2IQIVAOTRp7zp En7QlXnXwls7xXbbuKPO ---END NEW CERTIFICATE REQUEST--- A CSR. A Red Hat éveken keresztül forgalmazott egy ilyen. de érdemes lehet külső auditálással rendszeresen ellenőrizni a rendszer­ gazda munkáját. A végeredmény egy titkosított CSR. mint például az su (amivel egy másik felhasználóvá. Célunkat úgy is elérhetjük. a fizetendő díjak és a személyazonosságunk igazolásához szükséges dokumenmmok. A rendszergazda is végezhet rendszeres auditálást. A problémák észrevétele után ezek tájékoztatást is adhatnak arról. ám ebben az esetben a böngészők figyelmeztetni fogják oldalunk látogatóit. . A naplófájlok esetében a két legnagyobb nehézség a méretük és a valóságtartalmuk. illetve a domainnév használa­ tára való jogosultságunkat igazoló dokumenmmok birtokában készen állunk arra. Az erre vonatkozó utasí­ tásokat a tanúsító szervezet honlapján találj uk. Apache esetében azonban nekünk kell beírni a parancsokat. A biztonsági szempontból érdekes események közé a hálózati hibák. mint a Unix. és a szerverszoftver telepítésekor a mod ssl modult is be kell kapcsolni. létre kell hozni egy kulcspárt. Miután a szervezet kiadta tanúsítványunkat. el kell tárolni rendszerünkön. Ha a támadó rendszergazdai jogosultságok­ kal fér hozzá rendszerünkhöz. amely ma már a Red Hat Enterprise Linux termékekkel egy csomagban kapható. jogszerűen működő vállalkozás vagyunk. például rendszergazdává válharunk Unix rendszeren). hogy a crackernek legalább két gépet fel kell törnie ahhoz. A tanúsítvány megszerzésének pontos folyamata tanúsító szervezetenként eltérő. A Windows is kínál hasonló funkciót. hatalmas méretü naplókat kapunk. A két legnépszerűbb webszerver. és az olyan prograrnak meghívása. és közölni kell a webszerverrel. A folyamat lényege azonban minden kiszolgáló esetén ugyanaz. a naplófájlokat szabadon módosítva eltüntetheti a nyomait. A naplófájlok különösen nagy mértékben ki vannak téve a támadás veszélyének. 15 Auditálás és naplózás Operációs rendszerünk képes a különféle események naplózására. ha erre szolgáló eszközzel vagy a biztonsági házirendből kidolgozott auditkódokkal .. hogyan történt a probléma vagy a betörés. A naplófájlok segitségével a megtörténtekor észlelhetjük a hibás vagy rosszindulatú viselkedést.

Teljesen statikus tartalom esetén elég biztonsági mentést az oldal módosításkor készíteni. . Az AMANDA-ről a http:/ /www.org/ oldalon bővebben olvashatunk.amanda. Az ésszerű méretű oldalakat RAID technológiával rendelkező. más eseményekre pedig megadhatjuk. de ha saját fejlesztésű webes szaftverünk elvész. megállítja vagy visszautasítja. tükrözése tárnagami képes kíszolgálón érdemes tárolni. A hardvereket és az in­ gatlanokat lehet biztosítani és pótolni. amely pótolni tudja. A MySQL adatbázis biztonsági mentésére és helyreállítására vonatkozó részletes utasításokat a Haladó MySQL­ adminisztráció című. az áramkimaradás és a hálózati leállások ellen. A tűzfal célja. a (kétbal­ kezes vagy rosszindulatú) emberek. gyakran változnak. Gondoljunk bele azonban az olyan helyzetekbe. Klimatizálásra van szükség. MySQL adatbázisunk biztonságimentése és helyreállítása Élő adatbázisról bonyolultabb biztonsági mentést készíteni. forrás. ha onLne fogadjuk a megrendeléseket. A tűzfal lehet hardvereszköz. nincs az a biztosítótársaság. például szűrőszabályokat használó router (útválasztó). Mindkét esetben két hálózathoz kell kapcsolódnia. Biztonsági mentés készítése az adatokról A katasztrófa-helyreállítási tervben nem lehet eléggé hangsúlyozni a biztonsági mentések fontosságát. hogy a hálózarunkban lévő számítógépeket védje a külső támadástól. géppel vagy épülettel történik valami! Az oldal frissítésének megfelelő gyakorisággal érdemes külön biztonsági mentéseket készíteni. nem adatbázisfájlokróL A leginkább széles körben használt. hogy hálózarunkat elválasszuk a külvilágtól. és védekezni kell a tűz. Számos Unix-disztribúcióban alapértelmezésben megtalálliató. amikor módosítás alatt áll. amelyekről könyvünk szól. azon gépek körét. mennyire dinan1ikusan módosul az oldalunk. hogy naplóbejegyzéseket vagy riasztásokat kezdeményezzenek. A tűzfal az egyik hálózatból a másikba igyekvő forgalmac figyeli. Emellett korlátozza a tűzfalon kívüL Felhasználók és gépek tevékenységét. Fizikai biztonság Az eddig megvizsgált biztonsági fenyegetések olyan kézzel nem megfogható dolgokra vonatkoztak. ingyenes eszköz a Marylandi Egyetem által kifejlesztett AMANDA (Advanced Ma­ ryland Autamated Network Disk Archiver). Szűri és nem engedélyezi a szabályainak nem megfelelő forgalmat. illetve a sávszélesség költségeinek leszorítása érdekében proxykíszolgáló használatára kényszerítheti őket. mint az egyszerű fájlokróL Az adatbázis máselását kerülni kell rninden olyan pillanatban. 15 Biztonságimentés készítése általános fájlokról A rendszerek többségén dedikált szaftver segitségével igen egyszerűen készíthetünk biztonsági mentést HTML és PHP kód­ jainkról. 12. A csomagok szűrhetők típusuk. Ha megfelel a tűzfal szabályainak. Weboldalunk összes alkotóeleméről. leckében tárgyalruk.és célcímük vagy portinformáció alapján. a hálózati tűzfalakkal megelőzhető. így tűzvész. a kódokról és az adatbázisokról is rendszeresen biztonsági mentést kell készíteni. és szabályok alapján kell müködnie. ha nem. hogy a baj hálózarunkban is elterjedjen. A tűzfal esetenként az azon belüli személyek tevékenységét is behatárolja. vagy számítógépen futó szoftver. Ahogy az épület vagy az autó tűzfala megakadályoz­ za a tűz tovaterjedését. Képes korlátozni az emberek által használt há­ lózati protokollokat. képeinkről és egyéb.242 15. fejezet Tűzfalak A tűzfalakat arra használjuk. így a statikus oldalakról. és SAMBA segítségével windowsos gépek biztonsági mentéséhez is használható. átvezeti a másik hálózatba. amelyekhez csadakozhatnak. A kívánt gyakoriság attól függ. különösen abban az esetben. rnint a szoftver. Az olyan típusú oldalak azonban. de nem szabad megfeledkeznünk rendszerünk fizikai biztonságáról sem. Ez­ zel védve vagyunk a merevlemez tönkremenése esetére. az oldalakat lehet máshol tárolni. lopás vagy természeti katasztrófa esetén is lesz mihez nyúl­ nunk! Rengeteg információforrás található a biztonsági mentésekről és a helyreállításróL Figyelmünket most a PHP-vel és MySQL adatbázissal létrehozott oldal biztonsági mentésére korlátozzuk. Egyes csomagokat a tűzfal egyszerűen el­ vet. Ezeket külön adathordozón és ideális esetben más biztonságos helyszínen tároljuk. arnikor a teljes merev­ lemeztömbbel.

Egy hasonló vállalkozások százainak számítógépeit tároló és üzemelterő léte­ sítmény számára azonban igen. mint a tűz. kik az ellenségeink. így az új tűzvédelmi rendszereknek más. A váratlan. fejezetben részletesebben foglalkozunk a webes alkalmazások biztonságáva!. rövid áramkimaradások legtöbb helyen az élet velejárói. Ennek alapja. több redundáns hálózati kapcsolat vagy tűzvédelmi rendszer fenntartása. Működésünk méretétől függően ez lehet helyiség vagy szekrény. hogy gépeinker bizonyos díj ellenében egy e célra kialakított létesítményben helyezzük el (angolul co-locationnek is nevezik ezt a szolgálratást). Az áramkimaradáshoz hasonlóan a néhány perces vagy órás hálózati kimaradások is ellenőrzésünkön kívül esnek. Megnézzük.hrml oldalon. A kér kapcsolat nyilván többe kerül. kevésbé káros alter­ naríva után kellett nézniük. de azt jelenti. és hogyan védjük meg magunkat tőlük. Hogyan tovább� A 16. A fentiek miatt érdemes lehet megfontolni. akiknek erre szükségük van. vagy boot lemez segítségével megkisérelhetik megkerülni a biztonsági mechanizmusokat. de elérhetők maradunk.epa. 15 . hogyan vécljük szervereinket.Az e-kereskedelem biztonsági kérdései 243 Rendszerünket biztonságosan bezárt helyen kell tartani. Ha há­ lózatunk működése igazán fontos számunkra. A "Montreali jegyzőkönyv az ózonréteget lebontó anyagokról" című egyezmény ma már tiltja a halon használatár. hogy hálózari hiba ese rén alacsonyabb kapacitással ugyan. érdemes lehet egynél több internetszolgáltatóhoz kapcsolódni. A rémáról bővebben is olvashatunk a http:/l www. és hogyan készüljünk fel a katasztrófákra. A sprinklerek (szórófejes. hogy a klimarizálás és számírógépeink is mű­ ködni tudjanak. be kell ruháznunk szünermentes tápegységbe (UPS). vízzel oltó berendezések) legalább annyi kárt tudnak tenni az elektronikában. Rendkívüli időjárás vagy föld feletti vezetékek eserén a hosszabb kimaradások is rendszeresek lehetnek. hogy egy közepes méretű vállalkozás számára nem minden esetben gazdaságos egy hosszabb ideig áramellátást bizrosíró szünermentes tápegység.gov/Ozone/snap/ fire/qa. A jogosulatlan szemé­ lyek szándékosan vagy véletlenül kihúzhatnak kábeleket. gázzal oltó rendszerekkel kezelték ezt a problémát. Régeb­ ben halont használó. Egyetlen gépet akár 60 percen keresztül táplálni képes szünetmentes tápegységet már 10 ezer forint környékén beszerezhetünk. Ha rendszerünk folyamatos működése fontos számunkra. A hosszú áramkimaradásokhoz genetátorra van szükség. Két szóba jöhető lehetőség az argon és a szén-dioxid. A hosszabb áramkimaradásokat kiváltó vagy több gépet ellátni képes tápegységek ennél azért többe kerülnek. hálózatainkat és kódunkat. Csak azoknak az alkalmazottaknak szabad ehhez a géphez hozzáférniük.

Az internechez csatlakoztatott rengeteg számítógép használói közöte kevésbé nemes szándékúakat is találunk. hogy a hitelkártyaadatokhoz. hogy néhány potenciális problémáról el fo­ gunk feledkezni). hogy milyen különböző médokon lehet rendszerünkkel visz­ szaélni. De az üzlet nem állhat meg.16 Webes alkalmazások biztonsága A fejezeeben folyeaejuk az alkalmazásbiztonság korábban megkezdett témáját: teljes webes alkalmazásunk biztonságossá té­ telének kérdéseit fogjuk megtárgyalni. amely az alkalmazás üzembe helyezése és a fejlesztés lelassulása. . az egész alkalmazást át kelljen alakítanunk (ráadásul szinte biztos. Éppen ezért szeretnénk csökkenteni a felhasználói jelszavak könnyű kitalálhatóságá­ nak és rendszerünk ebből adódó egyszerű feltörhetőségének kockázatát. a bankszámla-információkhoz vagy az egészségügyi nyilvántartáshoz hasonló bizalmas információkat kezelő webes alkalmazást a globális hálózat számára elérhetővé tesszük. hogy néhány napig dolgozzon az ügyön. Így elkerülhető az is. hogy csökkentsük az ilyen problémák bekövetkezésének valószínűségét. A biztonság az alkalmazás teljes tervezési folyamatának részét kell. netán teljes befejezése után is jelen van az alkalmazásban! Ha már rögtön az elején végiggondoljuk és felkészülünk rá. amiket az alkalmazásnak rudnia kell. ha szótári szavakat választanak. és nekünk. pláne abban az esetben. és nem tehetjük meg. fejleszeöknek nem elegendő csupán alkalmazásunk e. hanem a biz­ tonság megtervezéséhez és kezeléséhez szükséges megközelítést kell kialakítanunk. hogy kijelölünk egy fejlesztőt.kereskedelemmel kapcsolatos részeit biztonságossá tenni. A ránk leselkedő veszélyek tudatában félelmetes lehet akár csak belegondolni abba. és biztonságukat elősegítő stratégiát kell kidolgoznunk az alkalmazásfejlesztéshez. A lényeg. a biztonság nem lesz rajta ezen a listán. A biztonság és a használhatóság közötti egyensúly keresése Felhasználói rendszer tervezésekor a felhasználói jelszavak azok. A fel­ hasznáJók gyakran válaszeanak olyan jelszavakat.egyben az egyik legnagyobb fejfájást is okozza a webes alkalmazásfejleszcőknek. amikor végre foglalkozni kezdünk a biztonsági problémákkal.az összes gép egymással szembeni nyitottsága és elérhetősége . hogy később. úgy tervezhetjük meg kódunkat. hogy képezze. A fejezetben az alábbi főbb témakörökkel foglalkozunk: Biztonságkezelési stratégiák A ránk váró fenyegetések azonosítása Kikkel állunk szemben? Kódunk biztonságossá tétele Webszerverünk és a PHP biztonságossá tétele Az adatbázisszerver biztonsága Hálózatunk védelme Katasztrófa-elhárírási terv készítése Biztonságkezelési stratégiák Az internet egyik legnagyszerűbb jellemzője . működő alkalmazás igénye között. vagy a támadók milyen módszerekkel törhetik fel azt. és elkészítjük azon funkciók listáját. amelyeket megfelelő szaftverrel nem különösen nehéz feltörni. Megf elelő gondolkodásmód már a tervezéstől A biztonság nem egy funkció. Webes alkalmazásaink minden egyes porcikáját védeni kell a lehetséges visszaélésektől (legyen azok véletlenek vagy szándékosak). amelyek igazán aggodalommal tölthernek el bennünket. Ha webes alkalmazást fejlesztünk. hogy megfelelő egyensúlyt calál­ junk a védelem szükségessége és a tényleges üzletvitelhez elengedhetetlen. olyan soha véget nem érő erőfeszítés legyen.

Bizalmas adatok elérése vagy módosítása Webes alkalmazásfejlesztőként vagy programozóként feladataink közé tartozik. a biztonság megőrzését elősegítő funkciókar tervezzünk bele� Ha mindenképpen nevet szeretnénk adni neki. hanem telepíré­ sük és konfigurálás uk is. hogy senki sem venné a fáradságot. alacsony biztonsági szintű rendszer vonzó lehet a felhasználék számára. Állandó éberség. A biztonság ré­ szér képezi a rendszer működés alatti felügyelete.bizonyos érrelemben . . hogy csak azokat az információkat tekinthes­ sék meg. rendszerünk fejlesztése és gyors válaszlépés a problémákra . A biztonság. Azt is megkövetelhegük tőlük. amelyek a rendszer használhatóságát nem aránytala­ nul megnehezítve fokozzák a biztonságát.olyan csata. Sajnos rendszerünk annyira biztonságos lenne. amelyek védtelenül hagynak bennünker a támadásokkal szemben. Ugyanígy egy rendkívül robusztus biztonsági jellemzőkkel bíró és ebből következően szinte használharadan rendszer kevés felhasználó számára lesz elfogadható.). fejezetben (Az e-kereskedelem biztonsági kérdései) számos. Ha online részvény. adóazonosíró jel stb. rnilyen és hány értékpapírral rendelkeznek. online üzleti alkalmazásainkat célzó biztonsági fenyegetést megismerhettünic Ebben a fejezetben ezek közül néhányra fogjuk figyelmünket összpontosítani. különböző jelszót kérő bejelentkező abla­ kon keresztül lépjenek be. amir soha nem lehet megnyerni. amíg átkűzdenék magukat a belépési folyamaton. hogy használja . mégpedig úgy. lentről felfelé haladó megközelítésnek (bortom-up) hívhatnánk. sajnos. hogy a szigorítás egyszerűen nem érte el célját. Meggyőzödünk arról. hogy nem csak az ezekkel az alkotóelemekkel való kapcsolatfelvételeink biztonságosak. Alapvető megközelítésünk Hogy az ésszerű erőfeszítéssel és időráfordítással elérhető legteljesebb biztonsági megoldást kapjuk. sőt akár a bankszámla-információkhoz is hozzáférnek. a naplók és egyéb fájlok figyelemmel követése. kérféleképpen kell a biz­ tonsághoz közelíreni.246 16. 16 A ránk váró fenyegetések azonosítása A 15. Csak a működést közelről felügyelve (vagy ezt a feladatot helyetrünk ellátó eszközöket megírva és futtatva) azonosítharjuk a folyamaros biztonsági problémákat. hogy lássuk. és hogyan használják. hogy más felhasználék adataihoz nem szabad hozzáférniük. Ebben alkalmazásunk különböző alkotóelemeir. ám nagyobb valószínűséggel számítha­ tunk ebből adódó biztonsági problémákra és üzleti leállásokra. Sok termék olyan beállírásokkal települ fel. akkor felülrőliifele haladó Ugyanilyen logikával biztonsági megközelírésünk másik ú g ár megközelítésnek (top-down) nevezhernénk ezt. ahol biztonságosabb megoldások kifejlesztésére van szükség. és a crackereknek sokkal több időbe kerülne. hogy melyek ezek a lyukak. legalább ugyanennyire érdemes foglalkoznunk a biztonságnak a használhatáságra gyakorolt harásával. hogy gondoskodjunk a felhasználék által ránk bízott. például az adatbázisszervert. olyan módon kell ezt tennünk.előbb-utóbb kénytele­ nek lennénk belátni. ezért fontos risztában lenni vele.Szinte núnden esetben igaz. Biztonsági felügyelet Webes alkalmazásunk fejlesztésének és üzembe helyezésének befejezése urán sem értünk feladaraink végére. a szervert magár és a hálózator vizsgáljuk meg. hogyan működik rendszerünk. és bejutnának a rendszerbe. hogy korábban már használt jelszavakat nem választhatnak. akkor a számlákat tartalmazó táblákhoz hozzáférő személyek megnézhetik a felhasználék személyes azonosító adatait (lakcím. és milyen. láthatják. Mint általában a kezelőfelület esetén. illetve a vállalatunk más osztályairól kapott adatok biztonságáróL Ha webes alkalmazásunk felhasználói számára részben vagy egészben elérherövé tesszük ezeket az adatokat. Ez jelentősen megnövelné rendszerünk biztonságát. Webes alkalmazások fejlesztőiként olyan módszereket kell találnunk. ha kezelni kivánjuk az ilyen fenyegetéseket. használhatósági resztekre és fókuszcsoportokra támaszkodva állapíthaguk meg. sokkal inkább saját ítéletünkre. amir egy zökkenőmentesen működő webes alkalmazásért fizetni kell. miben kell fejlesztési gyakorlatunkat megváltozratni. hogy négy. ha megköveteljük a felhasználóktól.vagy befektetésialap-kereskedési rendszerhez írunk platforrnot (kezelőfelületet). Ez a példa is jól mutatja. hogy legalább havonta egyszer módosítsák jelszavaikat. hogy bár fontos törődni a bizton­ sággal. hogy miként fogadják a felhasználék a tervezett megoldásokat. Egy egyszerűen használható. folyamaros harc és . amelyeket jogosultak látni. és hogyan tömhetjük be őket. és megnézzük.ez az az ár. ami szintén negatív követ­ kezményekkel jár üzlermenerünkre.Az egyik megközelítés az eddig átbeszéltekre épül: Hogyan készüljünk fel alkalmazásunk biztonságossá tételére. illetve határozhaguk meg azokat a terülereket. itt sincsenek kőbe vésett és rninden helyzetre megfelelő szabályok.f�ezet Az egyik lehetséges módszer.

visszafordíthatatlan üzleti következményekkel vagyunk kénytelenek szembesülni. hanem jellemzőerr észrevétlenül lefut valamilyen kód. aici ellátogat a rosszindulatú felhasználó által bevitt szöveget tartalmazó oldalra. Rosszindulatú kód befecskendezése Az interneten keresztül igen hatékony a rosszindulatú kód befecskendezésének (malicious code injecrion) nevezhető támadástí­ pus. vagy egy ügyfél szállítási címének módosítása is boldoggá tehet valakit (vélhetően azt. Ilyenkor fizetődik Ici. vagy földönlcivüliek lerombolják. 3. ha valaici módot talál manipulálásukra. le­ futtatja a bevitt szkript kódját. Denial of Service támadás Korábban már volt szó a szolgáltatásmegtagadással járó (DoS) támadásokról és még veszélyesebb tesrvéreikröl. amelyben szervereinket tároljuk. A rendszer következő felhasználója. Ha szervereinket órákra vagy akár még tovább elérhetedenné teszik. akkor megint csak ügyfeleket fogunk elveszíteni. amelyek komolyan veszélyeztethetik alkalmazásunk elérhetőségét. hogy adarvesztés vagy -rongálás nem csak a rendszerrel való rosszindulatú vagy véletlen visszaélés miatt következhet be.. és kiderítsük. kliensoldali programozással sok minden elérhető. könnyen beláthatjuk. a megosztott szolgáltatásmegtagadással járó (D DoS) támadásokról. ami különböző mértékű adarvesztést vagy a felhasználók átirányítását eredményezi. a szolgáltatásmegtagadás sem csak rosszindulatú visszaélés miatt következhet be. Akárcsak az előző veszélyforrás. Ezen belül a leghíresebb a Cross Site Scripting támadás. Icinek mennyi pénze van. Egy boldog banici ügyfél hirtelen néhány ezer dollárral többet talál számláján. Ha az épület. Az adatainkhoz való egyszerű hozzáférésnél is sokkal rosszabb. A nevüket és lakcímüket tartalmazó lista valamilyen további infor­ mációval lciegészírve (. Az ügyfelek nagyra értékelik személyes adataik védelmér. és nagy örömmel veszi át a valaici másnak küldendő csomagot). és valahogy elvész egy adott számla összes adata. mert akkor nem kevés időt kell arra fordítanunk. Adatvesztés vagy �rongálás A jogosulatlan felhasználók bizalmas adatokhoz jutásánál semmivel sem jobb. akkor. és vele együtt az összes kiszolgáló és merevlemez por­ rá ég. hanem a kliensen lefutó kódot is. Ha valaicinek sikerül adatbázisunkban táblákat megrongálni vagy kitörölni. hogy nem keletkezik nyilvánvaló vagy azonnali adarvesztés. ha rendelkezünk megfelelő biztonsági mentéssel és katasztrófa-elhárírási tervvel.somewhere. és mennyire számítunk arra. ha hirtelen azt látjuk. A rosszindulatú felhasználó egy űrlapba. Bár ez csak egy rendkivül egyszerű példa. fizikailag máshol tárolt biztonsági mentésekkel: ha a szervereinknek otthont adó épület leég. hogy rekonstruáljuk az adatbázist. Fontos megemlíteni. aici megváltoztatta az adatokat. az ilyen támadás által icinálc lehetőségek pedig számunkra igen rémisztőek lehetnek. A rosszindulatú felhasználó elküldi az űrlapot. hogy adataink egy részét kitörölték vagy megrongálták. Hiába rendelkezünk teljes körű. amely a belévitt adatokat mások számára megjeleníti (például megjegyzés vagy 16 üzenet bevitelére szolgáló ürlapba) nem csak az üzenetet írja be.mind a tízezer ember szakott online dohányboltban vásárolni") potenciálisan értékesíthető árucikket jelent a játékszabályokat be nem tartó marketinges cégek számára. sárla­ vina temeti be. A Cross Site Scripting alapvetőerr a következöképpen működik: l. és vár. kigyullad. például: <script>="text/javascript"> this. . Ami igazán aggasztó ezekkel a támadásokkal kapcso­ latban.Webes alkalmazások biztonsága 247 Akár csak egy neveket és lakcímeket tartalmazó tábla nyilvánossá tétele is a biztonsági szabályok súlyos megszegését jelenti. hogy bizonyos esetekben a legrövidebb leállás is kritikus lehet. ha a fel­ használók (ügyfelek) teljes táblája törlődik. bizony. hogy mennyire elterjedt számos nagy internetes oldal használata. hogy bármikor elérhetjük öket.document = "go. amellyel nem könnyü meg­ birkózni. olyan kihívással állunk szemben. Ha bankszámla-információkat megjelenítő online bank vagyunk. és mi megfelelő terv hiányában nem tudjuk számítógépeinket rendkivül rövid idő alatt újból online állapotba hozni. nem jól végezzük a dolgunkat. Ha belegondolunk. </script>="text/javascript"> 2. Még ennél is rosszabb. Egyszerű példánk átirányítja a felhasználót (és némi cookie információt) az eredeti oldalról. akkor igen komoly mennyiségü adatot vesztünk. hogy ne keverjük össze a CSS-ként rövidített egymásba ágyazott stíluslapokkal (Cascading Scyle Sheets). Szokás XSS-nek is nevezni.cookie.bad?cookie=" + this.

és hóna alatt az eszközzel kisétál az épületbőL Meglepődnénk. hiba lenne minden erőfeszítésünket rájuk pazarolni. akik a más rendszerekbe való betörés izgaimát keresik. Elégedetlen alkalmazottak A következő csoportot. akik nagy része teljesen risztességes és jó szándékú programozó. amelyek munkáját nem igazán fogjuk érté­ kelni.és rá­ adásként a bizalmas adarokkal teli merevlemezt is megnyerte. Bármi is legyen a motivációjuk. és nem kellő alapos· sággal végezzük rendszerünk biztonsági tesztelését és ellenőrzését. de lehetnek egyszerűen tehet­ séges emberek. Kikkel állunk szemben: Bár ösztönösen hajlamosak vagyunk a biztonsági problémákat okozó személyekre úgy gondolni. és nem veszik jó néven. és azok úgy tudják támadni kiszolgálónkat. Könnyen előfordulhat. megpróbálhatnak amatőr hackerré válni. szinte teljhatalmat kapnak a feltört számítógép felett. . mert nem szeretnénk megsérteni az igazi hackereket. vagy olyan eszközöket szerezhernek be külső forrásból. ami ellen sokan egyszerűen elfelejtenek védekezni: valaki lazán besétál a szerverszobába. és ott a gyanú legcsekélyebb árnyéka nélkül sétálgatni. Fertőzött gépek tájékozatlan felhasználói A crackerek mellett sokan mások miatt is aggódharunk A modern szoftverek nagy részében megtalálható gyengeségek és biz­ tonsági hibák miatt a számítógépek riasztóan magas aránya fertőzött rnindenféle feladatot végrehajtó programokkal. Hardvertolvajok Gyakran figyelmen kívül hagyott biztonsági fenyegetés. A kü­ lönböző motivációjú crackerek megpróbálnak gyengeségeket találni. Ha valaki a megfelelő időpontban a megfelelő szobába tér be. ha rosszként tekintünk rájuk.f�ezet Feltört szerver Ugyan egy feltört kiszolgáló a korábban sorolt fenyegetésekkel részben megegyező veszélyforrásokat rejt. de rendszereink biztonságát illetően mi magunk és az általunk írt kód az. károkozási szándéktól vezérelt emberekre. mint rossz vagy rosszindulatú. és lehetőleg rendszergazdai jogosultságokkal rendelkezzenek eközben. ha tudnánk. Ha nem fordírunk kellő figyelmet a biztonságra. amelytől szintén okunk lehet tartani. sok esetben más szereplők is megjelennek a"küzdőtéren': Ök akaraclan résztvevők. kihúzza valamelyik berendezés kábeleit. leállíthatják a gépet. hogy információkat szerezzenek rendszerünkről. Crackerek A legnyilvánvalóbb és legismertebb csoportot crackereknek nevezzük. amelynek dolgoznak. ami az egyik legnagyobb fejfájást okozhatja.Ugyan komoly fenyegetést jelentenek számunkra. Ha ez megvan. hogy sok irodaépületbe milyen egyszerűen be lehet jutni. nem leszünk bizton­ ságban. hogy hozzáférést szerezzenek rendszerünkhöz. bármilyen programot futtathatnak. ha például egy versenytársunk fizeti őket azért. akkor segitő kezet nyújtunk a rendszerünket feltörni kívá­ nó. mégis érdemes meg­ említeni. mert a kiszolgáló feltörése után a támadók egyik első lépése nyomaik és a bizonyítékek eltüntetése lesz. Vezetheti őket mohóság. hogy belső céges hálózatunk egyes felhasználóinak a gépén ilyen programok futnak. hogy rni abból mit sem sej tünk.Szándékosan megkülönböztetjük őket a hackerektől. arnivel a fejezet későbbi részében 16 foglalkozunk majd. de belülről védtelenek maradunk. Saját magunk Kellemetlen lehet elismerni. ha hanyag módon írjuk meg a kódot. Nagyon nagy éberségre van szükség az ilyen típusú támadások ellen. hogy a támadók célja egyes esetekben az. rosszindulatú felhasználóknak. Ha megvédjük magunkat a külvilág támadásaitól. amelyekkel a vállalari hálózaton belülről támad­ hatják a szervereket. saját alkalmazottaink alkotják. vagy olyan szaftvereket telepíthetnek. könnyen egy vadonatúj szerver boldog tulajdonosává válhat .248 16. Kellően nyomós érv ez az úgynevezett demilitarizált zóna (DMZ) megvalósítására. és ezeken átjutva elérni céljaikat. Ezek az alkalmazottak valarnilyen okból hajlamosak lehetnek kárt okozni annak a cégnek.

hogy minden.amivel módosítort vagy új kéréseket küld szerverünknek. amit webes alkalmazásaink biztonságosabbá tétele érdekében megteherünk.hogy az összes felhasználónk tisztességtelen.hogy minden szempontból felkészültek vagyunk a rendszerünkkel esetlegesen elkövetett visszaélésekkel szemben.futár.php" rnethod="POST"> <input type="radio" narne="nerne" value="Ferfi"/>Férfi<br/> <input type="radio" narne="nerne" value="No">N6<br/> <input type="radio" narne="nerne" value="Egyeb"/>Közöd?<br/> <input type="subrnit" value="subrnit"/> </forrn> </body> </htrnl> te ki vagy? </title> 16 Ez az űrlap a 16.milyen módon tehetjük ezt meg! A várt értékek alapos ellenőrzése Gyakran kérjük a felhasználókat arra.a későbbi fejezetekben használandó módszereivel kapcsolatos biztonsági aggályokra akkor és ott fogjuk felhívni a figyelmet.amikor egyenként megvizsgáljuk az alkotóelemeket. hogy bemutassuk. mi mindent teherünk az összes lehetséges biztonsági fenyegerés elhárítása érdekében (számtalan kötetnyi irodalmat írtak már e témában). Éppen ellenkezőleg: örömmel látjuk.akkor sem lehetünk biztosak afelől. Viszont szerecnénk megbizonyosodni arról.és fokozhatjuk rend­ szerünk robusztusságát. Még ha kétség sem merül fel felhasználóink megbízhatóságával kapcsolatban.általános iránymutatást próbálunk nyújtani.phpfájlban a$_POST['nerne') nagyor révednénk. Hatékonyan végrehajtort szűréssel jelentős mértékben csökkenthetjük a külső fenyegetések számát.hogy amikor csak lekérdezzük az urlap_elkuldese.amikor főnökünket vagy a vállalkozási díjunkat elfogadó vezetőt kell meggyőzni ar­ ról.Webes alkalmazások biztonsága 249 Ha már csinálunk valamit.hogy rendsze­ rünket azzal a feltételezéssel kell megtervezni. A legnehezebb az. Jelhasz­ náló által bevitt értéket szűrünk.hogyan növelhe­ tő a bizronságuk. Felhasználó által bevitt értékek szűrése Az egyik legfontosabb dolog.hogy megadott lehetőségek. </head> <body> <forrn action="urlap_elkuldese. Első lépésként azokat a dolgokat vizsgáljuk meg. Képzeljük el. amikor bemutatjuk e módszereket.és megnézzük. például ügyfelektől érkező bevitel szűrésének fontosságára való tekintertel nézzük meg. amelyek segíthecnek megőrizni kódunk biztonságát.hogy az alábbi egyszerű űrlappal dolgozunk: <htrnl> <head> <title> Hát. Ugyan könyvünkben nincs módunk arra. például a szállítás módjai (posta.sőt bátorítjuk öket.1 ábrán látható módon néz ki.a 'Ferfi'. értékét.csináljuk jól! Az internet különösen nem megbocsátó a gondatlanságra vagy lustaságra hajlamos személyekkel szemben.ahol minden a hírnévről szál. Az alkalmazások fejlesztőinek minden.hogy használják webes alkalmazásunkat. Kódunk biztonságossá tétele A biztonság megközelítésének másik útja.hogy a megfelelő irányba induljunk el. hogy érdemes a biztonságra kicsivel többet szánni egy olyan világban.hogy nincsen gépükön valamilyen spyware program vagy hasonló dolog. Ha néhány perces előadást tartunk nekik a biztonsá­ gi mulasztások negatív hatásairól (köztük a pénztárcájuk ellen dolgozó káros következményektől). A külső forrásból. hogy a többletkiadás vagy többletidő-ráfordítás bőven megtérül majd.expressz) közül vá­ lasszanak. 'No' vagy 'Egyeb' valamelyikét kapjuk-és . Ennek birtokában feltételezhetnénk. talán könnyebben belátják. Ez nem azt jelenti.külső forrásból származó bevitele szűrniük kell. A PHP egyes.

rv:l.yourhostname. Windows NT 6.1 Host: www.</p>".0.250 16.9. ".1 ábra: Egyszerű űrlap a Jelhasználó nemének kiderítésére.0.0 (Windows.0 (Windows. rv:1. Windows NT 6. egy egyszerű szövegprorokoll használatával müködik.\">FIGYELMEZTETÉS:</span> Érvénytelen bemeneti érték a nemnél. $ POST ['neme' J </p>".1 Host: www.</p>".0.0.0. fejezer 16. en-US. Az előző űrlap szöveges üzenetként. Sokkal jobban járunk. U.$ POST['neme']. és bármilyen értéket küldjön ne­ künk az űrlaphoz. en-US. U. Ha késöbb az alábbi kódot írnánk: <?php echo "<p align=\"center\"> A felhasználó neme: ". Így ez a valaki a következőket is elküldheti nekünk: POST /neme. break.9. ?> • " könnyen zavarba hozharnánk saját magunkat. ha ténylegesen meggyőzödünk arról.com User-Agent: Mozilla/5. default: echo "<p align=\"center\"> <span style=\"color: red. Ahogy korábban már említettük.0.com User-Agent: Mozilla/5.1 Content-Type: application/x-www-form-urlencoded Content-Length: 22 neme=szeretem+a+sutiket. az alábbihoz hasonló szerkezerben jutna el kiszolgálónkhoz: POST /neme. hogy a bejövő érték a várt/megengedett értékek valamelyike. break.php HTTP/1.yourhostname.1) Gecko/2008070208 Firefox/3.php HTTP/1.1) Gecko/2008070208 Firefox/3.1 Content-Type: application/x-www-form-urlencoded Content-Length: ll neme=Ferfi Azt azonban semmi nem akadályozza meg. például így: <?php switch ($_POST['neme']) case 'Ferfi' : 16 case No': case 'Egyeb' : echo "<p align=\"center\">Gratulálunk! Nemed: ". az interner a HTTP. ?> . hogy valaki kapcsolódjon webszerverünkhöz.

"HIBA: �rvénytelen dátum lett megadva!". hogy a felhasználó az adott országban szokásos formátumban adja meg a dátumot. időt vagy számot is jelképezhetnek. hogy egy repülőjegynél az indulási dátum érvényes dátumformátum-e). ha az adott típusra konvertáljuk. hogy a bevirt érték adott típusú-e.Webes alkalmazások biztonsága 251 Kicsivel hosszabb ugyan ez a kód. azaz hh/ nn/ éé. 2000. és arról tájékoztat. (Ezek a karak­ terláncok viszont akár dátumot. és ez igen fontos lehet. Ez a függvény hónap. Általános szabályként elmondható. hogy egy űrlapból származó érték az ort megadort értékek valamelyike lesz . sincsen garancia arra. nap és év értéket fogad (az év négy számjeggyel írva). 16 ll különben < O és a checkdate elkapja if (!checkdate($mmddyy[0]. nem csak az első lépésként végrehajtandó. Ha időt szánunk a bevirt adatok szűrésére és érvényesítésére. majd azt az értéket hasz­ náljuk. if ((int)$mmddyy[2] < mint a 02 vagy 95 100) if ((int)$mmddyy[2] > 50) $mmddyy[2] = (int)$mmddyy[2] else if ((int)$mmddyy[2] >= 0) $mmddyy[2] = (int)$mmddyy[2] + + 1900. hogy soha nem elég feltételezni. természetes hibake­ resést könnyítjük meg (például annak megállapítását. Például így: $ejszakak_szama = (int)$_POST['ejsz szama']. ll az olyan évek kezelése. == 0) "HIBA: �rvénytelen érték az éjszakák számánál!". hogy ezek az értékek együtt érvényes dátumot adnak-e ki: ll a split a robstring-en keresztül mbcs-biztos (lásd 5. Még olyan környezetekben. if (count($mmddyy) '/'). Ha azt szeretnénk. de legalább biztosak lehetünk benne. Még a legegyszerűbb értékeket is szűrni kell A HTML űrlapelemekhez nincsen típus társírva.minden esetben ellenőrizni is kell ezt. $mmddyy[l]. "HIBA: �rvénytelen dátum lett megadva!". hanem egyúrral rendszerünk biztonságát is növelj ük. ami ellenőrzi a dátum valódiságát. hogy egy érték a várt típusú legyen. hogy valóban számot vittek be rajta keresztül. hogy az értékeket nem közvetlenül a kiszolgálónak küldték. if ($ejszakak_szama echo exit. akkor a checkdate nevű PHP függvény segítségével írhatunk olyan kódot. amikor a felhasználó neménél bizalmasabb adarokkal kezdünk dolgozni. $mmddyy[2])) { echo exit. ahol különösen hatékony kliensoldali kóddal próbálnak megbizonyosodni arról. legtöbbjük egyszerűen karakterláncokat ad át a szervernek. hogy helyes értékeket kapunk. fejezet) $mmddyy = spllt($_POST['tavozas datuma]. Egyszerűen szavatolhatjuk.) Éppen ezért numerikus mező esetén sem feltételezhet­ jük. != 3) { echo exit. ami például egyesült államokbeli felhasznáJók es erén mm/dd!yy. ahogy azt az előző részben láttuk. .

hogy további SQL kódot futtatva számunkra egyáltalán nem kivánatos műveleteket hajtson végre. és &gt.és egyszerűen szövegként jelenítse meg öket. amit várunk! Ha a felhasználói nevek legfeljebb 50 karakter hosszúak lehetnek. majd valamelyik oldalon meg­ jelenítjük! Példaként említhetjük az üzenőfalakat vagy azokat az oldalakat. Az egyszeres és dupla idézőjelet a &#3 9. Győzödjünk meg arról. hogy a függvény megbízhatóan működjön UTF-8 karakrerláncainkon. (Ez igen fontos számunkra. -Az egyszeres és a dupla idézőjeleket is átalakítja &#3 9. ha és karaktert szecetnénk rakni a HTML-be. ahol a felhasználók megjegyzéseket írhatnak a cik­ kekhez. < jelképezi. Ehhez az &lt. A kimenet értékeinek szűrése védőkarakterekkel A felhasználók által bevitt adatok szűrésével megegyező fontosságú. A htmle ntities viszont minden entiry-vel jelképezhető karaktert lecserél. Ugyanígy. Az és karakter után az entity neve. hogy ezek jelölőelemekre utal­ 16 nak).de az egyszereseket érintetlenül hagyja.. amikor az SQL injection támadások megelőzése érdekében bizton­ ságossá tesszük öket. Ennek egyik legegyszerűbb módja a htmlspecialchars vagy a htmlentities függvény használata.illetve &quo t. a mysqli:: real_escape_string vagy amysqli_real_escape_string függ­ vényt használhatjuk erre a célra. A HTML entity röviden olyan kü­ lönleges karaktersor. igen fontos megbizonyosodnunk arról. Az entity opcionálisan JI és egy tízes számrendszerbeli szám által meghatározott ASCII kód is lehet. mert azt szerernénk. így azok nem tekinthetők a jelölő részének.A függvény ekkor sem az egyszeres. fejezet Karakterláncok biztonságossá tétele az SQL-re A karakterláncok feldolgozásának másik lehetséges célja. hogy az input a lehetséges értékeket veszi fel. Az entiry-ket a HTML kliens és > karaktereket cseréli le. Ilyen entity többek közöte a szerzői jog szimbó­ luma. hogy a felhasználók ne szúrjanak be rosszindulatú HTML jelölöket az általuk bevitt szövegbe. ) következik. Ha nem járunk el kellő gondossággal. jelképez.nem olyan egyszerű ezeket a megjelenítendő car­ ralom kimenetének karakterláncába bevinni (mivel a böngésző alapértelmezésben azt gondolja. Ilyen esetekben figyelnünk kell. -ra.hogy ezek nem tudnak kárt tenni. amelyeknél fogjuk a felhasználó által bevitt inputot.amelybe a bemeneti karakterlánc kódolva lesz. . Mindkét függvény második paramétere határozza meg. komoly problémát okozhat számunkra.hogy egyeden lekérdezést enged lefuttam i a mysqli_ query vagy a mysqli::query metódussal. A htmlspecialchars és a htmlentities függvény között a következő a különbség: az előbbi alapértelmezésben csak az &.mint amilyet az adarbázis adna (ha az egyáltalán ellenőrizne ilyen dolgokat).amelyek gondoskodnak róla. A mysqli kiterjesztés azáltal fokozza a biztonságot. Ezek fogják a bemeneti karakterláncban lévő egyes karaktereket. potenciálisan káros utasítások vagy lekérdezések futtatását . Tóbb lekérdezés végreh:Ytásához a mysqli_multi_query vagy a mysqli: : multi_ query metódust kell használnunk. entity-re van szükségünk. nem megengedett. és HTLM entity-kké alakítják azokat. Mivel HTML-ben az összes jelölőelemet < és > karakterek fogják közre. különleges karak­ tert jelöl. DELETE FROM felhasznalok. Az ilyen támadásokról már beszéltünk a MySQL PHP-beli használaránáL Ezeknél a rosszindulatú fel­ használó a nem kellően védett kódot és felhasználói jogosultságokat próbálja meg kiaknázni.hogy a kliens­ gépen lévő böngésző ne értse félre ezeket az értékeket. illetve harmadik paraméterüle határozza meg a karakterkészletet. sem a dupla idézőjeleket nem ENT_NOQUOTES alakítja át. amely és karakterrel ( & ) kezdődik. és HTML kódban nem egyszerűen jelképezhető. a perjel ( l ) esetében például &#4 7. -ra alakítja át.hogy kimeneteinket védökarakterekkel lássuk el. Ha már felhasználói értékek szerepeinek rendszerünkben.amit a &copy.hogy minden input megfelel annak. sokkal tartalmasabb hibaüzenetet írhatunk ki. -re. (az alapértelmezett érték ). Gondoljunk azokra az alkalmazásokra. hogy a név végén levő DELETE FROM felhasznalok" " . Ha olyan PHP kódot írunk. mielött az adatbázisszervernek elküldenék azt. illetve a &quot. és nem járnak nem kivánt következményekkel.opcionálisan pedig beállíthatjuk. vagy az &euro.) A második paraméter lehetséges értékei a következők: ENT_COMPAT ENT_QUOTES -A dupla idézőjeleket &quo t. az &amp. (böngésző) konvertálja kimenetté. hogy az egyszeres és dupla idézőjelek entiry-kké legyenek-e alakít­ va. Kétféleképpen előzhetjük meg az ilyen típusú biztonsági incidenseker: Az SQL-en keresztül az adatbázisszervereknek küldött összes karakterláncot szűrjük és lássuk el védökarakterekkel! A mysql_escape_string.így elkerülhetjük további. entity-t kell használnunk. A függvény azonban nem konverrálja a karaktereket numerikus entiry-kké.akkor biztosak lehetünk abban.252 16. és csak betükből és számokból állhatnak.hogy az egyszeres és dupla idézőjeleket is kezelje. által jelképezett euró szimbólum. Olyan függvényekkel tehetjük ezt meg. a ©. És nem mellesleg a kockázatunkat is mérsékeljük.. ami már azt megelőzően megbi­ zonyosodik afelől. az alábbi felhasználónév cica_mica.majd a záró pontosvessző ( .

</script>".html fájira irá­ nyuló kérést intéz.&quot. akkurátusan végig kell néznünk a karakterláncokat.<br /> &lt. Ha például üzenöfalas honlapunk gyökérkönyvtára a /home/httpd/messageboard/www. Sstr = htmlentities(Sbemeneti_sztring. echo nl2br($str).&lt. htmlspecialchars 16 Kódjaink szervezése Egyes vélemények szerint a felhasználék által az internetről közvetlenül nem elérhető fájlokat nem szabad a weboldal gyökér­ könyvrárába helyezni.text/javascript&quot. Így. Ha végigfuttatnánk a következő PHP kódon (az nl2br függvényt azért futtatjuk a kimeneti karakterláncon. ha valahol a nyil­ vános gyökérkönyvtárban tárolnánk a felhasznaloi_objektum./script&gt.<br /> ll ide kerül a rosszindulatú JavaScript kód. illetve az oldalhoz írt bármely egyéb fájlt mondjuk a /home/httpd/messageboard/code könyvrárba kell raknunk. ahol a felhasználék szívesen veszik.<br /> &lt.center&quot. ha karakterek segitségével szabályozhatják a betűtípusr. ?> kimenerként az alábbi szöveget látnánk: &lt. php vagy .<br /> ll ide kerül a rosszindulatú JavaScript kód.. hogy a bön­ gészőben szépen formázott legyen): <?php Sstr = htmlspecialchars($bemenetl_sztring. /code/felhasznaloi_objektum.</p> <script type="text/javascript"> ll ide kerül a rosszindulatú JavaScript kód. És a következöképpen nézne ki a böngészőben: <p align="center"> A felhasználó ezt adta nekünk: <script type="text/javascript"> "15000?".&gt. amikor meg kívánjuk engedni a felhasználóknak bizonyos HTML használatát ./p&gt.Webes alkalmazások biztonsága 253 Gondoljuk végig az alábbi szöveget! Sbemenet1_sztring = "<p align=\"center\">A felhasználó által küldött érték: p> <script type=\"text/javascript\"> \"15000?\". a beillesztett fájlokat.script type=&quot. ENT_NOQUOTES. hogy azonosítsuk és ne szűrjük ki ezeket.</ ll ide kerül a rosszindulatú JavaScript kód. Ha kódunkba szerernénk beilleszteni ezeket a fájlokat.A felhasználó ezt adta nekünk: <br /> &lt. <l script> a Figyeljük meg.script type="text/javascript"&gt.például üzenőfalon. Sok webszerver alapértelmezésben a kimeneti adatfolyamba írja az ilyen fájl tartalmár. A felhasználó ezt adta nekünk: & quot.<br /> "15000?". ENT_QUOTES. php fájlt.15000&euro. Az ilyen fokú elővigyázatosság alapja az az eset.&gt./script&gt. hogy a htmlentities függvény entiry-re ( &euro. </script><p align="center"> A felhasználó ezt adta nekünk: "15000?".&lt. a következöket kellene írnunk: require_once(' .php). echo nl2br($str). ) cserélre az euró szimbólumát ( ). és a felhasználó ezt a fájlt kérné. núg nem nyúlt hozzá! Olyan esetekben.. "UTF-8"). "UTF-8").</p> ll ide kerül a rosszindulatú JavaScript kód. amikor egy rosszindulatú felhasználó nem . -színt és -stílust (félkövér vagy dőlt) -. kódunk reljes .p align=&quot./p&gt.&lt.<br /> <br /> &lt.p align="center"&gt.

biztonsági kockázamak lehetünk kitéve. a konfigurációs fájlokat vagy a különleges könyvtárakat a nyilvános gyökérkönyvtártól távol tartani. Ez kényelmes ugyan. ha hozzáférnének (például letclpasswd) ? Ügyelnünk kell. Javasolt ugyanígy eljárni más. "bob". a szöveges fájlokat. $kapcsolat = @new mysqli($adatbaz1s szerver. Vagy. hasonlóan érzékeny adatokkal is. amelyeket mások is láthatnak? Ha mások számára is megadjuk ezt a lehetőséget. hogy még egy védelmi rétegre érdemesek. hogy csak a . Még ha azt is gondoljuk. mert a rossz input itt is problémákhoz vezethet. Hasonlóképpen kerülendő az is. "adatbazis"). például így: $kapcsolat = @new mysqli("localhost". a más tÍpusú fájlokra vonatkozó kéréseket pedig a kiszolgáló hibaüzenettel utasítsa el. amely nem a webes alkalmazás gyökérkönyvtárában helyezkedik el. ll stb. amelyekhez nem sze­ retnénk. például a Unix különbö:ző változatainak más felhas:ználói is elérhetik azokat. php és .254 16. Mi kerül a kódunkba? Az eddig látott. és ne rakjuk őket olyan helyre. nem megfelelően kenfiguráit szerver­ re helyezzük át alkalmazásunkat. illetve olyan biztonsági hibát (exploit) találhat. megfontolandó szempontok A PHP kialakitásakor figyelembe vették a helyi fájlrendszer használatának lehetőségét. az adatbázisok elérésére szolgáló kódrészletek egyszerű szövegként tartalmazták az adatbázis nevét. $adatbazis_felhasznaloi_nev = 'bob'. Ez újabb biztonsági hibaforrást jelent alkalmazásunk számára. A fájlrendszerrel kapcsolatos. html fájlok kérését engedélyezze. fejezet tartalma megjelenne a böngészőben. amelyek nem teljes mértékben az irányításunk alatt álló gépekről származnak. a bob nevű felhasz­ náló jogosultságaival egyből hozzáférnek adatbázis unkhoz. "titok". Két kérdést is érdemes végig­ gondolnunk: Az általunk a lemezre írt fájlok között lesznek olyanok. ?> <?php include(' . Ezt elkerülendő úgy kell webszerverünket konfigurálni. ám kevésbé biztonságos. $ adatbazis 16 ?> jelszo. majd kódunkba beilleszteni azt. ha később másik. arniről megfeledkeztünk. amelyekről úgy gondoljuk. $adatbazis_jelszo = 'titok'. ahol egy többfelhasználós operációs rends:zer. hogyan programoztuk az alkalmazást. lcodeladatbazishoz kapcsolodas. vajon ők is hozzá tudnak férni olyan fájlokhoz. hogy megfeledkeztünk valamiről. hogy megfelelően kenfiguráltuk webszerverünket. $ adatbazis_neve). Ekkor ez a felhasználó láthamá. mert ha a crackerek ráceszik a kezüket a . $ adatbazis felhasznaloi_nev. Amennyiben az allow_url_ fopen beállítást bekapcsoljuk a php.php). ha óvakednánk más gépekről származó fájlok beillesztésétőL Különösen olyan fájlok esetében. például a jelszófájlokat.php $adatbazis szerver = 'localhost'. és jobban tennénk. php fájlunkra. . akkor elméletileg távoli szerverekről is be­ illeszthetünk vagy lekérhetünk fájlokat. hogy ne írjunk a lemezre átfogó biztonsági jogosultságokkal bíró fájlokat. $adatbazis_neve = 'adatbazis'. a felhasz­ nálói nevet és a jelszót. Ugyanígy érdemes minden más fájlt. például így: <?php ll ez az adatbazishoz kapcsolodas.. előfordulhat. hogy felhasználó által bevitt adatokat használ­ junk a beillesztendő vagy lekérendő fájlok kiválasztására.ini fájlban. és hozzáférne az esetlegesen a fájlban lévő szellemi tulajdonunkhoz. Célszerűbb a felhasználói nevet és jelszót olyan fájlba tenni.

A fejlesztök jellemzően nem bizonyulnak jó tesztelőknek! Teljes mér­ tékben megbizonyosodnak ugyan arról. és megnézzék. eredményesen csökkenthegüle az emberi hibák miatt bekövetkező problémák valószínűségét. \. htdocs\) (c: \Program Files\Apache Software Foundation\ egy olyan fájlokkal teli könyvtár helyezkedik el. alkalmazásunk sikere vala­ mennyi tesztelő erőforrást mindenképpen igényelni fog. egyszeres idé­ zőjellel ( '). . hogy mi. hogy jelentkeznek-e komoly problémák vagy esetleges biztonsági rések. A következő módszerekkel érhegük el ezt a célt: Alapos tervezési munka előzze meg termékünk létrehozását.ini fájlt szeretnék megnézni. ha fordított idézőjelek ( ') közé tesszük az adott parancsot. amellyel tetszőleges parancsokat futtatharunk pa­ rancshéjban (Unix-szerű operációs rendszerek esetében az sh valamilyen változata. programozók és az általunk írt kód egyaránt esendő. szigorúan szűrnünk kell. vannak-e olyan nyilvánvaló gyenge­ ségek. Ezt a problémát is könnyen orvosolhaguk: ha elfogadunk felhasználói bevitelt. ami nevekből és telefonszámokból álló listát tartalmaz. annál nagyobb valószínűséggel fogjuk kiszűrni a lehetséges problémákat. mint ahogy az is. amely a keresendő karakterláncmintát és azon fájlok listáját várja.. ha megengedjük a felhasználóknak.A keresendő mintának megfelelő sorokat adja vissza. amit egy tesztelő megtalálna. Azt a sziruációt nevezzük így. amelyhez hozzáférést adunk a felhasználóknak.Angol nyelvű billentyűkiosztás esetén a bal felső sarokban helyezkedik el a billentyű. illetve ha a kód annyira bonyolult. 16 Végrehajtó operátor és az e xe c parancs Korábban röviden már említettük a parancssori utasítás-végrehajtó (shell command executor) vagy végrehajtó műveleti jel (execution operator) nevű funkciót. amiket kihasználhatnának. kódunk megfelelő tesztelése és ellenőrzése nélkül. .Ollé! Ennek soha nem lett volna szabad megtörténnie. \ . hogy véglegesítsék a változtatásokat. és ök bevihetik a megtekinteni kívánt fájl nevét. amikor a korábban már kijavított problémák vagy hibák a kód egyéb változtatásai miatt újból megjelennek. Érdemes beismerni. de mindenképpen segit elkerülni a regresszálást. minta kereses helye. A fejlesztöknek csak akkor szabad megengedni. ini . hogy valaki megnyit egy weboldalt. akkor komoly problémáink adódhatnak. Fontos megjegyezni. majd valami ilyesmit lát megjelenni: . Teremtsünk elegendő tesztdési erőforrást projektünk számára! Rengeteg projekten spórolnak ezen. a grep paranccsal összeállít­ hatjuk a"Smith" szót tartalmazók listáját. amennyiben a . és ennek megfelelöen tervezzük. hogy difenesztráció). mint például a c: \mysql\my.. Ez alapvetően olyan nyelvi operátor. hogy ez az idézőjel nem azonos a sima. 2. A végrehajtó műveleti jel a lefuttatott program szöveges kimenetét tartalmazó sztringértéket adja vissza. és lehetőség szerint készítsünk prototípusokat l Minél töb­ ben nézik át terveinket. ha minden egység sikeresen tesztel­ te azokat. más nyelvű billentyűzeten ugyanakkor komoly kihívás lehet megralálni. Ha van egy olyan szöveges fájlunk. futás közben is figyelni kell. vagy nem lesz kellően biztonsá­ gos. hogy a megfelelő inputtal kódjuk tökéletesen müködik.. ha az olyan abszolút elérési útvonalakat is kiszürjük.\ előfordulásainak eltávolítása minden bizonnyal segítene megelőzni az ilyen problémát.A naplók rendszeres böngészéséből és a felhasználói/ fogyasztói észrevételek elolvasásából kideríthető. . A grep [args) grep Unix-szerű parancs.. Ha gyökérkönyvtárunkban Apache 2. A kód stabilitása és kódhibák Ahogy korábban már utalrunk rá. hogy beírják az általuk látni kívánt fájl nevét. Képzeljük el. hogy használhatósági tesztet végezzünk alkalmazásunk kezelöfelületén. Ha igen. A nagy szaftverfejlesztő cégek majdnem ugyanannyi tesztelőt és fejleszrőt foglal­ koztatnak. Remek alkalom ez arra is. Windows esetén a cmd. beír egy szót a keresési párbeszédabiakba (például azt..Webes alkalmazások biztonsága 255 Ezen túlmenően akkor is rendkívül óvatosan kell eljárnunk. Az előző példában a . Ha a kezdetektől fogva tudatosan törekszünk alkalmazásunk stabilitására.exe). rákattint a"Keresés" gombra. webes alkalmazásunk nagy valószínűséggel nem fog megfelelően müködni. Vegyük rá fejlesztőinket. hogy főnökeink is meg fognak fizetni ilyen sok tesztelőt. BUG BUG BUG! 1!! Ez a felhasználó rninden bizonnyal kevéssé fog bízni az oldal robusztusságában vagy biztonságában. már azelőtt kezelni tudjuk öket. Az alkalmazást üzembe helyezés után. de kevésbé megbízhatók az esetleges problémák feltárásában. vagy mindössze egyeden tesztelő jut a projekt ötven fejlesztőjére. hogy konkrét tesztdési módszertant kövessenek! Minden bizonnyal így sem fogják az összes olyan hibát megtalálni. hogy megismerjék PHP-telepítésünket. és ugyan nem valószínű. amelyek közt keresnie kell. Ezzel lehetövé válik számukra. hogy tele van hibákkal. hogy elkerülhessük az ilyen jellegű gondokat. hogy kritikussá válhatnának.\php\php.

Smith" nevű embereket: <?php ll az -i azt jelenti. hogy ezen parancsok futtatásához magasabb szintű jogosultságokat kell kiosztanunk. ha gondoskodunk arról. Még ennél is rosszabb.a végrehajtó operátorral ellentétben . A számítógépeinkre és szervereinkre telepítendő szoftverek nagy részét olyan konfigu­ rációs fájlokkal és alapértelmezett funkciókészleetei kapjuk. hasonlóan használható program is. illetve ahhoz. ahol biztonsági tanácsokat és új verziókat keresünk. Bár nincsen lehetőségünk bemutatni. $sorok = split($felhasznalok. Webszerverünk és a PHP biztonságossá tétele Nem elegendő kódunk biztonságosságával törődni.nem mindig adják vissza a teljes kimenetet. foreach ($sorok as $sor) ll a neveket és a telefonszámokat . hrrpd. különböző biztonsági veszélyforrásoknak tesszük ki magunkat. a PHP-t futtató webszerverünk telepítése és konfigurálása is komoly biztonsági aggályokat hordoz magában. illetve az új funkciók listáját böngészve megnézzük. hogy felhasználói input kerüljön a fordított idézőjelek között lévő parancsba.com/iis). Az exee parancs és a rendszerfüggvények a végrehajtó operátorhoz nagyon hasonlóan viselkednek.php. nem pedig héjkörnyezetben futtatják.txt'. hogy webszervereink és a PHP megfelelő konfigurálásáról is gondos­ kodjunk. '. hogyan tudunk a témában további információhoz jutni. a különbség annyi. Telefon#: ?> Ha bármikor is megengedjük. A PHP.. A gyártók azt felrételezik. hogy kikapcsoljuk a számunkra szükségtelen és/vagy a kívántnál kevésbé biztonságos funkciókat. echo "Név: {$nevek szama[O] }.holiszrikus" megközelítése megköveteli. hogy megfelelöen végrehajtsák. hogy mivel alapesetben alacsony szintű jogosulrsági környezetben szetetnénk futtatni webszerverünket és a PHP-t (erre a következő részekben még bövebben visszatérünk). $nevek_szama = split($sorok. vannak-e köztük a biztonsághoz kapcsolódó javítások. amelyek a szoftver erejét és hasznosságát hivatottak demonstrálni. ). Windows alatt elérhető a findstr. vagy nem szánnak rá elegendő időt. Ezzel tovább veszélyeztetjük biztonságunkar. hogy a parancsor közvetlenül. az Apache HTTP Server és a Microsofr Internet Information Server (IlS) esetében ez azt jelenti. és .256 16. könnyen olyan helyzetben találjuk magunkat. Az alábbi kód futtatásával találhatnánk meg a . Tartsuk szoftvereinket naprakészen! Rendszerünk biztonságát a legegyszerűbben úgy tudjuk elösegíteni. Az operátor használara üzleti környezetben igen nagyfokú körültekintést és óvatosságor igényel. és rendszerünk biztonsága érdekében szigorúan szűrni kell ezt az inputot. Ugyanazokat a biztonsági aggályokat hozzák elő. ' karakter választja el {$nevek_szama[l] }<brl>\n". legalább némi rámpontot és iránymutarást adunk az elinduláshoz. ennél is szigo­ rúbban kell korlátozni a lehetséges inputokat. hogy az általunk használt szaft­ vernek mindig a legfrissebb és legbiztonságosabb változata fusson.ner. fejezet A grepnek léteznek windowsos változatai.microsofr. 16 Sajnos sokan teljesen megfeledkeznek erről. $users = hogy nincs különbség kis. . A bizronság. ll a kimeneti sorok felbontása tömbbe ll figyelem. hogyan lehet rninden szóba jöhető webszervert és PHP kiterjesztést biztonsá­ gossá tenni. hogy több-kevesebb rendszerességgel felkeressük a megfelelő honlapokat (http://www. így ugyanazok a figyelmezrerések érvényesek rájuk is. Ha azonban biztosra szecernénk menni..org vagy www. Windows alatt a \n helyett \r\n legyen! "\n").és nagybetű között 'grep -i smith lhomelhttpdlwwwltelefonszamok. A minimális óvintézkedés az escapeshellcmd függvény használata. sőt.exe nevű.apache.

A végrehajtandó lépések magas száma rniatt igen valószínűtlen. amit a szaftver újabb verzióinak telepítésekor követni fogunk! Így biztosan nem fogunk megfeledkezni az olyan foncos dolgokról. hogy a PHP on­ line kézikönyvében (http://www. Az ezekkel a beállításokkal kapcsolatos egyetlen trükk. Ebben az esetben saját magunknak _ _ _ 16 \. így az mbstring kon­ figurációs opciók neve mbstring-gel kezdődik. kell eldönteni. amelyekkel operációs rendszerünkön belül másik operációs rendszert futatharunk (például a VMware. Az új verzió üzembe helyezése A telepítése soha nem szabad először közvetlenül az üzemben lévő kiszolgálón végrehajtani. Inc. egységtesztek fut­ ellenőrzése 3. Ezen kívül a funkcióterület/kiterjesztés neve szerinc vannak rendezve. amelyeket soha nem fogunk használni. alapvető müködés felépítése 2. ini fájl tartalma Ha eddig még nem szántuk rá magunkat a php. A modulok rengeteg olyan konligurációs beállítást kínálnak. és meggyőződhetünk arról. hogy az adott szaftver használata megéri-e a biztonsági kockázatot. terhelési tesztek konfigurálása elvégzése 5. különösen fontos. dokumentumok rarása 4.ini fájl átböngészésére. hogy új verziók telepítése esetén biztosak lehessünk benne: a megfelelő beállításokkal használjuk. amik csak problémákat okoznának a későbbiekben. a munkamenetekkel (session) kapcsolatosak pedig session előtaggal bírnak (23. hogy a megfelelő szerverkörnyezet poncos mását állítsuk elő. VMware vagy a Microsoft VirrualPC szoftvere). valóban minden a megfelelő módon működik (lásd a 16. szerverre másolás 2. amelyre telepíteni rudjuk a szaftvert és a webes alkalmazást.Webes alkalmazások biztonsága 257 Az új verzió beállítása Egyes szoftverek konfigurálása és telepítése időigényes. Különösen a Unix-verziók esetén. Mindig legyen tesztszerverünk. illetve azok lehetséges értékeiveL Meginc csak erősen ajánlott. hogy a szaftver új verzióján is megfelelően működik webes alkalmazásunk. lehetövé teszik. Az olyan programok. hogy rninden rendben működik-e! Az olyan nyelvek esetében. Az éles kiszolgálón is szükség van némi végső tesztelésre. hogy PHP-ben írt régi szaftver használata esetén jó eséllyel szükség lehet a register globals és/vagy a register long arrays bekapcsolására. A használt modulok esetében azonban fontos. hogy megfelelő tesztek lefuttatásával megbizonyoso�unk: a szaftver új változata nem lehet negatÍv hatással alkalmazásunk működésére. resztsorozat futtatása 3. ha rendszeresen utánanézünk a szaftverhez tartozó biztonsági javításoknak vagy egyéb frissítéseknek. l Összeállitás l )o l Tesztelés l )o Üzembe helyezés l. hogy a folyamat vagy teljesen automatizált legyen. az élesben működö kiszolgálóinkon is üzembe helyezhetjük. és megvizsgáljuk a tartalmár! Az ilyen fájlok bejegyzéseinek nagy része megfelelő megjegyzésekkel rendelkezik. Nagyon fontos: készíesünk magunknak rövid telepítési útmutatót. mint a PHP. konfigurációs fájlok ellenőrzése 2. amit előtte telepíteni kell. hogy betöltsük valarnilyen szöveg­ szerkesztőbe.net/manual) átnézzük dokumentációjukat. Nem feltétlenül szükséges komoly összegekért új szárnitógépet beszerezni a telepítés és a konfiguráció tesztelésére.2 ábra: Kiszolgálószoftver frissítésének folyamata A php.ini fájlunkról. PHP telepítése 3. amikor forrásból telepítünk. hogy milyen változtatásokat hajtottunk végre benne. alapvető múködés l. és tisztában legyünk az egyes kiterjesztések opcióival. ahol egyes alapértelmezett beállítások verzióról verzióra változhatnak. itt a remek alkalom. ad hoc tesztek futtatása futtatása 16. és amelyek miart-ha ezek a modulok nincsenek bekapcsolva-aggódnunk sem kell. vagy írjuk fel. E kockázat egyébként úgy mérsékelhecő. egységtesztek beállitása 4.2 ábrán). számos olyan egyéb szaftver lehet. vagy papírra (esetleg egy fájlba) feljegyezzük a telepítés során követendő lépésekec. számos lépésből álló folyamat lehet. majd a megfelelő modulok és kiter­ jesztések bekapcsalásához számos parancssori kapcsaló beállítására van még szükség. hogy rendszeres biztonsági mentéseket készítsünk php. Ha megbizonyosadtunk róla. amelyek használatukat írják le. hogy akruálisan futtatott operációs rendszerünkön belül vég­ rehajtsuk a tesztelése. fejezet: Munkamenet-vezérlés PHP-ben). kiszolgáló l. . Itt megint csak arra kell ügyelnünk. hogy a telepítés során minden egyes apró részletet fejben ru­ dunk tartani. resztsorozat futtatása 4.php. hogy biztosak lehessünk abban.

egi -bin/.258 16. a nem kellően biztonságos felépítés pedig soha nem fog az ügyfélmegtartás lehetséges módszerei közé tartozni.azokra gondolunk itt. . hogy a szerver úgy legyen beállítva. hogy a gyökérkönyvtár (amely alapértelmezetten a htdocs/ alkönyvtárat használja) kivételével minden könyvtár a root tulajdonában van. amely egyidejű­ leg még feldolgozható (az alapértelmezett érték. Ellenőrizzük az Apache telepítési könyvtár fájljogosultságainak megfelelő beállítását! Unix esetén ez magában foglalja azt. A httpd. Kerüljük a gyakori nevek használatár! Rengeteg automatizált program létezik. 2\conf) . b in/ stb. a 150 teljesen ésszerű. Az ilyen kiszolgálókan rninden bizonnyal nem férünk hozzá a php. hogy a httpd superuser jogosultságok nélküli felhasználóként fut (Unix esetén például nobody vagy httpd ) ! Ezt a httpd. inc fájlok megtekinthetőségét szeretnénk megakadályozni. mi most a két legnépszerűbb. meg­ emelhetjük azt). az Apache HTTP Server és a Micro­ soft IlS beállitását tekintjük át.apache. amelyre. hogy az liS dokumentációját elolvasva alaposabban tájékozódjunk az ajánlott biztonsági eljárásokróL Webes alkalmazások hosztolása fizetős szolgáltatás igénybevételével Bizonyos felhasznáJók számára kicsit problémásabb a virtuális szerver biztonságának kérdése . mie­ lőtt élesben üzembe helyeznénk a kiszolgálót. Ismét csak ajánlani tudjuk. a ThreadsPerChild értéket kell ellenőrizni (az alapértelmezett érték. de ha nagyobb terhelésre számítunk.org/docs-project) a vonatkozó biztonsági részeket! Ezen túlmenően tegyük a következőket: Ellenőrizzük. arniket nem szeretnénk.ini fájlhoz. hogy a szükséges helyekről eltávolítsuk az írási jogosultságo­ kat! Töröljük ki az liS által alapértelmezésben a gyökérkönyvtárba telepített összes fájlt! Nagy valószínűséggel �zek túl­ nyomó többségét soha nem fogjuk használni (sőt. akik fizetős PHP/MySQL hosztolási szaigáitatás igénybevételével futtatják webes alkalmazásaikat. Apache HTTP Server A httpd szerver alapértelmezett telepítése elfogadhatóan biztonságos. Az Apache 2. Szélsőséges eset­ ben még arra sincsen lehetőségünk. és fordítsunk időt arra. conf nevű fájlban találjuk. nem lesz szükségünk. és 7 55 jogosultsággal rendelkezik. confUser és Group beállirásai szabályozzák. hacsak nem használjuk az online konfigurációs eszközöket (és ne használjuk ezeket. forditsuk figyelmünket a webszerver felé! A biztonság szempontjából minden kiszolgálónál más konfigurálási folyamat vár ránk. hogy megfelelő számú kapcsolatot tudjon kezelni! A httpd 1. így nem tudjuk a beillesztendó fájljainkat biztonságos helyre pakolni. így nem tudjuk a beállításokat a nekünk megfelelőre alakítani.x verzióknál. Szerencsére az ilyen szolgáltatásokat nyújtó cégek is versenyképesek szeremének marad­ ni.x verzióinak felhasználói esetében olyan ésszerű számot érdemes a MaxClients értékének adni.3.inc$"> deny Order allow. rnint az operációs rendszer! Használjuk az NTFS fájlrendszert. Ellenőrizzük. Az összes konfigurációs beállítást a httpd. hogy a gyökérkönyvtáron kivül könyvtárakat hozzunk létre. hogy egyiket sem). Ne felejtsük el elolvasni a ki­ szolgáló online dokumentációjában (http://httpd. ahol lehetséges a multithreading (több száJon futó feladat-végrehajtás). minél előbb távolítsuk el ezeket a fájlokat az adott weboldal gyökérkönyvtárából! Microsoft IlS Az liS konfigurálása kevésbé a beállításfájlok körül forog. amely általában a httpd alaptelepítésének l conf alkönyvtárában helyezkedik el (ami nem más.) kutat kódok és prograrnak után. Telepítéskor jelentős mennyiségű tartalom kerül az \inetpub könyvtárba. rnint az Apache HTTP Server esetén. könnyen lehet. f�ezet A webszerver konfigurálása Ha már megfelelőnek találjuk a PHP konfigurálását. ennek ellenére számos dolgot 16 meg kell tennünk az liS telepítésének biztonságossá tétele érdekében: Óvakodjunk attól. hogy a weboldalak ugyanarra a meghajtóra kerüljenek. amely a gyökérkönyvtárunk gyakori nevű alkönyvtáraiban (például Scripts/. ha más is látna! Ha például az . az 50 általában elfogadható). az alábbiakat kell beírnunk: • <Files - "\. rnint a /usr l local/apache/ conf vagy a C: \Program Files\Apache Software Foundation\Apache 2. ám érdemes néhány dolgot alaposan leellenőrizni. Deny from all </Files> Mint már említettük. conf fájlba megfelelő direktívákat belevéve rejtsük el a fájlokat. válasszuk inkább az iisadrnin segédalkalmazást!).

Tesztelésképpen próbáljuk ki a következőket. milyen támogatást nyújranak! A jobb szolgáltatásokhoz teljes online dokumentáció tartozik (egyes szolgáltatóknál kiváló dinamikus oktatóanyagokat is találhatunk). amelyek­ kel rénylegesen dolga van. milyen szaftvereket futtat az adott oldal! Ellenőrizzük. mint a 44bicikliA. Ezeknél a biztonság érdekében megtehetjük. ahova a tartalom és a futtatható PHP kódok kerülnek.és nagyberüket pedig valamilyen egyszerű séma szerint válrogassák. használjunk olyan szolgáltatást. hogy meggyőződjenek a rendszer biztonságosságáróL Ellenőrizzük.Webes alkalmazások biztonsága 259 A biztonság érdekében számos dolgot megtehetünk. javasoljuk. és milyen fuggvényeket és osztályokat kapcsoltak ki. hogy csak a rendszergazdának legyen hozzáférése a jogosuJtsági táblákhoz és adminisztrációs adatbázisokhoz! Minden más felhasználónak csak azokhoz az adatbázisokhoz szabad hozzáfém ie. pénzvisszafizetési garancia vagy bármilyen más lehetőség. a kis. hogyan kanfigurálják tárhelyünket. Az adatbázisszerverek biztonsága Túl azon. ahol van ingyenes próbaidőszak. amelyre webes alkalmazásainkat írjuk. A beállítá­ sok értékeit az ini_get fuggvénnyel is kideríthetjük. hogy az adatbázis rendszergazdája rendelkezik jelszóvall Figyeljünk. amit tenniük kell. amelyből pontosan kiderül. milyen korlátozá­ sokra és támogatásra számíthatunk az adott szolgáltatónál. Felhasználók és a jogosultsági rendszer Szánjunk rá időt és energiát. nézzük meg. milyen verziójú szaftvereket futtatnak! A legfrissebb verziókat? Ha nem találjuk a phpinfo kimenetét. aki a kívánatosnál több jogo sultsággal rendelkezik . amely teljes könyvtárfát és nem csak gyökérkönyvtárat kínál! Egyes szolgálra­ tóknál tárhelyünk gyökérkönyvtára az alap dokumentumkönyvtár. akik aggódnak jelszavuk megjegyezhetősége miatt. Ezt alaposan áttanulmányozva megtudhatjuk. amelyben a public_html/ az a hely. amivel hosszú távú kötelezettségvállalás nélkül kipróbálhatjuk. • Olyan tárhelyszolgáltatást keressünk. azaz"Mir sürsz. amelyek mindenkire egy­ aránt érvényesek. hogy minden szaftverünket naprakészen tartjuk. mert az emberek nem fordítanak kellő időt arra. Próbáljuk meg kideríteni. hogy a biztonságról teljes könyveket írhatnánk minden egyes adatbázisszerverhez. és próbáljunk meg olyan táblát elérni. kis szűcs. illerve nem fogják a fájlt e-mailben elküldeni számunkra. kis szűcs?" Sok adarbázis ( köztük a MySQL régebbi verziói) telepítésekor létrehoz egy névrelen felhasználót. Az olyanoknak. és figyeljük. és próbáljuk meg elérni a rendszeradatbázisokat vagy a jogosuJtsági táblákat! • • • Anúg nem próbáltuk ki mindezeket. sokkal kevésbé biztonságosak. milyen beállításokat használnak a php. tán sós húst sürsz. például MsKsTsHsKs.netcraft. ám itt és most csak olyan általános stratégiákat tudunk bemutatni. hogy valóban PHP5-öt használnak! Keressünk olyan szaigáitatást. hogy a jelszavak ne tartalmaz­ zanak szótári szavakat! Még az olyan jelszavak is. A biztonságos módot nem használó vagy egyeden fuggvényt ki nem kapcsaló oldalak esetében jobban aggódhatunk. mások teljes könyvtárhierarchiát adnak. Ezzel lehetövé válik. mint például a Netcraft (http:/ /www. hogyan fognak futni webes alkalmazásaink az adott tárhelyen. inc fájljaink tartalmár. amikor megfelelő szolgáltatást keresünk webes alkalmazásaink elhelyezésére: Mielőtt valamelyik szaigáitatás mellett döntenénk. nem lehetünk biztosak rendszerünk jogosuJtsági rendszerének megfelelő védelmében. amellyel megtudhatjuk. a felesleges vagy rúl sok jogosultsággal rendelkezőket pedig távolítsuk el! Ügyeljünk. hogy mások ne tekinchessék meg . mint például az FI93!!xl2@. ini fájlban! Bár a szolgáltatók többsége nem jeleníti meg ezeket az oldalon. ellenőrizzük. mint az ésszerűen biztonságos konfigurációt kínáló szolgáltatóknál. és csak azokat szabad módosítania. Miurán feltérképeztük és megismertük a jogosulrsági rendszert. hogy az alapér­ telmezett felhasznáJók pontosan azt teszik. hogy egy tetszőleges mondar szavainak kezdő­ betűit használják. a műszaki ügyfélszolgálattól megkér­ dezhetjük. Nézzük meg. hogy létrehozzuk az includes/ könyvtárat. Megint csak elmondható. hogy a biztonságos mód be van-e kapcsolva. amelyre nincsen jogosultságunk! Kapcsolódjunk felhasználókén t. . történik-e hiba: • 16 Kapcsolódjunk felhasználói név és jelszó megadása nélkül! Kapcsolódjunk rendszergazdaként jelszó nélkül! Adjunk meg rendszergazdaként hibás jelszót! Kapcsolódjunk felhasználóként. számos dolgot megtehetünk adatbázisaink biztonsága érdeké­ ben. hogy megismerjük a választott adatbázisszerver hitelesítési és jogosuJtsági rendszerét! Az adat­ bázisok elleni támadások közül meglepően sok egyszerűen azért tud sikeres lenni. hogy van-e minden felhasználónak jelszava! Minden adatbázisszerver esetében az egyik legelső tennivalónk legyen meggyőződni arról.com).

hogy az adatbázisszervernél beállított. és csak utána továbbítsuk azokat a kiszolgálónak! Végezetül az azt megengedő szervereken használharunk tárolt eljárásokat.x verziói alapértelmezésben maximum 150 kapcsolatot tudnak kezelni. A kiszolgáló futtatása A kiszolgáló biztonsága érdekében számos dolgot megtehetünk az adatbázisszerver futtatása során. aminek idézőjelek között kell lennie. hogy ne a superuser legyen az adatbázisfájlok tul�donosa! (Ellenkező esetben ugyanis a nem superuseri adatbá­ zisszerver-folyamatok még saját adatbázisfájljaikba sem tudnának írni. és figyeljünk. Számszerű és dátum/idő adatok eseté­ ben is győzödjünk meg a felhasznáJók által bevitt értékek ésszerűségéről. ami helyinek látja a forgalmat. hogy hibaüzenetet kapunk-e! Próbáljunk meg az általunk megadott mérethatáron felüli adatot bevinni. ha korlátozzuk a felhasználókat abban.ami természetesen megint csak ellenjavallt. hogy honnan kapcso­ lódhatnak. Korábban említettük. hogy a felhasználói nevet váró mezöbe több kilobájtnyi adat vagy felhasználói nevekbe nem való karakter kerüljön. hogy bekövetkezik-e a hiba! ' ' Kapcsolódás a szerverhez Számos módszer létezik.260 16. A MySQL igazából csak akkor hagyja. fgezet Adatküldés a szerverre Könyvünk eddigi oldalain már többször elmondtuk (és még jó néhányszor el fogjuk mondani).) . A különböző adatbázis-kezelő rendszerekben használt jogosuJtsági rendszerek nagy részénél nem csak felhasználói nevet és jelszót adharunk meg az egyes felhasználókhoz.ini-ben a MySQL által megenge­ dett kapcsolatok számát az alapértelmezetten értéken (100) hagyjuk. Amennyiben adatbázisszerverünk és webszerverünk/PHP motorunk ugyanazon a számítógépen található. hogy az Apache HTTP Server 1. Windows esetén rendszergazdaként) futtatni. Az egyik legegyszerűbb módszer. és gondoskodnak arról. mint amennyit a webszerver és a PHP lehetövé tesz. és ügyeljünk. Az alagút olyan pokolian okos ödet. hogy soha nem szabad azt superuserként (Unix esetén rootként. hogy az adatbázisszervereinkhez való kapcsolódásokat ellenőrzésünk alatt tartva megőrizzük a ki­ szolgálóink biztonságosságát. Az adatbázis-kiterjesztések által elérhető. és figyeljük. amelyekről a csatlakozás megengedett. amely biztonságos kapcsolatot hoz létre az egyik géptől a másikig. Az adatbázisszaftver beállítása után a legtöbb program azt kéri. titkosított kapcsolatot kell használni . Megint csak teszteléssei tudunk megbizonyosodni arról. hogy superuserként futtassuk. mint az 55#$ 8 8 8 ABC'. Ha a szerverr bármikor feltörik. amelyek nagyrészt elvégzik helyetrünk a védőka­ rakterek kiosztásának munkáját. ha a felhasználókat csak arról a számítógép­ ről engedjük csatlakozni az adatbázishoz. Sok adatbázisszerver funkciói között megtaláljuk azt a lehetőséget. hogy adatbázisunk megfelelően kezeli az adatokat: Próbáljunk az űrlapokba olyan értékeket bevinni. Ezt elkerülendő min­ denképpen a következő módosítást kell végrehajtanunk my. hogy nem elegendő ezekre a függvényekre támaszkodni. érdemes lehet alagutat (tunne!) létrehozó terméket választani. hogy soha ne küldjünk a szer­ verre szűretlen adatokat. Ne feledjük megtenni ezt.amennyiben elérhető ilyen. Végezetül nem szabad megfeledkezni arról.és a 25-ös az SMTP­ forgalomhoz) ezen a biztonságos kapcsolaton keresztül vannak a másik géphez irányítva.SSL néven ismert protokollt használva) kapcsolódjunk hozzájuk. Ha a my. Az első és legfontosabb. ha a kiszolgáló teljesen le van terhelve. Minden bizonnyal szeretnénk elkerülni. álcala egyszerre kezelni képes kapcsolódá­ sok száma nagyobb legyen. a beviteli űrlapok minden mezöjénél típusellenőrzést kell végrehajtani. teljes rendszerünk veszélyben lesz.3.! Számokat vagy dátumokat fogadó mezőkbe próbáljunk olyan értelmetlen értékeket beírni. akkor érdemes csak a localhostról vagy a gép által használt IP-címröl érkező kapcsolódásokat engedélyezni. hogy szükség esetén idézőjelek közé kerüljön az. Ö így akkor is bejelentkezhet és dolgozhat. hogy rickosírott kapcsolaton keresztül (általában a Secure Sockets Layer .a fürkésző szemek elöli elrejtésük érdekében . Ha webszerverünk állandóan ugyanazon a gépen működik. hanem azokat a számírógépeket is meghatározhaguk. Ha bármikor is a nyilvános interneten keresztül kell adatbázisszerverhez kapcsolódni. a védőkarakterek használatát lehetövé tevő függvények (például a mysqli_real_escape_string vagy a mssql_ escape_string ) segítségével legalább alapszintű védelmet kialakitharunk.ini fájlunkban: max connections=151 16 Azért engedélyeztünk eggyel több kapcsolatot. máris hibás konfigurációt kapunk. hogy . ha ilyetén szándékunkat megerősítve kényszerítjük rá . Ha nem. mert a MySQL mindig fenntart egyet a rendszergazdának. A kódban végrehajtott ellenőrzéssei pontosabb hibaüze­ neteket adhatunk.mó­ dosítsuk az adatbázis könyvtárainak és fájljainak rulajdonosait. és a TCP /IP portok (például a 80-as port a HTTP. DELETE FROM Artalmatlan_Tabla' stb. Azonban az is kiderült már számunkra. akkor teljesen helyénvaló. és csökkenthetjük az adatbázisainkra leselkedő biztonsági kockázatot. illetve a vonatkozó jogosultságokat. mint például a .

ami lehet ismert operációs rendszeren .és biztonsági réteget helyezve még jobban védi belső hálózatainkat. Demilitarizált zóna 16 Adatbázis· szerver 16. legyen szó céges irodai hálózatról vagy adatközpontról. Ebben szervert a rendszerben a webes alkalmazásainkat futtató kiszolgálókat (és más szervereket. Bár utóbbi támadók kevesebben vannak.futó szaftver vagy hálózati eszközgyártótól beszerzett.3 ábra). hogy A TCP /IP protokoll. Linuxon vagy Microsoft Windowsan .vagy levelező­ ) elkülönítjük az internettől és a belső vállalati hálózatoktól egyaránt (16.3 ábra: A DMZ két legnagyobb előnye: • Demilitarizált zóna (DMZ) megvalósítása A belső és külső támadásoktól egyaránt védi szervereinket és webes alkalmazásainkat. mondván valamikor még szűkségűk lehet rá. hanem a belső. csak a lehető legszűkebb jogosultságokkal hozzuk létre a fel­ használókat! Nem érdemes széles körű jogosultságokat kiosztani nekik. amik nem csak webes alkalmazásainkat fogják védeni. dedikált hálózatbiztonsági berendezés. a cég működéséről kiter­ jedt információkkal rendelkeznek. viszonylag egyszerűen tájékozódhatunk az ilyen módszerekről. A hálózat védelme Számos módszer létezik a webes alkalmazásunknak otthont adó hálózat védelmére. hogy ezeken a porto­ kon keresztül forgalom érkezzen hálózarunkba vagy menjen ki. és ezek birtokában akár nagyobb kárt képesek okozni. például a céges fájl. Tűzfallal tehetjük ezt meg. hogy különböző portokat ren­ mások bolygassanak.például FreeBSD-n. DMZ használata Már utaltunk rá. amelyben szervereinket és alkal­ mazásainkat üzemeltetjük. Az ilyen kockázat mérséklésének egyik módja az úgynevezett demilitarizált zóna ( demilitarized zone . csökkentjük annak kockázatát. Tűzfalak telepítése Ahogy a PHP-ben írt webes alkalmazásunkba érkező minden felhasználói inputot szűrnünk kell. amelyre az internet épül.DMZ) megvalósírá­ sa. hogy számítógépeinket vagy szervereinket (és ezáltal webes alkalmazásainkat) feltörjék. ugyanígy kell eljárni a háló­ zarunkba érkező teljes forgalommal. ezek kis szerepet játszanak a külvilággal való érintkezésünkben. delünk az eltérő úpusú forgalmakhoz (a HTTP-hez például a 80-as port tartozik). hogy szervereinket és webes alkalmazásainkat nem csak külső személyektől érkező támadás fenyegeti. Vállalari hálózarunk és az interner közé több tüzfal.Webes alkalmazások biztonsága 261 Amikor a jogosultsági és hitelesítési rendszerrel dolgozunk. Bár ezek részletes bemutatása meghaladja könyvünk lehetőségeit. éspedig úgy. A tűzfal feladata a nem kivánt forgalom kiszűrése és a hozzáférés megakadályozása hálózatunk azon részeihez. Ha megtiltjuk. Éppen ellenkezőleg: szűkség esetén kell további jogosultságokat adni. • . amelyeket nem szeretnénk. portokon keresztül működik. Sok portot szigorúan csak belső hálózati forgalomra használunk. rosszindulatú felhasznáJók is kockázatot jelentenek.

Egyes hálózatieszköz-gyártók árulnak a DoS támadások kockázatát és hatását mérséklő berendezéseket. Egyéb operá­ ciós rendszerek. amire nincs szükségük. hogy webes alkalmazásunk továbbra is hibátlanul működik. például a FreeBSD. A Microsoft Windows 2000 és az XP operációs rendszer használóinak mindenképpen érdemes végigfutniuk a szerverük által futtatott szolgáltatások listáján. Tartsuk naprakészen operációs rendszerünket! Számítógépünk biztonságáról úgy tudunk legkönnyebben gondoskodni. Jellernzően attól a szoftvergyártótól kaphatunk tájékoztatást. Kiszolgálóink még akkor is a támadás áldozataivá válhatnak. de kiszolgálónkban egyáltalán nincsen FireWire hardver. fejezetben bemutatott. . Felkészülés a DoS és D DoS támadásokra Napjaink talán legfélelmetesebb támadása a 15. hibajavítások és frissítések után kutat! Hogy pontosan hol keressünk a sebezhetőségekről információt. a Red Hat vagy a SuSE Linux. megosztott szolgáltatásmegtagadással járó (D DoS) támadások eitéritett számítógépekkel. hogy valaki már rákérdezett az interneten (és választ is kapott kérdésére). szolgáltatásmegtagadással járó (DoS) támadás. vagy reagálni rá. hogy némi kutatást folytatva tájékozódik a hálózatainkra és az azokon lévő telepítésekre leselkedő veszélyekről és kockázatokróL Az így megszerzett információk birtokában. Különösen igaz ez. folytassunk egy kis kutatómunkát! Igen valószínű. a PHP és az ahhoz kapcsolódó könyvtárak. Amint eldönrjük. hogy milyen operációs rendszert fogunk élesben használni. illetve a Sun Microsystem Solaris operációs rendszere. ha az nem kifejezetten ellenük irányul. Csak azt futtassuk.Az alábbi­ akat lehet és kell megtennünk ennek érdekében. amire valóban szükség van! Sok kiszolgálón előforduló probléma. az Ubuntu Linux vagy az OpenBSD esetében általában az azokhoz kötődö közösségek weboldalait érdemes látogatni. Sajnos az ilyen típusú támadást nagyon nehéz megelőzni. Számítógépünk és az operációs rendszer biztonsága Még valaminek a védelméről gondoskodnunk kell. A legkevesebb. akitől operációs rendszerünket vásároltuk. ezeket a javításokat is érdemes tesztkörnyezetben kipróbálni. Akárcsak a szoftverfrissítéseket.f�ezet A DMZ tervezését. köztük például levelezőszerverek. illetve az adatbázis­ szerver szoftvere. férgekkel vagy a szoftvertelepítések gyengeségeit kihasználó egyéb eszközökkel dolgoznak. valamint internetszolgáltatónkkal (vagy a szervereink hosztolásával megbízott szolgáltatóval) egyeztetve fel lehet készülni az ilyen tá­ madás által előidézett helyzetre. amit hálózati rendszergazdánk megtehet. telepítését és üzemeltetését a webes alkalmazásunkat üzemeltető hely hálózati rendszergazdáival kell egyeztetni. mint a webes alkalmazásunkat futtató kiszolgáló. Ha valamely szolgáltatás eseté­ ben bizonytalanok vagyunk. úgy nem kell a biztonságuk miatt sem aggódn unk. az az általunk használt operációs rendszer szoftverétől függ. de átfogó megoldás egyelőre nem létezik az ilyen támadások ellen. A há­ lózati DoS és a még fenyegetőbb. Microsoft fájlrendszer-megosztások (az SMB protokollon keresztül) stb. Sokszor másra nincs is szükségünk. De akár a TCP!IP vagy hasonló protokollok kialakítási problémáit is felhasználharják a kiszemelt számítógép elárasztására és a szabályosan viselkedő felhasz­ náJók csatlakozási kéréseinek meghiúsítására. és tényleg szükség van-e rá.Webes alkalmazásunk futtatásához elegendő a web­ kiszolgáló szoftvere (például liS vagy Apache HT TP Server). készítsünk tervet arra. ott megtudhatj uk. hogy hogyan telepítsük a frissítéseit és javításait! Bízzunk meg valakit. és ez nem más. a békesség kedvéért inkább kapcsoljuk ki őket. Természetesen érdemes képben lennünk operációs rendszerünket és a biztonsági javításokat illetően: ha egy adotr operációs 16 rendszer FireWire alrendszerét érinti a biztonsági javítás.262 16. hogy mire való az adott szolgáltatás. és csak sikeres telepítésük és működésük után tegyük fel őket élesben müködő kiszolgálóinkral Így nem az éles szervereinken kell megbizonyosodnunk arról. ha az a Microsoft Windows. hogy milyen friss biztonsági javításokat ajánlanak. akkor egy­ értelműen időpocsékolás végigmenni a javítás tesztdési és telepítési folyamatán. majd kikapcsolni azt. hogy operációs rendszerünk szoftvere a lehető legfi-issebb legyen. FTP szerverek. hogy alapból számos szoftver fut rajta. aki a megfelelő forrásokat rendszeresen ellenőrizve ri­ asztások. ha figyelünk. Ha más szoftvert nem használunk.

végreh:ytását: Gondoskodjunk az összes adat napi biztonsági mentéséről fizikailag másik helyszínen. amíg a rendszert nem száz százalékban ismerő emberek annak helyreállításán és újraindításán dolgoznának. ha webes alkalmazásai nem len­ nének elérhetők több mint egy hétig. ha tényleg beüt a ménkű. akik egyszerűen eladás céljából próbálják meg eltulajdonítani az ilyen gépeket. így adatközpontunk teljes meg­ semmisülése esetén is megmaradnak adataink! Legyen kézzel írott. nem vicc. kihúzza a kiszolgálót a há­ lózatból. Vannak olyanok. ám a könyörtelen valóság az. mégis gyakran figyelmen kívül hagyott része. amelyek például az alábbi események bekövetkezése esetén felmerülő kérdésekkel foglalkoznak: Adatközpontunk valamilyen katasztrófa következtében részben vagy egészben megsemmisül. Egy naponta több millió dolláros bevételt elérő vállalat igen komolyan megérezné. 16 Hogyan tovább� A Hitelesítés megvalósítása PHP-vel és MySQL-lel című 17. Különböző módszereket ismerünk meg. amit az ilyen nagyságrendű események okoznának abban az esetben. és vígan kisétál vele. kérdezzünk meg egy informatikai vezetőt. a szervergépek ellopására nem csak az ipari kémkedés és az adatlopás lehet a motiváció. hogy mi történne kiszolgálóikkal vagy inkább teljes adatközpontjukkal. Egy külső támadónak vagy egy elégededen alkalmazottnak sikerül webes alkalmazásaink összes adatát megsemmisíte­ me.szükség esetén.bár szerencsére viszonylag ritkán. Az ilyen eseményekre felkészülve. . és mindannyian súlyosan megsérülnek (vagy meghalnak). fizikailag szintén máshol tárolt feljegyzésünk a szerverkörnyezet létrehozására és webes alkalmazá­ sunk beállítására vonatkozó utasításokkal l Legalább egyszer próbáljuk el a teljes helyreállításri Készítsünk teljes másolatot webes alkalmazásunk forráskódjárót és tartsuk ezt is másik helyszínen! Nagyobb munkahelyi csapatok esetén tiltsuk meg. Különböző okok miatt. hogy minden kolléga ugyanabban a járműben (például autóban vagy repülőgépen) utazzon. hogy a webes alkalmazása­ inkat futtató kiszolgálókat biztonságos környezetben tartsuk. majd hóna alá csapja. Ez. ha a gépeknek otthont adó épület leégne. Az alábbiakkal segithetjük a katasztrófa-elhárírási terv létrehozását és . aki vészhelyzet vagy bármilyen probléma esetén nem munkaórák alatt is köteles bejönni! Olyan szerződést kössünk a nekünk a hardvereket értékesítő partnerrel. hogy valaki egyszerűen besétál az épületbe. Mivel egy átlagos jellemzőkkel bíró kiszolgáló nem olcsó mulatság. hogy ilyen dolgok előfordulnak. Az üzleti szervezetek azonban jellernzően nem enged­ hetik meg maguknak a leállás t. A kataszttófa-elhárítási tervezés a szolgáltatás kritikus. hogy adatközpontunk megsemmisülése esetén az új hardver azonnal elérhető legyen! Nagyon idegesítő lenne négy-hat hétig várni az új szerverek megérkezésére. fejezetben alaposabban megvizsgáljuk a felhasználék azonosítását lehetövé tevő hitelesítést. A terv elkészítése jellem­ zően olyan dokumentumok vagy folyamatok összeállításából áll. hogy egy esetleges baleset ne érinehesse a csapat minden tagját! Automatizált eszközök futtatásával ellenőrizzük a szerver megfelelő működését. bekövetkezésüket egyértelmű akciótervvel várva és az akcióterv kritikusabb részeit elpró­ bálva hatalmas veszteségek potenciális lehetőségétől kímélhetjük meg üzleti szervezetünket. és jelöljünk ki egy alkalmazottat. legyen az a szolgáltatás pusztán egy webes alkalmazás vagy bármi egyéb (például vállalkozásunk mindennapi működtetése). Katasztrófa�elhárítási terv Ha szeretnénk teljesen üres.Webes alkalmazások biztonsága 263 Kiszolgálónk fizikai biztonsága Korábban már említettük azt a biztonsági fenyegetést. Éppen ezért igen fontos. és csak annak tegyük őket elérhetővé. s:Ynos. a semmibe révedő tekintetet látni. Fejlesztőcsapatunkat ebédszünetben elüti egy busz. de sokan nem szeremek szerencsédenségekről és támadásokról beszélni. ha teljesen felkészületlenül érné őket. vagy erős földrengésben elpusz­ tulna! Az informatikusok ijesztően magas aránya egyáltalán nem tudna válaszolni. addig. köztük az oldal felhasználéit PHP és MySQL segítségével ellenőrző hitelesírést. akiknek valóban dolguk van velük. A vállalati központ leég.

Ráadásul nem elég ezt csak megkérdezni. ki látogatja oldalunkat. hogy egy adott számírógépen lévő adott fel­ használói névvel egyetlen személy látogatja csak oldalunkat. hogy nem szükséges min­ den vásárláskor minden adatot begépelni ük. de csak azon látogatóknak. JavaScript segítségével az esetek többségében azt is megállapíthatjuk. A látogatók adatainak védelme szempontjából szerencsés. Szinte biztos. Minden számítógép egyedi IP-címen kereszrül csatlakozik az internethez. Egy-egy számítógépen több felhaszná­ ló is osztozhat. kinek a birtokában van az IP-cím. Ha legközelebb találkozunk ugyanazzal a címmel. akkor arra a gépre sütit (cookie-t) rakva azonosíthatjuk a felhasználót. Kideríthetjük. A New York Times újság (http:/ /www. ők viszont testre szabhatják saját maguk számára az oldal felületét. Ha elfogadjuk azt a feltételezést. annak melyik verzióját és milyen operációs rendszert futtat. mint a nevük. Sok weboldal igen hathatós eszközökkel kényszeríti a felhasználókat személyes adataik megadására. hogy a lá­ togatók kijelzője milyen felbontásra és színmélységre van állítva. hanem kérni kell. és amikor legközelebb találkozunk a látogatóval. sok esetben hasznos dolog tisztában lenni azzal. Az internetszolgáltatóhoz (ISP) berárcsázó fel­ használók jellemzően ideiglenesen használhatják a szolgáltaró egyik címét. Ez azr jelenti. hogy segítségük nélkül nagyon keveset rodharunk meg rólunk. A fejezetben az alábbi főbb témakörökkel foglalkozunk: Látogatók azonosítása Hozzáférés-szabályozás megvalósítása Alapszintű hitelesítés Alapszintű hitelesítés PHP-ben Az Apache alapszintű . hogy ez a feltételezés nem minden felhasználó eserén állja meg a helyét. következő látogatásukkor valahogyan össze kell kapcsolnunk az egyes fel­ használókat az általuk korábban megadott adatokkal. Ha tudni szeretnénk valamelyik látogatónk nevét vagy egyéb adatát.és MySQL-módszerekkel hitelesíteni. Az IP-címek nem olyan mértékben alkalmasak a látogatók azonosítására. hogy a felhasználó milyen böngészőt. hogy hogyan lehet felhasználóinkat különböző PHP. Ha információt kértünk és kaprunk látogatóinktól. hogy az állandó internerkapcsolattal rendelkező felhasználó állandó (fix) címmel rendelkezik. hogy ki is ö tulajdonképpen.slashdot. mint elsőre hihetnénk. hogy már másik számítógép használja.és fórumoldalon (htrp:/ /www. A Slashdot nevü hír. Az IP-címek azonban nem egyformán hasznosak számunkra. Általánosságban igaz.17 Hitelesítés megvalósítása PHP--vel és MySQL--lel Ebben a fejezetben arról lesz szó. . illetve milyen nagy a böngészőjük ablaka. Legalább alkalmanként meg kell kérdeznünk látogatónkat. hogy valahogyan bizonyírsa be: rényleg az. akik hajlandók megadni olyan ada­ raikar. és bárki használhat egynél több gépet is. Az internetfelhasználók számára előnyös lehet. A látogató IP-címéből valamilyen mértékben következtetni tudunk rá. A legtöbb e-kereskedelmi oldal az első rendelésnél elkéri és eltárolja a vásárlók adatait. meg kell kérdeznünk tőle. org) csak a regisztrált felhasználók írhatnak bejegyzéseket. akkor könnyen lehet.com) tartalma ingyenesen elérhető. Kis energiával ugyanakkor a szerverek egész sok információt összegyűjthetnek a hozzájuk kapcsolódó számírógépekről és hálóza­ rokróL A böngészők általában azonosítják magukat. és gyakran egész jól tippelhetünk a látogató föld­ rajzi elhelyezkedésére is. nagy valószínü­ séggel másik IP-címe lesz. htaccess hitelesítésének használata Amod auth_mysql hitelesítés alkalmazása Egyéni hitelesítési folyamat létrehozása Látogatók azonosítása Ugyan az internet eléggé anonimitásbarát médium. akinek mondja magár. hogy a böngészőik által megadott információk nem alkalmasak azonosítá­ sukra.nytimes. a nemüle és a háztartásuk teljes jövedelme. közlik a kiszolgálóval.

. és használhatjuk más célokra..ata-..:-::. Kérjük.-. .... de nem helyesen.W=. hibaüzenetet jelenítünk meg. például tartalom testre szabására (perszonalizálásra) is..--. 17 Tessék! 17. hogy hozzáférést adjunk adott oldalakhoz vagy információforrásokhoz. �� távozzon! �-.. _ � -=======:-:: !. tlf . hogy hitelesítésnek (authentication) nevezzük azt...f�ezet Az e-kereskedelem biztonsági kérdései című fejezetben szóba került. felhasználói nevet és jelszót kérő HTML űrlap jelenik meg.. Ha a fájl paramé­ terek nélkül töltődik be. Egy igazi oldalon ennél azért barátságosabb üzenetet érdemes használni.. Hozzáférés�szabályozás megvalósítása Az egyszerű hozzáférés-szabályozás könnyen megvalósítharó.. ha a felhasználó megadja egyedi felhasználói nevét és jelszavát..1 példakódnak három kimenere lehetséges.....3 ábrán az ilyen típusú tartalomra látunk példát..A hitelesírést jellemzően arra használjuk.2 ábrán a hibaüzenette látunk példát.. A hitelesítés weboldalakon használt általános módszere az.2 ábra: Ha a felhasználó nem megfelelő adatokat ad meg... jelentkezzen be F.. megjelenik a titkos tartalom...---�_ -� · __ _ � - · _'""' .266 17.. Ha a paramétereket megadják ugyan.. Ha a megadott paraméterek helyesek.A 17.... � .1 ábra: A HTML űrlap felhasználói nevet és jelszót kér a látogatóktól a hozzáféréshez. vagy éppen ellenkezőleg: megtagadjuk a hozzáférést... M� . a kód hibaüzenetet jelenít meg. . �- cr��ft u-� � -_ Kérjük.. A 17. A hitelesítés lehet opcioná­ lis..��· ·� ��.. A 17. -w 17....- .---..::::_· 17.1 ábrán ilyen típusú űrlapot látunk..3 ábra: Megfelelő adatok bevitele esetén a kód megjeleníti a tartalmat. ami­ kor felkérjük a felhasználót személyazonossága bizonyítására.- _ .A 17.--���--.�.._ lttool � .

17. Egyrészt a kódon belül nem egyszerűen módosírhatók az adatok. $jelszo = $ POST['jelszo'].2 példakódban az oldal látogatóit adatbázis segítségével hitelesítő kódot láthatunk. Technikailag lehetséges. amely a kiszolgálón fut. else hogy örül.Hitelesítés megvalósítása PHP-vel és MySQL-lel 267 A 17. érdemes inkább adatbázist használni. hogy csak az arra jogosult felhasznáJók tekintsék meg az adott oldalt. illetve a jelszavak megváltoztatására. jelentkezzen be!</hl> <p>Az oldal titkos. Ökölszabályként elmondható.2 és 17. illetve a felhasználói jelszavak módosítását lehetövé tevő kódot. ?> A 17.1 példakód egyszerű hitelesítési mechanizmust valósít meg. de mások is írhatják vagy módosírhatják. mint egyszerűen a kód belsejébe írni őket. Amennyiben az adatokat a kódban vagy egy másik adatfájlban tároljuk.1 példakód: ti t kos. 17 .</p> <form method="post" action="titkos. viszont a felhasz­ náJók sokkal gyorsabb hitelesítését teszi lehetövé. Jelszavak tárolása Számtalan alkalmasabb hely kínálkozik a felhasználói nevek és jelszavak tárolására. php-Egyszerű hitelesítési mechanizmust biztosító PHP és HTML kód <?php //rövid nevek létrehozása a változóknak $nev = $_POST['nev']. 17. Ebben az esetben egyszerűen megírhatjuk az új felhasználókat hozzáadó. hogy láthatja ezt a titkos oldalt!</p>". if ((1isset($nev)) l l (!isset($jelszo))) //A látogatónak meg kell adni nevét és jelszavát ?> <hl>Kérjük. távozzon!</hl> <p>Nem jogosult megtekinteni ezeket az információkat. a kód futási sebességének jelentős lelassulása nélkül csak korlátozott számú felhasználót tudunk kezelni. ll a látogató név/jelszó párosa nem megfelelő echo "<hl>Kérjük. Ha nagyobb mennyiségü adatot kívánunk fájlban tárolni és abban keresni. Ha így teszünk. A felhasználói nevek és jelszavak adatbázisban tárolása nem teszi érzékelhetően bonyolultabbá a kódot. hogy ha száznál több elemből álló listát akarunk tárolni és abban keresni.</p>".3 ábrán Járható funkcionalitást megvalósító kód a 17. Ez a kód mindazonáltal néhány komoly problémát is felvet: A kód a felhasználói nevet és a jelszót is tartalmazza Egyszerű szövegként tárolja a jelszót Egyetlen oldalt véd Egyszerű szövegként küldi el a jelszót Ezeket a problémákat némi erőfeszítés árán sikeresen kezdhetjük. sokkal könnyebben írhatunk programot a fel­ hasznáJók létrehozására és eltávolítására. de nem célszerű saját magát módo­ sító kódot írni. A 17.php"> <p>Felhasználói név: <p>Jelszó: <input type="text" name="nev"></p> <input type="password" name="jelszo"></p> <p><input type="submit" name="submit" value="Bejelentkezés"></p> </form> <?php else if(($nev=="felhasznalo") && ($jelszo=="jelszo")) ll a látogató név/jelszó párosa helyes echo "<hl>Tessék!</hl> <p>Fogadjunk. akkor egyszerű fájl helyett adatbázist kell használni.1. a meglévő felhasználókat törlő. amely lehetövé teszi. Ha az adatokat másik fájlban tároljuk a szerveren. végeredményben olyan kódot helyezünk kiszolgálónkra.1 példakódban Járható.

ll a látogató név/jelszó párcsa nem megfelelő echo "<hl>Kérjük.". { echo "Nem sikerült kiválasztani az adatbázist.268 17. $sor = mysqli fetch row($eredmeny}.".". . hogy láthatja ezt a titkos oldalt!</p>". if(!$eredmeny} $lekerdezes}. jelentkezzen be'</hl> <p>Az oldal titkos. else hogy örül.$jelszo. if ((!isset($nev}} l l ( 1 isset($jelszo}}} //A látogatónak meg kell adni nevét és jelszavát ?> <hl>Kérjük. "webeshitelesites"}.php"> <p>Felhasználói név: <p>Jelszó: <input type="text" name="nev"></p> <input type="password" name="jelszo"></p> <p><input type="submit" name="submit" value="Bejelentkezés"></p> </form> <?php else ll csatlakozás mysql-hez $mysql = mysqli connect("localhost". if ($darab > 0} { ll a látogató név és jelszó párosa megfelelő echo "<hl>Tessék!</hl> <p>Fogadjunk. exit. "webeshitelesites".$nev. php-A MySQL használatával továbbfejlesztett. if (!$kivalasztott} "hitelesites"}. { echo "A lekérdezés nem futtatható. exit.</p>". ll az adatbázis lekérdezése egyező rekord után kutatva $lekerdezes = "SELECT count(*} FROM jogosult_felhasznalok WHERE nev = ''' . ll a megfelelő adatbázis kiválasztása $k1valasztott = mysqli select db($mysql. $jelszo = $ POST['Jelszo'].f�ezet 17. exit. $eredmeny = mysqli_query($mysql.2 példakód: tit kos_adatbazis. távozzon!</hl> <p>Nem jogosult megtekinteni ezeket az információkat.'' ' '' . 17 Sctarab = $sor[O]. if (!$mysql} echo "Nem sikerült csatlakozni az adatbázishoz. egyszerű hitelesítési mechanizmus <?php $nev = $_POST['nev'].</p> <form method="post" action="titkos adatbazis.'' ' and jelsza = '''.

40 karakteres sztringet ad vissza. aki létrehozta. Csak arról kell meggyőződnünk. a jelszavak egyszerű szövegként tárolásával szükségtelen kocká­ zatnak tesszük ki magunkat. Az md5( ) függvény által megvalósított Message Digest 5 (MDS) algoritmus ennél erősebb. a hitelesites táblát és a két mintafelhasználót CREATE DATABASE hitelesites. PRIMARY KEY (nev} ). akár sima fájlban őrizzük az adatokat.3 példakód: hitelesi tesi _adatbazis _letrehozasa. Az shal () függvény hasznosságát az adja. Az shal () PHP függvény erős. FLUSH PRIVILEGES. azaz igazra állítjuk. hogyan nézett ki a jelszó az shal () függvény alkalmazása előtt. 'jelszo'). Prototípusa a következő: string shal ( string str [.Hitelesítés megvalósítása PHP-vel és MySQL-lel 269 ?> Az itt használt adatbázis létrehozásához csatlakozzunk a MySQL-hez root felhasználóként. Jelszavak titkosítása Akár adatbázisban. és futtassuk a 17. egyirányú kriptográfiai hash függvény. GRANT SELECT ON hitelesites. INSERT INTO jogosult felhasznalek VALUES ('felhasznaloi_nev'.* TO 'webeshitelesites' IDENTIFIED BY 'webeshitelesites'. Ezr nem lehet visszafejteni.3 példakód tartalmár! 17. a függvény egy pszeudo-véletlenszerű. hogy kimenere egyértelmű (de­ terminisztikus). hogy az shal () függvényt a begépelt és az eredeti jelszóra alkalmazva ugyanazokat a kimeneteket kapjuk-e. Legyen adott például a" jelszo" karakterlánc: az shal () függvény ekkor a" 5baa6le4c9b93f3f0682250b6cf833lb7ee68 fdB" sztringet adja vissza. Amennyiben a nyers_kimenet paramétert true-ra. Egyirányú hash algoritmussal minimális többleterőfeszítéssel érhetünk el magasabb szintű biztonságot. még az sem tudja "jelszo"-vá visszaalakitani. Az ilyen PHP kód helyett: if (($nev == 'felhasznaloi_nev') ($jelszo == 'jelszo')} //OK. A legrégebbi és a legkevésbé biztonságos a crypt () függvény által kínált Unix Crypt algoritmus.Ezek a MySQL lekérdezések hozzák létre a hitelesites adatbázist. jelsze varchar(40). Ha ugyanazt a karakterláncot adjuk neki. a jelszavak egyeznek J Nem szükséges tisztában lennünk azzal. . USE hitelesites. bool nyers_kimenet]) Ha adott az str karakterlánc. Még erősebb ugyanakkor a S ecure Hash Algorithm l (SHA-1) nevű algoritmus. { && 17 a jelszavak egyeznek ilyet érdemes használni: if (($nev == 'felhasznaloi_nev'} && (shal($jelszo )== '5baa6le4c9b93f3f0682250b6cf833lb7ee68fd8'}} //OK. PHP-ben számos egyirányú hash függvény elérhető. CREATE TABLE JOgosult felhasznalek (nev varchar(20). INSERT INTO jogosult felhasznalek VALUES ('teszt_felhasznalo'. így első ránézésre nem sok értelme van ennek az egésznek. shal (' jelszo')). az shal () mindig ugyanazt az eredményt fogja visszaadni. sql. 20 karakteres bináris karakterláncot kapunk helyette.

Ha s. Először a PHP. Tóbb oldal védelme Ennél kicsit nehezebb azt megvalósítani. Mivel 17 Alapszintű hitelesítés használata A felhasznáJók hitelesítése szerencsére olyan gyakori feladat.''' jelsze = shal('". egy másikat ('teszt_ felhasznala' vagy l lehet. hogy a 17. A kódok és webszerverek hitelesítést kérhetnek a böngészőtőL Ebben az esetben a böngésző felelős azért. az shal ( ) PHP függvényt vagy az SHAl () MySQL függvényt egyaránt használhatjuk. Mivel minden egyes lekért és megje­ lenített oldal esetén oda-vissza küldözgetjük a böngészőnek a jelszót. nincs automatikus kapcsolat vagy összefüggés az ugyanattól a személytől érkező kérések közötr. ám ezek mind ugyanazt a célt szolgálják.3 példakódra visszatekintve láthatjuk. vagy megnézné a böngészési előzményeket. Tó bb oldalt legegyszerűbben a webszerver által kínált hozzáférés-szabályozási mechanizmusok segítségével rudunk védeni. ha ugyanazon a gépen visszalépkedne a gyorsítótárazort oldalakon. Az ilyen hitelesírést PHP-vel vagy a webszerverbe beépített mechanizmusokkal rudjuk kiváltani. . és felhasználói beavatkozás nélkül. az általuk meglátogatott védett oldalakat bárki megtekínthetné. Mi történik ebben az esetben akkor. Az alapszintű hitelesítés megoldja a gyorsítótárazás problémáját.$jelszo. majd részletesebben a 27. a felhasználói adatok szóközöket és URL-ekben nem megengedett más karaktereket is tartalmazhatnak."') A fenti lekérdezés megszámolja a jogosul t_felhasznalok nevü tábla azon sorait. Megtehetnénk. A HTTP ezen funkcióját alapszintű hitelesítésnek (basic authentication) nevezzük. Mivel a HTTP nem állapottartó. majd az Apache módszerét fogjuk megvizsgálni. az urlencode( ) függvény segítségével rudnánk biztonságosan kódoini ezeket a karaktereket.2 példakódban lévő SQL lekérdezést: SELECT count(*) nev = FROM jogosult felhasznalek WHERE and '''. a böngészőnek nem szükséges min· den oldalnál bekérnie a felhasználói adatokat. Amennyiben csak egyedi felhasználói neveket lehet választani. A böngésző jellemzöen mindaddig eltárolja ezeket. amíg a felhasználó nyitva tartja a böngészőablakot.1 és a 17. Ez bonyolulttá teszi. a lekérdezés eredménye csak O karakteres sztring.270 17.2 példakódban szereplö kód egynél több oldalt is védjen. A HTTP alapszintű hitele· sítésével a következőkben foglalkozunk. amikor a látogatók honlapunkon belül több oldalt is megnyitnak? Minden bizonnyal elfogadhatatlan lesz számukra.Yát magunk szeretnénk létrehozni ezt a funkciót. a jelsza értéke pedig a$jelszo tartalmára alkalmazott SHAl( függvény által visszaadott értékkel egye­ ) zik meg. hogy az adatbázis oszlopai fogadni tudják az ekkora adatokat! A 17.1 példakódban szereplö kód bizonyos részeit kellene beilleszteni minden védeni kívánt oldalra. hogy a HTTP beépített hitelesítési eszközökkel rendelkezik. Tegyük fel. Az auto_prepend_file és az a uto_append_file segítségével automatikusan hozzáírhatjuk a kódot a meghatározott könyvtárakban lévő összes fájl elejéhez vagy végéhez. ám a böngésző a jelszót továbbra is minden egyes kérésnél elküldi a kiszolgálónak. automatikusan újraküldi öket az azt kérő kiszolgálónak. a munkarnenet-vezérlést pedig a 23. Rövidesen áttekintjük ezeket a mechanizmusokat. hogy a felhasznáJók által megadott adatokat hozzáfűzzük az oldalon lévő összes hiperhivatkozáshoz.. hogy a két lehetséges megközelítést illusztrálandó létrehozrunk egy felhasználót (' felhasznaloi _nev') nem titkosított. fejezetben mutatjuk be. a 17. Ne feledjük. Bár a webszerver minden egyes felhasználói kéréshez új hitelesítési adatokat igényelhet.például a felhasználó által megadott hitelesítési információt . Ezeknek az utasításoknak a használatát a Kód újbóli jelhasználása ésfüggvényírás címü 5.oldalról oldalra magunkkal vigyük. Két jó módszer létezik a két probléma kezelésére: a HTTP alapszintű hitelesítési funkciója és a munkamenetek (session) hasz­ nálata. az elfogadható felhasználói neveket és jelszavakat nem . ha minden megtekinteni kívánt oldalon újra és újra meg kell adniuk nevüket és jelszavukat. fejezetben mutattuk be. hogy ezt a megközelítést választj uk. A MySQL még a PHP-nél is többféle hash algoritmust kínál. A munkarnenet-vezérlés (session control) mindkét problémára megoldást kínál. hogy az adatokat . fejezet Ahogy korábban már említettük. Ez a megközelítés is felvet azonban néhány problémát. Mivel az adatok a felhasználóknak küldött oldalakba és az általuk felkeresett URL-ekbe illesztődnének be. hogy párbeszédabla­ kot vagy hasonló segédeszközt megjelenítve megszerezze a felhasználótól a kért információt. hogy a hash függvények általában rögzített méretű adatot adnak vissza! Az SH1 függvény esetén ez egy 40 ) pedig titkosított jelszóval.Yánlott közveclenül a kódba beírni. Gondoskocljunk róla. ezt a bizalmas információt a szükségesnél gyakrabban vagyunk kénytelenek továbbítani. Az SHAl () használatához a következöképpen kellene átírni a 17.$nev. Tárolásukra használjunk inkább külön fájlt vagy adatbázist! Amennyiben MySQL adatbázisban tároljuk a hitelesítéshez szükséges adatokat. amelyeknek a nev értéke a $nev változó tartalmával.

így nem túlságosan biztonságos. hogy újra lejátsszák a kiszolgálónak ugyanazt a kérést. php-A HTTP alapszintű hitelesítését kiváltó PHP kód <?php llIIS használata esetén be kell állítani a ll$_SERVER['PHP_AUTH_USER']-t és a ll$ SERVER['PHP_AUTH_PW']-t if ((substr($_SERVER['SERVER_SOFTWARE']. list($�SERVER['PHP_AUTH_USER']. hogy még ez sem kellően biztonságos. amely a tranzakció részleteit hash algoritmussal (általában az MD5-tel) rejti el a kívánesi szemek elől.4 példakód mindkér kiszolgálón futni fog. és egyeden jelszóval védherjük őket. mint a jelszavakat szintén egyszerű szövegként to­ vábbító telnetes vagy FTP-s csadakozások. Mindkettő lehetövé teszi a crackereknek. hogy ugyanazon a kiszolgálón egynél több tartomány is kialakírható. Az elnevezett tartományokkal ugyanakkor egyeden tartományként csoporto­ sírhatjuk az ugyanazon a gépen vagy virtuális gépen lévő könyvtárakat. Az alapszintű és a kivonatos hitelesítés is alacsony fokú biztonságot nyújt. a kivonatos hitelesítés egy másik problémája. érzékelnie kell a kiszolgáló típusát. (!isset($_SERVER['PHP_AUTH_USER'])) (!isset($_SERVER['PHP_AUTH PW'])) O. és a Microsoft Internet Explorer és az Internet Information Server is a kivonatos hirelesí­ rés olyan verzióját tartalmazza. fejezetet! Ennek ellenére sok esetben elegendő lehet egy olyan gyors. Ha erős biztonsági szintre van igényünk. amit éppen elérni kíván. és érvényes felhasználói név és jelszó megadására kény­ szeríti a felhasználókat. amely nem kompatibilis a nem Microsoft-termékekkel. Egyik sem tuclja garantálni a felhasználónak. régebbi böngésző van még használatban. amely nem támogatja ezt a hitelesítési módszert. A tartományok megnevezése úgy történik. ll Helyettesítsük ezt az if utasítást adatbázis-lekérdezéssei vagy hasonlóval' if (($_SERVER['PHP_AUTH_USER'] != 'felhasznalo') ($ SERVER['PHP_AUTH_PW'] != 'jelszo')) ll { . ám viszonylag kevéssé biztonságos módszer is. Ha SS L-lel és digitális tanúsítványokkal ötvözzük az alapszintű hitelesítés t. 17. olvassuk el a Biztonságos tranzakciók megvalósítása PHP-vel és MySQL-lel című 18. mivel továbbítás előtt titkosírja a jelszavakat.1 az ennél biztonságosabb kivonatos hitelesítés (digest authentication) nevű módszert kínálja. a csomagokat megszerezni képes cracker a felhasználó bőrébe bújva bármilyen kérést intézhet a kiszolgálóhoz. Ahhoz. Túl azon. A 17. mint az alapszintű hitelesítés.Hitelesítés megvalósítása PHP-vel és MySQL-lel 271 Az alapszintű hitelesítés egyszerű szövegként küldi a felhasználó nevét és jelszavár. base64_decode(substr($_SERVER['HTTP_AUTHORIZATION']. 0. amelyek mindegyikét különböző felhasználói nevek és jelszavak védik. A kivonatos hitelesírést számos webszerver és a böngészők újabb verziói támogatják. A kivonatos hitelesítés valamivel biztonságosabb. Mivel az alapszintű hitelesítés egyszerű szövegként továbbítja a felhasználói jelszavakat. Az alapszintű hitelesítés egy megnevezett tartományt (realm) véd. 6) 'Basic ') ) { $_SERVER['PHP_AUTH_PW']) = 6))). Ugyanazon szerver különböző fájljai vagy könyvrárai eltérő rartományokba tartozharnak. hogy azzal a géppel kommunikál. explode(' :'. && 9) 'Microsoft') && && (substr($ SERVER['HTTP_AUTHORIZATION']. Mindazonáltal igen sok olyan. és kiszolgálótól függően kissé eltérő módon kell viselkednie. akkor a webes tranzakció minden részét kellőképpen vécljük. hogy egyes böngészők nem megfelelően támogatják. de az alapszintű hitelesítés használata a kiszolgáló által beállított környezeti változókra épül.4 példakód: h t tp. Alapszintű hitelesítés PHP�ben A PHP kódok általában platformfüggedenek. A HTTP 1. hogy ugyanaz a HTTP hitelesítési kód a PHP-t Apache-madulként használó Apache szerveren vagy ISAPI-modulként használó IlS szerveren is fusson. Az alapszintű hitelesítés éppolyan (alacsony) fokú biztonságot nyújt.

Ahogy a 17. Megfelelő hitelesítési adatok megadása esetén a felhasználó megtekintheti a kére oldal tartalmár. else ll a látogató megfelelő adatokat adott meg echo "<hl>Tessék!</hl> <p>Fogadjunk. hogy miként kezeli a sikertelen hitelesítési kísérleteket. A Firefox által megjelenített párbeszédablakot a 17. a kiszolgálón calálható szöveges fájl soraival hasonlítja össze a felhasználói név-jelszó párosokat.</p>".0 401 echo "<hl>Kérjük. Egyesek számára ez előny.1 és 17. távozzon!</hl> <p>Nem jogosult megtekinteni ezeket az információkat. A felhasználó böngészője az. . Ez a kód ugyanis nem jelenít meg HTML űrlapot a bejelentkezési adacoknak. Ha a felhasználó még nem adta meg a hitelesítéshez szükséges adatokat. Hibás felhasználói név-jelszó páros esetén a felhasználó a visszautasításról kap üzene­ tet. vagy automatikusan hozzáfűzhetjük egy könyvtár összes fájljának elejéhez. Az Internet Explorer például három hitelesítési kísérletet enged meg a felhasználónak. 17.4 példakódhoz hasonló eredményeket PHP kód írása nélkül is elérhetünk.4 példakód a fejezet korábbi példakódjaihoz hasonlóan müködik. ?> A 17. Sikercelen hitelesítés. bizonyos fokig a böngészőn múlik.2 példakódok esetében. akkor bekéri azokat. ami egy párbeszédablakot nyit meg. hogy láthatja ezt a titkos oldalt!</p>". és csak ezt kö­ vetően jeleníti meg az elutasításról tájékoztató oldalt. ezt a kódot beilleszthetjük minden védeni kívánt oldalra. Alapszintű hitelesítés az Apache .Authorization failed..4 ábrán láthatjuk. az egyes kísérletek közöte csupán az. azaz .4 ábra: HTTP hitelesítés esetén ajelhasználó böngészője határozza meg a párbeszédablak megjelenését. Retry?'. 401 O. Firefaxban akárhányszor próbálkozhat a felhasználó.. header('HTTP/1. vagy nem megfelelő felhasználói név/jelszó páros header('WWW-Authenticate: Basic realm="Realm-Name"'). Megpróbálja újra?" üzenet jelenik meg.. hogy örül. ha teljes méctékben irányításuk alatt tarthatják a kezelőfelület vizuális elemeit. ha a felhasználó a. Ebben az esetben azonban a felhasználó a korábbiaktól némiképpen eltérő kezelőfelületet lát. Mivel a hitelesítése a böngésző beépített funkciói segítik.272 17. fejezet ll ll a látogató még nem adta meg adatait. if (substr($ SERVER['SERVER_SOFTWARE'].Cancel" gombra kattint. amely egy. { Jogosulatlan hozzáférés'). Legegyszerűbben amod_ auth használható. A Firefox csak akkor jeleníti meg az elutasító oldalt. Az Apache webszerver számos olyan hitelesí­ tési modult tartalmaz. amivel megállapíthatjuk a felhasználó által megadott adatok valódiságát. 9) == 'Microsoft') header('Állapot: else Jogosulatlan hozzáférés'). h t a c c ess fájljaival A 17. mások jobban szeretik.

ami az adott könyvtárban bekapcsolja az alapszintű hitelesítésr. nekünk tetsző módon elnevezhetjük. htaccess. hogy meghatározzuk a jogosult felhasználókat. ha közöljük. de bár­ milyen. Nem szabad a webkönyvtárban tárolni. 401 /l7_feJezet/elutasitas.html AuthUserFile /horne/book/. amit csak sikeres hitelesítés után tekinthernek meg. hanem hogy hol tároljuk. Nem csupán azt tehetjük meg. Sok beállítás megad­ ható egy . hogy örül. ha hasznos információkat jelenítünk meg rajra.ott. htaccess­ kénr kell elnevezni. hogy rnilyen dokumentumot jelenítsen meg sikertelen hitelesítés eserén (HTTP 401-es hiba). a a másik az elutasításé. hogy hogyan hívjuk.htpass 17 közli az Apache-csel. htrnl nevü 17.7 példakód egy Az első sor ErrorDocument azt htaccess fájl. Nem az a fontos.8 minrakódban raláljuk. A második sor AuthUserFile /home/book/.5 példakód a jogosult felhasznáJók által megtekinthető tarralmar állírja elő. htpass a neve. A példában használt . hanem azt is megmondhatjuk. htaccess fájlban. ezért az alábbi sor: . html . hogy a megadort URL nyilvánosan elérhető legyen. de professzionális szemléleter tükröz. mint például a 404-es. Az elutasitas.html közli az Apache-csel. Más direktívákkal saját oldalakat állítharunk be az olyan hibákhoz is. ha ezt az oldalt olyan könyvrárba helyez­ nénk.htrnl.7 példakód: . de HTML előállításához rénylegesen használni kell <html> és a <body> címkéket.5 példakód: tartalom. így a hitelesítés aktiválását is ErrorDocument 401 /l7_feJezet/elutasitas. amikor egy felhasználó sikertelenül próbál meg bejelentkezni a védert területre. 17.6 példakód az elutasító oldal. Ennek általában . ahol a webszerveren keres.htpass AuthGroupFile /dev/null AuthName "Realm-Nev" AuthType Basic require valid-user . illerve mi a reendője elfelejtett jelszó esetén. Az elutasítás eserén megjelenő oldalt nem kötelező elkészíteni. hogy láthatja ezt a titkos oldalt!</p> </body></html> 17. htpass fájlt a 17. távozzon!</hl> <p>Nern jogosult megtekinteni ezeket az információkat. hogy hitelesítésük sikertelen volt. 17.6 példakód: elutasitas.Mintatartalorn <htrnl><body> <hl>Tessék!</hl> <p>Fogadjunk.Minta 401-es hibaoldalra <htrnl><body> <hl>Kérjük. Az előzőekben egyes HTML elemeket kihagytunk.Egy . hogy csak meghatározort csoportokba tartozó jogosult felhasznáJók érhetik el az információforrásokat. A tar talom. hogyan rud regiszrrálni. Ezt a fájlt . Nem sok értelme lenne testreszabort hibaoldalon közölni az emberekkel. Példánk érdekessége a 17. htaccess fájl több Apache konfigurációs beállítást szabályozhat. Mivel ez az oldal akkor jelenik meg. de a példában szereplő hat sor mind a hitelesíréssei kapcsolatos. A példában ezt nem tesszük.html nevü 17. hasznos információ lehet. Az ehhez haszná­ URL ErrorDocument landó szintaktika: ErrorDocument hiba szarna A 401-es hibát kezelő oldal esetében fontos. A 17.zrül bárki letöltheti.</p> </body></htrnl> Ezekben a fájlokban semmi újdonság nincs.Hitelesítés megvalósítása PHP-vel és MySQL-lel 273 Az előző kódéval megegyező eredmény eléréséhez két különálló HTML fájlt kell létrehoznunk: az egyik a tartalom oldala. és ez fogja szabályozni a könyvtárában lévő fájlokhoz és alkönyvtárakhoz való hozzáférést.7 példakódban Iátharó fájl. hol találja a jogosult felhasznáJók jelszavait tartalmazó fájlt.

amely garantáltan üres. majd újra kell indítani a kíszolgálót.minden más. de azt jelenti.Használatával közöljük a htpasswd-vel. Figyeljünk. hogy hozza létre a fájlt. konkrét cso­ portokat vagy. Ez a funkció akkor hasznos. de ne feledjük.8 példakód:. ha nem interaktívan. A . hogy bármilyen változtatáshoz le kell állítani. p és s kapcsolóval a használni kívánt titkosítási algoritmust (vagy a titkosítás hiányát) határozhatjuk meg. ami Unix rendszerek esetében olyan különleges fájl. htaccess fájlt. és újat hoz létre! Az opcionális rn. Ahogy a PHP-s példában.8 példakódban látható fájlt: htpasswd -be /horne/book/. a kiszolgálónak fel kell dolgoznia a . htaccess fájl rninden egyes fájlkéréskor feldolgozásra kerül. htpass fájl minden sorában egy felhasználói nevet.htpass felhasznalo3 jelszo3 htpasswd -b /horne/book/.ez sem igazán alkalmazható több száz vagy több ezer felhasználó esetén. htaccess fájl használata helyett a httpd.A jelszófájl tárolja a felhasználói neveket és aJelhasználók titkosított jelszavát felhasznalol:OnRp9M80GS7zM felhasznalo2:nC13sOTOhp. d.conf fájl viszont csak a szerver elindulásakor. Létrehozásához egy htpasswd nevű kis prograrnot használunk. vagyis alapszintű hitelesítéssei dolgozunk.vagyis webszerverünk fő konfi­ gurációs fájljában. A leg­ több rendszeren a /usr/local/apache/bin könyvtárban találjuk. htpass. ez a -c. Ez a megközelítés gyorsabb ugyan. Ez azt jelenti. hogy a példában szereplő nevet meg kell változtarni. ahogy ez az ötödik sorból is kiderül: AuthType Basic Azt is meg kell határoznunk. A . Az alábbi sor: require valid-user azt jelzi. Minden alkalommal. arnikor egy böngésző a . tartományunknak a "Realrn-Nev" nevet adtuk. a jelszófájlban minden egyes kérésnél keresni kell. . a HTT P hitelesítés használatához itt is meg kell neveznünk a tartományt: AuthName "Realrn-Nev" Tetszőleges tartománynevet választhatunk.htpass felhasznalal jelszal htpasswd -b /horne/book/. cont fájlban. ne pedig kérje azt. megpróbálva összeillő felhasználói név és jelszó párost találni. hogy hol tároljuk a szerverdirektívákat.htpass felhasznalo2 jelszo2 htpasswd -b /horne/book/.htpass felhasznalo4 jelszo4 17 A htpasswd nem feltétlenül található meg elérési útvonalunkon.mint ahogy a példában is tettük. ha a pa­ rancssorból hívjuk meg! Az alábbi parancsok hozták létre a 17. hogy minden szabályos felhasználó számára engedélyezzük a hozzáférést. Mivel több különböző hitelesítési módszer is támogatott. kötegelt (batch) folyamat részeként kívánjuk meghívni a htpasswd programot. Az ilyen típusú hitelesítés könnyen beállítható. majd a jelszófájlt. kettőspontot és az adott felhasználói névhez tartozó titkosított jelszót találunk. hogy a jelszót páraméterként várja. amely az Apache disztribúcióban rnegralálható.ow felhasznalo3:yjQMCPWjXFTzU felhasznalo4:LOrnlMEi/hArne2 A .egyszerűen minden hitelesített felhasználónak hozzáférést adhatunk. A . hogy a nevet a látogatók is látni fogják! Hogy nyilvánvalóvá te­ gyük. Példánkban a Basic.htaccess ilyetén használata azonban felvet néhány problémát. hogy a többi felhasználónál már ne használjuk. hogy kinek engedélyezzük a hozzáférést. fejezet AuthGroupFile Idev/null az AuthGroupFile-lal a /dev/null-ra mutat. hogy. meg kell határozni. A htpasswd prograrnot kétféleképpen használhatjuk: htpasswd [-crndps) jelszofajl felhasznaloinev jelszofajl felhasznaloinev jelszo vagy htpasswd -b[crndps) Egyetlen kapcsolót kell használnunk. mert ha a fájl már létezik. Az első felhasználó hozzáadásakor van szüksége erre a kapcsolóra. A b kapcsaló közli a programmal. ebben az esetben a teljes elérési útját meg kell adni. htpass pontos tartalma változó lesz.274 17. Függetlenül attól. 17. egyszerű fájlt használó módszerhez hasonlóan. a .is meghatározharnánk ugyanezeket. Megadhatunk konkrét felhasználókat. a htpasswd törli. A fel­ használókat és a jelszavakat szöveges fájlban tároljuk. hogy melyiket kívánjuk használni. htaccess fájl által védett fájlt kér. de ne használjuk. a httpd.

például a fejezet korábbi példájában szereplö lakozásához szükséges paramétereket! A direktíva így néz ki: Auth_MySQL_Info hostnev felhasznaloi_nev jelsze hitelesites adatbázist.html AuthName "Realm Nev" AuthType Basic 17 Auth_MySQL_DB hitelesites Auth_MySQL_Encryption_Types MySQL Auth_MySQL_Password_Table jogosult_felhasznalok Auth_MySQL_Username_Field nev Auth_MySQL_Password_Field jelsze require valid-user . Váltsunk a mod_auth_mysql könyvtárra.htaccessfájl MySQL adatbázis alapján hitelesíti a felhasználókat ErrorDocument 401 /17 fejezet/elutasitas. hogy jól dolgoztunk-e. hogy megadjuk amod _auth_mysql számára a MySQL-hez csat­ Legegyszerűbben úgy ellenőrizhetjük. elindul-e az Apache. Csomagoljuk ki a forráskódot! 3. titkosí­ jelszavakkal hitelesíti a felhasználókat. conf fájlban az Auth_MySQL_Info dírektívával indul az Apache. gyorsan rud keresni akár igen nagy felhasználói listákban is. Indításához gépeljük be a következőket: /usr/local/apache/bin/apachectl startssl Ha a httpd. net/projects/modauthmysql oldalról. conf fájlhoz az alábbi sort. de mivel szöveges fájl helyett MySQL adatbázist használ.so 5.9 tott példakód olyan .conf-hoz: LoadModule mysql_auth_module libexec/mod_auth_mysql. Hozzuk létre MySQL-ben a hitelesítési információkat tartalmazó adatbázist és táblát! Nem kell. hogy ez külön adatbá­ zis vagy tábla legyen. Amod auth mysql modul telepítése - Amod_auth_mysql használatához a függelékben leírtak szerint telepíteni kell az Apache-t és a MySQL-t. de a legfrissebb változatot bármikor letölthetjük a http:/ l sourceforge. Mivel azonban szöveges fájlban tárolja a felhasználókat. Ez amodul nagyrészt amod_auth-hoz hasonlóan müködik. amod_au th hitelesítés könnyen beállítható az Apache-csel. ha megnézzük. és telepíteni kell rendszerünkre. 2.htaccess- 17. Szerencsére a mod_auth_mysql hitelesítés az adatbázis sebességével ötvözi a mod_auth egyszerű használhatóságát. hogy a MySQL telepítési mappáját meg kell változtaeni a MakeFile fájlban. 6. használhatunk meglévőt is. Álljon most itt egy rövid összefoglalás! l. majd a make install parancsot! Elképzelhető. amely a fejezet korábbi részében létrehozott adatbázisban tárolt. akkor sikeresen hozzáadtuk amod_auth_mysql modult. 4.Hitelesítés megvalósítása PHP-vel és MySQL-lel 275 Amod auth_mysql hitelesítés használata Ahogy már említettük. futtassuk a make. Amod_auth_mysql modul használata Sikeres telepítése után amod_auth_mysql modult semmivel sem bonyolultabb használni. A 17. majd néhány rovábbi lépést kell végrehajtani. és ráadásul hatékony is. Szerezzük be a modulhoz tartozó dísztribúció tömörített állományát! Ez megralálható a könyvnek a www. Használatához fordítani kell a modult. hogy relepírse. mint amod_auth modult. . htaccess fájlt tartalmaz. Adjuk hozzá a httpd. hogy a modul dínarnikusan töltödjön be az Apache-be. hu/ mellekletek oldalról letölthető mellékletén. Annak érdekében. adjuk az alábbi sort a httpd. bár ezek egyes helyeken korábbi verziók müködésére utalnak. vagy meg kell kérnünk rendszergazdánkat. nem igazán megfelelő sokak által látogatott. A dísztribúció README és USAGE fájljaiban kellő tájékoztatást kaphatunk.perfactkiado. forgalmas oldalak esetén.9 példakód: Ez a .

a munkamenet-vezérlés megismerése után olyan egyéni hitelesítési eljárásokat tudunk majd írni. az Auth_MySQL_Username _Field és az Auth_MySQL_Password_Field határozza meg az adatbázis. Hogyan tovább� A következő fejezetben azt mutatjuk be.org/docs/2. További olvasnivaló A HTTP hitelesítésről részletesen a http:/ /www. Ha a hitelesítés sikertelen. amelyeknél kevesebb kompromisszumot leszünk kénytelenek kötni. Ha nagyobb rugalmasságra és ap­ rólékosabb szabályozásra van szükségünk.txt címen elérhető RFC 2617 ajánlásban olvashatunk. és használarukkor kény­ telenek vagyunk elfogadni bizonyos hibákat és kompromisszumokat. az Auth _MySQL_Password _ Table. A felhasználó böngészője egy párbeszédablakot jelenít meg. A könyv egy későbbi részében. itt is minden hitelesített felhasználó számára megadott a hozzáférés. hogy MySQL jelszótitkosírást kívánunk használni. fejezetben olyan egyszerű hitelesítési rendszert dolgozunk kí. és elnevezzük a tartományt.org/rfc/rfc2617. hogy az új felhasználókat kényelmes módszerekkel vigyük be az adatbázisba. di­ rektívák segítségével módosítottuk a hitelesítés müködését. Mivel a letöltés mérete nem nagy.rfc-editor.html címen érjük el. a Crypt_DES és a MySQL lehetőség közül választhatunk. hogy a 17. A 23. fejezetben egy valós világbeli projekere alkalmazzuk ezt a megközelítést.7-essel. a tábla. a továbbítás és a tárolás összes részfolyamata során. Sikeres hitelesítés esetén a felhasználó megtekíntheti a tartal­ mat. Itt is meghatározzuk a 401-es hiba (sikertelen hitelesítés) esetén megjelenítendő dokumentumot. mintha a teljes kódot mi magunk írtuk volna. Az Apache-ben az alapszintű hitelesírést szabályozó mod_auth dokumentációját a http://httpd.apache. Ezek szükségszerűen kevésbé rugalmasak. hogyan őrködjünk adataink biztonsága felett a bevitel. Ennél _ a direktívánál a Plaintext. A Felhasználók szempontjából ez a mod_auth_mysql modulos példa pontosan úgy müködik. a digitális tanúsítványok és a titkosítás használatára.7 példakódban. Az alapértelmezett Crypt_DES le­ hetőség szabványos Unix DES-titkosítású jelszavakat használ. Szintén az alapszintű hitelesítése választj uk. illetve a fel­ használói név mezőjének a nevét. És akárcsak a 17. Amod_auth_mysql dokumentációját a letöltött tömörített állományban találj uk. Az Auth_MySQL_Encryption Types direktívával adjuk meg. így küzdi le az ebben a fejezetben látott problémák egy részét. és nem minden alapértelmezett beállítást kívántunk megtartani. f�ezet Látható. illetve lehetövé teszi.276 17. érdemes PHP és MySQL használatával egyéni hitelesítési módszert kídolgozni. Az Auth_MySQL_DB. A 27. a hibaoldal jelenik meg. hogy további információt szerezhessünk erről a modulról. mint a mod_auth modu­ los. Sok weboldal számára a mod _auth_ mysql az ideális megoldás. Gyors és viszonylag egyszerűen megvalósítható. már csak azért is érdemes letölteni a tömörített állományt és megnézni a readme fájlt. 17 . Egyéni hitelesítési folyamat létrehozása Ebben a fejezetben megvizsgáltuk. Mivel mod_auth_mysql hitelesírést használunk.0/ mod/mod_auth. hogyan hozhatjuk létre beépített hitelesítési módszerek segítségével saját hitelesítési eljá­ rásainkat. Ehhez szükség lesz az SSL. hogy lássuk. amely munkameneteket használ a változók oldalak kö­ zötti nyomon követésére.9 példakód nagyrészt megegyezik a 17. miként lehet finoman szabályoz· ható hitelesítési rendszer megvalósítására használni.

. .. Soha senki nem tud olyan rendszere létrehozni... vizsgáljuk meg. Rendszerünk kialakításácól. amelybe nem lehet behatolni.18 Biztonságos tranzakciók végrehajtása PHP vel és MySQL . hogy a rendszer vagy adatátvitel feltöréséhez szükséges erőfeszítések nagyságrendje eléri vagy meghaladja az érintert információk értékér. és fogadja az arról érkező válaszokat. Ha az oldal PHP kódban található. Az include ( ) és a require ( ) urasírással más PHP és HTML fájlokat is beilleszchet. A fejezetben az alábbi főbb témakörökkel foglalkozunk: Biztonságos tranzakciók megteremtése A Secure Sockets Layer (SSL) protokoll használata Biztonságos tárolás megvalósírása Hitelkártyaszámok tárolása Titkosítás használata PHP-ben Biztonságos tranzakciók megteremtése Az interneten keresztüli biztonságos tranzakciók megteremtéséhez meg kell vizsgálnunk. hogy kezeljük biztonságosan a felhasználói adatokar bevicelük.1 ábra: Egy tipikus webes alkalmazás jellemzően az alábbi tároló. hogyan áramlik az információ rendsze­ rünk különböző részei között. illetve a cranzakciót kiváltó felhasználói adatoktól és műveletekcől függően a rendszerünkben előforduló tranzakciók részletei eltérhecnek a fenti sémátóL Minden tranzakciót ugyanúgy érdemes megvizsgálni. hogyan mozog rendszerünkben az infor­ máció. A MySQL motor felelős a saját adatainak olvasásáért és lemezre írásáért.1 ábra PHP és MySQL használatával megírt. Ha szetetnénk hatékony erőfeszítéseket tenni a biztonság érdekében. és núnden ponton gondoskodnunk kell biztonságáróL Az informarikai hálózatok területén nem beszélhetünk abszolút biz­ tonságról. A webes alkalmazás és a felhasználó közörti összes tranzakció azzal indul. A 18. A biztonság alatt azt érqük. A fejezet során megtudhag uk. -� Felhasználó Webszerver MySQL motor Tárolt oldalak Adatfájlok MySQL adatok � 18. Az SQL lekérdezéseket elküldi a MySQL démonnak. celjes egészében biztonságos tranzakció lehecőségét. tipikus alkalmazás esetén mutatja a felhasz­ nálói információ útját. A PHP kód olvashaqa és lemezre írhatja az adatokat. a kiszolgáló az oldal feldolgozását a PHP motorra bízza. továbbításuk és tárolásuk során. Ezzel megteremthetjük az oldalunk és a felhasznáJók közöcci. hogy a felhasználó böngészője az interneten keresztül kérést intéz a kiszolgálóhoz. feldolgozó elemekből épül fel. Iel .

fejezet A rendszer három fő alkotóelemből áll: A felhasználó gépe Az internet Saját rendszerünk A következőkben külön-külön foglalkozunk ezen alkotóelemek biztonsági kérdéseivel. az internet tulajdonságaira is nagyon csekély a ráhatásunk. Az olyan feladatoknál. hogy a felhasználó nem törli ki. Az oldalunkhoz érkező kérések jöhetnek a képeket vagy a tartalmat ellopó más oldalról vagy a biztonsági intézkedéseink megkerülésére alkalmas szoftvert. akkor mindenképpen teszteljük. A megőrizni szükséges adatokat tárolhatjuk saját gépeinken fájlként vagy adatbázisrekordként. és mindegyik kissé eltérő funkciókat és jellemzőket kínál. A sürik használatával korlátozott mennyiségű adat (munkamenetkulcs) tárolására a Munkamenet-vezérlés PHP-ben címü 23.278 18. figyelembe kell venni az egyes bön­ gészők (és azok különböző verzióinak) eltérő működését. ha oldalunk szövegében garantáljuk a felhasználóknak a biztonságot. Előfordulhat. hogy a felhasználó gépe és az internet felett igen kevés befolyással bírunk. hogy rendszerünk kijátszására irányuló próbálkozása során a felhasználó ne módosítsa azt. Ha csak a két legnépszerűbb böngésző legfrissebb verzióira gondolunk. ám ez nem azt jelenti. Az SSL automatikusan egyeztet kiszolgá­ lónk és a felhasználó böngészője között. A felhasználó gépe Rendszerünk szempontjából a felhasználó gépe böngészőt vagy böngészőket futtat. vagy lehet könyvtárban. hogy a mindkettő által kezelni képes legmagasabb szintű biztonság mellett kommuni­ káljanak egymással. hogy az amerikai kormányzat 2000 januárjában törvénymódosítással engedélyezte az erősebb ritkosírási mód­ szer exportálását (a nem embargós országokba). hogy az oldalunkhoz az általunk kivánt felületen keresztül kapcsolódó böngészővel foglalko­ zunk. hogy mindenki frissítette böngészőjét. nem biztos. A rendszerünkön kívül elhelyezkedő információnál nincsen ráhatásunk annak biztonságos tárolására. ugyanakkor rosszindulatúan is használható. hogy miként működik az ezeket nem engedélyező felhasználóknál. Fejlesztőként igen hasznos lehet számunkra ez az eszköz. például aJavát. hogy egyes felhasznáJók kikapcsolják a szerintük biztonsági vagy adatvédelmi kockázatokkal járó funkciókat. biztonsági szempontból jobban járunk szerveroldali programozás­ sal. internetkávézóban található. hogy a felhasználó gépén miétt csak a lehető legkevesebb adatot szabad tárolni. Ugyan a felhasznáJók gépeinek beállításait nem tudjuk sem módosítani. de nyilvánvaló. mint például az adatérvényesítés. Számos jó oka van annak. Semmilyen ráhatásunk nincsen az olyan tényezőkre. sem szabályozni. Annak ellenére. Ne feledjük. A felhasznáJók gépei közőrt lehetséges komoly különbségek befolyásolhatják. . Nem lehetünk biztosak benne. fejezetben foglalkozunk majd. iskolában. illetve nem tudjuk megakadályozni. nem lehetünk biztosak abban. illetve a felhasznáJók gépén sütiként. Többféle böngésző létezik. kivéve. mint például a gép biztonsági beállításai. a sütiket vagy aJavaScriptet. Ha alkalmazásunk épít ezekre a funkciókra. Webfejlesztőként mindazonáltal nem szükséges túlzottan aggódni e kérdés miatt. mivel a kód eredménye egyszerűen egy HTML oldal. és a legtöbb felhasználó számára ma mát a 128 bites változatok is elérhetők. mivel forráskódunk ebben az esetben nem lesz látható a felhasznáJók számára. fejezetben foglalkozunk majd. hogy milyen funkciókat te­ szünk elérhetővé a szerveroldali programozásban (például PHP-ben) és milyeneket a kliensoldali programozásban (például JavaScriptben). akkor a köztük lévő különbségek nagy része a HTML kód kezelésére és megjelenítésére korlá­ tozódik. A tárolni kívánt adatok többségének webszerverünkön vagy adatbázisunkban a helye. hogy a gép esetleg egyáltalán nem biztonságos. Gondolnunk kell arra is. ám nekünk a biztonsági és a funkcionális kérdésekkel is foglalkoznunk kell. Vagy médegeijük egy kevésbé funkciógazdag kezelőfelület kiala­ kítását. hogy az Egyesült Államokon és Kanadán kivüli felhasznáJók böngészője csak a 40 bites ritkosírást támogatja. például cURL-t használó személytőL A böngészőktől érkező csatlakozások szimulálására alkalmas cURL könyvtárral a Hálózati és protokollfüggvények használata címü 20. amellyel az ilyen óvatos emberek is használni tudják oldal unkat. Ha kizárólagJavaScriptben ellenőrizzük az adatokat. A PHP-ben megteremtett funkciók minden felhasználó böngészőjével kompatibilisek lehemek. a felhasznáJók megtekinthetik és esetleg kijátszhatják a kódot. figyelembe kell vennünk eze­ ket a kérdéseket. hogy rend­ szerünk tervezése során figyelmen kívül hagyhatjuk ezeket a tulajdonságokat. megosztott terminál is. 18 Az internet Nem csak a felhasznáJók gépeire. A nagyon alapvetőJavaScript kódon túl bármit használunk.

mint CGI felületen keresztüli futtatása. mint bármilyen más. Még ha saját céljainknak megfelelően meg is bizonyosodunk a felhasználó személyazo­ nosságáról. Ráadásul a digitális tanúsítvány online vállalkozásunk megbízhatóságát sugallja. Képzeljük el azt az esetet is. Mindez a letagadhacóság szintjén okoz problémákat. és más módszerc keresünk az eljuttatására. fejezetben már esett szó. hogy felhasználóinknak figyelmeztető üzenet jelenne meg. Igen nehéz meggyőződni arról. amíg a webes tartalmaink továbbítására használt. illetve mit nem tesznek. hogy amikor a felhasználék azt gondolják. ami a 18. Viszonylag biztonságban tudhatjuk az információt. módosíthatóságtól mentes üzenetküldést és hitelesítése kínál. Legalább kétféle módszer létezik a kiszolgálónkra érkező és onnan induló információ biztonságossá tételére: Secure Sockets Layer (SSL) protokoll Secure Hypertext Transfer Protocol (S-HTTP) Mindkéc technológia titkos. A következő kérdés. hogy megőrizzük titkosságát. A fejezet későbbi részében részletesen foglalkozunk az SSL-lel. hogy igen lényeges nap­ rakésznek maradnunk e téren! Ha a mi feladatunk a telepítés és a konfigurálás is. A szóba jöhető lehetőségeink: A fentiektől függetlenül elküldjük az információt. tudva azt. hogy tényleg azzal a személlyel állunk kapcsolatban. a Google vagy kedvenc keresőnk rudatos használatával minden fontos problémáról tudomást szerezhetünk. hogy kódjaink gondosan ellenőrzik-e a felhasználék által bevitt adatokat. Érdemes elolvasni egy jó könyvet az általunk használni kívánt operációs rendszer beállításáról. vagy általános. Küldés előtt digicálisan aláírjuk az információt. A biztonság terén elkövetett sok hiba a dokumentációban szereplő figyelmeztetések figyelmen kívül hagyá­ sából ered. Saját rendszerünk A világegyetem általunk ténylegesen kontroll alatt tartható része a saját rendszerünk. egy pillanatra sem szabad elfelejtenünk. Küldés előtt titkosítjuk az információt. Ennek tudatában kell eidöntenünk. hogy valamely jól ismert termék friss verzióját futtatjuk. Röviden: az adatvédelem és a letagadhatóság fontos kérdés az interneten keresztül folytatott tranzakciók esetében. Amikor informá­ ciót küldünk az egyik pontról a másikra. Fontos. hogy egyetlen gépen helyezkednek el. akkor rendszerünk minden bizonnyal lassan fog futni. illetve anélkül használhacunk SSL protokollt. Ha mindkét gép privát helyi hálózaton müködik.Biztonságos tranzakciók végrehajtása PHP-vel és MySQL-lel 279 Az internet számos pompás jellemzővel bír. interneten keresztüli kapcsolatot. hogy védjük a módosításcól. Úgy határozunk. fejezetben. és pontosan úgy kell kezelni ezt a kapcsolatot. érdemes foglalkoznunk azzal. akkor érdemes mérlegelni az SSL használatár. de míg az SSL széles körben elér­ hető és használt. vagy szinte lehetedenné kell tenni annak módosícását. hogy a küldött információt mások megtekint­ hetik vagy akár módosíthatják.1 ábrán a céglalapon belüli al­ kotóelemekből áll össze. gondoskodnunk kell a hálózat biztonságáróL Ha a gépek az interneten keresztül kommunikálnak. Feltéve. rendszergazdai kérdések miatt következik be. Már szóba került az SSL a felhasználó számítógépe és a kiszolgáló közötti használata. 18 . és védjük a módosítástól. A PHP TCP/IP protokollon keresztül csatlakozik MySQL kiszol­ gálónkhoz. és ez a kapcsolat nem titkosított. hogy velünk kerülnek kapcsolatba. Ezek az alkotóelemek fizikailag elkülönülhetnek a hálózaton. Webes alkalmazások fejlesztőjeként elsődlegesen azzal kell foglalkoznunk. Erről már esett szó Az e-kereskedelem biztonsági kérdései címü 15. hogy az információ túl bizalmas ahhoz. mint amennyi időt mi fordítani tudunk a dologra. akkor az tényleg így legyen. de az is előfordul. vagy fizessük meg egy hozzáértő rend­ szergazda szolgálatait! A PHP telepítésekor mérlegelendő szempont. hogy mások megtekinthetik és esetleg módosítják. Tudatosítsuk magunkban. a jelen könyv tartalmi korlátain kívül eső. amikor rendszerünk két alkotóeleme közöte a hálózaton továbbítunk adatokat! Tipikus példája ennek az a helyzet. Az internet nagyfokú névtelenséget biztosító közeg. hogy kódjaink mit tesznek. az S-HTTP nem igazán terjedt el. akinek ő kiadja magát. arnikor valaki oldalunk egy hamisított változatára csalja a látogatókat. hogy kockáztassuk az illetékeelen kezekbe kerülését. vagyis az olyan támadásoktól. mint például a bíróság. hogyan leetek telepítve és konfigurálva az egyes szofcverek. más gyártók készítette termékek kezelik azt. Digitális tanúsítvány regisztrálásával védhetjük látogatóinkat a hamisítástól (spoofing). igen problémás lenne ugyanezt olyan fórum előtt is bizonyítani. hogy a SAPI modulként webszerverünkre telepítése általában biztonságo­ sabb és hatékonyabb. Milyen potenciálisan bizalmas adatot küld alkalmazásunk a felhasználóknak interneten keresztül? Milyen bizalmas adatok továbbítását kérjük felhasználóinkcól? Ha rendszerünk és a felhasználóink közöte ritkos tranzakciókban kell adatot továbbítani. amiről a 15. amikor MySQL adatbázisunk a webszervertől eltérő gépen helyezkedik el. Ezen szofcverek fejlesztői minden bizonnyal többet foglalkoztak a biztonsággal. hogy milyen intézkedést kívánunk tenni. de jellegéből adódóan egy nem biztonságos hálózatról van szó. Gondoskodunk-e az adatok biztonságos tárolásáról? Ezekre a fejezet következő részeiben válaszolunk.

Minden réteg a felerre és alatta lévő rétegnek továbbírhat adatot. Alkalmazásréteg Szállítási réteg Hálózati réteg Adatkapcsolati réteg TCP/UDP Különbözó 18. hogy hitelesítse magár (ritkán fordul elő). hogy hitelesítse magát. A kiszolgáló elküldi digitális tanúsítványár.2 ábra murarja).2 ábra: Alkalmazásrétegbeli protokoll. Ezt a felépírést láthatjuk a 18. Az SSL ugyanazokat a felülereket kínálja a felette lévő prorokolloknak. 18 2. illetve azokról kérher szolgáltatásokat. illetve a POP és az IMAP. Amikor egy böngésző HTTP-n keresztül kapcsolódik biztonságos webszerverhez. Adarküldéskor az adator leküldjük a vermen ár az alkalmazásról a fizikai hálózati közegig. Az SSL használarakor még egy réteg hozzáadódik ehhez a modellhez. mivel a különböző típusú hálózarokhoz más és más protokolira van szükségünk. a titkosírást és a visszafejtést. A TCP /IP protokollverem nem határozza meg az ehhez a réteghez használt protokollokat. A hálózati protokollokat és az azokat megvalósíró szaftvereket jellernzően egymásra pakolt rétegekbe rendezik. fejezer A Secure Sockets Layer (SSL) protokoll használata A Secure Sockers Layer (biztonságos csatlakozó réteg) prorokollkészlerer erederileg a Netscape alaleírotta ki a webszerverek és a böngészők közötti biztonságos kommunikációhoz. . például a Hypertext Transfer Protocol (HTTP) által használt protokollverem. Az SSL képes biztonságos továbbírási környezetet teremteni a HTTP-ről eltérő prorokolloknak.. Az SSL a szállírási réteg és az alkalmazásréteg között helyezkedik el. vagy kiegészítő modulként fogadja. és megkéri. Így átláthatóan kezeli a kézfogást (handshaking). A böngésző megadja az általa támogatott titkosítási algoritmusok és hash függvények listáját. az SMTP és a Telner (ahogy ezt a 18. Ez utóbbinak pedig megfelelő protokoUra van szüksége ahhoz a hálózati eszközhöz. HT TP l l �� l kézfogásSSl protokoll titkoshásSSL váltás· protokoll figyelSSL meztet6 protokoll . Alkalmazásréteg SSL réteg Szállítási réteg Hálózati réteg Adatkapcsolati réteg SSL Record Protocol TCP IP Host to Network 18.280 18. a böngészőnek és a kiszolgálónak kézfogásprotokollt követve kell megállapodnia arról. mint az alatra lévő szállítási réteg. A böngésző SSL-t kezelni képes kiszolgálóhoz csatlakozik. amit az adatcsomagok fogadására és elektronikus jelként történő továbbírására használunk. O pcionálisan a kiszolgáló is kérheti a böngészőt. a HTTP protokoll meghívja a Transmission Control Protocolt (átviteli vezérlő protokollt -TCP). például az FT P. Az SSL 2-es és 3-as verziója is széles körűen támogatott. . Azért lehet más protokol­ lokat használni. A kiszolgáló kiválasztja az általa támogatott legerősebb titkosításr. . HTIP IFTP l IP SMTP l . Amikor HTTP-r használunk információrovábbírásra. hogy az eljuttassa a célpontba. és csak ezt követően adja át a szállírási rétegnek. mert az SSL lényegében átlátszó. Az SSL módosírja a HTML alkalmazásról kaport adatot. A kézfogás szakasz az alábbi lépésekből áll: l.3 ábra: Az SSL még egy réteget ad a protokollveremhez. A webszerverek többsége vagy tartalmazza az SSL működésér. Az IP a hálózati réteg szinrjén lévő protokoll. Adarfogadáskor az adar a fizikai hálózarról a vermen keresztülhaladva ér fel az alkalmazásig. A HTTP-r alkalmazásrétegbeli protokollnak nevezzük. Az adarkapcsolari réteg felelős a host (számitógép) há­ lózathoz csatlakoztatásáért.. A 18. Azóta a böngészők és kiszolgálók közötti bizalmas információcsere nem hivatalos szabványaként alkalmazzák.3 ábrán. illetve alkalmazásrétegbeli protokollok hozzáadásával szabályazza saját müködését.2 ábrán ilyen protokollver­ met (protocol stack) láthatunk. ami viszont az Internet Protoco/ra (IP) támaszkodik. 3. minr a hitelesírés és a titkosírás. hogy mir használnak az olyan elemekhez. Sok más ilyen protokoll létezik. Az I nternet Explorer és a F irefox is a 3-as verzióról támogatja az SSL-r. 4. A TCP egyike a TCP /IP hálózarokban használt kér szállírási rétegbeli prorokollnak.

hogy az úrválasztási információt még mindig meg tudják bolygatni. A TLS-t egy valóban nyílt szabványnak szánják. látni fogják. azaz gyakorlatilag véletlenszerű bitekké alakítása után próbáljuk meg tömöríteni azokat. mellékhatáskénc jelentős mértékben növelné a hálózati forgalmat. mivel a protokoll külső felületei meglévő protokollokat másolnak. TLS) közvetlenül az SSL 3. hogy rnilyen információkat küldözgetünk. amelynek célja a hálózatbiztonság fokozása. és egy véletlenszerűen előál­ lított szám titkosítására használja.Biztonságos tranzakciók végrehajtása PHP-vel és MySQL-lel 281 5. hogy noha a hálózati forgalom nagy része a háló­ zaton való továbbítás előtt tömöríthető (és gyakran valóban törnödtik is). hogy az SSL-ben a titkosítás előtt történik a tömörítés. az az oka. 3. a kulcsok generálása és a nyilvános kulcsú titkosítás mind időt vesz igénybe. Az egyes csomagok (opcionális) tömörítése. ha az SSL. tömöríti. c. így a kapcsolatfelvételi procedúra eltart egy darabig. Az eredmények szerencsére gyorsítótárba kerülnek. Noha az SSL viszonylag összetetten müködik. Ez azt jelenti. hogy a TCP fejrész hozzáadása az adat titkosítása után történik meg. és bár azt nem fogják tudni. ki kinek küldi azokat. a digitális tanúsírványak visszafej tése. a Felhasználók és a fejlesztök elől rejrve marad a történtek nagy része. A tömö­ rítési algoritmusok az adatokon belüli ismétlődéseket vagy mintákat próbálnak azonosítani. hasheli és titkosítja az adatokat. A MAC és a tömörített adat kombinálása és titkosítása. a kapcsolatfelvételi folyamat és a feldolgozás csak egyszer megy végbe. hogy ne egy egyeden szervezet által meghatározott. A böngésző megszerú a kiszolgáló digitális tanúsírványából a szerver nyilvános kulcsát. Kel­ lemeden lenne. Az ábrából kitűnik. 2.0-ra épül. A titkosított csomagok fejrész-információt kapnak. így ha ugyanaz a böngésző és kiszolgáló több biztonságos üzenetet kiván váltani. A jó minőségű véletlenszerű adatok előállítása. SSL kapcsolaton keresztüli adatküldéskor az alábbiak történnek: l.4 ábra mutatja. 18 . majd mások számára elérhetővé tett szabvány legyen. de az SSL gyengeségeit kiküszöbölő és nagyobb rugalmasságot kínáló fejlesztéseket tartalmaz. b. véletlenszerű adattal válaszol (amennyiben a kiszolgáló kérésére a böngé­ sző megadta digitális tanúsírványát. A teljes folyamatot a 18. A munkamenet titkosítási kulcsai ezekből a véletlenszerű adatokból állítódnak elő hash függvények használatával. Általában semmilyen haszonnal nem jár. és elküldödnek a hálózatnak. A böngésző és a kiszolgáló munkamenetkulcsokat állít elő: a. 4. Az adatok kezelhető csomagokra bontása. a titkosított adatok nem jól tömöríthetők. A kiszolgáló egyszerű szövegként küldött.4 ábra: Az SSL küldés előtt Jeldarabolja.1-es verziónál járó Transport Layer Security (szállítási rétegbeli biztonság. Annak. Adatunk Adatcsomagok Tömörített adatok Üzenethitelesítő kód Titkosított csomagok TCP csomagok 1 fejrész WH l!::t:ttl t:tm 'l 18. ha az adatok titkosítása. Minden csomag hash algoritmussal súrnitott üzenethitelesítő kódot (MAC) kap. akkor a kiszolgáló a böngésző nyilvános kulcsát fogja használni). A jelenleg 1. 5.

használjuk az escapeshellcmd () függvényt! Ez védökarakterekkel látja el az összes olyan metakaraktert. Használjuk a htmlspecialchars () függvényt. az azokar kérők a feldolgozatlan forrásr fogják meg- .vagy egyéb fájljainkat. amely konkrét jogosultságokat rendel a konkrét gépeken lévő konkrét felhasználói nevekhez. és a kiszolgálóra berölrve futtathatnák azt. Lehet annak értelme. és egy cracker hozzáfé­ rést szerez a kiszolgálóhoz. amivel a rosszindulatú felhasználók nekik tetsző parancsok futtatására kényszeríthetik rendszerünket. Más felhasználóknak csak olvasási jogosult­ ságuk legyen kódjainkhoz. A stripslashes () függvénnyel állithatjuk vissza az adatokat eredeti formájukba. rosszindulatú kódot írhatná­ nak. Kapcsoljuk be php. ezért külön-külön fogunk foglalkozni velük. illerve forditott aposztrófok közöte (') felhasználói adatot adunk át. inc fájlokat helyezünk a webes könyvtárakba. az addslashes () függvénnyel szürjük öket! A függvény védökarakterrel látja el az adatbázis számára problémát okozni képes karaktereket. Az adatbázisadatok az adatfájlokhoz hasonlók. php kiterjesztésű fájlokat. hogy titkosítjuk egy webszervererr az adatokat. Nagyon kell ügyelnünk. ini fájlunkban a magic_quotes_gpc és magic_quotes_runtime direktívát! Ezek auto­ matikusan elvégzik nekünk a védőkarakterek hozzáadását és eltávolítását. A magic_quotes_gpc a bejövő GET. mindig szürjük azokat! A könyv több részében szóba kerültek már a felhasználói bevitel szűrésére használható módszerek. hogy a fájlkezelési jogosultságokat megfelelőerr állítsuk be a weboldal hierarchiájában (Apache szerveren a htdocs-ból. nem szabad. Külön figyelemre érdemes az. Az eltérő adattípusok eltérő tárolási követelményeket támasztanak. A bizalmas adatok biztonságos kezelésének egyik jó módszere az. txt nevű fájl.1 ábrán egymástól elkülönítve látunk. fejezet Felhasználói bevitel szűrése A biztonságos webes alkalmazások fejlesztésének egyik alapelve. gyakran ugyanannak a lemeznek különbözö részein tároljuk. akkor 18 PHP forrásaink kívülről nem lesznek láthatók. amit a 18. Ez azt jelenti. illerve egy vagy több kulcsfájlra. hogy soha nem szabad megbízni semmilyen felhasználói bevitelben. Csak mi tudjunk írni ezekbe! Más felhasználóknak. amely a megfelelő HTML entityvé alakítja a karaktereket! A< ka­ raktert például &lt. Ez a probléma nem is olyan katasztrofális. A legveszélyesebb tárolandó adattípus a futtatható tartalom. nem szabad.például e-mailben. amelyként a webszerver fut. akkor minden bizonnyal semmi sem akadályozza abban sem. de csak akkor. Ha megfelelőerr állítjuk be a MySQL-t. nem igaz? Az adatok titkosításához és visszafejtéséhez szükségünk van az adarokat titkosíró programra. hogy fájlokat írjanak ide. kódhoz kapcsolódó adatok és MySQL adatok). majd.egy másik gépre továbbítjuk öket. POST és sütiváltozókra alkalmazza az ilyen formázást. hogy elolvassa kulcs. a webes fastruktúrán kivül hozzunk létre e célból egy könyvtárat! Különösen igaz ez a fájlfeltöltö kódokra. köztük annak is. akkor minden mást is megtalál. -vé konvertálja. Ha . az adatokat visszafejtő programra. hanem egy másik gépen tároljuk. Közelírsük meg így: Ha van kiszolgálónkon egy hitel kartas zarnak. ha a kiszolgálón titkosítjuk. IlS szerveren az inetpub-ból induló könyvtárfát értjük ez alatt). hogy a PHP értelmezővel dolgozza fel a . akkor a kívülállók nem fogják tudni megtekinteni az értelmezés elötti forráskódot. Ha megengednénk másoknak. Foglalkoztunk már a MySQL saját jogosultsági rendszerével. Ha a cracker hozzáfér az adatainkhoz. Ha kódjainknak fájlba írási jogosultságra van szükségük. Mielött fájlba vagy adatbázisba tennénk.282 18. Biztonságos tárolás megvalósítása A tárolt adatok három típusát (HTML vagy PHP fájlok. vagy valamilyen rendszerparancsnak átadnánk a felhasználóktól érkező adatokat. Ha webszerverünk konfigurációja megfelelő. a magic_quote_ runtime pedig az adatbázisba bemenő és onnan kijövő adarokkal teszi ugyanezt. Ennek azonban általában nem sok értelme van. PHP kódjaink általában nyilvánosan betölthetők. hogy először titkosítsuk azokat. A strip_tags () függvénnyel HTML és PHP címkéket távolítharunk el karakterláncokbóL Használatával megaka­ dályozhatjuk. Bizalmas adatok írása esetén késztetést érezhetünk arra. Weboldal esetében ez jellemzöen a kódokat jelenti. csak a MySQL írhat az adatfájljaiba. A függvény veszélytelen karakterekké alakítja az összes kódcímkét (script tag). Amikor a system () vagy az exee () meghívásakor. hogy gyakran kell PHP kádba MySQL-es jelszót írni. hogy csak a MySQL-en belüli felhasználók hozzáférései miatt kell aggódnunk. Egyéb kiterjesztések használara eserén azonban óvatosan kell eljárni. hogy a felhasználók rosszindulatú kódot helyezzenek el a böngészöbe szánt forrásban. A kódoknak és az álcaluk írt adatoknak nem szabad keveredni ük. Amennyiben kiszolgálónk úgy van beállirva. hogy írjanak beléjük vagy szerkesszék azokat! Ugyanez igaz a weboldal hierarchiáján belül ralálható könyvtárakra. hogy jogosultságuk legyen írni a kiszolgálóról letölthető könyvtárak­ ba vagy új fájlokat létrehozni azokban. és el rudja olvasni ezt a fájlt. mint elsőre tűnhet. Hivatkozásképpen röviden megemlítjük most ezeket: Mielött a felhasználói adatokat átadnánk az adatbázisnak. ha a visszafejtéshez szükséges szofrvert és adatot nem ugyanazon a kiszolgálón.

Ellenkező esetben sincs semmi gond . akkor a közöttük meglévő különbségek nem számítanak. Nem tartalmaz szabadalmaztatott algoritmusokat. A preblé­ mát azzal tudjuk elkerülni. Titkosítás használata PHP. akik ugyanezzel a kiszolgálóval futtatnak kódokat. hogy ez nem ingyenes szofrver! A freeware verzió keres­ kedelmi célra nem használható.philzimmermann. illetve megvásárolható a fizetős licenc. vagy pedig .gnupg. További információért látogassunk el a http://www. hogy adatvédelmet nyújtson az elektronikus levelezéshez. gondoskodjunk kellően képzett és kissé paranoiás rendszergazdá­ ról. vagy minden felhasználóval a webszerver saját példányát futtassa. GPG-t használó példát fogunk megvizsgálni. a gunzip vagy a génél: configure (vagy rendszerünktől függően . és tárolás nélkül továbbítjuk a tranzakció-feldolgozó átjárónak. hogy a GPG már telepítve van rendszerünkre. Ebben az esetben érdemes mérlegelni annak lehetőségét. ha a kiszolgálót úgy állítjuk be.ben Egyszerű. hogy a . Amennyiben másokkal osztozunk a kiszolgálón. A PGP freeware verziói bárki számára elérhetők. Hitelkártyaadatok tárolása A bizalmas adatok biztonságos tárolásának áttekintése után érdemes külön foglalkozni a bizalmas adatok egy különleges fajtá­ jával.com oldalra! Ha szereménk részletesebben megismerni a PGP történetét és az elérhető verziókat. hogy miért tároljuk ezeket.gnupg. akkor jobban járunk. aki elegendő idővel rendelkezik arra. de mindkét termék eltérő felületekkel rendelkezik (például a levelezőprog­ ramokhoz tartozó bővítményekkel a beérkező e-mailek automatikus visszafejtésére). valahol máshol tároljuk. A heilleszrendő fájlokat a webes fastruktúrán kívül kell elhelyezni. A GPG a http://www. és korlátozás nélkül használható kereske­ delmi célra is. hogy különálló felhasználókként futtassa a kódokat. php kiterjesztést kell adni ezeknek az állományoknak is.org oldalról szerezhető be. mint a Linux-prograrnek többsé­ . hogy a szofrver friss verzióját futtatja). Ha tárolni kívánjuk ezeket. titkosított üzenetet GPG-vel létrehozva olyan valaki számára. g z vagy a . hogy ne teljesít­ se az ilyen fájlokta vonatkozó kéréseket. Attól függően. például folyamatos előfizetés esetén havonta terheljük a kártyát. mégis hasznos feladat. ami egyébként a Pretty Good Privacy (Meglehetősen jó adatvédelem) rövi­ dítése. hogy az operációs rendszerünkkel és az általunk használt egyéb termékekkel. A PGP Corporationtől letölthető a freeware. Zimmermann írta kifejezetten azzal a céllal. hogy a kártyaszámokat a webszerverünkön kívül. A GPG rövidítéssel ismert Gnu Privacy Guard a PGP ingyenes változata. aki PGP-vel fog­ ja visszafejteni azt (feltéve. akkor ez a meg­ közelítés nem megfelelő számunkra. A program fordításához (compile) és telepítéséhez ugyanazokat a parancsokat kell használni. illetve valóban szükség van-e a tárolásukra! Mire használunk egy kárryaszámot? Ha egyszeri tranzakciónál valós időben dolgozzuk fel a kártyaszámot. Az elmúlt időszakban a PGP egy nyílt forráskódú alternatívája is elérhetővé vált. Ha a parancssori eszközöket kívánjuk használni. de ne feledjük. és úgy kell konfigurálni a kiszolgálót. amivel szemléltethetjük a titkosítást: a titkosított e-mailek küldése. nagyon körül­ tekintően járjunk el! Tegyük fel magunknak a kérdést. ha bekérjük a vásárlótól. viszont a beállítás kicsit trükkös lehet. A két termék igen hasonló módon látja el ugyanazt a feladatot. tar. MySQL-jelszavunk láthatóvá válhat a gép azon más felhasználói számára.org oldalról tölthetjük le a megfelelő tömörített fájlt. A PGP-t. A két terméket akár együtt is használhatjuk. b z 2 tömörített állományt választjuk. l configure ) tar segítségével csomagolhatjuk ki. Ha nem mi vagyunk webszerverünk rendszergazdája (ami megosztott kiszolgáló esetén nagy valószínűséggel igaz). Ha rendszeres díjat szedünk be. de PGP alkalmazása esetén sem lenne nagy eltérés az itt leírtaktóL A könyv példáinak követelményein túlmenően GPG-re is szükség lesz a most következő kód müködéséhez. A GPG telepítése A GPG Linux gépre telepítéséhez a www. Philip R. tar . Rendszerünk beállításaitól függően ez a helyzet megelőzhető.pgp. Az internet-felhasználókat különösen aggasztja hitelkártyaszámaik biztonsága. Mivel bennünket az üzenetek webszervererr való létrehozása érdekel. Amennyiben sok vásárló kártyaadatát tervezzük tárolni.com/EN/fmdpgp/findpgp. akkor érdemes lehet megtárgyalni a rendszergazdával ezt a kérdést és áttekinteni vele a biztonsági lehetőségeket. Évekig gyakorlatilag a PGP volt a titkosított e-mail szabványa. Előfordulhat.Biztonságos tranzakciók végrehajtása PHP-vel és MySQL-Iel 283 kapni.html.a telepítési folyamat magától értetődő. olvassuk el Philip Zimmerman"Where to Get PGP?" (Honnan szerezzük be a PGP-t?) írását: http://www. illetve azok biztonságával foglalkozó információforrásokat rendszeresen ellenőrizze.

Fontos. aho­ va az e-mailt küldeni kívánjunk. Az alábbi paranccsal exportálhatjuk az új kulcspárból a nyilvános kulcsot: gpg --export > fajlnev A parancs futtatásának eredményeként olyan bináris fájlt kapunk. amin a levelet olvasni fogjuk! Emlékezhetünk rá. . Gyakran a nobody. majd változtassuk meg a fájljogosultságokat. A lépések Windows alatt is ugyanezek. ( Rendszerünkön a megfelelő felhasználóra változtathatjuk ezt). a GPG fordítása és a futtatható program a lusr llocal Ibinl gpg (vagy az általunk meghatározott könyvtárba) kerül. állítsunk elő egyet a gépen. Azonban a gépre. mert titkos kulcsot nem ajánlott kiszolgálón tá­ Számos kérdésre kell ekkor választ adnunk. A most következő példák ezt a felhasználót feltételezik. lévén az ingyenes. a --prefix opcióval kell a konfiguráló kódot futtatni. Ha még nem rendelkezünk a kulcspárral. e-mail címünket. Rendszerünkön a nobody felhasználó­ nak a l tmp lett alapértelmezett könyvtárként megadva.au>'.. A program különböző sorokban megkérdezi valódi nevünket. hogy a PHP kódjainkat futtató felhasználó használni tudja a GP G-t. A legeöbbnél megfelelő. hogy mi legyünk a webszerver felhasználójal Ehhez rendszergazdai (root) hozzáférésre van szükség a kiszolgálóhoz. az kiszolgálónk beállításaitól függ. . amely alkalmas arra. az a név és a cím közé kerülne. a következőképpen hozhatjuk létre az ASCII verzióját a fájlnak: gpg --export -a > fajlnev A nyilvános kulcs kinyerése urán FTP segítségével feltölthetjük a fájlt a webszerveren lévő felhasználói fiókunkba. írjuk be az alábbi parancsot: gpg --gen-key az utóbbival mi magunk fejtjük vissza a beérkező üzeneteket. érthető a séma. de a könyvtárak neve és a rendszerparancsok eltérnek. csomagoljuk ki. Sok beállítást módosíthatunk. ha egyszerűen az alapértelmezett választ fogadjuk el. hogy más felhasználék is olvashassák az állományt! Gépeljük be a következőket: chrnod 644 fajlnev Létre kell hoznunk egy kulcstartót. érdemes lehet megvásárolni a PGP fizetős válto­ zatát. hogy más gépen lévő GPG vagy PGP kulcstartóba (key ring) importáljuk. amiket a kulcs elnevezésére használ. amelybe ez a felhasználó nem jogosult írni. és helyezzük a gpg. Tóltsük le a zip fájlt. valahogy így: . de lehet más is. Windowsos szerver esetén a folyamat még ennél is egyszerűbb.com. hogy webkiszolgálónk felhasználója rendelke­ 18 ___ . ahol a leveleket olvassuk. Hogy ez melyik felhasználó. amelyben a nobody tárolni tudja a kulcstartóját és az egyéb GPG konfigurációs információ­ kat! Ennek a nobody alapértelmezett felhasználói könyvtárában (home directory) kell lennie. Amennyiben a GPG parancssori változatával állítjuk elő a kulcsokat. majd gépeljük be: gpg! A GPG-t vagy a PGP-t arra a rendszerre is telepítenünk kell. mert annak szebb a levelezőprogramhoz tartozó. és írjuk alá a kimenő leveleket. grafikus kezelőfelülete. A webszerver sok rend­ szeren nobody-ként fut. mivel nem létezik. Változtassuk meg úgy.f�ezet make make install Ha nem vagyunk rendszergazdák (root felhasználók). Ha minden jól megy. amelybe írni tud! Gépeljük be a következőket: cd mkdir . Ha a megjegyzést is megadnám. hogy a kulcspár egy nyilvános és egy titkos (privát) kulcsból áll. illetve vár egy megjegyzést. Az előbbit mások (és PHP kódjaink) használják a levél küldése előtt annak titkosítására. exe fájlt a megfelelő könyvtárba (a C: \Windows\ vagy valami hasonló kiválóan megfelel)! Hozzunk létre egy könyvtárat a C: \gnupg helyen! Ezt követően nyissuk meg a parancssort. Gondolom. így akár a GPG-t is használhatjuk. mett a nem root felhasználóknak nincsen hozzáférésüle a GPG alapértelmezett könyvtárához. illetve azon a rendszeren is létre kell hozni egy kulcspárt. amelybe. Az egyes felhasználék alapértelmezett könyvrárát az letclpasswd fájlban határozhatjuk meg. gépeljük be a következőket: su root su nobody Hozzunk létre egy könyvtárat. nem lehet írni. A következő parancsok a Unix használatát feltételezik.. (Az én saját kulcsom neve 'Luke Well ing <luke@tangledweb. A webszerveren nagyon kevés különbséget találhatunk a GPG és a PGP parancssori verziói között. Először is jelentkezzünk be a kiszolgálón lévő felhasználói fiókunkba.284 18.gnupg . a részleteket a GPG dokumentációjában találjuk. Győződjünk meg arról. zik alapértelmezett könyvtárra!. rolni.). lconfigure --prefix=lkonyvtarunkleleresilutvonala Azétt kell ezt az opciót használni. hogy a kulcsot a levél olvasására használt gépen és ne a webszerveren hozzuk létre. Sok Linux rendszeren a nobody alapértelmezett könyvtára a l. Ha viszont e-mailben szeretnénk ezt a kulcsot elküldeni másoknak. Ha ez áll rendszerünkre is. hogy importálni tudják kulcstartójukba. Számos BSD rendszeren a nobody alap­ értelmezett könyvtára a lnonexistent.

asc A szöveg a korábbival megegyező nevű. Ennek létrehozásához futtassuk újra az alábbi parancsot: gpg --gen-key Mivel a nobody felhasználó vélhetően kevés személyes jellegű e-mailt kap. nem biztonságos memória használatára utaló figyelmeztetést kell kapnunk: gpg: Warning: using insecure memory! és létrejön a teszt. hogy először a kimeneti fájlt kell megneveznünk.3 Comment: (GNU/Linux) For info see http://www.au>' lesz a neve. illetve a kimeneti állo­ mányt a következőképpen meghatározva tehetjük ezt meg: gpg -do teszt. Végül a save parancsot begépelve a változtatásainkat elmeneve lépjünk ki a programból! A GPG tesztelése A GPG ezzel be lett állítva.2 példakód a GPG-t PHP-vel meghívva teszi lehetövé titkosított e-mailek küldését. az alábbihoz hasonló. hogy megbízhassunk a korábban Icinyert nyilvános kulcsban.txt.Biztonságos tranzakciók végrehajtása PHP-vel és MySQL-lel 285 A nobody felhasználónak saját aláírókulcsra van szüksége. Ha ez nem lehetséges. titkosított üzenetet látunk: -----BEGIN PGP MESSAGE----Version: GnuPG vl.com. A szöveg képernyőre íratásához a -d kapcsolót kell használnunk: gpg -d teszt. A prograrnon belüli lehetőségek között megtaláljuk a help-et is. az alábbi paranccsal szerkesztenünk kell a kulcs rulaj­ donságait: gpg --edit-key 'Luke Welling <luke@tangledweb.asc nevű fájl. A sign begépelésével alá­ írjuk a nobody felhasználó privát kulcsát használó nyilvános kulcsot. megjegyzés és e-mail cím kombinációja.0. mi is létrehozhatjuk számára a csak aláíró kul­ csot.txt.trust. majd mentsük el néven! Gépeljük be az alábbi parancsot (kulcsunk nevét értelemszerűen beírva): gpg -a --recipient 'Luke Welling <luke@tangledweb. com. a -o kapcsolót használva. továbbítsuk ezt a fájlt arra a rendszere.txt Az alábbi. 18 . Nyilvánvaló: az olvasó kulcsának nem 'Luke Welling <luke@tangledweb. majdnem teljesen megvagyunk.txt teszt. Az alábbi paranccsal impor­ táljuk a korábban exportált nyilvános kulcsot: gpg --import fajlnev Hogy közölhessük a GPG-vel: meg kívánunk bízni ebben a kulcsban.au>' --encrypt teszt. egyeztessünk a rendszergazdával. ahol előállítottuk a kulcsot. Ha megnyitjuk ezt.asc Ha az alapértelmezettől eltérő nevű fájlba szeretnénk helyezni a szöveget.txt. txtfájlba fog íródni.au>' A fenti sorban az egyszeres idézőjelek közötti szöveg a kulcs neve. Amennyiben a GPG úgy van beállítva. amely az elérhető parancsokat.gnupg. használatra kész. hogy a PHP kódjainkat futtató felhasználó parancssorban tuclja használni. majd futtassuk az alábbi parancsot: gpg teszt.asc Láthatjuk. hanem a létrehozásánál megadott név. A trust-ot begépelve közöljük a GPG-vel.1és a 18.out teszt.txt. vagy tanulmányozzuk a GPG dokumentációját! A 18. sign és save­ ismerteti.com.jelen esetben a teszt.org hQEOAODU7hVGgdtnEAQAhr4HgR7xpiBsK9CiELQw85+klQdQ+p/FzqL8tiCrQ+B3 0GJTEehPUDErwqUw/uQLTds0rloPSriAZ7c6GVkhOYEVBj2MskT81IIBvdo950yH K9PUCvg/rLxJlkxe4Vp8QFETSE3Fdii/ly8VPSgSTE7gAgm0SbFf3S91PqwMyTkD /2oJEvL6e3cP384s0i8lrBbDbOUAAhCjjXt2DX/uX9q6Pl8QW56UICUOn4DPaWlG /gnNZCkcVDgLcKfBjbkB/TCWWhpA7o7kX4Cicih7KliMHY4RKdnCWQf27loE+8i9 cJRSCMsFioi6MMNRCQHY6p9bfxL2uE39IRJrQbe6xoEe0nkB0uTYxiLOTG+FrNrE tvBVMS0nsHu7HJey+oY4Z833p k5+MeVwYumJwlvHjdZxZmV6wz46G02XGT17b28V wSBnWOoBHSZsPvkQXHTOq65EixP8y+YJvBN3z4pzdHOXa+NpqbH7q3+xXmd30hDR +u7t6MxTLDbgC+NR =gfQu -----END PGP MESSAGE----- Hogy visszakapjuk az eredeti szöveget. A teszteléshez hozzunk létre némi szöveget tartalmazó fájlt. Ennek a kulcsnak egyetlen célja. hogy teljes mértékben megbízunk kulcsunkban.

286 18.1 példakód: titkos_ mail.php-A GPG-t meghívó és a titkosított e-mailt elküldö PHP kód <?php //rövid változónevek létrehozása $felado = $ POST['felado']. .gnupg'). php-A titkosított e-mailek küldésére szolgáló HTML űrlap <html> <body> <hl>Küldjön nekem titkosított e-mailt!</hl> <?php ll ha nem az alapértelmezett portokat. if($ SERVER['SERVER_PORT'] !=443) { normál forgalomhoz a 80-ast módosítani kell ezt a sort echo '<p style="color: red">FIGYELMEZTET�S: nem SSL használatával csatlakozott az oldalhoz.</p>'. hol találja a kulcstartót ll Ezen a rendszeren a nobody felhasználó alapértelmezett könyvtára a /tmp/ putenv('GNUPGHOME=/tmp/. Üzenetét bárki más is elolvashatja. 'pgp'). $címzett = 'luke@localhost'. $targy = $ POST['targy']. $uzenet = $ POST['uzenet'].php"> <p>E-mail címe:<br/> <input type="text" name="felado" size="40"/></p> <p>Tárgy:<br/> <input type="text" name="targy" size="40"/></p> <p>Üzenet:<br/> <textarea name="uzenet" cols="30" rows="l0"></textarea></p> <br/> <input type="submit" name="kuldes" value="Küldés"/> </form> </body> </html> 18. ll és SSL-hez a 443-ast használjuk.'. 18 //egyedi fájlnév létrehozása $bemeno fajl $kimeno_fajk tempnam(''. $bemeno fajl.fgezet 18.2 példakód: titkos_mail_kuldese . ?> <form method="post" action="titkos_mail kuldese. ll Közöljük a gpg-vel.asc'.

$fp = fopen($kimeno_fajl. és alapértelmezett könyvtára a l tmp l. Példánkban a 'pgp ' előtagot alkalmaztuk.<lp> <p>Elnézést kérünk. fwrite($fp. $targy. így nem igazán fontos a nevük. 'w'). $eredmeny). l l (files1ze($k1meno fajl)==O)) - $eredmeny = else 1.. if($eredmeny!=O) echo '<hl>Hiba:<lhl> <p>Az üzenetet nem sikerült tikosítani.$felado. Meghatározhatjuk a könyvtárat és a fájlnév előtag­ . 18 .gnupg').<lp> <p>Köszönjük. hogy egyedi legyen. echo '<hl>Üzenet elküldve<lhl> <p>Üzenetét titkosítottuk és elküldtük."\n"). Az e-mailek a $címzett változóban meghatározott e-mail címre lesznek elküldve. a lényeg. hogy a PHP a rendszer ideiglenes könyvrárát használja.com. /la titkosított temp fájl törlése unlink($kimeno_fajl). filesize ($kimeno_fajl)).au>' \\ --encrypt -o $kimeno_fajl $bemeno_fajl". de hagytuk. $tartalom. fclose($fp). Rendszerünkön a kiszolgáló nobody felhasználóként fut. { /la titkosított fájl olvasása $tartalom = freact ($fp. $uzenet). ját is. ?> Néhány apróbb módosítást végre kell hajtanunk a kód müködéséhez. //parancsunk beállítása $parancs = "/usr/local/bin/gpg -a \\ --recipient 'Luke Welling <luke@tangledweb. Körülbelül egy másodpercen belül létrehozzuk és kitöröljük ezeket a fájlokat.2 példakódban a GPG kulcstartó helyének megfelelően módosítani kell az alábbi sort: putenv('GNUPGHOME=Itmpl. A 18. /la titkositatlan temp fájl törlése unlink($bemeno_fajl).<lp>'.<lp>'. A tempnam () függvénnyel létrehoztunk egy egyedi ideiglenes fájlnevet. "Feladó: ". ll gpg parancsunk futtatása system($parancs. if($eredmeny==0) 1f((!$fp) { 'r').</p> <p>Levelét nem küldtük el.Biztonságos tranzakciók végrehajtása PHP-vel és MySQL-lel 287 /la felhasználó szövegének a fájlba írása $fp = fopen($bemeno faJl. mail($cimzett.

ha a felhasználó SSL nélkül csatlakozott: <form method="post" action="https://webserver/titkos_mail_kuldese. Az SSL kapcsolat a 443-as porton keresztül jön. Ezért ez a kód SSL-es kiszolgálón használandó. A system($parancs. majd levelezőkliensével letölti az üzenetet.és egy if utasítás segítségével . Ha a továbbírani kivánt információ elég fontos ahhoz. 18 Noha sem most. Az ábrán minden nyíl az egyik gépről a másikra küldörr üzenetet jelképezi. a titkos kulcs nélkül senki nem rudja visszafejteni. minden esetben módosítani kell. ha valami balul sül el. Ezt követően a kiszolgáló SMTP-n keresztül elküldi a címzett levelezöszerverének. a GPG meghívásához használandó parancsot és paramétereket állítja be.csatlakozik levelezöszer­ veréhez. sem más hasonló helyzetben nem feltétlenül fontos. A lényeg az. 2-es és 3-as nyíl jelöli az adarrovábbítást.például POP vagyIMAP protokollon keresztül. de ezt megelőzően hogyan érkezik a küldőről az információ' Ha webes felületet kínálunk GP G-vel ritkosírott levelek küldésére. l 2 Feladó böngészője Webszerver Címzett levelezöszervere 3 Címzett levelezőkliense 18. hogy a második és harmadik körben titkosírva küldjük azt. de segítségével . hogy nem foglalkozunk vele. hogy az adatokat akkor is SSL-en keresztül küldjük. melyik kulccsal titkosítsa az üzenetet. A 18. Dönthetünk úgy is. Ez azt jelenti. Ha foglalkoztat bennünker kódunk biztonsága. Az l-es szakaszban azonban a feladó által az űrlapba bevitt szövegként továbbíródik az üzenet. Amikor például parancssorban használjuk. A nyílt űrlap címkéje jelenleg a következőképpen néz ki: <form method="post" action="titkos_ma1l kuldese.288 18.com. Az űrlap műveleteként (action) megadhatnánk egyszerűen a teljes URL-t is. és lehetövé teszi a fogadó számára annak visszafejtését. mégis érdemes ezt a megoldást választani. A 2-es és 3-as szakaszban az üzenet GPG-vel titkosírva továbbítódik. fejezet Ez a parancs $parancs = "/usr/local/bin/gpg --recipient -a \\ 'Luke Weiling <luke@tangledweb. az információ útja a 18. Saját használati körülményeinknek megfelelően kell módosítanunk. fontos. hogy a felhasználó által az űrlapba bevitt adatokat biztonságosan küldjük el. A $_SERVER [ 'SERVER_ PORT' l értékét ellenőrizve győzödhetünk meg erről. Minden más kapcsolat hibát eredmé­ nyez. hogy a rendszerünkön belüli összes információmozgást figyelembe vegyük.5 ábra: A titkosított levelezőalkalmazásban az üzenetet háromszor továbbíljuk az interneten. P éldául SSL kapcsolaton keresztül átirá­ nyíthaguk a felhasználót ugyanahhoz az URL-hez. A címzett. akkor butaság azt első körben titkosírás nélkül továbbítani. A böngészőjük állapotsorán megjelenő kis lakat ikon megerősíti az emberekben azt a hitet.közölhetjük a felhasználóval. . és számos köztes hálózaton és gépen haladhat keresztül. Ha a kiszolgáló a kód futtatása közben leáll. biztosak lehetünk benne. A webszerveren az üzenet a címzett nyilvános kulcsával lesz titkosírva. A példában vizsgált kód az ábrán a Webszerver feliratot viselö gépen található. hogy a felhasz­ náló nem titkosírorr leveleit rövid ideig tároljuk a kiszolgálón. az unlink () függvénnyel rörölhegük őket. Elküldésekor az üzenet az interneten közlekedik.5 ábrán az l-es. hogy a látogatók adatai SSL használatával lesznek el­ küldve. hogy az üres űrlapot SSL-en keresztül küldjük a fel­ használónak. A GPG ritkosírja levelünket. hogy nyugodtak lehessen adataik biztonsága