P. 1
PHP.es.MySQL.webfejlesztoknek.2010.eBook.digiT

PHP.es.MySQL.webfejlesztoknek.2010.eBook.digiT

|Views: 2,258|Likes:
Published by d4n13l_hu

More info:

Published by: d4n13l_hu on Feb 02, 2012
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

10/12/2015

pdf

text

original

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 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. Traianus császár uralkodása alatt. az időszámításunk szerinti első században épült vezeték feladata az volt.Segovia vízvezetéke a római építészet egyik legnagyszerűbb. kézzel vágort gránittömbből emelték. 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 mai napig meglévő műemléke. és sem cementet. . Segoviába. amelyek a földtől 34 mérer magasan futva elegáns képet kölcsönöznek az urcáknak. 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. A vízvezetéknek a város középpontján áthaladó. Az építményt több mint húszezer.

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

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

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

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

de már közelgett a PHP 5. a PHP 6-ról is. további információért lásd: http://www.Bevezetés 5 A könyv írásakor a PHP 5.php A phar kirerjesztés támogatása beépített PHP tömörítő alkalmazás létrehozására.3 funkciói közül sorolunk fel néhányat.net/book.ind.namespaces Az ind kiterjesztés támogatása az alkalmazások nemzetköziesítéséhez.3 főbb jellem�ői Olvashatrunk már a PHP új főváltozatáról.net/ manual/en/class.com/ why-mysql/benchmarks címen érhetjük el.net/ manual/ en/intro. illetve az OpenSSL kirerjesztésnek a továbbfejlesztése A php.phar A lileinfo kiterjesztés támogatása a jobb fájlkezelés érdekében. 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.és időfüggvények hozzáadása A crypt(). további információért lásd: http://www.net/manual/ en/book.php.php A sqlire3 kirerjesztés támogatása a SQLite beágyazható SQL adatbázismoror használatához.mysql.2-es volt a legújabb változat.sqlire3. akkor természetesen bárme­ lyik nekünk tetsző verziót relepíthetjük). további információért lásd: http://www.php A libmysql-t felváltó MySQLnd driver támogatása. hogy a MySQL nagyságrendekkel gyorsabb versenyrársainál. Az értékek nagy része azt mutatja. Teljesítmény A MySQL vitathatatlanul gyors. a könyv megfelelő oldalain további információt találunk majd velük kapcsolatban: Névterek támogatása.php. A fejlesztök benchmark.3-as verziójában is. és így ahhoz 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. 2002-ben az eWeek ugyanazt a webes alkalmazást használva összehasonlított öt adatbázist. hash() és md5() funkció müködésének. további információért lásd: http://www. további információ: http://forge. Ugyanakkor a PHP 6-os verzi­ ójába tervezett számos funkció megtalálható a PHP 5. . karbantartással.net/language.com/wiki/PHP_MYSQLND A fenti lista a PHP 5. a Microsofr SQL Server és az Oracle. hogy a hosting szolgálratók telepíteni kezdjék (ha mi magunk kezeljük a szerverünket.3. Az eredmény döntetlen lett a MySQL és a nála sokkal drágább Oracle között. A könyv írása idején ez még nem volt a megjelenés közelében. 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. php. 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. ugyanakkor a verzió a már korábban is meglévő funkciókon végzett számos hibajavítással.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. A PHP 5.oldalát a http://mysql. 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.lileinfo.ini adminisztrálásának és kezelésének fejlesztése. teljesítményfejleszrések (pl.php.és időkezelés Számos frissített klienskönyvtár.php.3 szélesebb körben ismert új funkcióit tartalmazza. amely alverzió közelebb áll az elfogadáshoz. további információért lásd: hrtp:/l www.azaz viszonyírási értékeket mutató. A következőkben a PHP 5. jobb memóriakezelés a Zend motorban) és hibajavítások • A PHP 5.

x verzióját vagy valamely 3.6 Bevezerés Alacsony költség A MySQL nyílt forráskódú licenccel ingyenesen.yavítás Haladó MySQL programozás című 13.és a webes alkalmazások többségével ez a helyzet -. Forráskód Akárcsak a PHP. Ez ugyan a felhasználék többségének általában nem szempont. ám a MySQL AB (www.mysql. kereskedelmi licenccel pedig alacsony áron használható. Ha dolgozrunk már más relációs adatbázis-kezelő rendszerrel. Egyszerű használhatóság A legtöbb modern adatbázis SQL-t használ. illetve szá­ mos hib.Ha nem kívánjuk alkalmazásunkat terjeszteni . Amennyiben az olvasó MySQL szerver egy korai 4. hogy hozzászokjunk a MySQL-hez.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. érdemes tudni. ismétlődő lekérdezések sebességét A könyver a MySQL 5. Hordozhatóság (platformfüggetlenség) A MySQL számtalan különböző Unix-rendszeren. Amennyiben a MySQL-r valamely alkalmazás részeként és nem Open Source licenccel szeretnénk terjeszteni.x verzióját használja. Támogatás elérhetősége Nem minden nyílt forráskódú termékhez tartozik olyan anyavállalat. amely ráadásul a többi hasonló terméknél egyszerűbben beállítható. és vészhelyzet esetén van hova nyúlni. képzéseket. tanácsadást és minősítése­ ket ad. hogy a 4. illetve Microsoft Windows alatt is használható. mert garantálja a folytonosságot. amely támogatást. nem szükséges licencet vásárolnunk. fejezetet!) Adatbázisok alapszintű finomhangolási lehetőségeinek támogatása . a tudat mégis megnyugtató. akkor fizetős licencre van szükségünk. akkor nem fog gondot okozni. 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.com) mindezr az előnyt kínálja a felhasználék számára.1-es (Beta Community Edition) verzióját használva írtuk. a MySQL forráskódja is beszerezhető és módosítható. illetőleg in­ gyenes vagy nyílt forráskódú szoftveren dolgozunk. 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.

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

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. és kivételkezelés .

A változótípusokat és az operátorok Iciértékelési sorrendjét is áttekintjük. rontsuk el. 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. Amennyiben számítógépünkre nincsen PHP telepítve. ahol kísérletezni tudunk. 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. 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. majd if és else parancsokat. A PHP Unix és Windows operációs rendszerekre telepítéséhez szükséges minden összetevöt megtaláljuk a http:/ /www. és meg kell próbálni módosí­ tanunk azokat. Próbáljuk ki a példákat! Gépeljük be vagy töltsük le a http://www. a Perl Active Server Pages (ASP) vagy egyéb programozási nyelvben. mett alkalmas lehet a tudásukban lévő fehér foltok eltüntetésére. hogyan müködik a nyelv. Ehhez olyan tesztágyra van szükség. A programozási szakkönyvek igen gyakran nagyon egyszerű példákan keresztül tanítják meg az alapvető szintaktikát. . Megvizsgáljuk a Boole-változók fogalmát. Az ügyfél meg­ rendelésén a végösszeget és az adótartalmat kiszámítva megtanulj uk. hogyan érhetjük el és kezelhetjük az űrlapváltozókat. amelyre telepít­ ve van a PHP.hu/mellekletek oldalról letölthető mappák között. else és switch utasításokkal Iterációk alkalmazása while. 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.l PHP gyorstalpaló A fejezet röviden áttekinti a PHP szintaktikáját és nyelvi alkotóelemeit. a műveleti jelek (operátorok) és a kifejezések PHP-beli müködését. A könyvben a valós életből származó.perfactkiado. akkor a fejezetben leírtak segítségével gyorsan képbe kerülhetünk a PHP-t illetően is. PHP-ben már programozó olvasóinknak is érdemes átfutni. hogy más utat választunk. vagy kérjük meg a rendszergazdát. első feladatunk a telepítés lesz. Hogy minél többet kihozzunk a példákból és esettanulmányokbóL futtatnunk kell. ami semmivel sem tud többet. Ha jártasak vagyunk a C. Úgy döntöttünk.hu/mellekletek oldalról. a?: műveleti jelet és a switch utasítást használó példákat nézünk át. Az olvasóknak azt kell megérteniük. perfactkiado. Ezt követően a beviteli adatokat ellenőrzö PHP kód használatával online rendelési űrlapot fejlesztünk. mint az online kézikönyv. 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. változtassuk meg. nem a szintaktikát és a fiiggvényeket felsoroló újabb referenciakönyvre van szükségük.

A PHP elsajátítását egy l kitalált cég.1 példakód: rendelesi_urlap. Ez a viszonylag egy­ szerű.1 példakódban láthatjuk. mit rendelt az ügyfél. illetve szeretné tudni.12 2. fejezet Mintaalkalmazás létrehozása: Bob autóalkatrészek A szetveroldali szkriprnyelvek egyik leggyakoribb alkalmazási területe HTML űrlapok feldolgozása. az autóalkatrészekkel foglalkozó Bob autóalkatrészek rendelési űrlapjának létrehozásával kezdjük. html - Bob kiinduló rendelési űrlapjának HTML kódja <form action="rendeles_feldolgozasa.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" . és mennyi a rendelés végösszege.1 ábra: Bob megrendelési űrlapjának kiinduló változata csak a termékeket és a mennyiségeket rögzíti. Bob tudni szeretné. 1. mennyi forgalmi adót kell fizetni a rendelés urán. 1. Az űrlap HTML kódjának egy részét az 1. az 1.1 ábrán látható űrlap hasonló az interneten található sok másikhoz. A fejezetben használt összes példa kódját megtaláljuk a letölthető melléklerek 01_fejezet mappájában. 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.

fontos. beazonosítható neveket adjunk az űrlapmezöknek. majd a "Rendelés elküldése" gombra kattin­ M. -� 1.php nevű kódot. {Rövide­ sen megírjuk ezt a kódot. Nyissuk meg szövegszerkesztőnket. hogy az oldalon lévő minden mezönév ugyanolyan for­ mátumú legyen. PHP-programozással töltött óráinkat jelentősen köny­ nyebbé tehetjük azzal.. 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... amely akkor töltődik be. r--�"'"""""'"� tt. hogy a mezőbe begépelendö adatra utaló nevet használunk.) Az action tulajdonság értéke az az URL. tunk! Az 1. 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> .. Mivel késöbb is szükség lesz rájuk. a másik pedig a post metódus {külön üzenetben küldi el azokat). vagy alulvonást használunk-e a szóközök helyett. és töltsük be böngészöbe azzal. é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. hogy értelmes.2 ábra A PHP ech o ut asításának átadottszöve g megjelenik a böngészőben. hogy az űrlap action tulajdonságánál az ügyfél megrendelését feldolgozó PHP kód neve lett megadva. olaj_db és gyertya_ db! A PHP kódban is használni fogjuk ezeket a neveket. amikor a felhasználó a"Rende­ lés elküldésé' gombra kattint. Vizsgáljuk meg. hogy kitöltjük Bob űrlapját. rendeles_ feldolgozasa. 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. Figyeljük meg az űrlap mezöinek a nevét is: abroncs_db.��(<'�� Mentsük el a fájlt.r"' ·. Egyes HTML szerkesztök olyan alapértelmezett mezöneveket gene­ rálnak.2 ábrán láthatóhoz hasonló eredményt kell kapnunk. '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..</p>'.. -:" Bob autóalkatrészek Rendelési eredmények . hogy vajon röviditettünk-e egy szót a mezö nevében. Az egyik a get {az adatokat az URL végéhez ruzi hozzá). Egy ilyet szinte lehetetlen megjegyezni. Érdemes a mezönevekhez valamilyen kódolási szabályt alkalmazni.. l \. hogy a PHP kód megírásakor is emlékezhessünk rájuk.u... hogy idáig tisztán HTML kódot gépeltünk be.!or.PHP gyorstalpaló 13 Látható.o'"�. Így könnyebb megjegyezni.

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

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

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

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

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

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

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

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

A PHP-nek a hatókörre vonatkozó. ha lefuttatjuk a phpinfo ( ) függvényt: phpinfo(). Ahogy haladunk a könyvben. amelyek rnindenhol. Ezek szuperglobális vagy autoglobális változók. csak a függvényeken belül nem. az értékadó ( = ) és a karakterlánc-összefűző ( . ahol az adott változó elérhető. (Az 5.) A függvényekben bevezetett változók az adott függvényre nézve helyiek. amelyekkel értékeket és változókat kezel ünk. ha a global kulcsszóval deklaráljuk azt. rajtuk müveletet végrehajtva. köztük a$_GET. 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ó. Két müveleti jel került eddig szóba. fejezetben részletesebben elmagyarázzuk ezt a müködést. hogy az utóbbiak csak boolean. ám a függvény két meghívása közöte megőrzik értéküket.$_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. Nem kötelező. 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.3. ez azt jelenti. 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. l Vegyük észre. Műveleti jelek használata A müveleti jelek. akkor és ott. Egyelőre rnin­ den változó. amit használunk. A $_GET és a$_POST tömb. mivel könnyebben olvashatóvá és áttekinthetővé teszi kódunkat. amikor relevánssá válnak. a függvényeket és osztályokat bemutató részében. A globálisként deklarált függvényekben lévő változók az ugyanolyan nevü globális változókra hivatkoznak. A változók és állandók közötti másik különbség. A következő részekben a mü­ veleti jelek celjes listáját áttekintjük. Ha szükségünk van az állandó értékére. Deklarálásuk után az állandók globálisan elérhetők. float és string ópusú adatokat tárol­ hamak. 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. és a függvény végén megszünnek létezni. alapértelmezésben globális lesz. ) operátor. más néven operátorok olyan szimbólumok. amit a vevői rendelés végösszegének kiszámítására fo­ gunk használni. fejezet Adjuk ezeket a sorokat kódunkhoz! Így van már három állandónk. A ha­ tókört részletesebben is megtárgyaljuk a fejezet egy későbbi. Változók hatóköre A hatókör (scope) kifejezés a kód azon területeire utal. mégis érdemes ragaszkodni ehhez.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. integer.22 2. hogy a függvényeken belül és kívül is használhatók. hogy az állandók nevét nagybernvel írtuk! Ez a C-ből átvett szokás egyszerüen. a következöket gépelnénk be: echo ABRONCSAR. Ha például az imént létrehozott konstansok közül az elsőt szereménk használni. ránézésre megkülönböztet­ hecövé tes:d a változókat és az állandókat. Ezeket az adattípusokat együttesen skaláris értékeknek nevezzük. A PHP az általunk meghatározott állandókan kívül számtalan saját (beépített) állandóval rendelkezik. hogy amikor állandóra hivatkozunk. Az állandók és a változók közöte egy fontos különbség. függvényeken belül és kívül is láthatók. (De függvényen belül csak akkor érhető el az adott globális változó. 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.) A kódban deklarált globális változók a kódban bárhol elérhetők. illetve néhány különleges változó egyéni hatókörszabályokkal rendelkezik. Ezeket a legegysze­ rűbben úgy tekinthetjük át. . 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. némelyikkel mi magunk is találkozni fogunk. csak a nevét kell használnunk. nem kell dollárjelet rakni elé.

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

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

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

mint a l l. $a összes bitjét invertálja.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. hogy PHP-ban túl sokat használnánk ezeket a bitműveleti jeleket. ha $a vagy $b vagy mindkettő true.4 táblázat: A PHP logikai müveleti jelei Műveleti jel && Név NEM Használat !$b $a && Eredmény Igaz. de ha mindkettő igaz vagy hamis. ahol $a és $b közül legalább az egyik azon bige '1'-es. máskülönben hamis Igaz. KIZÁRÚ VAGY ésNEM műveleti jelet támogatja. ha $b hamis Igaz. akkor hamis lesz az értéke operátor mögött helyezkedik el.5 táblázat összefoglalja öket.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. ahol $a és $b mindegyikében az a bit '1'-es. de a műveletsorrendben hátrébb van Ugyanaz. ha $a és $b is igaz.26 2. illetve használatukat az 1. mindazonáltal az 1. Ha például azt szerernénk megállapítani. fejezet 1. Ezeket. hogy az $a változó értéke O és 100 közé esik-e. Bitműveleti jelek A bitműveleti jelek (bitwise operator) lehetövé teszik. ha $a vagy $b igaz. 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.4 táblá­ zat foglalja össze. 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. máskülönben hamis Ugyanaz. 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. mint Nagyobb. 1.Nem valószínű.VAGY. . Minden más biten 'O'. de a műveletsorrendben hátrébb van Igaz. Ott lesz T az eredményben. 1. Minden más biten 'O'. hogy az egész számokat az őket alkotó bitek sorozataként kezeljük. mint az & &.

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

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

7 táblázat: jobb) vagy irreleváns. hogy az ugyanolyan elsőbbségű operátorok kiérté­ kelése milyen sorrendben történik. Az 1.00 V�ÁFA-Ylll:$29040 l 1.7 ábra a műveletek PHP-beli elsőbbségi sorrencljét és csoportosíthatóságát mutatja. 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. ami azt határozza meg. Ha jobban megvizsgáljuk a szánútásokat. hogy miért ebben a sorrendben hajtjuk végre azokat.rejlik. A kód a number_ forrnat () függvénnyel formázza a végösszeget két tizedesjegyet tartalmazó karakterlánccá. lefele haladva nő az elsőbbségük. amely szerint kiértékelésük történik. Vizs­ gáljuk meg például a következő utasítást: $vegosszeg = $abroncs_db * ABRONCSAR + $olaj db * OLAJAR * + $gyertya db GYERTYAAR. Ez a függ­ vény a PHP Math könyvtárából származik.jobbról balra (röviden sőbbségi sorrenddel rendelkező műveleti jelek találhatók felül.l2 ��$:264.5 ábra: A vevői megrendelés végösszegét kiszámoltuk. formáztuk és megjelen ítettük.PHP gyorstalpaló 29 Bob autóalkatrészek Rendelési eredmények Rmddk�id6pga!JI'. l. 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) @ . Ez a sorrend általában balról jobbra (röviden bal). A végösszeg helyesnek tűnik.1-41h� R. 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 .34.eodet�SDiom. A mű­ veleti jelek csoportosíthaták ( asszociatívek) is lehemek. felmerülhet a kérdés.IIT.

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

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

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

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

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

2 példakód: kiszalli t as. A költség egyszerű képleetel kiszámítható. Az 1. hogy hosszú és ismétlődő. hogy a kiszállírási táblázat ll nll•l• .. Azt szeretnénk. 1. - . 100 150 200 2�0 10 IS 20 2S 1. Láthatjuk. 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 .7 ábrán láthatóhoz hasonló legyen.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. Ha valamit ugyanúgy kell meghatározott alkalommal végrehajtani.2 példakód az ezt a táblázatot megjelenítő HTML kódot mutatja. Bob szeretné a kiszállírási költséget tartalmazó táblázatot megjeleníteni és hozzáadni a vevői megrendeléshez. hogy a távolság növekedésével együtt emelkedik a kiszállítás költsége.IM <> l l az 1. � ..7 ábra: A táblázat azt mutalja. � "':. akkor ciklussal ismételhetjük meg a program adott részeit. A Bob által igénybe vett futárszolgálatnál a kiszállírási dij a távolságtól függ.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

hogy egy adott fájl ténylegesen létezik-e. kivéve akkor. Az ftell () függvény azt mutatja meg. Egyéb hasznos fájlfüggvények Létezik néhány további fájlfüggvény.. 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.(ftell($fp)). hogy. Irendeleseklrendelesek. A függvény prototípusa a következő: string fread(resource eroforras_valtozo. a file_exists () függvényt kell a következők szerint használni: if (file exists ("$DOCUMENT_ROOTI.txt"). A teljes eredeti kód helyett az alábbit is használhatjuk: $fp = fopen("$DOCUMENT_ROOTI. ' <br l> ' .txt". a függvény hamis értékkel tér vissza. 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.Irendeleseklrendelesek. 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.. Ezek közül mutatunk be néhányat. fseek( ) és A rewind () függvény a fájl elejére viszi vissza a f:ijlmutatót. ha nin­ csen jogosultságunk a törlésre..mennyit mozdult előre az állományban a fájlmutató. fseek () és ftell () A fájlmutató fájlon belüli helyzetét a következő függvényekkel kezdhetjük. 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). 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" ))).bájtokban kifejezve.) Például: unlink("$DOCUMENT_ROOTI.'. 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: '. Abban az esetben..lrendeleseklrendelesek. 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. fejezet A fájlok karakterenkénti beolvasása általában értelmeden és nem igazán hatékony megoldás. . echo nl2br(fread( $fp. 'rb').Irendeleseklrendelesek.50 2. Visszatérési értéke a b:ijtban kifejezett fájlméret. illetve állapíthatjuk meg: ftell() . azaz törlés nevű függvény nem létezik. Fájlon belüli navigálás: rewind (). int hossz). az unlink() függvénnyel tehetjük meg. amellyel tetszőleges mennyiségű adatot olvasharunk be a kiválasztott állományból. amelyek időről időre hasznosak tudnak lenni. vagy pedig a fájl nem létezik. Ez jellemzően akkor fordulhat elő. l> ) Az n 12 br() függvény HTML sortörésekre ( <br alakieja át a kimenetben szerepiő \n karaktereket.txt")) echo else 'Ezek a feldolgozásra váró megrendelések.'. { 'Jelenleg nincsenek megrendelések. rewind($fp). ha valamilyen oknál fogva kifejezetten karakterenként szükséges feldolgoznunk az állományokat. /rendeleseklrendelesek.. filesize("$DOCUMENT_ROOTI. (Delete. fclose( $fp ).txt"). ha a fájl nem törölhető.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

hogy . a máso­ dikban eredményét.2 táblázat: Kis. és vizsgáljuk meg. ebben a példában a 2\$ azt jelenti. Egészként értelmezi.1 táblázat: A konverziós specifikáció típuskódjai Típus b c d Jelentés Egészként értelmezi. hogy miként kell a $targy karakterlánc esetén használni. Az első oszlopban a függvény nevét látjuk. á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). Egészként értelmezi. és decimális számként jeleníti meg Double típusként értelmezi. hogy argumentumainak nem szükséges a konverziós specifikációkkal megegyező sorrendben lenniük. Egészként értelmezi. Mintaalkalma­ zásunk esetén ennek ugyan nem sok haszna van.vagy nagybetűvel legyen szedve. és bináris számként jeleníti meg. A pontos sag paraméternek tizedesponttal kell kezdődnie. Az utolsó oszlop a fuggvény által visszaadott értéket mutatja. a harmadikban azt. A fuggvény két alternatív változarának vprintf () és vsprintf () a neve. vagyis \jellel ellátott $ szimbólumot helyezünk. Ez azt jelenti. Egészként értelmezi.1 táblázatban találjuk. 4.2f (szállitással együtt: %1\$.az argumentumok tömbjét. A lehetséges típusok kódját a 4. hogy milyen függvényekkel változ­ tathatjuk meg írásmódját l E függvények hatását a 4. é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.a változó számú paraméterek helyett . és nyolcas számrendszerbeli számként jeleníti meg. Csupán annyit kell tennünk..és nagybetűs írásmód megváltoztatása a karakterláncban Bármely karakterláncban megváltoztathatjuk. Egészként értelmezi.2 táblázat foglalja össze. Ezek két paramétert fogadnak: a formátum­ sztringer és . és lebegőpontosként jeleníti meg. és tartalmaznia kell a tizedespont (tizedesvessző) után megje­ leníteni kivánt tizedesjegyek számát. 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 (karakterben számolva) mennyi helyet hagyjon az ide be­ helyettesítendő változónak. %2\$. A specifikáció utolsó része a típus kóclja.é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.helyettesítsd a listában második argumentummal!': Ezzel a módszerrel ismételni is lehet az argumentumokat. 4. hogy egy része vagy egésze kis. Például: printf ("A rendelés végösszege: $total). és hexadecimális számként jeleníti meg kisbetűs a-f számjegyekkeL Egészként értelmezi. 4 Stotal_szallitas.2f) ". és karakterként jeleníti meg. és előjel nélküli decimális számként jeleníti meg. hogy az argumentum listabeli pozícióját közvetlen ül a% jel után írjuk. Karakterláncként értelmezi és jeleníti meg. Kis. s mögé egy védőka­ rakterrel.

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

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

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

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

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

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

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

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

a PHP \$-ként fogja feldolgozni. Ezeknek a szabályoknak a kissé zavaró végeredménye az. A com. A PHP visszaperjelet használ a különleges karakterek. nem pedig kiemelésről van szó.4 táblázat a szögleres zárójeleken kivül használt különleges karakterek jelentését. Mivel kettős idézőjelek között van. amit a reguláris kifejezés értelmezője dollárjelhez fog illeszteni.5 táblázat: POSIX reguláris kifejezésekben szögletes zárójeleken belül használt. fejezet Ágaztatás A reguláris kifejezésen belüli választási lehetőséget fuggőleges vonallal jelöljük. hogy PHP-ben egyszeres idézőjellel körülvert karakterláncokba helyezzük a reguláris kifejezések mintáit.csak kezdő pozícióban használható Karaktertartományok meghatározására használható . kér visszaperjellel rudjuk jelezni. mennyiségjelző vége + ? Részrninta megjelölése opcionálisként 4. Ezt követően a reguláris kifejezés értelmezője egyetlenként dolgozza fel ezt a megmaradt kettőt. A PHP értelmező két visszaperjelként fogja feldolgozni a né­ gyet. 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. mennyiségjelző kezdere Min. Ha visszaperjelet kivánunk jelölni.86 4. A 4./max. 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 .5 táblázatban a különleges karakterek összefoglalását találjuk. A kettős idézőjellel ellátott szeringekben lévő reguláris kifejezések használara felesleges komplikációkkal járhat. Ügyeljünk. Amennyiben visszaperjelet kivánunk sze­ repelterni a rnintában. vagy { vagy $ . kerrőt kell használni belőle.4 és a 4. hogy a literális visszaperjelet tartalmazó reguláris kifejezést jelképező PHP karakterlánchoz négy visszaperjelre van szükség. 4. Ha literilis $ jelhez szeretnénk illeszteni egy rnintában.4 táblázat: POSIX reguláris kifejezésekben szögletes zárójeleken kívül használt.például . a "\\\$" sztringet kell használnunk.5 táblázat a szögletes zárójeleken belüli jelenrésüket tartalmazza.kivánunk illesz­ teni. akkor két visszaperjellel (\\)kell helyettesíteni.kiemelésére.köztük a visszaperjel. ha literális visszaperjelet szeretnénk kettős idézőjelek közőrt lévő PHP karakterláncba írni. Ugyanígy. 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. hogy lirerális visszaperről. különleges karakterek összefoglalása Karakter \ Jelentés Kiemelő karakter NEM./max. visszaperjelet (\)kell eléjük helyezni. 4 A különleges karakterek áttekintése A 4. a 4.

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

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

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

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

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

gif" alt="" height="20" width="20"> <span class="menu">Kezd6lap</span></td> <td width="25%"> <img src="s-logo.2 ábrán látható nyitóoldal ( kezdolap. font-size:9pt.menu {color:white. fejezet lehet egészen apró. font-size:12pt. a:link.a:visited. száz vagy akár ezer oldalon végrehajtani a másolás-beillesztés monoton lépéseit. font-weight:boldl font-family:arial.foot {color:white.92 5.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. 5. font-weight:bold} font-family:arial.oldal fejrész --> <table width="lOO%" cellpadding="l2" cellspacing="O" border="O"> <tr bgcolor="black"> <td align="left"><img src="logo.a:active </style> </head> <body> {color:white} 5 <!-. font-family:arial.sans-serif. 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. ha ezt az apróbb módosítást több tíz. text-align:justify.gif" alt="" height="20" width="20"> <span class="menu">Szolgáltatások</span></td> <td width="25%"> <img src="s-logo.sans-serif. 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. font-family:arial. Jó lenne. text-align:center. td p {background:blackl {color:black.sans-serifl . text-align:center.menü --> <table width="lOO%" <tr > <td width="25%"> <img src="s-logo. mint több tíz.1 példakódban látható.gif" alt="" height="20" width="20"> <span class="menu">Kapcsolat</span></td> <td width="25%"> <img src="s-logo. text-align:center. font-size:24pt. html) for­ ráskódja az 5.sans-serif} p.gif" alt="" height="20" width="20"> <span class="menu">Oldaltérkép</span></td> bgcolor="white" cellpadding="4" cellspacing="4"> src="logo. Az 5. font-size:12pt.1 példakód: kezdalap.gif" alt="TLA logo" height="70" .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-.

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

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

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

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.

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

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

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

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

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

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

$a -> metodus(). az elsőbbséget élvez. az A osztály funkcióit. Egy alosztály alaposztálya minden amibúrurnát és metódusát örökli. ha lecseréljük azokat. $b -> metodus(). hogy B létrehozása nem változtatta meg A-t. echo "A \$tulajdonsag értéke: " $this->tulajdonsag. és felülírja az eredeti definíciót. kivéve. az attribúrumok vagy metó­ dusok alaposztálybeli felülírása sincsen rá hatással. hogy a szülők mely attribútu­ mait és metódusait kívánjuk felülírni és lecserélni. "más érték". echo " A \$tulajdonsag értéke: " $this->tulajdonsag. A parent kulcsszó lehetövé teszi. 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". Tanulmányozzuk most az alábbi két kódsort: Sa = new A(). hogy a metódusnak a szülőosztályban lévő eredeti változatát hívjuk meg. 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()."<br />". amely így a B osztály és az ő szülője. a PHP az aktuális osztály tulajdonság­ értékeit használja. Bár a szülőosztályból hívjuk meg a metódust. E sorok egy A típusú objektumot hoznak létre. Amikor függvénydeklarálás elé helyezzük. Az így előállt kimenet azonban eltérő. = final function metodus() . a követ­ kező B osztályt hozhatjuk létre. más végeredmény­ hez jurunk. a függvény egyeden alosztály­ ban sem írható felül. Amennyiben létrehozunk egy B típusú objektumot."<br />". A C osztályban megint eldönthetjük. Ennek kimenete: Valami A $tulajdonsag értéke: alapértelmezett érték bizonyítja. A B deklarálása nincs hatással az A eredeti deliníciójára. Amennyiben szeretnénk megváltoztaeni a $tulajdonsag értékét és új funkeiét adni a metodus () metódusnak. Deklarálharunk egy C nevű. Ö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. 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. Ha cserét definiálunk.Objektumorientált PHP 115 function metodus() echo "Valami<br />". metódusait örökli. a B-ből származtatott osztályt. 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. és meghívják metodus ( ) függvényét. Ennek a kódnak: $b = new B(). 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 />".

Az interfészekre a többszörös öröklődés áthidaló megoldásaként tekinthetünk. és felülírják az öröklött elemeket. de a 6. amely viszont az A osztályból öröklődik. hogy egy szülő hány gyerekosztállyai rendelkezhet.116 6. így ez szabályos. ami PHP-ben nem érvényes. Ahelyett. vagyis többszörös öröklődéssei állunk szemben. hogy olyan osztályok csoporgát hozzuk létre.a többséggel egyetemben . Ez azt jelenti. Mindegyik osz­ tály legfeljebb egy szülővel rendelkezik. így ez egy PHP-ben teljesen szabályos. l Ha ezt követően megpróbálunk az A osztályból örökíteni. A jobboldalt lévő kombinációban a C osztály az A és osztályból öröklődik. Ez így elsőre talán nem teljesen világos. 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.. amelyeknek képeseknek kell lenniük önmaguk megjelení­ tésére. hogy núnden osztály csak egyeden szülőtől származtatható. Mindegyik osztály legfeljebb egy szülővel rendelke­ B zik. de a PHP ."<br />". 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. 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. 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.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. Ha megkíséreljük a felülírást. hasonlóan a többi objektumorientált nyelv.nem. köztük a Java által támogatott interfészmegoldáshoz. " $this->tulajdonsag. egyszeres öröklődés. . 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.1 ábra az A. . hogy az interfészt alkotó osztályokban megvalósítandó metódusok halmazár hozzuk létre. amelyből az osztályok örök­ lődnek. Ebben az esetben a C osztály két szülővel bír. Arra vonatkozóan viszont nincsen korlátozás. Az interfész alapgondolata az. 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. és C osztály az A osztályból öröklődik. egyszeres öröklődés. hogy egy osztályból alosztályokat származtassanak. hogy létrehoznánk egy megjelenites() függvénnyel rendelkező alaposztályc. fejezet echo "Valami<br />". Egyszeres öröklódés Tóbbszörös öröklód és 6 Egyszeres öröklődés 6. A követke­ zőképpen teheljük ezt meg: final class A { .

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ezen osztály konstruktora két paramétert fogad: egy üzenetet és egy kódot. 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. illetve PHP-beli megvalósírását mutatjuk be. de érdemes vagy juk. Egyes programozási nyelvek. amely saját. kivételt válthatunk ki (throw exception). Inkább nyelvi alkotóelem. A throw kulcsszó indítja el a kivételkezelő mechanizmust. az Exception osztályból öröklődő kivételpéldányokat használni. felhasználó által meghatározott. mintsem függvény. A fejezetben az alábbi főbb témakörökkel foglalkozunk: Kivételkezelési fogalmak Kivételkezelési szerkezetek: try . 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. objektumorientált alapokon nyugvó hibakezeléssei egészíthető ki..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.. Ha például az Exception osztály kivételeit szándékozunk elkapni. mindazonáltal értéket kell átadni neki. ha minden catch blokk más cípusú kivételt készül elkapni. Ezek egy hibaüzenetet és egy hibakódszámot szándékoznak jelképezni. A legegyszerűbb esetben a beépített Exception osztály egy példányát hozzuk létre. hogy a kód egy úgynevezett try blokkon belül hajtódik végre. hogyan tudjuk saját kivételeinket meghatározni. ahogy tettük ezt a fenti példában is. kód)..) az Exception osztály példányair vagy a saját. (A fejezet egy későbbi részében megmutat­ . bizonyos esetekben automatikusan kiváltják a kivételeket.throw.7 Hiba� és kivételkezelés A fejezetben a kivételkezelés fogalmát. A kivételek egységes mechanizmust szol­ gáltamak a hibakezelésre.. A kivétel bármilyen tÍpusú lehet. A try blokk alatt legalább egy catch blokkra is szükség van. PHP-ben ezt saját kezűleg kell megrenni. köztük a java is. A kivétel kiváltása a következőképpen történik: throw new Exception('üzenet'. Objektumot vár. 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ó. Mindkét paraméter opcionális.

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

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

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

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

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

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

Figyeljük meg a 7.html oldalról érhető el. További olvasnivaló Mivel a kivételkezelés a PHP egyik újdonsága. 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. A kivételkezelésről általánosságban azon­ ban bőséges információ lelhető fel. fejezetben részletesen megismerjük. A . Megtudjuk.com/docs/books/tutorial/essential/ exceptions/handling. Ezeket a beállításokat a 26.138 7. hogyan hozzunk létre és töltsünk fel MySQL adatbázist. majd mindezt a PHP-ről tanultakkal összekapcsolva hogyan lehet az adatbázist az internetről elérni. de fontos tudni. 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.sun. ini hibaJelentő beállításaitól függően vagy megjelenik és naplóba kerül. 7 . amely a php. vagy nem. illetve arról. Hogyan tovább: A könyv következő része a MySQL-lel foglalkozik. fejezetben foglalkozunk. 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. Érdemes megemliteni. amellyel a Hibakövetés címü 26. miért érdemes hasz­ nálni azokat.természetesen a Java szemszögéből íródott . hogy a PHP a kivételkiváltástól függetlenül kiadja a figyelmeztetést. A Sun kiváló oktatóanyaggal rendelkezik a kivételekről.5 példakódban. nem túl sokat írtak még a témában.anyag a http://java.

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

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

Példánknál maradva: a vásárlók több megrendelést is leadharnak. hogy mely szerzők mely könyvekben érintettek. A három típust a kapcsolat két oldalán lévő elemek száma szerint különbözteljük meg.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. 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. Háromféle kapcsolat létezik a relációs adatbázisokban. miért érdemes két külön táblát használni. A dőlttel szedett kifejezések pedig külső kulcsok abban a relációban. amelyben alá vannak húzva. Felvetődhet a kérdés. egy az egyhez típusú kapcsolat lenne közöttük.00 6. A sémákat megjeleníthetjük informális ábrákon (ahogy az imént tettük). Nev. Ezek mutatják. a másik szerzőket ( Szerzok) tartalmaz. Lakcim.99 Datum 02-Apr-2007 15-Apr-2007 19-Apr-2007 01-May-2007 l 8. A Cimek táblából egy idegen kulcs mutatna a Vasa rl ok táblába vagy fordítva. illetve szöveges formában. Az egy az egyhez kapcsolat azt jelenti. VasarloiD. egyed­ kapcsolat diagramban (amivel könyvünkben nem foglalkozunk). amelyben dőlten jelennek meg. Ebben a harmadik táblában csak a másik két tábla kulcsait találjuk idegen kulcsként párokban. Az ilyen típusú kapcsolatban általában egy minden adatot tartalmazó táblázat is létezik. 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. AVasarlok táblában a VasarloiD az elsődleges kulcs.ben-idegen kulcsként hivatkezunk rá. Ha például a lakcímeket a Vasarlok táblából külön táblába tennénk. Varas) Osszeg. az egyik könyveket ( Konyvek) . így a fenti példánál maradva lesz Konyvek. Ebben az esetben az ügyfélazonosítót betesszük a megrendeléseket tartalmazó táblába. illetve az egyes táblák elsődleges kulcsát és idegen kulcsait tartalmazza. A kapcsolat lehet egy az egyhez (one-to-one). például: Vasarlok(VasarloiD. Képzeljünk el két táblát. Ilyen kapcsolatnál a sok sort tartalmazó táblázat idegen kulcsa mutat az egy sort tartalmazó táblázatra. de más táblában-a példában a Megrendelesek. egy a sokhoz (one-to-many) vagy sok a sokhoz (many-co­ many) típusú. Kapcsolatok Az idegen kulcsok táblában lévő adatok közötti kapcsolatot jelképeznek.99 74. 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. Sémák Az adatbázis összes táblatervét együttesen adatbázissémának (schema) nevezzük.50 12. amit két szerző jegyez. hogy mutassa a kapcsolatot. Szerzok és Konyvek_ Szerzok tábla is. Adatok ugyan nincsenek benne. hogy mindkét dologból egy-egy alkolja a kapcsolatot. l 8 . A relációs adatbázis az idegen kulcs (foreign key) kifejezést használja az ilyen kapcsolatta. de értelmezését meg­ könnyítendő mintaadatokat helyezhetünk bele.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. A séma az összes táblát és azok oszlopait. akik más könyveket is írtak-egyedül vagy más szerzőkkel. 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). Datum) Megrendelesek(RendelesiD. Létezik olyan könyv.

címe és ára. Minden megrendelésnél van dátum. hogy rendeléskor rnilyen szállítási címet adott meg a vásárló. és ezekről az objektumokról és kap­ csolatokról tárolunk el információt. Általánosságban azt mondhatjuk.3 ábra: A kiinduló séma Vasarlok. Rövidesen azonban 8 ezzel is foglalkozni fogunk. hiszen . végösszeg és rendelt könyvek.99 24. Ebben az esetben végeredményként egy.kiderül például az.00 6. valós világbeli objektumokat! Adatbázis létrehozásakor általában valós világbeli elemeket és kapcsolatokat modellezünk. Az esetek többségében azonban elegendő néhány alapvető tervezési elvet betartani.50 12. Rengeteg könyvet találunk az egyed-kapcsolat diagramokról és az adatbázis-normalizálásról.99 8. Vizsgáljuk meg most ezeket a fenti példákban szereplő könyvesbolt kontextusában l Gondoljuk végig a modellezett. Megrendelesek és Konyvek. hogy mikor van szükség új táblára.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. Minden vásárlóhoz tattozik név és cím. amely témakörök meghaladják jelen kötet tartalmi lehető­ ségeit.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.144 8. A Book-O-Rama könyvesbolt példájában a vásárlókról. akkor adatait többször eltároljuk.et al.) . könnyedén létrehozharunk az adatoknak megfelelő táblát. Java 2 for ProfessionalDevelopers Installing GNU/Linux Teach Yourself GIMP in 24 Hours 34. a 8.99 74. (Ugyanakkor egy ilyen adattárolásnak is meglehetnek az előnyei.4 ábrán láthatóhoz hasonló tábla adódna. fejezet Webes adatbázis megtervezése Bizonyos tekintetben művészet tudni azt. ahogy azt reméljük. hogy a modellezett.99 24.a példánál maradva . Az adatbázis kezdeti sémáját a 8. hogy legalább három táblára van szükségünk az adatbázisban: Vasarlok. és mi legyen a kulcs. a forgalmazott könyvekről és a rendelésekről szetetnénk információt tárolni. valós világbeli objektumok minden egyes osztályának külön táblára van szüksége. A modellből egyelőre nem tudjuk megmondani. Minden könyvhöz tartozik ISBN-kód. Redundáns adatok tárolásának elkerülése Korábban feltettük a kérdést:.672-31509-2 Michael Morgan ThomasDown Pruitt.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. Megrendelesek és Konyvek táblából áll. A fentiekből az következik. mely könyveket választották az egyes rendelésekben. és mi­ lyen címre indítottuk a rendelést. 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ú. van szerzője.

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

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

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

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

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

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

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

mysql. akkor ugyanezt egy* megadásával is megtehetjük. Ha elem-ként a*. Működésüket. Ha adott adatbázist használunk e parancs kiadásakor. hiszen ez az. 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. a rendszer­ gazdák számára megfelelő jogosultságok. (A 12. tabla_ neve ) vagy egyes oszlopokra (adatbazis _neve.a jogosul tsagok. 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. tároljuk. hogy hogyan lehet közvetlenül ezeket módosítani. host. hogy másoknak kioszthassa saját jogosultságait. á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. hogy oszloponként határozzunk meg jogosultságokat. tables_pr iv és mysql. A biztonsággal később részleresebben is foglalkozunk. Ezzel megkülönböztethetjük mondjuk a laura (amit a MySQL laura@ localhost-ként értelmez) és a laura@valahol. mysql. A felhasznaloi_nev az. A biztonságot is növeli. tabla _neve. Ezek a példák a másik három jogosultsági szintet mutatják: adatbázis. illetve további SSL-beállításokat adharunk meg. Használhatunk egy vagy több oszlopnevet. amivel a felhasználónak a MySQL-be be kell jelentkeznie. Csak azokra az adatbázisokra és táblákra adjunk a felhasználék számára jogosultságokat. és mely táblákat vagy adatbázi­ sokat érhetik el az adott helyről. Ne feledjük.152 9.a jogosultságok vesszővel elválasztott listáját jelöli. A jelszavak kiválaszrására a szokásos szabályok vonatkoznak. a jelszavakat stb. A MySQL jogosultságok meghatáro­ zott készleteivel rendelkezik. amivel a felhasználót be kívánjuk léptetni. Számos helyőrzöt (placeholder) találunk a fenti szintaktiká­ ban. A jogosultságok tárolása a mysql nevű adatbázis öt rendszertáblájában történik. Ezt globális jogosultság kiosztásának nevezzük.) . egyelőre elég annyi. a Hala­ dó MySQL-adrninisztráció című 12. majd az oszlopok felsorolása az oszlopok helyőrzőben J adjuk meg.*). hogy a jelszó ne legyen könnyen kitalálható! Vagyis ne legyen szótárban előforduló szó. hogy . illetve oszlop. fejezetben alaposabban is megvizsgáljuk ezt az adatbázist. mysql. honnan csatlakozhatnak a felhasználók.* karaktereket acljuk meg. ahol a felhasználó­ kat. Arra való. Ez igen hasznos tud lenni. amelyeket ténylegesen használniuk kell! A rendszergazdán kívül senkinek nem szabad hozzáférést adni a mysql adatbázishoz. az összes adatbázisra megaelj uk a jogosultságokat. utóbbi esetén vesszővel kell elválasztani azokat. Bármelyik felhasználóhoz hozzárendelhetjük ezen jogosultságok bármelyikét. Ha nem egy konkrét adatbázist használunk. user. illetve néhány különleges jogosultság. Az SSL-en keresztüli MySQL-hez csatlakozásról a MySQL kézikönyvben találunk további információt. közvetlenül ezeket a táblákat módosírjuk. illetve azt. amelyre az új jogosultságok vonatkoznak. Ezek neve mysql. com felhasználói nevet. 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. 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. mert a különböző domainekből érkező felhasználóknak gyakran ugyanaz a ne­ vük. hogy a jo­ gosultságokat egy adatbázis núnden táblájára (adatbazis_neve. é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. Ennél gyakrabban fordul elő. A REQUIRE mellékágban meghatározhatjuk. A je lszo helyére az a karaktersor kerül. 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. frissítések vagy kapcsoládások számát korlá­ tozhatjuk. Az os z lopok helyőrző opcionális. columns _priv A GRANT parancs alkalmazása helyett megreherjük. db. Az elem azt az adatbázist vagy táblát jelöli. ezeket a következő részben mutatjuk be. Megosztott rendszerek esetén kiválóan alkalmasak az egyes felhasználék által kiváltott terhelés korlátozására. mivel meghatározhatjuk. egyetlen táblára (adatbazis _neve. hogy a felhasználónak Secure Sockets Layer (SSL) protokollrétegen keresztül kell csatlakoznia. leckében tekintjük át. Az első. tábla.

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

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

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

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

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

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

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

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

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

TIMESTAMP [ (M) l YEAR [ (2 l 4) l 70-69 ( 1970-2069) 1901-2155 A 9. Ezek a különböző mérerekben elérhető típusok hosszabb szöveghez. Ezzel a kérdéssel a 12.8 ráblázaror!). 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 gyakoriarban a BLOB és a TEXT típusú oszlopok megegyeznek. amelyek eltérő rarrománnyal rendelkeznek. A második csoportba a TEXT és a BLOB típus tartozik. hogy rarrománya sokkal nagyobb. Kér.Ol 00:00:00 Valamikor 2037-ben formárumban megjelenő dárum és idő. 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. 9. 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.8 táblázat a TIMESTAMP különböző megjelenítési típusair tartalmazza. használarukat érdemes különösen megfontolni. amelyek a bitiary large object (nagy bináris objekrumok) kifejezésből kaprák nevüket.) 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. A megjelenítési for­ márum az M ércékéről függ (lásd a következő. Év.vagyis a rövid szövegda­ rabok-tartoznak. . Mind­ kerrőnek meghatározhatjuk a szélességét.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. Tranzakcióköverésre hasznos időbélyeg. a TEXT nem az. 9.és numerikus formárumban is bevihetjük az adatokat. fejezetben. A tartomány felső harára a Unix koriárjáról függ.Ol. fejezetben foglalkozunk részleresen.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. Az első csoportba az egyszerű karakterláncok. A B LOB-ok. 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.162 9. hogy a BLOB kisberű-nagyberű-érzékeny. 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. illetve bináris adarokhoz valók. (Irr kell megemlíteni.és négyszámjegyű formárum választható. a VARCHAR oszlopok szélessége ugyanakkor a bennük lévő adarról függőerr változik.7 táblázarban Járjuk ezeket. Minden típusnál karakrerlánc. Egy adott halmaz legfeljebb 64 elemből állhat.kivéve. a 9. arniről részlete· sebben olvasharunk majd a 12. Ez a CHAR (meghatározott karakrerhosszúságú) és a VARCHAR (változó karakrerhosszúságú) típus. Érdemes megjegyezni. 9. az egyeden különbség közörrük. A SET típus azt írja elő. TIME HH: MM: SS formárumban megjelenő idő. bárrnir képesek tárolni -így képet vagy hangadator is.Ol 00:00:00 9999-12-31 23:59:59 1970. A harmadik csoportba kér különleges típus tartozik: a SET és az ENUM. minr amire valaha is szükségünk lehet! YYYY-MM-DD HH: MM: SS DATETIME 1000-Ol. Figyeljük meg. fejezer Dátum és idő típusok A MySQL sokféle dátum és idő típusr támogat.

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

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

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

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

'). ( '0-672-31769-9'. Elös�ör uonban néz�ünk egy olyan. Arra has�náljuk. (Lehetnek ugyanakkor MySQL kifejezések eredményei is. 'Thomas Down'.99).sql Adatok visszakeresése adatbázisból Az SQL igáslova a SELECT utasítás. E�ek a� ada­ tok a vasarlok tábla minden sorából meg lettek jelenítve. ('0-672-31745-1'. hogy a fenti tábla a megadott tábla ( vasarlok ) kiválas�tott elemeit ( nev és va ros) tartalmu�a. (2. System Administration Unleashed'. két INSERT példautasítást. tartalma messze meghaladja a piacon levő alapszintű Java könyvek anyagát.Munkavég�és MySQL adatbázisunkkal 167 INSERT INTO konyvek VALUES ( '0-672-31697-8' . 'Pruitt. (4 . l)' l)' 3). 'Java 2 for Professional Developers'. 49.'. 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. Néhány has�nosabb kifejezéssel a következő rés� végén megis­ merkedhetünk. opcionális mellékágak nélküli lekérdezést. 'Installing et al.99). Amennyiben betöltöttük a 10. INSERT INTO konyv_ertekelesek VALUES ('0-672-31697-8'. '0-672-31745-1'. Debian GNU/Linux'. illetve végrehajtottuk a fejezet korábbi részében bemutatott.i.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. 34. 10 'Thomas Schenk'. 'Caldera OpenLinux INSERT INTO rendelesi tetelek VALUES (l.) A� alábbi lekérdezés a vasarlok tábla nev és varos os�lopának tartalmát listáz�a ki: SELECT nev. 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. 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. (3. . 'Morgan könyve jól érthető. '0-672-31697-8'' '0-672-31769-9'' '0-672-31769-9'' '0-672-31509-2'.99). 'Teach Yourself GIMP in 24 Hours'. 2)' l)' (3.1 példakód rnintaadatait. varos FROM vasarlok. 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. ('0-672-31509-2'.99). 24. hogy a táblá�at meghatározott kritériumoknak megfelelő sorainak k. 24. 'Michael Margan'.

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.00 osszeg < 60. 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á. mint a má­ sik. ám csak azokat a sorokat. Számos további lehetőség közül választha­ runk a lekérdezés kialakításakor.1 táblázat: WHERE mellékágakban gyakran használt összehasonlító műveleti jelek Név (ha van) Egyenlőség Nagyobb. mint a másik. 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. 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. mint Kisebb. Megállapítja. Megállapíga.1 táblázatban találjuk. hogy az egyik érték nagyobb vagy egyen­ lő-e. Jelen esetben azokat a sorokar választor­ ruk ki. ha nem találjuk itt. Az alábbi kód például: SELECT * FROM megrendelesek WHERE vasarloid = 5.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. Megállapítja. Ha például a rendeles i_tetelek tábla összes oszlopát és sorát szetetnénk visszakapni. akkor az alábbi SQL kódot kellene használnunk: SELECT * FROM rendelesi tetelek. valamilyen kiválasztási feltételt kell meghatároznunk A WHERE mel­ lékágban tehetjük meg ezt. Az egyszeres egyenlőségjelet az egyenlőség ellenőrzésére használjuk. os szeg > 60.00 osszeg >= 60. hogy a két érték nem egyenlő. Nagyon hasznos a dzsókerkarakter ( * ). Megállapíga. nézzük meg a MySQL kézikönyvben! 10. hogy a mező tartalmaz-e értéket. figyeljük meg. hogy ez eltér a PHP-beli használattól. A lista nem teljes. A WHERE mellék­ ágakban leggyakrabban használrakat a 10. Megállapítja. amit keresünk. a megrendelesek összes oszlopát kiválaszga. Megállapíga. hogy az egyik érték nagyobb-e. amelyeknek vasa r lo i d-je 5.98 24. ahol a vasarloid értéke 5.00 osszeg <= 60. hogy az egyik érték kisebb-e. mint a másik. és ha egyszerre használjuk a kér nyelvet.168 10. mint a másik.00 mennyiseg 1 != o IS NOT NULL lakeim is not null . hogy az egyik érték kisebb vagy egyenlő-e. fejezet Az oszlopokat a SELECT kulcsszó után tetszőleges számban felsorolhaguk. amely a megadott tábla vagy táblák összes oszlopát 10 kiválasztja.

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

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

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

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

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

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

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

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

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

mivel az oszlop _leiras tartalmazza az oszlopneved A CHANGE-hez hasonló. hogy egyes nevek túl hosszúak. (Figyelem: ha elkezdjük módosítani a táblát. . fejezetet!) Újra beállíthatjuk a tábla tulajdonságait. Törli a megnevezett oszlopot.cs) és egybevetésre (collation) alakítja az összes. Újra létrehozza a táblát úgy. hogy az oszlop_leiras-nál. hogy 70 karakter hosszú legyen: ALTER TABLE vasarlok MODIFY nev CHAR(70) NOT NULL.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. fejezetet! Külső kulcsot ad InnoDB táblához. ) ADD UNIQUE [CONSTRAINT [szimbolum]] index] (oszlop. (Az InnoDB-ről további in­ formációért lásd a 13. Egy vagy több új oszlopot szúr be a tábla végéhez. ) ADD [CONSTRAINT [szimbolum]] PRIMARY KEY (oszlop. Jegyezzük - meg. fejezet 10. Beállítja az alapértelmezerr karakterkészletet és egybevetést. A CREATE TABLE utasítással meg­ egyező szintaktikát használ. Kikapcsolja az indexfrissítést.) ADD INDEX [index] (oszlop. nem pedig oszlopnevek megváltozta­ tására alkalmas. hogy ez a szintaktika alkalmas az oszlopnevek megváltoztatására. ... fejezetet! ADD [COLUMN] (oszlop_leiras. 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. Fontos.. Az adatok begyűjtése után ész­ revesszük..) 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. Avasarlok táblában például korábban 50 karakter hosszú nevek tárolását engedélyeztük. Törli egy InnoDB tábla mögötres táblatérfájlját. 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.. . Bekapcsolja az indexfrissítést.a nevet és típust kell megadnunk. .. A CONSTRAl NT utasítás külső kulcsot használó táblákhoz való. fejezetet!) Újra létrehozza egy InnoDB tábla mögöttes táblatérfájlját.. Úgy módosítja az oszlop ot. Törli a megnevezett indexet. Úgy segíthetünk ezen a problémán. akkor mint a CREATE utasítás esetében. szöveg alapú oszlopot.. ) ADD [CONSTRAINT [szimbolum]] FOREIGN KEY oszlop. 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. . így csonkolva letrek. (Az InnoDB-ről további információért lásd a 13. . ha módosítjuk az oszlop adattípusát. vagy eltávolítja azt. fejezetet! Egyedi indexet ad a tábla meghatározott oszlopához vagy oszlopaihoz. oszlop_leiras. hogy annak sorai adott oszlop szerint vannak rendezve.. Törli az elsődleges kulcsot (de az oszlopot nem).éppúgy. [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. A megadott oszlopot vagy oszlopokat a tábla elsődleges kulcsává teszi. az oszlop a tábla végére kerül).. Oszloptípusok. To­ vábbi részletekért lásd a 13. hogy egy idő után rájövünk: egy adott oszlop nem "elég nagy" az általa tárolandó adatokhoz. További részletekért lásd a 13. A CONSTRAINT jelölés külső kulcsokat használó InnoDB táblákhoz való. hogy az a megadott leírást kapja. Törli a külső kulcsot (de az oszlopot nem).178 10.

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

php-re vonatkozó kérést.iját. és elküldi a megfe­ lelő lekérdezése. hogy MySQL-ben dolgozva már létrehoztuk adarbázisunkat. . ahol dolgoztunk már ilyen fájllal. Meglévő MySQL adatbázis bireokában megírhatjuk az előző lépéseker végn�hajtó PHP kódot. ho­ gyan olvassunk adatokat adatbázisból. és hogyan írjunk bele. A PHP moror befejezi a kód furrarásác. Emlékeztetésképpen fussuk ár még egyszer az ort említert lépéseker: l. A MySQL kiszolgáló megkapja az adatbázis-lekérdezése. ami általában a lekérdezés eredményeinek HTML-beli formázását is magában foglalja.. A keresési eredmények oldal neve eredmenyek. Ezt követően az eredményül kaport HTML-r visszaküldi a webes kiszolgálónak. hogy a relációs adatbázisrendszerek webes alkalmazás esetén könnyebbé.ll MySQL adatbázis elérése a webről PHP vel . majd feldolgozás céljából átadja a PHP morornak. illetve ezekből az állományokból ke­ restük vissza azokat. A felhasználó böngészője HTTP kérést intéz egy adott weboldalhoz. php.. egyszerű fájlokban tároltuk az adatokat. 3. hogy webes felülettel ( weboldallal) kössük össze. 2.a könyvek lis­ r. készen állunk arra. 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. A PHP motor elkezdi vizsgálni a kódot. ahol a felhasználó láthatja a kére könyvek list. Az Adatok tárolása és lekérése című 2. Amikor a korábbiakban PHP-vel dolgoztunk. 4. 5. 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. és visszaküldi az eredményeker .1 példakód tartalmazza.a PHP motornak. fejezetben. Megcanuljuk. biztonságosabbá és hatékonyabbá reszik a tárolási és visz­ szakeresési feladaraink jelentős részér. visszakeresi a fájlt. fejezeeben vázoltuk a webes adatbázis-architektúrák működéséc. 6. A PHP megnyitja a kapcsolacor a MySQL kiszolgálóhoz. A webes kiszolgáló megkapja az eredmenyek. megemlítettük. Kezdjük a keresési űrlappal l Ezen egyszerű HTML űrlap kódjár a 11. illetve hogyan szűrjük ki a potenciálisan problémás adatok bevitelét. Mosr. A webes kiszolgáló visszaadja a HTML-t a böngészőnek. Ebben a fejezeeben bemutatjuk. 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. hogyan érhetjük el a Book-O-Rama adarbázist PHP segítségével a webről. feldolgozza.iját.

. 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.. szerző és ISBN-kód szerinti keresést tesz lehetövé. � .2 példakód: eredmenyek. fejezet 11.2 példakód tartal­ mazza. Keresés a Book-O-Rama katalógusban \'.el.182 ll.. A fejezet során azt fogjuk megtárgyalni. Kérjük...1 példakód: kereses.1 ábra: Teljesen általános keresési űrlap.. 11... Ezt a kódot a 11. hogy mir csinál. .. ami cím.��-----­ �-----------J 11. if (1$keresesi tipus l l !$keresesi k�fejezes) adja meg ezeket!'..1 ábrán látható.!!�!. $keresesi kifejezes=trim($_POST['keresesi kifejezes'))... php fájlban található.. . echo 'Nem adta meg a keresési feltételeket.. 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'). A HTML kód kimenere a 11. A"Keresés" gombra kartintáskor meghívott kód az eredmenyek. és hogyan müködik ez a kód.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ő. exit. php-Ez a kód keresi vissza a MySQL adatbázisból a keresési eredményeket.

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

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

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

Azért érdemes tudni ezt. a procedurális pedig eredmény-erőforrást ad vissza. Hiba esetén a függvény false értékkel tér vissza. é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. és rninden érték az annak megfelelő érték: $sor = $talalat->fetch_assoc(). $i++) { ll eredmények feldolgozása sorait és tömbként adja vissza azokat. Számtalan különböző módszer létezik. Át kell neki adni az eredményazonosítót. amely tömbben rninden kulcs egy oszlopnév. Az eredményobjektum vagy -azonosító a lekérdezés által visszaadon sarok elérésének a kulcsa. Ekkor a $sor->cim. $sor [l) stb. módon érhetjük el a tulajdonságokat. ményeket. és megfelelőképpen megjeleníthetjük azokat.) 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. A mysqli_fetch_ Mint már említettük. $sor = mysqli fetch row($talalat). a sarok száma alapján ciklus­ $i <$talalatok_szama. (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). hogy megjelenítés előtt rendbe rakjuk az értéket. ahogy a kapcsolódási függvények működnek. hoz. Ha a lekérdezés egyetlen sort sem ad vissza. mert ha tervezzük az eredmények feldolgozását vagy megjelenítését. $sor->szerző stb.a procedurális felület esetén . Átadjuk a futcaeni kivfut lekérdezést és . $sor = mysqli fetch_assoc($talalat). minden egyes mezőn végigmehetünk. és a mysqli_fetch_assoc ( ) függvényt is használtuk. ll ben is az $adatbazis) . ahogy tesszük ". 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. (Hasonlóan ah­ tároljuk el az eredménye. hogy különböző módszerekkel kinyerjük az eredményobjektumból vagy -azonosítóból számát. .) $sor = $talalat->fetch object(). a kétféle tömb bármelyikébe rakhatjuk a sorokat. a stripslashes ( ) függvényt azért hívjuk meg. tömbértékekbe kerülnek. adott sarok számát. akkor a következőket kell beírnunk: $lekerdezes).az adatbázisra mutató kapcsolatot (ami jelen eset­ Az objektumorientált változat eredményobjektumot. akkor a ciklus nem fut le. 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). hogy megkapjuk az eredményazonosítóból az eredményeket. meg.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. hogy.186 ll. például így: $talalatok_szama = mysqli_num_rows($talalat). fejezet • Tipp: Ne feledjük. az alábbi példában is: echo "<br />ISBN: echo stripslashes($sor['isbn')). 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. Sokféle függvény áll rendelkezésünkre. Példánkban megszámoltuk a visszaadon sarok számát. $talalat = mysqli query($adatbazis. A tulajdonságértékek a $sor [O]. $adatbazis->query($lekerdezes).

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

amely fogja a részleteket."'' '".188 ll. php adja tovább.4 példakódban.$ar. Kérjük. $eim=$ POST['cim']."'.".$eim. próbálkezzon később'". '". $szerzo. $ar=$_POST['ar']. $szerzo=$_POST['szerzo']. ' boakorama'. 11. $talalat = $adatbazis->query($lekerdezes). elvégez néhány apróbb ellenőrzést. próbálja meg újra'". 'konyvek'). ."')". $szerzo = addslashes($szerzo). Nem sikerült kapcsolódni az adatbázishoz.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']. 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.". if (mysqli connect_errno()) echo "Hiba: exit. Ezt a kódot láthatjuk a 11. $ar = doubleval($ar). $lekerdezes = "INSERT INTO konyvek VALUES ('". else echo "Hiba történt. if (!$isbn l l ! $szerzo l l ! $eim l l ! $ar) echo "Nem minden adatot adott meg." db könyv hozzá lett adva az adatbázishoz. exit."Kérjük. A könyvet nem sikerült hozzáadni. @ $adatbazis = new mysqli( 'localhost'. if (!get magic quotes gpc()) $isbn = addslashes($isbn). majd megkísérli beírni az adatokat az adatbázisba.<br />" . 'bookoramal 23'. if ($talalat) echo $adatbazis->affected_rows. ez az a kód. $eim = addslashes($cim).4 példakód: konyv_beszurasa.$isbn."'' '".

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

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

ll visszakapott sarok megjelenitése for ($i=O. $keresesi_kifejezes=trim($_POST['keresesi_kifejezes']). $i <$talalatok_szama. exit. ll visszakapott sarok számának megállapítása Stalalatok szama = $talalat->numRows(). $felhasznalo = 'bookorama'."%'". if (!$keresesi_tipus l l 1$keresesi_k�feJezes) adja meg ezeket!'.php').$felhasznalo. $jelszo = 'bookoramal23'. Kérjük.$host. ll kapcsolódás az adatbázishoz $adatbazis = &MDB2::connect($dsn). if (!get_magic_quotes_gpc()) { $keresesi_tipus = addslashes($keresesi_tipus). exit. $talalat = $adatbazis->query($lekerdezes). ll kapcsolódás eredményének ellenőrzése if (MDB2::isError($adatbazis)) { echo $adatbazis->getMessage()."@". $i++) . $host = 'localhost'. $adatbazis_neve = 'konyvek'. ll echo 'Nem adta meg a keresési feltételeket." LIKE '%".$keresesi_kifejezes. ll az eredmény ellenőrzése if (MDB2::isError($talalat)) echo $adatbazis->getMessage().":". $keresesi kifejezes = addslashes($keresesi k�fejezes).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'].$keresesi_tipus .$adatbazis_neve. ll felkészülés a PEAR MDB2 használatára require_once('MDB2.$jelszo."l". ll univerzális kapcsolódási sztring vagy DSN beállítása $dsn = "mysqli:ll". ll lekérdezés végrehajtása Slekerdezes = "SELECT * FROM konyvek WHERE ". exit.

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

amikor jogosultságokat oszrunk ki az adatbázisokra. a mysql nevű speciális adatbázis tábláit módosítjuk vele. Amikor GRANT utasítást adunk ki. adminisztráció A most következő fejezetben haladó szintű MySQL-témakörökkel foglalkozunk. 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. a szokásos módon tekinthetjük meg az ebben az adatbázisban lévő táblákat: show tables.12 Haladó MySQL .. Láttuk. fejezet bemutatta a felhasználék beállításának és jogosultságokkal való felruházásának folyamatát. köztük a jogosultságokkal. és hogyan működik a GRANT parancs. mindezt hogyan tehetjük meg a GRANT paranccsal. a biztonsággal és az optimalizálással. 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 . utasítást! Miután ezt megtertük. fontos pontosan tisztában lennünk azzal. Éppen ezért ügyelnünk kell. Ha MySQL adatbázis adminisztrációját kívánjuk ellát­ ni. Ezen adatbázis hat táblája jogosultsági információkat tárol.. Az eredmény az alábbihoz hasonló kell. A mysql adatbázis tartalmának megtekintéséhez jelentkezzünk be rendszergazdaként. majd gépeljük be a use mysql. hogy kinek és miért adunk hozzáférést a mysql adatbázishoz. mit tesz.

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

ez azt jelenti.2. Ezek a táblázat hatókörmezői (scope fi. illerve a 12. a P assword jelszóval bejelentkező felhasználó jogosultsá­ gainak felelnek meg. hogy a rendszerben lévő minden adatbázisra (így a rnysql adatbázisra is) érvényesek.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' . hogy álljon.eld) hatókörét írják le. enum('N' . A felhasználónak ehelyett több bejegyzése lesz a host táblában. Ha egy felhasználó több gépről csatlakozhat. 'X509' . amelyek az egyes felhasználó-host kombinációkhoz tartozó jogosultságokat szabályozzák.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' . User nevű. 'Y') 'Y') 'Y') 'Y') 'Y') 'Y') 'Y') enum( 'N' . A user tábla által felsorolt jogosultságok mindegyike globális. amelyek a többi. '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ő. enum('N' . Az általános felhasználóknak a megfelelő adatbázisokra. enum('N' . E két tábla sérnáját a 12. 'ANY' . enum('N' . enum('N' . úgynevezett jogosu/tsági mező (privilege fi. e num('N' . 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. akkor az ahhoz tartozó érték viszone N. e num('N' .3 táblázatban láthatjuk. Ha a felhasználó nem kapott meg valamely jogosultságot. A db tábla azt határozza meg. enurn(' N' . e num('N' . Rendszergazdák esetében itt számos jogosultság eseténY értéker találunk. enum('N' . nem pedig az összes táblára érvényes jogosultságokkal kell rendelkezniük. enum('N' . fejezetben a GRANT utasítással kiosztott jogosultságoknak felelnek meg. enum('N' . 'Y ' ) enurn(' ' . az ahhoz tartozó oszlop értékeY .eld). enum('N' . 12. enum('N' . a user és a db tábla nem fogja felsorolni ezeket a hostokat. de a fel­ használók többségénél N kell. Amennyiben a felhasználó rendelkezik adott jogosultsággal. A host tábla kiegészíti a user és a db táblát. hogy mely felhasználók melyik adatbázisokhoz és honnan (melyik hostokról) férhetnek hoz­ zá. 'Y') 'Y') 'Y') 'Y') 'Y') 'Y') 'Y') 'Y') 'Y') 'Y') . Az ebben a táblában felsorolt (és a többi tábla által követendő) jogosultságok a 9. e num('N' . Az ebben a táblában felsorolt jogosultságok az adott sorban megnevezett adatbázisra irányulnak.

'Y') enum('N'. 'Grant'. 12.'Y') enum('N'. 'Y') e num('N'.'Y') enum('N'.6. 'Y') enum('N'. oszlopszintű. 'Y') enum('N'. 'Create View'. illetve a 12.'Y') enum('N'.'Y') enum('N'. 'Y') enum('N'.'Y') 12. 'Al ter'. a 12.'Y') enum('N'. 'Trigger')) 'Create'. 'Update'. Ezek a táblák a user. 'Y') enum('N'. 'Y') enum ('N'. a columns_priv és a procs_priv tábla sémáját a 12.196 12. A tables_pri v. a columns_priv és a procs_priv tábla a táblaszintű.'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'. 'Y') enum ('N'. a columns_pri v és a procs_pr i v tábla az A tables_pr iv.'Y') enum('N'. db és host táblától kissé eltérő szerkezettel rendelkeznek. '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. táblázatban láthatjuk. 'Insert'.'Y') enum('N'. 'Re ferences'. 'Show view'. 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'.'Y') enum('N'.'Y') enum( 'N'. 'Drop'. 'Delete'. 'Y') enum('N'. 'Y') enum('N'. 'Y') enum('N'.'Y') enum('N'. 'Index'. Column_priv set ('Select'. 'References') .4. 'Update'.5.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'. 'Insert'.'Y') enum('N'. 'Y') enum('N'.'Y') enum('N'. illetve a tárolt rutinokhoz kapcsolódó jogosultságokat tartalmazza.

Kérés ellenőrzése. . a MySQL szerver nem fogja észrevenni. tangledweb. hogy minden hoszt megengedett) vagy a h osztnév egy része (a %. a hosztnév és a jelszó alapján történik. A rendszer először globális jogosultságainkat ellenőrzi (a user táblában). au-ra végződő összes hosztnév megfelel). a h osztnevekben a dzsókerkarakterek használatát és a jelszó nélküli felhasználókat. Kapcsolat ellenőrzése. Ha nem és a columns_priv rendelkezünk elegendő jogosultsággal. a MySQL a táblát fogja ellenőrizni. a MySQL ellenőrzi a tables_pr i v táblát. Ez az ellenőrzés a felhasználói név. hogy rendelkezünk-e a kérés végrehajtásához szükséges jogosultsággal. Ha a hosztnév üres. host táblában keres megfelelő user és host be­ a MySQL ellenőrzi. hogy a jogosultságok megváltoztak. a MySQL a jegyzést. hogy egyáltalán van-e jogosultságunk kapcsolódni. 'Re ferences') 12.ha ez nem elégséges. amikor a kapcsolat létrehozása után kérést intézünk a kiszolgálóhoz. hogy változás történt. Az üres jelszómező azt jelenti. Minden egyes alkalommal. Az üres felhasználói név azt jelzi. Begépelhetjük a MySQL parancssorba a FLUSH PRIVILEGES.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'. char (77) set('Execute'. Lehet ez a teljes mező tartalma (ami azt jelenti.Haladó MySQL-adminisztráció 197 12. Itt a MySQL először is azt ellenőrzi. végül táblát. 'Alter Routine'. com. au esetén például a . nincs szükség jelszóra. ezt a user tábla adatai alapján dönti el. Ha a müvelet tárolt rutinokat használ. illetve a GRANT és a REVOKE utasítás kiadásakor automatikusan beolvassa a jogosultsá­ gi táblákat. a MySQL hol és miképpen tárolja a jogosultságokat. ha nem engedélyezzük az üres felhasználói nevet. és ha ez még mindig nem elég. 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. 'Update'. mit jogosult megtenni egy adott felhasználó: l. akár saját kezűleg is megváltoztathat­ juk ezeket. Rendszerünk bizton­ ságosabb lesz. Most. Ahogy már korábban említettük. 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. majd. utasítást (a parancs használatához rendszergazdaként kell bejelentkeznünk). com. ezt pedig háromféleképpen tehetjük meg. hogy megrudtuk. hogy minden felhasználó kapcsolódhat. 2. Tudatnunk kell a kiszolgálóval. 'Grant') timestarop(14) pr i v 'PROCEDURE') 12 A tables_priv és procs nevét tárolja.a a columns_pri v db és a host táblához fordul. A h osztnevek ) meghatározásának használhatunk dzsókerkaraktert (%. 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. tangledweb. Ez a jogosultságok frissítésének talán leggyakrab­ ban használt módja. Ha azonban ily módon frissígük őket. 'Insert'.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'.

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

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

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

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

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

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

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

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

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

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

A dőlt berűvel szedert adatokat magunknak kell megadni. master-user='felhasznalo'. hogyan használjuk a különböző tárolómotorokat. negyedik kiadás) című művét. start slave. fejezet Amennyiben InnoDB táblákkal dolgozunk. számolnunk kell licencköltséggeL Megtehetjük azt is.mysql. 12 master-log-file='naplofajl'. . a tranzakci­ ókat és a tárolt eljárásokat. master-log-pos=logpos. és a replikálni kívánt adatbázis teljes könyvrárát lemásoljuk. A slave kiszolgáló most már fut és müködik. és feloldjuk a táblák zárolását. kezd­ jük azzal. majd újraindítjuk a kíszolgálót. A felhasznala és a j elszo a master kiszolgálón futtatott GRANT utasításból adódik. További olvasnivaló A MySQL-ről szóló eddigi fejezetekben a rendszer azon részeire és használatára fordítortuk figyelmünket. Ha készítetrünk adatbázisunkról pillanarfelvételt. Ha szecernénk többet megtudni a MySQL-adminisztrációról. illetve a MySQL és a PHP összekapcsolása szempongából a leginkább fontossággal bírnak. Amennyiben nem készíterrünk pillanatfelvételt. amely az Innobase Oy oldalán érhető el (http:/ / www. 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'. master-password='jelszo'. amelyek webes alkalmazások írásakor hasznosak. Megrudjuk például azt. hogy az irt bemutatort eljárást követjük. a legegyszerűbb az InnoDB Hot Backup eszköz használata. látogassunk el a hrrp:/ / www.208 12.innodb. és a táblák zárolásának feloldása előre kikapcsoljuk a MySQL szer­ vert. 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. következő leckében a MySQL néhány olyan haladóbb funkcióját ismerjük meg. A szerver a master kiszolgáló neve. Mivel nem ingyenes szoftverről van szó. 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. Hogyan tovább� A Haladó MySQL-programozás című.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ó. 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). amelyek a webes fejlesztés.

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

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

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

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

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

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

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

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

minr például a C. 13 . amelyek mögöct adarbázis áll. 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. Amennyiben a cranzakciók és az adarbázis-konzisztencia érdekel bennünket. fejezetben az elektronikus kereske­ delem és a biztonság szemszögéböl vizsgáljuk meg. keressünk egy olyan jó könyvec a relációs adac­ bázisokról. A témáról bővebben is olvashacunk a MySQL kézi­ könyvben. ha a szecernénk további információt kapni. Ezt érdemes tanulmányozni akkor is. Az E-kereskedelmi honlap üzemeltetése című 14.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!. J. 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 ..

vagy a jelenlegi lehetőségek egy olcsóbb alrernatíváját jelenti. Mind a mai napig ez az üzleti weboldalak leggyakoribb formája. kellően részleres tervvel kell rendelkeznünk.14 E�kereskedelmi honlap üzemeltetése A fejezetben azzal a kérdéskörrel foglalkozunk. hogy offline szolgáltatásainkat szeretnénk reklámoz­ ni. vagy kézzelfogható termékeket szetetnénk online értékesíteni. 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. Könyvünkben azzal a feltevéssel élünk. illetve megnézzük. hogy segitsen megfogalmazni céljainkat. hogy weboldalunk megvalósításának részletein töprengünk. illetve az ezekhez a célokhoz elvezető. hogy online értékesíthető és szolgálratható termékkel rendelkezünk. Az is lehet. 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. létrehozni és működtetni egy e-keres­ kedelmi honlapot. de hozzájárulhatnak a cég által hagyományos úton szerzert bevételekhez. hogy a potenciális ügyfelek kapcsolatba léphessenek a céggel. illetve azt. Lehet. Elképzelhető. Sokféleképpen közeüthetünk üzleti céllal az internethez. hogy honlapunk célja nem közveclenül a bevételteremtés. Nézzük meg ezeknek a kategóriák­ nak a részleres leírását. a lehetséges kockázatokat. Az ilyen honlap célja és létének pénzügyi oka. hogyan tarthatja el önmagát egy ilyen weboldal. sok cég számára van létjogosultsága egy ilyen típusú oldal üzemeltetésének. hogyan lehet ezeket úgy alkalmazni. Megvizsgáljuk a tervet. A brochureware. határozort célokkal. 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 abból bevétele vagy más előnye származzék szerve­ zetünknek! A könyv ezen részének célja. akár olcsó reklámozási lehetőségként kezelik. Egyik célunk így minden bizonnyal a pénzkeresés. Közvetlen ül nem termelnek bevételt. . hanem offline tevékenységeket támogat. hogy üzleti weboldalt kívánunk készíteni. 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. Akár első internetes próbálkozásként.

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

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

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

már több éve működünk. hogy mit reszünk és mit nem teszünk az adataikkal. akkor kevésbé valószínű.E-kereskedelmi honlap üzemeltetése 225 fogadni. automatikus értékesítőként gondoljunk. é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. hogy csak átverés az egész oldal. de ne feledjük. Honnan tudja a látogató. így vásárlóink is eltérő számítógépes tapasztalattal. 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. és navigációs iránypontokkal jelezzük számukra. egyszerű betűtípusokar használjunk! Ne állítsuk túl kicsire a szöveget. soha nem alvó. Pacem and Trademark Office (Amerikai Szabadalomügyi és Márkavédelmi Hivatal). 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. raktárral és relefonszámmal.S. hogy elküld­ 14 jék-e bankkártyájuk adatait az interneten keresztül. rnint a rendelkezésre álló rapasztalatok azt súgják. Ösztönözni kell a látogatókat. hogy egy csomó reklámot küldjünk nekik. akínek ráadásul még fizet­ ni sem kell. rendelkezünk irodával. ugyanakkor rendkívül fontos az ügyfélszolgálat.szem­ ben egy olyan vállalkozással. Ebből kifolyólag az oldalunknak a lehető legegyszerűbben használharónak kell lennie. arra használjuk. így segitve a tájékozódá­ sukat! 2 U. és honlapunk könnyen megralálható részére kell kirakni. (Magyarországon a jelenlegi szabályozás szerint a vevő 8 napon belül élhet elállási jogával. hirdetést és a figyelem elterelésére alkalmas elemet helyezünk a képernyöre. művelrséggel. hol járnak! Emeljük kí azt a menüpontot. Megbízható vállalkozás vagyunk� Ha vállalkozásunkat regisztráltuk a megfelelő szerveknél. hogy végigcsinálják a folyamatot. 5960411 számú szabadalom: Kommunikációs hálózacon keresztüli rendelésleadás módszere és rendszere. 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. vagy nem biztonságos módon tároljuk. Éppen ezért olyan vállalkozás látszatár kell kelrenünk. amely ügyel a biztonságra. de a megrendelés már teljesen más történet. amely pusztán egy honlapból és egy postafiókcímből áll. és ne feledjük.) A szabadalmar sok honlap üzemelterője élesen támadja. ha a vevő bármilyen oknál fogva elégedetlen azzal. miért bízna bennünkr Bárki össze tud állítani egy honlapot. 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. hogy kérdezzeneki Próbáljunk meg nekik azonnali vagy szinte azonnali választ adni telefonon. Olvasható szövegfajtát válasszunk! Tiszta. Csökkenrsük a lépések számár a minimálisan szükségesre. Ez rninimum azt jelenti. e-mailben. Ne felejtsük el ezeket az adatokar megadni saját magunkról! Mi történik. A használha­ rósággal és a kezelőfelület megtervezésével kapcsolaros elvekről egész könyveket írnak. és rénylegesen biztonságosan kell kezelni ügyfeleink bankkártyáir. hogy a felhasználók elveszítsék a fonalat! Adjunk nekik iránymurarást. 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. 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. Sok online kereskedés feltétel nélkül visszaveszi a rerméker. nyelvtudással. de hiánytalanul visszaküldi a terméket az eladónak. chaten vagy más kényelmes módon! Bizalomhiány Ha a látogató számára ismeretlen a márkanevünk. memóriával és látásmóddal rendelkeznek. amelyikben éppen tartózkodnak. Ezt az információt adatvédelmi nyilatkozatnak (privacy policy) szokás nevez­ ni. hogy összezavarjuk a felhasználót. Nem egysurű használhatóság Nincs kér egyforma ember. . hogy az Amazon. Nagy a kísértés. annál valószínűbb. ügyeljünk. hogy honlapunkra olyan. és így mások is hozzáférhernekr Fontos közölni a látogatókkal. 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.) Gondoljuk végig. Egy brochureware oldal átolvasásához nem szükséges bizalom. hogy megbízható a vállalkozás. amennyiben saját költségén. hogy rninél többet kell a vásárlóknak a megrendeléshez az egérrel kattintani. annál kevésbé valószínű. bontatlanul vagy megbontott csomagolásban. á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. Ne engedjük.

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

ha egyetlen központi telephellyel bír. á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. és mindenhol raktárkészletet kell fenntartani. Az a rninimum. Bátor példája ennek az Egghead. 2001-ben csődvédelmet kért. Minden cég ki van téve annak a veszélynek. 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. A központosítás is költségcsökkenése eredményezhet. Ám a meglévő szolgáltatások cseréje kockázatot is hordoz magában. Az internet a kommunikáció biztosításával pénzt takaríthat meg számunkra. A támogatás ilyen formája igen alacsony költség mellett növelheti a fogyaszták elégedettségét. hogy bűnözők célpontjává válik. Ez akár azt jelenti. Egy internetes vállalkozás elég. A crackerek támadásainak oka lehet a kihívás. Ilyen kockázatot hordoznak a: Crackerek A kívánt üzleti eredmény elmaradása Számítógépes hardverhibák Elektromos. a ko mmunikáció előmozdításából. A cég úgy döntött. az oldal tönkretétele. minden bizonnyal gazdaságosabb módon is megtehernénk ezt egy weboldalon kereszrüL Akár árliscákat. a világ bármelyik pontjáról elérhető lesz. Az Egghead. A pénzbe kerülő szolgáltatások elektronikus változatra cserélése költségcsökkentése eredményezhet. a szolgáltatások lecseréléséből. Az árak csökkennek. 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 . specifikációkat vagy bármilyen más információt adunk át az érdeklődőknek. Bár egy komoly e-kereskedelmi oldal létrehozása nyilvánvalóan pénzbe kerül. egy 80 kiskereskedelmi üzletből álló lánc sokkal nagyobb folyamatos költséggel jár. a nyereség pedig nő. majd a lufi kipukkadásakor. alkalmazottakat foglalkoztatni. A más vásárlók által javasolt megoldásokkal orvosolhaták az ügyfelek problémái. szolgáltatások ingyenes megszerzése. 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 rövid időn belül választ kaphatunk. akár azt. hogy bezárja informatikai bolchálózatát.E-kereskedelmi honlap üzemeltetése 227 sárlók számára olyan fórumot működtetni. több helyen kell bérleti díjat és rezsit fizetni. és fenntartja lojalitásukat. mert a legveszélye­ sebb támadások mindig belülről jönnek Szoftverekkel kapcsolatos óvintézkedések. termékkatalógusokat. Kockázatok és veszélyforrások megismerése Minden üzlet kockázatokkal jár: versenytársak. amely vonzza a becsületes munkavállalókat. de az e-kereskedelmi vállalkozások folyamatosan vonzzák a különböző szándékú és képességű crackereket. Ha több telephellyel rendelkezünk. ha ugyanezt az interneten tennénk elérhetővé. Megtakarítás származhat az információ online megosztásából. a hírnév iránti vágy. A cég az 1998-as doc-com lufi idején zárta be üzleteit. 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. 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. Költségcsökkentés Az internet használatának gyakori oka a költségek csökkentése. lopás. és az e-kereskedelemre összpontosÍija figyel­ méc. ahol megtárgyalhatják a cég termékeivel kapcsolatos hibaelhárírási tippeket. a külföldi vásárlók telefonköltség nélkül kaphacnak támogatást. 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. hogy az internetet nem használó ügyfeleket elveszítjük.com esete. pénz eltulajdonítása vagy a termé­ kek.com új vállalkozása nem jött be. 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 eredmény ugyanaz lesz. leggyakrabban ernlegetett fenyegetés a cracker néven ismert. illetve a működés központosításábóL Ha jelen pillanatban igen sok embernek adunk tájékoztatást. hogy az ajánlatkéréseket gyorsan szécküldhetjük. dokumentált eljárásokat. rosszindulatú számítógép-felhaszná­ lóktól érkezik.

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

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

Megvizsgáljuk. Mivel az ezek ellen támadást tervező kormányzatok minden bizonnyal bőséges erőforrással bírnak. érdemes megfelelő informatikai személy­ zeere és egyéb erőforrásokra költení a szükséges óvintézkedések érdekében. hogy névtelen támadásokat inditsanak róluk más rendszerek ellen. a weboldalak védelme érdekében alkalmazható technológiát. . Mennyire fontos nekü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. 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. és mennyire fontos a potenciális crackerek számára? Könnyen kisértésbe eshetünk. amit védeni sze­ retnénk. mert kíválóan alkalmasak arra. először is meg kell próbálnunk válaszolni a kérdésre. 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. 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. egy bank vagy egy katonai szervezet számi­ tógépén tárolt információ. és a támadók vélhetően korlátozott erőfeszítéseket tesznek a feltörésükre. az ilyen rendszerek ellen irányuló támadások esetiek lesznek. Ugyanígy eltérő az is. hogy oldalainknak minden pillanatban a lehető legmagasabb szintű biz­ tonságra van szükségük. hogy mennyit ér a birtokunkban lévő információ. illerve fontos szerepet játszharnak a vírusok és férgek terjedésében. Nyilvánvalóan eltérő értéket képvisel egy otthoni felhasználó. ám a védelem nincsen ingyen. Még a legkevésbé érdekes adatokat tároló számítógépek is felkelthetik a támadók figyelmét. köztük a titkosítást. tudnunk kell. kinek állhat szándékában meg­ szerezni a birtokunkban lévő információkat. milyen fontos az. illerve megismerünk néhány. hogy milyen messzire haJlandó egy támadó elmenni azért. teljesítmény. az ellenőrzést és a hálózati események nyomon követését. amelyekkel elkerülhetők az ilyen jellegű problémák. mennyi erőfeszítést és költséget kívánunk a biz­ tonságra fordítani. 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 vállalkozás. hogy hozzáférést nyerjen ezekhez az információkhoz. 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. Megnézzük a biztonsági házirendek létrehozá­ sának elveit.15 Az e�kereskedelem biztonsági kérdései A fejezetben a biztonság e-kereskedelemben betöltött szerepével foglalkozunk. és hogyan próbálkozhatnak ezzel. Mielőtt eldöntenénk. és azt gondolhatjuk.

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

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

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

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

akkor egyúttal annak használhatóságát is csökkentjük. Ezek többsége teljesen szabályos. üzenetet küldött nekünk. Külön dokumentumban kell szabályozni a biztonsági házirend elvárásainak teljesítését célzó irányelveket. mint a VeriSign (http://www. az üzenetek aláírása vagy titkosítása megnehezíti az észrevétlen módosításukat. amely az alábbiakat határozza meg: A szervezet biztonsággal kapcsolatos. ami az elvárt biztonsági szint garantálásához szükséges konkrét lépéseket szabályozza.com/) vagy a Thawte (http://www. teljesítmény. Mint már említettük. Tanulmányozni kell a köztük fennálló átváltásokat. Nem jó. és núnden gond nélkül kifizet néhány száz dollárt egy olyan tanúsítványkibocsátónak. költséget és biztonságot tekinthetjük egymással versenyző céloknak. A felek által küldött üzeneteknek manipulációbiztosnak kell lenniük. minthogy elveszítsenek egy üzleti lehetőséget. általános filozófiája A védeni kívánt elemek . Ha korlátozzuk a felhasználók lehetőségeit. Egy e-kereskedelemmel foglalkozó vállalat minden bizonnyal hajlandó azonosságának bizonyítására. költség és teljesítmény között szükségszerűen átváltás áll fenn. 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.verisign. Egyikük sem rudja leragad­ ni részvételét a tranzakcióban. A teljesítménye. amit a cég elküldött. például bíróság előtt a másik fél tettét. Egyszeri tranzakcióknál. hogy megerősítse a látogatókban a cég jó hirnevét. ha túl gyakran frissíteni kell. például egy e-kereskedelmi oldal és egy hitelkártyával fizető. behatolásmegelőző rendszer. hogy a Kukuryin Bt. 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. Biztonsági házirend létrehozása A biztonsági házirend olyan dokumentum. Ha teljes biztonságra van szükségünk. 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ó.thawte. Bár azt gondolhatnánk.com/). és megfelelő döntéseket hozva kell kompronússzumra jutni. az pontosan megegyezik azzal. hogy núndig a lehető legmagasabb szintű biztonság a kívánatos.szoftver. de számítógépeink internethez csatlakoztarásával azt is lehetövé tesszük az embereknek. Kialakítása lehetövé teszi. vagy azonosításra szólítjuk fel őket. 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. húzzuk ki a hálózatból. hogy amit megkaptunk. hogy ezzel biztonságosabbá tegyünk valamely szolgáltatást. A titkosított munkamenet (session). Ebben a doku­ mentumban különböző irányelveket fogalmazhatunk meg szervezetünk különböző egységeinek.például titkosítás. A védeni kívánt információkról. Ugyanennek a vállalatnak akkor el kellene utasítania minden olyan ügyfelet. 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. . 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. A biztonság erősítése számitógépeink teljesítményét is visszavetheti. ez nem feltétlenül igaz. akkor kapcsoljuk kí szánútógépeinket. 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. A rendszerünket biztonságosabbá tevő szoftver . ha bizonyítani tudjuk. hogy másféle kapcsolódási tÍpusokat kíséreljenek meg. 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. pénztárcánktól. weboldalak letöltésére vonatkozó kérés. hardver. 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.236 15. költség és biztonság Az internet jellegéből adódóan veszélyes. adat Az ezek védelméért felelős személyek A biztonság szabványai és a mérőeszközök. A gyakorlatban azonban ritkán ez a helyzet.például az SSL-kapcsolat egy weboldalhoz-a hagyományos 15 kapcsolamál nagyobb processzorteljesítményt igényel. Használhatóság. Nem sok hasznát vehetjük annak. használhatóságot. Ez természetesen növeli költségeinket. de arra nincsen bizonyítékunk. hogy bizonyos mértékben lazítsunk a biztonságon. pontosabban núndkét fél hitelt érdemlően bizonyítani ruclja harmadik személy. víruskereső vagy teljes körű naplózás-futta­ tása erőforrásokat igényel. é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. használhatóság. A biztonság. Úgy lehet ezt elképzelni. új vásárló közötti első kapcsolatfelvétel esetén azonban ezek nem annyira praktikusak.

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

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

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

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

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

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

kevésbé káros alter­ naríva után kellett nézniük. Ha há­ lózatunk működése igazán fontos számunkra. több redundáns hálózati kapcsolat vagy tűzvédelmi rendszer fenntartása. Hogyan tovább� A 16. A jogosulatlan szemé­ lyek szándékosan vagy véletlenül kihúzhatnak kábeleket. így az új tűzvédelmi rendszereknek más. 15 . 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. A váratlan. és hogyan védjük meg magunkat tőlük. hálózatainkat és kódunkat. Két szóba jöhető lehetőség az argon és a szén-dioxid. A rémáról bővebben is olvashatunk a http:/l www. 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. hogy a klimarizálás és számírógépeink is mű­ ködni tudjanak. fejezetben részletesebben foglalkozunk a webes alkalmazások biztonságáva!.epa. A "Montreali jegyzőkönyv az ózonréteget lebontó anyagokról" című egyezmény ma már tiltja a halon használatár. Ha rendszerünk folyamatos működése fontos számunkra. de azt jelenti. Működésünk méretétől függően ez lehet helyiség vagy szekrény.hrml oldalon. A kér kapcsolat nyilván többe kerül. 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. A hosszú áramkimaradásokhoz genetátorra van szükség.gov/Ozone/snap/ fire/qa. A sprinklerek (szórófejes. gázzal oltó rendszerekkel kezelték ezt a problémát. Régeb­ ben halont használó. be kell ruháznunk szünermentes tápegységbe (UPS). rövid áramkimaradások legtöbb helyen az élet velejárói. Rendkívüli időjárás vagy föld feletti vezetékek eserén a hosszabb kimaradások is rendszeresek lehetnek. mint a tűz. de elérhetők maradunk. Megnézzük. 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. hogy hálózari hiba ese rén alacsonyabb kapacitással ugyan. és hogyan készüljünk fel a katasztrófákra. 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. 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 e-kereskedelem biztonsági kérdései 243 Rendszerünket biztonságosan bezárt helyen kell tartani. Ennek alapja. A fentiek miatt érdemes lehet megfontolni. érdemes lehet egynél több internetszolgáltatóhoz kapcsolódni. hogyan vécljük szervereinket. vagy boot lemez segítségével megkisérelhetik megkerülni a biztonsági mechanizmusokat. kik az ellenségeink. akiknek erre szükségük van. vízzel oltó berendezések) legalább annyi kárt tudnak tenni az elektronikában. Csak azoknak az alkalmazottaknak szabad ehhez a géphez hozzáférniük.

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). Ha webes alkalmazást fejlesztünk. hogy csökkentsük az ilyen problémák bekövetkezésének valószínűségét. hogy néhány napig dolgozzon az ügyön. hogy milyen különböző médokon lehet rendszerünkkel visz­ szaélni. hogy képezze. a biztonság nem lesz rajta ezen a listán. hogy a hitelkártyaadatokhoz. fejleszeöknek nem elegendő csupán alkalmazásunk e. 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. De az üzlet nem állhat meg. és nem tehetjük meg. 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. 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. úgy tervezhetjük meg kódunkat. és biztonságukat elősegítő stratégiát kell kidolgoznunk az alkalmazásfejlesztéshez. és nekünk. olyan soha véget nem érő erőfeszítés legyen.kereskedelemmel kapcsolatos részeit biztonságossá tenni. működő alkalmazás igénye között. hogy megfelelő egyensúlyt calál­ junk a védelem szükségessége és a tényleges üzletvitelhez elengedhetetlen. 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á. hanem a biz­ tonság megtervezéséhez és kezeléséhez szükséges megközelítést kell kialakítanunk. hogy néhány potenciális problémáról el fo­ gunk feledkezni). pláne abban az esetben. A biztonság az alkalmazás teljes tervezési folyamatának részét kell.az összes gép egymással szembeni nyitottsága és elérhetősége .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. Így elkerülhető az is. ha szótári szavakat választanak. amikor végre foglalkozni kezdünk a biztonsági problémákkal. A ránk leselkedő veszélyek tudatában félelmetes lehet akár csak belegondolni abba. 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 . amelyek igazán aggodalommal tölthernek el bennünket. Megf elelő gondolkodásmód már a tervezéstől A biztonság nem egy funkció.egyben az egyik legnagyobb fejfájást is okozza a webes alkalmazásfejleszcőknek. hogy kijelölünk egy fejlesztőt. amely az alkalmazás üzembe helyezése és a fejlesztés lelassulása. É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. és elkészítjük azon funkciók listáját. A lényeg. amelyeket megfelelő szaftverrel nem különösen nehéz feltörni. hogy később. . A fel­ hasznáJók gyakran válaszeanak olyan jelszavakat. amiket az alkalmazásnak rudnia kell. vagy a támadók milyen módszerekkel törhetik fel azt. az egész alkalmazást át kelljen alakítanunk (ráadásul szinte biztos.

sőt akár a bankszámla-információkhoz is hozzáférnek. amelyek védtelenül hagynak bennünker a támadásokkal szemben. Mint általában a kezelőfelület esetén. ha kezelni kivánjuk az ilyen fenyegetéseket. hogy gondoskodjunk a felhasználék által ránk bízott.ez az az ár. sajnos. adóazonosíró jel stb. a szervert magár és a hálózator vizsgáljuk meg. használhatósági resztekre és fókuszcsoportokra támaszkodva állapíthaguk meg. hanem telepíré­ sük és konfigurálás uk is. és bejutnának a rendszerbe. itt sincsenek kőbe vésett és rninden helyzetre megfelelő szabályok. 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. Állandó éberség. 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. á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. 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. Ebben alkalmazásunk különböző alkotóelemeir. hogy legalább havonta egyszer módosítsák jelszavaikat. legalább ugyanennyire érdemes foglalkoznunk a biztonságnak a használhatáságra gyakorolt harásával. és hogyan tömhetjük be őket. A biztonság ré­ szér képezi a rendszer működés alatti felügyelete.előbb-utóbb kénytele­ nek lennénk belátni. kérféleképpen kell a biz­ tonsághoz közelíreni. Bizalmas adatok elérése vagy módosítása Webes alkalmazásfejlesztőként vagy programozóként feladataink közé tartozik. folyamaros harc és . hogy a szigorítás egyszerűen nem érte el célját. miben kell fejlesztési gyakorlatunkat megváltozratni.olyan csata. hogy négy. 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. amelyeket jogosultak látni. amelyek a rendszer használhatóságát nem aránytala­ nul megnehezítve fokozzák a biztonságát. amir egy zökkenőmentesen működő webes alkalmazásért fizetni kell. ami szintén negatív követ­ kezményekkel jár üzlermenerünkre. Ha online részvény. sokkal inkább saját ítéletü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. hogy lássuk. láthatják. hogy nem csak az ezekkel az alkotóelemekkel való kapcsolatfelvételeink biztonságosak. Sajnos rendszerünk annyira biztonságos lenne. különböző jelszót kérő bejelentkező abla­ kon keresztül lépjenek be. a naplók és egyéb fájlok figyelemmel követése. hogy korábban már használt jelszavakat nem választhatnak. olyan módon kell ezt tennünk. 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. ha megköveteljük a felhasználóktól. és a crackereknek sokkal több időbe kerülne. 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. ezért fontos risztában lenni vele. Ez a példa is jól mutatja. hogy használja . Egy egyszerűen használható. hogy csak azokat az információkat tekinthes­ sék meg. rnilyen és hány értékpapírral rendelkeznek. hogy miként fogadják a felhasználék a tervezett megoldásokat. hogy melyek ezek a lyukak. Meggyőzödünk arról.Szinte núnden esetben igaz.vagy befektetésialap-kereskedési rendszerhez írunk platforrnot (kezelőfelületet). amíg átkűzdenék magukat a belépési folyamaton. A biztonság. lentről felfelé haladó megközelítésnek (bortom-up) hívhatnánk. mégpedig úgy. hogy más felhasználék adataihoz nem szabad hozzáférniük. hogyan működik rendszerünk. Sok termék olyan beállírásokkal települ fel. 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. 16 A ránk váró fenyegetések azonosítása A 15. illetve határozhaguk meg azokat a terülereket.f�ezet Az egyik lehetséges módszer. rendszerünk fejlesztése és gyors válaszlépés a problémákra . 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.246 16.). és megnézzük. Webes alkalmazások fejlesztőiként olyan módszereket kell találnunk. a biztonság megőrzését elősegítő funkciókar tervezzünk bele� Ha mindenképpen nevet szeretnénk adni neki. hogy senki sem venné a fáradságot. . Azt is megkövetelhegük tőlük. Ez jelentősen megnövelné rendszerünk biztonságát. és hogyan használják. alacsony biztonsági szintű rendszer vonzó lehet a felhasználék számára. és milyen. amir soha nem lehet megnyerni. ahol biztonságosabb megoldások kifejlesztésére van szükség. például az adatbázisszervert.bizonyos érrelemben . hogy bár fontos törődni a bizton­ sággal.

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

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

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

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

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

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

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

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

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

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

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

) kutat kódok és prograrnak után. amely egyidejű­ leg még feldolgozható (az alapértelmezett érték. rnint az operációs rendszer! Használjuk az NTFS fájlrendszert. Deny from all </Files> Mint már említettü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. az Apache HTTP Server és a Micro­ soft IlS beállitását tekintjük át. hogy megfelelő számú kapcsolatot tudjon kezelni! A httpd 1. Ismét csak ajánlani tudjuk. így nem tudjuk a beillesztendó fájljainkat biztonságos helyre pakolni. ahol lehetséges a multithreading (több száJon futó feladat-végrehajtás). de ha nagyobb terhelésre számítunk. hogy egyiket sem). Ellenőrizzük. conf nevű fájlban találjuk.inc$"> deny Order allow. a 150 teljesen ésszerű. ám érdemes néhány dolgot alaposan leellenőrizni. 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. válasszuk inkább az iisadrnin segédalkalmazást!). Szélsőséges eset­ ben még arra sincsen lehetőségünk. Az ilyen kiszolgálókan rninden bizonnyal nem férünk hozzá a php. f�ezet A webszerver konfigurálása Ha már megfelelőnek találjuk a PHP konfigurálását. meg­ emelhetjük azt).3. és fordítsunk időt arra. hacsak nem használjuk az online konfigurációs eszközöket (és ne használjuk ezeket. egi -bin/. az alábbiakat kell beírnunk: • <Files - "\.x verzióknál. a ThreadsPerChild értéket kell ellenőrizni (az alapértelmezett érték. Az összes konfigurációs beállítást a httpd. 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 általában a httpd alaptelepítésének l conf alkönyvtárában helyezkedik el (ami nem más. rnint az Apache HTTP Server esetén. ha más is látna! Ha például az . inc fájlok megtekinthetőségét szeretnénk megakadályozni. 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 . így nem tudjuk a beállításokat a nekünk megfelelőre alakítani. Ne felejtsük el elolvasni a ki­ szolgáló online dokumentációjában (http://httpd. hogy a weboldalak ugyanarra a meghajtóra kerüljenek. A httpd. akik fizetős PHP/MySQL hosztolási szaigáitatás igénybevételével futtatják webes alkalmazásaikat. Szerencsére az ilyen szolgáltatásokat nyújtó cégek is versenyképesek szeremének marad­ ni. . 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. rnint a /usr l local/apache/ conf vagy a C: \Program Files\Apache Software Foundation\Apache 2. és 7 55 jogosultsággal rendelkezik.ini fájlhoz. hogy a gyökérkönyvtáron kivül könyvtárakat hozzunk létre. confUser és Group beállirásai szabályozzák. nem lesz szükségünk. Az Apache 2. arniket nem szeretnénk.org/docs-project) a vonatkozó biztonsági részeket! Ezen túlmenően tegyük a következőket: Ellenőrizzük. 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. amely a gyökérkönyvtárunk gyakori nevű alkönyvtáraiban (például Scripts/. mi most a két legnépszerűbb. hogy a szerver úgy legyen beállítva. Apache HTTP Server A httpd szerver alapértelmezett telepítése elfogadhatóan biztonságos.azokra gondolunk itt. amelyre. az 50 általában elfogadható). b in/ stb. Kerüljük a gyakori nevek használatár! Rengeteg automatizált program létezik. 2\conf) . könnyen lehet. 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. 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. conf fájlba megfelelő direktívákat belevéve rejtsük el a fájlokat.x verzióinak felhasználói esetében olyan ésszerű számot érdemes a MaxClients értékének adni. mie­ lőtt élesben üzembe helyeznénk a kiszolgálót.258 16. 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. Telepítéskor jelentős mennyiségű tartalom kerül az \inetpub könyvtárba.apache.

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

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

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

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

fejezetben alaposabban megvizsgáljuk a felhasználék azonosítását lehetövé tevő hitelesítést. addig. ám a könyörtelen valóság az. hogy valaki egyszerűen besétál az épületbe. Az ilyen eseményekre felkészülve. Fejlesztőcsapatunkat ebédszünetben elüti egy busz. Az alábbiakkal segithetjük a katasztrófa-elhárírási terv létrehozását és . hogy ilyen dolgok előfordulnak. Egy naponta több millió dolláros bevételt elérő vállalat igen komolyan megérezné. 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). amit az ilyen nagyságrendű események okoznának abban az esetben. s:Ynos. akiknek valóban dolguk van velük. ha a gépeknek otthont adó épület leégne. nem vicc. Ez. kérdezzünk meg egy informatikai vezetőt. ha teljesen felkészületlenül érné őket. kihúzza a kiszolgálót a há­ lózatból. 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. akik egyszerűen eladás céljából próbálják meg eltulajdonítani az ilyen gépeket. a semmibe révedő tekintetet látni. 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. . 16 Hogyan tovább� A Hitelesítés megvalósítása PHP-vel és MySQL-lel című 17. köztük az oldal felhasználéit PHP és MySQL segítségével ellenőrző hitelesírést. de sokan nem szeremek szerencsédenségekről és támadásokról beszélni. 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. Vannak olyanok. vagy erős földrengésben elpusz­ tulna! Az informatikusok ijesztően magas aránya egyáltalán nem tudna válaszolni. Katasztrófa�elhárítási terv Ha szeretnénk teljesen üres. ha webes alkalmazásai nem len­ nének elérhetők több mint egy hétig. 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. Különböző módszereket ismerünk meg. hogy mi történne kiszolgálóikkal vagy inkább teljes adatközpontjukkal. és jelöljünk ki egy alkalmazottat. 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. Éppen ezért igen fontos. és mindannyian súlyosan megsérülnek (vagy meghalnak). majd hóna alá csapja.bár szerencsére viszonylag ritkán. A kataszttófa-elhárítási tervezés a szolgáltatás kritikus. Az üzleti szervezetek azonban jellernzően nem enged­ hetik meg maguknak a leállás t.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.végreh:ytását: Gondoskodjunk az összes adat napi biztonsági mentéséről fizikailag másik helyszínen. Mivel egy átlagos jellemzőkkel bíró kiszolgáló nem olcsó mulatság. és csak annak tegyük őket elérhetővé. és vígan kisétál vele. Különböző okok miatt. ha tényleg beüt a ménkű. 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.szükség esetén. hogy a webes alkalmazása­ inkat futtató kiszolgálókat biztonságos környezetben tartsuk. A vállalati központ leég. 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. mégis gyakran figyelmen kívül hagyott része. A terv elkészítése jellem­ zően olyan dokumentumok vagy folyamatok összeállításából áll. hogy minden kolléga ugyanabban a járműben (például autóban vagy repülőgépen) utazzon. a szervergépek ellopására nem csak az ipari kémkedés és az adatlopás lehet a motiváció. Egy külső támadónak vagy egy elégededen alkalmazottnak sikerül webes alkalmazásaink összes adatát megsemmisíte­ me. így adatközpontunk teljes meg­ semmisülése esetén is megmaradnak adataink! Legyen kézzel írott.

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

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

érdemes inkább adatbázist használni.1 példakód egyszerű hitelesítési mechanizmust valósít meg. A felhasználói nevek és jelszavak adatbázisban tárolása nem teszi érzékelhetően bonyolultabbá a kódot.1 példakód: ti t kos. else hogy örül.</p> <form method="post" action="titkos. akkor egyszerű fájl helyett adatbázist kell használni. ?> A 17. amely lehetövé teszi.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. Ökölszabályként elmondható. Jelszavak tárolása Számtalan alkalmasabb hely kínálkozik a felhasználói nevek és jelszavak tárolására. hogy ha száznál több elemből álló listát akarunk tárolni és abban keresni. 17. illetve a felhasználói jelszavak módosítását lehetövé tevő kódot.1 példakódban Járható. Amennyiben az adatokat a kódban vagy egy másik adatfájlban tároljuk. hogy csak az arra jogosult felhasznáJók tekintsék meg az adott oldalt. sokkal könnyebben írhatunk programot a fel­ hasznáJók létrehozására és eltávolítására. mint egyszerűen a kód belsejébe írni őket. 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']. $jelszo = $ POST['jelszo'].1. ll a látogató név/jelszó párosa nem megfelelő echo "<hl>Kérjük. amely a kiszolgálón fut. illetve a jelszavak megváltoztatására. A 17. de mások is írhatják vagy módosírhatják. Ha így teszünk. de nem célszerű saját magát módo­ sító kódot írni. végeredményben olyan kódot helyezünk kiszolgálónkra. Egyrészt a kódon belül nem egyszerűen módosírhatók az adatok. Ha nagyobb mennyiségü adatot kívánunk fájlban tárolni és abban keresni. 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. távozzon!</hl> <p>Nem jogosult megtekinteni ezeket az információkat.2 és 17. jelentkezzen be!</hl> <p>Az oldal titkos. Technikailag lehetséges. 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. viszont a felhasz­ náJók sokkal gyorsabb hitelesítését teszi lehetövé. hogy láthatja ezt a titkos oldalt!</p>". Ha az adatokat másik fájlban tároljuk a szerveren.</p>". Ebben az esetben egyszerűen megírhatjuk az új felhasználókat hozzáadó.3 ábrán Járható funkcionalitást megvalósító kód a 17. if ((1isset($nev)) l l (!isset($jelszo))) //A látogatónak meg kell adni nevét és jelszavát ?> <hl>Kérjük. 17. 17 .2 példakódban az oldal látogatóit adatbázis segítségével hitelesítő kódot láthatunk.Hitelesítés megvalósítása PHP-vel és MySQL-lel 267 A 17. a meglévő felhasználókat törlő.

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

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

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

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

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

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

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

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

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

vizsgáljuk meg. Az include ( ) és a require ( ) urasírással más PHP és HTML fájlokat is beilleszchet. A PHP kód olvashaqa és lemezre írhatja az adatokat.. Soha senki nem tud olyan rendszere létrehozni. Ezzel megteremthetjük az oldalunk és a felhasznáJók közöcci. 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. amelybe nem lehet behatolni. A webes alkalmazás és a felhasználó közörti összes tranzakció azzal indul. A biztonság alatt azt érqük. Ha szetetnénk hatékony erőfeszítéseket tenni a biztonság érdekében. feldolgozó elemekből épül fel..1 ábra: Egy tipikus webes alkalmazás jellemzően az alábbi tároló. a kiszolgáló az oldal feldolgozását a PHP motorra bízza.. Ha az oldal PHP kódban található. hogyan áramlik az információ rendsze­ rünk különböző részei között. é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 MySQL motor felelős a saját adatainak olvasásáért és lemezre írásáért. hogy kezeljük biztonságosan a felhasználói adatokar bevicelük. Az SQL lekérdezéseket elküldi a MySQL démonnak. 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.1 ábra PHP és MySQL használatával megírt. 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ó. tipikus alkalmazás esetén mutatja a felhasz­ nálói információ útját.. és fogadja az arról érkező válaszokat. hogy a felhasználó böngészője az interneten keresztül kérést intéz a kiszolgálóhoz. celjes egészében biztonságos tranzakció lehecőségét. A 18.18 Biztonságos tranzakciók végrehajtása PHP vel és MySQL . Rendszerünk kialakításácól. -� Felhasználó Webszerver MySQL motor Tárolt oldalak Adatfájlok MySQL adatok � 18. A fejezet során megtudhag uk. továbbításuk és tárolásuk során. Iel .

Fejlesztőként igen hasznos lehet számunkra ez az eszköz. A tárolni kívánt adatok többségének webszerverünkön vagy adatbázisunkban a helye. Annak ellenére. nem lehetünk biztosak abban. hogy egyes felhasznáJók kikapcsolják a szerintük biztonsági vagy adatvédelmi kockázatokkal járó funkciókat. az internet tulajdonságaira is nagyon csekély a ráhatásunk. A megőrizni szükséges adatokat tárolhatjuk saját gépeinken fájlként vagy adatbázisrekordként. hogy rend­ szerünk tervezése során figyelmen kívül hagyhatjuk ezeket a tulajdonságokat. A rendszerünkön kívül elhelyezkedő információnál nincsen ráhatásunk annak biztonságos tárolására. kivéve. mint például az adatérvényesítés. ám nekünk a biztonsági és a funkcionális kérdésekkel is foglalkoznunk kell. internetkávézóban található. 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. biztonsági szempontból jobban járunk szerveroldali programozás­ sal. ám ez nem azt jelenti. Ne feledjük. 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. Ugyan a felhasznáJók gépeinek beállításait nem tudjuk sem módosítani. Vagy médegeijük egy kevésbé funkciógazdag kezelőfelület kiala­ kítását. a sütiket vagy aJavaScriptet. Ha csak a két legnépszerűbb böngésző legfrissebb verzióira gondolunk. Előfordulhat. 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). Ha alkalmazásunk épít ezekre a funkciókra. 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). 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. ha oldalunk szövegében garantáljuk a felhasználóknak a biztonságot. Gondolnunk kell arra is. Semmilyen ráhatásunk nincsen az olyan tényezőkre. Az SSL automatikusan egyeztet kiszolgá­ lónk és a felhasználó böngészője között. amellyel az ilyen óvatos emberek is használni tudják oldal unkat. Ha kizárólagJavaScriptben ellenőrizzük az adatokat. 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.278 18. A nagyon alapvetőJavaScript kódon túl bármit használunk. hogy a felhasználó gépe és az internet felett igen kevés befolyással bírunk. hogy a felhasználó nem törli ki. Az olyan feladatoknál. ugyanakkor rosszindulatúan is használható. mivel forráskódunk ebben az esetben nem lesz látható a felhasznáJók számára. 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. sem szabályozni. de nyilvánvaló. fejezetben foglalkozunk majd. A felhasznáJók gépei közőrt lehetséges komoly különbségek befolyásolhatják. hogy a felhasználó gépén miétt csak a lehető legkevesebb adatot szabad tárolni. iskolában. hogy a mindkettő által kezelni képes legmagasabb szintű biztonság mellett kommuni­ káljanak egymással. 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. mivel a kód eredménye egyszerűen egy HTML oldal. Webfejlesztőként mindazonáltal nem szükséges túlzottan aggódni e kérdés miatt. illetve nem tudjuk megakadályozni. akkor mindenképpen teszteljük. és a legtöbb felhasználó számára ma mát a 128 bites változatok is elérhetők. hogy a gép esetleg egyáltalán nem biztonságos. figyelembe kell vennünk eze­ ket a kérdéseket. és mindegyik kissé eltérő funkciókat és jellemzőket kínál. A PHP-ben megteremtett funkciók minden felhasználó böngészőjével kompatibilisek lehemek. illetve a felhasznáJók gépén sütiként. Számos jó oka van annak. 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. Többféle böngésző létezik. Nem lehetünk biztosak benne. fejezetben foglalkozunk majd. . hogy mindenki frissítette böngészőjét. nem biztos. hogy miként működik az ezeket nem engedélyező felhasználóknál. hogy rendszerünk kijátszására irányuló próbálkozása során a felhasználó ne módosítsa azt. mint például a gép biztonsági beállításai. 18 Az internet Nem csak a felhasznáJók gépeire. hogy az oldalunkhoz az általunk kivánt felületen keresztül kapcsolódó böngészővel foglalko­ zunk. vagy lehet könyvtárban. 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. a felhasznáJók megtekinthetik és esetleg kijátszhatják a kódot. megosztott terminál is. például aJavát.

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

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

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

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

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

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

sign és save­ ismerteti. majd futtassuk az alábbi parancsot: gpg teszt.asc nevű fájl.asc Ha az alapértelmezettől eltérő nevű fájlba szeretnénk helyezni a szöveget.jelen esetben a teszt. titkosított üzenetet látunk: -----BEGIN PGP MESSAGE----Version: GnuPG vl. Ennek a kulcsnak egyetlen célja. A szöveg képernyőre íratásához a -d kapcsolót kell használnunk: gpg -d teszt. Nyilvánvaló: az olvasó kulcsának nem 'Luke Welling <luke@tangledweb. majdnem teljesen megvagyunk. 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. hanem a létrehozásánál megadott név. A sign begépelésével alá­ írjuk a nobody felhasználó privát kulcsát használó nyilvános kulcsot. com. 18 .txt. Ha megnyitjuk ezt. 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. használatra kész.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.com.au>' --encrypt teszt. ahol előállítottuk a kulcsot.2 példakód a GPG-t PHP-vel meghívva teszi lehetövé titkosított e-mailek küldését. az alábbi paranccsal szerkesztenünk kell a kulcs rulaj­ donságait: gpg --edit-key 'Luke Welling <luke@tangledweb. hogy teljes mértékben megbízunk kulcsunkban. A trust-ot begépelve közöljük a GPG-vel. hogy a PHP kódjainkat futtató felhasználó parancssorban tuclja használni. A teszteléshez hozzunk létre némi szöveget tartalmazó fájlt. txtfájlba fog íródni. egyeztessünk a rendszergazdával.asc A szöveg a korábbival megegyező nevű. nem biztonságos memória használatára utaló figyelmeztetést kell kapnunk: gpg: Warning: using insecure memory! és létrejön a teszt. megjegyzés és e-mail cím kombinációja. Amennyiben a GPG úgy van beállítva.trust. továbbítsuk ezt a fájlt arra a rendszere.3 Comment: (GNU/Linux) For info see http://www. amely az elérhető parancsokat.0.gnupg.asc Láthatjuk. 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.com.1és a 18.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. 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. Ha ez nem lehetséges. hogy megbízhassunk a korábban Icinyert nyilvános kulcsban. illetve a kimeneti állo­ mányt a következőképpen meghatározva tehetjük ezt meg: gpg -do teszt.txt Az alábbi.txt teszt.txt.au>' A fenti sorban az egyszeres idézőjelek közötti szöveg a kulcs neve. hogy először a kimeneti fájlt kell megneveznünk. az alábbihoz hasonló. A prograrnon belüli lehetőségek között megtaláljuk a help-et is. a -o kapcsolót használva.out teszt.txt.au>' lesz a neve. vagy tanulmányozzuk a GPG dokumentációját! A 18.txt. mi is létrehozhatjuk számára a csak aláíró kul­ csot.

$uzenet = $ POST['uzenet'].asc'.</p>'. $bemeno fajl.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.286 18. ll Közöljük a gpg-vel. Üzenetét bárki más is elolvashatja.fgezet 18. 'pgp').'. ?> <form method="post" action="titkos_mail kuldese. $targy = $ POST['targy']. . 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. 18 //egyedi fájlnév létrehozása $bemeno fajl $kimeno_fajk tempnam(''. hol találja a kulcstartót ll Ezen a rendszeren a nobody felhasználó alapértelmezett könyvtára a /tmp/ putenv('GNUPGHOME=/tmp/.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'].1 példakód: titkos_ mail. $címzett = 'luke@localhost'.gnupg').2 példakód: titkos_mail_kuldese . 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. ll és SSL-hez a 443-ast használjuk.

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

Ha foglalkoztat bennünker kódunk biztonsága. Saját használati körülményeinknek megfelelően kell módosítanunk. Ezt követően a kiszolgáló SMTP-n keresztül elküldi a címzett levelezöszerverének. A címzett. fejezet Ez a parancs $parancs = "/usr/local/bin/gpg --recipient -a \\ 'Luke Weiling <luke@tangledweb. akkor butaság azt első körben titkosírás nélkül továbbítani. hogy a felhasz­ náló nem titkosírorr leveleit rövid ideig tároljuk a kiszolgálón. Az ábrán minden nyíl az egyik gépről a másikra küldörr üzenetet jelképezi. 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. hogy az általuk megadorr információ biztonságos módon megy el. Ha befejeztük munkánkar az ideiglenes fájlokkal. a GPG meghívásához használandó parancsot és paramétereket állítja be. mert ha az űrlapot biz­ tonságos kapcsolaton keresztül küldjük el. l 2 Feladó böngészője Webszerver Címzett levelezöszervere 3 Címzett levelezőkliense 18. Ha a továbbírani kivánt információ elég fontos ahhoz.5 ábrához hasonló lesz. A webszerveren az üzenet a címzett nyilvános kulcsával lesz titkosírva.5 ábrán az l-es. de ha másik szerveren vagy másik könyvtárban használjuk a kódot. hogy a második és harmadik körben titkosírva küldjük azt. A hibaüzenet megjelenírése helyerr máshogyan is kezelhegük az ilyen helyzetet. minden esetben módosítani kell. a titkos kulcs nélkül senki nem rudja visszafejteni. akkor a hibának nincsen jelentősége. hogy a rendszerünkön belüli összes információmozgást figyelembe vegyük. P éldául SSL kapcsolaton keresztül átirá­ nyíthaguk a felhasználót ugyanahhoz az URL-hez. Az SSL kapcsolat a 443-as porton keresztül jön. melyik kulccsal titkosítsa az üzenetet. parancs futtaga a $parancs változóban tárolt utasításokat.közölhetjük a felhasználóval. Ez azt jelenti. Ezért ez a kód SSL-es kiszolgálón használandó.php"> Ha így beírjuk kódunkba a teljes URL-t.288 18. A GPG ritkosírja levelünket. Amikor például parancssorban használjuk. Az l-es szakaszban azonban a feladó által az űrlapba bevitt szövegként továbbíródik az üzenet. figyelmeztetést kapunk. Nem feltétlenül szükséges foglalkoznunk a visszarérési értékkel. Így nem kell a HTML forráskódban az űrlap action rulajdonságát kibogarászniuk ahhoz. hogy a látogatók adatai SSL használatával lesznek el­ küldve. a fájl akár a szerve­ ren is ragadhat.Itt titkos kulcsával visszafejti a levelet. A lényeg az. Az űrlap műveleteként (action) megadhatnánk egyszerűen a teljes URL-t is.php"> Módosíthatjuk úgy.és egy if utasítás segítségével . Ha SSL nélkül próbálunk meg kapcsolódni a kódhoz. A system($parancs. $eredmeny). A böngészőjük állapotsorán megjelenő kis lakat ikon megerősíti az emberekben azt a hitet. közölnünk kell a GPG-vel. hogy nyugodtak lehessen adataik biztonsága felől. 18 Noha sem most. hogy az adatokat akkor is SSL-en keresztül küldjük. az unlink () függvénnyel rörölhegük őket. . Minden más kapcsolat hibát eredmé­ nyez. ha a felhasználó SSL nélkül csatlakozott: <form method="post" action="https://webserver/titkos_mail_kuldese. Ha a kiszolgáló a kód futtatása közben leáll. hogy nem foglalkozunk vele. hogy a felhasználó által az űrlapba bevitt adatokat biztonságosan küldjük el.5 ábra: A titkosított levelezőalkalmazásban az üzenetet háromszor továbbíljuk az interneten. A 2-es és 3-as szakaszban az üzenet GPG-vel titkosírva továbbítódik. sem más hasonló helyzetben nem feltétlenül fontos. ha valami balul sül el. Elküldésekor az üzenet az interneten közlekedik.csatlakozik levelezöszer­ veréhez. az információ útja a 18. 2-es és 3-as nyíl jelöli az adarrovábbítást.például POP vagyIMAP protokollon keresztül. és az $eredmeny változóban tárolja el a visszatérési értéket. A $_SERVER [ 'SERVER_ PORT' l értékét ellenőrizve győzödhetünk meg erről.au>' \\ --encrypt -o $kimeno_fajl $bemeno_fajl".com. fontos. hogy az üres űrlapot SSL-en keresztül küldjük a fel­ használónak. mégis érdemes ezt a megoldást választani. A 18. és számos köztes hálózaton és gépen haladhat keresztül. de segítségével . majd levelezőkliensével letölti az üzenetet. A nyílt űrlap címkéje jelenleg a követke