Matt Zandstra

PHP4 használatát

a

A kiadvány a következõ angol eredeti alapján készült: Matt Zandstra: Teach Yourself PHP4 in 24 Hours Copyright © 2000 by Sams Publishing. All rights reserved. No part of this book, including interior desing, cover design, and icons, may be reproduced or transmitted in any form, by any means (electronic, photocopying, recording, or otherwise) without the prior written permission of the publisher. Acquisitions Editor: Jeff Schultz Project Editor: Paul Schneider Development Editor: Scott D. Meyers Copy Editor: Geneil Breeze Managing Editor: Charlotte Clapp Trademarked names appear throughout this book. Rather than list the names and entities that own the trademarks or insert a trademark symbol with each mention of the trademarked name, the publisher states that it is using the names for editorial purposes only and to the benefit of the trademark owner, with no intention of infringing upon that trademark. A szerzõk és a kiadó a lehetõ legnagyobb körültekintéssel járt el e kiadvány elkészítésekor. Sem a szerzõ, sem a kiadó nem vállal semminemû felelõsséget vagy garanciát a könyv tartalmával, teljességével kapcsolatban. Sem a szerzõ, sem a kiadó nem vonható felelõsségre bármilyen baleset vagy káresemény miatt, mely közvetve vagy közvetlenül kapcsolatba hozható e kiadvánnyal. Fordítás és magyar változat © 2001 Szy György, Kiskapu Kft. Minden jog fenntartva! Translation and Hungarian edition © 2001 György Szy, Kiskapu Kft. All rights reserved! Sorozatszerkesztõ: Szy György Nyelvi lektor: Rézmûves László Szakmai lektor: Hojtsy Gábor Mûszaki szerkesztõ: Csutak Hoffmann Levente

Felelõs kiadó a Kiskapu Kft. ügyvezetõ igazgatója © 2001 Kiskapu Kft. 1081 Budapest Népszínház u. 29. Tel: (+36-1) 477-0443 Fax: (+36-1) 303-1619 http://www.kiskapu.hu/ e-mail: kiskapu@kiskapu.hu ISBN: 963 9301 30 2 Készült a debreceni Kinizsi nyomdában Felelõs vezetõ: Bördõs János

Apámnak, akinek ez a könyv biztosan tetszett volna...

A szerzõrõl
Matt Zandstra (matt@corrosive.co.uk) a Corrosive Web Design céget vezeti (http://www.corrosive.co.uk/) üzleti partnerével, Max Guglielminóval. Mint a parancsnyelvekért rajongó programozó, PHP, Java, JavaScript, Perl, Lingo és AppleScript nyelveken fejlesztett különbözõ programokat. Elõször bölcsészdiplomát szerzett, majd úgy tanulta ki mesterségét, hogy „újra feltalálta a kereket” és kielemezte, miért nem halad egyenesen. HTML, JavaScript, Perl és PHP tanfolyamokon oktatott, majd szerzõként közremûködött a Dynamic HTML Unleashed címû könyvben. Amikor nem kódot ír, Matt elkötelezett városi biciklista, Guinness-ivó, megszállott olvasó és novellista, aki kiadhatatlan történeteket alkot. Azt állítja, egyszer talán még regényt is fog írni.

Köszönetnyilvánítás
A nyílt forráskódú programoknak köszönhetem karrieremet és e könyv létrejöttét is. Szeretném megköszönni mindazoknak, akiknek önzetlen segítõkészsége mindig felülmúlja a kapott elismerést. Különösen köszönöm a PHP közösségnek, legfõképpen a PHP levelezõlisták résztvevõinek, akik leveleikkel feltárták a buktatókat, programozási módszereket ajánlottak és mindig ámulatba ejtettek. A Macmillantõl szeretném megköszönni Randi Rogernek, hogy engem ajánlott e könyv szerzõjéül, valamint Jeff Schultznak, Paul Schneidernek és Scott Meyersnek, támogatásukért és megértésükért, ahogy a határidõ közeledett és kitört a pánik. Köszönet illet mindenkit a Corrosive-nél, hogy eltûrték folyamatos hiányzásomat és nagyfokú határozatlanságomat a nem PHP-vel kapcsolatos kérdésekben. Legfõképpen üzlettársamnak, Massimo Guglieminónak vagyok hálás, hogy mûködtette a Corrosive céget a megterhelõ körülmények között. Köszönet Dave Urmsonnak is, aki átvette a formázást, amikor a munka megkívánta. A Corrosive további munkatársai: Anisa Swaffield, Jeff Coburn, Mai Chokelumlerd és Moira Govern. Meg kell köszönnöm a Small Planetnek (http://www.smallpla.net/), hogy további fejlesztési teret adtak nekem és engedélyezték a bétaprogramok kipróbálását. Kifejezetten hálás vagyok Mohamed Abbának és Clive Hillsnek, hogy oly sokszor újrafordították a PHP-t a Small Planet kiszolgálón. Az oktatási anyagok kipróbálásának egyik legjobb módja a tanfolyamon való felhasználás. Köszönet tanulóimnak, akik kegyesen beleegyeztek, hogy kísérleti nyulak legyenek. Köszönöm kedvesemnek, Louise-nek, és lányunknak, Hollynak, hogy jelen voltak és elviselték a könyv írása alatt kialakult zsörtölõdõ, visszahúzódó és megszállott jellememet. Amint magánéletem a PHP után második helyre került, menedékemmé a törzshelyem vált, ahol összekapcsoltam a sörözést a munkával. Köszönet Alannek és Dorának a kifogástalan Prince Arthur ivó fenntartásáért. Végül köszönet a halaknak, akik mindig felvidítanak, ha bámulom õket.

Áttekintés
Bevezetõ

I. rész Az elsõ lépések
1. óra PHP: személyes honlaptól a portálig . . . . . . . . 3 2. óra A PHP telepítése . . . . . . . . . . . . . . . . . . . . . . 11 3. óra Elsõ PHP oldalunk . . . . . . . . . . . . . . . . . . . . . 23

II. rész A PHP nyelv
4. 5. 6. 7. 8. óra óra óra óra óra Az alkotóelemek . . . . . . . . . . . . . . . . . . . . . . 35 Vezérlési szerkezetek . . . . . . . . . . . . . . . . . . 57 Függvények . . . . . . . . . . . . . . . . . . . . . . . . . 75 Tömbök . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 Objektumok . . . . . . . . . . . . . . . . . . . . . . . . 119

III. rész Munka a PHP-vel
9. óra 10. óra 11. óra 12. óra 13. óra 14. óra 15. óra 16. óra 17. óra 18. óra 19. óra Ûrlapok . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 Fájlok használata . . . . . . . . . . . . . . . . . . . . . 171 A DBM függvények használata . . . . . . . . . . 193 Adatbázisok kezelése – MySQL . . . . . . . . . . 211 Kapcsolat a külvilággal . . . . . . . . . . . . . . . . 237 Dinamikus képek kezelése . . . . . . . . . . . . . 259 Dátumok kezelése . . . . . . . . . . . . . . . . . . . . 283 Az adatok kezelése . . . . . . . . . . . . . . . . . . . 301 Karakterláncok kezelése . . . . . . . . . . . . . . . 319 A szabályos kifejezések használata . . . . . . . 339 Állapotok tárolása sütikkel és GET típusú lekérdezésekkel . . . . . . . . . . 361 20. óra Állapotok tárolása munkamenet-függvényekkel . . . . . . . . . . . . 381 21. óra Munka kiszolgálói környezetben . . . . . . . . . 395 22. óra Hibakeresés . . . . . . . . . . . . . . . . . . . . . . . . 409

IV. rész Összefoglaló példa
23. óra Teljes példa (elsõ rész) . . . . . . . . . . . . . . . . 429 24. óra Teljes példa (második rész) . . . . . . . . . . . . . 469 A függellék Válaszok a kvízkérdésekre . . . . . . . . . . . 489 Tárgymutató

Tartalomjegyzék

Bevezetõ

I. rész Az elsõ lépések
1. óra PHP: személyes honlaptól a portálig . . . . . 3
Mi a PHP? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 A PHP fejlõdése . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 A PHP 4 újdonságai . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 A Zend Engine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 Miért a PHP? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 A fejlesztés sebessége . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 A PHP nyílt forráskódú . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 Teljesítmény . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 Hordozhatóság . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 Összefoglalás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 Kérdések és válaszok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 Mûhely . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 Kvíz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 Feladatok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

2. óra A PHP telepítése . . . . . . . . . . . . . . . . . . . . 11

Operációs rendszerek, kiszolgálók, adatbázisok . . . . . . . . . . . . . . 12 A PHP beszerzése . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 A PHP 4 telepítése Apache webkiszolgálót használó Linuxra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 A configure néhány paramétere . . . . . . . . . . . . . . . . . . . . . . . . . . 14 --enable-track-vars . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 --with-gd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 --with-mysql . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 Az Apache beállítása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 php.ini . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

xiv short_open_tag . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 Hibajelentések beállításai . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 Változókra vonatkozó beállítások . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 Segítség! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 Összefoglalás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 Kérdések és válaszok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 Mûhely . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 Kvíz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 Feladatok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

3. óra Elsõ PHP oldalunk . . . . . . . . . . . . . . . . . . 23

Elsõ programunk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 PHP blokkok kezdése és befejezése . . . . . . . . . . . . . . . . . . . . . . . . . 26 A print() függvény . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 HTML és PHP kód egy oldalon . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 Megjegyzések a PHP kódokban . . . . . . . . . . . . . . . . . . . . . . . . . . 30 Összefoglalás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 Kérdések és válaszok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 Mûhely . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 Kvíz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 Feladatok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

II. rész A PHP nyelv
4. óra Az alkotóelemek . . . . . . . . . . . . . . . . . . . . 35
Változók . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 Dinamikus változók . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 Hivatkozások a változókra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 Adattípusok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 Típus módosítása a settype() segítségével . . . . . . . . . . . . . . . . . . . . . 43 Típus módosítása típusátalakítással . . . . . . . . . . . . . . . . . . . . . . . . . . 44 Mûveletjelek és kifejezések . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 Hozzárendelés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 Aritmetikai mûveletek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 Összefûzés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 További hozzárendelõ mûveletek . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 Összehasonlítás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 Bonyolultabb összehasonlító kifejezések létrehozása logikai mûveletek segítségével . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49

. . 71 Egymásba ágyazott ciklusok . . . . . . 52 Állandók . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 Állapot megõrzése a függvényhívások között a static kulcsszó segítségével . . . . . . . . . . . . . . . . . óra Vezérlési szerkezetek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 A mûveletek kiértékelési sorrendje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 Mit nevezünk függvénynek? . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 Feladatok . . . . . . . . . . . . . . . . . . . . . . . . . 86 Paraméterek további tulajdonságai . . . . . . . . . . . . . . . . . . . . . . . . . 60 A switch utasítás . . . . . . . . . . . . . . . . . . 82 Hozzáférés változókhoz a global kulcsszó segítségével . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 Függvények visszatérési értéke . . 65 A while ciklus . . . . . . . . . . . . . 73 Kérdések és válaszok . . . . . . . . . . óra Függvények . . . . . . . . 76 Függvények létrehozása . . . . . . . . . 53 Minden programban használható állandók . . . . . . 56 5. . . . . . . . . . . . . . . . . . 73 Mûhely . . . . . . . . . . 89 Paraméterek alapértelmezett értéke . . . . . . . . . . 72 Összegzés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 Ciklusok . . . . . . . . . . . . . . . . 74 Kvíz . . . . 57 Elágazások . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 A for ciklus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .xv Egész típusú változók értékének növelése és csökkentése . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 Az if utasítás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 Kérdések és válaszok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 Az if utasítás else ága . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 Következõ ismétlés azonnali elkezdése a continue utasítás segítségével . . . . . . . . . . . . . . . . . . . 80 Dinamikus függvényhívások . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 Összegzés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 A do. . . . . . . . . .while ciklus . . . . . . . . . . . . . . . . . . . . . . 59 Az if utasítás elseif ága . . . . . . . . . . 55 Mûhely . . . . . . . 55 Kvíz . . . . . . . . . . . . . . . . . . . . . 55 Feladatok . . . . . . . . . . 76 Függvények hívása . 81 Változók hatóköre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 Ciklus elhagyása a break utasítás segítségével . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 6. . . . .

. . . . . . . . . . . . 101 Asszociatív tömbök létrehozása és elérése közvetlen értékadással . . . . . . . . 110 Két tömb egyesítése az array_merge() függvény segítségével . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 Tömbök létrehozása . . . . . . . 99 Tömbök létrehozása az array() függvény segítségével . . . . . . . . . . . . . . . . . . . . . . . . . . 108 Mûveletek tömbökkel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 Tömbök elérése . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . óra Tömbök . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 Az elsõ elem eltávolítása az array_shift() függvény segítségével . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 Asszociatív tömb rendezése kulcs szerint a ksort() függvény segítségével . . . . . . . . . . . . . . . . . . . . . . . . . . 117 Kérdések és válaszok . . . . . . . . . . . . . . . . . 101 Többdimenziós tömbök . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 Tömbök rendezése . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 Tömb létrehozása vagy elem hozzáadása a tömbhöz szögletes zárójel segítségével . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 Feladatok . . . . . 104 Asszociatív tömb bejárása . . . . . . . . . . . . . . . . . . . . . . . . 104 Tömb méretének lekérdezése . . . . . . . . . . . . . . 117 Kvíz . . . 95 7. . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 Többdimenziós tömb bejárása . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 Asszociatív tömbök . . . . . . . . . . . . . . . . . . 116 Összegzés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 Feladatok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 Kvíz . . . . . . . . . . . . . . . . . . 104 Tömb bejárása . . . . . . 117 Mûhely . . . . 118 . . . . . . . . . 100 Asszociatív tömbök létrehozása az array() függvény segítségével . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 Mûhely . . . . . . . . . . . . . . . . . 97 Mit nevezünk tömbnek? . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 Egyszerre több elem hozzáadása egy tömbhöz az array_push() függvény segítségével . . . . . 114 Asszociatív tömb rendezése érték szerint az asort() függvény segítségével . . 112 Tömb részének kinyerése az array_slice() függvény segítségével . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 Összegzés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .xvi Hivatkozás típusú paraméterek . . . . . . . . . . . . . . . . . . . . . . 93 Kérdések és válaszok . . . . . . . . . . . . . . . . . . . . 113 Számmal indexelt tömb rendezése a sort() függvény segítségével . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144 Kvíz . . . . . . . . . . . . . . . . 152 Több elem kiválasztása a SELECT elemmel . . . . . . . . . . . . . . . .. . . . . . . . . 128 A kiir() tagfüggvény . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 . . . . . . . . . . . . . . . 121 Objektumtulajdonságok . . . . . . . . . . . . . . . . 127 Az ujSor() tagfüggvény . . . . . . . . . . . . . . . . 119 Mit nevezünk objektumnak? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138 A Tablazat és a HTMLTablazat osztályok a maguk teljességében . . . . . . . . . . . . . . . . . . . . . . . . . . .xvii 8. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 Objektum létrehozása . . . . . . . . . . . . . . . . . . 127 Az ujNevesSor() tagfüggvény . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138 A kiir() tagfüggvény . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 Összeáll a kép . . . . . . . . . . . 142 Összegzés . . . . . . . . . . . . . . . . . . . . 129 Ami még hiányzik. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 Kérdések és válaszok . . . . . . . . . . . . . . . . . . . . . . . . 122 Egy bonyolultabb példa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 Globális és környezeti változók . . . . . . . . . 150 Adatok bekérése a felhasználótól . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 Egy példa az öröklésre . . . . . . . . óra Ûrlapok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144 Feladatok . . . . . . . . . . . . . . . . . . . . . . . . 133 A szülõ tagfüggvényeinek felülírása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 Öröklés . . . . . . . . . . . . . . 134 A felülírt tagfüggvény meghívása . . . . . 145 III. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155 Különbségek a GET és a POST továbbítás között . . . . . . . . . . . . . . . . 144 Mûhely . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . 121 Az objektumok tagfüggvényei . . . . . . 126 A konstruktor . . . . . . . . . . . óra Objektumok . . . . 137 A konstruktor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 A cellaMargoAllit() tagfüggvény . . . . . . . . 153 Az ûrlap minden mezõjének hozzárendelése egy tömbhöz . . . . . . . rész Munka a PHP-vel 9. . . . . . . . . . . . . 139 Miért alkalmazzunk öröklést? . . . . . . . . . . . . . . . . . . . . . . . . . 126 Az osztály tulajdonságai . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 Miért használjunk osztályt? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 A HTMLTablazat saját tulajdonságai . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . 184 Fájlba írás és hozzáfûzés . 190 Feladatok . . . . . . . . . . . 187 Könyvtár törlése az rmdir() függvénnyel . . . . . . . . . . . . . . . . . . . . . . . . . . 190 Kvíz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 Több fájltulajdonságot egyszerre megadó függvény . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181 Sorok olvasása fájlból az fgets() és feof() függvényekkel . . 196 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . óra A DBM függvények használata . . . . . . . . . . . 175 Fájl létezésének ellenõrzése a file_exists() függvénnyel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176 Fájl állapotának lekérdezése . . . . . 179 Fájl megnyitása írásra. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 Fájlok beágyazása az include() függvénnyel . . . . . . . . . . . 169 Kérdések és válaszok . . . . . . . . . 170 10. . . . . . . . . . . . 188 Könyvtár megnyitása olvasásra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194 Adatok felvétele az adatbázisba . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190 Kérdések és válaszok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175 Fájl vagy könyvtár? . . . . . . . . . . . . . . . . . . . . . 188 Összegzés . . . . . . . . . . . . . . . . . 170 Feladatok . . . . . . . . . . . óra Fájlok használata . . . . . . . . . . . . . . 161 A felhasználó átirányítása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187 Könyvtár létrehozása az mkdir() függvénnyel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180 Olvasás fájlból . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 Fájl karakterenkénti olvasása az fgetc() függvénnyel . . . . . . . . . . . . . . . . . . . . . . . . . . . 190 Mûhely . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170 Kvíz . 186 Munka könyvtárakkal . . . . . . olvasásra. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .xviii PHP és HTML kód összekapcsolása egy oldalon . . . . . . . . . . . . . hozzáfûzésre . . . . . . . 181 Tetszõleges mennyiségû adat olvasása fájlból . . . . . . . . . . . . . . . . . . 163 Fájlfeltöltõ ûrlapok és programok . . . . . . . 177 Különféle fájlinformációk . . . . . . . . . . . . . 172 Fájlok vizsgálata . . . . . . 185 Fájlok zárolása az flock() függvénnyel . . . . . . . . . 159 Állapot mentése rejtett mezõkkel . . . . . . . . 191 11. 169 Mûhely . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 Adatok módosítása az adatbázisban . . . 193 DBM adatbázis megnyitása . . . . . . . . . . . . . . . . . . . . 178 Fájlok létrehozása és törlése . . 176 Fájl méretének lekérdezése a filesize() függvénnyel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 Összegzés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188 Könyvtár tartalmának olvasása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203 Összefoglalás . . . . . . . 233 Kérdések és válaszok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199 Egy példa . . . . . . . . . . . . . . 220 Adatok lekérdezése . . . . . . . . . . . . . . . . . . . . 241 A kérés . . . . . . . . . . . . . . . . . . . . . 229 Információk a mezõkrõl . . . . . . . . . . . . . . 230 Összefoglalás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241 A válasz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 Feladatok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245 . . . 235 13. . . . . . . . . 229 Az adatbázis szerkezete – összeáll a kép . . . . . . . . . . . . . . . . . . 227 Adatbázistáblák listázása . . 221 Az eredménytábla elérése . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221 Az eredménytábla sorainak száma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234 Feladatok . . . . . . . . . . . . . . . . . 213 Az adatbázis kiválasztása . . . . . . . . . . . .xix Adatok kiolvasása DBM adatbázisból . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238 A HTTP ügyfél-kiszolgáló kapcsolat rövid ismertetése . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234 Mûhely . . . . . . . . . . . . . . . . . . . . . . . 225 Információk az adatbázisokról . . . . . . . . . . . . . . . . . . . . 210 12. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234 Kvíz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227 Az elérhetõ adatbázisok kiíratása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237 Környezeti változók . . . . . . . . . . . . . . . . . . . . . óra Adatbázisok kezelése – MySQL . . . . . 211 (Nagyon) rövid bevezetés az SQL nyelvbe . . . . . . . 209 Kérdések és válaszok . . . . . . . . . . . . . 214 Hibakeresés . . . . . 199 Összetett adatszerkezetek tárolása DBM adatbázisban . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . óra Kapcsolat a külvilággal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 Kvíz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 Elemek meglétének lekérdezése . . . . 212 Csatlakozás a kiszolgálóhoz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243 Dokumentum letöltése távoli címrõl . . . . . . . . . . . . . . . . . . . . . 215 Adatok hozzáadása táblához . . . . . . . . 222 Adatok frissítése . . . . . . . . . . . . . . . . . . . . . . . . . . 216 Automatikusan növekvõ mezõ értékének lekérdezése . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 Mûhely . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199 Elem törlése az adatbázisból . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . .xx Átalakítás IP címek és gépnevek között . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286 Idõbélyeg készítése az mktime() függvénnyel . . . . . . . . 256 Kvíz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263 Körív rajzolása . . . . . . . . . . 280 Mûhely . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284 Az idõbélyeg átalakítása a getdate() függvénnyel . . . . . . . . . . . . . . . . . . 261 Alakzatok kitöltése . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246 Hálózati kapcsolat létesítése . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264 Téglalap rajzolása . . . . . . . . . . . . . . . . 269 Szövegírás az imageTTFtext() függvénnyel . . . . . . . . . . . . . . . . . . . . . . . . . . 290 A felhasználó által bevitt adatok ellenõrzése . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298 . . . 289 Egy példa . . . . . . . . . . . . . . . . . . . . . . . 280 Kérdések és válaszok . . . . . . . . . . . . . . . . . . . . . . . . . 271 az imageTTFbox() függvénnyel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247 NNTP kapcsolat létrehozása az fsockopen()-nel . . . . . . . . . . . . . . . . . . . . . . . . . . . 281 Feladatok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281 Kvíz . . . . . . . . . . . . . . 269 Szöveg kiterjedésének ellenõrzése . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283 A dátum kiderítése a time() függvénnyel . . . . . . . . . 257 14. . . . . . . . . . . . . . . . . . 288 A dátum ellenõrzése a checkdate() függvénnyel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256 Feladatok . . . . . . . . . . . . . . . . . . . . . . . 291 A naptár táblázatának létrehozása . . 275 Összefoglalás . . . . . . . . . . . . . . . . . . . . . . . 284 Az idõbélyeg átalakítása a date() függvénnyel . . . . . . 290 A HTML ûrlap létrehozása . . . . . . . óra Dinamikus képek kezelése . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294 Összefoglalás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . óra Dátumok kezelése . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271 A fenti elemek összegyúrása . . . . . . . . 254 Összefoglalás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255 Mûhely . . . . . . . . . . . . 268 Szövegek kezelése . . . . . . . . . . . . . 260 A szín beállítása . . . . . 259 Képek létrehozása és megjelenítése . 266 A színek átlátszóvá tétele . . . . . . 255 Kérdések és válaszok . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281 15. . . . 251 Levél küldése a mail() függvénnyel . . . . . . . . . . . . . . . . . . 261 Vonalak rajzolása . . . . . . . . . . . . . . . . . . . . . . . . 265 Sokszög rajzolása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318 Kvíz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306 Miért olyan fontosak az adattípusok? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301 Újra az adattípusokról . 320 A printf() és a típusparaméterek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302 Összetett adattípusok átalakítása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307 A változók meglétének és ürességének ellenõrzése . . . . . . . 325 A pontosság meghatározása . . . . . . . . . . . . . . . . . . . . . . . . . . . 326 Formázott karakterlánc tárolása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299 Kvíz . . 330 Részlánc elhelyezkedésének meghatározása az strpos() függvénnyel . . . . . . . 299 Feladatok . . . . . . 328 Részletesebben a karakterláncokról . . . . . . . . . . . . . . 302 Egy kis ismétlés . . . . . . . 310 Tömbök bejárása más megközelítésben . . . . 321 A kitöltõ paraméter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323 A mezõszélesség meghatározása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306 Az adattípus-váltás további módjai . . . . . . . . . . . . . . . . . . . . . . . . 304 Az adattípusok ellenõrzése . . . . . . . . . 312 Függvények alkalmazása a tömb összes elemére . 312 Tömbök egyéni rendezése . . 312 Elemek eltávolítása a tömbbõl . . . . . . . . . . . . . . . . . . . . . 329 Szövegek indexelése . . . . . . . . . . 329 Szövegrész megkeresése az strstr() függvénnyel . . . . . . . . . . . . . . . . . . . . . . . . . . . 318 17. . . . . . . . 319 Karakterláncok formázása . . . . . . . . . . .xxi Kérdések és válaszok . . . . . . . . . . . . . . . . . . . . . . . . . . . 329 Szöveg hosszának megállapítása az strlen() függvénnyel . . . . . . . . . . . . . 318 Feladatok . . . . . . . . . . . . . . . . . . . . . . . . . . . 326 Átalakító paraméterek (Ismétlés) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317 Mûhely . . . óra Az adatok kezelése . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303 Az adattípusok automatikus átalakítása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320 A printf() függvény használata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298 Mûhely . . . . . . óra Karakterláncok kezelése . . . . . . . . . . . . . . . . . . . . . . . 309 További tudnivalók a tömbökrõl . . . . . . . . . . . . . . . . . . . . . . . . 317 Kérdések és válaszok . . . . . . . . . . . 310 Elem keresése tömbben . 314 Összefoglalás . . 299 16. . . . . . . . . . . . . . . . . . . . . . . 330 . . . . . . . . . . . . . . .

. . . 350 a fordított perjeles karakterek . . . . . . . . . . 355 Összefoglalás . . . . . . . . . . . . . . . . . . . 345 A tagazonosítót keresõ példa újragondolása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351 Minták lecserélése a preg_replace() függvénnyel . . . . . . . 334 Az összes részlánc lecserélése az str_replace() függvénnyel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358 Kérdések és válaszok . . . . . . . . . 358 Mûhely . . . . . . . . . . . . . . . . . . . . . 336 Összefoglalás . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343 Az atomok kezelése . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334 Kis. . . 331 A karakterláncok kezelése . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333 Karakterlánc részének lecserélése a substr_replace() függvénnyel . . . . . . . . . . . . . . . . . . 331 Karakterlánc elemekre bontása az strtok() függvénnyel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358 . . . . . . 347 Visszautalás használata az ereg_replace() függvénnyel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347 Karakterláncok felbontása a split() függvénnyel . . . . . . . . . 348 Perl típusú szabályos kifejezések . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335 Karakterláncok tömbbé alakítása az explode() függvénnyel . . . .xxii Szövegrészlet kinyerése a substr() függvénnyel . . . . . . . . . . . . . . . . . . 340 Minta keresése karakterláncokban az ereg() függvénnyel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .és nagybetûk közti váltás . . . . . . . . . . . . . . . . . . 336 Kérdések és válaszok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350 Teljeskörû keresés a preg_match_all() függvénnyel . . . . . . . . . . . . . . . . 337 Kvíz . 359 Kvíz . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338 18. . . . . . . . . . . . . . . . . . . . . . . . . . . . 348 Minták keresése a preg_match() függvénnyel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345 A szabályos kifejezés helye . . . . . . . . . 337 Mûhely . . . . . . . . . . . . . 339 A POSIX szabályos kifejezések függvényei . . . . . . . . . óra A szabályos kifejezések használata . . . . . 346 Minták lecserélése karakterláncokban az ereg_replace() függvénnyel . . . . . . . . . 337 Feladatok . . . 333 Szöveg tisztogatása a trim() típusú függvényekkel . . . . . . . . . . . . . . . . . 349 A Perl típusú szabályos kifejezések és . . . . . . 349 A Perl típusú szabályos kifejezések és a mohóság . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359 Feladatok . . . . . . . . . . . . . . 354 Módosító paraméterek . . 359 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341 Karakterlánc keresése karakterosztályokkal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344 Elágazások . . . . . . . . . . . . . . . . . . . . . . . . . . 340 Egynél többször elõforduló karakter keresése mennyiségjelzõvel . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . 393 21. . . . 363 Süti törlése . . . . . . . . . . . . . . . . . . . 395 Folyamatok összekötése a popen() függvénnyel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393 Feladatok . . 391 Összefoglalás . . . . . . . . . . . . . . . . . . . . . . . . . 362 Sütik beállítása a PHP-vel . . . . . . . . . . . . . . . . . . . . . . . . . 382 Munkamenet-változók . . . . . . . . . . . . . . . . . . 365 Munkamenet-azonosító sütik . . . 375 Összefoglalás . . . . . . . . . . . . . . . . . . . . . . 399 Külsõ programok futtatása a system() függvénnyel vagy a ' mûveletjel segítségével . . . . . . . . . . . . . . . . . 393 Kvíz . . . . . . . . . . . . . . . . . . . . . 382 Munkamenet indítása a session_start() függvénnyel . . . . . . . . . . . . . . . . . 378 Mûhely . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366 Lekérdezõ karakterláncok használata . . . . . . . . . . . . . . . . . . . . . . . . . 374 Lekérdezõ karakterlánc készítése . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390 Munkamenet-változó bejegyzésének ellenõrzése . . . . . . . . . . . . . . . . . . . . . . . 378 Kérdések és válaszok . . . . 392 Kérdések és válaszok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361 Sütik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . óra Állapotok tárolása munkamenet-függvényekkel . . . . . . . . . . . . . . . . . . . 378 Feladatok . . . . . . . . . . . . . óra Munka kiszolgálói környezetben . . . . . . . . . . . . . . . . . . . . . . . . . . . 378 Kvíz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390 Munkamenet-változók kódolása és visszafejtése . . . . . . . . . . . . . . . . . . . . . . . . . 392 Mûhely . . . . . . 366 Példa: Webhelyhasználat nyomon követése . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .xxiii 19. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381 Mik azok a munkamenet-függvények? . . . . . . . . . . . . . . . . . . . . óra Állapotok tárolása sütikkel és GET típusú lekérdezésekkel . . . . . . . . . 384 A munkamenet és a változók bejegyzésének törlése . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401 Biztonsági rések megszüntetése az escapeshellcmd() függvény használatával . . . . . . . . . 362 A sütik felépítése . . . . . . . . . . . . . . . . . . . . . . . . . 379 20. . . . . . . . . . . . . . . . . . . . 389 Munkamenet-azonosítók a lekérdezõ karakterláncban . . . . . . . . . . . . . 401 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396 Parancsok végrehajtása az exec() függvénnyel . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . .php . . . . . . . . . . . . . . . . . . . . . 413 PHP hibaüzenetek . . . . . . . . . . . . . . . . . . . . . . . . . rész Összefoglaló példa 23. óra Teljes példa (elsõ rész) . . . . . . . . . . . . . . . . . . . . . . .xxiv Külsõ programok futtatása a passthru() függvénnyel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409 A phpinfo() . . . . . . . . . . . . 425 Feladatok . . 420 Kézi hibakeresés . . . . . . . . . . . . . . . . . . . . . . . . . . . 466 Kérdések és válaszok . . . . . 405 Összefoglalás . . .php . . . . . . . . . . . . . . . . . . . 410 A forráskód megjelenítése színkiemeléssel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404 Külsõ CGI program meghívása a virtual() függvénnyel . . . . . . . . . . . . . . . . . .php . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425 Mûhely . . . . . . . . . . . 430 Az adatbázis kialakítása . . . 433 A tagoknak szánt oldalak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429 A feladat rövid leírása . . . . . . . . . . . . . . . . 426 IV. . . . . . . . . . . . . . . . . . . . . . 407 Mûhely . . . 425 Kérdések és válaszok . . .php . . . . . . . . . . . 407 Feladatok . . 449 belepes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 430 Az oldalak felépítése . . . . . . . . . .php és adatbazis. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .php . . . . . . . . . . 466 . . . . . 433 csatlakozas. . . . . . . . . 408 22. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425 Kvíz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406 Kérdések és válaszok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434 klubfrissites. . 442 tagmenu. . . . . . . . . . 418 A hibaüzenet elfogása . . . . . . . . . . . . . . . . . 421 Gyakori hibák . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415 Hibaüzenetek kiírása naplófájlba . . . . . . . . . . . . . . . . .inc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423 Összefoglalás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407 Kvíz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453 esemenylista. . . . . . . . . . . . . . . . . . . . 462 Összefoglalás . . . . . . . . . . . . . . . . . . . . . 431 Tervezési döntésünk . óra Hibakeresés . . . . . . . . . . . . . . . . . . . . . . . . . . 450 esemenyfrissites. . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470 esemenyekinfo. . . . . . . . .php . . . .php . . . . . . . . . . . . . .php . . . . 467 Kvíz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . óra Teljes példa (második rész) . . . . . . . . . . . . . . . . . . . . 478 klubinfo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 489 Tárgymutató . 467 24. . . . . . . . . . . . . . . . . . . . . . . . . 486 Összefoglalás . . . . . . . . . 484 A jövõ . . . . . . .php . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487 Kérdések és válaszok . . . . . . . . . . . . . .xxv Mûhely . . . . 488 Feladatok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469 Az eseménynaptár nyilvános oldalai . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 488 Kvíz . . . . . . . . . . . . . . 467 Feladatok . . . . 488 Mûhely . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481 esemenyinfo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470 klubokinfo. . . . . . . . . . . . . . . . . . . 488 A függellék Válaszok a kvízkérdésekre. . . . . . . . . . . . . . . .

.

az ASP-hez és a Javához a dinamikus webes alkalmazások készítéséhez rendelkezésre álló nyelvek palettáján. a könyv példáit könnyen más adatbázisokhoz igazíthatjuk. akkor elegendõ tudással rendelkezünk. A könyv néhány példájában a MySQL ingyenes adatbázisrendszert használtuk. amely csatlakozott a Perl-höz. de ha komolyabban kívánjuk használni az adatbáziskezelõ szolgáltatásokat. A PHP 4 webes programozási nyelv. Ha kényelmesen létre tudunk hozni egyszerû HTML dokumentumokat táblázatokkal. ám meggondolandó egy HTML ismertetõ beszerzése. Semmilyen korábbi programozási tapasztalatra nincs szükség. Kiknek szól ez a könyv? A könyv az alapoktól indulva hasznos gyakorlati tudást ad a PHP 4-es programozási nyelv használatához. Ha nem rendelkezünk ilyen ismeretekkel. célszerû elmélyednünk néhány kapcsolódó anyagban. ezt a részt különös figyelemmel olvassuk! . Az Interneten számos bevezetõ szintû SQL ismertetõ érhetõ el. Ha még nincs programozási tapasztalatunk. mindazonáltal a könyvben található lépések elég információt adnak ahhoz. A kötet programozási ismeretekkel is foglalkozik. A rendelkezésre álló lapokon nem jut elég hely egy teljes PHP programozási útmutató közlésére vagy a PHP összes lehetõségének és eljárásának ismertetésére.Bevezetõ Ez a könyv egy nyílt forráskódú webes parancsnyelvrõl (szkriptrõl). • A második rész az alapvetõ szolgáltatásokat mutatja be. hogy használni kezdhessük a PHP-t. akár újak vagyunk a parancsnyelvek világában. Könyvünk szerkezete Kötetünk négy fõ részbõl áll: • Az elsõ rész bevezetõ a PHP alapjaihoz. akkor is hasznos lehet e könyv. Ha mégsem a MySQL adatbázisrendszerrel kívánunk dolgozni. Az SQL nyelvet röviden ismertetjük. de ha a C vagy a Perl nyelvekkel már dolgoztunk korábban. az egyes órákon könnyebb lesz haladni. Ahhoz. akár rendelkezünk programozói tapasztalttal. A PHP 4-esben az adatbázisok kezelése igen egyszerû. célszerû némi ismerettel rendelkezni a Világhálóval és a HTMLlel kapcsolatban. hogy a lehetõ legtöbb hasznát vegyük a könyvnek. a PHP-rõl szól.

Ebben az órában egy mûködõ példán keresztül vesszük górcsõ alá az objektumok használatát. mûveletjelek (operátorok) és kifejezések képezik. hogyan építhetünk PHP kódot HTML oldalainkba és hogyan készíthetünk a böngészõ számára kimenetet adó programot. felsorakoztatva a függvényeket és megoldásokat. • A hatodik óra „Függvények” címmel a függvények készítését és használatát tárgyalja. valamint azon fordítási és beállítási lehetõségekkel foglakozik. • A második óra „A PHP telepítése” címmel végigvezeti az olvasót a PHP telepítésén UNIX rendszeren. Az elsõ rész az elsõtõl a harmadik óráig tart és egy egyszerû parancsfájl futtatásáig vezeti el az olvasót: • Az elsõ óra „PHP: személyes honlaptól a portálig” címmel bemutatja a PHP történetét és képességeit. adattípusok. vagyis a felhasználótól érkezõ adatok feldolgozását vezeti be. • A tizedik óra „Fájlok használata” címmel bemutatja a fájlok és könyvtárak kezelésének lehetõségeit. • A harmadik óra „Elsõ PHP oldalunk” címmel bemutatja. • A negyedik rész egy teljesen önállóan mûködõ példaprogramot mutat be. • A hetedik óra „Tömbök” címmel a lista jellegû adatok tárolására használható tömb adattípussal foglalkozik. Az óra anyagát változók. Megtanuljuk. amelyek a környezet kialakítása szempontjából fontosak lehetnek. melyekre szükségünk van.és objektumtámogatását. • Az ötödik óra „Vezérlési szerkezetek” címmel a programok futását vezérlõ elemek utasításformájával (nyelvtanával) foglalkozik. miként érjük el a beérkezõ információkat. A harmadik részben a kilencediktõl a huszonkettedik óráig alaposan megismerjük a nyelv szolgáltatásait és megoldási módszereit: • A kilencedik óra „Ûrlapok” címmel a HTML ûrlapok használatát. . Az if és switch szerkezetek után megtanuljuk a for és while ciklusvezérlõ elemek használatát is. A második részben a negyediktõl a nyolcadik óráig megismerjük a PHP alapvetõ elemeit: • A negyedik óra „Az alkotóelemek” címmel a PHP alapjait mutatja be. valamint a tömbök használatához néhány PHP 4 függvényt is ismertetet. • A nyolcadik óra „Objektumok” címmel bemutatja a PHP 4 osztály. valamint a PHP tanulása mellett néhány érvet sorol fel. ha gyakorlott PHP programozók szeretnénk lenni.xxviii Tanuljuk meg a PHP4 használatát 24 óra alatt • A harmadik rész részletesebben ismerteti a PHP 4-es változatának lehetõségeit.

• A tizenkettedik óra „Adatbázisok kezelése – MySQL” címmel az SQL alapjait tárgyalja. • A tizenkilencedik óra „Állapotok tárolása sütikkel és GET típusú lekérdezésekkel” címmel a különbözõ programok és HTTP kérések közötti információátadás néhány módját mutatja be. • A tizenhatodik óra „Az adatok kezelése” címmel visszatér az adattípusokhoz és az addig nem említett. • A huszonnegyedik óra befejezésként a látogatók számára készült felület megvalósításához szükséges kódot tartalmazza. • A huszonegyedik óra „Munka kiszolgálói környezetben” címmel a külsõ programok futtatását és kimenetük felhasználásának lehetõségeit mutatja be.hu/konyvek/PHP4/ címen tehetik meg. de a hatékony használathoz elengedhetetlen további függvényeket mutatja be.kiskapu. • A tizenhetedik óra „Karakterláncok kezelése” címmel a karakterláncok kezeléséhez jól használható PHP függvényekkel foglalkozik. PNG és JPEG képek készítését lehetõvé tevõ függvényeket mutatja be. • A tizennyolcadik óra „A szabályos kifejezések használata” címmel bemutatja a bonyolultabb minták keresésére és cseréjére szolgáló szabályos kifejezéseket. ugyancsak ezen az oldalon található a hibajegyzék is. illetve a PHP hálózati függvényeit ismerteti. amely lehetõvé teszi a klubok programjainak böngészését. • A tizennegyedik óra „Dinamikus képek kezelése” címmel a GIF. A negyedik részben – a huszonharmadik és huszonnegyedik órákon – a könyvben tanult módszerek felhasználásával egy mûködõ példát készítünk. amely a legtöbb operációs rendszeren elérhetõ. Ebben az órában egy naptár példát is elkészítünk. valamint bemutatja a PHP 4 MySQL adatbázisok kezelésére szolgáló függvényeit. • A huszadik óra „Állapotok tárolása munkamenet-függvényekkel” címmel az elõzõ órában tanultakat a PHP 4-es beépített munkamenet-kezelõ függvényeivel bõvíti ki. Megírjuk a felhasználók bejegyzéséhez és a klubok programjának beviteléhez szükséges elemeket. • A tizenharmadik óra „Kapcsolat a külvilággal” címmel a HTTP kéréseket veszi szemügyre. xxix . • A huszonkettedik óra „Hibakeresés” címmel a kódok hibakeresésére ad ötleteket. A könyvel kapcsolatos észrevételeiket a http://www. A tömbökkel kapcsolatban is újabb függvényeket említünk. • A tizenötödik óra „Dátumok kezelése” címmel a dátummûveletekhez használatos függvényeket és eljárásokat ismerteti.Bevezetõ • A tizenegyedik óra „A DBM függvények használata” címmel a PHP DBMtámogatásával foglalkozik. valamint bemutat néhány szokásos hibát. • A huszonharmadik óra egy tervet mutat be helyi klubok számára készülõ programunkhoz.

.

óra Elsõ PHP oldalunk . óra PHP: személyes honlaptól a portálig 2. RÉSZ Az elsõ lépések 1.I. óra A PHP telepítése 3.

.

fõbb tulajdonságait és jövõjét. ÓRA PHP: személyes honlaptól a portálig Üdvözlet a PHP világában! Ebben a könyvben végigtekintjük a PHP nyelv majdnem minden elemét. Ebben az órában a következõket tanuljuk meg: • Mi a PHP? • Hogyan fejlõdött a nyelv? • Mik a PHP 4 újdonságai? • Hogyan tehetjük optimálissá a PHP-t? • Miért pont a PHP-t válasszuk? . Mielõtt azonban részletesebben megnéznénk. mire lehetünk képesek segítségével. tárjuk fel múltját.1.

3 millióra ugrott. A felhasználók szemszögébõl a PHP/FI nagyon hasznos segédeszköz volt. egy friss elem került a csomagba.4 millió kiszolgálón használták és októberre ez a szám 3. Késõbb a PHP képességei kibõvültek. azokat a kiszolgáló oldalán a PHP-értelmezõ dolgozza fel. A PHP kódok kimenete a megadott HTML elemekkel együtt kerül az ügyfélhez. Késõbb. kapcsolatot létesíthetnek távoli kiszolgálókkal – a lehetõségek száma végtelen. Az Apache. Az Apache-MySQL-PHP együttes egyszerûen verhetetlen. így népszerûsége töretlenül nõtt. Ezzel megközelítette a Microsoft IIS kiszolgálók számát. A MySQL igen hatékony. már egy csapat együttmûködésébõl született. valamint újabb elemeket és szabályokat adott a nyelvhez.és MySQL-támogatás megerõsítette a PHP pozícióját. Születésekor csupán egy makrókészlet volt. ráadásul ingyenes SQL adatbázisrendszer.com/) felmérései szerint a PHP-t 2000 februárjában 1. A kódok végezhetnek adatbázis-lekérdezéseket. A PHP fejlõdése A PHP elsõ változatát – amely néhány webalkalmazás-készítést segítõ makrót tartalmazott – Rasmus Lerdorf készítette 1994-ben. Ez a változat megalapozottá tette a PHP helyét a legjobb kiszolgálóoldali nyelvek között. Az E-Soft szerint a PHP a legnépszerûbb Apache modul. Az Apache jelenleg a legnépszerûbb kiszolgáló a világon és a PHP 3-as már modulként illeszthetõ hozzá. így egy önállóan használható programozási nyelv alakult ki. A következõ kiadás. fájlokat olvashatnak és írhatnak. ami 3. óra Mi a PHP? A PHP nyelv túlnõtt eredeti jelentõségén.netcraft. dinamikusan létrehozhatnak képeket. Innen ered neve is: Personal Home Page Tools. Ezen eszközöket együttesen a Personal Home Page Tools névvel azonosították. A hagyományos HTML lapokkal ellentétben azonban a kiszolgáló a PHP parancsokat nem küldi el az ügyfélnek. amelyhez a PHP átfogó támogatást nyújt. a PHP 3-as.4 1. így felhasználói tábora rendkívüli mértékben nõtt. Ehhez a változathoz Zeev Zuraski és Andi Gutmans újjáalkotta a teljes feldolgozóegységet. így PHP/FI néven vált ismertebbé. amit jellemzõen HTML oldalakon használnak. A NetCraft elemzõ cég (http://www. a Form Interpreter (Ûrlapfeldolgozó). amely személyes honlapok karbantartására készült. a kód újraírása után. . a ModPerlt is maga mögé utasítva. Tulajdonképpen kiszolgálóoldali programozási nyelv. Több fejlesztõ is felfigyelt rá. amely képes nagyméretû webes adatbázis-alapú alkalmazások mûködtetésére is.8 millió. A PHP nyelv népszerûsége képességeinek bõvülésével folyamatosan nõtt. A PHP jelenleg hivatalosan a PHP: Hypertext Preprocessor elnevezést használja. de a PHP kódok lefutnak. így 1997-re már számos programozó dolgozott rajta. A programjainkban lévõ HTML elemek érintetlenül maradnak.

beleértve a mobiltelefonokat. hogy akár egy nagyobb webhelyet is több száz. Ezen a téren is jelentõs fejlesztés történt. Az adatok egy központból több környezetbe is érkezhetnek. digitális televíziókat és szélessávú internetes rendszereket is. . A PHP számos adatbázis-alkalmazással és webkiszolgálóval képes együttmûködni. amelyek megkönnyítik a tömbökkel végzett mûveleteket. Ez a szolgáltatás a többdimenziós tömbök támogatásával bõvült. Egyre gyakoribb adatbázisok használata a tartalom tárolására és az információk visszakeresésére különbözõ felületeken. ami leegyszerûsíti a tömbökön végrehajtandó ciklusok készítését. Mára azonban a fejlesztõk egyre inkább kihasználják az adatbázisok nyújtotta kényelmi szolgáltatásokat. Nézzük ezek közül a legfontosabbakat: • A Perl nyelvben találhatóhoz hasonló új foreach vezérlési szerkezet. így ezek neve és értéke a program számára egy tömbként került átadásra. a PHP 4-esben például már lehetséges egy felülírt metódus meghívása egy leszármazott osztályból. a digitális személyi titkárokat (PDA). Ebben a környezetben már nem meglepõ. egyenként kézzel kódolt HTML lap felhasználásával készítsenek el. • A PHP 3 felettébb hasznos szolgáltatása volt. más eszközökkel. Az 1990-es évek közepén természetesnek számított. hogy a megjelenítendõ tartalmat hatékonyan kezeljék és az egyes felhasználóknak lehetõséget adjanak a webhelyek testreszabására. hogy egy ilyen kifinomult és rugalmas nyelv. Ezen túl számos új tömbkezelõ függvény került a nyelvbe. • A nyelv tartalmazza a boolean (logikai) adattípust.PHP: személyes honlaptól a portálig Ez természetesen nem jelenti azt. • A PHP 3 csak kezdetleges szinten támogatta az objektumközpontú programozást. ekkora népszerûségre tett szert. Ezt fogjuk használni a könyv legtöbb tömbbel kapcsolatos példájában. mint a PHP. hogy a HTML ûrlap elemeit tömbnevekkel láthattuk el. hogy a PHP nem használható más környezetben. 5 1 A PHP 4 újdonságai A PHP 4-es változata számos – a programozók életét megkönnyítõ – új szolgáltatással rendelkezik. A PHP népszerûségének növekedésére hatással volt a webes alkalmazások fejlesztésében történt váltás is.

ha kérés érkezik. Ezek és más új szolgáltatások ugyan jelentõsen bõvítették a nyelvet. Ez gyorsabb futást jelent. A Zend Engine a teljesítmény és a rugalmasság növelésére íródott. Kifejezetten a teljesítmény jelentõs növelésére fejlesztették ki. valamint egy új változót. hogy olyan PHP modulok készüljenek. addig modulként a PHP folyamatosan a memóriában van. ez azonban jelentõsebb. Míg CGI-feldolgozóként minden lekéréshez új PHP-értelmezõt kell elindítani. amelybõl információkat kaphatunk a feltöltött fájl(ok)ról. (http://www. a programokat futtató mag elnevezése. .6 1. • Két új összehasonlító mûveletet vezettek be (=== és !==). A Zend Engine A PHP 3 készítésekor az alapoktól indulva teljesen új feldolgozóegységet írtak a nyelvhez. Lehetõségünk van változókat rendelni egy munkamenethez és más oldalakon újra elérni ezeket. illetõleg nem egyezését is ellenõrizhetjük. amivel a mérések szerint a PHP messze maga mögött hagyja legtöbb versenytársát.com/) egyik kereskedelmi fejlesztése a PHP kódok fordítását teszi lehetõvé.zend. amelyek a kiszolgálók széles körével képesek együttmûködni. de a legfontosabb változás a felszín alatt következett be. sõt. A kiszolgálókapcsolatok továbbfejlesztésével lehetõvé vált. A PHP 3-as változata számára készült kódok legnagyobb része minden módosítás nélkül tovább mûködik. melyekkel egyidõben értékek és típusok egyezését. A PHP 4-esben hasonló változás figyelhetõ meg a programokat futtató magban. A hatékonysági változások minden bizonnyal biztosítani fogják a PHP további sikerét. A Zend Technologies Ltd. akár 200-szoros sebességgel futhat. hiszen nem kell mindig elindítani egy újabb feldolgozóprogramot. óra • A PHP 4-be beépítették a felhasználói munkamenetek (session) támogatását is. • A kiszolgálói és környezeti adatok tárolására új „beépített” asszociatív tömböket hoztak létre. • A PHP 4-es beépített támogatással rendelkezik a Java és XML nyelvekhez. A Zend Engine a PHP modulok mögött található. Ez további teljesítménynövekedést jelent. Ezek kezelése sütik (cookie) vagy GET metódusú lekérdezések (query string) formájában történhet.

Ráadásul a PHP a legfontosabb operációs rendszerek bármelyikén képes futni. azzal. mint nyílt forráskódú termék jó támogatással rendelkezik. Úgyszintén bizonyos.php. tervezési.net/): ÚJDONSÁG Talán idegennek hangozhat azok számára. hogy ingyenes. ami természetesen már önmagában is elõnyös. A PHP nyílt forráskódú Számos felhasználó szemében a „nyílt forráskódú” egyet jelent azzal. hogy a fejlesztések elõnyeit élvezzük.PHP: személyes honlaptól a portálig 7 Miért a PHP? Van néhány megcáfolhatatlan érv. mint várnánk. hogy a PHP nem kerül semmibe. A PHP. hogy bármilyen problémával is kerüljünk szembe. hogy a programozási szakasz érezhetõen gyorsabb. Ez jelentõsen megkönnyíti a programozók életét. amit a képzett fejlesztõi gárda és az elkötelezett közösség nyújt számunkra. Felvehetjük a kapcsolatot a könnyen elérhetõ és elkötelezett felhasználói közösséggel. Nagy az esély rá. Ha más programnyelveket is ismerünk. Ha mégsem. az alkalmazások fejlesztésekor lehetõség van elválasztani a kódolási. . a világ jó! További információkért lásd a hivatalos licenszet. hogy elmozdítja az akadályokat a hatékony és rugalmas alkalmazások kialakításának útjából. számos alkalmazás fejlesztése során észlelni fogjuk. Nem kell várni a következõ hivatalos kiadásra. Használható kereskedelmi és/vagy nem kereskedelmi célra. ahogy tetszik. és összeállítási szakaszt. ahol számos nagy tapasztalattal rendelkezõ embert találunk. Egy idézet a PHP hivatalos webhelyérõl (http://www. egy levelezõlistára küldött üzenetre általában hamar érkezik intelligens és hiteles válasz. némi kutatással gyorsan és könnyen választ találunk rá. Légy üdvözölve a nyílt forráskódú programok világában! Mosolyogj. hogy a feldolgozóprogram hibáinak javítása nem sokkal felfedezésük után megtörténik és a felmerült új igényeket kielégítõ szolgáltatások is hamar beépülnek a nyelvbe. A jól szervezett nyílt forráskódú projektek újabb elõnyökkel szolgálnak a felhasználóknak. akik nem UNIX-háttérrel olvassák-e sorokat. a legtöbb kiszolgálóprogrammal együttmûködve. Odaadhatjuk barátainknak. légy boldog. kinyomtathatjuk és felakaszthatjuk a falra vagy akár elfogyaszthatjuk ebédre. amiért a PHP 4-est érdemes választani. 1 A fejlesztés sebessége Mivel a PHP lehetõséget ad a HTML elemek és a programkódok elkülönítésére.

Láttuk. amely kielégíti saját vagy ügyfeleink igényeit. A PHP automatikusan kezeli a különbözõ adattípusokat és memóriafoglalásokat (hasonlóan a Perl-höz). hogy kódunk továbbra is futtatható lesz. Kérdések és válaszok Könnyû megtanulni a PHP nyelvet? Röviden: igen! Valóban meg lehet tanulni a PHP alapjait 24 órában! A PHP megszámlálhatatlanul sok függvényt bocsát rendelkezésünkre. Végsõsoron a saját programok készítésébõl és a hibák kijavításából lehet igazán sokat tanulni. Ezt a könyvet kiindulópontként érdemes tekinteni. Egy programozási nyelv nyelvtanának és szerkezeteinek megértése azonban csak az út kezdetét jelenti. ahol a PHP-t Apache modulként használjuk. együttmûködve különbözõ kiszolgálókkal és adatbáziskezelõkkel.8 1. melyek megvalósításához más nyelvekben saját kódot kellene írni. Hordozhatóság A PHP-t alapvetõen úgy tervezték. óra Nincs a PHP mûködtetéséhez egyedileg kiválasztott kiszolgáló vagy operációs rendszer. hogy alkalmas legyen számos operációs rendszeren való használatra. Biztos. A PHP alkalmazásokat kipróbálhatjuk Personal Web Serverrel és késõbb telepíthetjük azokat egy UNIX rendszerre. és megnéztük. . amelyek ellenállhatatlanná teszik a PHP-t. milyen új lehetõségeket teremt a PHP 4-es változatában. Megismertük a Zend Engine-t. hogyan alakult át a nyelv egyszerû makrókészletbõl hatékony programnyelvvé. néhányban megelõzve azt. Szabadon választhatunk olyan rendszert. A lefordított PHP messze maga mögött hagyja az ASP-t. Fejleszthetünk UNIX rendszerre és áttérhetünk NT alapokra minden probléma nélkül. Teljesítmény A hatékony Zend Engine-nek köszönhetõen a PHP 4-es jól vizsgázik az ASP-vel szemben végzett méréseken. bármi mellett is döntünk. Végül áttekintettünk néhány tulajdonságot. Összefoglalás Ebben az órában bemutattuk a PHP-t.

. és azon. Mi az új mag neve a PHP 4-es változatában? 4. Gondolkozzunk el a témákon. melyek segítenek megszilárdítani az órában szerzett tudást. Mit jelentett eredetileg a PHP betûszó? 2. A könyvet átlapozva annak felépítése alaposabban szemügyre vehetõ. Ki készítette a PHP elsõ változatát? 3.PHP: személyes honlaptól a portálig 9 Mûhely Kvíz A mûhelyben kvízkérdések találhatók. hogyan segíthetnek jövõbeni alkalmazásaink elkészítésében. Soroljuk fel a PHP 4 néhány új szolgáltatását! Feladatok 1. 1 1. A válaszokat az A függelékben helyeztük el.

.

Ebben az órában a következõket tanuljuk meg: • Milyen platformokat. A feldolgozóprogram számos operációs rendszerre elérhetõ és több kiszolgálóval is képes együttmûködni. ha nem sikerül a telepítés? . kiszolgálókat és adatbázisokat támogat a PHP? • Honnan szerezhetjük be a PHP-t és más nyílt forráskódú programokat? • Hogyan telepíthetõ a PHP Linux rendszerre? • Hogyan állíthatók be a fontosabb paraméterek? • Hol található segítség.2. be kell szereznünk.ÓRA A PHP telepítése Mielõtt megkezdenénk az ismerkedést a PHP nyelvvel. telepítenünk és beállítanunk a PHP-értelmezõt.

ha internetkapcsolat nélkül szeretnénk fejleszteni. a LinuxPPC rendszerrel: http://www. Velocis. . valamint könnyen telepíthetõk és használhatók majdnem minden PC-n. Solid. mivel a PHP platformfüggetlen nyelv. A MySQL adatbázisrendszer. Ez az egyik oka a PHP népszerûségének a webalkalmazások készítése terén. A közvetlenül nem támogatott adatbázisok mellett a PHP-ben kapcsolatot létesíthetünk az ODBC szabványt használó programokkal is. sõt még Macintosh gépeken is. hogy könnyen összhangba hozható legyen a különbözõ adatbázisokkal.html címen található. FilePro. dBASE. WebSite Pro. beleértve a UNIX. iPlanet Web Server. A könyv példáiban Linux operációs rendszer alatt Apache és MySQL programokat használunk. kiszolgálók.12 2. ami azt jelenti.org/. mSQL.hu/.mysql. UNIX dbm. MySQL. Ebben a könyvben webalkalmazások fejlesztéséhez fogjuk használni a PHP-t. adatbázisok A PHP teljesen platformfüggetlen. A PHP-t alapvetõen úgy tervezték.sote.com/ címrõl tölthetõ le. Oracle. Empress. a legtöbb UNIX rendszeren – beleértve a Linuxot –. Az utóbbi kettõ akkor tehet nagy szolgálatot. A Linux rendszer telepítésérõl további információ a http://www. Sybase. Magyarországon a Linux közösség honlapja a http://www. Számos adatbázis – Adabas D. A PHP fordítható önálló alkalmazássá is. hogy fut Windows operációs rendszeren.linux. Informix és PostgreSQL – közvetlenül csatlakoztatható a PHP-hez. Ezek ingyenesen letölthetõk az Internetrõl. A Linux PowerPC gépen is használható. de nem szabad alábecsülni a szerepét általános programozói eszközként sem.linux. Windows és OS/2 rendszereket. Természetesen nyugodtan dolgozhatnánk Windows NT vagy MacOS rendszer alatt is. A MySQL magyar tükörkiszolgálója a http://mysql. A legnépszerûbbek: Apache (szintén nyílt forráskódú és platformfüggetlen). InterBase. a http://www. OmniHTTPD és Microsoft Personal Web Server. bár az Apache is alkalmas erre Windows környezetben. így az értelmezõ parancssorból is hívható.linuxppc. Microsoft SQL. Számos operációs rendszerre elérhetõ.hu/. Microsoft Internet Information Server. óra Operációs rendszerek. amit ebben a könyvben használni fogunk. A támogatott kiszolgálók köre igen széles.org/help/beginner/distributions.

így még egyszerûbben telepíthetnénk az értelmezõt.zend. másrészt a PHP-t dinamikusan megosztott objektumként (DSO. hogy az Apache rendelkezik-e DSO-támogatással. Magyarországon a http://hu. A http://www. amikor letöltjük az értelmezõt. el kell indítanunk az Apache futtatható állományát (httpd) az -l paraméterrel. Itt híreket. Ha ellenõrizni kívánjuk. forduljunk a rendszergazdához a PHP telepítésével kapcsolatos kéréseinkkel. Dynamic Shared Object) is fordíthatjuk. 2 A PHP 4 telepítése Apache webkiszolgálót használó Linuxra Ebben a részben végigvezetünk egy PHP telepítést egy Apache webkiszolgálót használó Linux rendszeren. hogy az általunk használt rendszerre készült elõre fordított változat is. kiegészítve más programozók által írt hasznos megjegyzésekkel.net/ tükörkiszolgálót érdemes meglátogatni. Elképzelhetõ.com/.net/manual/ címen a teljes kézikönyv elolvasható. A folyamat többé-kevésbé ugyanez más UNIX platformokon is.php. nem kell a bankkártyánkat kéznél tartanunk.net/ címrõl tölthetõ le.A PHP telepítése 13 A PHP beszerzése A PHP 4-es változata a http://www. A PHP-t kétféleképpen lehet Apache modulként elõállítani. Egyrészt újrafordíthatjuk a webkiszolgálót és beépíthetjük a PHP-értelmezõt. Mielõtt megkezdjük a telepítést.php. illetve cikkeket olvashatunk a PHP és a Zend világából. Ez a legegyszerûbb módja annak. A PHP honlapról a dokumentáció is letölthetõ különbözõ formátumokban. A PHP webhelye kiváló információforrás PHP programozóknak. /www/bin/httpd -l .php. képes lesz az új modul használatára anélkül. ellenõrizzük. Ha a kiszolgálót nem érhetjük el root felhasználóként. hogy újrafordítanánk a programot. a PHP fordítása azonban nagyobb szabadságot ad a feldolgozóba kerülõ szolgáltatásokat illetõen. A Zend Engine és más Zend termékek honlapja a http://www. Ezen a címen olvasható a magyar PHP kézikönyv is. ezért ezt az eljárást fogjuk tárgyalni. Ha Apache kiszolgálónk DSO-támogatással ellátott. Mivel a PHP nyílt forráskódú. hogy beüzemeljük a PHP-t. hogy rendszergazdaként (root) jelentkeztünk-e be a rendszerbe.

/php-4. melyek meghatározták. make make install Ezekkel a parancsokkal a PHP fordítása és telepítése befejezõdött.gz Ha sikeresen kibontottuk a csomagot. Ebben a példában csak néhány hasznos parancssori paramétert adunk meg. Késõbb megnézünk néhány további elemet a configure paraméterei közül. óra A program ekkor egy listát ad a rendelkezésre álló beépített modulokról.x. Ennek futtatásához a rendszernek tartalmaznia kell egy C fordítót. a configure megadja a lehetséges paramétereket: .. akkor az Apache alkalmas az alább bemutatott módszerrel történõ bõvítésre. Egyéb esetben újra kell fordítani. .14 2. így elsõ lépésben ki kell csomagolnunk: tar -xvzf php-4. de természetesen számos más lehetõség is rendelkezésre áll.x./configure --enable-track-vars \ --with-gd \ --with-mysql \ --with-apxs=/www/bin/apxs Lehetséges. melynek a megfelelõ paraméterekkel megadhatjuk.x. A tar fájl gzip-pel tömörített.tar. mivel telepítéskor az apxs esetleg éppen az Apache futtatható állománnyal megegyezõ könyvtárba került. Ha a kibontott PHP csomag könyvtárában a következõ parancsot adjuk ki. megadtunk néhány parancssori paramétert. lépjünk át a keletkezett könyvtárba: cd . Ha a mod_so.x Ebben a könyvtárban található a configure program. le kell töltenünk a PHP legfrissebb változatát. amihez a dokumentáció tartalmazza az összes szükséges információt. A configure néhány paramétere Amikor lefuttattuk a configure-t. milyen lehetõségekkel ruházzuk fel a PHP-t.c elem szerepel a listában. már csak az Apache beállítására és futtatására van szükség. Amikor a configure lefutott. milyen szolgáltatásokat építsen be a PHP-be. elindítható a make program. Ha még nem tettük meg. hogy a --with-apxs paraméternek átadott elérési útnak a rendszerünkön másnak kell lennie.

15 2 --enable-track-vars Ez a szolgáltatás automatikusan elõállítja számunkra a PHP oldalakon kívülrõl érkezõ adatokhoz tartozó asszociatív tömböket. mivel nagyon kellemes lehetõség a beérkezõ adatok követésére. Az 1. Ha a GD-t korábban nem az alapbeállítású könyvtárba telepítettük. ez a paraméter lehetõséget ad dinamikus GIF.2-es változatától kezdve mindig be van kapcsolva. a hozzájuk tartozó configure paraméterekkel. JPEG vagy PNG képek készítésére a PHP programokból. A dinamikus képek elõállításáról a tizennegyedik órában írunk. a HTTP kapcsolatokat a tizenharmadik órában részletezzük. célszerû elõbb egy szövegfájlba irányítani.0. hogy a fenti parancs kimenete eléggé érthetõ. Amennyiben a GD könyvtár telepítve van a rendszeren.A PHP telepítése . Ha a rendszeren a MySQL nem az alapbeállítású könyvtárban található. a kiszolgálói és környezeti változók. így nem kell külön megadni./configure --help > lehetosegek. A tömbökkel a hetedik órában foglalkozunk bõvebben. a visszaérkezõ süti-értékek. amelyek a könyv szempontjából számunkra érdekesek. . A PHP 4. A fenti rendkívül gyakran használt configure paraméter. Ezek a GET vagy POST kéréssel érkezett adatok. néhány fontos lehetõséget meg kell említenünk – mégpedig azokat./configure --help Mivel a lista rendkívül hosszú.2-es táblázatban ezek közül láthatunk néhányat. megadható a szokásostól eltérõ elérési út is: --with-gd=/eleresi/ut/a/megfelelo/konyvtarhoz --with-mysql A --with-mysql engedélyezi a MySQL adatbázisok támogatását. a PHP támogat számos más adatbázisrendszert is. így kényelmesebben elolvasható: . --with-gd A --with-gd paraméter engedélyezi a GD könyvtár támogatását.txt Annak ellenére. megadható a szokásostól eltérõ elérési út is: --with-mysql=/eleresi/ut/a/megfelelo/konyvtarhoz Mint már tudjuk.

phps kiterjesztéssel rendelkezõ fájlok PHP forrásként kerülnek a böngészõhöz.1. hogy a forráskód HTML formátumúvá alakul és a nyelvtani elemek színkiemeléssel jelennek meg. óra 2. ami azt jelenti.html kiterjesztést választjuk a PHP számára. Ezzel biztosítjuk. így módosítás nélkül tovább alkalmazhatjuk ezeket is. táblázat Néhány adatbázis és a hozzá tartozó configure paraméter Adatbázis Adabas D FilePro mSQL Informix iODBC OpenLink ODBC Oracle PostgreSQL Solid Sybase Sybase-CT Velocis LDAP configure paraméter --with-adabas --with-filepro --with-msql --with-informix --with-iodbc --with-openlink --with-oracle --with-pgsql --with-solid --with-sybase --with-sybase-ct --with-velocis --with-ldap Az Apache beállítása Miután sikeresen lefordítottuk az Apache-t és a PHP-t.conf fájlt.php3 kiterjesztésre azért lehet szükség.conf fájlban! Az újabb Apache kiadásokban ez már szerepel.php és . Ez az Apache könyvtárának conf alkönyvtárban található. hogy a PHP-elemzõ fel fogja dolgozni a . ami hasznos segítség lehet a programok hibáinak felderítésében. csak egy megjegyzésjelet kell kitörölnünk a sorok elejérõl.php3 kiterjesztéssel rendelkezõ fájlokat.phps Keressünk rá ezekre a sorokra a httpd. Ha ügyfeleink miatt esetleg a hagyományos oldalaknál megszokott .php3 AddType application/x-httpd-php-source . A .html . A . A következõ sorok hozzáadása szükséges: AddType application/x-httpd-php . módosítanunk kell az Apache beállításait tartalmazó httpd.16 2.php . a következõ beállítást kell alkalmaznunk: AddType application/x-httpd-php . mert számos régebbi program ezt használja.

ini szabályozza. Ez a megoldás azonban csak akkor mûködõképes.ini fájllal felülírhatjuk . de az adott rendszeren más is lehet.ini fájlt sem. A .ini fájl beállításai egy névbõl. ha nem rendelkezünk rendszergazdai jogokkal a kiszolgálón. hogy testreszabjuk a tárhelyünket. a php. Ezt a httpd.ini fájlban található beállításokat. ha a kiszolgáló beállítófájljában nem módosíthatjuk a paramétereket. A php. Az ajánlott a . a . A letöltött PHP csomag könyvtárában található egy minta php. amit a könyvtár speciális beállításaihoz használhatunk. ezeket a huszonkettedik órában tárgyaljuk. ha a PHP nem talál egy php. ám célszerû néhány módosítást elvégezni. A PHP mûködését közvetlenül azonban a php.htaccess az alapbeállítású fájlnév.htaccess fájl tökéletes módja annak. Az alapértékek elegendõek lehetnek ahhoz. ezáltal jelentõsen csökkenhet a kiszolgálás sebessége.ini fájlban felülbírálhatjuk a korábban beállított értékeket.A PHP telepítése Tulajdonképpen bármilyen kiterjesztéshez köthetjük a PHP-feldolgozót. Ha a PHP elõretelepítve található meg a kiszolgálón és nincs elérésünk az Apache beállításait tartalmazó fájlhoz.ini A PHP mûködését a fordítás vagy telepítés után is befolyásolhatjuk. ellenõrizzük a php.ini használatával. így akár könyvtáranként különbözõ beállításokat adhatunk meg. Ha a PHP elõretelepítve állt rendelkezésre a rendszerünkön.php.html kiterjesztés azonban nem feltétlenül jó választás. létrehozhatunk egy . egy egyenlõségjelbõl és egy értékbõl állnak. A szóközöket a feldolgozó figyelmen kívül hagyja. Windows rendszereken a Windows könyvtára. amely a „gyári beállításokat” tartalmazza.ini fájl. hogy a könyv példáit futtassuk. ha az Apache AllowOverride beállítása az adott könyvtárra a FileInfo vagy az All értéket tartalmazza.conf állomány AccessFileName beállítása határozza meg.htaccess fájlok hatása kiterjed az adott könyvtárra és annak minden alkönyvtárára is. a PHP programjaink könyvtárába helyezett saját php. A . Emellett a feldolgozásra kerülõ PHP oldal könyvtárában – a munkakönyvtárban – elhelyezett php. Ha esetleg nem lenne jogosultságunk a fájl módosítására.htaccess nevû állományt a saját könyvtárunkban és abban is megadhatjuk a fenti sorokat. ugyanis ilyen beállítás esetén minden kiküldött HTML lap áthalad a PHP-elemzõn.ini fájl számára a /usr/local/lib. UNIX rendszereken az alapbeállítású könyvtár a php. Ezek az értékek lépnek érvénybe akkor. Ez a fájl általában akkor is olvasható. A . 17 2 php.

amely kijelöli php. A hibakezelés beállításával alaposabban a huszonkettedik órában foglalkozunk. addig az alábbi értékadás tökéletesen megfelel: error_reporting = E_ALL & ~ E_NOTICE Ezzel a PHP minden hibát jelezni fog a lehetséges problémákat jelölõ figyelmeztetések kivételével. hogy létrehozunk egy PHPRC nevû környezeti változót.ini fájlunkat. Hibajelentések beállításai Ha hibákat keresünk programjainkban. amennyiben nem szeretnénk PHP oldalaink kimenetében látni az abba a csoportba tartozó hibákat.ini beállításait bármikor módosíthatjuk.18 2. short_open_tag A short_open_tag beállítás határozza meg. óra az alapbeállítást. . letilthatjuk egyik vagy másik típust. ezért ez az alapbeállítás. a változtatások érvénybe léptetéséhez újra kell indítani a webkiszolgálót. hasznos a hibaüzenetek kiírása a HTML oldalba a böngészõ számára. a következõ sorok egyikét kell használnunk: short_open_tag = On short_open_tag = True short_open_tag = Yes A PHP blokkok kezdõ. hogy mivel többféle hibaüzenettípus is rendelkezésre áll. A php. Ha ez ki van kapcsolva. hogy használhatjuk-e a rövid <? kód ?> formát a PHP kódblokkok írására.és záróelemeirõl a következõ órában lesz szó. Ez azt jelenti. Ezek a figyelmeztetések megakadályoznák néhány szokásos PHP módszer alkalmazását. hogy engedélyezzük ezt a beállítást. Másik lehetõségünk. Ez alapbeállításban bekapcsolt: display_errors = On Beállíthatjuk a hibajelentési szintet is. de ha feldolgozónk Apache modulként fut. az alábbi sorok valamelyikét láthatjuk: short_open_tag = Off short_open_tag = False short_open_tag = No Ahhoz.

ami után kutatunk. kiszolgálói és környezeti értékekbõl létrehoz bizonyos változókat. Ha falba ütközünk.A PHP telepítése 19 Változókra vonatkozó beállítások A PHP a GET és POST kérésekbõl. hogy a PHP hivatalos webhelyén keresést is végezhetünk. Akármennyire is mûködésképtelennek tûnhet a telepített értelmezõnk.com/. ahol segítséget kereshetünk. beállításunk vagy programozási megoldásunk. az elsõ hely.ini fájlban szabályozhatjuk. A PHP fejlõdésével egyre inkább azt javasolják a programozóknak. Sok segítséget és információt találhatunk a Zend webhelyén is: http://www. . a PHP 4.net/manual/.net/ címen.hu webmester honlapon találhatnak rengeteg információt: http://weblabor. ha nem jól választjuk meg a változók neveit.2es változat óta nem is lehet kikapcsolni: track_vars = On A register_globals beállítás azt határozza meg. Ennek mûködését is a php. A magyar PHP fejlesztõk a weblabor. különösen a nyílt forráskódú programokkal kapcsolatos problémák esetén.php. Keresés itt is végezhetõ.hu/php/. Ezért mielõtt a levelezõprogramunk „Küldés” gombját megnyomnánk. hogy létrejöjjenek-e asszociatív tömbök egy HTTP lekérés eredményeként.zend. Ha nem sikerült megtalálni a megoldást. hogy mellõzzék ennek a szolgáltatásnak a használatát.faqts. jó esélyünk van rá. Itt készítjük a magyar PHP dokumentációt is. mivel így rendkívül sok változó jöhet létre és ez ütközéseket okozhat. hogy nem vagyunk ezzel egyedül. Egy másik kitûnõ forrás a PHP Knowledge Base: http://www. Ennek ellenére ma a PHP programok legnagyobb része – többek között a könyv számos példája is – arra épít.0.phtml. hogy a HTTP lekéréskor ezek a változók globális változókként jöjjenek-e létre. Valaki talán már megválaszolta kérdésünket. sütikbõl. A track_vars beállítás azt adja meg. különösen az ott található. olvasói kiegészítésekkel ellátott kézikönyv: http://www. hogy ez a beállítás be van kapcsolva: register_globals = On 2 Segítség! A segítség mindig kéznél van az Interneten.php.com/knowledge-base/index. a PHP hivatalos honlapja a http://www. A tanács. gondolkozzunk el egy kicsit. hasznos segítség lehet. Ez alapbeállításban engedélyezett. vagy egy FAQ-fájlban rejtõzik. talán egy sajtóközleményben.

Egy alapvetõ kérdés feltevése technikai jellegû listán többnyire egy-két olyan választ eredményez. gyûjtsük össze a probléma szempontjából fontos információkat. de ezt ellensúlyozza. Egy tapasztalt programozó általában gyorsan és hatékonyan tud problémákat megoldani. . A PHP honlapján nemzetközi levelezõlisták oldalaira mutató hivatkozásokat is találunk. amelyben felhívják figyelmünket. Mielõtt elküldenénk egy kérdést. hogy rendkívül sokat lehet belõlük tanulni. hogy problémánk még nem merült fel korábban. ha felhívjuk rá a figyelmet. ami a problémát okozza Miért kell ilyen sok szempontot figyelembe vennünk. Eltölthetünk némi idõt pár kulcsszó kipróbálásával. legalább egy kötegelt kézbesítésû (digest) listára iratkozzunk fel. Amennyiben ezek után is meg vagyunk gyõzõdve arról. A magyar PHP levelezõlista és annak archívuma a http://weblabor. hanem naponta egy-két levélben összefûzve kapjuk meg.net/support.php oldalon.php. hogy a listára érkezõ leveleket nem egyenként.hu/wl-phplista/ címen érhetõ el. A listák gyakran nagy forgalmúak. Ezek az archívumok óriási mennyiségû információt tartalmaznak a PHP közösség legjobbjaitól. hogy erre a kérdésre az archívumban megtalálható a válasz. de ne írjunk túl sokat! A következõ elemek gyakran szükségesek: • A használt operációs rendszer • A telepítés alatt álló vagy futó PHP-változat száma • A beállításkor használt configure paraméterek • Bármilyen configure vagy make kimenet. beküldhetjük oda a problémánkat.20 2. Ha érdeklõdünk a PHP programozás iránt. ami elõjelezhette a telepítési hibát • Egy ésszerûen teljes részlet a kódból. A kötegeltség azt jelenti. mielõtt egy levelezõlistára postáznánk kérdésünket? Elõször is a fejlesztési problémák megoldásában szerzett tapasztalat elõnyös lehet a késõbbi munka során. óra Még mindig sikertelenek próbálkozásaink? A PHP levelezõlisták kereshetõ archívumaira mutató hivatkozások megtalálhatóak a http://www. Ha sikerül megtalálni az érdeklõdési körünknek megfelelõ levelezõlistát a számos lehetõség közül. A PHP levelezõlistákra való jelentkezéshez az archívumokat felsoroló oldalon találunk hivatkozásokat. számos más hivatkozással együtt. jó szolgálatot tehetünk a PHP közösségnek.

hogy a probléma nem a mi kódunkban. hogy nem szükséges egy meghatározott kiszolgálót. egy levelezõlista nem hasonlítható össze egy kereskedelmi termék támogatási központjával. Ezért felesleges olyan kérdések feltevése. Áttekintettünk néhány configure paramétert. Végül megnéztük. Végül. akkor a csomagban részletes információkat találunk a telepítéssel kapcsolatban. Ha nem a forráskódot töltjük le a hálózatról. Ha továbbra sem sikerül megoldani a problémát. Ebben az órában láttuk. olvassuk el a csomagban található dokumentációt és a PHP kézikönyv megfelelõ fejezetét. Általában széles körû lépésrõl-lépésre leírt utasításokat kapunk a telepítéshez. hanem egy lefordított változatot. A kérdések a válasszal együtt az archívumba kerülnek. Kérdések és válaszok A telepítést Apache webkiszolgálót használó Linux operációs rendszeren vezettük végig. hol találhatunk segítséget. Nyílt abban az értelemben is. hogy több rendszeren is képes futni. Ezzel készen állunk arra. hogy megválaszolja kérdéseinket. ha problémáink akadnak. Ennek ellenére lenyûgözõ szellemi erõforráshoz nyújt elérést. hogy megbirkózzunk a PHP nyelvvel.A PHP telepítése Másodszor. melyekkel a feldolgozó képességeit befolyásolhatjuk. Senki sem kap fizetést. a hibát a PHP következõ kiadásában többnyire kijavítják. küldjünk egy hibajelentést a fejlesztõknek a http://bugs. segítõkész emberek és a probléma felvetésével esetleg másoknak is segíthetünk egy hasonló kérdés megoldásában. Ha problémák adódnak az adott rendszeren a PHP telepítésével. a „Segítség!” címû részben ismertetett módszerek célravezetõk lehetnek.net/ címen. Tanultunk a php. Ez azt jelenti. A PHP fejlesztõk civilizált. hogy a könyv nem megfelelõ más rendszer vagy kiszolgálóprogram használata esetén? A PHP egyik nagy erõssége. Ha a gubanc valóban új. amit megadhatunk benne. honnan szerezhetõ be a PHP és más – a webhelyek szolgáltatásaiban segítõ – nyílt forráskódú programok. 21 2 Összefoglalás A PHP 4 nyílt forráskódú. ha úgy tûnik. . hogy késõbb más programozók segítségére lehessenek. beleértve a PHP néhány fejlesztõjét is. amelyek már többször szerepeltek a listán. operációs rendszert vagy adatbázist használnunk a fejlesztéshez. Megnéztük. hanem a PHPértelmezõprogramban található. hogyan fordítható le a PHP Apache modulként Linux rendszeren. Ezek megfontolása után ne vonakodjunk kérdéseket küldeni a levelezõlistákra.ini fájlról és néhány beállítási lehetõségrõl.php.

akár hálózatba kötött gépen dolgozunk. Milyen sort kell az Apache beállítófájlhoz adni.php címen érhetjük el. nézzük át a PHP beállítófájlt és ellenõrizzük a telepítés helyességét. melyek segítenek megszilárdítani az órában szerzett tudást. hogy ez a lehetõség rendelkezésre álljon. a http://localhost/elso. Kvíz 1. Bármilyen operációs rendszert is használunk.22 2. Hogy hívják általában az Apache beállításait tartalmazó fájlt? 4.php fájlt szeretnénk megnyitni.0. bár az éles környezetben való ellenõrzés hasznosabb lehet. Ha sikerült.php kiterjesztést? 5. Windows operációs rendszeren feltétlenül telepíteni kell a TCP/IP támogatást. Telepítsük a PHP-t. a saját gépünk IP-címe 127. Hol érhetõ el a PHP kézikönyv? 2. Ezért ha a saját gépünkön lévõ webkiszolgáló gyökérkönyvtárában lévõ elso. hogy számítógépünk az Internetre legyen kapcsolva. Mi a PHP beállításait tartalmazó fájl neve? Feladatok 1.1. óra Hogyan érhetõk el böngészõbõl a PHP állományok. A válaszokat az A függelékben helyeztük el. Mûhely A mûhelyben kvízkérdések találhatók. akár nem. .0. ha a gépre telepítettük a webkiszolgálót? A PHP alkalmazások fejlesztéséhez és teszteléséhez nem szükséges. hogy a kiszolgáló felismerje a . UNIX rendszeren hogyan kaphatunk bõvebb információkat a beállítási lehetõségekrõl (milyen paramétereket kell átadni a configure-nak)? 3. neve akkor is localhost lesz.

Ebben az órában elkészítjük az elsõ programunkat és elemezzük a kódot. hogy elkezdjünk vele dolgozni.ÓRA Elsõ PHP oldalunk A PHP telepítése és beállítása után eljött az ideje. amelyek HTML és PHP kódot is tartalmaznak. Az óra végére képesek leszünk olyan oldalak készítésére. Ebben az órában a következõket tanuljuk meg: • Hogyan hozzunk létre.3. töltsünk fel és futtassunk egy PHP programot? • Hogyan vegyítsünk HTML és PHP kódot egy dokumentumon belül? • Hogyan tehetjük a kódunkat olvashatóbbá megjegyzések használatával? .

1.php néven.1. Ezzel az elõzõ órában részletesen foglalkoztunk. vagy a VI és az Emacs UNIX esetében. és mentsük elso. Az alapbeállítású PHP kiterjesztés a . MacOS használata esetén a Fetch lehet hasznos. program Az elsõ PHP program 1: <?php 2: print ("Hello Web!"). 3. óra Elsõ programunk Vágjunk a közepébe és kezdjük egy kész PHP oldallal! A kezdéshez nyissuk meg kedvenc szövegfájl-szerkesztõnket! A HTML dokumentumokhoz hasonlóan a PHP állományok is formázás nélküliek. 3: ?> A 3. Ha nem közvetlenül a kiszolgálóprogramot futtató gépen dolgozunk. ez azonban a kiszolgáló beállításainak módosításával megváltoztatható. Ez azt jelenti. a Simple Text vagy a BBEdit MacOS alatt. Ilyenek például a kódszínezés. Gépeljük be a 3. ábra a 3. tisztán szövegfájlok.24 3.1. feltehetõen az FTP nevû szolgáltatást kell használnunk arra. A Windowsban többek között a WS-FTP használható erre a célra. mivel ez jelzi a kiszolgáló számára. Ilyenek például a Windows Jegyzettömbje. program kódját mutatja a KEdit programban.1. ábra Elsõ PHP oldalunk begépelve a KEdit programban A kiterjesztés igen fontos. hogy a fájl PHP kódot tartalmaz és futtatásához meg kell hívni a feldolgozót. .php. hogy bármilyen szövegfájl szerkesztésére íródott programmal készíthetünk PHP állományokat. A legnépszerûbb HTML-szerkesztõk általában nyújtanak valamilyen különleges támogatást PHP-szerkesztéshez is. hogy PHP oldalunkat a kiszolgálóra juttassuk. 3. programot.1. a kifejezésszerkesztõ vagy a tesztelõ.

kielemezhetjük az imént begépelt kódot. ellenõriznünk kell. hogy a PHP sikeresen felkerült-e a rendszerre és hogy a kiszolgálót beállítottuk-e a megfelelõ kiterjesztés felismerésére. Miután sikerült feltölteni és kipróbálni elsõ programunkat. ábra Kudarc: a kiterjesztés nem azonosítható Ha ez történik.2. Ha minden rendben ment.3. 3. Ezt mutatja a 3.3.3.nphp névvel mentettük. . Ha a kiterjesztéssel nincs probléma. elõször ellenõrizzük a mentett fájl kiterjesztését. ábrán látható lapot véletlenül elso. ábra Siker: a 3. feltehetõen nem az elõzõ ábrán látható kimenetet kapjuk. az ablakban a program kimenetét láthatjuk.php kimenetét mutatja.Elsõ PHP oldalunk Ha sikerült elhelyeznünk a dokumentumot a kiszolgálón. Ezekkel a kérdésekkel az elõzõ órában foglalkoztunk részletesen.1. ábra az elso. elérhetjük egy webböngészõ segítségével. ábra. A 3. Ebben az esetben általában a PHP program forráskódját látjuk viszont. 25 3. program kimenete 3 Ha a PHP-t nem sikerült telepíteni a kiszolgálóra vagy nem a megfelelõ kiterjesztést használtuk. A 3.2.

Az ASP stílusú elemek engedélyezéséhez az asp_tags beállítást kell bekapcsolni: asp_tags = On Ez akkor lehet hasznos. hogy melyik elemet választjuk.és záróelemei Elnevezés Hagyományos Rövid ASP stílusú Script elem Kezdõelem <?php <? <% <SCRIPT LANGUAGE="PHP"> Záróelem ?> ?> %> </SCRIPT> A 3.ini fájlt. óra PHP blokkok kezdése és befejezése Amikor PHP oldalakat írunk.ini fájl módosítása után lehetõségünk van választani a bekapcsolt típusok közül. mely részeket hajtsa végre. ezért nem kell szerkesztenünk a php. az értelmezõ mindent HTML-nek tekint és változtatás nélkül továbbküldi a böngészõ számára. hogy a fájl mely részei tartalmaznak PHP kódot. Mivel a hagyományos forma minden rendszeren rendelkezésre áll. Az elõzõ órában tárgyaltuk a beállítás módszerét. tudatnunk kell a feldolgozóval. táblázat PHP blokkok kezdõ.1.1. ha olyan termékkel készítünk PHP oldalakat. így a könyvben is ezzel fogunk találkozni. Ha nem adjuk meg.26 3. .1. A 3. táblázat a PHP kód blokkjainak kijelölésére szolgáló elemeket sorolja fel: 3. hacsak valaki elõzõleg ki nem kapcsolta. de ha XML-lel is szeretnénk dolgozni. de az ASP részeket érintetlenül hagyja. A rövid és ASP stílusú elemeket engedélyezni kell a php. ha „On” állapotba tesszük: short_open_tag = On A rövid kezdõelemek alapbeállításban engedélyezettek. mindenképpen a hagyományos formát kell alkalmaznunk és le kell tiltanunk a rövid stílust. A rövid kezdõelemek felismerését a short_open_tag beállítással engedélyezhetjük.ini fájlban. amely törli a PHP blokkokat. táblázatban látható lehetõségek közül csak az elsõ és az utolsó áll minden beállítás esetén rendelkezésre. a fejlesztõk programjaikban általában ezt alkalmazzák. A php. Rajtunk múlik.

akár nem. amelyek valamilyen mûveletet végeznek. %> <SCRIPT LANGUAGE="PHP"> print ("Hello Web!"). ezért a továbbiakban ezt alkalmazzuk. </SCRIPT> Ha PHP-ben egysoros kódot írunk. a böngészõhöz kerül. hogy milyen adatokat kapnak. . akár küldünk adatokat számukra. hogyan fest egy PHP fájl. A függvényeknek átadott adatokat majdnem mindig zárójelbe kell tennünk a függvény neve után. bármely négy kezdõ. A print() ebbõl a szempontból kivételes. Ebben az esetben a print() függvénynek egy karakterláncot adtunk át. A karakterláncokat mindig (egyes vagy kettõs) idézõjelbe kell tenni. illetve a programsort: <?php print("Hello Web!"). nézzük meg még közelebbrõl a 3. programot. ami a print() függvény kimenetén megjelenik.és záróelemeket. amely a fent említett formákat használja az elõzõ program kibõvítéseként.Elsõ PHP oldalunk Nézzük meg. hogy zárójeleket helyezzünk a nevük után. nem kell külön sorba tennünk a kezdõ.1. ?> <?php print ("Hello Web!"). mivel hívása esetén a zárójelek elhagyhatók. A függvények általában megkövetelik. A legtöbb esetben minden. Ez a print() függvény megszokott formája. 27 3 A print() függvény A print() függvény kiírja a kapott adatokat. A függvények olyan parancsok. ?> <% print ("Hello Web!"). ?> Miután megtanultuk.és záróelemet használhatjuk a programban: <? print ("Hello Web!"). Ha engedélyeztük. többnyire attól függõen. hogyan határozhatunk meg egy PHP kódblokkot.

a „Hello Web!” szöveget látjuk vastagon. . programot megnézzük böngészõvel. illetve azok. Ha a dokumentum forrását is megnézzük. Általánosságban a PHP számára azt jelenti.1. Ha a 3. mint az írott vagy beszélt nyelvben a mondat. amelyek blokk végén állnak.4. óra A 3. mint ahogy ez a 3. HTML és PHP kód egy oldalon 3. A legtöbb esetben azonban az utasítás végérõl lefelejtett pontosvesszõ megzavarja az elemzõt és hibát okoz. Az utasításokat a legtöbb esetben pontosvesszõvel kell lezárni. a kód hagyományos HTML dokumentumnak tûnik. Ez alól kivételt képeznek azok az utasítások. hogy HTML kód beépítése a PHP oldalakba egyszerûen a HTML tartalom begépelésébõl áll. ahogy a 3.28 3. ábrán megfigyelhetõ. amelyeket más utasítások vesznek körül. program PHP program HTML tartalommal 1: <html> 2: <head> 3: <title>3. 9: ?> 10: </b> 11: </body> 12: </html> Látható. program PHP program HTML tartalommal</title> 4: </head> 5: <body> 6: <b> 7: <?php 8: print ("Hello Web!").2. Mivel a 3. ábra mutatja.1. A pontosvesszõ tudatja a feldolgozóval. a mondatokat írásjellel. programban az egyetlen megadott utasítás a blokk végén áll. ÚJDONSÁG Az utasítás a feldolgozónak adott parancs. A PHP feldolgozó figyelmen kívül hagy mindent a PHP nyitóés záróelemeken kívül. program egyetlen sorát pontosvesszõvel fejeztük be. hogy az utasítás véget ért.2.2. a pontosvesszõ elhagyható.5.

Bármi. 29 3. ábra Ha a dokumentum forrását nézzük. ezek együttesen alkotnak egy programot. függvények vagy osztályok) a dokumentumon belül elérhetõ lesz a késõbbi blokkokban is.Elsõ PHP oldalunk Egy dokumentumban a HTML elemek közé tetszõleges számú PHP kódblokk írható.4. a „Hello Web!” szöveget látjuk vastagon 3 3. Bár több kódblokkot helyezhetünk el egy dokumentumon belül. (változók. ábra Ha a 3. a kód hagyományos HTML dokumentumnak tûnik . összességében egy nagyobb programot megvalósító PHP fájlt nevezzük PHP alkalmazásnak.5. amit egy megelõzõ blokkban határoztunk meg. A több együttmûködõ.2 programot megnézzük böngészõvel.

a sor vagy a PHP blokk végéig. ÚJDONSÁG A megjegyzések a kódban található olyan szövegrészek. hogyan használható egy szöveges szerkesztõ. majd összeállítottunk egy HTML és PHP kódot is tartalmazó állományt. /* Ez egy megjegyzés. Segítségükkel olvashatóbbá tehetjük a programot és jegyzeteket fûzhetünk hozzá. // Ez megjegyzés # Ez is megjegyzés A többsoros megjegyzések egy perjelet követõ csillag karakterrel kezdõdnek (/*) és egy csillagot követõ perjellel (*/) fejezõdnek be. miként kell használnunk a print() függvényt. A PHP-értelmezõ ezen sorok egyikét sem fogja feldolgozni. akik az adott kóddal fognak dolgozni. óra Megjegyzések a PHP kódokban Az íráskor átlátható programkód hat hónappal késõbb reménytelenül kuszának tûnhet.30 3. miközben írjuk. */ Összefoglalás Mostanra rendelkezésünkre állnak azok az eszközök. amelyeket a feldolgozó figyelmen kívül hagy. A PHP egysoros megjegyzései két perjellel (//) vagy egy kettõskereszt karakterrel (#) kezdõdhetnek. Végül tanultunk a megjegyzésekrõl és arról. hogyan építhetjük be ezeket a PHP dokumentumokba. Láttuk. Ha azonban megjegyzéseket fûzünk a kódhoz. . Megtanultuk. Az ezen jelzések után található szöveget a PHP-értelmezõ mindig figyelmen kívül hagyja. hogy a böngészõ számára kimenetet küldjünk. hogy létrehozzunk és mentsünk egy PHP dokumentumot. melyekkel képesek vagyunk egy egyszerû PHP program futtatására egy megfelelõen beállított kiszolgálón. a késõbbiekben sok idõt takaríthatunk meg magunknak és más programozóknak. Ebben az órában elkészítettük elsõ PHP programunkat.és záróelemet. Elemeztük a négy rendelkezésre álló blokk kezdõ.

és záróelemeit! 3. mivel ezek még hosszú idõ után is érthetõek maradnak. Adjuk meg a PHP hagyományos kezdõ. Adjuk meg a Script kezdõ. A rövid kezdõelemek alapesetben engedélyezettek és rendelkeznek a tömörség elõnyös tulajdonságával. Ha a program azonban akár csak egy kicsit is bonyolult. A válaszokat az A függelékben helyeztük el. a kódban megbújó rejtett karakterek biztos gondot fognak okozni. Mikor kell megjegyzéseket fûzni a kódokhoz? Ez is nagyrészt a programozó döntésén múlik. A felhasználó böngészõjével elolvashatja-e a PHP kódot? 2. Milyen szerkesztõprogramokat kell elkerülni a PHP kódok készítésekor? Ne használjunk olyan szövegszerkesztõket. 3 Mûhely A mûhelyben kvízkérdések találhatók.és záróelemeket! 5. Gyakoroljuk a PHP oldalak elkészítését. Adjuk meg az ASP stílusú kezdõ. Kvíz 1. amelyek saját formátummal rendelkeznek.és záróelemeket! 4.és záróelem? Ez nagyrészt saját döntésünkön múlik. mint a Microsoft Word. melyek segítenek megszilárdítani az órában szerzett tudást. Mely függvény használatos a böngészõ számára küldött adatok kiírásához? Feladatok 1. Ez hosszú távon idõt takarít meg számunkra és kíméli idegeinket. A rövid programokhoz nem érdemes magyarázatot fûzni. már javasolt megjegyzésekkel bõvíteni. A hordozhatóság szem elõtt tartásával a hagyományos <?php ?> megoldás a legjobb döntés. feltöltését és futtatását! .Elsõ PHP oldalunk 31 Kérdések és válaszok Melyik a legjobb kezdõ. Ha ilyen típusú szerkesztõvel mentjük szöveges fájlként az elkészült dokumentumot.

.

6. 8. RÉSZ A PHP nyelv 4. 7. 5.II. óra Az alkotóelemek óra Vezérlési szerkezetek óra Függvények óra Tömbök óra Objektumok .

.

A lényeg. Az alapokkal kezdünk. Az órában a következõket tanuljuk meg: • Mik a változók és hogyan használjuk azokat? • Hogyan hozhatunk létre változókat és hogyan érhetjük el azokat? • Mik azok az adattípusok? • Melyek a leggyakrabban használt mûveletek? • Hogyan hozhatunk létre kifejezéseket mûveletjelek használatával? • Hogyan határozhatunk meg állandókat és hogyan használhatjuk azokat? . bármikor vissza lehet lapozni a könyvben.4. így a kezdõ programozónak rengeteg új információt kell majd feldolgoznia. A gyakorlott programozóknak is ajánlatos legalábbis átlapozniuk ezen óra anyagát. hogy a fejezetben leírtak megértésére törekedjünk. ne csupán a memorizálásra. ÓRA Az alkotóelemek Ebben az órában már mélyebben elmerülünk a nyelv rejtelmeiben. Aggodalomra azonban semmi ok.

óra Változók A változók különleges tárolók. szóközöket és más olyan karaktereket. hogy a pontosvesszõ (. az óra késõbbi részében. úgy kezelhetjük azokat. vagyis bevezetéséhez) egyszerûen csak bele kell írni azt a programunkba. Ne feledjük. Vagyis a fenti példánál maradva a létrehozás után írt print $szam1. Itt két változót hoztunk létre és a hozzárendelõ mûveletjellel (=) értéket is adtunk azoknak. Íme néhány érvényes változónév: $a. $szam1 = 8. Amint látjuk. tartalmuk bármikor módosítható. amiket abból a célból hozunk létre. így az elõzõekben a pontosvesszõ nem része a változók nevének. objektumokat. feltéve. Az értékadásról bõvebben a Mûveletjelek és kifejezések címû részben tanulunk.) a PHP utasítás végét jelzi. $elalszom_zzzzzzzzzzzzzz. rengeteg féle nevet adhatunk változóinknak. Miután értéket adtunk változóinknak. karakterláncokat. Létrehozáskor általában rögtön értéket is szoktunk adni a változónak. ÚJDONSÁG A változók adatokat – számokat. amelyek nem számok vagy betûk. számokat és aláhúzás karaktereket (_) tartalmazhat (számmal azonban nem kezdõdhet!). $egy_hosszabb_valtozonev. hogy a $szam1 változó értéke 8 maradt. $szam2 = 23. bár a csak számokból álló változónevek nem szokványosak. Változó létrehozásához (deklarálásához.36 4. hatásával. tömböket vagy logikai értékeket – tárolnak. nem. mintha maguk lennének az értékek. . hatása megegyezik a print 8. hogy értéket helyezzünk el bennük. A változók egy dollárjelbõl ($) és egy „tetszõlegesen” választott névbõl tevõdnek össze. A név betûket.

Ez elsõ ránézésre nem tûnik túl hasznosnak. hogy a változó nevét is tárolhatjuk változóban. ám hasznos. $$tarolo = "Anna". ezért a $$tarolo-t úgy tekinthetjük. Tehát a fenti kifejezés a $felhasznalo-val egyenértékû. vagyis "felhasznalo"-val. Tehát ha az alábbi módon értéket rendelünk egy változóhoz $felhasznalo = "Anna". 4 A dinamikus változók elérése ugyanúgy történik. mint egy dollárjelet. hogy egy dollárjel után írjuk a változó nevét. $tarolo = "felhasznalo". melyet egy változó neve követ ($tarolo). hogy itt létrehoztunk egy $tarolo nevû változót. mint a „hagyományos” változóké. . kóddal. e módszerrel dinamikus változók tucatjait hozhatjuk létre. Szokatlan. amit a PHP a változó értékével helyettesít. Ha azonban a karakterlánc-összefûzõ mûveletjellel ciklusban használjuk (lásd a Vezérlési szerkezetek címû ötödik órát). mintha ezt írnánk: $tarolo = "felhasznalo". az megegyezik azzal. azonos a $felhasznalo = "Anna". a $tarolo viszont ismét csak egy változó. eltekintve természetesen attól. Dinamikus változókat karakterlánc-konstanssal (állandóként meghatározott karakterlánccal) is létrehozhatunk. print $felhasznalo.Az alkotóelemek 37 Dinamikus változók Változót tehát úgy hozunk létre. tehát a $felhasznalo = "Anna". A $tarolo változó a "felhasznalo" szöveget tartalmazza. melynek értéke "felhasznalo". print $$tarolo. Ekkor a változó nevéül szolgáló karakterláncot kapcsos zárójelbe tesszük: ${"felhasznalonev"} = "Anna".

4. program Dinamikusan beállított és elért változók 1: <html> 2: <head> 3: <title>4.38 4. majd a "felhasznalo" szöveget. program Dinamikusan beállított és elért változók</title> 4: </head> 5: <body> 6: <?php 7: $tarolo = "felhasznalo". 11: // vagy . 9: // lehetne egyszerûen csak: 10: // $felhasznalo = "Anna". hanem kiírja a dollárjelet. ami a $felhasznalo nevû változó értéke. már az "Anna" szöveget írja ki.1. példaprogram egy PHP oldalon belül tartalmazza a korábbi programrészleteket és változóban tárolt karakterláncokat használ a $felhasznalo kezdeti értékének beállítására és elérésére. a PHP szolgálatkészen beilleszti annak értékét. vagyis összességében azt. hogy a karakterláncon belüli változó egy dinamikus változó része. Az alábbi kódrészlet print utasítása $felhasznalo = "Anna". az elsõ dollárjelet pedig a helyén hagyta. a böngészõ nem az "Anna" szöveget jeleníti meg. A 4.1. $tarolo = "felhasznalo". ÚJDONSÁG Ha egy változót kettõs idézõjelek közé teszünk. mint ahogy várnánk. print "${$tarolo}". 8: $$tarolo = "Anna". Az alábbi print utasítás hatására $felhasznalo = "Anna". A mi esetünkben a PHP a $tarolo karaktersorozatot a "felhasznalo" szövegre cserélte. kapcsos zárójelbe kell tennünk. az értelmezõnek némi segítséget kell adnunk.1. hogy egyértelmûvé tegyük a PHP számára. Annak érdekében. hogy "$felhasznalo". print "$$tarolo". óra Ha egy dinamikus változót egy karakterláncon belül szeretnénk kiírni. $tarolo = "felhasznalo".

A 4.1. akkor a $masikValtozo-ba az $egyikValtozo értékének másolata kerül. Az $egyikValtozo tartalmának késõbbi módosítása nincs semmiféle hatással a $masikValtozo-ra. 9: // $masikValtozo-ba $egyikValtozo tartalmának másolata kerül 10: $egyikValtozo = 325. ?> </body> </html> Hivatkozások a változókra A PHP alapértelmezés szerint értékadáskor a változók értékeit használja.2. Ez azt jelenti.2. program Változók érték szerinti hozzárendelése</title> 4: </head> 5: <body> 6: <?php 7: $egyikValtozo = 42. program Változók érték szerinti hozzárendelése 1: <html> 2: <head> 3: <title>4. 8: $masikValtozo = $egyikValtozo. print $$tarolo. 11: print $masikValtozo. print "<br>". // kiírja. print "${'felhasznalo'}<br>". hogy ha az $egyikValtozo-t hozzárendeljük egy $masikValtozo-hoz. program (folytatás) 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: // ${"felhasznalo"} = "Anna" // persze ekkor nem kellenek dinamikus változók print "$felhasznalo<br>".Az alkotóelemek 39 4. print "${$tarolo}<br>".2. példaprogram ezt mutatja be. 4 4. hogy 42 12: ?> 13: </body> 14: </html> .

amely az $egyikValtozo-ra mutat. mind a $masikValtozo ugyanazt a „tárolódobozt” használja. Hacsak nem használunk nagyon gyakran értékadásokat. Ezt illusztrálja a 4. Ezután a $masikValtozo elérésekor az $egyikValtozo-ra vonatkozó mûveletek eredményét láthatjuk.3.3. Más szavakkal: mind az $egyikValtozo. A hivatkozások a PHP 4-es változatában kerültek a nyelvbe. hanem egy hivatkozás. példaprogramhoz képest a változás mindössze egy karakter. program Változóra mutató hivatkozás 1: <html> 2: <head> 3: <title>4. hogy a $masikValtozo-ba ne az $egyikValtozo értéke kerüljön.40 4. így értékeik mindig egyenlõk. óra Itt a 42 értéket adjuk az $egyikVatozo-nak. példaprogram. 9: // $masikValtozo-ba $egyikValtozo-ra mutató hivatkozás kerül 10: $egyikValtozo = 325. mivel a böngészõben a 42 jelenik meg. majd a $masikValtozo-hoz hozzárendeljük az $egyikValtozo-t. A print utasítás igazolja ezt. csekély mértékben növelheti a teljesítményt. hogy az érték másolata helyett a $masikValtozo-ba a változóra mutató hivatkozás kerül.3. . Az $egyikValtozo elé tett & jel gondoskodik róla. 11: print $masikValtozo. 8: $masikValtozo = &$egyikValtozo. 4. // kiírja. program Változóra mutató hivatkozás</title> 4: </head> 5: <body> 6: <?php 7: $egyikValtozo = 42.2. Ekkor a $masikValtozo-ba az $egyikValtozo értékének másolata kerül. Kikényszeríthetjük. Mivel ez az eljárás kiküszöböli az egyik változóból a másikba történõ értékmásolás szükségességét. hogy 325 12: ?> 13: </body> 14: </html> A 4. A PHP 4-es kiadásában ezt a viselkedésmódot megváltoztathatjuk. ez a teljesítménybeli növekedés alig érezhetõ.

1. a nyelv pedig mindegyiket némileg más módon kezeli.1. Ezért néhány programozási nyelv megköveteli. A 4.4. rövid leírással és példával. hogy az adattípusokat úgy kezeli. . amely a változó típusát adja meg. A függvényekrõl bõvebben a hatodik órában. példaprogram egy változóhoz négy különbözõ típusú értéket rendel. majd meghívja a gettype() függvényt. A PHP 4 gyengén típusos. A 4. miközben valami teljesen más van benne. táblázat a PHP 4-ben elérhetõ hat fontosabb adattípust tartalmazza. 4. nagyobb méretû programokban zavar forrása lehet.234 "hello" true Leírás Egész szám Lebegõpontos szám Karakterek sorozata. tömbökkel foglalkozó órát 4 Az adattípusok közül a tömböket és az objektumokat késõbbre hagyjuk. a „Függvények” címû részben tanulunk. A PHP vegyes megközelítést használ. Másfelõl. hogy a programozó elõre meghatározza a változótípusát. A változó típusának meghatározására a PHP 4 beépített gettype() függvényét használhatjuk. a gettype() egy karakterlánccal tér vissza. ha egy adott típusú változót várunk egy változóban. másszor esetleg szám lehet bennük.Az alkotóelemek 41 Adattípusok A különféle típusú adatok több-kevesebb helyet foglalnak a memóriában. táblázat Adattípusok Típus Integer Double String Boolean Object Array Példa 5 3. Egyfelõl ez azt jelenti. mintha a típus az adathoz rendelt kiegészítõ információ lenne. ami azt jelenti. Értéke igaz vagy hamis (true vagy false) lehet Objektum. Ha a függvényhívás zárójelei közé változót teszünk. lásd a hetedik. lásd a nyolcadik. hogy a változók rugalmasan használhatók: egyszer karakterlánc. objektumokkal foglalkozó órát Tömb. karakterlánc Logikai változó.

a PHP 4 azonban az angol kifejezéseket használja. double és boolean szavakat. 16: $proba = true. string. . óra 4. // double 15: print "<br>". 13: $proba = 5. Könyvünk ugyan magyar nyelvû.42 4.4. program Változó típusának vizsgálata</title> 4: </head> 5: <body> 6: <?php 7: $proba = 5. 19: ?> 20: </body> 21: </html Az elõbbi program a következõ kimenetet eredményezi: integer string double boolean Az integer egész szám. 11: print gettype( $proba ). // boolean 18: print "<br>". Annak érdekében. // új sor. program Változó típusának vizsgálata 1: <html> 2: <head> 3: <title>4. hanem tizedespont választja el. // string 12: print "<br>". a könyv hátralevõ részében a magyarul kicsit szokatlanul csengõ tizedespont kifejezést használjuk. 14: print gettype( $proba ).0. amelyben nincs tizedesjegy („tizedespont”). Ugyanígy az angol írásmód szerint a szám egészrészét a törtrésztõl nem tizedesvesszõ. A gettype ezért adja meg az integer. vagyis olyan szám. hogy ne follyanak össze a típusnevek 10: $proba = "öt". // integer 9: print "<br>".4. 17: print gettype( $proba ). 8: print gettype( $proba ). hogy ne kövessünk elgépelési hibákat.

// 3 16: settype( $ki_tudja_milyen_tipusu. példaprogramban a 3. // integer 15: print " . A PHP-ben a 4-es változat elõtt nem létezett a boolean típus. mindig aposztrófok (') vagy macskakörmök (") közé kell azokat tennünk. vesszõvel elválasztva. 17: print gettype( $ki_tudja_milyen_tipusu ).$ki_tudja_milyen_tipusu<br>". vagyis double) olyan típusokká alakítjuk.14-et (lebegõpontos szám.$ki_tudja_milyen_tipusu<br>".0 19: settype( $ki_tudja_milyen_tipusu. amely tartalmazhat tizedespontot. 20: print gettype( $ki_tudja_milyen_tipusu ). a true (igaz) és a false (hamis) egyikét veheti fel.5.14 13: settype( $ki_tudja_milyen_tipusu. // double 9: print " .$ki_tudja_milyen_tipusu<br>". "integer" ). valamint a változó új típusát a zárójelek közé kell tennünk. A double lebegõpontos szám. // 3. mely típusokat ebben a fejezetben részletesen tárgyalunk.Az alkotóelemek A string karakterek sorozata.5. Ha programunkban karakterláncokkal dolgozunk. 43 Típus módosítása a settype() segítségével A PHP a változó típusának módosítására a settype() függvényt biztosítja.14 10: settype( $ki_tudja_milyen_tipusu. 4.14. A boolean a két logikai érték. A 4. program Változó típusának módosítása a settype() függvény segítségével 1: <html> 2: <head> 3: <title>4. // double 18: print " . // 3. hogy a megváltoztatandó típusú változót. 11: print gettype( $ki_tudja_milyen_tipusu ).5. 8: print gettype( $ki_tudja_milyen_tipusu ). vagyis olyan szám. // boolean 21: print " . // 1 4 . A settype()-ot úgy kell használnunk. 14: print gettype( $ki_tudja_milyen_tipusu ). // string 12: print " . Ott is használhattuk a true értéket.$ki_tudja_milyen_tipusu<br>". "double" ). de azt az értelmezõ egyszerûen integer típusú 1-re fordította. "string" ).$ki_tudja_milyen_tipusu<br>". program Változó típusának módosítása a settype() függvény segítségével</title> 4: </head> 5: <body> 6: <?php 7: $ki_tudja_milyen_tipusu = 3. // 3. "boolean" ).

14" karakterláncot egésszé alakítjuk. a kimeneten 1-et látunk. program Változó típusának módosítása típusátalakítás segítségével</title> 4: </head> 5: <body> 6: <?php 7: $ki_tudja_milyen_tipusu = 3. hogy az átalakítás során az eredeti változó típusa és értéke változatlan marad. míg a false értékû változók semmilyen kimenetet nem eredményeznek. óra 4.14 . 8: $tarolo = ( double ) $ki_tudja_milyen_tipusu. hogy a típus módosítása sikerült. 4. míg a settype() alkalmazása során az eredeti változó típusa és értéke az új adattípus értelmezési tartományához idomul. program ezt hivatott illusztrálni. hogy az utolsó kiíratás miért eredményezett 1-et. hogy a $ki_tudja_milyen_tipusu változónak még akkor is 3 az értéke. akkor ha a változó értéke true.6. a tizedespont utáni információ elvész. program (folytatás) 22: ?> 23: </body> 24: </html> A típusmódosítás után minden esetben a gettype() függvényt használtuk. A 4.6. Amikor a "3. hogy meggyõzõdjünk arról. majd kiírjuk a $ki_tudja_milyen_tipusu nevû változó értékét a böngészõbe. Ezért történhet meg.5. // 3. A végén a $ki_tudja_milyen_tipusu változót logikai típusúvá alakítottuk. program Változó típusának módosítása típusátalakítás segítségével 1: <html> 2: <head> 3: <title>4. Típus módosítása típusátalakítással A változó neve elé zárójelbe írt adattípus segítségével a változó értékének általunk meghatározott típusúvá alakított másolatát kapjuk. 9: print gettype( $tarolo ) .$tarolo<br>".14.44 4. Az ilyen átalakításoknál a 0-tól különbözõ számok értéke – akárcsak a nem nulla hosszúságú karakterláncoké – mindig true lesz. A lényegi különbség a settype() függvény és a típusátalakítás között. // double 10: print " . Így már érthetõ.6. Amikor a PHP-ben kiírunk egy logikai változót. amikor újból lebegõpontos számmá alakítjuk.

amely általában új értéket eredményez. program (folytatás) 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: $tarolo = ( string ) $ki_tudja_milyen_tipusu. ÚJDONSÁG Az operátor (mûveletjel) jel vagy jelsorozat. ÚJDONSÁG . valamilyen mûveletet végezhetünk. print gettype( $tarolo ). // 3 $tarolo = ( double ) $ki_tudja_milyen_tipusu. // string print " . // boolean print " . a 4. print gettype( $tarolo ). // integer print " .14 $tarolo = ( boolean ) $ki_tudja_milyen_tipusu. // 3. A mûveletjelek (operátorok) olyan jelek.Az alkotóelemek 45 4.$tarolo<br>". hogy egy vagy több értékbõl egy új értéket hozzunk létre. Az operandus egy érték. ha a tárolt adatokkal nem végezhetünk mûveleteket. melyek lehetõvé teszik.$tarolo<br>".14 $tarolo = ( integer ) $ki_tudja_milyen_tipusu. az végig lebegõpontos szám marad. meghatározhatjuk.5.$tarolo<br>". Egy mûveletjelhez általában két operandus tartozik. Egy programozási nyelv azonban nem túl hasznos. amelyet a mûveletjellel kapcsolatban használunk. 4 Mûveletjelek és kifejezések Most már képesek vagyunk adatokat helyezni változóinkba. sõt meg is változtathatjuk egy változó típusát.$tarolo<br>". amellyel a mûveletet végezzük. Az értéket. // 3. Csupán másolatokat hozunk létre. példaprogrammal ellentétben az eredeti változóban semmilyen információt nem veszítünk el. amelyek az általunk meghatározott típusúvá alakulnak és az új érték kerül aztán a $tarolo nevû változóba. // double print " . // 1 ?> </body> </html> A $ki_tudja_milyen_tipusu változó típusát a program egyik pontján sem változtattuk meg. print gettype( $tarolo ). print gettype( $tarolo ).6. amelyek azon mûveleteket jelzik. operandusnak hívjuk. Mivel a $ki_tudja_milyen_tipusu másolatával dolgozunk. amelyet ha értékek összekapcsolására használunk.

$nev = "Kõmûves Kelemen". hogy a "Kõmûves Kelemen" szöveget a $nev változóhoz rendeli. hogy még a legelemibb kifejezéseket is mûveletjelek segítségével hozzuk létre. az egyenlõségjelbõl (=). de valójában a kifejezés. a 4+5 kifejezés pedig két további kifejezésre (4 és 5) és egy operátorra bontható. a kifejezésnek nem kell szükségszerûen operátort tartalmaznia. hogy a hozzárendelés csak a $nev értékét változtatja meg. amely a hozzárendelõ mûveletjelbõl áll. kifejezésnek tekint. Jelentése: a mûveletjel jobb oldalán álló kifejezés értékét hozzárendeljük a bal oldali operandushoz. Az operandusok és mûveletjelek együttesét kifejezésnek hívjuk. Annak ellenére. Általánosságban azt mondhatjuk. ideje megismerkednünk a PHP 4 alapvetõ mûveleteivel. Most. Valójában a PHP mindent. értékek és mûveletjelek olyan együttese. mindig a jobb oldalon álló kifejezés értékének másolatát adja vissza. Az összeadó operátor (+) végez rajtuk mûveletet és ez szolgáltatja a 9 értéket. A mûveletjelek többsége két operandus között helyezkedik el. például az 543. A $nev változó ekkor a "Kõmûves Kelemen" szöveget fogja tartalmazni. utasítás kiírja a böngészõbe. akkor az kifejezés. hogy "Kõmûves Kelemen". ÚJDONSÁG A kifejezés a függvények. Elsõ látásra úgy tûnik. Hozzárendelés Már találkoztunk a hozzárendelõ mûveletjellel. hogy ha értékként használhatunk valamit. Így a print ( $nev = "Kõmûves Kelemen" ). amely értéket határoz meg.46 4. Így az állandók. Érdekes módon. azon felül. A hozzárendelõ operátor egyetlen karakterbõl áll. óra Kapcsoljunk össze két operandust és hozzunk létre egy új értéket: 4 + 5 Itt a 4 és az 5 az operandusok. mint a $felhasznalo és a függvényhívások. ami értéket határoz meg. például a gettype() is kifejezések. hogy az alapelveket tisztáztuk. bár az óra késõbbi részében látni fogunk néhány kivételt is. változók. valahányszor értéket adtunk változóinknak. . ez az értékadás maga is egy kifejezés.

További hozzárendelõ mûveletek Annak ellenére. Mindkét operandust karakterláncnak tekintve. A 4. hogy valójában csak egy hozzárendelõ mûvelet van. " Zita" kifejezés értéke: "Para Zita" Az elemek típusuktól függetlenül karakterláncként értékelõdnek ki és az eredmény is mindig karakterlánc lesz. a kivonó mûveletjel a jobb oldali operandust kivonja a bal oldaliból. a PHP 4 számos további mûveletjelet biztosít.333333333333 30 1 4 Összefûzés Az összefûzés jele a pont (. Az összeadó mûveletjel hozzáadja a jobb oldali operandust a bal oldalihoz. . 4. táblázat a megfelelõ mûveletjeleket sorolja fel.Az alkotóelemek 47 Aritmetikai mûveletek Az aritmetikai mûveletek pontosan azt teszik.2. a szorzó mûveletjel pedig összeszorozza a bal és a jobb oldali operandusokat. A mûveletek az operandusokat általában nem változtatják meg.2. ez alól azonban a hozzárendelés kivétel. az osztó mûveletjel a bal oldali operandust elosztja a jobb oldalival. táblázat Aritmetikai mûveletek Mûveletjel + / * % Név Összeadás Kivonás Osztás Szorzás Maradék Példa 10+3 10-3 10/3 10*3 10%3 Érték 13 7 3. A maradékképzõ (modulus) mûveletjel a bal és a jobb operandus egész osztásának maradékát adja.). Vagyis a "Para" . amelyek a bal oldali operandust módosítják. a jobb oldali elemet hozzáfûzi a bal oldalihoz. amit elvárunk tõlük.

vagyis értékük true lesz. táblázat a leggyakoribb párosításokat tartalmazza. táblázat minden példájában a $x változó értéke változik meg. A $x = 4. Ha meg szeretnénk vizsgálni. Ezekkel az ötödik órában találkozunk majd.3. $x += 4. A 4. mint az if és while utasítások. Az összetett mûveletjelek megkímélnek minket attól. táblázat Néhány összetett hozzárendelõ mûveletjel Mûveletjel += -= *= /= %= .= Példa $x += 5 $x -= 5 $x *= 5 $x /= 5 $x %= 5 $x . "próba" A 4. a kisebb.3. ha a feltételezett viszony fennáll. hogy két operátort kelljen használnunk és az elgépelés esélyét is csökkentik. mint jelet használhatjuk: $x < 5 .= "próba" Egyenértékû kifejezés $x = $x + 5 $x = $x .5 $x = $x * 5 $x = $x / 5 $x = $x % 5 $x = $x . // $x most 8 például egyenértékû a következõvel: $x = 4.3. $x = $x + 4. 4. Ez a típusú kifejezés az olyan vezérlési szerkezetekben hasznos. Összehasonlítás Az összehasonlító mûveletek az operandusokon vizsgálatokat végeznek. hogy az $x-ben tárolt érték kisebb-e 5-nél. és false. Logikai értékkel térnek vissza. a jobb oldali operandusnak megfelelõen.48 4. óra Az összetett hozzárendelõ mûveletjelek egy hagyományos mûveletjelbõl és az azt követõ egyenlõségjelbõl állnak. // $x most 8 Hozzárendelõ mûveletjelet minden aritmetikai és összefûzõ jelhez kapcsolhatunk. ha nem.

a kifejezés értéke true. Az összehasonlító mûveletjeleket a 4. táblázatban találhatjuk. $x értéke 4. táblázat Összehasonlító mûveletek Mûveletjel == != === !== > >= Név egyenlõ nem egyenlõ azonos nem azonos nagyobb. ha $x értéke 7. 49 4. vagy egyenlõ a bal oldal kisebb a jobb oldalnál a bal oldal kisebb a jobb oldalnál. ha a két érték megegyezik a két érték különbözõ a két érték és típus megegyezik a két érték vagy típus különbözõ a bal oldal nagyobb a jobb oldalnál a bal oldal nagyobb a jobb oldalnál.4. mint nagyobb. true || false A fenti eredménye true. vagy egyenlõ $x < 4 $x <= 4 false true Ezeket a mûveletjeleket többnyire egészekkel vagy lebegõpontos számokkal használjuk. ha bal vagy jobb operandusa true. mint kisebb.4. vagy egyenlõ Példa $x == 5 $x != 5 $x === 5 $x !== 5 $x > 4 $x >= 4 Eredmény false true false true false true 4 < <= kisebb. a kifejezés értéke false lesz. bár az egyenlõség karakterláncok esetében is vizsgálható. vagy egyenlõ Igaz.Az alkotóelemek Ha $x értéke 3. . Bonyolultabb összehasonlító kifejezések létrehozása logikai mûveletek segítségével A logikai mûveletjelek logikai értékeken végeznek mûveleteket. A vagy operátor például true-val tér vissza.

táblázat Logikai mûveletek Mûveletjel || or xor Név vagy vagy kizáró vagy Igaz. ha a bal vagy a jobb operandus igaz a bal vagy a jobb operandus igaz vagy a bal. A zárójeleket azért tettük be. táblázat a logikai mûveleteket sorolja fel. . hogy a gyakorlatban logikai állandókon akarunk mûveleteket végezni. Valószínûtlen azonban.5. 4. hogy két vagy több kifejezést vizsgáljunk meg. Sokkal több értelme van. true && false A fenti értéke false.5. de kisebb.50 4. vagy a jobb operandus igaz. ha mindkét operandusa true. hogy a programkód átláthatóbb legyen. A 4. óra Az és operátor csak akkor ad true-t. ha az $x-ben tárolt érték nagyobb. mint 15. mint 2. Például: ( $x > 2 ) && ( $x < 15 ) Az eredmény itt true. de csak az egyikük Példa true || false true or false true xor true Eredmény true true false && and ! és és tagadás a bal és a jobb operandus is igaz a bal és a jobb operandus is igaz az egyetlen operandus hamis true && false true and false !true false false false Miért kell kétféle vagy és és mûveletjel? A magyarázat a mûveletek kiértékelési sorrendjében rejlik. amelyrõl a fejezet késõbbi részében tanulunk.

ezért a PHP (a C nyelv mintájára) biztosít egy különleges mûveletet. Ez jellemzõen abban az esetben fordul elõ.vagy mínuszjelet ekkor a változó neve elé kell írnunk. amely lehetõséget ad arra. // igaz A fenti példában $x értéke 3. hogyan tehetjük ezt meg. // $x értéke eggyel nõ Az eredmény mindkét esetben $x-be kerül. mint utótagként alkalmazott formáik. Mivel az ilyen típusú kifejezések nagyon gyakoriak. $x++ < 4. Ezeknek utótagként (poszt-inkrementáló és poszt-dekrementáló) és elõtagként (pre-inkrementáló és pre-dekrementáló) használt változata is létezik. hogy az operandus értéke csak a feltétel kiértékelése után változik meg: $x = 3. . Egyrészt lehetõségünk van az összeadó mûveletjellel növelni a változó értékét: $x = $x + 1.Az alkotóelemek 51 Egész típusú változók értékének növelése és csökkentése Amikor PHP-ben programozunk. hogy a változó értéke a kiértékelés elõtt csökkenjen vagy nõjön. a változó értéke eggyel csökken. Már két módját is tanultuk annak. $x++. Miután az összehasonlítás megtörtént. A megfelelõ mûveletjelek a növelõ. amikor a 4-gyel hasonlítjuk össze. gyakran kerülünk olyan helyzetbe. $x értéke eggyel nõ. hogy egy egész típusú változóhoz hozzáadjunk egyet vagy kivonjunk belõle egyet. hogy egy egész típusú változó értékét kell eggyel növelnünk vagy csökkentenünk. amikor egy ciklusban számolunk valamit. illetve csökkentõ operátorok. // $x értéke eggyel nõ 4 Ha hasonló módon két mínuszjelet írunk a változó neve után. Az utótagként használt növelõ mûveletjel a változó neve után írt két pluszjelbõl áll. csak a két plusz. $x-. fontos. Bizonyos körülmények között arra lehet szükség. // $x értéke eggyel nõ De használhatunk összetett értékadó-összeadó mûveletjelet is: $x += 1. // $x értéke eggyel csökken Ha a növelõ vagy csökkentõ mûveletjelet feltételes kifejezésen belül használjuk. Önmagukban ezek a mûveletjelek ugyanúgy viselkednek. Erre szolgálnak az elõtagként használt változatok. így a kifejezés értéke igaz.

a PHP hozzáadja a 4-et az 5-höz. A több mûveletjelet tartalmazó összetettebb kifejezéseknél már bonyolultabb a helyzet. // hamis Ebben a kódrészletben $x értéke eggyel nõ. vagyis az eredmény 14? Ha egyszerûen balról jobbra olvasnánk. mivel a 4 nem kisebb 4-nél. -$x. hogy „add hozzá a négyhez az öt és a kettõ szorzatát”. Mivel a szorzás elsõbbséget élvez az összeadással szemben. így érthetõbbé válik a program és megkíméljük magunkat a hibakeresés fáradalmaitól. De mi a helyzet a következõ esetben? 4 + 5 * 2 Itt már egy problémával találkozunk szembe: a kifejezés azt jelenti. Elõször vegyünk egy egyszerû esetet: 4 + 5 Itt minden tiszta és érthetõ. a változó értékének módosítása a vizsgálat elõtt történik meg. ++$x < 4. A PHP-ben azonban minden mûveletjelhez tartozik egy „elsõbbségi tényezõ” (prioritás). . akkor az elsõ változatot kellene elfogadnunk. hogy elõször az összeadás hajtódjon végre. majd az eredményt szorozd meg kettõvel”. A 4. érdemes zárójeleket használnunk. Természetesen van rá lehetõség.6. így (iskolai tanulmányainkkal összhangban) a második válasz a helyes megoldás.52 ++$x. Erre a zárójelek használata ad lehetõséget: ( 4 + 5 ) * 2 Bármilyen sorrendben értékelõdjenek is ki a mûveletek. hogy kikényszerítsük. 4. add össze õket. $x = 3. A mûveletek kiértékelési sorrendje Az értelmezõ a kifejezéseket általában balról jobbra olvassa. óra // $x értéke eggyel nõ // $x értéke eggyel csökken Ha ezek a mûveletjelek egy nagyobb kifejezés részei. ha hosszú kifejezésekkel dolgozunk vagy nem vagyunk biztosak a dolgunkban. mielõtt összehasonlítanánk 4-gyel. Az összehasonlítás értéke false. táblázatból az ebben az órában tárgyalt mûveletek elsõbbségét tudhatjuk meg (csökkenõ sorrendben). vagyis 18 az értéke? Esetleg azt. hogy „vedd a négyet és az ötöt.

a második kifejezés könnyebben olvasható: $x || $y and $z ( $x || $y ) && $z 4 Állandók A változók rugalmas adattárolási lehetõséget nyújtanak számunkra. define( "ALLANDO_NEVE". Ezt a PHP beépített define() függvénye segítségével tehetjük meg. Az állandó értéke természetesen lehet szám. . mint karakterláncot és az értéket vesszõvel elválasztva a zárójeleken belülre kell írnunk. bármely pillanatban. Ha azonban azt szeretnénk. Az a szokás. annak értékét nem szabad (nem tudjuk) megváltoztatni. így az állandók elérése csupán a név leírásából áll. az and-del szemben pedig elsõbbséget élvez a &&. Ez nem feltétlenül mindig jó ötlet.. így a kisebb prioritású logikai mûveletjeleket használva az összetett logikai kifejezések olvasásmódját módosíthatjuk.6. az or késõbb értékelõdik ki. sõt típusukat is. hogy az állandók neve CSUPA NAGYBETÛBÕL áll. Az állandó nevét. Mûveletjelek ! ++ -.(típusátalakítás) / * % + . Miután az állandót létrehoztuk. Az állandók neve nem tartalmaz dollárjelet. < <= => > == === != !== && || = += -= /= %= . hogy egy adott név alatt tárolt érték ne változzon a program futása során. Megváltoztathatjuk értéküket. karakterlánc vagy logikai típusú is. 42). táblázat A mûveletek elsõbbsége csökkenõ sorrendben. Bár a következõ két kifejezés egyenértékû. mint a || mûveletjel. létrehozhatunk állandókat (konstansokat) is.= and xor or Mint látjuk.Az alkotóelemek 53 4.

óra A 4. Új mûveletjeleket ismertünk meg és megtanultuk.54 4. ?> </body> </html> Figyeljük meg. 4. Ez azért szükséges. hogyan kell azokat összetettebb kifejezésekké összegyúrni. példaprogramban láthatunk egy példát állandók elérésére és használatára. . hogyan kell a változó értékének másolata helyett a változókra hivatkozni. "Virág" ). A __LINE__ az aktuális sor számát tartalmazza. Összefoglalás Ebben az órában végigvettük a PHP nyelv néhány alapvetõ tulajdonságát. Tanultunk a változókról és arról.FELHASZNALO. program Állandó létrehozása 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: <html> <head> <title>4.7. Ezek az állandók hibaüzeneteink kiírásánál hasznosak. mert az értelmezõ nem tudja megkülönböztetni a kettõs idézõjelbe írt egyszerû szöveget az állandók nevétõl. print "Üdvözlöm ". Ilyen például a __FILE__. Minden programban használható állandók A PHP néhány beépített állandót automatikusan biztosít. Megtanultuk azt is. hogy az állandónak a karakterláncba ágyazásakor összefûzést kellett használnunk.7. hogyan kell állandókat létrehozni és használni. hogyan rendelhetünk hozzájuk értéket.7. program Állandó létrehozása</title> </head> <body> <?php define ( "FELHASZNALO". Hallottunk a dinamikus. Az éppen használt PHP változatszámát többek között a PHP_VERSION állandóból tudhatjuk meg. Ez akkor lehet elõnyös. amely az értelmezõ által beolvasott fájl nevét tartalmazza. Végül megtanultuk. ha egy program csak a PHP egy adott változatával futtatható. vagyis „változó” változókról.

Milyen kimenetet eredményez az alábbi programsor? print gettype("4"). Például mielõtt egy matematikai kifejezésben használunk egy változót. mint az $abc12345 nem mondanak semmit a változó programbeli szerepérõl és elgépelni is könnyû azokat. Kvíz 1. . így programunk jobban olvasható lesz és nem kell törõdnünk a kiértékelési sorrenddel. de amikor egy hónap elteltével próbáljuk meg folytatni a program írását. megnézhetjük. Ezt most talán nehéz elhinni. Meg kell tanulnunk a mûveletjelek kiértékelési sorrendjét? Nincs semmi akadálya. hogy megtanuljuk. Ezért érdemes rövid és jellemzõ neveket választanunk. Az ehhez hasonló kérdésekkel kicsit késõbb. 4 Mûhely A mûhelyben kvízkérdések találhatók. hogy a változó típusa behatárolja. bizonyára nem árul el semmit a változó szerepérõl. majd megtapasztaljuk. Az olyan változónevek. de tartogassuk energiánkat fontosabb dolgokra. Használjunk zárójeleket a kifejezésekben. A $fajlnev már sokkal jobb választás. melyek segítenek megszilárdítani az órában szerzett tudást. hogy a program egyszerûen olvasható és érthetõ legyen. Az $f név. Az alábbiak közül melyek NEM lehetnek változónevek? $egy_felhasznalo_altal_elkuldott_ertek $44444444444xyz $xyz44444444444 $______________szamlalo______________ $az elso $fajl-nev 2. Muszáj követnünk a változók nevére vonatkozó szokásokat? A cél mindig az.Az alkotóelemek 55 Kérdések és válaszok Mikor kell tudnunk egy változó típusát? Elõfordul. 3. a tizenhatodik fejezetben foglalkozunk. milyen mûveleteket végezhetünk vele. Hogyan használhatjuk fel az alábbi változót dinamikus változó létrehozására? A változónak adjuk a 4 értéket! Hogyan érhetjük el az új változót? $en_valtozom = "dinamikus". hogy egyáltalán egész vagy lebegõpontos számot tartalmaz-e. A válaszokat az A függelékben helyeztük el. bár rövid.

56 4. 5. settype ( $proba_valtozo. "integer"). Az alábbi kifejezés milyen értéket ad vissza? 5 < 2 Milyen típusú a kérdéses érték? Feladatok 1. Mit ír ki az alábbi néhány sor? $proba_valtozo = 5. Adjunk nekik különbözõ típusú értékeket. Az alábbi sorok melyike nem tartalmaz kifejezést? 4. 5/12. 2. majd használjuk a gettype() függvényt a változók típusainak meghatározására. Rendeljünk értéket két változóhoz. Használjuk az összehasonlító mûveleteket annak eldöntésére. 6. gettype(44). Készítsünk programot. Az elõzõ kérdésben szereplõ sorok melyikében van mûveletjel? 7. amely legalább öt különbözõ változót tartalmaz. óra 4. hogy az elsõ változó értéke • azonos-e a második változó értékével • kisebb-e a második változó értékénél • nagyobb-e a második változó értékénél • kisebb-e a második változó értékénél vagy egyenlõ-e azzal Írassuk ki az összehasonlítások eredményét a böngészõbe! Változtassuk meg a változók értékét és futtassuk le újból a programot! . print $proba_valtozo.4566.

melyek segítségével programunk alkalmazkodhat a körülményekhez. Ebben az órában néhány olyan szerkezettel ismerkedünk meg. hogy bizonyos sorok csak adott feltételek teljesülése mellett hajtódjanak végre? • Hogyan adhatunk meg csak bizonyos feltételek nem teljesülése esetén végrehajtandó mûveleteket? • Hogyan használjuk a switch utasítást. Ez nem biztosít túl nagy teret a rugalmasságnak. mindig ugyanazok az utasítások hajtódtak végre ugyanabban a sorrendben.5. hogy egy kifejezés értékétõl függõen hajtsunk végre utasításokat? • Hogyan ismételjük egy kódrészlet végrehajtását a while utasítás segítségével? • Hogyan készíthetünk elegánsabb ciklusokat a for utasítás segítségével? • Hogyan lépjünk ki a ciklusokból? • Hogyan ágyazzuk egymásba a ciklusokat? . A következõket tanuljuk meg: • Hogyan használjuk az if szerkezetet arra. ÓRA Vezérlési szerkezetek Az elõzõ órában létrehozott programok minden futtatáskor ugyanazt az eredményt adták.

if ( $hangulat == "boldog" ) { print "Hurrá. program Az if utasítás</title> </head> <body> <?php $hangulat = "boldog".1. hogy a programok kimenete bizonyos feltételektõl függhet. A legtöbb programozási nyelvhez hasonlóan a PHP 4-es változata is biztosítja erre a célra az if utasítást. az utasításhoz tartozó programrész végrehajtódik. a blokk egyszerûen figyelmen kívül marad. hogy a PHP oldalak tartalma dinamikussá váljék. // ez a blokk végrehajtódik } Az 5. A lehetõséget. az teszi lehetõvé.1.1. Az if utasítás Az if utasítás kiértékeli a zárójelek közötti kifejezést. Ha a kifejezés értéke igaz. hogy döntéseket hozzanak. példaprogramban csak akkor hajtódik végre az if utáni rész. ha a kifejezés értéke igaz 5. if ( kifejezés ) { // ha a kifejezés értéke igaz.58 5. Ha a kifejezés hamis. Ez teszi lehetõvé a programoknak. program Az if utasítás 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: <html> <head> <title>5. jó kedvem van!". } ?> </body> </html> . óra Elágazások A legtöbb program feltételeket értékel ki és azok eredményének megfelelõen változtatja viselkedését.

Ezt úgy érhetjük el. Egy olyan programblokkot tartalmaz. A következõ két sor így elfogadható: if ( $hangulat == "boldog" ) print "Hurrá. Ha egyeznek.2. ha a $hangulat értéke nem "boldog". amely akkor fut le. ez csak akkor szükséges. Ha a $hangulat értékét "szomorú"-ra változtatjuk és újból lefuttatjuk programunkat. majd az alternatív programrészt. amely akkor hajtódik végre. ha az if kifejezéstõl függõen több utasítást akarunk végrehajtani. jó kedvem van!". a kifejezés értéke igaz. amely akkor kerül // végrehajtásra. hogy legyen egy olyan alternatív programrész. gyakran szeretnénk.Vezérlési szerkezetek A $hangulat változó értékét a "boldog"-gal az összehasonlító mûveletjel (==) segítségével hasonlítottuk össze.1. 5 5. program Az else ággal kiegészített if utasítás</title> 4: </head> . hogy az if utasítás programrésze után kiírjuk az else kulcsszót. program Az else ággal kiegészített if utasítás 1: <html> 2: <head> 3: <title>5. így a print utasítás nem hajtódik végre és programunk nem ad kimenetet. az if kifejezés értéke hamis lesz. amely akkor hajtódik végre.2. ha a feltétel értéke igaz } else { // itt pedig az a programrész található. így az if kifejezéshez tartozó programblokk végrehajtódik. ha a vizsgált feltétel nem igaz. Bár az elõbbi programban a print utasítást kapcsos zárójelek közé zártuk. példaprogram kiegészített változata. A séma a következõ: if (feltétel) { // itt következik az a programrész.2. 59 Az if utasítás else ága Amikor az if utasítást használjuk. // ha a feltétel értéke hamis } Az 5. példaprogram az 5.

60 5. if ( $hangulat == "boldog" ) { print "Hurrá. vagyis az elsõ programrész nem kerül végrehajtásra. A használandó utasításforma a következõ: if ( feltétel ) { // ez a rész akkor fut le. Az else-et követõ programblokk azonban lefut és a böngészõbe a "szomorú vagyok. több kifejezés értékétõl függõen – az if . // és minden elõzõ feltétel hamis } // itt még tetszõleges számú elseif rész következhet . így az if utasítás feltétele hamis lesz. A PHP 4 azonban többre képes: több kifejezés értéke alapján sokféleképp reagálhatunk. program (folytatás) 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: <body> <?php $hangulat = "szomorú". óra 5. jó kedvem van!".". de egy feltétel eredménye alapján még így is csak kétféle dolgot tehetünk. ha a másik feltétel igaz." szöveg kerül.2. } ?> </body> </html> A példában a $hangulat értéke "szomorú". } else { print "$hangulat vagyok. ha a feltétel igaz } elseif ( másik feltétel ) { // ez a rész akkor fut le.else szerkezet segítségével – a programmal mást és mást végeztethetünk. Az if utasítás else ágának segítségével programunkban kifinomultabb döntéseket hozhatunk. nem boldog.elseif . nem boldog. Az if utasítás elseif ága Mielõtt az else ágban alternatív kódrészt adnánk meg. ami persze nem "boldog".

8: if ( $hangulat == "boldog" ) 9: { 10: print "Hurrá. Ha a kifejezés igaz. amely akkor hajtódik végre.3. Ezután a PHP megvizsgálja az elseif kifejezés értékét. ha egyik feltétel sem igaz. amennyi csak jólesik. 5 . 15: } 16: else 17: { 18: print "Sem boldog.3.". a hozzá tartozó programrész nem kerül végrehajtásra. a hozzá tartozó programblokk fut le. hogy a kulcsszót itt elseif-nek hívják! 61 Ha az elsõ feltétel értéke hamis. 11: } 12: elseif ( $hangulat == "szomorú" ) 13: { 14: print "Szomorú vagyok.3. Sõt. program Egy else és elseif ággal bõvített if utasítás</title> 4: </head> 5: <body> 6: <?php 7: $hangulat = "szomorú". ha egyik feltétel sem igaz.". program Egy else és elseif ággal bõvített if utasítás 1: <html> 2: <head> 3: <title>5. 5. példaprogram az elõzõeket egészíti ki egy elseif ággal. ha nincs szükségünk else ágra.Vezérlési szerkezetek else { // ez a rész akkor kerül végrehajtásra. Az 5. az else utáni rész kerül végrehajtásra. ha egyik // feltétel sem volt igaz } A Perl nyelvben gyakorlattal rendelkezõk figyeljenek rá. Annyi elseif-et írhatunk a programba. Végül. hanem $hangulat. sem szomorú nem vagyok. vagyis olyan programrészre. akár el is hagyhatjuk. jó kedvem van!".

62 5. Ez nem azonos a "boldog"-gal. default: // ez történjen. A switch utasítás A switch utasítás egy lehetséges módja annak. // az ördög nem alszik. Az if-et az elseif-fel használva több kifejezés értékétõl tehetjük függõvé. hogy mi történjen. program (folytatás) 19: } 20: ?> 21: </body> 22: </html> A $hangulat értéke itt "szomorú". ezért az elsõ blokk nem kerül végrehajtásra. a break utasítás pedig azt eredményezi. ehhez a feltételhez tartozó programrész hajtódik végre. a switch kifejezését akárhány értékkel összehasonlíthatjuk. hogy egy kódrészletet egy kifejezés értékétõl függõen hajtsunk végre. Mivel az egyenlõség fennáll. Az utánuk írt érték kerül összehasonlításra a switch kifejezésének értékével.3. ha kifejezés értéke érték1 break. ha kifejezés értéke érték2 break. ha a kifejezés értéke // egyik felsorolt értékkel sem egyezett meg break. De nézzük inkább az általános szerkezetet: switch ( kifejezés ) { case érték1: // ez történjen. Ha értékük megegyezik. karakterlánc vagy logikai érték). jobban járunk. Az elseif kifejezés a $hangulat változó értékét hasonlítja össze a "szomorú" szöveggel. Van azonban néhány különbség az imént tanult if és a switch között. hogy a program futása a switch . A switch esetében a program csak egy kifejezést vizsgál meg és annak értékétõl függõen különbözõ sorokat futtat. A switch-hez tartozó programblokkban vannak a case címkék. óra 5. a program ott folytatódik. Az if feltétele csak igaz vagy hamis lehet. case érték2: // ez történjen. ha kitesszük // ezt a “felesleges” break utasítást } A switch utasítás kifejezése gyakran egyszerûen egy változó. A kifejezésnek egyszerû típusnak kell lennie (szám.

Hasonló helyzetekben jusson eszünkbe ez a példa. holnap nem kell dolgozni!<br>". case "Vasárnap": print "Bekapcsolni a vekkert!<br>". break. break. így hasznos. akkor az utána levõ programrész kerül végrehajtásra. a program a következõ case részt is végrehajtja és végül a default utáni rész is lefut. case "Hétfõ": case "Szerda": print "Ma délelõtt dolgozom<br>". default: print "Azt hiszem ideje lenne egy új programozót és/vagy egy jobb naptárat keríteni<br>". A case címkével elkezdett részeket ne felejtsük el break utasításokkal lezárni. Ha ezt nem tesszük meg. Ha a kifejezés értéke egyik elõzõ értékkel sem egyezik és a switch blokkján belül szerepel default címke. Vegyük a következõ kis példát. Elég gyakori azonban. break. mikor kell mennünk dolgozni és az ébresztõóra kezelésében is segít. hogy nem adtuk meg minden case címkénél a break utasítást. } A fenti kis program azt közli. A programot úgy építettük fel.Vezérlési szerkezetek blokkja utáni részre kerül. A legtöbb esetben nem ez a switch kívánatos viselkedése. case "Szombat": print "Hurrá. Ha a break-et elfelejtjük. de néha hasznos is lehet. switch( $hetnapja ) { case "Péntek": print "Kikapcsolni a vekkert. hogy több esetben is ugyanazt a kódot kelljen végrehajtani. a program átlép a következõ case kifejezéshez tartozó programrészre és azt is végrehajtja. szabadnap!<br>". case "Kedd": case "Csütörtök": print "Ma délután dolgozom<br>". break. hogy a kezdõ programozó elfelejti megadni a break utasítást. 63 5 . Ez sokszor bosszantó.

így az ehhez tartozó programrész fog lefutni. A ?: mûveletjel A ?: ternális (háromoperandusú) mûveletjel egy olyan if utasításhoz hasonlít. sem szomorú nem vagyok. program A switch utasítás 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: <html> <head> <title>5.4. } ?> </body> </html> A $hangulat változónak a "szomorú" értéket adtuk.4. A switch utasítás kifejezése ez a változó lesz. break.64 5. a program a következõ case címkére ugrik. A programrész végét a break utasítás jelzi. Az elsõ case címke a "boldog" szöveggel való egyezést vizsgálja.4. break. A visszaadott értéket a vizsgált feltétel határozza meg: ( feltétel ) ? érték_ha_a_feltétel_igaz : érték_ha_a_feltétel_hamis . if-fel megoldott példát alakítja át a switch segítségével. hanem $hangulat. példaprogram a korábbi. case "szomorú": print "Szomorú vagyok. amely értéket is képes visszaadni. .". switch ( $hangulat ) { case "boldog": print "Hurrá. 5.". program A switch utasítás</title> </head> <body> <?php $hangulat = "szomorú". default: prin "Sem boldog. A "szomorú" szöveg megegyezik a $hangulat változó pillanatnyi értékével. Mivel nincs egyezés. jó kedvem van!". óra Az 5.

Segítségükkel elérhetjük. program A ?: mûveletjel használata</title> 4: </head> 5: <body> 6: <?php 7: $hangulat = "szomorú". hogy megmondjuk. majd megnéztük. Erre valók a ciklusok. amíg egy feltétel teljesül.". 65 5. . hogy egy ciklus addig fut. program A ?: mûveletjel használata 1: <html> 2: <head> 3: <title>5. vagy meg nem mondjuk.Vezérlési szerkezetek Ha a vizsgált feltétel igaz. ha hamis. 10: ?> 11: </body> 12: </html> A $hangulat-ot "szomorú"-ra állítottuk. 5 Ciklusok Most már láttuk. a ? és a : közti kifejezés értékét adja.5. a $szoveg változó értéke a : utáni szöveg lesz. Mivel ez nem igaz. hogy fejezõdjön be az ismétlés. Az e mûveletet használó programokat eleinte nehéz megérteni. hányszor kell lefuttatni egy adott programrészt. nem boldog. ha csak két lehetõség közül lehet választani és szeretünk tömör programot írni. hogyan kell döntések eredményétõl függõen különbözõ programrészleteket futtatni.5. 9: print "$szoveg". de a mûvelet hasznos lehet.5. 8: $szoveg = ( $hangulat=="boldog" ) ? “Hurrá. jó kedvem van!" : "$hangulat vagyok. példaprogram ezt a mûveletet használja. akkor a : utánit. Az 5. hogy értéke "boldog"-e. PHP programokkal arra is képesek vagyunk. hogy egyes programrészletek ismétlõdjenek. Szinte kivétel nélkül igaz. hogy egy változó értékét a $hangulat változó értékétõl függõen állítsa be.

6. a hozzá tartozó programrész újból és újból végrehajtódik.6. program A while ciklus 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: <html> <head> <title>5. mint 12. hogy ez a változó mekkora. A while kifejezés feltétele megvizsgálja."<br>". ami hatással lesz a while feltételére. Ez az utasítás rendkívül fontos. program A while ciklus</title> </head> <body> <?php $szamlalo = 1.66 5.($szamlalo*2).6. ha ezt nem tesszük meg. while ( $szamlalo <= 12 ) { print "$szamlalo kétszerese ". A ciklusban a $szamlalo értéke és annak kétszerese kiírásra kerül. mert ha elfelejtjük. } ?> </body> </html> A példában létrehoztuk a $szamlalo nevû változót. a ciklus folytatódik (vagy elkezdõdik). óra A while ciklus A while ciklus szerkezete rendkívül hasonlít az if elágazáséhoz: while ( feltétel ) { // valamilyen tevékenység } Amíg a while feltétele igaz. a while feltétele soha nem lesz hamis. Az 5. példaprogram a while ciklus segítségével írja ki a kettes szorzótáblát. majd a $szamlalo értéke eggyel nõ. a ciklusunk a végtelenségig futni fog. ezért végtelen ciklusba kerülünk. 5. . A programrészen belül általában megváltoztatunk valamit. $szamlalo++. Ha az érték nem nagyobb.

program A do.. ha a feltétel már az elsõ végrehajtáskor hamis. ?> </body> </html> 5 A do. A programrész mindig legalább egyszer lefut. ezért a böngészõben egy sor kiírásra kerül. hogy a $szam változó értéke 200 és 400 között van-e. mégpedig a feltétel kiértékelése elõtt. Ez a ciklus akkor lehet hasznos.7... A lényegi különbség abban van.. do { print "Végrehajtások száma: $szam<br>\n".while ciklus A do.. hogy a ciklushoz tartozó programrész még akkor is legalább egyszer lefusson.. program A do.7.while ciklus feltételét tartalmazó zárójel után mindig ki kell tenni a pontosvesszõt.while szerkezet egy alkalmazását mutatja be. } while ( $szam > 200 && $szam < 400 ).while ciklus megnézi. hogy ebben a szerkezetben elõször hajtódik végre a kód és csak azután értékelõdik ki a feltétel: do { // végrehajtandó programrész } while ( feltétel ). 5.while ciklus 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: <html> <head> <title>5. Ennek ellenére a programblokk egyszer végrehajtódik. ha mindenképpen szeretnénk.while ciklus</title> </head> <body> <?php $szam = 1.Vezérlési szerkezetek 67 A do. példaprogram a do. így a feltétel hamis. .7. Az 5.. Mivel a $szam változónak az 1 kezdeti értéket adtuk. A do. $szam++.while ciklus kicsit hasonlít a while-hoz.

biztonságosabb módon közelíthetjük meg ugyanazt a problémát. Az elsõ kifejezés rendszerint egy számlálónak ad kezdeti értékét. a számláló_növelése és a változó_hozzárendelése paraméterek helyére bármilyen érvényes PHP állítás írható. while ( feltétel ) { // a végrehajtandó programblokk számláló_növelése. majd a while kifejezése megvizsgálta ennek a változónak az értékét. példaprogram az 5. Ez tömörebb programot eredményez és ritkábban fordulhat elõ. Az 5. program A for ciklus használata</title> </head> <body> <?php . hogy a változót elfelejtjük növelni. 5. A feltétel.6. A for ciklus használatával azonban sokszor takarosabb. a harmadik egy számlálót növelõ utasítás. } A zárójelekben levõ kifejezéseket pontosvesszõvel kell elválasztanunk egymástól. for ( változó_hozzárendelése. a második egy feltétel. ami végtelen ciklust okoz.8. Korábban – az 5. A kezdõk bánjanak óvatosan ezzel a lehetõséggel. hogy folytatódik-e a ciklus.8. óra A for ciklus A for semmi újat nem nyújt a while ciklushoz képest. számláló_növelése) { // a végrehajtandó programblokk } Az ezt megvalósító egyenértékû while: változó_hozzárendelése.8. feltétel.68 5. példaprogram for ciklusos megoldása.6. A for ciklus mindezt egyetlen sorban teszi lehetõvé. ami alapján eldõl. program A for ciklus használata 1: 2: 3: 4: 5: 6: <html> <head> <title>5. Végül a változó értékét a ciklus végén eggyel növeltük. példaprogramban – létrehoztunk egy változót a while cikluson kívül.

( $szamlalo * 2 ). a ciklus végrehajtódik. A break utasítás lehetõvé teszi.8. példaprogram egy egyszerû for ciklusból áll. majd rögtön utána a feltétel kiértékelése. hogy egy beépített feltételes kifejezés segítségével kilépjünk belõlük. így a ciklus egészének logikája elsõ látásra világos. Ha a feltétel igaz. megtörténik az értékadás. A for zárójelében az elsõ utasítás a $szamlalo változót egyre állítja. A feltételes kifejezés megnézi. A folyamat addig folytatódik.9. és az 5. amíg a feltétel hamissá nem válik.9.8.6. 5 5. program A for ciklus használata 2. Mivel a $szamlalo nevû változó létrehozása és módosítása egy sorban van. példaprogram kimenete teljesen azonos. hogy a $szamlalo értéke nem nagyobb-e. program (folytatás) 7: for ( $szamlalo = 1. Az utolsó kifejezés a $szamlalo-t eggyel növeli. Az 5. majd a $szamlalo értéke eggyel nõ és a feltétel kiértékelése újból végrehajtódik. 10: } 11: ?> 12: </body> 13: </html> Az 5.</title> 4: </head> 5: <body> 6: <?php . Ciklus elhagyása a break utasítás segítségével A while és for ciklusok lehetõséget biztosítanak arra. amely egy nagy számot egy egyre növekvõ számmal oszt el és a mûvelet eredményét meg is jeleníti. $szamlalo <= 12. hogy más feltételektõl függõen megszakítsuk egy ciklus futását. Amikor a program a for ciklushoz ér. program Egy for ciklus.Vezérlési szerkezetek 69 5. egyre növekvõ számmal osztja el 1: <html> 2: <head> 3: <title>5. Ez jó lehet például hibakezeléskor vagy hibák megelõzésekor. A for ciklus használata a programot összefogottabbá tette."<br>". $szamlalo++ ) 8: { 9: print "$szamlalo kétszerese ". amely a 4000-et tíz.9. mint 12.

program A break utasítás használata 1: <html> 2: <head> 3: <title>5. program (folytatás) 7: 8: 9: 10: 11: 12: 13: 14: for ( $szamlalo=1. $szamlalo <= 10. print "4000 $szamlalo részre osztva $seged. 13: print "4000 $szamlalo részre osztva $seged. hogy a $szamlalo nem nagyobb-e. óra 5.70 5. példaprogram ezt azzal védi ki. 8: for ( . A for utasítás feltételes kifejezése ellenõrzi.10. Az 5. program A break utasítás használata</title> 4: </head> 5: <body> 6: <?php 7: $szamlalo = -4. Vegyük az elsõ esetet: változtassuk meg a $szamlalo kezdõértékét 1-rõl -4-re. } ?> </body> </html> A példában a $szamlalo nevû változónak az 1 kezdeti értéket adjuk. 14: } 15: ?> 16: </body> 17: </html> . ha a $szamlalo értéke a felhasználótól származik? A változó értéke lehet negatív szám vagy akár szöveg is. $szamlalo <= 10. 12: $seged = 4000/$szamlalo. hogy a ciklus futását befejezi. $szamlalo++ ) { $seged = 4000/$szamlalo. A ciklus belsejében a 4000-et elosztjuk a $szamlalo-val és az eredményt kiírjuk a böngészõbe.<br>". 5. Így a ciklusmag ötödik futtatása során nullával kellene osztani. mint 10. Ez elég célratörõnek tûnik. De mi a helyzet akkor. ha a $szamlalo változóban a nulla érték van. $szamlalo++ ) 9: { 10: if ( $szamlalo == 0 ) 11: break.<br>".10.9.10. ami nem elfogadható.

amikor a $szamlalo értéke „kívülrõl” származik. Egy if utasítással megvizsgáljuk a $szamlalo értékét. 13: print "4000 $szamlalo részre osztva $seged. azonnal kilépünk a ciklusból. hogy olyan helyzetet utánozzunk. $szamlalo <= 10. a program ekkor a for ciklus utáni sorokat kezdi feldolgozni. 12: $seged = 4000/$szamlalo. hogy a pontosvesszõket mindig kiírjuk. hogy a $szamlalo-t a cikluson kívül hoztuk létre. Az 5. példaprogramban a nullával való osztást úgy kerüljük el.10. 14: } . Következõ ismétlés azonnali elkezdése a continue utasítás segítségével A continue utasítás segítségével az éppen folyó ismétlést befejezhetjük. példában a break utasítás használata kicsit drasztikus volt. Ha nullával egyenlõ. csak egy figyelmeztetõ üzenet jelenik meg a böngészõben. program A continue utasítás használata 1: <html> 2: <head> 3: <title>5.Vezérlési szerkezetek 71 A nullával való osztás nem eredményez végzetes hibát a PHP 4ben.11.11.<br>".11. program A continue utasítás használata</title> 4: </head> 5: <body> 6: <?php 7: $szamlalo = -4. mégpedig úgy. Figyeljük meg. A for ciklus fejébõl bármelyik kifejezés elhagyható. például egy ûrlapról vagy egy adatbázisból. 5 5. hogy ez ne eredményezze az egész ciklusból való kilépést. $szamlalo++ ) 9: { 10: if ( $szamlalo == 0 ) 11: continue. csak a következõ ismétlés kezdetét jelentse. hogy közben programunk nem lép ki az egész ciklusból. 8: for ( . Az 5. de figyelnünk kell arra. A program futása folytatódik.

így furcsa programhibákat idézhetnek elõ. 15: print "</td>\n".11. // sor kezdete a HTML táblázatban 11: for ( $x=1. példaprogramban két egymásba ágyazott for ciklus segítségével egy szorzótáblát írunk ki a böngészõbe. $x<=12. Egymásba ágyazott ciklusok A ciklusok törzsében is lehetnek ciklusok.12. // HTML táblázat kezdete 8: for ( $y=1. ezért óvatosan használandók. // sor vége 18: } . // cella vége 16: } 17: print "</tr>\n". $y<=12. $x++ ) 12: { 13: print "\t<td>". program (folytatás) 15: ?> 16: </body> 17: </html> Itt a break utasítást continue-ra cseréltük. az éppen folyó ismétlés véget ér.12.12. program Két for ciklus egymásba ágyazása 1: <html> 2: <head> 3: <title>5. a programot pedig nehezebben olvashatóvá teszik. ha futási idõben elõállított HTML táblázatokkal dolgozunk. 5. A break és continue utasítások a ciklus logikáját bonyolultabbá. Ha a $szamlalo értéke nullával egyenlõ. Ez a lehetõség különösen hasznos. // cella kezdete 14: print ($x*$y). program Két for ciklus egymásba ágyazása</title> 4: </head> 5: <body> 6: <?php 7: print "<table border=1>\n". Az 5. óra 5. a végrehajtás pedig rögtön a következõre kerül. $y++ ) 9: { 10: print "<tr>\n".72 5.

majd egy újabb for ciklus kezdõdik. 5 Kérdések és válaszok A vezérlési szerkezetek feltételes kifejezéseinek mindenképpen logikai értéket kell adniuk? Végsõ soron igen. de ezt tenni nem célszerû. Végül megtanultuk. Tanultunk a ciklusokról. A legtöbb megtanult szerkezet újból és újból meg fog jelenni a könyv hátralevõ részében. Megtanultuk. ami nulla. program (folytatás) 19: 20: 21: 22: print "</table>\n". // táblázat vége ?> </body> </html> A külsõ for ciklus az $y változónak az 1 kezdeti értéket adja. illetve hogyan hagyhatunk ki egy-egy ismétlést. az utolsó kifejezés pedig biztosítja. üres karakterlánc vagy nem meghatározott változó. és arról. A vezérlési szerkezetekhez tartozó programblokkot mindig kapcsos zárójelbe kell tenni? Ha a programblokk csak egy utasításból áll. amíg a változó nem nagyobb 12-nél. hogyan hozzunk létre if utasításokat. hogy egy kifejezés adott értékei esetén más és más történjen. hogyan egészítsük ki azokat elseif és else ágakkal. hogy a break és a continue utasítások segítségével hogyan léphetünk ki végleg a ciklusból. A ciklus törzsében egy td (table data – táblázatcella) elemet ír ki. .12. minden egyéb true-nak számít.Vezérlési szerkezetek 73 5. hogy $y értéke minden ismétlés után eggyel nõjön. amelybe az $x*$y érték kerül. a kapcsos zárójel elhagyható. hogyan segítenek minket programjaink változatosabbá és rugalmasabbá tételében. hogyan kell ciklusokat egymásba ágyazni és erre gyakorlati példát is láttunk. A ciklus törzse minden ismétlés során kiír egy tr (table row – táblázatsor) HTML elemet. A ciklus addig fog futni. hogyan használjuk a switch utasítást. A belsõ ciklus az $x változó értékét a külsõ ciklushoz hasonlóan végigfuttatja 1-tõl 12-ig. mert ha a programblokkot új utasítással egészítjük ki. Összefoglalás Ebben az órában a vezérlési szerkezetekrõl tanultunk és arról. bár a feltételes kifejezéseknél a kiértékelés szempontjából minden. Az eredmény egy ízlésesen formázott szorzótábla lesz. pontosabban a while és a for ciklusokról. Hallottunk arról. véletlenül hibákat idézhetünk elõ. false-nak.

Hogyan készítenénk egy while ciklust. Mûhely A mûhelyben kvízkérdések találhatók.74 5. ha az $eletkor változó értéke 1 és 17 között van? 3. Hogyan egészíthetnénk ki az elsõ kérdésbeli programunkat úgy. amely kiírja az 1 és 49 közötti páratlan számokat? 4. hogy az "Üzenet gyerekeknek" jelenjen meg akkor. tömbökkel foglalkozó órában találkozunk még a foreach ciklussal is. a hetedik. Hogyan használnánk az if vezérlési szerkezetet olyan program írására. az "Általános üzenet" szöveg jelenjen meg a böngészõben. melynek segítségével egy tömb elemein haladhatunk végig. Nézzük végig a vezérlési szerkezetek utasításformáját! Gondoljuk végig. óra Ez az óra bemutatta az összes ciklust? Nem. Hogyan valósítanánk meg az elõzõ kérdésbeli programot for ciklus segítségével? Feladatok 1. az "Üzenet fiataloknak" szöveget írja ki? Ha az $eletkor értéke bármi más. hogy ha az $eletkor változó értéke 18 és 35 között van. melyek segítenek megszilárdítani az órában szerzett tudást. 2. Kvíz 1. hogyan lehetnek ezek a szerkezetek a segítségünkre! 2. Nézzük meg a ?: mûveletet! Miben különbözik ez a többi vezérlési szerkezettõl? Mikor lehet hasznos? . A válaszokat az A függelékben helyeztük el.

ÓRA Függvények A függvény a jól szervezett program lelke. mert a programot könnyen olvashatóvá és újrahasznosíthatóvá teszi. hogyan kímélhetnek meg minket az ismétlõdésekbõl adódó pluszmunkától. Függvények nélkül a nagy programok kezelhetetlenek lennének. Az órában a következõket tanuljuk meg: • Hogyan hozhatunk létre függvényeket? • Hogyan adjunk át a függvényeinknek értékeket és hogyan kapjuk meg tõlük az eredményt? • Hogyan hívjunk meg függvényeket dinamikusan.6. változóban tárolt karakterlánc segítségével? • Hogyan érjük el a függvényekbõl a globális változókat? • Hogyan érjük el. Ebben az órában a függvényeket tanulmányozzuk és mutatunk rá néhány példát. hogy függvényeinknek „emlékezete” legyen? • Hogyan adjunk át a függvényeknek hivatkozásokat? .

a hívónak egy értéket ad vissza. egyaránt helyes megoldások. akkor esetleg készít vagy beszerez egy süteménysütõ gépezetet. Ez egy különleges függvény. hogy paramétereit nem kell zárójelbe tenni. önálló kódrészlet. Amikor a függvény véget ér. A gép a bele töltött nyersanyagokkal addig dolgozik. maga süti meg. hogy rövidebb lesz a függvény használatával. feldolgozza azokat és végez velük valamit (például kiírja az eredményt a böngészõbe) vagy visszaad egy értéket. a függvény törzse lefut. amíg a kívánt terméket elõ nem állítja vagy el nem éri kitûzött célját. amit mérlegelnünk kell.76 6. melyet programunkból meghívhatunk. Mûködésükhöz szükségük lehet információkra és többnyire értéket adnak vissza. De ha több ezret. az. a legfontosabb szempont. esetleg mindkettõt. hogy az ismétlõdések csökkentésével akkorává zsugorodike a program. Szinte az összes többi függvénynél kötelezõ a zárójel. amely nem közvetlenül hajtódik végre. Ha a kedves Olvasónak egy süteményt kell csinálnia. hogy függvényt írunk. A függvény valójában egy zárt. Hasonlóképp. A függvénynek feldolgozás céljából értékeket adhatunk át. Amikor meghívjuk. A PHP 4-ben rengeteg beépített függvény van. ÚJDONSÁG A függvény olyan kódrészlet. óra Mit nevezünk függvénynek? A függvényt egy gépnek tekinthetjük. akár kell paramétert átadnunk. A függvények lehetnek beépítettek vagy felhasználó által megadottak. amikor elhatározzuk. akár nem. Függvények hívása Kétféle függvény létezik: a nyelvbe beépített függvény és az általunk létrehozott függvény. ahol épp szükség van rá. A könyv legelsõ PHP oldala egyetlen függvényhívásból állt: print ("Hello Web!"). és print "Hello Web!". A függvény értékeket vesz át tõlünk. hanem a programból hívhatjuk meg: onnan. . A print abból a szempontból nem jellegzetes függvény. A print ("Hello Web!").

A legtöbb függvény. 8: $ujszam = abs( $szam ). hogy van visszatérési értéke. 9: print $ujszam. Néhány függvénynek több paramétert kell átadni. A paramétereket vesszõvel választjuk el. ha nincs „értelmes” visszatérési értéke.1. A program a karakterlánc kiírását hajtja végre. Ha a függvénynek információt szeretnénk átadni. ÚJDONSÁG A paraméter a függvénynek átadott érték.1. azt a függvény utáni zárójelbe tesszük. // kiírja. Az információt. információt ad arról. ha sikeres volt). A print() abból a szempontból tipikus függvény. valamilyen_fuggveny ( $elso_parameter. A paramétereket a függvényhívás zárójelén belülre kell írnunk. A függvényhívás egy függvénynévbõl (ebben az esetben ez a print) és az utána tett zárójelekbõl áll. program A beépített abs() függvény használata 1: <html> 2: <head> 3: <title>6. Ha több paramétert kell átadnunk. amit ily módon adunk át a függvénynek. A print() visszatérési értéke logikai típusú (true. Az abs() függvény például egy szám típusú paramétert vár és a paraméter abszolútértékét adja vissza. az egyes paramétereket vesszõvel kell elválasztanunk egymástól. példaprogrammal! 77 6.1. Próbáljuk is ki a 6. paraméternek hívjuk. hogy munkáját sikeresen befejezte-e.Függvények A fenti példában a print() függvényt a "Hello Web!" szövegparaméterrel hívtuk meg. program A beépített abs() függvény használata</title> 4: </head> 5: <body> 6: <?php 7: $szam = -321. A paraméterek a függvényeken belül helyi (lokális) változóként érhetõk el. hogy "321" 10: ?> 11: </body> 12: </html> 6 . $masodik_parameter ).

majd átadtuk az abs() függvénynek. $parameter2 ) { // itt van a függvény törzse } A function kulcsszót a függvény neve követi. majd egy zárójelpár. Függvények létrehozása Függvényt a function kulcsszó segítségével hozhatunk létre: funcion valamilyen_fuggveny( $parameter1. 6. Ezt az új értéket rendeljük az $ujszam nevû változóhoz és kiírjuk az eredményt. A felhasználó által megírt függvényeket teljesen hasonló módon kell meghívnunk. amely elvégzi a szükséges számításokat és visszaadja az eredményt. Ha a függvény paramétereket igényel. az abs() függvényt adva közvetlenül a print() paramétereként: print( abs( -321 ) ). A 6. óra Ebben a példában a $szam nevû változóhoz a -321-es értéket rendeltük. A változók értékei a függvényhíváskor átadott paraméterek lesznek. példaprogram egy függvényt hoz létre. program Függvény létrehozása</title> </head> <body> <?php function nagyHello() { print "<h1>HELLO!</h1>". A zárójelpárt akkor is ki kell írni. a zárójelbe vesszõvel elválasztott változókat kell tenni.2. ha a függvény nem vesz át paramétereket.2.2. ?> </body> </html> . program Függvény létrehozása 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: <html> <head> <title>6. A feladatot megoldhattuk volna segédváltozók segítsége nélkül is. } nagyHello().78 6.

példaprogramban olyan függvényt láthatunk.3. 14: ?> 15: </body> 16: </html> 6. 10: } 11: sorKiir("Ez egy sor"). Bár a nagyHello() mûködõ függvény. amely egy paramétert fogad és valami hasznosat csinál vele. mégsem túl hasznos.1. A programban egy olyan nagyHello() nevû függvényt hoztunk létre. majd egy <br> HTML elemet ír ki.Függvények A fenti program egyszerûen kiírja a "HELLO" szöveget egy <H1> HTML elemben. 12: sorKiir("Ez már egy másik sor"). amely nem vesz át paramétereket. 6 .3. A 6. amely egy karakterláncot. program Egy paramétert váró függvény létrehozása 1: <html> 2: <head> 3: <title>6.3. program Egy paramétert váró függvény létrehozása</title> 4: </head> 5: <body> 6: <?php 7: function sorKiir( $sor ) 8: { 9: print ("$sor<br>\n"). 13: sorKiir("Ez megint egy új sor"). ábra Függvény. Ezért hagytuk üresen a zárójelpárt. 79 6.

4. A sorKiir() függvény egy karakterláncot vár. 10: return $eredmeny. ábrán láthatjuk.1. hogy a print() függvénnyel oldanánk meg a problémát. A return befejezi a függvény futtatását és az utána írt kifejezést küldi vissza a hívónak. program Visszatérési értékkel rendelkezõ függvény</title> 4: </head> 5: <body> 6: <?php 7: function osszead( $elsoszam. az kerül a $sor nevû változóba. Amit a sorKiir() függvény zárójelei közé teszünk. ehhez a return utasításra van szükség. 6.3. ahelyett. óra A 6. A függvény törzsében kiírjuk a $sor nevû változót. program Visszatérési értékkel rendelkezõ függvény 1: <html> 2: <head> 3: <title>6.4. példaprogramban létrehozunk egy függvényt. példaprogram kimenetét a 6. A 6.5).4. hogy "8" 13: ?> 14: </body> 15: </html> . amely két szám összegével tér vissza.80 6. $masodikszam ) 8: { 9: $eredmeny = $elsoszam + $masodikszam. Függvények visszatérési értéke A függvényeknek visszatérési értéke is lehet. ezért tettük a $sor nevû változót a zárójelbe. // kiírja. akkor meghívhatjuk a sorKiir() függvényt. ne csak a kimenet). majd egy <br> elemet és egy újsor karaktert (hogy a HTML kód is olvasható legyen. 11: } 12: print osszead(3. Ha most ki szeretnénk írni egy sort a böngészõbe. így nem kell a sorvégi jeleket minden sor kiírásakor begépelnünk.

Az osszead() függvényt két paraméterrel kell meghívni (itt a két paraméter a 3 és az 5 volt). vagy akár egy másik függvény visszatérési értéke is: return ( masik_fuggveny( $parameter ) ). program Dinamikus függvényhívás</title> </head> <body> <?php . A visszatérési érték átadásának módja többféle lehet. példaprogramon keresztül próbálhatjuk ki. az csak a függvény futtatásának befejezését eredményezi. Ezek az $elsoszam és a $masodikszam nevû változókban tárolódnak. Ha semmit sem adunk meg a return után. program Dinamikus függvényhívás 1: 2: 3: 4: 5: 6: <html> <head> <title>6. Az érték lehet elõre „beégetett” return 4. 81 Dinamikus függvényhívások Lehetõségünk van rá. Az $eredmeny nevû segédváltozó használatát kiküszöbölhetjük: function osszead( $elsoszam.5. $masodikszam ) { return ( $elsoszam + $masodikszam ). Ezt a 6. mint ha maga a függvény neve lenne. de lehet kifejezés eredménye return ( $a / $b ). Várhatóan az osszead() függvény e két változó eredményét adja össze és tárolja az $eredmeny nevû változóban.5. hogy karakterláncba tegyük egy függvény nevét és ezt a változót pontosan úgy tekintsük. példaprogram a 8-as számot írja ki.4. 6 6.5.Függvények A 6. vagy esetleg „semmit”. } A return segítségével értéket és objektumot is visszaadhatunk.

} $fuggveny_tarolo = "koszon". Ha ezt megtettük.6. A dinamikus függvényhívás akkor igazán hasznos. Más szavakkal: a változó a függvényen kívülrõl vagy más függvényekbõl nem lesz elérhetõ. . A PHP beépített függvényei még hasznosabbá teszik ezt a lehetõséget. Miért jó ez? A fenti példában csak még több munkát csináltunk magunknak azzal. a változót arra használhatjuk. hogy a tömb minden elemére meghívja a függvényt. példaprogramban létrehozunk egy változót a függvényen belül. ha a program folyását bizonyos körülményektõl függõen változtatni szeretnénk. program (folytatás) 7: 8: 9: 10: 11: 12: 13: 14: 15: function koszon() { print "Jó napot!<br>". ?> </body> </html> Itt a $fuggveny_tarolo változóhoz a koszon() függvény nevével azonos karakterláncot rendeltünk. óra 6. Ezt a paramétert feldolgozhatjuk és értékétõl függõen más és más függvényt hívhatunk meg.5. Az array_walk() alkalmazására a tizenhatodik órában láthatunk példát. hogy véletlenül két függvény felülírja azonos nevû változóik tartalmát.82 6. hogy a "koszon" karakterláncot rendeltük a $fuggveny_tarolo nevû változóhoz. Változók hatóköre A függvényben használt változók az adott függvényre nézve helyiek maradnak. csupán zárójeleket kell tennünk a változó neve után. majd megpróbáljuk kiíratni a függvényen kívül. Például szeretnénk mást és mást csinálni egy URL-kérés paraméterétõl függõen. Nagyobb projektek esetén ez megóvhat minket attól. A 6. $fuggveny_tarolo(). hogy meghívja nekünk a koszon() függvényt. Az array_walk() függvény például egy karakterláncot használ arra.

program Változók hatóköre: A függvényen belül létrehozott változó a függvényen kívülrõl nem elérhetõ 1: <html> 2: <head> 3: <title>6. példaprogram kimenetét a 6. . Hasonlóképp.6. a függvényen kívül meghatározott változó nem érhetõ el automatikusan a függvényen belülrõl. ábrán láthatjuk. program Változók hatóköre: A függvényen belül létrehozott változó a függvényen kívülrõl nem elérhetõ</title> 4: </head> 5: <body> 6: <?php 7: function proba() 8: { 9: $probavaltozo = "Ez egy proba valtozo". 6 A 6. Figyeljük meg.6. 12: ?> 13: </body> 14: </html> 6.2 ábra Kísérlet függvényen belüli változóra hivatkozásra.6. 10: } 11: print "proba valtozo: $probavaltozo<br>".2. A $probavaltozo értéke nem íródik ki. hogy ilyen nevû változó a proba() nevû függvényen kívül nem létezik. Ez annak a következménye.Függvények 83 6. hogy a nem létezõ változóra történõ hivatkozás nem eredményez hibát.

Ha mégis megpróbáljuk ezeket használni. 12: } 13: eletErtelme(). példaprogrammal: 6. óra Hozzáférés változókhoz a global kulcsszó segítségével Alapértelmezés szerint a függvényeken belülrõl nem érhetjük el a máshol meghatározott változókat. program A függvényen kívül meghatározott változók a függvényen belül alapértelmezés szerint nem elérhetõk 1: <html> 2: <head> 3: <title>6. Próbáljuk ki ezt a 6. program A függvényen kívül meghatározott változók a függvényen belül alapértelmezés szerint nem elérhetõk</title> 5: </head> 6: <body> 7: <?php 8: $elet = 42. 9: function eletErtelme() 10: { 11: print "Az élet értelme: $elet<br>".3. 14: ?> 15: </body> 16: </html> 6. ábra Globális változó elérési kísérlete függvényen belülrõl .84 6.7.7.7. akkor helyi változót fogunk létrehozni vagy elérni.

program Globális változó elérése a global kulcsszó segítségével</title> 4: </head> 5: <body> 6: <?php 7: $elet=42. amikor a függvény kiírja a változó értékét.8. Mindent figyelembe véve ez egy jó dolog. Megmenekültünk az azonos nevû változók ütközésétõl és a függvény paramétert igényelhet.4. 8: function eletErtelme() 9: { 10: global $elet. példaprogram a global kulcsszóval állítja vissza a világ rendjét.8. program Globális változó elérése a global kulcsszó segítségével 1: <html> 2: <head> 3: <title>6.8.Függvények A 6. Esetenként azonban egy-egy fontos globális (függvényen kívüli) változót anélkül szeretnénk elérni. 12: } 13: eletErtelme(). 14: ?> 15: </body> 16: </html> 6 6. példaprogram kimenetét a 6. Ezt láthatjuk. 11: print "Az élet értelme: $elet<br>". A 6. az eletErtelme() függvény nem tudta elérni az $elet változót.7. 85 6. ahol a global kulcsszónak létjogosultsága van. így az $elet a függvényen belül üres. ábra Globális változó függvénybõl történõ sikeres elérése a global kulcsszó segítségével . Ez az a helyzet. hogy azt paraméterként át kellene adnunk. Amint azt vártuk. ha meg szeretne tudni valamit a „külvilág”-ról. ábrán láthatjuk.3.

a paraméter megváltoztatásának a függvény vége után semmilyen hatása nincs.4. hogy az független és kis tudású függvényekbõl álljon. a függvényen belül a külsõ. használnunk kell a global kulcsszót. Ennek alapján a 6. Ha azonban egy globális változó értékét változtatjuk meg egy függvényen belül. A lehetõ legjobb úgy felépíteni egy programot. Legyünk óvatosak! Ha most az $elet nevû változót a függvényen belül megváltoztatjuk. Ezért a global kulcsszót lehetõleg minél kevesebbszer használjuk.9. A függvénynek átadott paraméter általában valamilyen érték másolata.9. Tulajdonképpen ennek így is kell lennie. amikor a szamozottCimsor() függvényt meghívjuk és eltûnnek. példaprogram kimenetét a 6. Létrejönnek például akkor.8. Miután az eletErtelme() függvényben az $elet változó elé a global kulcsszót tesszük.9. példaprogramhoz hasonlót írhatnánk. ami egy dinamikusan létrejövõ dokumentációt eredményez. hányszor fut le egy adott függvény. Minden függvényben. ábrán láthatjuk. program Változó értékének függvényhívások közti megõrzése a global kulcsszó segítségével</title> 4: </head> 5: <body> 6: <?php . annak a program egészére hatása lesz. ha egy függvénynek lehetne valamilyen kezdetleges memóriája. amikor a függvény futása befejezõdik. 6. hogy tudni szeretnénk. Esetenként azonban jól jönne. Állapot megõrzése a függvényhívások között a static kulcsszó segítségével A függvényen belüli változóknak egészében véve rövid.86 6. program Változó értékének függvényhívások közti megõrzése a global kulcsszó segítségével 1: <html> 2: <head> 3: <title>6. amely globális változót szeretne elérni. akkor az eredeti változót változtattuk meg és nem egy másolatot. de boldog életük van. globális $elet változót érhetjük el. óra A 6. Itt persze használhatnánk a global kulcsszóról újonnan szerzett tudásunkat. Tegyük fel például. Miért? Példánkban a függvény célja számozott címsor készítése.

print("A legjobbak a világon<p>"). A 6. Ez az a pont. szamozottCimsor("Mütyürök").Függvények 87 6. ahogy azt vártuk. function szamozottCimsor( $cimszoveg ) { global $fvHivasokSzama. print("Az alkatrészek széles skáláját gyártjuk<p>"). $fvHivasokSzama++. $cimszoveg</h1>". A változót a függvény számára a global kulcsszó segítségével tettük elérhetõvé. nem tekinthetõk önálló programrésznek. a $fvHivasokSzama változó értéke eggyel nõ. Létrehoztuk a $fvHivasokSzama nevû változót a szamozottCimsor() függvényen kívül. figyelnünk kell az érintett globális változókra. print "<h1>$fvHivasokSzama. példaprogram kimenetét a 6.9. Ez nem igazán elegáns megoldás. } szamozottCimsor("Alkatrészek"). ?> </body> </html> 6. ábra A függvényhívások számának nyomon követése a global kulcsszó használatával Ez úgy mûködik. program (folytatás) 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: $fvHivasokSzama = 0. Valahányszor meghívjuk az szamozottCimsor() nevû függvényt.9. ábrán láthatjuk. ahol a static kulcsszó hasznos lehet. Ha a kódot olvassuk vagy újrahasznosítjuk. majd a megnövelt értékkel a címsort teljessé tesszük. Ha egy függvényen belül egy változót 6 .5. A global kulcsszót használó függvények nem függetlenek.5.

ha a függvény 6. óra a static kulcsszóval hozunk létre. 10: $fvHivasokSzama++.10. példaprogram a 6. 14: print("Az alkatrészek széles skáláját gyártjuk<p>"). Gondoljunk bele például. a $fvHivasokSzama nevû változó kezdeti értéket is kap. példaprogram static kulcsszót használó változata. Amikor a függvényt elõször hívjuk meg.9. program Függvényhívások közötti állapot megõrzése a static kulcsszó használatával 1: <html> 2: <head> 3: <title>6. a programot elegánsabbá és hordozhatóbbá tettük.9. ehelyett az elõzõ futtatáskor megõrzött értéket kapjuk vissza. amelyben van egy $fvHivasokSzama nevû változó. program Függvényhívások közötti állapot megõrzése a static kulcsszó használatával</title> 4: </head> 5: <body> 6: <?php 7: function szamozottCimsor( $cimszoveg ) 8: { 9: static $fvHivasokSzama = 0. a változó az adott függvényre nézve helyi marad. példaprogram kimenete teljesen megegyezik a 6. mi történne akkor. 16: print("A legjobbak a világon<p>"). 11: print "<h1>$fvHivasokSzama. Így a szamozottCimsor() függvényt már beilleszthetjük más programokba és nem kell aggódnunk a globális változók miatt. 6.10.9.10. Másrészt a függvény hívásról hívásra „emlékszik” a változó értékére. 12: } 13: szamozottCimsor("Alkatrészek"). példaprogrambeli változatát egy olyan programba illesztenénk bele. A 6. $cimszoveg</h1>". Ezt a hozzárendelést a függvény további meghívásainál figyelmen kívül hagyja a PHP.88 6. 17: ?> 18: </body> 19: </html> A szamozottCimsor() függvény így teljesen független lett.10. példaprograméval. 15: szamozottCimsor("Mütyürök"). . Bár a 6.

Eddig azt mondtuk. hogyan kell változóinkra mutató hivatkozást átadni a változó értékének másolata helyett. 14: meretez("még több szöveg<BR>". hogyan kell függvényeknek paramétereket átadni. 15: ?> 16: </body> 17: </html> 6 . amely egy karakterláncot egy HTML font elembe zár.3).11. miként lehet a függvényparamétereknek alapértelmezett értéket adni és megtanuljuk azt is. példaprogramban létrehozunk egy hasznos kis függvényt.11. Paraméterek alapértelmezett értéke A PHP nyelv remek lehetõséget biztosít számunkra rugalmas függvények kialakításához. program Két paramétert igénylõ függvény 1: <html> 2: <head> 3: <title>6. program Két paramétert igénylõ függvény</title> 4: </head> 5: <body> 6: <?php 7: function meretez( $szoveg. $meret ) 8: { 9: print "<font size=\"$meret\" face=\"Helvetica.3). ezért a karakterlánc mellé kell egy $meret nevû paraméter is. 13: meretez("újabb szöveg<BR>". 12: meretez("szöveg<br>".Függvények 89 Paraméterek további tulajdonságai Már láttuk. Néhány paramétert elhagyhatóvá téve függvényeink rugalmasabbá válnak. hogy a függvények többsége paramétert igényel.3). Ebben a részben megtanuljuk.Sans-Serif\">$szoveg</font>". 6. hogy megváltoztathassa a font elem size tulajdonságát.Arial. amirõl még nem beszéltünk. 10: } 11: meretez("Egy címsor<br>". de van még néhány hasznos dolog.11. A 6. A függvény használójának megadjuk a lehetõséget.5).

példaprogram kimenetét a 6.12.6. Arial.5). 15: ?> 16: </body> 17: </html> . 10: } 11: meretez("Egy címsor<br>". akkor az általunk meghatározott értéket fogja felvenni. példaprogram ennek a módszernek a segítségével teszi a $meret paramétert elhagyhatóvá. ábrán láthatjuk.90 6. A 6.6.11. akkor az elhagyható lesz. óra 6. de valójában a $meret nevû paraméter majdnem mindig 3. amely formázott karakterláncokat ír ki a böngészõbe A 6. $meret=3 ) 8: { 9: print "<font size=\"$meret\" face=\"Helvetica. program Függvény elhagyható paraméterrel 1: <html> 2: <head> 3: <title>6. 6. 14: meretez("még több szöveg<BR>"). program Függvény elhagyható paraméterrel</title> 4: </head> 5: <body> 6: <?php 7: function meretez( $szoveg. Függvényünk ugyan hasznos.12. 12: meretez("szöveg<br>"). ábra Függvény.12.Sans-Serif\">$szoveg</font>". 13: meretez("újabb szöveg<BR>"). Így ha a függvényhívásban nem adunk értéket ennek a paraméternek. Ha kezdõértéket rendelünk ehhez a paraméterhez.

13. Ha a függvényhíváskor nem adunk meg második paramétert. Ennek igazolására futtassuk le a 6. de arra vigyáznunk kell.Függvények Ha a meretez() függvénynek van második paramétere. Annyi elhagyható paramétert adhatunk meg. majd ötöt ad hozzá. program Függvényparaméter érték szerinti átadása 1: <html> 2: <head> 3: <title>6. A $regiSzam változó 6 . 12: ottelTobb( $regiSzam ). sõt még a paraméterek sorrendjét sem kell fejben tartanunk. a helyi paraméter-változókba a paraméterek értékének másolata kerül. Az e változókon végzett mûveleteknek a függvényhívás befejezõdése után nincs hatásuk az átadott paraméterekre. majd ezzel a változóval meghívjuk az ottelTobb() függvényt. 14: ?> 15: </body> 16: </html> Az ottelTobb() függvény egyetlen számot vár. 91 Hivatkozás típusú paraméterek Amikor a függvényeknek paramétereket adunk át. Visszatérési értéke nincs. akkor a függvény a 3 értéket feltételezi. hogy az elhagyható paramétereknek a paraméterlista végén kell szerepelniük.13. ahányat csak akarunk. tömbökrõl szóló fejezetben lesz szó). 10: } 11: $regiSzam = 10.13. program Függvényparaméter érték szerinti átadása</title> 4: </head> 5: <body> 6: <?php 7: function ottelTobb( $szam ) 8: { 9: $szam += 5. (Errõl bõvebben a hetedik. Ezt a korlátozást kikerülhetjük. A fõprogramban a $regiSzam nevû változónak értéket adunk. ha a paramétereket egyetlen asszociatív tömbben adjuk át. 13: print( $regiSzam ). akkor a $meret nevû változót ez fogja meghatározni. 6. példaprogramot.

program Cím szerinti paraméterátadás változóra mutató hivatkozás segítségével</title> 4: </head> 5: <body> 6: <?php 7: function ottelTobb( $szam ) 8: { 9: $szam += 5. Más szavakkal.15. óra értékének másolata kerül a $szam nevû változóba.) Ez azt jelenti. Amikor kiíratjuk a függvényhívás után a $regiSzam változó értékét. hogy a változóra mutató hivatkozással dolgozunk a függvényben és nem a változó értékének másolatával. hanem arra mutató hivatkozást adjunk át. 6. hogy az átadandó változó vagy a paraméter neve elé egy & jelet teszünk. Hivatkozásokat függvényeknek úgy adhatunk át. 10: } 11: $regiSzam = 10. hogy az érték még mindig 10. Alapértelmezés szerint a függvények paraméterei érték szerint adódnak át. a változók értékérõl helyi másolat készül. Lehetõségünk van arra is. A paraméteren végzett bármilyen mûvelet megváltoztatja az eredeti változó értékét is.14. 12: ottelTobb( &$regiSzam ).14. (Ezt cím szerinti paraméterátadásnak is hívják. hogy ne a változó értékét. és a 6. 14: ?> 15: </body> 16: </html> . A 6. példaprogram az elõzõ problémára mutatja be a két elõbb említett módszert. program Cím szerinti paraméterátadás változóra mutatkozó hivatkozás segítségével 1: <html> 2: <head> 3: <title>6. azt találjuk. 13: print( $regiSzam ).14.92 6.

hogy a függvénydeklarációban írunk & jelet a paraméter neve elé. akkor lehet. hogy elfelejtjük. program Cím szerinti paraméterátadás a függvénydeklaráció módosításával 1: <html> 2: <head> 3: <title>6. 12: ottelTobb( $regiSzam ).Függvények 93 6. hogyan kell létrehozni és paramétereket átadni nekik. viszont nem felejtjük el kitenni az & jelet. . Megtanultuk.15. (C programozók már biztosan tapasztalták.) Ha a második megoldást választjuk. hogyan kell a függvényeknek hivatkozásokat átadni és a paramétereknek alapértelmezett értéket adni. hiszen mi tettük hivatkozássá.15. 6 Összefoglalás Ebben az órában megtanultuk. 14: ?> 15: </body> 16: </html> Ha az átadandó paramétert alakítjuk hivatkozássá. akkor nem fogjuk elfelejteni. 13: print( $regiSzam ). hogy a paraméter értéke megváltozhat. hogy az átadott paraméter értéke megváltozhat. Ennek a változatnak viszont az a veszélye. hogy az egyes függvényhívások azonos módon viselkednek. Mindent egybevéve talán több értelme van annak. mivel nem is kell kitennünk. program Cím szerinti paraméterátadás a függvénydeklaráció módosításával</title> 4: </head> 5: <body> 6: <?php 7: function ottelTobb( &$szam ) 8: { 9: $szam += 5... Megtanultuk. mik azok a függvények és hogyan kell õket használni. 10: } 11: $regiSzam = 10. hogy elfelejtjük kitenni az & jelet. Így biztosak lehetünk benne. Elsajátítottuk a global és a static kulcsszavak használatát.

melyek segítenek megszilárdítani az órában szerzett tudást.94 6. óra Kérdések és válaszok A global kulcsszón kívül van más mód arra. A globális változót a függvényen belül akkor is módosíthatjuk. ha a függvény paraméterként egy arra mutató hivatkozást kapott. Kvíz 1. } tizszer(). Mit ír ki az alábbi kódrészlet? $szam = 50. Hogyan lehet függvénybõl értéket visszaadni? 3. print $szam. Mûhely A mûhelyben kvízkérdések találhatók. akkor a függvény neve után nem szükséges kitenni a zárójelpárt? 2. function tizszer() { $szam = $szam * 10. hogy egy függvény hozzá tudjon férni vagy módosítani tudjon egy globális változót? A globális változókat a programon belül bárhonnan elérhetjük a $GLOBALS nevû asszociatív tömb segítségével. A válaszokat az A függelékben helyeztük el. hogy ha egy függvénynek nem kell paramétert átadni. A $proba nevû globális változót például $GLOBALS["proba"]-ként érhetjük el. Igaz-e. . Az asszociatív tömbökrõl a következõ órában tanulunk. Kérdés: Lehet-e a függvényhívásokat a változókhoz hasonlóan karakterláncba ágyazni? Nem. A függvényhívásoknak az idézõjeleken kívül kell lenniük.

function tizszer($sz) { $sz = $sz * 10. amely paramétereit HTML cellaelemekbe (TD) zárja! . 5. Mit ír ki az alábbi kódrészlet? $szam = 50. $szam = $szam * 10. } tizszer($szam). print $szam. } $tizszer($szam). } tizszer().Függvények 4. print $szam. Mit ír ki az alábbi kódrészlet? $szam = 50. function tizszer() { global $szam. amely négy karakterlánc típusú értéket fogad és olyan karakterlánccal tér vissza. print $szam. 6. Mit ír ki az alábbi kódrészlet? $szam = 50. Írjunk függvényt. 95 6 Feladatok 1. function tizszer(&$sz) { $sz = $sz * 10.

.

Ha jól értünk a tömbökhöz.7. képesek vagyunk nagy méretû. Ebben az órában bemutatjuk a tömböket és néhány beépített függvényt. Az órában a következõket tanuljuk meg: • Mik a tömbök és hogyan hozhatók létre? • Hogyan érhetjük el a tömbökben tárolt adatokat? • Hogyan rendezhetjük a tömbökben tárolt adatokat? . összetett adatokat tárolni és kezelni. ÓRA Tömbök A tömbök és a kezelésüket segítõ eszközök nagy mértékben növelik a PHP 4 programok rugalmasságát. amelyek segítik a velük való boldogulást.

táblázat A felhasznalok tömb elemei Index 0 1 2 3 Érték Berci Mariska Aladár Eleonóra Hányadik elem Elsõ Második Harmadik Negyedik . mert a tömb rugalmasabb adatszerkezet. Az index lehet szám. Lehet benne két vagy akár kétszáz érték és ennek elérése érdekében nem kell további változókat létrehozni. amelyben sok-sok elemet tárolhatunk. Akkor miért jó tömböt használni változók helyett? Elõször is azért. megadhatunk öt változót is.1. a tömbök elemeit könnyedén kezelhetjük egységként is.98 7. hogy az utolsó tömbelem indexe mindig eggyel kisebb a tömb méreténél. amennyit csak akarunk (amennyi memóriánk van). hogy az elsõ elem indexe 0. amely információt tárol. A tömb elemeit az index segítségével könnyen elérhetjük. hogy például a tömb harmadik elemének indexe 2. így a különbözõ értékeket egyetlen névvel tárolhatjuk.1. amiben egy értéket lehet tárolni. Ebbõl az következik. táblázatban a felhasznalok tömböt láthatjuk. Minden elemet egy szám vagy egy karakterlánc segítségével azonosíthatunk. Változók segítségével olyan programot írhatunk. ÚJDONSÁG A tömb változók listája. a változó egy „vödör”. A tömb olyan különleges szerkezetû változó. rendezhetjük és érhetjük el. Természetesen ha öt értéket kell tárolnunk. Egy tömbbe annyi adatot lehet beletenni. amelyben nincs ilyen korlátozás. Figyeljük meg. amelyeket számok vagy karakterláncok segítségével azonosíthatunk. Tehát az öt elemû tömb utolsó eleme a 4-es indexû elem. tehát olyan tároló. szótári rendezés szerint vagy saját rendezõelv alapján. mégpedig úgy. Lehetõségünk van a tömböt rendezni szám szerint. 7. végighaladhatunk a tömbön egy ciklussal vagy elérhetjük az elemeit egyenként. akkor a tömb „iratszekrény”. Ezt ajánlatos mindig fejben tartani! A 7. óra Mit nevezünk tömbnek? Mint már tudjuk. de akár karakterlánc is. Több változót tartalmaz. Ha akarjuk. Másodszor. Alapértelmezés szerint a tömböket számokkal indexeljük. Ha a változó „vödör”. Egy változóban azonban sajnos csak egy értéket tárolhatunk. dolgoz fel és ír ki.

Tömbök A karakterlánccal való indexelés akkor lehet hasznos, ha egyedi nevek (kulcsok) mellett más értékeket is tárolni kell. A PHP 4 mind a számokkal, mind a „nevekkel” indexelt tömbök elérésére biztosít segédeszközöket. Ezek közül néhánnyal ebben a fejezetben is találkozni fogunk, másokat a tizenhatodik, adatmûveletekkel foglalkozó fejezetben ismerünk majd meg.

99

Tömbök létrehozása
A tömbök alapértelmezés szerint értékek számmal indexelt listái. Értéket egy tömbhöz kétféleképpen is rendelhetünk: Az egyik mód az array() függvény, a másik a tömbazonosító használata szögletes zárójelekkel ([]). A következõ két részben mind a kétféle változattal találkozni fogunk.

Tömbök létrehozása az array() függvény segítségével
Az array() függvény akkor hasznos, ha egyszerre több értéket szeretnénk egy tömbhöz rendelni. Hozzunk létre egy $felhasznalok nevû tömböt és rendeljünk hozzá négy elemet! $felhasznalok = array ("Berci", "Mariska", "Aladár", "Eleonóra"); Most a $felhasznalok tömb harmadik elemét, melynek indexe 2, írassuk ki! print $felhasznalok[2]; Ez a következõ karakterláncot fogja kiírni: "Aladár". Az indexet a tömb neve után közvetlenül következõ szögletes zárójelbe kell írni. A tömbelem írásakor és olvasásakor is ezt a jelölést kell használni. Ne felejtsük el, hogy a tömbök indexelése nullától indul, így bármely tömbelem indexe eggyel kisebb a tömbelem tömbbéli helyénél. (Az elsõ elem indexe 0, a második elem indexe 1.)

7

Tömb létrehozása vagy elem hozzáadása a tömbhöz szögletes zárójel segítségével
Tömböket úgy is létrehozhatunk, illetve meglevõ tömbökhöz új elemeket adhatunk, ha a tömb neve után olyan szögletes zárójelpárt írunk, amelynek belsejében nincs index.

100

7. óra Hozzuk létre újra a $felhasznalok nevû tömböt: $felhasznalok[] $felhasznalok[] $felhasznalok[] $felhasznalok[] = = = = "Berci"; "Mariska"; "Aladár"; "Eleonóra";

Figyeljük meg, hogy nem kellett számot írnunk a szögletes zárójelbe. A PHP 4 automatikusan meghatározza az indexértéket, így nem kell nekünk bajlódni azzal, hogy kiszámítsuk a következõ olyan indexet, amelyben még nincs érték. Persze írhattunk volna számokat is a szögletes zárójelbe, de ez nem tanácsos. Nézzük a következõ programrészletet: $felhasznalok[0] = "Berci"; $felhasznalok[200] = "Mariska"; A tömbnek így mindössze két eleme van, de az utolsó elem indexe 200. A PHP 4 nem fog értéket adni a köztes elemeknek, ami félreértésekre adhat okot az elemek elérésekor. Tömbök létrehozása mellett a tömbváltozók szögletes zárójele segítségével az array() függvénnyel létrehozott tömb végéhez új elemet is adhatunk. Az alábbi kis programrészletben létrehozunk egy tömböt az array() függvény segítségével, majd új elemet adunk a tömbhöz szögletes zárójellel. $felhasznalok = array ("Berci", "Mariska", "Aladár", "Eleonóra"); $felhasznalok[] = "Anna";

Asszociatív tömbök
A számmal indexelt tömbök akkor hasznosak, ha abban a sorrendben szeretnénk tárolni az elemeket, amilyen sorrendben a tömbbe kerültek. Néha azonban jó lenne, ha a tömb elemeit meg tudnánk nevezni. Az asszociatív tömb egy karakterláncokkal indexelt tömb. Képzeljünk el egy telefonkönyvet: melyik a jobb megoldás: a név mezõt a 4-gyel vagy a “név”-vel indexelni? ÚJDONSÁG A karakterlánccal indexelt tömböket asszociatív tömböknek (néha hash-nek) hívják.

Tömbök Asszociatív tömbök létrehozása a számokkal indexelt tömbökkel megegyezõen történik, az array() függvény vagy a szögletes zárójelek segítségével. A számmal és a karakterlánccal indexelt tömbök közti határvonal a PHP-ben nem éles. Nem különbözõ típusok, mint a Perlben, ennek ellenére helyes az a hozzáállás, ha külön-külön kezeljük õket, mert az egyes típusok más hozzáférési és kezelési módot igényelnek.

101

Asszociatív tömbök létrehozása az array() függvény segítségével
Ha asszociatív tömböt szeretnénk létrehozni az array() függvény segítségével, minden elemnek meg kell adni a kulcsát és az értékét. Az alábbi programrészlet egy $karakter nevû asszociatív tömböt hoz létre négy elemmel. $karakter = array ( "nev" => "János", "tevekenyseg" => "szuperhõs", "eletkor" => 30, "kulonleges kepesseg" => "röntgenszem" ); Most elérhetjük a $karakter elemeit (mezõit): print $karakter["eletkor"];

Asszociatív tömbök létrehozása és elérése közvetlen értékadással
Asszociatív tömböt úgy is létrehozhatunk vagy új név–érték párt adhatunk hozzá, ha egyszerûen a megnevezett elemhez (mezõhöz) új értéket adunk. Az alábbiakban újra létrehozzuk a $karakter nevû tömböt, úgy, hogy az egyes kulcsokhoz egyenként rendelünk értékeket.

7

102

7. óra $karakter["nev"] => "János"; $karakter["tevekenyseg"] => "szuperhõs"; $karakter["eletkor"] => 30; $karakter["kulonleges kepesseg"] => "röntgenszem";

Többdimenziós tömbök
Eddig azt mondtuk, hogy a tömbök elemei értékek. A $karakter tömbünkben az elemek közül három karakterláncot tartalmaz, egy pedig egy egész számot. A valóság ennél egy kicsit bonyolultabb. Egy tömbelem valójában lehet érték, objektum vagy akár egy másik tömb is. A többdimenziós tömb valójában tömbök tömbje. Képzeljük el, hogy van egy tömbünk, amelynek tömbök az elemei. Ha el akarjuk érni a második elem harmadik elemét, két indexet kell használnunk: $tomb[1][2] ÚJDONSÁG A tömböt, amelynek elemei tömbök, többdimenziós tömbnek hívjuk.

A tény, hogy egy tömbelem lehet tömb is, lehetõséget biztosít arra, hogy kifinomultabb adatszerkezeteket kezeljünk viszonylag egyszerûen. A 7.1. példaprogram egy tömböt ír le, amelynek elemei asszociatív tömbök.

7.1. program Többdimenziós tömb létrehozása
1: <html> 2: <head> 3: <title>7.1. program Többdimenziós tömb létrehozása</title> 4: </head> 5: <body> 6: <?php 7: $karakter = array 8: ( 9: array ( 10: "nev" => "János", 11: "tevekenyseg" => "szuperhõs", 12: "eletkor" => 30, 13: "kulonleges kepesseg" => "röntgenszem" 14: ),

Tömbök

103

7.1. program (folytatás)
15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: array ( "nev" => "Szilvia", "tevekenyseg" => "szuperhõs", "eletkor" => 24, "kulonleges kepesseg" => "nagyon erõs" ), array ( "nev" => "Mari", "tevekenyseg" => "fõgonosz", "eletkor" => 63, "kulonleges kepesseg" => "nanotechnológia" ) );

26: 27: 28: 29: print $karakter[0]["tevekenyseg"]; //kiírja, hogy szuperhõs 30: ?> 31: </body> 32: </html>

Figyeljük meg, hogy array() függvényhívásokat építettünk egy array() függvényhívásba. Az elsõ szinten adjuk meg a tömböt, melynek minden eleme asszociatív tömb. A $karakter[2] tömbelemhez történõ hozzáféréskor a legfelsõ szintû tömb harmadik elemét, egy asszociatív tömböt kapunk. Az asszociatív tömb bármely elemét elérhetjük, például a $karakter[2]["nev"] értéke "Mari" lesz, a $karakter[2]["eletkor"] pedig 63. Ha a fogalmak tiszták, asszociatív és hagyományos tömbök párosításával egyszerûen hozhatunk létre összetett adatszerkezeteket.

7

104

7. óra

Tömbök elérése
Eddig azt láttuk, hogyan kell tömböket létrehozni és elemeket adni azokhoz. Most végignézünk néhány lehetõséget, amit a PHP 4 a tömbök elérésére biztosít.

Tömb méretének lekérdezése
A tömb bármely elemét elérhetjük indexének használatával: print $felhasznalo[4]; A tömbök rugalmassága miatt nem mindig egyszerû feladat kideríteni, hány elem van a tömbben. A PHP a count() függvényt biztosítja erre a feladatra. A count() a tömbben levõ elemek számával tér vissza. Az alábbi programrészben egy számokkal indexelt tömböt hozunk létre, majd a count() függvényt használjuk a tömb utolsó elemének elérésére. $felhasznalok = array ("Berci", "Marci", "Ödön", "Télapó"); $felhasznalok[count($felhasznalok)-1]; Figyeljük meg, hogy egyet ki kellett vonnunk a count() által visszaadott értékbõl. Ez azért van így, mert a count() nem az utolsó elem indexét adja vissza, hanem a tömbelemek számát. Semmi sem garantálja, hogy ezzel a módszerrel bármilyen (számokkal indexelt) tömb utolsó elemét megkapjuk. Vegyük például az alábbi programot: $tomb = array("Ecc, pecc"); // Egyelemû tömb! $tomb[2] = "kimehetsz"; print "Az utolsó elem: " . $tomb[count($tomb)-1]; A fenti kódot futtatva azt tapasztaljuk, hogy az "Az utolsó elem: " szöveg után semmi nem íródik ki. Ez azért van, mert a tömbnek nincs 1 indexû eleme. Az elsõ elem a 0 indexen található, a második a 2 indexen, mivel az értékadáskor az indexet közvetlenül határoztuk meg. A tömbök indexelése alapértelmezés szerint nullától indul, de ezt meg lehet változtatni. Ha azonban világos és következetes programokat szeretnénk írni, ne éljünk ezzel a lehetõséggel.

Tömb bejárása
Több módja van annak, hogy egy tömb minden elemét végigjárjuk. Mi most a PHP 4 igen hatékony foreach szerkezetét használjuk, de a tizenhatodik órában további módszereket is megvizsgálunk.

Tömbök

105

A foreach a PHP 4-es változatában került a nyelvbe.

A számmal indexelt tömbökre a foreach szerkezetet így kell használni: foreach($tombnev as $atmeneti) { } $tombnev a tömb neve, amit végig szeretnénk járni, az $atmeneti pedig egy változó, amelybe minden ismétlés során a tömb egy-egy eleme kerül. Az alábbi példában egy számmal indexelt tömböt hozunk létre és a foreach vezérlési szerkezet segítségével érjük el annak elemeit: $felhasznalok = array ("Berci", "Marci", "Ödön"); $felhasznalok[10] = "Télapó"; foreach($felhasznalok as $szemely) { print"$szemely<br>"; } A program kimenetét a 7.1-es ábrán láthatjuk.

7.1. ábra
Tömb bejárása

7
A tömb minden eleme átmenetileg a $szemely változóba került, amit a program kiír a böngészõbe. A Perlben gyakorlattal rendelkezõk vigyázzanak, a foreach szerkezet a két nyelvben jelentõsen különbözik! A Perlben ha az átmeneti változó értékét megváltoztatjuk, a megfelelõ tömbelem is megváltozik.

106

7. óra Ha ugyanezt az elõzõ példában tesszük, a $felhasznalok tömb értéke nem fog megváltozni. A tizenhatodik órában látni fogjuk, hogyan módosíthatjuk a foreach segítségével a tömbök tartalmát. Figyeljük meg, hogy annak ellenére, hogy a tömb „lyukas”, a program a foreach szerkezet segítségével bejárt tömb minden elemét kiírta és az utolsó sor elõtt nem jelentek meg üres sorok, tehát a 3 és 9 indexek közötti tömbelemeket (melyek nem meghatározottak, vagyis üres karakterláncok) nem írja ki a program. Ahol csak mód van rá, ne használjunk tömbindexeket. A tömböket sokszor csak egyszerû listaként használjuk, ahol nem számít az, hogy egy adott elemnek mi az indexe. A PHP a tömbök elérésére a tömbindexek használatánál hatékonyabb és áttekinthetõbb függvényeket biztosít, programunk ezáltal rugalmasabb, könnyebben módosítható és jól olvasható lesz.

Asszociatív tömb bejárása
Ha az asszociatív tömb kulcsát és értékét is el szeretnénk érni, egy kicsit másképpen kell a foreach szerkezet használnunk. Asszociatív tömböknél a foreach így alkalmazható: foreach( $tomb as $kulcs => $ertek ) { // a tömbelem feldolgozása } ahol $tomb a tömb neve, amin végig szeretnénk menni, $kulcs a változó, amelyben az elem kulcsa jelenik meg, a $ertek pedig a kulcshoz tartozó tömbelem értéke. A 7.2. példaprogramban létrehozunk egy asszociatív tömböt, majd egyesével elérjük és kiírjuk a tömb elemeit

Tömbök

107

7.2. program Asszociatív tömb bejárása a foreach segítségével
1: <html> 2: <head> 3: <title>7.2 példaprogram Asszociatív tömb bejárása a foreach segítségével</title> 4: </head> 5: <body> 6: <?php 7: $karakter = array ( 8: "nev" => "János", 9: "tevekenyseg" => "szuperhõs", 10: "eletkor" => 30, 11: "kulonleges kepesseg" => "röntgenszem" 12: ); 13: 14: foreach ( $karakter as $kulcs => $ertek ) 15: { 16: print "$kulcs = $ertek<br>"; 17: } 18: ?> 19: </body> 20: </html> A 7.2. példaprogram kimenetét a 7.2. ábrán láthatjuk.

7.2. ábra
Asszociatív tömb bejárása

7

108

7. óra

Többdimenziós tömb bejárása
Most már ismerünk olyan módszereket, amelyek segítségével a 7.1. példaprogramban létrehozott többdimenziós tömböt bejárhatjuk. A 7.3. példaprogramban létrehozunk egy többdimenziós tömböt és a foreach segítségével végigjárjuk az elemeit.

7.3. program Többdimenziós tömb bejárása
1: <html> 2: <head> 3: <title>7.3. program - Többdimenziós tömb bejárása</title> 4: </head> 5: <body> 6: <?php 7: $karakterek = array 8: ( 9: array ( 10: "nev" => "János", 11: "tevekenyseg" => "szuperhõs", 12: "eletkor" => 30, 13: "kulonleges kepesseg" => "röntgenszem" 14: ), 15: array ( 16: "nev" => "Szilvia", 17: "tevekenyseg" => "szuperhõs", 18: "eletkor" => 24, 19: "kulonleges kepesseg" => "nagyon erõs" 20: ), 21: array ( 22: "nev" => "Mari", 23: "tevekenyseg" => "fõgonosz", 24: "eletkor" => 63, 25: "kulonleges kepesseg" => "nanotechnológia" 26: ) 27: );

7 .3. a kulcs-érték párok pedig a $kulcs és az $ertek változókba kerülnek. Ilyenkor általában nem kell saját tömblistázó kódot használnunk. Annak érdekében. ezért ennek értékeit is egy foreach ciklussal járjuk végig. ábrán láthatjuk. ha meghívnánk a $karakter változóra az is_array() függvényt. } ?> </body> </html> A 7. program (folytatás) 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: foreach ( $karakterek as $karakter ) { foreach ( $karakter as $kulcs => $ertek ) { print "$kulcs: $ertek<br>". A $karakter maga is egy tömb. biztosnak kell lennünk abban. hogy kíváncsiak vagyunk egy tömb vagy valamilyen más összetett változó tartalmára. Mivel a $karakter egy asszociatív tömb. ha a változó típusa tömb. amely a paramétereként megadott változó tartalmát írja ki. Bonyolultabb programok esetében gyakran elõfordul. minden más esetben false értéket ad. Az is_array() függvény számára egy paramétert kell megadnunk. példaprogram kimenetét a 7. hiszen a PHP 4 biztosítja számunkra a print_r() függvényt. } print "<br>". A külsõ ciklusban a számmal indexelt $karakterek tömb elemeit vesszük végig.3. A visszatérési érték true lesz. A kódot megbízhatóbbá tehetnénk. az egyes elemek pedig a $karakter nevû változóba kerülnek. a foreach szerkezetet az ennek megfelelõ formában használjuk.3.Tömbök 109 7. hogy ez a módszer jól mûködjön. Két foreach ciklust használunk. hogy a $karakter változó valóban mindig tömböt tartalmaz.

A megadott értékek a tömbbe kerülnek. } A $harmadik tömb az $elso és a $masodik tömbök elemeinek másolatát tartalmazza. óra Mûveletek tömbökkel Most már fel tudunk tölteni tömböket elemekkel. A Perlben jártas olvasó bizonyára ismerõsnek fogja találni ezen függvények nagy részét. 2. $masodik = array( 1. "b". Egyszerre több elem hozzáadása egy tömbhöz az array_push() függvény segítségével Az array_push() függvény egy tömböt és tetszõleges számú további paramétert fogad. egyesítjük azokat. 2. Az alábbi példában létrehozunk két tömböt. Az array_merge() függvény a PHP 4-es változatában került a nyelvbe. A foreach ciklus ennek a tömbnek az elemeit ("a". "c". Figyeljük meg. Az egyes elemeket a <br> (sortörés) választja el egymástól. elérhetjük azokat. A visszatérési érték az egyesített tömb lesz. de a PHP rengeteg függvénnyel segíti a tömbök feldolgozását is. Hozzunk létre egy tömböt. $masodik ). "c" ). foreach( $harmadik as $ertek ) { print "$ertek<br>". majd adjunk hozzá néhány elemet: . majd végigjárjuk a keletkezõ harmadik tömböt: $elso = array( "a". $harmadik = array_merge( $elso. Két tömb egyesítése az array_merge() függvény segítségével Az array_merge() függvény legalább két paramétert vár: az egyesítendõ tömböket. 1.110 7. E függvény visszatérési értéke a tömbben lévõ elemek száma (miután az elemeket hozzáadta). 3 ). hogy az array_merge() függvénnyel ellentétben az array_push() megváltoztatja elsõ paraméterének értékét. 3) írja ki a böngészõbe. "b".

print "Összesen $elemszam elem van az \$elso tömbben<P>". Az így létrehozott tömb elemeit a foreach ciklus segítségével kiíratjuk a böngészõbe. Ezt a módszert a szakirodalomban gyakran escape-ként emlegetik.és/vagy számsorozatot talál. foreach( $elso as $ertek ) { print "$ertek<br>". hanem kiírja a karaktereket. ezáltal többdimenziós tömb keletkezik. 3 ). illetve a három számot. Így a PHP már nem próbálja meg változóként értelmezni. 2. "c" ). A Perlben gyakorlattal rendelkezõk figyeljenek arra. ezért kellett a dollárjel elé a fordított perjel karakter. Figyeljük meg. 1. melyekkel az elsõ sorban feltöltöttük. használjuk az array_merge() függvényt. az értéket (ami ebben az esetben 6) egy változóban tárolhatjuk és kiírathatjuk a böngészõbe. a tömb egy tömb típusú elemmel bõvül. 111 Ha egy karakterláncban nem szeretnénk. "b". A fenti példában mi a '$elso' karaktersorozatot szerettük volna megjeleníteni. hogy ha a PHP-ben az array_push() második paramétereként tömböt adnak meg. $elemszam = array_push( $elso. } Mivel az array_push() függvény visszaadja a módosított tömb elemeinek számát. ekkor a ‘ és a \ karakterek helyett \’-t és \\-t kell írnunk. Az $elso tömb ekkor az eredeti három betût tartalmazza.Tömbök $elso = array( "a". hogy a "$elso" karakterlánc elé egy fordított perjelet kellett tennünk. 7 . hogy a változók behelyettesítõdjenek. változóként próbálja értelmezni azt és megkísérli az értékét beírni. amit az array_push() függvény segítségével adtunk hozzá. a karakterlánc jelölésére egyszeres idézõjeleket használjunk. Ha két tömb elemeit szeretnénk egyesíteni. Ha a PHP egy macskakörmös (kettõs idézõjeles) karakterláncban egy dollárjelet követõ betû.

'elem van<br>'. ábrán láthatjuk. print '$egy_tomb-ben most ' . "b". } ?> A program kimenetét a 7.4. amikor egy sor elemein kell valamilyen tevékenységet végezni. Annak ellenõrzésére. count( $egy_tomb ) .4.112 7. . hogy van-e még elem a tömbben. while ( count( $egy_tomb ) ) { $ertek = array_shift( $egy_tomb ). Ezt a mûveletet egy while ciklusba tesszük és a mûveletet addig ismételjük. amíg a sor ki nem ürül. a count() függvényt használjuk. <?php $egy_tomb = array( "a". Az elsõ elem eltávolítása az array_shift() függvény segítségével 7. óra Az array_shift() eltávolítja a paraméterként átadott tömb elsõ elemét és az elem értékével tér vissza. A következõ példában az array_shift() függvény segítségével eltávolítjuk a tömb elsõ elemét. print "$ertek<br>". ábra A tömb egyes elemeinek törlése és kiíratása az array_shift() függvény segítségével Az array_shift() akkor lehet hasznos. amíg el nem fogy a tömb. "c" ). Az array_shift() függvény a PHP 4-es változatában került a nyelvbe.

a függvény feltételezi. a tömbszelet az utolsó elemtõl fog kezdõdni. "d" és "e" elemeket írja ki. Mivel kezdõpozícióként a kettõt adtuk meg. Az array_slice() nem változtatja meg a paraméterként átadott tömböt. amelyben a hívó által kért elemek vannak. hogy ha a második paraméter értéke -1. A függvény egy tömböt. hanem újat ad vissza. a <br> kódelemmel elválasztva. 3 ). három elemû tömböt állítunk elõ belõle: $elso = array( "a". hogy a kezdõpozíciótól a tömb végéig tartó szeletet szeretnénk megkapni. a tömbszelet elsõ eleme hátulról a megadott számú elemtõl kezdõdik. A PHP 4 függvényeinek köszönhetõen egykettõre rendet teremthetünk a káoszban. Az alábbi példában létrehozunk egy tömböt. "f" ). majd egy új. Tömb részének kinyerése az array_slice() függvény segítségével Tömbök rendezése Talán a rendezés a legnagyszerûbb mûvelet. $masodik = array_slice( $elso. amit egy tömbön el lehet végezni. amelyek számmal és karakterlánccal indexelt tömböket rendeznek. "c". az $elso[2]. "d".Tömbök 113 Az array_slice() függvény egy tömb egy darabját adja vissza. foreach( $masodik as $ertek ) { print "$ertek<br>". 7 . Ha ez utóbbit elhagyjuk. 2. "e". A következõ rész néhány olyan függvényt mutat be. } A fenti példa a "c". a visszakapott tömbszelet a tömb hátulról a megadott számú eleméig tart. ami a $masodik tömbbe kerül. Ez azt jelenti. Ha hossz paraméterként nullánál kisebb számot adunk meg. Ha kezdõpozícióként negatív számot adunk meg. "b". Az array_slice() függvény a PHP 4-es változatában jelent meg. egy kezdõpozíciót (a szelet elsõ elemének tömbbeli indexét) és egy (elhagyható) hossz paramétert vár. így az elsõ elem.

print '___Rendezés ábécésorrend szerint___<br>'.114 7. szám szerint történik. "c" ). print '___Rendezés szám szerint___'<br>. Ebbõl a szempontból különbözik a Perl hasonló függvényétõl. ha a tömbben minden elem szám. sort( $tomb ). 2. 9 ). "f". foreach ($tomb as $elem) { print "$elem<br>". sort( $tomb ). a rendezés (alapbeállításban angol!) ábécésorrend szerinti lesz. a paraméterként kapott tömböt alakítja át. Az alábbi programrészlet egy karakterekbõl álló tömböt hoz létre. } $tomb[]="a". "a". } A fenti példa kimenete: ___Rendezés szám szerint___ 2 9 10 . foreach ($tomb as $elem) { print "$elem<br>". sort( $tomb ). rendezi. A függvénynek nincs visszatérési értéke. óra Számmal indexelt tömb rendezése a sort() függvény segítségével A sort() függvény egy tömb típusú paramétert vár és a tömb rendezését végzi el. Ha a tömbben van karakterlánc. majd a rendezett tömb elemeit egyenként kiírja: $tomb = array( "x". } Nézzük egy kis példát egy tömb kétféle rendezési módjára! $tomb = array( 10. foreach ($tomb as $elem) { print "$elem<br>".

"masodik"=>2. Az egyetlen különbség. } Ennek a programocskának a kimenetét a 7. ugyanis a tömb számmal indexelt tömbbé alakul át. hogy az asort() használata után megmaradnak a karakterlánc-kulcsok: $a_tomb = array( "elso"=>5. Asszociatív tömb rendezése érték szerint az asort() függvény segítségével Az asort() függvény egy asszociatív tömb típusú paramétert vár és a tömböt a sort() függvényhez hasonlóan rendezi. "harmadik"=>1 ).5. ábrán láthatjuk. az egyes elemek így nullától kezdõdõ számokkal érhetõk el. de az elemek kulcsai elvesznek. 7 . hogy a tömb elemei ugyan rendezettek lesznek. 115 Ha csökkenõ sorrendben szeretnénk rendezni egy tömb elemeit.Tömbök ___Rendezés ábécésorrend szerint___ 10 2 9 a A sort() függvényt ne használjuk asszociatív (karakterlánccal indexelt) tömbökre! Ha mégis megtesszük. azt fogjuk tapasztalni. asort( $a_tomb ). használjuk a sort() függvényhez hasonlóan mûködõ rsort() függvényt. foreach( $a_tomb as $kulcs => $ertek ) { print "$kulcs = $ertek<br>".

hanem a tömböt alakítja át: $tomb = array( "x" => 5.6. foreach( $tomb as $kulcs => $ertek ) { print "$kulcs = $ertek<BR>". "f" => 1 ). "a" => 2.5. használjuk a arsort() függvényt. } A program kimenetét a 7. ksort( $tomb ). A többi tömbrendezõ függvényhez hasonlóan ez a függvény sem ad vissza semmiféle visszatérési értéket. ábrán láthatjuk. 7. ábra Asszociatív tömb rendezése kulcs szerint a ksort() függvény segítségével .116 7. óra 7. Asszociatív tömb rendezése kulcs szerint a ksort() függvény segítségével A ksort() a paraméterben megadott asszociatív tömböt rendezi kulcs szerint.6. ábra Asszociatív tömb érték szerinti rendezése az asort() függvény segítségével Ha csökkenõ sorrendben szeretnénk rendezni egy asszociatív tömb elemeit.

php.php címen. A kézikönyv errõl szóló része megtalálható az Interneten. Errõl bõvebben a tizenhatodik órában olvashatunk. (A kézikönyv magyar változata a http://hu. Többdimenziós tömböket is létre tudunk hozni.) Ha a tömb elemeinek számát ismerem. melyek segítenek megszilárdítani az órában szerzett tudást. Mûhely A mûhelyben kvízkérdések találhatók.php.net/manual/en/ref. A tömbökhöz egyszerre több elemet is adhatunk. 7 Kvíz 1. a bennük levõ információt pedig ki tudjuk nyerni egymásba ágyazott foreach ciklusokkal. amellyel nem foglalkoztunk ebben az órában? A PHP 4-es változatában nagyon sok tömbkezelõ függvény van. Errõl bõvebben a tizenhatodik órában fogunk tanulni. "Vidor". Nem lehetünk biztosak abban. illetve tömböket bejárni a foreach ciklus segítségével. Melyik függvénnyel hozhatunk létre tömböket? 2. Van olyan tömböt kezelõ függvény. a http://www.array.) Nagyon óvatosan kell bánni ezzel a megközelítéssel. hogy az általunk használt tömb indexei 0-tól indulnak és egyesével nõnek.Tömbök 117 Összefoglalás Ebben az órában a tömbökrõl és a hozzájuk kapcsolódó eszközökrõl tanultunk. normál tömb bejárására a for ciklust használjam? (Ekkor számláló segítségével címzem meg a tömb elemeit. Végül megtanultuk. melyeket a PHP 4 a rajtuk végzett mûveletekhez nyújt. . Most már tudunk normál (számmal indexelt) és asszociatív (karakterlánccal indexelt) tömböket is létrehozni. Az alább létrehozott tömb utolsó elemének mi az indexe? $torpek = array( "Tudor". A válaszokat az A függelékben helyeztük el. illetve onnan kivehetünk. Kérdések és válaszok Ha a foreach ciklus csak a PHP 4-esben került a nyelvbe. "Kuka" ). hogy a PHP 4-es változata milyen lehetõségeket nyújt a tömbök rendezésére. akkor a PHP 3-as változatát használó programozók hogyan jártak végig egy tömböt? A PHP 3-asban az each() függvényt használták egy while() ciklusban.net/manual/hu/ oldalon található.

Járjuk végig az elõzõ feladatban létrehozott tömböt és írjuk ki az összes filmtípust és a hozzá tartozó filmcímeket! . Melyik függvény segítségével tudnánk "Morgó"-t a $torpek nevû tömbbe felvenni? 5.)! 2. "Alien". amely filmeket tartalmaz. Milyen függvény segítségével lehet két tömböt egyesíteni? 8. amelynek kulcsai filmtípusok ("Scifi". Hogyan rendeznénk egy asszociatív tömböt kulcsai szerint? Feladatok 1. "Romantikus"…)! A tömb elemei legyenek tömbök. Hozzunk létre egy többdimenziós tömböt.118 7.. Függvények használata nélkül hogyan tudnánk "Hapci"-t az imént létrehozott $torpek nevû tömbhöz adni? 4. "Terminator". óra 3. Hogyan lehet egy tömb elemszámát megtudni? 6. "Akció". amelyek filmcímeket tartalmaznak ("2001". A PHP 4-es változatában mi a legegyszerûbb módja egy tömb bejárásának? 7. zsáner szerint rendezve! Pontosabban hozzunk létre egy asszociatív tömböt...

Ebben az órában a PHP 4-es változatának objektumközpontú tulajdonságaival foglalkozunk és azokat valós életbõl vett példákra alkalmazzuk. Az órában a következõket tanuljuk meg: • Mik az osztályok és objektumok? • Hogyan lehet osztályokat és objektumpéldányokat létrehozni? • Hogyan lehet tagfüggvényeket és tulajdonságokat létrehozni és elérni? • Hogyan lehet olyan osztályt létrehozni.8. A PHP a Perlhöz hasonlóan fokozatosan építette be az objektumközpontúságot a nyelvtanba. nem tudunk tõle szabadulni. hogy programjainkat teljes mértékben objektumközpontú szemléletmódban írjuk. ÓRA Objektumok Az objektumközpontú programozás veszélyes. A PHP 4-es változatának megjelenésével képessé váltunk arra. Megváltoztatja a programozásról való gondolkodásmódunkat és ha egyszer a hatalmába kerít. mely más osztály leszármazottja? • Miért jó az objektumközpontú programozás és hogyan segíti munkánk szervezését? .

A felület különleges függvényekbõl. Például ha létrehozunk egy gepkocsi osztályt. amelyek a szülõ tulajdonságait öröklik és képesek azt kiegészíteni vagy módosítani. Mivel az osztályokat egységbezárt objektumok létrehozására használjuk. Az osztály tagfüggvények és tulajdonságok együttese. összes tulajdonsága és tagfüggvénye elérhetõvé válik. úgy. class) létrehozásával határozzuk meg. A tagfüggvények mindegyike hozzáférhet bizonyos változókhoz. Az objektumpéldányokban a szin tulajdonság értéke lehet például "kék" vagy "zöld". úgynevezett tagfüggvényekbõl (metódusokból) áll. melyen keresztül kéréseket küldhetünk és információt kaphatunk. hogy gyermekosztályokat hozzunk létre.120 8. egyszerûen vihetõk át egyik projektbõl a másikba. Objektumpéldányok (vagy röviden objektumok) létrehozásával pedig egyedeket hozunk létre. vagyis egy objektum nem más. egyedi tagfüggvényeket is biztosítanak. ha a bemutatott példák alapján kísérletezgetünk. Amikor egy objektumpéldány létrejön. Ezen egyedek rendelkeznek a típusuknak megfelelõ jellemzõkkel. Az objektumközpontú program legnagyobb elõnye valószínûleg a kód újrahasznosíthatósága. amelynek a szin nevet adjuk. A típus jellegzetességeit objektumtípusok (osztályok. E módszer segítségével rengeteg összetett vagy egyedi tulajdonsággal rendelkezõ objektumot. Az objektumközpontú programozás bemutatásának talán legjobb módja. de közben egyéni tulajdonságokkal is rendelkeznek. amelyek egy alaposztályra épülnek. óra Mit nevezünk objektumnak? Az objektum változók és függvények egybezárt csomagja. amely egy különleges sablonból jön létre. hogy egyszerû hozzáférési felületet biztosít. Egy adott típusú objektum a new kulcsszó után írt objektumtípus nevének segítségével testesíthetõ meg. . Az osztályok sablonok. amelyeket tulajdonságoknak nevezünk. amelyekbõl objektumokat állíthatunk elõ. mint az osztályban rögzített mûködési szabályok megtestesülése. akkor az osztálynak lehet egy jellemzõje. de természetesen a jellemzõk értéke más és más lehet. ÚJDONSÁG Az objektum az osztály egy példánya. Az objektum belsõ mûködése nagy részét elrejti az objektumot használó elõl. ráadásul lehetõség van arra is. vagyis objektumcsaládot lehet létrehozni. Az osztályokat a class kulcsszó segítségével hozhatjuk létre.

Meggyõzõdhettünk róla. a függvény pedig egy karakterlánccal tér vissza. ami a változó típusát tartalmazza. amelyre épül. de segítségével újabb nézõpontból vizsgálhatjuk az osztályokat. mint öntõmintára: annyi objektumot önthetünk a segítségével. Objektumot létrehozni a new kulcsszó segítségével lehet: $obj1 $obj2 print print = new elso_osztaly(). A példának elsõ ránézésre túl sok hasznát még nem látjuk. } 8 . Ezt a sablont hívjuk osztálynak. de más objektumok is: class elso_osztaly { var $nev = "Gizike". gettype($obj2) . Az elõzõ programrészletben a gettype() visszatérési értéke "object". hogy objektumaink kicsit érdekesebbek legyenek. "\$obj2 " . hogy létre tudjunk hozni egy objektumot. hogy két objektumunk van. " típusú<br>". Az osztályokra úgy tekinthetünk. hogy az $obj1 és az $obj2 változókban valóban objektum van-e. de az átláthatóság kedvéért az osztálymeghatározás elejére célszerû kigyûjteni azokat. "\$obj1 " . elõször létre kell hozni a sablont. amely alapján tetszõleges számú elso_osztaly típusú objektumot hozhatunk létre. A tulajdonságok lehetnek értékek. amit a print segítségével a böngészõ számára kiírtunk. Adjunk néhány további szolgáltatást az osztályhoz. " típusú<br>". így mi is ezt tesszük. A PHP 4-es változatában ilyen sablont a class kulcsszóval hozhatunk létre: class elso_osztaly { // ez egy nagyon buta osztály } Az elso_osztaly a minta. = new elso_osztaly(). tömbök. A PHP gettype() függvényével ellenõriztük. Ezek az osztályban bárhol létrehozhatók. A gettype() számára egy tetszõleges típusú változót kell átadnunk. gettype($obj1) . Objektumtulajdonságok Az objektumok a tulajdonság néven említett különleges változók révén mûködnek. amennyit csak szeretnénk.Objektumok 121 Objektum létrehozása Ahhoz.

de az objektumok többre képesek. ha ezt egy osztályon belül nem írjuk ki. rábírtuk az $obj2 objektumot. a belsõ használatra szánt tulajdonságok. melynek "Gizike" lesz a kezdeti értéke. mint a Java. mint egy egyszerû asszociatív tömb utánzása. $obj2 = new elso_osztaly(). A PHP-nek nincs ilyen védelmi rendszere. A -> mûveletjel teszi lehetõvé. hogy csak bizonyos. óra Figyeljük meg. A következõ részben áttekintjük az objektumok tagfüggvényeit. Az objektumközpontú nyelvek. Most. hogy a változót a var kulcsszó segítségével hoztuk létre. amelyek segítségével objektumaink életre kelnek. minden elso_osztaly típusú objektumnak lesz egy nev tulajdonsága. amelyet egy osztályon belül hozunk létre.1. hogy a programozó beállítsa a tulajdonságok és tagfüggvények biztonsági szintjét. print "$obj1->nev<br>". Bár az $obj1 és az $obj2 objektumokat "Gizike" névvel hoztuk létre. példaprogram az elso_osztaly nevû osztályt egy tagfüggvénnyel egészíti ki. ha a tulajdonságot (kívülrõl) nem lenne szabad megváltoztatni. . $obj1->nev = "Bonifác". hogy a hozzáférés úgy korlátozható. hogy meggondolja magát. Ez azt jelenti. ami problémákat okozhat. Ehhez a tulajdonsághoz az objektumon kívülrõl is hozzá lehet férni. értelmezési hibát (parse error) kapunk. Az objektumot adattárolásra is használhatjuk. } $obj1 = new elso_osztaly(). Az objektum összes tulajdonsága elérhetõ. megkívánják. az objektumot kezelõ magas szintû függvények legyenek elérhetõk. hogy ezt a változót létrehoztuk. Az objektumok tagfüggvényei A tagfüggvény olyan függvény. mielõtt a -> jelet ismét használva kiítuk volna mindkét objektum nev tulajdonságának értékét. print "$obj1->nev<br>". A 8.122 8. hogy egy objektum tulajdonságait elérhessük vagy módosíthassuk. sõt meg is lehet változtatni: class elso_osztaly { var $nev = "Gizike". tagfüggvények pedig biztonságosan elrejthetõk. a nev tulajdonsághoz a "Bonifác" értéket rendelve. Minden objektumpéldány képes meghívni osztálya tagfüggvényeit.

hogy a tagfüggvényt mindig osztályon belül hozzuk létre. A különbség csak annyi.2. Fontos. program Egy osztály tagfüggvénnyel</title> 4: <body> 5: <?php 6: class elso_osztaly 7: { 8: var $nev. hogy "Üdvözlöm!" 16: ?> 17: </body> 18: </html> Amint látjuk. 12: } 13: } 14: $obj1 = new elso_osztaly(). 15: $obj1->koszon(). hogy a tagfüggvények hozzáférnek az objektum változóihoz. 9: function koszon() 8 .Objektumok 123 8.1. hogyan lehet egy objektumtulajdonságot az objektumon kívülrõl elérni.1. példaprogramot: 8. program Tulajdonság elérése tagfüggvénybõl 1: <html> 2: <head> 3: <title>8. 9: function koszon() 10: { 11: print "Üdvözlöm!". a tagfüggvény a szokványos függvényekhez nagyon hasonlóan viselkedik. Már láttuk.2. Az objektumok tagfüggvényeit a -> mûveletjel segítségével hívhatjuk meg. // kiírja. program Egy osztály tagfüggvénnyel 1: <html> 2: <head> 3: <title>8. de hogyan hivatkozhat egy objektum saját magára? Lássuk a 8. program Tulajdonság elérése tagfüggvénybõl</title> 4: <body> 5: <?php 6: class elso_osztaly 7: { 8: var $nev = "Krisztián".2.

óra 8. 8." 17: ?> 18: </body> 19: </html> Az osztálynak van egy különleges változója. a $this. az objektumnak hivatkoznia kell saját magára. az objektum nev tulajdonságát megváltoztatva. hogy minden egyes elso_osztaly típusú objektumhoz más és más nev tulajdonságot szeretnénk rendelni. 13: } .124 8. 10: function atkeresztel( $n ) 11: { 12: $this->nev = $n.2. Ezt megtehetnénk „kézzel”. 12: } 13: } 14: 15: $obj1 = new elso_osztaly(). erre jó a $this változó.3.3. Bár programunkban az objektumra hivatkozhatunk azzal a változóval. de létrehozhatunk egy tagfüggvényt is.3. példaprogramban. // kiírja. 16: $obj1->koszon(). amihez hozzárendeltük (például $obj1). program Tulajdonság értékének módosítása tagfüggvényen belülrõl 1: <html> 2: <head> 3: <title>8. Tekinthetjük személyes névmásnak. A $this változó és a -> mûveletjel segítségével az osztályon belülrõl az osztály minden tulajdonságát és tagfüggvényét elérhetjük. program Tulajdonság értékének módosítása tagfüggvényen belülrõl</title> 4: </head> 5: <body> 6: <?php 7: class elso_osztaly 8: { 9: var $nev = "Krisztián". program (folytatás) 10: { 11: print"Üdvözlöm! $this->nev vagyok. hogy "Üdvözlöm! Krisztián vagyok. Az utóbbi megoldást láthatjuk a 8. Képzeljük el. ami az objektumpéldányra mutat.<BR>". ami ezt teszi.

Még mindig van egy fogás." 23: ?> 24: </body> 25: </html> Az objektum nev tulajdonsága a létrehozáskor még "Krisztián" volt. A 8. E módszer segítségével már születésükkor testreszabhatjuk objektumainkat. példaprogramban az elso_osztaly objektumtípus konstruktorral kiegészített változatát láthatjuk.4. program Konstruktorral rendelkezõ osztály</title> 4: </head> 5: <body> 6: <?php 8 . akkor a metódus automatikusan meghívódik.Objektumok 125 8. hogy a tagfüggvénynek a hagyományos függvényekhez hasonlóan adhatunk át paramétereket. A létrejövõ példány az ezen függvénynek átadott paraméterek vagy más tényezõk alapján hozhatja magát alapállapotba. 17: } 18: } 19: 20: $obj1 = new elso_osztaly(). 8. ami "Aladár" értékre változtatta azt. Figyeljük meg. hogy az objektum képes saját tulajdonságait módosítani. Láthatjuk. Ha egy metódusnak éppen azt a nevet adjuk. 22: $obj1->koszon(). de aztán meghívtuk az objektum atkeresztel() tagfüggvényét. hogy "Üdvözlöm! Aladár vagyok.4.3. mint az osztálynak (az elõzõ példában ez az elso_osztaly). program (folytatás) 14: function koszon() 15: { 16: print"Üdvözlöm! $this->nev vagyok.<BR>". 21: $obj1->atkeresztel("Aladár"). // kiírja. Ezeket a különleges metódusokat konstruktoroknak (létrehozó függvényeknek) hívjuk. amikor egy új objektumpéldány létrejön. program Konstruktorral rendelkezõ osztály 1: <html> 2: <head> 3: <title>8. amit nem ismertünk meg.4.

A táblázat oszlopainak számát külön.<BR>". Ha az objektum létrehozásakor nem adunk meg nevet. $obj2 = new elso_osztaly("Aladár"). Az adatszerkezet soralapú lesz. function elso_osztaly( $n="Anonymous" ) { $this->nev = $n. hogy "Üdvözlöm! Krisztián vagyok. Az osztály tulajdonságai Elõször is el kell döntenünk. hogy milyen tulajdonságokat tároljunk az objektumban. egy egész típusú változóba helyezzük. amelyben az egyes oszlopokat nevük alapján is elérhetjük. A táblázat takaros formázása a probléma megoldásának ebben a fázisában nem szükséges. óra 8. } } $obj1 = new elso_osztaly("Krisztián"). program (folytatás) 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: class elso_osztaly { var $nev. $obj1->koszon(). } function koszon() { print"Üdvözlöm! $this->nev vagyok. // kiírja. az elso_osztaly() konstruktor automatikusan meghívásra kerül. a paraméter értéke "anonymus" lesz. . Egy bonyolultabb példa Most készítsünk együtt egy kicsit bonyolultabb és hasznosabb programot: egy táblázat osztályt hozunk létre. a sorokat pedig egy kétdimenziós tömbben." ?> </body> </html> Amikor egy elso_osztaly típusú objektumot létrehozunk.4." $obj2->koszon(). hogy "Üdvözlöm! Aladár vagyok.126 8. // kiírja. a böngészõben való megjelenítést pedig egy butácska függvényre bízzuk. Az oszlopok neveit egy tömbben tároljuk.

ha a tömbben és a fejlécben az oszlopok sorrendje azonos: function ujSor( $sor ) { if ( count ($sor) != $this->oszlopszam ) return false. Az ujSor() tagfüggvény A Tablazat osztály a sorokat tömbök formájában kapja meg. Ha az oszlopok neveit a konstruktor már ismeri.Objektumok class Tablazat { var $tablazatSorok = array(). Mivel ez az információ tulajdonságokban (mezõkben) tárolódik. könnyûszerrel meghatározhatja az oszlopok számát és beírhatja az $oszlopszam tulajdonságba: function Tablazat( $oszlopNevek ) { $this->oszlopNevek = $oszlopNevek. amit a $sor nevû változóban kap meg. var $oszlopszam. akkor a függvény false értéket ad vissza. minden tagfüggvény számára hozzáférhetõ. } Ha feltesszük. hogy a kapott $sor paraméter megfelelõ számú oszlopot tartalmaz-e. A táblázat oszlopainak számát már az $oszlopszam tulajdonságba helyeztük. $sor). return true. 8 . hogy a konstruktor számára helyes információt adtunk át. az objektum már tudni fogja oszlopainak számát és nevét. $this->oszlopszam = count ( $oszlopNevek ). } Az ujSor() tagfüggvény egy tömböt vár. array_push($this->tablazatSorok. } 127 A konstruktor A táblázat létrehozásakor a programnak már tudnia kell. Ez persze csak akkor mûködik helyesen. így most a count() függvénnyel ellenõrizhetjük. Ha nem. mik lesznek a feldolgozandó oszlopok nevei. Ez az információ az objektumhoz a konstruktor egy karakterlánc típusú tömbparamétere segítségével fog eljutni. var $oszlopNevek = array().

illetve a hozzáadandó elemet. } array_push($this->tablazatSorok. amihez az új elemet hozzá kell adni. Az array_push() két paramétert vár: a tömböt. így többdimenziós tömb jön létre. egyébként false lesz. Ha a második paraméter maga is egy tömb. Ehhez a PHP 4-es isset() függvényét használjuk. Ha nem létezik ilyen elem az $asszoc_sor tömbben. óra A PHP 4-es változatának array_push() függvénye segítségével az új sort a $tablazatSor tömb végéhez fûzhetjük. Majd végigvesszük az $oszlopNevek tömb elemeit. } Az ujNevesSor()-nak átadott asszociatív tömb az $asszoc_sor nevû változóba kerül. ahol az egyes elemek kulcsa az oszlopok neve. hogy az elem létezik. és megnézzük. $sor[] = $asszoc_sor[$oszlopNev]. Ha egy oszlopnév nem jelenik meg a paraméterben kulcsként. Az ujNevesSor() tagfüggvény Az ujSor() tagfüggvény csak akkor használható kényelmesen.128 8. $sor = array(). Ha olyan kulcsú elem kerül a paraméterbe. amely egy változót vár. akkor az egy elemként adódik az elsõ tömbhöz. a függvény visszatérési értéke true. A függvénynek az $asszoc_sor tömb azon elemét kell átadnunk. amely majd a táblázatba beillesztendõ sort tartalmazza. Elõször létrehozunk egy üres $sor tömböt. Ha a változóhoz már rendeltünk értéket. az adott elem egyszerûen nem kerül bele a táblázatba. function ujNevesSor( $asszoc_sor ) { if ( count ($asszoc_sor) != $this->oszlopszam ) return false. Ezen eljárás segítségével tehát többdimenziós tömböket is létrehozhatunk. Az ujNevesSor() tagfüggvény ennél több szabadságot ad. hiszen épp az imént biztosítottuk. A metódus egy asszociatív tömböt vár. akkor az adott oszlopba egy üres karakterlánc kerül. hogy a tömbben kaptunk-e ilyen kulcsú elemet az $asszoc_sor paraméterben. Most már folytathatjuk a végleges $sor tömb felépítését és hozzáadhatjuk az $asszoc_sor megfelelõ elemét. $sor). ha a tömbként átadott paraméterben az elemek sorrendje megfelelõ. amely a Tablazat objektum $oszlopNevek tulajdonságában nem szerepel. az elemek helyes sorrendjével. foreach ( $this->oszlopNevek as $oszlopNev ) { if ( ! isset( $asszoc_sor[$oszlopNev] )) $asszoc_sor[$oszlopNev] = "". létrehozunk egy ilyet és üres karakterláncot írunk bele. Mire befejezzük . melynek kulcsa megegyezik a következõ oszlop nevével.

Objektumok az $oszlopNevek tömb bejárását. } A program magáért beszél. print "\n". majd a program végén létrehoz egy Tablazat típusú objektumot és meghívja valamennyi tagfüggvényét. mégpedig a megfelelõ sorrendben. Errõl azonban jó lenne valahogy meggyõzõdni: hiányzik még egy olyan tagfüggvény. kettõs ciklust kell használnunk. Mivel a $tablazatSorok tulajdonság kétdimenziós tömb. majd a $tablazatSorok sorait. a $sor tömb már tartalmazni fogja az $asszoc_sor tömbben átadott elemeket. vagyis a tömb minden eleme maga is egy tömb. print "\n". Elõször az $oszlopNevek elemeit írjuk ki. Összeáll a kép A 8. Az óra késõbbi részében egy sokkal szebb megoldást fogunk látni. foreach ( $this->tablazatSorok as $y ) { foreach ( $y as $xcella ) print "$xcella ". példaprogram eddigi munkánk gyümölcsét. 129 A kiir() tagfüggvény A kiir() tagfüggvény kiírja a böngészõbe a táblázat fejlécét és a $tablazatSorok tömböt. 8 . amely képes megjeleníteni a táblázatot. a Tablazat osztályt tartalmazza. } print "</pre>". amelyek segítségével sorokat adhatunk a Tablazat típusú objektumok $tablazatSorok nevû mezõjéhez. Most már van két tagfüggvényünk. foreach ( $this->oszlopNevek as $oszlopNev ) print "<B>$oszlopNev</B> ". function kiir() { print "<pre>".5. a nem meghatározott értékeket üres karakterláncokkal kitöltve. A függvény csak nyomkövetési célokat szolgál.

program A Tablazat osztály</title> </head> <body> <?php class Tablazat { var $tablazatSorok = array().130 8. return true. } function ujSor( $sor ) { if ( count ($sor) != $this->oszlopszam ) return false. $sor = array(). program A Tablazat osztály 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: <html> <head> <title>8. $sor[] = $asszoc_sor[$oszlopNev]. } array_push($this->tablazatSorok. $this->oszlopszam = count ( $oszlopNevek ). array_push($this->tablazatSorok. } function ujNevesSor( $asszoc_sor ) { if ( count ($asszoc_sor) != $this->oszlopszam ) return false. } . var $oszlopszam. $sor). $sor). foreach ( $this->oszlopNevek as $oszlopNev ) { if ( ! isset( $asszoc_sor[$oszlopNev] )) $asszoc_sor[$oszlopNev] = "".5.5. var $oszlopNevek = array(). óra 8. function Tablazat( $oszlopNevek ) { $this->oszlopNevek = $oszlopNevek.

8.1. foreach ( $this->tablazatSorok as $y ) { foreach ( $y as $xcella ) print "$xcella ".2. foreach ( $this->oszlopNevek as $oszlopNev ) print "<B>$oszlopNev</B> "."c")). print "\n".1. $proba->ujSor( array(1.Objektumok 131 8. program (folytatás) 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: function kiir() { print "<pre>".6)).5. } } $proba = new Tablazat( array("a". "a"=>6. print "\n". "c"=>3 )). ábrán láthatjuk."b". } print "</pre>". ábra Egy Tablazat típusú objektum kimenete 8 . $proba->ujNevesSor( array ( "b"=>0. példaprogram kimenetét a 8. $proba->ujSor( array(4. $proba->kiir().5.3)).5. ?> </body> </html> A 8.

hogy egyszerûen írnánk néhány tömbkezelõ függvényt? Vagy miért ne írhatnánk bele egyszerûen a programba a tömbkezelést? Azért. az adatkezelésrõl szóló fejezetben tárgyalt függvényeket használhatjuk. ha a korábban létrehozott tagfüggvények kívülrõl ugyanúgy viselkednek. Ha elhatározzuk. hogy adatokat írjon ki. melynek kulcsszavai az egységbezárás. hogy bajlódnunk kellene azzal. hogy a program többi részét módosítanánk. Miért használjunk osztályt? Miért jobb osztályt használni erre a célra ahelyett. az öröklés és a kód-újrahasznosítás. kiterjeszthetik vagy módosíthatják a már meglévõ tagfüggvényeket. Ennek célja jól meghatározott: bizonyos általános adatkezelést tesz lehetõvé. Bár az osztály hatékonyan elvégzi a munkát. amit neki szántunk. Mivel a PHP gyengén típusos nyelv. Másodszor. anélkül.. De vajon miért okoz ez nekünk problémát? Elõször is a kódot újra fel lehet használni. mert ez nem lenne hatékony. melynek arra van szüksége. hogy végigjárjuk a $tablazatSorok elemeit.132 8. hogy a tagfüggvényeknek átadott paraméterek a megfelelõ típusúak-e. a mi felelõsségünk megbizonyosodni arról. amelyet ezután beilleszthetünk bármely programba. kibõvíthetnénk néhány további szolgáltatással és adatvédelmi lehetõséggel. Ami még hiányzik. hogy ilyen típusú adatokat kezeljen és kiírjon. ha az egy oszlopban levõ elemek egyforma hosszúak. Ez teszi igazán hatékonnyá az objektumközpontú programozást. Végül. a Tablazat osztály tevékeny: megkérhetjük arra. anélkül tehetjük meg. óra A kimenet csak akkor jelenik meg helyesen. létrehozhatunk újabb osztályokat is. hogy késõbb javítunk az osztály mûködésén. ha több idõnk és helyünk lenne. amelyek már korábban létrehozott osztályoktól örökölnek. . az objektumba egy felületet is beépítettünk. Ehhez a tizenhatodik.. Ezen kívül írhatnánk tagfüggvényeket a táblázat bármely oszlop szerinti rendezésére is. Harmadszor. mert így az elvont adatok tárolását végzõ programokba valami egészen más is bekerülne.

példaprogram ismét a fejezet elsõ felében levõ témakörbõl mutat egy példát.<BR>". 17: } 18: } 19: 20: class masodik_osztaly extends elso_osztaly 21: { 22: 23: } 24: 25: $proba = new masodik_osztaly("Krisztián fia"). 10: function elso_osztaly( $n ) 11: { 12: $this->nev = $n. hogy "Üdvözlöm! Krisztián fia vagyok. 13: } 14: function koszon() 15: { 16: print "Üdvözlöm! $this->nev vagyok. 26: $proba->koszon(). egy kicsit módosítanunk kell az osztály meghatározását. // kiírja.6.6." 27: ?> 28: </body> 29: </html> 8 . 8. hogy olyan osztályt hozzunk létre. program Másik osztálytól öröklõ osztály 1: <html> 2: <head> 3: <title>8. A 8.6.Objektumok 133 Öröklés Ahhoz. program Másik osztálytól öröklõ osztály </title> 4: </head> 5: <body> 6: <?php 7: class elso_osztaly 8: { 9: var $nev = "Krisztián". amely szolgáltatásait szülõjétõl örökli.

6. nézzük tovább a 8. hogy az objektum $nev tulajdonsága az alapértelmezett "Krisztián" karakterláncról arra a "Krisztián fia" karakterláncra változott. amikor egy gyermekobjektumot hozunk létre. Az objektumközpontú világban a gyermek osztályban felül lehet írni a szülõ osztály tagfüggvényeit. program Egy felülírt tagfüggvény 1: 2: 3: 4: 5: 6: <html> <head> <title>8. hogy még konstruktort sem adtunk meg a masodik_osztaly osztálynak. hogy a gyermek objektumok bizonyos tagfüggvényei a szülõkétõl eltérõen viselkedjenek (többalakúság. más tagfüggvények viszont érintetlenül hagyva ugyanúgy jelenjenek meg a gyermek osztályban. Akkor hogy lehet az. Ezzel azt adjuk meg. 8. példában lecseréljük a masodik_osztaly koszon() tagfüggvényét.7. Ha egy osztályból egy másikat származtatunk. amit a konstruktor létrehozásakor átadtunk? Mivel nem hoztunk létre új konstruktort.7. program Egy felülírt tagfüggvény</title> </head> <body> <?php . A szülõ tagfüggvényeinek felülírása A masodik_osztaly típusú objektumok most pontosan úgy viselkednek. példaprogramot és keressünk szokatlan dolgokat! Például figyeljük meg. akkor a szülõ osztály konstruktora hívódik meg. hogyan származtattunk az elso_osztaly-tól egy új osztályt! Az extends kulcsszót az osztály meghatározásában kell használnunk.7. Ez a PHP 4-es változatának újdonsága. ezáltal lehetõvé válik. mint ahogyan minden elso_osztaly típusú objektum is rendelkezik ezekkel. A 8. a szülõ objektumtípus (elso_osztaly) konstruktora hívódott meg. mint az elso_osztaly típusúak. Ha ez nem lenne elég. hogy a kulcsszó után meghatározott osztály minden tulajdonságát és tagfüggvényét örökölni szeretnénk. óra Figyeljük meg. Az összes masodik_osztaly típusú objektum rendelkezni fog egy koszon() nevû tagfüggvénnyel és egy $nev nevû tulajdonsággal.134 8. amelynek nincsen saját konstruktora. polimorfizmus).

Objektumok 135 8. hogy "Azért se mondom meg a nevem!" 30: ?> 31: </body> 32: </html> A gyermek koszon() tagfüggvénye hívódik meg. példaprogramban a masodik_osztaly koszon() tagfüggvénye meghívja az elso_osztaly tagfüggvényét. de újakat is be szeretnénk építeni. A felülírt tagfüggvény meghívása Elõfordulhat. mert elõnyt élvez a szülõ hasonló nevû tagfüggvényével szemben.7. A 8. // kiírja. Az objektumközpontú programozásban ez megvalósítható. } function koszon() { print "Üdvözlöm! $this->nev vagyok. } } class masodik_osztaly extends elso_osztaly { function koszon() { print "Azért se mondom meg a nevem!<BR>".8. } } $proba = new masodik_osztaly("Krisztián fia"). amelyet éppen felülír. hogy a szülõ osztály szolgáltatásait szeretnénk használni. $proba->koszon(). program (folytatás) 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: class elso_osztaly { var $nev = "Krisztián". function elso_osztaly( $n ) { $this->nev = $n. 8 .<BR>".

. 10: function elso_osztaly( $n ) 11: { 12: $this->nev = $n.Üdvözlöm! Krisztián fia vagyok. a PHP 3-as változatában még hibát okozott volna. A séma új. 30: $proba->koszon().8.<BR>".136 8. program Felülírt tagfüggvény meghívása 1: <html> 2: <head> 3: <title>8.". 26: } 27: } 28: 29: $proba = new masodik_osztaly("Krisztián fia"). program Felülírt tagfüggvény meghívása</title> 4: </head> 5: <body> 6: <?php 7: class elso_osztaly 8: { 9: var $nev = "Krisztián". 13: } 14: function koszon() 15: { 16: print "Üdvözlöm! $this->nev vagyok. hogy "Azért se mondom meg a nevem! ." 31: ?> 32: </body> 33: </html> A szuloOsztalyNeve::tagfuggvenyNeve() sémát használva bármely felülírt tagfüggvényt meghívhatunk.8. 17: } 18: } 19: 20: class masodik_osztaly extends elso_osztaly 21: { 22: function koszon() 23: { 24: print "Azért se mondom meg a nevem! . óra 8. 25: elso_osztaly::koszon(). // kiírja.

a valós programokban azonban természetesen több tulajdonságot szeretnénk majd beállítani. Most a tanultaknak hasznát is vehetjük. példaprogramban szereplõ Tablazat osztálytól örököl! Az új osztály neve HTMLTablazat lesz. A lustaság erény a programozás terén: hagyjuk. ezért azt felül kell írnunk. amely a 8. } A HTMLTablazat paramétereiben az oszlopok neveinek tömbjét. ha a gyermekosztályban nem hozunk létre konstruktort. illetve egy karakterláncot vár. Megadtunk egy kezdeti értéket is.Objektumok 137 Egy példa az öröklésre Már láttuk. } Egy új osztályt hoztunk létre. $this->hatterSzin=$hatter.5. a háttér színe fehér lesz. hogy kiküszöbölje a Tablazat kiir() tagfüggvénynek szépséghibáit és a böngészõ lehetõségeit kihasználva szép kimenetet eredményezzen. A HTMLTablazat saját tulajdonságai A HTMLTablazat arra szolgál. mint amennyit a Tablazat osztály konstruktora tett. $hatter="#ffffff" ) { Tablazat::Tablazat($oszlopNevek). Ezt az osztály azért szükséges. amely a Tablazat osztálytól fog örökölni. var $cellaMargo = 2. hogy a már korábban létrehozott Tablazat típusú objektumot szabványos HTML formában jeleníthessük meg. Példánkban a táblázat cellPadding és a cellák bgColor tulajdonságai módosíthatók. annak tagfüggvényeit felülírni és képességeit kibõvíteni. így ha nem adunk át második paramétert a konstruktornak. Két új tulajdonságot adtunk meg. Most azonban azt szeretnénk. Készítsünk egy osztályt. az egyiknek a kezdõértékét is meghatároztuk. class HTMLTablazat extends Tablazat { var $hatterSzin. A karakterlánc lesz a HTML táblázat bgColor tulajdonsága. A konstruktor Már láthattuk. hogy konstruktorunk többre legyen képes. hogy a szülõ konstruktora hívódik meg. A konstruktor meghívja a Tablazat osztály konstruktorát a kapott oszlopnév-tömbbel. hogy a Tablazat konstruktora tegye a dolgát és a továbbiakban 8 . hogyan tud egy osztály egy másiktól örökölni. function HTMLTablazat( $oszlopNevek.

function kiir() { print "<table cellPadding=\"$this->cellaMargo\" border=1>\n". de a HTML table elemét használja a táblázat formázására. function cellaMargoAllit( $margo ) { $this->cellaMargo = $margo. A cellaMargoAllit() tagfüggvény A származtatott osztály saját. foreach ( $this->oszlopNevek as $oszlopNev ) print "<th bgColor=\"$this ->hatterSzin\”>$oszlopNev</th>”. A konstruktor másik dolga a HTMLTablazat hatterSzin tulajdonságának beállítása. Ez a függvény a szülõ osztály logikájával azonos módon írja ki a táblázatot. print "<tr>\n". print "</tr>\n". Alapszabály. akkor a szülõ osztály konstruktora már nem kerül automatikusan meghívásra. a gyermek osztályból kell meghívni a szülõ konstruktorát. hogy megváltoztathassa a margó méretét. Sajnos nincs elegáns mód ennek a kikényszerítésére. } A kiir() tagfüggvény A kiir() tagfüggvény felülírja a Tablazat osztály azonos nevû tagfüggvényét. hogy az objektumot használó személy érdekében legjobb tagfüggvényeket létrehozni erre a célra. . akkor használjuk is…).138 8. Ha a gyermek osztály rendelkezik konstruktorral.de ez nem túl jó ötlet. A cellaMargoAllit() tagfüggvény segítségével a felhasználó a táblázat szövege és a táblázat közötti üres rés nagyságát állíthatja be. Persze megtehetné ezt a cellaMargo tulajdonság közvetlen elérésével is . óra nem foglalkozunk a táblázat kezelésével (ha egyszer már megírtuk. Ezért ha szükséges. új tagfüggvényeket is létrehozhat. Az osztályok bonyolultabb leszármazottaiban a cellaMargoAllit() tagfüggvény esetleg más tulajdonságokat is kénytelen módosítani.

program A Tablazat és a HTMLTablazat osztályok 1: <html> 2: <head> 3: <title>8. 11: var $oszlopszam.9.9. } Ha a Tablazat osztálybeli változat világos.Objektumok foreach ( $this->tablazatSorok as $sor => $cellak ) { print "<tr>\n". az itteni kiir() tagfüggvény is elég áttekinthetõ kell. Elõször az $oszlopNevek elemeit írjuk ki. 8 . hogy legyen. 10: var $oszlopNevek = array(). majd a $tablazatSorok sorait. példaprogramban a Tablazat és a HTMLTablazat példákat egy helyen láthatjuk.9. program A Tablazat és a HTMLTablazat osztályok</title> 4: </head> 5: <body> 6: <?php 7: class Tablazat 8: { 9: var $tablazatSorok = array(). foreach ( $cellak as $cella ) print "<td bgColor=\"$this ->hatterSzin\">$cella</td>\n". írunk bele néhány sort. megváltoztatjuk cellaMargo tulajdonságát. majd meghívjuk a kiir() tagfüggvényt. 139 A Tablazat és a HTMLTablazat osztályok a maguk teljességében A 8. A formázást a HTML table elemének cellPadding és bgColor tulajdonságai segítségével szabályozhatjuk. A valóságban az adatok minden bizonnyal közvetlenül egy adatbázisból származnának. } print "</table>". Létrehozunk egy HTMLTablazat típusú objektumot. 8. print "</tr>\n".

print "\n". } function kiir() { print "<pre>". print "\n". array_push($this->tablazatSorok. $sor). return true. } function ujNevesSor( $asszoc_sor ) { if ( count ($asszoc_sor) != $this->oszlopszam ) return false. program (folytatás) 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: function Tablazat( $oszlopNevek ) { $this->oszlopNevek = $oszlopNevek. $sor). óra 8. foreach ( $this->oszlopNevek as $oszlopNev ) { if ( ! isset( $asszoc_sor[$oszlopNev] )) $asszoc_sor[$oszlopNev] = "". } function ujSor( $sor ) { if ( count ($sor) != $this->oszlopszam ) return false. $sor = array(). $sor[] = $asszoc_sor[$oszlopNev]. } . } array_push($this->tablazatSorok. foreach ( $this->oszlopNevek as $oszlopNev ) print "<B>$oszlopNev</B> ". $this->oszlopszam = count ( $oszlopNevek ).9.140 8. foreach ( $this->tablazatSorok as $y ) { foreach ( $y as $xcella ) print "$xcella ".

63: $this->hatterSzin=$hatter. 69: } 70: function kiir() 71: { 72: print "<table cellPadding=\"$this->cellaMargo\" border=1>\n". 76: print "</tr>\n". $hatter="#ffffff" ) 61: { 62: Tablazat::Tablazat($oszlopNevek). 60: function HTMLTablazat( $oszlopNevek. 83: } 84: print "</table>". 82: print "</tr>\n". 85: } 86: } 87: 8 . 77: foreach ( $this->tablazatSorok as $sor => $cellak ) 78: { 79: print "<tr>\n". program (folytatás) 52: print "</pre>". 53: } 54: } 55: 56: class HTMLTablazat extends Tablazat 57: { 58: var $hatterSzin. 73: print "<tr>\n".9. 64: } 65: 66: function cellaMargoAllit( $margo ) 67: { 68: $this->cellaMargo = $margo. 59: var $cellaMargo = 2. 80: foreach ( $cellak as $cella ) 81: print "<td bgColor=\"$this->hatterSzin\" >$cella</td>\n". 74: foreach ( $this->oszlopNevek as $oszlopNev ) 75: print "<th bgColor=\"$this->hatterSzin\" >$oszlopNev</th>".Objektumok 141 8.

ha a HTML táblázat képességeit beépítjük a Tablazat osztályba? A válasz kulcsa a rugalmasság kérdése. 94: ?> 95: </body> 96: </html> A 8. 90: $proba->ujSor( array(1. hogy egy ügyfél azt a megbízást adja nekünk.2."b".3)). melyek megoldják a problémát. hogy hozzunk létre egy osztályt. 8. hogy szeretné."c").2. ahol a táblázat oszlopainak neve van. ábra Egy HTMLTablazat típusú objektum kimenete Miért alkalmazzunk öröklést? Miért vágtuk ketté a feladatot egy Tablazat és egy HTMLTablazat részre? Biztos.5. 89: $proba->cellaMargoAllit( 7 ). De ha visszajön az ügyfél. óra 8. 91: $proba->ujSor( array(4.142 8. Képzeljük el. 92: $proba->ujNevesSor( array ( "b"=>0.9. . 93: $proba->kiir(). hogy idõt és fáradságot takaríthattunk volna meg. ábrán láthatjuk. "c"=>3 )).9. példaprogram kimenetét a 8. valószínûleg újabb tagfüggvényeket kellene megpróbálnunk felvenni. amelybe minden szolgáltatást (a HTML megjelenítés minden apró részletével) beleépítünk. program (folytatás) 88: $proba = new HTMLTablazat( array("a". amely olyan táblázatok kezelésére képes.6)). Ha egyetlen részbõl álló osztályt hozunk létre.2. "a"=>6. elsõ látásra minden szépnek és jónak tûnhet. "#00FF00"). ha a program ízlésesen formázott szöveges kimenetet eredményezne.

leszármazásokat) mutatja. hogy szeretné a táblázatot fájlba menteni. hogy az objektumközpontú programozást minden szempontból megvizsgáljuk egy rövidke óra alatt. illetve HTML.3. ábra az osztályok közötti kapcsolatokat (függõségeket. Eddigi osztályainkhoz hozzá sem kell nyúlnunk. a megfelelõ kiíró függvény kerül meghívásra. ábra Kapcsolatok a Tablazat osztály és gyermekei között Sõt. ha minden szolgáltatást egyetlen osztályba építünk bele. Összefoglalás Sajnos nincs rá mód. mint a hagyományosak. Játsszuk el ezt a forgatókönyvet a Tablazat és a HTMLTablazat osztályainkkal! Alaposan sikerült elkülöníteni az adatok feldolgozását és megjelenítését. esetleg a teljes átírását fontolgatjuk.3. nekünk kell eldöntenünk. hogy az adott elem a Tablazat melyik leszármazottja. Egy egyszerû Tablazat osztályból származtatott típusú objektumok tömbje segítségével elektronikus leveleket írhatunk. hogy milyen mértékben használunk osztályokat a programokban. A 8. 8 . XML vagy szöveges állományokat állíthatunk elõ a kiir() függvény meghívásával. a cég belsõ hálózata az XML nyelvet használja. hogy minden. meghívjuk minden elem kiir() tagfüggvényét és nem kell azzal foglalkoznunk. nem lehetne beépíteni a támogatást ehhez is? Ennél a pontnál. 143 8. Ha ügyfelünk azzal a kéréssel fordul hozzánk. Ez igaz a TablazatLevel és az XMLTablazat osztályokra is. hogy szeretné a programot elektronikus levelek küldésére használni és ha már úgyis fejlesztünk a programon. Nevezzük ezt TablazatFajl osztálynak. a program kezd ormótlanul nagy lenni.Objektumok Egy-két héten belül ügyfelünk ráébred. így azokat egy tömbbe is gyûjthetjük. de remélem. Azután végigszaladunk a tömbön. tudjuk. viszont a rugalmasság és átláthatóság jelentõsen nõ. hogy a fontosabb lehetõségeket sikerült bemutatni. Azt. Az objektumközpontú megközelítést intenzíven használó programok általában némileg több erõforrást igényelnek. csak egy új osztályt kell származtatnunk a Tablazat osztályból. a Tablazat osztályból származtatott osztálynak van egy kiir() tagfüggvénye.

hogyan hozhatunk létre új osztályokat más osztályokból az öröklés és a tagfüggvény-felülírás segítségével. Egy osztályon belül szükséges az osztály tagfüggvényeit vagy tulajdonságait elérni. összetevõinek eléréséhez a -> mûveletjelet kell használni. Ekkor a $this változót kell használni.144 8. Kvíz 1. Kérdések és válaszok Ebben az órában néhány barátságtalan fogalommal találkoztunk. Mûhely A mûhelyben kvízkérdések találhatók. Még ha el is határoznánk. Az objektumközpontú megközelítés nem tesz számunkra olyan dolgokat lehetõvé. hogy soha nem fogunk objektumközpontú programot írni. óra Ebben az órában arról tanultunk. Megtanultunk tulajdonságokat és tagfüggvényeket létrehozni és elérni. Hogyan hoznánk létre egy uresOsztaly nevû osztályt. A legtöbb PHP programozó alig vagy egyáltalán nem ír objektumközpontú programot. Hogyan lehet egy osztályban konstruktort létrehozni? . elõfordulhat. Hogyan hoznánk létre egy példányát? 3. Adott egy uresOsztaly nevû osztály. hogyan hozhatunk létre osztályokat és belõlük objektumpéldányokat. melyek segítenek megszilárdítani az órában szerzett tudást. amely egy mutató az adott objektumra. amelynek nincsenek tagfüggvényei és tulajdonságai? 2. amelyek eddig elérhetetlenek voltak. hogy jó PHP programozó válhasson az emberbõl? Erre a rövid válasz: nem. Nem értem a $this változó szerepét. Hogyan kell a konstruktor nevét megválasztani? 5. A válaszokat az A függelékben helyeztük el. A dolog lényege a programok szervezésében. amelyekben osztályok vannak. Mivel a $this változó mutató (hivatkozás). amelynek valamely tagfüggvényét meghívtuk. hogy bele kell javítanunk mások által írt programokba. az egyszer megírt programrészek újrahasznosításában és a könnyû fejleszthetõségben rejlik. Valóban szükséges az objektumközpontúságot megérteni ahhoz. Hogyan lehet az osztályba egy tulajdonságot felvenni? 4. Végül azt is megtanultuk. Ez az óra ebben is segítséget nyújthat. ezért értenünk kell a szemlélet alapjait.

amely kiírja a két számot a böngészõbe! 2. amely két egész számot tárol. Írjunk hozzá egy kiszamol() nevû tagfüggvényt.Objektumok 6. amely a Szamolo osztálytól örököl. hogy egy osztály más osztálytól örököljön? 145 Feladatok 1. Írjuk át ennek kiszamol() tagfüggvényét úgy. hogy az a két tulajdonság összegét írja ki a böngészõbe! 3. Hogyan lehet létrehozni közönséges tagfüggvényeket? 7. Az elõzõ feladathoz hasonlóan módon készítsük el a Kivon osztályt! 8 . Hozzuk létre a Szamolo nevû osztályt. Hozzuk létre az Osszead osztályt. Mit kell tennünk. Hogyan lehet osztályon kívülrõl az osztály tulajdonságaihoz és tagfüggvényeihez hozzáférni? 8. Hogyan lehet osztályon belülrõl az osztály tulajdonságaihoz és tagfüggvényeihez hozzáférni? 7. ha azt szeretnénk.

.

óra Ûrlapok Fájlok használata A DBM függvények használata Adatbázisok kezelése – MySQL Kapcsolat a külvilággal Dinamikus képek kezelése Dátumok kezelése Az adatok kezelése Karakterláncok kezelése A szabályos kifejezések használata Állapotok tárolása sütikkel és GET típusú lekérdezésekkel Állapotok tárolása munkamenet-függvényekkel Munka kiszolgálói környezetben Hibakeresés . óra 11. óra 10. óra 17. óra 16. óra 20. óra 22. óra 13.III. óra 19. óra 15. RÉSZ Munka a PHP-vel 9. óra 14. óra 21. óra 12. óra 18.

.

Ebben az órában ezt a témakört tekintjük át. amíg a felhasználó által megadott adatokat kezelni nem tudjuk. készítettünk és meghívtunk különbözõ függvényeket. hogy a kitöltött HTML ûrlapokat könnyen fel tudja dolgozni. A PHP-t úgy tervezték. eddigi ismereteink azonban értelmetlenek.9. ÓRA Ûrlapok A könyv eddigi példáiban egy nagyon fontos dolgot nem láttunk. Létrehoztunk változókat és tömböket. A Világhálón alapvetõen a HTML ûrlapokon keresztül áramlik az információ a felhasználó és a kiszolgáló között. Ebben az órában a következõket tanuljuk meg: • Hogyan férjünk hozzá a környezeti változókhoz és hogyan használjuk azokat? • Hogyan férjünk hozzá az ûrlapmezõkben megadott információkhoz? • Hogyan dolgozzunk az ûrlapok több elem kiválasztását engedélyezõ elemeivel? . különféle objektumokkal dolgoztunk.

1.1. 9: $user3 = "János". amely kezeli ezt? Globális és környezeti változók Mielõtt elkészítenénk elsõ igazi ûrlapunkat. amely egyszerre tartalmazza a HTML ûrlapot és az ezt kezelõ PHP programot? • Hogyan mentsük az állapotot rejtett mezõkkel? • Hogyan irányítsuk a felhasználót új oldalra? • Hogyan készítsünk fájlfeltöltõ HTML ûrlapot és hogyan írjunk olyan PHP programot. 8: $user2 = "István". A globális változókkal elõször a függvényekrõl szóló hatodik órában találkoztunk. program A $GLOBALS tömb elemeinek kiírása</title> 4: </head> 5: <body> 6: <?php 7: $user1 = "Judit". 13: } 14: ?> 15: </body> 16: </html> . példában. program A $GLOBALS tömb elemeinek kiírása 1: <html> 2: <head> 3: <title>9. hogy újra áttekintsük a globális változókat. A globális változók azok a változók. óra • Hogyan készítsünk olyan kódot.150 9.1. kis kitérõt kell tennünk. A $GLOBALS tömb használatát láthatjuk a 9. amelyeket a program legfelsõ szintjén. 9. azaz a függvényeken kívül vezettünk be. 10: foreach ( $GLOBALS as $kulcs=>$ertek ) 11: { 12: print "\$GLOBALS[\"$kulcs\"] == $ertek<br>". amelyben egy ciklussal kiírjuk programunk összes globális változóját. Minden függvény számára elérhetõ a beépített $GLOBALS nevû tömb.

35 POST nev=janos&cim= ismeretlen /php-konyv/urlapok/ 9. Láthatjuk az általunk megadott változókat.I.1.program. A szerzõ rendszerén az érték a következõ volt: /php-konyv/urlapok/9. 151 9 9.php?nev= janos http://www. Ezeket a változókat környezeti változóknak nevezzük.14. a rendszertõl és a beállításoktól függõen különféle környezeti változók létezhetnek. Linux2. amelyek a kiszolgáló és az ügyfél környezetét írják le.proba.152.55.6 (X11.hu/ egy_oldal. Például a $GLOBALS["PHP_SELF"] az éppen futó program elérési útját adja meg. táblázat Környezeti változók Változó $HTTP_USER_AGENT $REMOTE_ADDR $REQUESTED_METHOD $QUERY_STRING Tartalma A böngészõ neve és változatszáma Az ügyfél IP címe A kérelem módja (GET vagy POST) A GET kérelmeknél az URL-hez kapcsolt kódolt adat Példa Mozilla/4. de a program ezeken kívül másokat is kiírt.html $REQUEST_URI A kérelem teljes címe a lekérdezõ karaktersorozattal $HTTP_REFERER Az oldal címe.program. A kiszolgálótól. táblázatban a leggyakoribb környezeti változókat soroltuk fel. ezek ismerete rendkívül fontos. A 9.Ûrlapok Három változót vezettünk be és a $GLOBALS tömb elemein végiglépkedve kiírtuk a változók neveit és értékeit a böngészõben. amelyrõl a kérelem érkezett A PHP létrehoz más környezeti változókat is.6-15apmac ppc) 158.1. a PHP ugyanis automatikusan bevezet néhány globális változót.php .1.2. A környezeti változók értéke közvetlenül vagy a $GLOBALS tömb részeként érhetõ el.

és egy gombot tartalmaz.2.152 9. példában egy egyszerû HTML ûrlap kódját láthatjuk. A HTML oldalt leíró és az ûrlapot elemzõ PHP kódot gyakran tároljuk egy állományban.2. A 9. $PHP_SELF néven. a HTML és PHP kódot tartalmazó fájloknak egy könyvtárban kell lenniük. példaprogram kiírja a felhasználó által megadott információkat. A $GLOBALS tömb ezenkívül még sok másra is használható. amely feldolgozza az ûrlapon megadott adatokat.3. A FORM elem ACTION paramétere a 9. program Egy egyszerû HTML ûrlap 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: <html> <head> <title>9. 9.php" method="GET"> <input type="text" name="felhasznalo"> <br> <textarea name="cim" rows="5" cols="40"> </textarea> <br> <input type="submit" value="rendben"> </form> </body> </html> Egy HTML ûrlapot hoztunk létre.php fájlra mutat. program Egy egyszerû HTML ûrlap</title> </head> <body> <form action="9. Adatok bekérése a felhasználótól Jelenleg a HTML és PHP kódot külön állományban tároljuk. ha mégis nehéznek találjuk a példákat.3. a HTML nyelvvel foglalkozó kötetet vagy számítógépes leírást. .program. Ebben az órában még sokszor fogjuk használni ezt a változót. Könyvünk nem foglakozik részletesen a HTML ismertetésével. óra A változó értéke közvetlenül is elérhetõ. A 9.program.3. egy "cim" nevû szövegterületet. amely egy "felhasznalo" nevû szövegmezõt. olvassunk el egy.2. Az oldal nevének tárolásához a $PHP_SELF változó értékét a HTML FORM elemének ACTION paraméteréhez rendeljük. Mivel az ACTION csak a fájl nevét adja meg.

Ezt láthatjuk a 9. példa ûrlapjának feldolgozása</title> 4: </head> 5: <body> 6: <?php 7: print "Üdvözlet <b>$felhasznalo</b><P>\n\n". .4. példa ûrlapjának feldolgozása 1: <html> 2: <head> 3: <title>9. A fájlban lévõ kódot akkor hívjuk meg. melynek segítségével több elem kiválasztását engedélyezhetjük. 8: print "A címe:<P>\n\n<b>$cim</b>". hogy a PHP 4 segítségével milyen egyszerûen kezelhetõek az ûrlapok.3. az elem neve után írjunk üres szögletes zárójeleket.php fájlban tároljuk.3.3. progran A 9. Bármilyen megadott információ globális változóként hozzáférhetõ és a változók neve megegyezik a megfelelõ HTML elem nevével. amelyet nem hivatkozáson keresztül hívunk meg és nem közvetlenül a böngészõbe írjuk be a címét.2. példában található kódot az 9.3. Ha a SELECT elemnek egyszerû nevet adunk: <select name="termekek" multiple> akkor a feldolgozó program csak az egyik kiválasztott elemhez fér hozzá. példában.Ûrlapok 153 9.program. 9: ?> 10: </body> 11: </html> 9 Ez a könyv elsõ olyan programja. amelyek a HTML ûrlap "felhasznalo" szövegmezõjének és "cim" területének értékét tartalmazzák. A 9. program A 9.2. Ha minden elemet el szeretnénk érni a programból. amikor a felhasználó kitölti a 9. Látható. A program a $felhasznalo és a $cim változók értékét írja ki. Most megtanuljuk a SELECT elem kezelését. Több elem kiválasztása a SELECT elemmel Elõzõ példánkban olyan HTML ûrlap szerepelt. amely egy elemhez egyetlen érték hozzárendelését engedélyezte.2. példában található ûrlapot.

program A 9. program A 9. példában 9. 10: print "<ul>\n\n".program. program SELECT elemet tartalmazó HTML ûrlap</title> 4: </head> 5: <body> 6: <form action="9. Ezt mutatjuk be a 9. példában látott ûrlap feldolgozása</title> 4: </head> 5: <body> 6: <?php 7: print "Üdvözlet <b>$felhasznalo</b><P>\n\n".4.5.4. .4. óra 9.php" method="POST"> 7: <input type="text" name="felhasznalo"> 8: <br> 9: <textarea name="cim" rows="5" cols="40"> 10: </textarea> 11: <br> 12: <select name="termekek[]" multiple> 13: <option>Ultrahangos csavarhúzó 14: <option>Tricorder 15: <option>ORAC AI 16: <option>HAL 2000 17: </select> 18: <br> 19: <input type="submit" value="rendben"> 20: </form> 21: </body> 22: </html> Az ûrlapot feldolgozó programban a SELECT elemben kiválasztott adatok a $termekek tömbben találhatóak. 8: print "A címe:<P>\n\n<b>$cim</b>".5.154 9. program SELECT elemet tartalmazó HTML ûrlap 1: <html> 2: <head> 3: <title>9. 9: print "A következõ termékeket választotta:<p>\n\n".5.4. példában látott ûrlap feldolgozása 1: <html> 2: <head> 3: <title>9.5.

hogy a kitöltött ûrlap GET vagy POST metódust használt. Ezek az asszociatív tömbök tartalmazzák az ûrlap mezõinek neveit és a hozzájuk rendelt értékeket. A 9. példa azt mutatja be.6. A 9. ahol a felhasználó több elemet is kiválaszthat. amely az ûrlap változásaihoz alkalmazkodik vagy egyszerre többféle ûrlapot képes kezelni. hogyan listázható ki az ûrlap minden mezõje egy GET kérelem esetén. csak az utolsó kiválasztott értéket kapjuk meg. az adott nevû elemeket a PHP tömbként kezeli. A PHP 4 globális változói erre a problémára is megoldást nyújtanak. } print "</ul>". . példa SELECT elemét jelölõnégyzetekre cserélhetjük és ugyanazt a hatást érjük el: <input å <input å <input å <input å type="checkbox" name="termekek[]" value="Ultrahangos csavarhúzó">Ultrahangos csavarhúzó<br> type="checkbox" name="termekek[]" value="Tricorder">Tricorder<br> type="checkbox" name="termekek[]" value= "ORAC AI">ORAC AI<br> type="checkbox" name="termekek[]" value= "HAL 2000">HAL 2000<br> Az ûrlap minden mezõjének hozzárendelése egy tömbhöz Az eddig megtanult módszerek mindaddig jól mûködnek. Gyakran azonban olyan programra van szükségünk. elérhetõvé válnak a $HTTP_GET_VARS vagy a $HTTP_POST_VARS változók. anélkül. amíg programunk tudja. de ha a nevet üres szögletes zárójelek követik.4. ?> </body> </html> 9 Nem csak a SELECT elem engedélyezi több elem kiválasztását.Ûrlapok 155 9. Attól függõen. milyen mezõkkel dolgozik. program (folytatás) 11: 12: 13: 14: 15: 16: 17: 18: foreach ( $termekek as $termek ) { print "<li>$termek<br>\n".5. Ha több jelölõnégyzetnek ugyanazt a nevet adjuk. hogy keverné a mezõk neveit.

óra 9. kiírja a tömb elemeit. program A $HTTP_GET_VARS tömb használata</title> 4: </head> 5: <body> 6: <?php 7: foreach ( $HTTP_GET_VARS as $kulcs => $ertek ) 8: { 9: print "$kulcs == $ertek<BR>\n". A 9. ha tömböt tartalmaz 1: <html> 2: <head> 3: <title>9. Magyarország termekek == Array A termekek tömböt tartalmazza a $HTTP_GET_VARS tömb.7. példaprogrammal olyan HTML ûrlapról érkezõ adatok feldolgozását végeztetjük. 10: } 11: ?> 12: </body> 13: </html> A fenti kód a GET kérelmen keresztül érkezett paraméterek neveit és értékeit írja ki.6. amikor valamelyik átadott paraméter tömb. hogy a paraméter típusa tömb-e és ha igen. program A $HTTP_GET_VARS tömb használata 1: <html> 2: <head> 3: <title>9. 9.4. de kódunk még nem tudja ezt kezelni. amelyben több elem kiválasztását engedélyezõ SELECT mezõ szerepel.156 9. példaprogram ellenõrzi.7. ha tömböt tartalmaz</title> 4: </head> 5: <body> 6: <?php . Ha a 9. Természetesen itt még nem kezeltük azt az esetet.6. valami hasonlót olvashatunk: felhasznalo == Kiss Iván cim == Budapest. program A $HTTP_GET_VARS tömb használata.7. program A $HTTP_GET_VARS tömb használata.

értéke értelemszerûen "get" vagy "post".7.. . foreach ( $ertek as $tombelem ) print ". hogy a következõ elem tömb-e. Különbségek a GET és a POST továbbítás között A program akkor rugalmas.. Ha az elem tömb. a gettype() függvénnyel ellenõrizzük.. hogy a $HTTP_POST_VARS tömb csak POST továbbítási mód esetén tartalmaz elemeket.. Érdemes tudni. egy második foreach segítségével végiglépkedünk az elemein és kiírjuk azokat a böngészõbe. } else { print "$kulcs == $ertek<br>\n". program mindig a megfelelõ tömbbõl olvassa ki a paramétereket.. hogy $HTTP_POST_VARS vagy $HTTP_GET_VARS tömbbõl olvassa-e ki az elemeket.8.. ha el tudja dönteni. A 9. program (folytatás) 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: foreach ( $HTTP_GET_VARS as $kulcs => $ertek ) { if ( gettype( $ertek ) == "array" ) { print "$kulcs == <br>\n". A továbbítás típusát (GET vagy POST) a legtöbb rendszerben a $REQUEST_METHOD környezeti változó tartalmazza.. } } ?> </body> </html> 9 Mielõtt a forearch segítségével a $HTTP_GET_VARS tömb elemein végiglépkednénk.Ûrlapok 157 9.$tombelem<br>"..

hogy a $HTTP_POST_VARS változó tartalmaz-e elemeket. . Most már kiírathatjuk a $PARAMETEREK tömb tartalmát a korábban látott módon. 10: foreach ( $PARAMETEREK as $kulcs => $ertek ) 11: { 12: if ( gettype( $ertek ) == "array" ) 13: { 14: print "$kulcs == <br>\n". óra 9. 15: foreach ( $ertek as $tombelem ) 16: print ". program A GET és POST kérelmek kezelése</title> 5: </head> 6: <body> 7: <?php 8: $PARAMETEREK = ( count( $HTTP_POST_VARS ) ) 9: ? $HTTP_POST_VARS : $HTTP_GET_VARS... A count() visszatérési értéke a tömb elemeinek száma: pozitív. ha nem.. 17: } 18: else 19: { 20: print "$kulcs == $ertek<br>\n".. akkor a $PARAMETEREK változót egyenlõvé tesszük vele.... egyébként a $PARAMETEREK a $HTTP_GET_VARS értékét veszi fel.. ha a paraméterében megadott változó tartalmaz elemeket és 0 (false). 21: } 22: } 23: ?> 24: </body> 25: </html> A feltételes mûveletjellel beállítjuk a $PARAMETEREK változó értékét. Ha a $HTTP_POST_VARS tartalmaz elemeket. A count() függvénnyel ellenõrizzük.8.8.$tombelem<br>".158 9. program A GET és POST kérelmek kezelése 1: <html> 2: <head> 3: <title>9.

ha dinamikusan írjuk meg. hogy nem készítettünk gombot. viszont néhány régebbi böngészõ ezt nem teszi meg. példában a fenti feladat megoldását tartalmazó HTML kódot láthatjuk. program Saját magát meghívó HTML kód</title> 4: </head> 5: <body> 6: <form action="<?php print $PHP_SELF?>" method="POST"> 7: Ide írja a tippjét: <input type="text" name="tipp"> 8: </form> 9: </body> 10: </html> A fenti ûrlap saját magát hívja meg. A következõ példákban olyan oldalt fejlesztünk. A teljes változatban valószínûleg véletlenszámot állítanánk elõ. de ekkor elveszítjük a PHP használatának elõnyét.9. Elõször meg kell adnunk a számot. mondjuk a 42-t. Ez akkor lehet hasznos. példában lévõ program nem dinamikus. A kód egy egyszerû szövegmezõt és némi PHP kódot tartalmaz. amikor a felhasználó számára többször adjuk át ugyanazt az ûrlapot. Az újabb böngészõk a szövegmezõ kitöltése és az ENTER lenyomása után automatikusan elküldik a megadott adatot. Ezután megnézzük. Vegyük észre. most azonban egyszerûen megadjuk. amely az ûrlapról beérkezõ egész számról megmondja. hogy az ûrlapot leíró HTML kódot és az ûrlapot kezelõ PHP kódot egyetlen fájlban tároljuk.9. program Saját magát meghívó HTML kód 1: <html> 2: <head> 3: <title>9. ami a felhasználótól függ. Természetesen kódunk sokkal rugalmasabb. példában további PHP kódot építünk az oldalba. A 9.9. hogy az ûrlapot kitöltötték-e már. A HTML és PHP kódot ne keverjük a közös fájlon belül. amelyeket késõbb fel tudunk használni. különben .10.Ûrlapok 159 PHP és HTML kód összekapcsolása egy oldalon Néhány esetben szükség lehet rá. Ahol lehetséges. mert a FORM elem ACTION paraméterének a $PHP_SELF értéket adtunk. amely elküldi a beírt számot. hogy kisebb vagy nagyobb-e egy elõre megadott egész értéknél.9. mert így a forrás nehezebben lesz olvasható és módosítható. amit a felhasználónak ki kell találnia. 9 9. A 9. készítsünk HTML kódból meghívható PHP függvényeket. A 9. hiszen nem ír ki semmit.

amely még nem létezik. Amikor az ûrlap elküldi a "tipp" paramétert. program Számkitalálós PHP program 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: <?php $kitalalando_szam = 42. próbáljon egy kisebbet!". program Számkitalálós PHP program</title> </head> <body> <h1> <?php print $uzenet ?> </h1> <form action="<?php print $PHP_SELF?>" method="POST"> Ide írja a tippjét: <input type="text" name="tipp"> </form> </body> </html> . a $tipp változó globális változóként hozzáférhetõ lesz a programban. } ?> <html> <head> <title>9. hogy az ûrlapot kitöltötték-e már. A $tipp változó létezése esetén egészen biztosak lehetünk benne. hogy az ûrlapot a felhasználó kitöltötte. } elseif ( $tipp < $kitalalando_szam ) { $uzenet = "A(z) $tipp túl kicsi. 9.10. $uzenet = "".160 9. óra olyan változóval számolnánk.10. így elvégezhetjük a további vizsgálatokat. if ( ! isset( $tipp ) ) { $uzenet = "Üdvözlöm a számkitalálós játékban!". próbáljon egy nagyobbat!". hogy legyenek { $uzenet = "Telitalálat!". } else // egyenlõk kell. } elseif ( $tipp > $kitalalando_szam ) { $uzenet = "A(z) $tipp túl nagy. A $tipp változó létezésének ellenõrzésével megtudhatjuk.

hacsak meg nem nézi a HTML forráskódot. Különben megvizsgáljuk az elõre megadott számot és a $tipp értékét. } else // egyenlõk kell. 161 9 Állapot mentése rejtett mezõkkel A 9. hogy legyenek { $uzenet = " Telitalálat!". hogy a felhasználó hányszor tippelt. $probalkozasok = ( isset( $probalkozasok ) ) ? ++$probalkozasok : 0. Végül a HTML oldal törzsében csak ki kell írnunk az $uzenet értékét. a felhasználó csak most lépett az oldalra. egy rejtett mezõ bevezetésével azonban ez is számon tartható. A rejtett mezõ ugyanúgy mûködik. A PHP és a HTML kódot szétválasztva tartva egy grafikus könnyen módosíthatja az oldalt. A program persze még továbbfejleszthetõ. 9. if ( ! isset( $tipp ) ) { $uzenet = "Üdvözlöm a számkitalálós játékban!". mint a szövegmezõ. próbáljon egy nagyobbat!". A 9. próbáljon egy kisebbet!". } elseif ( $tipp < $kitalalando_szam ) { $uzenet = "A(z) $tipp túl kicsi.Ûrlapok A program törzsében egy if szerkezettel vizsgáljuk a $tipp változót és adunk értéket az $uzenet változónak.11. példában található programban bevezetünk egy rejtett mezõt.10. program Állapot mentése rejtett mezõvel 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: <?php $kitalalando_szam = 42. Ha a $tipp változó még nem létezik. $uzenet = "".11. példában található program nem tudja. } . a programozó közremûködése nélkül. de a felhasználó nem látja. ezért üdvözöljük. amely a találgatások számát tartalmazza. } elseif ( $tipp > $kitalalando_szam ) { $uzenet = "A(z) $tipp túl nagy. és ez alapján rendeljük az $uzenet változóhoz a megfelelõ szöveget.

A PHP segítségével kiírjuk a "probalkozasok" és a "tipp" mezõ értékét.162 9.11. Egy kifejezés értékének kiírásához a böngészõben a print() vagy az echo() utasításokat használhatjuk. Ha az ûrlapot rosszul töltötték ki.11. ?> <html> <head> <title>9. A beadott tipp értékét egész számmá alakítjuk a kérdõívbe írás elõtt. program Állapot mentése rejtett mezõvel</title> </head> <body> <h1> <?php print $uzenet ?> </h1> Tippelés sorszáma: <?php print $probalkozasok?> <form action="<?php print $PHP_SELF?>" method="POST"> Ide írja a tippjét: <input type="text" name="tipp" value="<?php print $tipp?>"> <input type="hidden" name="probalkozasok" value="<?php print $probalkozasok?>"> </form> </body> </html> A rejtett mezõ neve "probalkozasok". óra 9. hányszor próbálkozott és mit tippelt utoljára. a böngészõ az azt következõ kifejezés értékét kiírja. Ha egyenlõségjelet (=) teszünk a PHP blokkot nyitó elem után. program (folytatás) 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: $tipp = (int) $tipp. így a <? print $proba?> helyett írhatjuk a következõt is: <?=$proba?> . a felhasználó tudni fogja. hogy a felhasználó tudja. mit rontott el. Ez az eljárás akkor lehet hasznos. PHP módban ezt egyszerûbben is megtehetjük. amikor a kitöltött ûrlapot elemezzük.

hogy kell-e növelni a $probalkozasok változó értékét. A 9. hogy honnan származik az értékük. 09 Jan 2000 18:37:45 GMT Server: Apache/1. Ne bízzunk meg feltétel nélkül a rejtett mezõkben.9 (Unix) PHP/4. példa Egy jellemzõ PHP fejléc 1: 2: 3: 4: 5: 6: HEAD /php-konyv/urlapok/9. Amikor az ügyfélprogram elkezdi a kapcsolatot a kiszolgálóval. A HTML kód törzsében folyamatosan kiírjuk. hányszor próbálkozott a felhasználó. 9. A felhasználó a forrás megváltoztatásával könnyedén csalhat a programban. hogy ne használjuk õket. de a header() függvénnyel mi is beállíthatjuk a fejléc egyes elemeit. Az ûrlap mindig újratöltõdik.0 Connection: close Content-Type: text/html . Ez mindenféle kiírás. ha kitalálta a számot. A HTML nyelvben sajnos elkerülhetetlen az egész oldal újratöltése. még sortörés és szóköz karakter esetén is bekövetkezik.1. példában egy jellemzõ PHP fejlécet láthatunk. hogy nagy körültekintéssel tegyük.3. csak azt. Nem mondjuk. így ellenõriznünk kell a felhasználandó külsõ állományokat is. különben 0-ra állítjuk.php HTTP/1. különben a függvényhívás elõtt a PHP elküldi a saját fejlécét. a felhasználót azonban átirányíthatjuk egy gratuláló oldalra. Nem tudhatjuk. akkor növeljük az értékét.12.1 200 OK Date: Sun. akár nem. Ha a változó létezik.Ûrlapok A PHP kód törzsében egy feltétellel megvizsgáljuk. 163 9 A felhasználó átirányítása Programunknak van egy nagy hátulütõje. hogy a böngészõnek nem írtunk ki semmit.program. A rejtett mezõk használata nem biztonságos. biztosnak kell benne lennünk. Ha a header() függvényt szeretnénk használni.12. akár kitalálta a felhasználó a számot.0 HTTP/1. amely különbözõ információkat tartalmaz az azt követõ dokumentumról. elküld egy fejlécet. A header() függvény használatakor semmi nem lehet a függvényhívás elõtt. A PHP ezt automatikusan megteszi.

hu/" ). próbáljon egy nagyobbat!". 9. ahova átirányítjuk a felhasználót. } elseif ( $tipp > $kitalalando_szam ) { $uzenet = "A(z) $tipp túl nagy.13.164 9.0 Az ügyfélprogram ekkor kiírja a fejlécet. példában találjuk. amikor kitalálta a megadott számot. . Kapcsolódjunk a 80-as kapun a webkiszolgálóhoz és gépeljük be a következõt: HEAD /utvonal/fajl. hogy legyenek { header( "Location: gratulacio. } $tipp = (int) $tipp. } elseif ( $tipp < $kitalalando_szam ) { $uzenet = "A(z) $tipp túl kicsi. próbáljon egy kisebbet!". $uzenet = "". exit. } else // egyenlõk kell. A megoldást a 9.13.kiskapu.html" ). $probalkozasok = ( isset( $probalkozasok ) ) ? ++$probalkozasok : 0. Egy "Location" fejléc elküldésével a böngészõt egy másik lapra irányíthatjuk: header( "Location: http://www.html" oldalt. if ( ! isset( $tipp ) ) { $uzenet = "Üdvözlöm a számkitalálós játékban!". óra A fejlécet a Telnet programmal írathatjuk ki.html HTTP/1. Tegyük fel. program Fejléc küldése a header() függvénnyel 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: <?php $kitalalando_szam = 42. hogy készítettünk egy "gratulacio.

hogy befejezze az ûrlap vizsgálatát. és a fogadandó fájl lehetséges legnagyobb méretét adja meg. hogy legyen. hogyan kérhetünk be adatokat a felhasználótól. de a Netscape Navigator 2-tõl és az Internet Explorer 4-tõl kezdve lehetõségünk van fájlok feltöltésére is. Fájlfeltöltõ ûrlapok és programok Megtanultuk. A header() függvény meghívása után az oldalnak exit utasítással kell végzõdnie. melynek egyik paramétere kötelezõen a következõ: ENCTYPE="multipart/form-data" A feltöltõ mezõ elõtt meg kell adnunk egy rejtett mezõt is. Ebben a részben azzal foglalkozunk. Ennek neve MAX_FILE_SIZE kell.13. program Fejléc küldése a header() függvénnyel</title> 27: </head> 28: <body> 29: <h1> 30: <?php print $uzenet ?> 31: </h1> 32: Tippelés sorszáma: <?php print $probalkozasok?> 33: <form action="<?php print $PHP_SELF?>" method="POST"> 34: Ide írja a tippjét: 35: <input type="text" name="tipp" value="<?php print $tipp?>"> 36: <input type="hidden" name="probalkozasok" 37: value="<?php print $probalkozasok ?>"> 38: </form> 39: </body> 40: </html> 9 Az if szerkezet else ágában a böngészõt átirányítjuk a "gratulacio. Elõször létre kell hoznunk egy HTML ûrlapot.ini fájlban megadott . bájtban.html" oldalra.Ûrlapok 165 9. amely tartalmazza a fájlfeltöltõ mezõt.13. hogyan lehet a fájlok feltöltését kezelni a PHP 4 segítségével. mint a php. Nem lehet nagyobb. program (folytatás) 23: ?> 24: <html> 25: <head> 26: <title>9.

9. a fájlt egy egyszerû INPUT elemmel tölthetjük fel. program Fájlfeltöltõ ûrlap</title> </head> <body> <form enctype="multipart/form-data" action="<?print $PHP_SELF?>" method="POST"> <input type="hidden" name="MAX_FILE_SIZE" value="51200"> <input type="file" name="fajl"><br> <input type="submit" value="feltöltés!"> </form> </body> </html> Vegyük észre.2.14. Amikor a fájlt feltöltöttük. program Fájlfeltöltõ ûrlap 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: <html> <head> <title>9. amely tartalmazza. Bármilyen nevet adhatunk neki. Nevük a fájl elérési útját tartalmazó változónév. példában a fájlt feltöltõ HTML kódot láthatjuk.2. óra upload_max_filesize értéke. táblázat Feltöltött fájlhoz kapcsolódó globális változók Változónév $fajl $fajl_name $fajl_size $fajl_type Tartalma A fájl ideiglenes elérési útja A feltöltött fájl neve A feltöltött fájl mérete bájtban A feltöltött fájl típusa Példa /tmp/php5Pq3fU test. táblázat tartalmazza. amely alapértelmezés szerint 2 megabájt.14. az egy ideiglenes könyvtárban tárolódik (ez alapbeállításban a /tmp. kiegészítve a "name". A fájlról a különbözõ információkat a PHP globális változókban tárolja. ha UNIX rendszerrõl van szó). hogy PHP kóddal kezeljük a fájlt. A változók jelentését a 9. hogy a program meghívja az oldalt. "size" és "type" utótagokkal. A fájl elérési útját a betöltõ mezõ nevével megegyezõ globális változó tartalmazza (példánkban a $fajl). melynek TYPE paramétere "file". A legnagyobb fájlméretet 50 kilobájtban adjuk meg és "fajl"-nak nevezzük el. Miután kitöltöttük a MAX_FILE_SIZE mezõt.166 9. 9.gif 6835 image/gif . A 9.14.

167 9 9.3. a fájlok adatai a $HTTP_POST_FILES tömbben tárolódnak.15. táblázatban láthatjuk a tömb elemeinek nevét és értékét. példában látható program kiírja a rendelkezésre álló információkat a feltöltött fájlról. if ( isset( $fajl ) ) { print "elérési út: $fajl<br>\n".gif 6835 A 9.Ûrlapok A PHP 4 a feltöltött fájlok adatainak tárolására beépített tömb típusú változókat használ. 9. 17: 18: print "<img src=\"$feltoltes_url/$fajl_name\"><p>\n\n".Fájlfeltöltõ program</title> </head> <?php $feltoltes_konyvtar = "/home/httpd/htdocs/feltoltesek". "$feltoltes_konyvtar/$fajl_name") or die ("Nem lehet másolni"). és ha az GIF formátumú.15.hu/feltoltesek". A tömb indexei a feltöltést meghatározó mezõk nevei. print "név: $fajl_name<br>\n". 19: } 20: } . Ha egy vagy több fájlt töltünk fel egy ûrlapon keresztül.kiskapu.3. if ( $fajl_type == "image/gif" ) { copy ( $fajl. A 9. print "méret: $fajl_size bájt<br>\n". $feltoltes_url = "http://php.15. táblázat Feltöltött fájlhoz kapcsolódó globális változók Elem Tartalma $HTTP_POST_FILES["fajl"]["name"] A feltöltött fájl neve $HTTP_POST_FILES["fajl"]["size"] A feltöltött fájl mérete bájtban $HTTP_POST_FILES["fajl"]["type"] A feltöltött fájl típusa image/gif Példa test. print "típus: $fajl_type<p>\n\n". program Fájlfeltöltõ program 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: <html> <head> <title>9. megjeleníti. program .

A fájl eredeti elérési útja a $fajl változóban található. A típust a fájlkiterjesztés alapján állapítja meg a rendszer. még akkor sem. Ezután ellenõrizzük a $fajl_type változót. karakterláncokkal foglalkozó órában tanulunk. A copy() függvénynek két paramétert kell megadni: az elsõ a másolandó fájl elérési útja. program (folytatás) 21: ?> 22: <body> 23: <form enctype="multipart/form-data" action="<?php print $PHP_SELF?>" method="POST"> 24: <input type="hidden" name="MAX_FILE_SIZE" value="51200"> 25: <input type="file" name="fajl"><br> 26: <input type="submit" value="feltöltés!"> 27: </form> 28: </body> A 9. ha a külsõ forrás egy olyan ûrlap. amihez hozzáfûzzük a $fajl_name értéket. Lehet. A copy() függvénnyel a feltöltött fájlt a kiszolgáló másik könyvtárába másolhatjuk. Az új elérési út számára létrehozunk egy $feltoltes_konyvtar nevû változót. de jegyezzük meg. hogy a kiszolgálóoldali programozásban a paranoia jó dolog.15.15. így programunk nem a várt adatokat kapja meg. amelyek a fájlról információkat tartalmaznak. Ennek módjáról a tizenhetedik. UNIX rendszerben a kiszolgálóprogramok a 'nobody' felhaszná- .168 9. de teljesen más tartalommal. $fajl_name. példában elõször ellenõrizzük. a második a fájl új elérési útja. feltehetjük. hogy programunk számára megfelelõ formátumú-e. hogy a $fajl globális változó létezik-e. A rosszindulatú látogatók olyan ûrlapot készíthetnek. hogy ez paranoiának tûnik. ezért érdemes ellenõrizni. hogy a fájl valóban GIF formátumú-e. a böngészõben megjelenítjük a $fajl. Ha létezik. óra 9. $fajl_size és $fajl_type változók tartalmát. Soha ne bízzunk külsõ forrásból érkezõ adatokban. hogy a feltöltés sikeres volt (legalábbis e példa erejéig). amit éppen mi készítettünk. akkor az érkezett állományt GIF képként megjeleníthetjük. amelyben megegyezõ nevû elemek találhatóak. Mindig csak megbízható forrásból fogadjunk fájlt és ellenõrizzük. Miután feltöltöttük a fájlt. Ha értéke "image/gif". Ezután a copy() függvénnyel átmásoljuk a fájlt.

a feltöltött fájlokat és a globális változókat. a PHP ezt megteszi helyettünk. ellenõriznünk kell. hogyan listázzuk ki az ûrlapról kapott adatokat és rejtett mezõket használtunk. Az or mûvelettel a die() függvényt használjuk. Megnéztük. Megtanultuk.ini fájl register_globals elemét kell off-ra állítani a lehetõség kikapcsolásához. hogyan használjuk a $GLOBALS tömböt. Van azonban még néhány tanulnivaló.Ûrlapok lónév alatt futnak. ezért mielõtt másolatot készítenénk a fájlról. Minden elem. adatok átadására a programtól a böngészõnek. tömbként tárolódik. így az elemek csoportba rendezhetõk. A header() függvény nagyon hasznosnak tûnik. a fájl elvész. Amikor létrehozzuk a $feltoltes_konyvtar változót. az ûrlapok adatait. amelyek segítségével igazi interaktív környezetet hozhatunk létre. amelyek nem választómezõvel vagy jelölõnégyzetekkel megadottak? Igen. Kikapcsolható valahol ez a lehetõség? Igen a php. mivel az a PHP kód végrehajtása után törlõdik az ideiglenes könyvtárból. amely nevének végén üres szögletes zárójel van. A felhasználóról képesek vagyunk információkat szerezni. hogyan küldhetünk fejlécet az ügyfélnek a böngészõ átirányítása érdekében. Ezt a módszert a tizedik. Tanulunk még a HTTP fejlécekrõl? Magáról a HTTP-rõl még beszélünk a tizenharmadik órában. Ez lesz a következõ óra témája. Ebben az órában megtanultuk. Másolás után az eredeti fájlt nem kell törölnünk. a fájlokkal foglalkozó órában részletesebben áttekintjük. 169 9 Összefoglalás Eddig olyan dolgokat tanultunk. ha a másolás sikertelen. Ha nem másoljuk vagy helyezzük át a feltöltött állományt. . hogy a mûvelet engedélyezett-e. de mit tegyünk ezekkel? Például fájlba írhatjuk. a célkönyvtár URL címének tárolására. A lemásolt fájlt HTML kép elemként jelenítjük meg. Az elemek nevének automatikus változónévvé alakítása veszélyesnek tûnik. létrehozzuk a $feltoltes_url változót is. Kérdések és válaszok Létre lehet hozni tömböt olyan elemek tárolására is.

Készítsünk programot. Melyik függvényt használjuk a böngészõ átirányítására? Milyen karaktersorozatot kell átadnunk a függvénynek? 7. hogy a rá hivatkozó globális változó $urlap_tomb nevû tömb legyen? 4. . amely rejtett mezõ használatával megmondja. Kvíz 1. kivonás. 2. amelyben a felhasználó megadhat két számot és a rajtuk végrehajtandó mûveletet (összeadás. óra Mûhely A mûhelyben kvízkérdések találhatók. Melyik környezeti változó tartalmazza a felhasználó IP címét? 2.170 9. Hogyan nevezzük el az ûrlap mezõjét. Melyik beépített tömb tartalmazza a GET kérelmen keresztül érkezõ változókat? 5. A válaszokat az A függelékben helyeztük el. hogy a felhasználó hányszor használta az elsõ feladatban szereplõ számológépet. Hogyan korlátozható az összes ûrlapról vagy programból feltölthetõ fájl mérete? Feladatok 1. melyek segítenek megszilárdítani az órában szerzett tudást. szorzás vagy osztás – ezeket ismerje a program). Melyik környezeti változó tartalmaz a böngészõrõl információkat? 3. Melyik beépített tömb tartalmazza a POST kérelmen keresztül érkezõ változókat? 6. Készítsünk számológép-programot. Hogyan lehet korlátozni egy ûrlapról feltölthetõ fájl méretét? 8.

hogy fájlokat lehet létrehozni. Ebben a fejezetben ezeket a lehetõségeket fogjuk áttekinteni: • Hogyan ágyazzunk be fájlokat a dokumentumokba? • Hogyan vizsgáljuk a fájlokat és könyvtárakat? • Hogyan nyissunk meg egy fájlt? • Hogyan olvassunk adatokat a fájlokból? • Hogyan írjunk egy fájlba vagy fûzzünk hozzá? • Hogyan zárjunk le egy fájlt? • Hogyan dolgozzunk könyvtárakkal? . ÓRA Fájlok használata A programozási nyelvek egyik legfontosabb lehetõsége. olvasni. A PHP-nek szintén megvannak ezek a tulajdonságai.10. írni velük.

akkor azt az eredeti fájlban PHP címkék közé kell zárni.1.php fájl van beágyazva. A fájlban szereplõ PHP kód úgy hajtódik végre. mintha a fõdokumentum része lenne. ami hasznos. példában szereplõ beillesztett fájl 1: Engem ágyaztak be!! A 10. Nem okoz ez gondot? A beágyazott fájl tartalma alapértelmezésben HTML formátumban jelenik meg. Ha végrehajtandó PHP kódot szeretnénk beágyazni. példában található kódba az 10.1. az "Engem ágyaztak be!!" szöveg jelenik meg. hogy fájlt ágyazzunk be a PHP dokumentumokba. A 10.1. A 10. példában látható. Eddig. óra Fájlok beágyazása az include() függvénnyel Az include() függvény lehetõséget ad arra. példában a beágyazott fájlban van a megjelenítõ kód. program Az include() használata 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: <html> <head> <title>10. Ha hibát találtunk benne vagy lehetõségeit tovább akartuk bõvíteni.program. hogyan ágyazható be egy fájl a PHP kódba az include() függvény segítségével.172 10. és 10. .program. mindenütt át kellett írnunk.1.php"). ha egy többoldalas programban külsõ kódokat szeretnénk beágyazni. program A 10.2.2. 10.2. azaz szöveget ágyaztunk be a PHP kódba. példában található kódot. ha olyan kódot írtunk. minden egyes helyre be kellett másolnunk azt. Ezekre a problémákra megoldás az include() függvény.1. amelyet többször is fel akartunk használni.4. program Az include() használata</title> </head> <body> <?php include("10.1.3. ?> </body> </html> 10. Az include() függvény paramétere a fájl elérési útja. Gyakran használt függvényeinket külsõ fájlba menthetjük és az include() függvénnyel futási idõben tölthetjük be programunkba. Amikor lefuttatjuk a 10.

program PHP kód végrehajtása és visszatérési érték megadása az include() függvény használatával 1: <html> 2: <head> 3: <title>10. amelyeknek visszatérési értékük van. 10. A 10.program.5.5.. 8: print "A visszatérési érték $eredmeny". program PHP kód végrehajtása és visszatérési érték megadása az include() függvény használatával</title> 4: </head> 5: <body> 6: <?php 7: $eredmeny = include("10. 9: ?> 10: </body> 11: </html> .3. és 10. program PHP kódot tartalmazó beágyazott fájl 1: 2: 3: 4: <?php print "Engem ágyaztak be!!<br>"" print "De most már össze tudok adni .6.. A visszatérési értéket a fájl vége elõtt egy return utasítás után kell meghatározni. ?> A PHP 4-ben a beágyazott fájlokban szereplõ kódnak ugyanúgy lehet visszatérési értéket adni.3. 4 + 4 = ".php"). példákban olyan fájlokat ágyazunk be a dokumentumba.4.6.php").Fájlok használata 173 10.4.5. 8: ?> 9: </body> 10: </html> 10 10. program Az include() függvény használata PHP kód végrehajtására más fájlban 1: <html> 2: <head> 3: <title>10.program. mint a függvényeknek.(4+4). program Az include() függvény használata PHP kód végrehajtására más fájlban</title> 4: </head> 5: <body> 6: <?php 7: include("10.

ha függvényben szerepel. megadhatunk feltételeket is. ha a fájlra teljesülnek a feltételek. program Visszatérési értékkel rendelkezõ beágyazott fájl 1: 2: 3: 4: 5: <?php $vissza = ( 4 + 4 ). A következõ kódban található beágyazás soha nem fog végrehajtódni: $proba = false. //nem ágyazza be } Ha az include() függvényt ciklusban használjuk.txt" ). az include()-ban megadott fájl tartalma minden ismétlésnél bemásolódik és a fájlban lévõ kód minden hívásnál végrehajtódik.6. program Az include() használata cikluson belül 1: 2: 3: son 4: 5: 6: 7: 8: 9: <html> <head> <title>10. ?> Ez a HTML soha nem jelenik meg. Ha az include() függvényt alkalmazzuk. . A 10. $x++ ) { $incfajl = "incfajl$x. 10. Az include() paramétere minden ismétlésnél más fájlra mutat.7. $x<=3. if ( $proba ) { include( "egy_fajl. A megadott fájlt csak akkor ágyazza be az include().174 10. mert a visszatérés után írtuk! PHP 3 használatakor a beágyazott fájlnak csak akkor lehet visszatérési értéket adni a return utasítással. példa a PHP 3-ban hibát okoz.7. program Az include() használata ciklubelül</title> </head> <body> <?php for ( $x = 1. return $vissza.7. A 10.txt".6. példában található kódban az include() függvény egy for ciklus belsejében szerepel. óra 10.

txt Megpróbálom beágyazni az incfajl3. a require(). hogy a require()-nak nem lehet visszatérési értéke a PHP 4-esben. amely hasonlóan mûködik az include()-hoz. mint az include().txt Rendelkezésre áll egy másik PHP függvény is. "incfajl2.7.txt".txt Megpróbálom beágyazni az incfajl2. Fájlok vizsgálata Mielõtt elkezdünk ismerkedni a fájlokkal és könyvtárakkal. Mindegyik fájl tartalmazza a nevét és azt a szöveget. hogy a rendszerünkben található fájlokon különbözõ mûveleteket hajtsunk végre. Még egy fontos különbség a két függvény között. 12: print "<p>". . Ciklusban azonban a require() nem használható úgy. fussunk át néhány velük kapcsolatos tudnivalót.txt". egyébként false. ezek az "incfajl1. 11: include( "$incfajl" ).txt -t Ez a fájl az incfajl3. program (folytatás) 10: print "Megpróbálom beágyazni az $incfajl –t". A függvény visszatérési értéke true.txt" és "incfajl3.Fájlok használata 175 10. programban található kód futás közben három különbözõ fájlt ágyaz be.txt -t Ez a fájl az incfajl1. A file_exists() paramétere egy karakterlánc. A PHP 4 igen sok lehetõséget ad arra.txt -t Ez a fájl az incfajl2. amely a kérdéses fájl elérési útját és nevét tartalmazza.7. ugyanis a require() a program futásának kezdetekor helyettesítõdik be. A következõ bekezdésekben ezeket a függvényeket tekintjük át. Fájl létezésének ellenõrzése a file_exists() függvénnyel Fájl létezését a file_exists() függvénnyel vizsgálhatjuk. 13: } 14: ?> 15: </body> 16: </html> 10 A 10. hogy beágyazták: Megpróbálom beágyazni az incfajl1. ha a fájl létezik.

176 10. if ( is_dir( "/tmp" ) ) print "a /tmp egy könyvtár". óra if ( file_exists("proba. hogy paramétere fájl-e. Ellenõrizhetjük azt is. A paraméterben meg kell adnunk egy elérési utat. Ha a megadott elérési út fájlt jelöl. különféle dolgokat végezhetünk vele. Az is_readable() függvénnyel megtudhatjuk. UNIX rendszerben lehet. egyébként false lesz. egyébként false lesz.txt") ) print("A fájl létezik!"). hogy az adott fájl olvasható-e számunkra. Fájl állapotának lekérdezése Miután megtudtuk. a függvény visszatérési értéke true. Az is_writeable() függvénnyel megtudhatjuk. Ha a függvény paraméterében megadott elérési út könyvtárat határoz meg. a visszatérési érték true. .txt egy fájl"). if ( is_file( "proba. Az is_executable() függvénnyel azt tudhatjuk meg.txt" ) ) print "a proba. visszatérési értéke true.txt írható". egyébként false lesz. hogy az adott fájl írható-e számunkra. A PHP-ben különbözõ függvények állnak rendelkezésre ezen lehetõségek lekérdezésére. egyébként false lesz. olvassuk vagy végrehajtjuk. Általában írunk bele. hogy az elérési út könyvtárat jelöl-e. if ( is_readable( "proba. Fájl vagy könyvtár? Az is_file() függvény azt dönti el. hogy egy fájl létezik és valóban fájl. if ( is_writeable( "proba. Ha az is_readable() paraméterében elérési úttal megadott fájl olvasható. hogy látjuk a fájlt a könyvtárszerkezetben. Ha az is_executable() paraméterében elérési úttal megadott fájl futtatható. hogy az adott fájl futtatható-e. Az ellenõrzést az is_dir() függvény végzi. a visszatérési érték true. visszatérési értéke true.txt" ) ) print("a proba. egyébként false lesz. A visszatérési érték jogosultságunktól és a fájl kiterjesztésétõl függ.txt" ) ) print "a proba. Ha az is_writeable() paraméterében elérési úttal megadott fájl írható. de nincs jogosultságunk annak olvasására.txt olvasható".

177 Fájl méretének lekérdezése a filesize() függvénnyel A filesize() függvény a paraméterében elérési úttal megadott fájl bájtban számított méretével tér vissza.txt legutolsó megnyitásának dátuma:". H:i". amikor a fájl tartalma valamilyen módon módosul vagy a jogosultságok.txt futtatható".txt" ). A következõ példában ezt a számot a date() függvény segítségével olvasható formára alakítjuk.01. hogy a fájl tartalma valamilyen módon megváltozott.txt" ). Visszatérési értékként az utolsó megnyitás dátumát kapjuk meg. $atime = fileatime( "proba. A módosítás azt jelenti. hogy tudjuk. $mtime = filemtime( "proba.23. print "A proba.d. A végeredmény false. UNIX rendszerben a változás alatt azt értjük. ha bármilyen hiba történik. $mtime). print date("Y. print filesize( "proba. A PHP-vel ezeket az információkat is megszerezhetjük. A date() függvény leírása a tizenötödik órában szerepel. illetve a tulajdonos megváltozik.d. mikor hozták létre a fájlt vagy mikor használták utoljára. print "A proba. Ezen függvények visszatérési értéke UNIX idõbélyeg formátumú.txt" ). //Egy minta végeredmény: 2000. H:i". A megnyitás jelenthet írást vagy olvasást is.23.01. $atime). visszatérési értéke pedig UNIX idõbélyeg formátumú. azaz mindig az 1970 január elseje óta eltelt másodpercek száma. . A függvény paramétere a fájl elérési útja. print date("Y.Fájlok használata if ( is_executable( "proba. Más rendszerekben a filectime() visszatérési értéke a fájl létrehozásának dátuma. print "A proba.txt utolsó módosításának dátuma:".m. A függvény paraméterében meg kell adni a fájl elérési útját. 14:26 A filectime() a fájl utolsó változásának idõpontját adja meg. 14:26 A filemtime() függvénnyel a fájl utolsó módosításának idejét kaphatjuk meg.m. A fájl utolsó megnyitásának dátumát a fileatime() függvény segítségével kaphatjuk meg. 10 Különféle fájlinformációk Szükségünk lehet rá. //Egy minta végeredmény: 2000.txt mérete: ".txt" ) print "a proba.

példában olyan függvényt hozunk létre. fileatime( $f ) ). filemtime( $f ) ).8. 15: } 16: print "$f ". H:i". program Egyszerre több fájltulajdonságot megadó függvény</title> 4: </head> 5: <body> 6: <?php 7: $fajl = "proba. 14:26 Több fájltulajdonságot egyszerre megadó függvény A 10."bájt méretû<br>" 22: print "$f utolsó megnyitásának dátuma: ". "<br>". date( "Y.m.d.(is_dir( $f )?"":"nem ").txt" ). program Egyszerre több fájltulajdonságot megadó függvény 1: <html> 2: <head> 3: <title>10. print date("Y. 10. amely az elõzõekben látott lehetõségeket fogja össze egyetlen függvényben. "könyvtár<br>" 18: print "$f ". print "A proba.txt utolsó változásának dátuma:"."fájl<br>" 17: print "$f ".txt".(is_file( $f )?"":"nem "). óra $ctime = filectime( "proba.(is_executable( $f )?"":"nem ").23. "futtatható<br>" 21: print "$f ". . $ctime).(is_readable( $f )?"":"nem ").m. 23: print "$f utolsó módosításának dátuma: ". //Egy minta végeredmény: 2000. "<br>". 8: fileInformaciok( $fajl ). "írható<br>" 20: print "$f ".d.(filesize( $f )).m.8.178 10.8. 9: function fileInformaciok( $f ) 10: { 11: if ( ! file_exists( $f ) ) 12: { 13: print "$f nem létezik <BR>".d.(is_writeable( $f )?"":"nem "). date( "Y. H:i".01. H:i". 14: return. "olvasható<br>" 19: print "$f ".

de a módosítás dátuma a touch() függvény végrehajtási idejére módosul."fájl<br>" A mûveletjel bal oldalára került az is_file() függvény. date( "Y. Ha a fájl már létezik. print "$f $igen_vagy_nem".m. tartalma nem változik meg. 25: } 26: 27: ?> 28: </body> 29: </html> 10 Az egyszerûbb leírás kedvéért ? : mûveleteket használtunk. Fájlok létrehozása és törlése Ha egy fájl nem létezik. a touch() függvény segítségével hozhatjuk létre. else print "$f nem fájl<br>". egyébként a "nem " szöveg. akkor az operátor visszatérési értéke üres karakterlánc.(is_file( $f )?"":"nem ").Fájlok használata 179 10. H:i". "<br>". Nézzük meg ezek közül az egyiket: print "$f ". Ezen az elérési úton próbál meg létrehozni a touch() egy üres fájlt. A függvény paraméterében meg kell adni egy elérési utat. if ( is_file( $f ) ) print "$f fájl<br>". Az elõbbi kifejezés kevésbé tömör formában a következõképpen írható le: $igen_vagy_nem = is_file( $f ) ? "" : "nem ". A visszatérési érték után a szövegösszefûzés jelet követõ karakterlánc is kiíródik. szabadon választhatjuk ki a nekünk tetszõt.8. .d. Mivel az elõzõ példák ugyanannak a feladatnak a megoldásai. Ha ennek eredménye true. program (folytatás) 24: print "$f utolsó változásának dátuma: ". ekkor azonban a program mérete jelentõsen nõ."fájl<br>" Az if vezérlési szerkezettel még világosabb kódot írhatunk. filectime( $f ) ).

hozzáfûzésre Mielõtt elkezdünk dolgozni egy fájllal. Ez az egész szám az úgynevezett fájlazonosító. 'r' ). olvasás.180 10. Fájl megnyitása írásra. 'a' ). A létrehozás. meg kell nyitnunk írásra vagy olvasásra. Ezt az fopen() függvénnyel tehetjük meg. amelyet változóként tárolhatunk.txt". óra touch("sajat_fajl. a következõt kell tennünk: $fa = fopen( "proba. A függvény visszatérési értéke egy egész szám. ha a fájl nem létezik: . ezért érdemes mindig ellenõrizni. "w" ) ) { // $fa-val csinálunk valamit } Esetleg használhatunk logikai mûveletet. hogy megszakítsuk a végrehajtást. Az fopen() false értékkel tér vissza.txt"). 'w' ). ha valamiért nem tudta megnyitni a fájlt. írás ("w"). Ezt például az if vezérlési szerkezettel tehetjük meg: if ( $fa = fopen( "proba. írás. A legtöbbször használt módok az olvasás ("r"). olvasásra. módosítás csak akkor lehetséges egy fájlon. hogy sikeres volt-e a megnyitás. ha a megfelelõ jogosultságokkal rendelkezünk.txt". Az írásra való megnyitáshoz a következõt: $fa = fopen( "proba. A függvény paraméterében meg kell adni a fájl elérési útját és a megnyitási módot. Létezõ fájlt törölni az unlink() függvénnyel lehet. csak a végéhez szeretnénk fûzni valamit. Ezzel hivatkozhatunk késõbb a fájlra.txt"). Fájl olvasásra való megnyitásához a következõt kell beírnunk: $fa = fopen( "proba.txt". törlés. Ha a fájlt hozzáfûzésre akarjuk megnyitni. Az unlink() paramétere a fájl elérési útja: unlink("sajat_fajl. hozzáfûzés ("a"). tehát nem kívánjuk felülírni a tartalmát.txt".

// ahol az $fa az fopen() által å visszaadott fájlazonosító Tudnunk kell tehát. Ezt az fclose() függvénnyel tehetjük meg. mindig be kell zárnunk azt. példában láthatjuk. melynek visszatérési értéke true. $sor = fgets( $fa. amíg sorvége vagy fájlvége jelet nem talál. beolvashatjuk a tartalmát sorról sorra. Ha az fopen() true értékkel tér vissza. 1024 ). amelyet egy sikeres fopen() végrehajtása során kaptunk: fclose( $fa ). egyébként false.txt". // ahol az $fa az fopen() által visszaadott å fájlazonosító A 10. "w" ) ) or die å ("A fájl sajnos nem nyitható meg!"). .Fájlok használata ( $fa = fopen( "proba. hogy legfeljebb hány bájtot olvasson ki a PHP. hogyan kell egy fájlt sorról sorra beolvasni. A függvény paraméterében meg kell adni az olvasandó fájl azonosítóját (amit az fopen() függvény ad a megnyitáskor). mikor érünk a fájl végére. A függvény paraméterében egy fájlazonosítót kell megadni. a die() nem hajtódik végre.9. soronként vagy karakterenként olvashatunk. továbbá második paraméterként kell adnunk egy egész számot is. Sorok olvasása fájlból az fgets() és feof() függvényekkel Miután megnyitottunk egy fájlt. különben a kifejezés jobb oldalán a die() kiírja a paraméterében szereplõ karakterláncot és megszakítja a program futását. Ezt az feof() függvény adja meg. ha a fájl végére értünk. az fgets() függvénnyel. amely meghatározza. feof( $fa ). Az fgets() függvény addig olvas a fájlból. Amikor befejeztük a munkát egy fájllal. amíg újsor karakterhez ("\n") nem ér. amelynek paraméterében azt a fájlazonosítót kell megadnunk. a megadott bájtnyi adatot ki nem olvassa vagy a fájl végét el nem éri. 181 10 Olvasás fájlból A PHP-ben egy fájlból különbözõ függvények segítségével bájtonként.

hogy az olvasás elért-e a fájl végéhez. . "r" ) or die("$fajlnev nem nyitható meg"). 9: while ( ! feof( $fa ) ) 10: { 11: $sor = fgets( $fa. A függvény visszatérési értéke a megadott mennyiségû adat lesz. Tetszõleges mennyiségû adat olvasása fájlból A fájlokból nem csak soronként.txt". Ez legtöbbször akkor történik meg. program Fájl megnyitása és sorról sorra olvasása</title> 4: </head> 5: <body> 6: <?php 7: $fajlnev = "proba. Az olvasás a while ciklusban történik. amíg el nem éri a fájl végét. Minden kiírásnál megadunk egy <br> címkét. óra 10. Az fread() függvény paraméterében meg kell adni egy fájlazonosítót és az egyszerre kiolvasandó adatok mennyiségét. bájtban.9. Az fgets() minden ismétlésnél kiolvas egy sort vagy 1024 bájtot. A kiolvasott karaktersorozatot a $sor változóba mentjük és kiírjuk a böngészõbe. 13: } 14: fclose($fa).182 10. a die() függvénnyel megszakítjuk a program futását. 12: print "$sor<br>". 15: ?> 16: </body> 17: </html> Az fopen() függvénnyel próbáljuk olvasásra megnyitni a fájlt. ha a fájl nem létezik vagy (UNIX rendszerben) nincs megfelelõ jogosultságunk a megnyitásra. 16 ). hanem elõre meghatározott méretû darabokat is olvashatunk. Ha a kísérlet sikertelen. ha elérte a fájl végét. $reszlet = fread( $fa. A while ciklus minden ismétlés alkalmával megnézi az feof() függvénnyel. kivéve. végül bezárjuk a megnyitott állományt. hogy a szöveg olvashatóbb legyen.9. 1024 ). tehát a ciklus addig olvas. 8: $fa = fopen( $fajlnev. program Fájl megnyitása és sorról sorra olvasása 1: <html> 2: <head> 3: <title>10.

15: ?> 16: </body> 17: </html> 10 Bár az fread() függvénynek megadjuk. program Az fseek() használata 1: 2: 3: 4: <html> <head> <title>10. program Fájl beolvasása az fread() függvénnyel</title> 4: </head> 5: <body> 6: <?php 7: $fajlnev = "proba.10. 8: $fa = fopen( $fajlnev. 9: while ( ! feof( $fa ) ) 10: { 11: $reszlet = fread( $fa. 10. A 10. azt nem tudjuk meghatározni. 13: } 14: fclose($fa). amely a fájl elejétõl bájtban mérve meghatározza az új olvasási helyet: fseek( $fa. példában az fseek() és fread() függvényekkel a fájl tartalmának második felét jelenítjük meg a böngészõben. 12: print "$reszlet<br>". Erre az fseek() ad lehetõséget. program Az fseek() használata</title> </head> . program Fájl beolvasása az fread() függvénnyel 1: <html> 2: <head> 3: <title>10. hogy honnan kezdje az olvasást. Paraméterként egy fájlazonosítót és egy egész számot kell megadnunk.10.11. 16 ).11.txt". mennyi adatot olvasson ki.Fájlok használata A 10. 183 10. 64 ). "r" ) or die("$fajlnev nem nyitható meg").10.11. ezzel a függvénnyel állítható be az olvasás helye. példaprogram 16 bájtonként olvassa be a fájlt.

hogy a filesize() függvénnyel lekértük a fájl méretét és elosztottuk kettõvel. de minden alkalommal.txt". Mivel egy karakter mindig egy bájt méretû. 9: $fajlmeret = filesize($fajlnev). amikor meghívjuk. óra 10. 13: $reszlet = fread( $fa.12. 15: fclose($fa). 10: $felmeret = (int)( $fajlmeret / 2 ). 10. Végül az fread() segítségével kiolvastuk a fájl második felét és kiírtuk a böngészõbe. Fájl karakterenkénti olvasása az fgetc() függvénnyel Az fgetc() függvény hasonlít az fgets() függvényhez.txt" tartalmát és minden karaktert külön sorba ír ki a böngészõbe. csak egyetlen karaktert olvas ki a fájlból. program (folytatás) 5: <body> 6: <?php 7: $fajlnev = "proba.12. 14: print $reszlet. program Az fgetc() használata 1: 2: 3: 4: 5: <html> <head> <title>10. "r" ) or die("$fajlnev nem nyitható meg"). $felmeret ). 11: print "A fájl felének mérete: $felmeret <br>\n" 12: fseek( $fa. A 10. csak a már megszokott fájlazonosítót: $karakter = fgetc( $fa ). program Az fgetc() használata</title> </head> <body> . Ezt az értéket használtuk az fseek() második paramétereként.11. példaprogram egy ciklus segítségével karakterenként kiolvassa a "proba.$felmeret) ).12. 16: ?> 17: </body> 18: </html> A felezõpontot úgy számoltuk ki.184 10. ($fajlmeret . más paramétert nem kell megadnunk. 8: $fa = fopen( $fajlnev.

Amikor írásra nyitjuk meg a fájlt. Ha a fájlt hozzáfûzésre nyitjuk meg. Minden írási próbálkozás a fájl elején történik. program (folytatás) 6: <?php 7: $fajlnev = "program.txt". 12: print "$karakter<br>". "hello világ" ). 9: while ( ! feof( $fa ) ) 10: { 11: $karakter = fgetc( $fa ). Az egyetlen különbség az fopen() hívásában rejlik. megtartva az elõzõ tartalmat. Hozzáfûzésnél minden adat a fájl végére íródik. 13: } 14: fclose($fa). A karakterlánc a megadott fájlba íródik. "w" ).txt". akkor az fopen() második paramétereként a "w" karaktert kell megadnunk: $fa = fopen( "proba. "a" ). .txt". az fopen() második paramétereként az "a" karaktert kell megadnunk: $fa = fopen( "proba. Fájlba írás az fwrite() és fputs() függvényekkel Az fwrite() függvény paramétereként egy fájlazonosítót és egy karakterláncot kell megadni.12. "hello világ" ). fwrite( $fa. "r" ) or die("$fajlnev nem nyitható meg"). Ha a fájl még nem létezne. Ha a fájl létezik. a rendszer létrehozza azt. Az fputs() ugyanígy mûködik. 8: $fa = fopen( $fajlnev. fputs( $fa. tartalma felülíródik a megadott adatokkal.Fájlok használata 185 10. 15: ?> 16: </body> 17: </html> 10 Fájlba írás és hozzáfûzés A fájlba írás és a hozzáfûzés nagyon hasonlítanak egymáshoz.

12: print "$fajlnev fájlhoz hozzáfûzés".1.11. 13: $fa = fopen( $fajlnev. Az flock() függvény paramétereként egy fájlazonosítót és egy egész számot kell megadni. 10. program Fájlba írás és hozzáfûzés 1: <html> 2: <head> 3: <title>10.13. amíg a zárolás érvényben van. Az flock() függvénnyel zárolt fájlt nem olvashatja vagy írhatja más folyamat. mi történne. A lehetséges zárolásokat a 10. . Képzeljük el. A valóságban azonban egy alkalmazás oldalait általában többen is el szeretnék érni egyidõben. 8: print "$fajlnev fájlba írás".txt". 11: fclose( $fa ). "w" ) or die("$fajlnev nem nyitható meg"). 10: fwrite ( $fa. 14: fputs ( $fa. 9: $fa = fopen( $fajlnev. példában elõször az fwrite() függvény használatával egy fájlba írunk. táblázat mutatja. ha programjaink csak egyetlen felhasználót szolgálnak ki. ha egyszerre két felhasználó írna ugyanabba a fájlba. 15: fclose( $fa ). Ez utóbbi a zárolás típusát határozza meg. 16: ?> 17: </body> 18: </html> Fájlok zárolása az flock() függvénnyel Az eddig megtanultak igen jól használhatók.13. "a" ) or die("$fajlnev nem nyitható meg"). "Hello világ\n").186 10. A fájl használhatatlanná válna. Az flock() függvény használatával kizárhatjuk ezt a lehetõséget. óra A 10. program Fájlba írás és hozzáfûzés</title> 4: </head> 5: <body> 6: <?php 7: $fajlnev = "proba. "És más dolgok"). majd az fputs() függvénnyel adatokat fûzünk hozzá.

Munka könyvtárakkal Az elõzõekben áttekintettük. Az flock() a PHP zárolási megoldása. ezért elõfordulhat. flock( $fa. hogyan kezelhetjük a fájlokat. akár írás közben is. törölhetünk és olvashatunk könyvtárakat a PHP-ben. de nem írhatnak bele (akkor használjuk.1. A jogosultsági mód három 0 és 7 közé esõ számot tartalmaz.Fájlok használata 187 10. Könyvtár létrehozása az mkdir() függvénnyel Könyvtárat az mkdir() függvénnyel hozhatunk létre. valamint egy oktális (nyolcas számrendszerû) számot. 2 ). A jogosultság megadásának csak UNIX rendszerekben van hatása. a csoport. amikor írunk a fájlba) A fájl zárolásának megszüntetése 10 3 Felszabadítás Az flock() függvényt a fájl megnyitása után alkalmazzuk zárolásra és az fclose() elõtt oldjuk fel vele a zárat. Csak azok a programok veszik figyelembe ezt a fajta zárolást. most megnézzük. és mindenki más . amely a létrehozandó könyvtár elérési útja. // zárolás feloldása fclose( $fa ). ahol ugyanezt a módszert alkalmazzuk. amely a jogosultságokat határozza meg. amelyek sorban a tulajdonos. Az mkdir() paraméterében meg kell adni egy karakterláncot. hogy a nem-PHP programok megnyitják a fájlunkat. amikor olvassuk a fájlt) 2 Kizáró Más folyamatok nem olvashatják és nem írhatják a fájlt (akkor használjuk. $fa = fopen( "proba. hogyan hozhatunk létre.txt". Az oktális számok elé mindig 0-t kell írni. "a" ). táblázat Az flock() függvény második paraméterének lehetséges értékei Egész 1 Lezárás típusa Megosztott Leírás Más folyamatok olvashatják a fájlt. 3 ). // kizáró lefoglalás // fájlba írás flock( $fa.

A readdir() csak az elem nevét és nem annak elérési útját adja meg. A sikeres törléshez megfelelõ jogosultsággal kell rendelkeznünk és a könyvtárnak üresnek kell lennie. 10. kivéve. hogy fájl vagy könyvtárnevet olvassunk ki egy megnyitott könyvtárból.4. azaz nincs jogosultságunk írásra. óra jogait adják meg. A függvény visszatérési értéke true. A függvény paraméterében annak a könyvtárnak az elérési útját kell átadni. Ezt az azonosítót az opendir() függvény adja meg. a visszatérési érték false.188 10. 0777 ). A függvény visszatérési értéke a könyvtár azonosítója. $kvt = opendir( "proba_konyvtar" ). program Könyvtár tartalmának kiíratása 1: <html> 2: <head> 3: <title>10. mkdir( "proba_konyvtar".14. példában a readdir() függvény használati módját láthatjuk. egyébként false. szükségünk van egy könyvtárazonosítóra. ha a könyvtárat sikerült létrehozni. amelyet olvasni szeretnénk. program Könyvtár tartalmának kiíratása</title> 4: </head> . A függvény paraméterében a törlendõ könyvtár elérési útját kell megadni. A 10. ugyanúgy használhatjuk a readdir() függvényt. Könyvtár tartalmának olvasása Ahogy az fgets() függvénnyel fájlból olvastunk. ha a megadott elérési úton nincs jogosultságunk könyvtárat létrehozni. Ha a könyvtár végére értünk. Ezekben az estekben a visszatérési érték false. Könyvtár megnyitása olvasásra Mielõtt be tudnánk olvasni egy könyvtár tartalmát. rmdir( "proba_konyvtar" ). A könyvtár létrehozása általában akkor nem sikeres. ha a könyvtár nem létezik vagy nincs jogosultságunk az olvasására. A readdir() paraméterében meg kell adni az olvasandó könyvtár azonosítóját. A függvény visszatérési értéke a könyvtár következõ elemének neve.14. // teljes å írás/olvasás/végrehajtás jogok Könyvtár törlése az rmdir() függvénnyel A rendszerbõl könyvtárat az rmdir() függvénnyel törölhetünk.

Az elõbbi kód a következõ végeredményt adja: . Amikor a ciklus eléri a "0" nevû fájlt. Mi történik.14.Fájlok használata 189 10.14. A while ciklus feltételes kifejezésének megírásakor igen elõvigyázatosak voltunk. példában a readdir() függvény visszatérési értékének típusát vizsgáljuk és ezzel oldjuk meg a problémát. melyek nevei "0". . } Itt a readdir() visszatérési értékét vizsgáljuk. program (folytatás) 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: <body> <?php $kvtnev = "proba_konyvtar". Ha igen. tehát ebbõl nem lehet probléma. Minden "0"-tól különbözõ karakterlánc true-ként viselkedik. hogy a $kvtnev és a $fajl változókból készített elérési út könyvtárat jelöl-e. Így kiírjuk a böngészõbe a könyvtár tartalmát. "3". "1". A while ciklus feltételes kifejezésében meghívjuk a readdir() függvényt és a visszaadott értéket hozzárendeljük a $fajl változóhoz. ?> </body> </html> 10 A könyvtárat megnyitjuk az opendir() függvénnyel. } closedir( $kvt ). "2". A ciklus törzsében az is_dir() függvénnyel vizsgáljuk. while ( gettype( $fajl = readdir( $kvt )) != boolean ) { if ( is_dir( "$kvtnev/$fajl" ) ) print "(D)". print "$fajl<br>". ha könyvtárunk négy fájlt tartalmaz. Sok PHP programozó a következõt használta volna: while ( $fajl = readdir( $kvt ) ) { print "$fajl<br>\n".. majd egy while ciklussal végiglépkedünk annak összes elemén. $kvt = opendir( $kvtnev ). neve elé teszünk egy "(D)" jelet. A 10. a readdir() false értéknek veszi és a ciklus leáll. .

Végül áttekintettük. Más esetben a program futását nem fontos megszakítani. hogyan hozhatunk létre. Melyik függvénnyel tudjuk meg. megnéztünk. Áttekintettük a fájlok különbözõ tulajdonságainak ellenõrzését. hogyan ágyazhatunk be a dokumentumokba külsõ fájlban tárolt PHP kódot. Melyik függvénnyel nyitható meg egy fájl írásra vagy olvasásra? 5. vagy listázhatunk ki könyvtárakat. hogy igen.190 10. Megtanultuk. a lassulás azonban nem számottevõ. Hogyan kapható meg egy fájl mérete? 4. hogyan írhatunk fájlba és hogyan fûzhetünk karakterláncokat hozzá. karakterenként. Kérdések és válaszok Az include() függvény lassítja a programok futását? Mivel a beágyazott fájlt meg kell nyitni és a tartalmát be kell olvasni. hogy elértük a fájl végét? . ha egy fájlt nem sikerült megnyitni írásra vagy olvasásra? Ha a program futásához elengedhetetlen a fájl. akkor a die() függvénnyel érdemes leállítani. hogyan olvashatunk fájlokat sorról sorra. Honnan tudhatjuk meg. A huszonkettedik órában többet olvashatunk errõl a megoldásról. Mûhely A mûhelyben kvízkérdések találhatók. ezért azt kell mondjuk. Mindig le kell állítani a program futását. A válaszokat az A függelékben helyeztük el. törölhetünk. de érdemes figyelmeztetni a felhasználót a hibára vagy feljegyezni a sikertelen megnyitási kísérletet egy naplóállományba. hogy rendszerünkben megtalálható-e egy fájl? 3. melyek segítenek megszilárdítani az órában szerzett tudást. Melyik függvénnyel adható programunkhoz külsõ kódot tartalmazó fájl? 2. vagy meghatározott részletekben. Kvíz 1. óra Összefoglalás Ebben az órában megtanultuk. Melyik függvénnyel olvashatunk ki egy sort egy fájlból? 6.

hogy egy könyvtár elemeinek nevét megkapjuk. amely az elõbbi feladatban mentett adatokat kiolvassa a fájlból. illetve a fájl méretét.Fájlok használata 7. 2. Írjuk ki.és keresztnevét. Hogyan nyitunk meg egy könyvtárt olvasásra? 9. miután megnyitottuk azt? 191 Feladatok 1. amely bekéri a felhasználó vezeték. Írjuk ki azokat a böngészõbe (minden sor végén használjunk <BR> címkét). amely ezen adatokat fájlba menti. 10 . Melyik függvényt használjuk. hány sort tartalmaz a fájl. Készítsünk programot. Készítsünk programot. Készítsünk egy oldalt. Melyik függvényt használjuk. hogy egy sort írjunk egy fájlba? 8.

.

• Megtanuljuk. A DBM függvények segítségével lényegében név–érték párokat tárolhatunk és kezelhetünk. • Visszanyerjük adatainkat egy adatbázisból.11. rugalmasak és könnyen használhatók. Noha ezek a függvények nem biztosítják számunkra egy SQL adatbázis erejét. Ebben az órában a következõ témákkal foglalkozunk: • Megtanuljuk a DBM adatbázisok kezelését. • Adatokkal töltünk fel egy adatbázist. majdnem biztos. az e függvényekre épülõ kód általában hordozható. . Mivel a formátum igen elterjedt. • Elemeket módosítunk. Ha mégsem. a PHP akkor is képes utánozni számunkra egy ilyen rendszer mûködését. hogyan tároljunk bonyolultabb adatokat egy DBM adatbázisban. ÓRA A DBM függvények használata Ha nem is férünk hozzá valamilyen SQL adatbáziskezelõhöz (mint a MySQL vagy az Oracle). hogy valamilyen DBM-szerû adatbázisrendszer rendelkezésünkre áll. noha maguk a DBM adatokat tartalmazó állományok nem azok.

milyen mûveleteket kívánunk végrehajtani az adatbázison.1.1. mert a PHP automatikusan zárolja a megnyitott DBM adatbázist. . amikor már befejeztük a munkát. Az adatbázist írásra és olvasásra nyitja meg. amelyet aztán a különbözõ egyéb DBM függvényekkel az adatbázis elérésére és módosítására használhatunk fel./adat/termekek". óra DBM adatbázis megnyitása A DBM adatbázisokat a dbmopen() függvénnyel nyithatjuk meg. Ha befejeztük a munkát.194 11. zárjuk be az adatbázist a dbmclose() függvénnyel. hogy ha nem sikerülne az adatbázis megnyitása. Mivel a dbmopen()egy fájlt nyit meg írásra vagy olvasásra. Létrehozza az adatbázist (ha már létezik ilyen nevû. A dbmclose() függvény paramétere egy érvényes DBM azonosító: dbmclose ( $dbm ). törli az elõzõ változatot). akkor írásra/olvasásra nyitja meg). hogy más folyamatok ne férhessenek hozzá a fájlhoz. a program futását a die() függvénnyel fejezzük be." ). ha pedig nem létezne a megadott néven. Vegyük észre. Létrehozza az adatbázist (ha létezik. a PHP-nek joga kell. újat hoz létre: $dbm = dbmopen( ". mialatt a tartalmát olvassuk vagy írjuk. a várakozó folyamatok azután sem érhetik el az adatbázist. Ez azért szükséges. A dbmopen() függvénynek a 11. Ha az adatbázist nem zárjuk be. táblázatban felsorolt kapcsolókkal adhatjuk meg. 11. táblázat A dbmopen() kapcsolói Kapcsoló r w c n Jelentés Az adatbázist csak olvasásra nyitja meg. A következõ kódrészlet megnyit egy adatbázist. A függvény egy különleges DBM azonosítóval tér vissza. hogy legyen az adatbázist tartalmazó könyvtár elérésére. "c" ) or å die( "Nem lehet megnyitni a DBM adatbázist. amelynek két paramétert kell átadnunk: a DBM fájl elérési útvonalát és a megnyitás módjára vonatkozó kapcsolókat.

"4500.. 7: 8: <?php 9: $dbm = dbmopen( ". "2200. 17: ?> 18: </body> 19: </html> 11 Az adatbázisba illesztés során az összes érték karakterlánccá alakul. 1: <html> 2: <head> 3: <title>11. 10: 11: dbminsert( $dbm. "Tricorder". a kulcs és a tárolandó érték. A dbminsert()már létezõ elemet nem ír felül. amennyiben szükséges.A DBM függvények használata 195 Adatok felvétele az adatbázisba Új név–érték párt a dbminsert() függvénnyel vehetünk fel az adatbázisba. A visszatérési érték 0. 15: 16: dbmclose( $dbm ). Vegyük észre. programban létrehozzuk és megnyitjuk a termekek nevû adatbázist és feltöltjük adatokkal. 11.20" ). "c" ) or die( "Nem lehet megnyitni a DBM adatbázist./adat/termekek". és -1 bármilyen más hiba esetén (például írási kísérlet egy csak olvasásra megnyitott adatbázisba). így a termékek árainak megadásakor idézõjeleket kell használnunk. "HAL 2000". "23. 12: dbminsert( $dbm. ha sikeres volt a mûvelet. 13: dbminsert( $dbm.50" ). hogy nem csak egyszavas kulcsokat használhatunk. Természetesen az adatbázisból kiolvasás után ezeket az értékeket lebegõpontos számokként is kezelhetjük. ha az elem már szerepel az adatbázisban.1. . A 11. 14: dbminsert( $dbm. A függvénynek három paramétere van: egy érvényes DBM azonosító (amelyet a dbmopen() adott vissza).50" ).1. "Ultrahangos csavarhúzó".50" ).. "ORAC AI". "55.1." ). program Adatok felvétele DBM adatbázisba. 1. program Adatok felvétele DBM adatbázisba</title> 4: </head> 5: <body> 6: Termékek hozzáadása.

a függvény az 1 értéket adja vissza és nem módosítja az adatbázist. Adatok módosítása az adatbázisban A DBM adatbázisban a bejegyzéseket a dbmreplace() függvénnyel módosíthatjuk. 12: dbmreplace( $dbm. program Elemek felvétele vagy módosítása DBM adatbázisban 1: <html> 2: <head> 3: <title>11. amely már létezik az adatbázisban. 10: dbmreplace( $dbm.2. "Tricorder". program Elemek felvétele vagy módosítása DBM adatbázisban</title> 4: </head> 5: <body> 6: Termékek hozzáadása. "4535. 11. "25. "HAL 2000". A függvény paraméterei: egy érvényes DBM azonosító. . amikor módosítani szeretnénk egy meglévõ adatot." ). példában az elõzõ program egy új változata látható. a kulcs neve és az új érték. A 11. vagy ha nem található ilyen kulcs az adatbázisban. amely a kulcsokat korábbi meglétüktõl függetlenül felveszi az adatbázisba.2.50" ). "2209.20" ). ha valamilyen hiba lépett fel. "Ultrahangos csavarhúzó".2. 11: dbmreplace( $dbm. óra Ha ezek után meghívjuk a dbminsert() függvényt egy olyan kulcsértékkel. 7: <?php 8: $dbm = dbmopen( ". A visszatérési érték a hibakód: 0.196 11. új adatot szeretnénk felvinni. ha minden rendben volt és –1. "c" ) 9: or die( "Nem lehet megnyitni a DMB adatbázist. Bizonyos körülmények között pontosan erre van szükség. de elõfordulhat olyan eset is. "56. 15: ?> 16: </body> 17: </html> A program mûködésének módosításához mindössze át kell írnunk a dbminsert() függvényhívást dbmreplace()-re.50" ). 14: dbmclose( $dbm )..50" ). "ORAC AI"./adat/termekek". 13: dbmreplace( $dbm..

program DBM adatbázis összes bejegyzésének kiolvasása</title> </head> <body> A Hihetetlen Kütyük Boltja a következõ izgalmas termékeket kínálja Önnek: .A DBM függvények használata 197 Adatok kiolvasása DBM adatbázisból Egyetlen elemet a dbmfetch() függvény segítségével olvashatunk ki az adatbázisból. a dbmfetch()egy üres karakterlánccal tér vissza. Nem mindig ismerjük azonban az adatbázisban található kulcsokat. a kulcshoz tartozó érték lesz. amellyel az adatbázisban szereplõ összes elemen végiglépkedhetünk. A függvény paramétere egy érvényes DBM azonosító. 11 11.3.3.3. Az adatbázis elsõ kulcsát a dbmfirstkey() függvénnyel kérdezhetjük le. az összes rákövetkezõ elemet a dbmnextkey() függvény ismételt hívásával kérdezhetjük le. ha ki kellene írni a böngészõablakba az összes terméket és a hozzájuk tartozó árakat. Ha "Tricorder" elem nem található az adatbázisban. példaprogram a termekek adatbázis teljes tartalmát kiírja a böngészõbe. az adatbázis teljes tartalmát kiolvashatjuk. Természetesen ez nem feltétlenül egyezik meg az elsõként beillesztett adattal. program DBM adatbázis összes bejegyzésének kiolvasása 1: 2: 3: 4: 5: 6: 7: 8: 9: <html> <head> <title>11. "Tricorder" ). A 11. A "Tricorder" elem árát például a következõ függvényhívással kérdezhetjük le: $ar = dbmfetch( $dbm. A függvény visszatérési értéke egy karakterlánc. Ha ezeket a függvényeket együtt használjuk a dbmfetch()-csel. visszatérési értéke pedig a legelsõ kulcs. anélkül. A függvény paraméterként szintén egy érvényes DBM azonosítót vár. Ebben az esetben két paramétert kell átadnunk: egy létezõ DBM azonosítót és az elérni kívánt kulcs nevét. visszatérési értéke pedig a következõ kulcs a sorban. Mit tennénk például akkor. Miután megkaptuk a legelsõ kulcsot. ugyanis a DBM adatbáziskezelõk gyakran saját rendezési eljárást használnak. hogy „beleégetnénk” a programba a termékek nevét? A PHP biztosít egy módszert.

print "<tr><td align = \"left\"> $kulcs </td>"./adat/termekek". print "<td align = \"right\"> \$$ertek </td></tr>". while ( $kulcs != "" ) { $ertek = dbmfetch( $dbm. ábra A DBM adatbázis összes bejegyzésének lekérdezése. program eredménye látható. óra 11. ábrán a 11. ?> </table> </body> </html> A 11. } dbmclose( $dbm ). $kulcs = dbmnextkey( $dbm. $kulcs = dbmfirstkey( $dbm ). . $kulcs )." ).3. $kulcs ).3.198 11. program (folytatás) 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: <p> <table border="1" cellpadding="5"> <tr> <td align="center"> <b>Termék</b> </td> <td align="center"> <b>Ár</b> </td> </tr> <?php $dbm = dbmopen( ".1.1. "c" ) or die( "Nem lehet megnyitni a DBM adatbázist. 11.

"Tricorder" ). dbminsert( $dbm. "tombproba" ) )./adat/proba". hogy létezik-e egyáltalán ilyen kulcsú elem az adatbázisban vagy sem. ezért az egész és lebegõpontos számokon. print gettype( dbmfetch( $dbm. 2. "c" ) or å die("Nem lehet megnyitni a DBM adatbázist. Ha kiírattuk volna a tombproba elem értékét. Sikeres törlés esetén a visszatérési érték true. egyéb esetben (például ha az elem nem létezik) false. // A kimenet: "string" Itt létrehozunk egy tömböt és a $tomb változóba helyezzük. hasznos lehet tudni. 4 ). 11 Összetett adatszerkezetek tárolása DBM adatbázisban A DBM adatbázisban minden adat karaktersorozat formájában tárolódik. Elem törlése az adatbázisból Az adatbázisból elemeket a dbmdelete() függvénnyel törölhetünk. Próbáljunk meg például egy tömböt tárolni: $tomb = array( 1. ezzel el is úszott minden reményünk arra. $tomb ). Úgy látszik. az "Array" karakterláncot kaptuk volna. illetve az ellenõrizendõ elem nevét. . A visszatérési érték true. amely paraméterként egy érvényes DBM azonosítót vár.A DBM függvények használata 199 Elemek meglétének lekérdezése Mielõtt kiolvasnánk vagy módosítanánk egy elemet. hogy karakterláncot kaptunk vissza."). hogy tömböket vagy más összetett adatszerkezetet tároljunk a DBM adatbázisban. if ( dbmexists( $dbm. ha az elem létezik. "tombproba". amikor megpróbáljuk visszaolvasni a tombproba elemet – láthatjuk. A függvény bemenõ paramétere egy érvényes DBM azonosító és a törlendõ elem neve. dbmdelete( $dbm. 3. illetve karakterláncokon kívül minden egyéb adattípus elvész. Erre a célra a dbmexists() függvény szolgál. majd megvizsgáljuk a dbmfetch() függvény visszatérési típusát. Ezután megnyitjuk az adatbázist és beszúrjuk a tömböt tombproba néven. "Tricorder" ). "Tricorder" ) ) print dbmfetch( $dbm. $dbm = dbmopen( ".

14: "szin"=>"vörös" ).50".4. Ezzel a módszerrel lehetõségünk nyílik összetett adatszerkezetek tárolására a DBM adatbázisok által kínált egyszerû eszközökkel is. 16: "szallitas"=>"34. 11. program Összetett adatszerkezetek tárolása DBM adatbázisban</title> 4: </head> 5: <body> 6: Összetett adatok tárolása 7: <?php 8: $termekek = array( 9: "Ultrahangos csavarhúzó" => array( "ar"=>"22.50". program Összetett adatszerkezetek tárolása DBM adatbázisban 1: <html> 2: <head> 3: <title>11. 3.i:1. Ha vissza akarjuk állítani eredeti formájára. az unserialize() függvényt kell használnunk. 15: "ORAC AI" => array( "ar"=>"2200. 11: "szin"=>"zöld" ). 19: "szallitas"=>"18. a visszaadott érték pedig egy karakterlánc: $tomb = array( 1. Az így „kódolt” szerkezetet már tárolhatjuk késõbbi használatra.4. amely segítségével a bonyolultabb szerkezeteket is egyszerû karaktersorozattá alakíthatjuk.i:4.i:3.50". A 11.i:2.}" A DBM adatbázisban ezt a karakterláncot tárolhatjuk. 13: "szallitas"=>"7.50".50".i:2. Az átalakítást a serialize() függvénnyel végezhetjük el.200 11. 2. // A kimenet: "a:4:{i:0.50".50". 12: "Tricorder" => array( "ar"=>"55. óra Szerencsére a PHP rendelkezik egy olyan lehetõséggel. . 20: "szin"=>"rózsaszín" ) 21: ). 18: "HAL 2000" => array( "ar"=>"4500. listában egy asszociatív tömb tartalmazza a termékekrõl rendelkezésre álló információkat – ezt alakítjuk át karakterlánccá és helyezzük egy DBM adatbázisba.4.i:1.i:3. 4 ).50". amelynek bemenõ paramétere egy tetszõleges típusú változó. print serialize( $tomb ). DBM adatbázisban vagy akár fájlban is. 10: "szallitas"=>"12. 17: "szin"=>"kék" ).

az árat és a szállítás költségét."). foreach( $termekek as $kulcs => $ertek ) dbmreplace( $dbm. A 11. amely kulcsként tartalmazza a termék nevét és három tömbelemben tárolja a színt.5./adat/ujtermekek".5. serialize( $ertek ) ). $kulcs. Ezután egy ciklus segítségével feldolgozzuk az összes elemet: a termék nevét és a karakterlánccá alakított tömböt átadjuk a dbmreplace() függvénynek. program (folytatás) 22: 23: 24: 25: 26: 27: 28: 29: $dbm = dbmopen( ".4. ?> </body> </html> A listában egy többdimenziós tömböt építünk fel. program Összetett adatszerkezetek visszaolvasása DBM adatbázisból 1: <html> 2: <head> 3: <title>11. dbmclose( $dbm ).A DBM függvények használata 201 11. program az adatok visszatöltésére ad megoldást. program Összetett adatszerkezetek visszaolvasása 4: DBM adatbázisból</title> 5: </head> 6: <body> 7: A Hihetetlen Kütyük Boltja 8: a következõ izgalmas termékeket kínálja 9: Önnek: 10: <p> 11: <table border="1" cellpadding ="5"> 12: <tr> 13: <td align="center"> <b>Termék</b> </td> 14: <td align="center"> <b>Szín</b> </td> 15: <td align="center"> <b>Szállítás</b> </td> 16: <td align="center"> <b>Ár</b> </td> 17: </tr> 18: <?php . 11 11. "c" ) or die("Nem lehet megnyitni a DBM adatbázist.5. Ezután lezárjuk az adatbázist.

32: ?> 33: </table> 34: </body> 35: </html> Ez a megoldás hasonló a 11. Így már egyszerû feladat kiíratni az összes elemet a böngészõablakba. 30: } 31: dbmclose( $dbm ). ábra Összetett adatszerkezetek visszaolvasása DBM adatbázisból . 27: print '<td align="right"$ $termektomb["szallitas"] "</td>"./adat/ujtermekek"."). program kimenete látható. A ciklusban az unserialize() függvénnyel létrehozzuk a termékeket tartalmazó tömböt. 21: $kulcs = dbmfirstkey( $dbm ). ábrán a 11. de ebben az esetben több mezõt nyomtatunk ki. program (folytatás) 19: $dbm = dbmopen( ".2. 22: while ( $kulcs != "" ) 23: { 24: $termektomb = unserialize( dbmfetch( $dbm.202 11. 11. "c" ) 20: or die(“Nem lehet megnyitni a DBM adatbázist. $kulcs ) ). 26: print '<td align="left" $termektomb["szin"] "</td>". példában látottakhoz. 25: print "<tr><td align=\"left\"> $kulcs </td>". 28: print '<td align="right"$ $termektomb["ar"] "</td></tr>\n". A 11.5. óra 11. illetve a dbmnextkey() függvénnyel beolvassuk az összes adatot az adatbázisból. Megnyitjuk az adatbázist és a dbmfirstkey(). 29: $kulcs = dbmnextkey( $dbm.5.3. $kulcs ).2.

A termékek árának módosításához szükségünk lesz egy szövegmezõre és minden elemhez tartozni fog egy jelölõnégyzet is. Elõször is fel kell építenünk az ûrlapot. az új elemek felvételéhez. Tegyük lehetõvé a rendszergazda számára. melynek segítségével az adott elemet törlésre jelölhetjük ki. ezért a biztonsági kérdésekkel most nem foglalkozunk.A DBM függvények használata 203 Egy példa Már eleget tudunk ahhoz. hogy új elemekkel bõvítse az adatbázist. A lapon el kell helyeznünk két további szövegmezõt is. 4: ?> 5: <html> 6: <head> 7: <title>11. amely az adatbázis elemeit tartalmazza. példaprogram által létrehozott adatbázis termékeinek árát. ahol a webhely szerkesztõje megváltoztathatja a 11. program HTML ûrlap készítése 8: DBM adatbázis alapján </title> 9: </head> 10: <body> 11: <form method="POST"> 12: <table border="1"> 13: <tr> 14: <td>Törlés</td> 15: <td>Termék</td> 16: <td>Ár</td> 17: </tr> 18: <?php 19: $kulcs = dbmfirstkey( $dbm )."). A 11./adat/termekek".6. példában az oldalt elkészítõ program olvasható. $kulcs ). program HTML ûrlap készítése DBM adatbázis alapján 1: <? 2: $dbm = dbmopen( ". A feladat a következõ: készítsünk egy karbantartó oldalt. 20: while ( $kulcs != "" ) 21: { 22: $ar = dbmfetch( $dbm. hogy elkészítsünk egy mûködõképes programot az ebben az órában tanult módszerekkel. 11 11. Az oldalt nem tesszük nyilvános kiszolgálón elérhetõvé. illetve hogy a régi elemeket törölje. .6. 23: print "<tr><td> <input type=\"checkbox"\ name=\"torles[]\" ".6.2. "c" ) 3: or die("Nem lehet megnyitni a DBM adatbázist.

204 11. . óra 11. Ezután megkezdünk egy ûrlapot és mivel nem adunk meg céloldalt. az értékeket a dbmfetch() függvénnyel olvasva ki. program (folytatás) 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: print "value=\"$kulcs\"> </td>". amelyeket törölnünk kell. Elkészítjük a táblázat fejlécét.</td> <td><input type="text" name="uj_nev"></td> <td><input type="text" name="uj_ar"></td> </tr> <tr> <td colspan="3" align="right"> <input type="submit" value="Változtat"> </td> </tr> </table> </form> </body> </html> Szokás szerint az elsõ lépés az adatbázis megnyitása. print "<td> $kulcs </td>". feldolgozó programként magát az oldalt jelöljük ki. ?> <tr> <td>&nbsp. majd végigolvassuk az adatbázist a dbmfirstkey() és dbmnextkey() függvények segítségével. Így. Ennek hatására a PHP létrehozza a $torles tömböt. A táblázat elsõ mezõje minden sorban egy jelölõnégyzetet tartalmaz. miután a rendszergazda kitöltötte és elküldte az ûrlapot. print "<td> <input type=\"text\" name=\"arak[$kulcs]\" ". amelyekkel a DBM adatbázis az adott terméket nyilvántartja (ezt az értéket a $kulcs változóban tároljuk). } dbmclose( $dbm ).6. print "value=\"$ar\"> </td></tr>". a program $torles tömbje azon adatbázis-elemek kulcsait fogja tárolni. $kulcs = dbmnextkey( $dbm. így a $torles tömb elemei is azok az azonosítók lesznek. hogy mindegyik jelölõnégyzet neve "torles[]". $kulcs ). A jelölõnégyzetekhez tartozó értékek. Vegyük észre. amely az összes bejelölt elemet tartalmazza.

Miután a karbantartó kitöltötte és elküldte az ûrlapot. A feladat nem olyan nehéz. A 11. if ( isset ( $torles ) ) { foreach ( $torles as $kulcs => $ertek ) { unset( $arak[$ertek]). Elõször töröljük a kijelölt elemeket az adatbázisból. és az összes elemét töröljük az adatbázisból. végül felvesszük az új elemet az adatbázisba. ezúttal azonban a szögletes zárójelek közé beírjuk az azonosítót. amely alapján a DBM adatbázis az elemet tárolja. amelyben a kulcsok a termékek azonosítói. A mezõt ugyanolyan módon nevezzük el. Mindössze annyi a dolgunk. mint az elõzõt.3.6. ábrán a 11. Lezárjuk az adatbázist és visszatérünk HTML módba az új bejegyzés létrehozására szolgáló uj_nev és uj_ar mezõk megjelenítéséhez.3. program kimenetét láthatjuk. amely a felhasználó által megadott adatokat kezeli. mint amilyennek látszik. a törlendõ elemek listája a $torles tömbben áll rendelkezésünkre. hogy végigolvassuk a tömböt. majd módosítjuk az árakat. ábra HTML ûrlap készítése DBM adatbázis alapján 11 Miután elkészítettük az ûrlapot. 205 11. } } .A DBM függvények használata Ezután kiírjuk a böngészõablakba az elem nevét és létrehozunk egy szöveges mezõt a termék árának. dbmdelete( $dbm. $ertek ). meg kell írnunk a kódot. A PHP ennek hatására létrehozza az $arak tömböt.

206

11. óra Elõször is megvizsgáljuk, hogy létezik-e a $torles változó. Ha a felhasználó csak most érkezett az oldalra vagy nem jelölt ki törlése egyetlen terméket sem, a változó nem létezik. Ellenkezõ esetben egy ciklus segítségével végigolvassuk és minden elemére meghívjuk a dbmdelete() függvényt, amely eltávolítja a DBM adatbázisból a paraméterként megadott elemet. Hasonlóan járunk el az $arak tömb esetében is, itt azonban a PHP unset() függvényét kell használnunk a tömbelem törlésére. Az $arak tömb a felhasználótól érkezett, feltehetõen részben módosított árakat tartalmazza. Ha nem törölnénk az $arak tömbbõl a megfelelõ elemet, a következõ kód újra beillesztené. Az adatbázis elemeinek frissítése során két választási lehetõségünk van. Az elsõ változatot akkor alkalmazzuk, ha az adatbázis karbantartását nem egyetlen szerkesztõ fogja végezni, tehát feltételezhetõ, hogy a programot egyidõben több felhasználó is futtatni fogja – eszerint csak azokat az elemeket változtatjuk meg, amelyeket a felhasználó kijelölt. A másik változat, amely az összes elemet megváltoztatja, akkor alkalmazható, ha a program csak egyetlen példányban futhat: if ( isset ( $arak ) ) { foreach ( $arak as $kulcs => $ertek ) dbmreplace( $dbm, $kulcs, $ertek ); } Elõször is ellenõriznünk kell az $arak tömb meglétét. Ebben a tömbben az adatbázis egy teljesen új változata lehet. Egy ciklus segítségével tehát végigolvassuk az összes elemet és egyesével frissítjük az adatbázisban. Végül ellenõriznünk kell, hogy a felhasználó kezdeményezte-e új elem felvételét az adatbázisba: if ( ! empty( $uj_nev ) && ! empty( $uj_ar ) ) dbminsert( $dbm, "$uj_nev", "$uj_ar" ); Ahelyett, hogy az $uj_nev és $uj_ar meglétét ellenõriznénk, azt kell ellenõriznünk, hogy értékük nem „üres”-e. Ez apró, de lényeges különbség. Amikor a felhasználó elküldi az ûrlapot, a változók mindenképpen létrejönnek, de ha a szövegmezõk nem kaptak értéket, a megfelelõ változók üres karakterláncot tartalmaznak. Mivel nem akarunk üres elemeket tárolni az adatbázisban, fontos ellenõrizni, hogy nem üresek-e a változók. Azért használjuk a dbminsert() függvényt a dbmreplace() helyett, hogy elkerüljük a már bevitt termékek véletlen felülírását. A teljes kódot a 11.7. példa tartalmazza.

A DBM függvények használata

207

11.7. program A teljes adatbázis-karbantartó program
1: <?php 2: $dbm = dbmopen( "./adat/termekek", "c" ) 3: or die("Nem lehet megnyitni a DBM adatbázist.”); 4: 5: if ( isset ( $torles ) ) 6: { 7: foreach ( $torles as $kulcs => $ertek ) 8: { 9: unset( $arak[$ertek]); 10: dbmdelete( $dbm, $ertek ); 11: } 12: } 13: 14: if ( isset ( $arak ) ) 15: { 16: foreach ( $arak as $kulcs => $ertek ) 17: dbmreplace( $dbm, $kulcs, $ertek ); 18: } 19: 20: if ( ! empty( $uj_nev ) && ! empty( $uj_ar ) ) 21: dbminsert( $dbm, "$uj_nev", "$uj_ar" ); 22: ?> 23: 24: <html> 25: <head> 26: <title>11.7. program A teljes adatbázis-karbantartó program </title> 27: </head> 28: <body> 29: 30: <form method="POST"> 31: 32: <table border="1"> 33: <tr> 34: <td>Törlés</td> 35: <td>Termék</td> 36: <td>Ár</td> 37: </tr> 38: 39: <?php

11

208

11. óra

11.7. program (folytatás)
40: $kulcs = dbmfirstkey( $dbm ); 41: while ( $kulcs != "" ) 42: { 43: $ar = dbmfetch( $dbm, $kulcs ); 44: print "<tr><td> <input type=\"checkbox"\ name=\"torles[]\" "; 45: print "value=\"$kulcs\"> </td>"; 46: print "<td> $kulcs </td>"; 47: print "<td> <input type=\"text\" name=\"arak[$kulcs]\" "; 48: print "value=\"$ar\"> </td></tr>"; 49: $kulcs = dbmnextkey( $dbm, $kulcs ); 50: } 51: 52: dbmclose( $dbm ); 53: ?> 54: 55: <tr> 56: <td>&nbsp;</td> 57: <td><input type="text" name="uj_nev"></td> 58: <td><input type="text" name="uj_ar"></td> 59: </tr> 60: 61: <tr> 62: <td colspan="3" align="right"> 63: <input type="submit" value="Változtat"> 64: </td> 65: </tr> 66: 67: </table> 68: </form> 69: 70: </body> 71: </html>

A DBM függvények használata

209

Összefoglalás
Ebben az órában megtanultuk, hogyan használjuk a PHP hatékony DBM függvényeit adatok tárolására és visszaolvasására. Megtanultuk a dbmopen() használatát egy új DBM azonosító létrehozására. Ezt az azonosítót használtuk az összes többi DBM függvénynél is. Új adatokat adtunk az adatbázishoz a dbminsert() függvénnyel, módosítottunk meglevõket a dbmreplace()-szel és töröltünk a dbmdelete() használatával. Megtanultuk, hogyan használhatjuk a dbmfetch() függvényt az adatok visszaolvasására. A serialize() és unserialize() függvényekkel összetett adatszerkezeteket tároltunk DBM adatbázisban, végül egy gyakorlati példán keresztül megnéztük, hogyan is használhatók fel e módszerek a valós problémák megoldására.

Kérdések és válaszok
Mikor használjak DBM adatbázist SQL adatbázis helyett? A DBM jó választás, ha kis mennyiségû és viszonylag egyszerû szerkezetû adatot szeretnénk tárolni (név–érték párokat). A DBM adatbázist használó programok rendelkeznek a hordozhatóság nagyon fontos elõnyével, de ha nagyobb mennyiségû adatot kell tárolnunk, válasszunk inkább egy SQL adatbáziskezelõt, például a MySQL-t.

11

Mûhely
A mûhelyben kvízkérdések találhatók, melyek segítenek megszilárdítani az órában szerzett tudást. A válaszokat az A függelékben helyeztük el.

Kvíz
1. Melyik függvényt használhatjuk egy DBM adatbázis megnyitásához? 2. Melyik függvénnyel szúrhatunk be új elemet egy DBM adatbázisba? 3. Melyik függvénnyel módosíthatunk egy elemet? 4. Hogyan érünk el egy elemet az adatbázisban, ha ismerjük a nevét? 5. Hogyan olvasnánk ki egy DBM adatbázisból a legelsõ elem nevét (nem az értékét)? 6. Hogyan érjük el a további neveket? 7. Hogyan törlünk egy elemet a DBM adatbázisból, ha ismerjük a nevét?

210

11. óra

Feladatok
1 Hozzunk létre egy DBM adatbázist a felhasználók azonosítóinak és jelszavainak tárolására. Készítsünk egy programot, amellyel a felhasználók létrehozhatják a rájuk vonatkozó bejegyzést. Ne feledjük, hogy két azonos nevû elem nem kerülhet az adatbázisba. 2 Készítsünk egy bejelentkezõ programot, amely ellenõrzi a felhasználó azonosítóját és jelszavát. Ha a felhasználói bemenet egyezik valamelyik bejegyzéssel az adatbázisban, akkor üdvözöljük a felhasználót valamilyen különleges üzenettel. Egyébként jelenítsük meg újra a bejelentkezõ ûrlapot.

12. ÓRA
Adatbázisok kezelése – MySQL
A PHP nyelv egyik meghatározó tulajdonsága, hogy nagyon könnyen képes adatbázisokhoz csatlakozni és azokat kezelni. Ebben az órában elsõsorban a MySQL adatbázisokkal foglalkozunk, de amint majd észre fogjuk venni, a PHP által támogatott összes adatbázist hasonló függvények segítségével érhetjük el. Miért esett a választás éppen a MySQL-re? Mert ingyenes, ugyanakkor nagyon hatékony eszköz, amely képes megfelelni a valós feladatok által támasztott igényeknek is. Az sem elhanyagolható szempont, hogy többféle rendszerhez is elérhetõ. A MySQL adatbáziskiszolgálót a http://www.mysql.com címrõl tölthetjük le. Ebben az órában a következõ témákkal foglalkozunk: • Megnézünk néhány SQL példát. • Csatlakozunk egy MySQL adatbáziskiszolgálóhoz. • Kiválasztunk egy adatbázist. • Tanulunk a hibakezelésrõl. • Adatokat viszünk fel egy táblába.

212

12. óra • Adatokat nyerünk ki egy táblából. • Megváltoztatjuk egy adattábla tartalmát. • Megjelenítjük az adatbázis szerkezetét.

(Nagyon) rövid bevezetés az SQL nyelvbe
ÚJDONSÁG Az SQL jelentése Structured Query Language, vagyis strukturált lekérdezõ nyelv. Az SQL szabványosított nyelvezete segítségével a különbözõ típusú adatbázisokat azonos módon kezelhetjük. A legtöbb SQL termék saját bõvítésekkel látja el a nyelvet, ahogy a legtöbb böngészõ is saját HTML nyelvjárást „beszél”. Mindazonáltal SQL ismeretek birtokában nagyon sokféle adatbázist fogunk tudni használni, a legkülönbözõbb operációs rendszereken. A könyvben – terjedelmi okok miatt – még bevezetõ szinten sem tárgyalhatjuk az SQL-t, de megpróbálunk megvilágítani egy-két dolgot a MySQL-lel és általában az SQL-lel kapcsolatban. A MySQL kiszolgáló démonként fut a számítógépen, így a helyi vagy akár távoli gépek felhasználói bármikor csatlakozhatnak hozzá. Miután a csatlakozás megtörtént, ki kell választanunk a megfelelõ adatbázist, ha van jogunk hozzá. Egy adatbázison belül több adattáblánk is lehet. Minden tábla oszlopokból és sorokból áll. A sorok és oszlopok metszéspontjában tároljuk az adatokat. Minden oszlopba csak elõre megadott típusú adatot tölthetünk, az INT típus például egész számot, míg a VARCHAR változó hosszúságú, de egy adott értéknél nem hosszabb karakterláncot jelent. A kiválasztott adatbázisban a következõ SQL utasítással hozhatunk létre új táblát: CREATE TABLE entablam ( keresztnev VARCHAR(30), å vezeteknev VARCHAR(30), kor INT ); Ez a tábla három oszlopot tartalmaz. A keresztnev és vezeteknev oszlopokba legfeljebb 30 karaktert írhatunk, míg a kor oszlopba egy egész számot. A táblába új sort az INSERT paranccsal vehetünk fel: INSERT INTO entablam ( keresztnev, vezeteknev, kor ) å VALUES ( 'János', 'Kovács', 36 );

Adatbázisok kezelése – MySQL A mezõneveket az elsõ, zárójelek közti kifejezéssel adjuk meg, míg az értékeket a megfelelõ sorrendben a második zárójelpár között soroljuk fel. A táblából az összes adatot a SELECT paranccsal kaphatjuk meg: SELECT * FROM entablam; A „*” szokásos helyettesítõ karakter, jelentése „az összes mezõ”. Ha nem az összes mezõ tartalmát akarjuk lekérdezni, írjuk be az érintett mezõk neveit a csillag helyére: SELECT kor, keresztnev FROM entablam; Már létezõ bejegyzést az UPDATE paranccsal módosíthatunk. UPDATE entablam SET keresztnev = 'Gábor'; Az utasítás az összes sorban "Gábor"-ra módosítja a keresztnev mezõ tartalmát. A WHERE záradékkal leszûkíthetjük a SELECT és UPDATE parancsok hatáskörét. Például: SELECT * FROM entablam WHERE keresztnev = 'Gábor'; Ez az utasítás csak azokat a sorokat írja ki, amelyekben a keresztnev mezõ értéke "Gábor". A következõ példa csak azokban a sorokban változtatja "Gábor"-ra a keresztnev mezõ értékét, ahol a vezeteknev mezõ a "Szakács" karakterláncot tartalmazza. UPDATE entablam SET keresztnev = "Gábor" WHERE vezeteknev = å = "Szakács"; Az SQL-rõl további információkat találunk Ryan K. Stephens és szerzõtársai Teach Yourself SQL in 21 Days címû könyvében.

213

12

Csatlakozás a kiszolgálóhoz
Mielõtt elkezdhetnénk dolgozni az adatbázissal, csatlakoznunk kell a kiszolgálóhoz. A PHP-ben erre a mysql_connect() függvény szolgál. A függvény három karakterláncot vár paraméterként: a gazdagép nevét, a felhasználó nevét és a jelszót. Ha ezek egyikét sem adjuk meg, a függvény feltételezi, hogy a kérés a localhost-ra (azaz a helyi gépre) vonatkozik és felhasználóként a PHP-t futtató felhasználót, jelszóként pedig egy üres karakterláncot ad át. Az alapértelmezés

214

12. óra a php.ini fájlban felülbírálható, de egy próbálkozásra szánt kiszolgálót kivéve nem bölcs dolog ezzel próbálkozni, ezért a példákban mindig használni fogjuk a felhasználónevet és a jelszót. A mysql_connect() függvény siker esetén egy kapcsolatazonosítót ad vissza, amelyet egy változóba mentünk, hogy a késõbbiekben folytathassuk a munkát az adatbáziskiszolgálóval. Az alábbi kódrészlet a mysql_connect() függvény segítségével kapcsolódik a MySQL adatbáziskiszolgálóhoz. $kapcsolat = mysql_connect( "localhost", "root", "jelszo" ); if ( ! $kapcsolat ) die( "Nem lehet csatlakozni a MySQL kiszolgalohoz!" ); Ha a PHP-t az Apache kiszolgáló moduljaként használjuk, a mysql_pconnect() függvényt is használhatjuk az elõzõekben megadott paraméterekkel. Fontos különbség a két függvény között, hogy a mysql_pconnect()-tel megnyitott adatbáziskapcsolat nem szûnik meg a PHP program lefutásával vagy a mysql_close() függvény hatására (amely egy szokásos MySQL kiszolgálókapcsolat bontására szolgál) , hanem továbbra is aktív marad és olyan programokra várakozik, amelyek a mysql_pconnect() függvényt hívják. Más szóval a mysql_pconnect() függvény használatával megtakaríthatjuk azt az idõt, ami egy kapcsolat felépítéséhez szükséges és egy elõzõleg lefutott program által hagyott azonosítót használhatunk.

Az adatbázis kiválasztása
Miután kialakítottuk a kapcsolatot a MySQL démonnal, ki kell választanunk, melyik adatbázissal szeretnénk dolgozni. Erre a célra a mysql_select_db() függvény szolgál, amelynek meg kell adnunk a kiválasztott adatbázis nevét és szükség szerint egy kapcsolatazonosító értéket. Ha ez utóbbit elhagyjuk, automatikusan a legutoljára létrehozott kapcsolat helyettesítõdik be. A mysql_select_db() függvény igaz értéket ad vissza, ha az adatbázis létezik és jogunk van a használatára. A következõ kódrészlet a pelda nevû adatbázist választja ki. $adatbazis = "pelda"; mysql_select_db( $adatbazis ) or die ( "Nem lehet å megnyitni a következõ adatbázist: $adatbazis" );

Adatbázisok kezelése – MySQL

215

Hibakezelés
Eddig ellenõriztük a MySQL függvények visszatérési értékét és hiba esetén a die() függvénnyel kiléptünk a programból. A hibakezeléshez azonban hasznosabb lenne, ha a hibaüzenetek valamivel több információt tartalmaznának. Ha valamilyen mûvelet nem sikerül, a MySQL beállít egy hibakódot és egy hibaüzenetet. A hibakódhoz a mysql_errno(), míg a hibaüzenethez a mysql_error() függvénnyel férhetünk hozzá. A 12.1 példa az eddigi kódrészleteinket teljes programmá kapcsolja össze, amely kapcsolódik az adatbáziskezelõhöz és kiválasztja az adatbázist. A hibaüzenetet a mysql_error() függvénnyel tesszük használhatóbbá.

12.1. program Kapcsolat megnyitása és az adatbázis kiválasztása
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: <html> <head> <title>12.1. program Kapcsolat megnyitása és adatbázis kiválasztása</title> </head> <body> <?php $felhasznalo = "jozsi"; $jelszo = "bubosvocsok"; $adatbazis = "pelda"; $kapcsolat = mysql_connect( "localhost", $felhasznalo, $jelszo ); if ( ! $kapcsolat ) die( "Nem lehet kapcsolódni a MySQL kiszolgálóhoz!" ); print "Sikerült a kapcsolatfelvétel<P>"; mysql_select_db( $adatbazis ) or die ( "Nem lehet megnyitni a $adatbázist: " .mysql_error() ); print "Sikeresen kiválasztott adatbázis: \" $adatbazis\"<P>"; mysql_close( $kapcsolat ); ?> </body> </html>

12

tartomany VARCHAR( 20 ).2 példában kibõvítjük a korábbi programot és a mysql_query() függvénnyel kiadunk egy INSERT utasítást a pelda adatbázis tartomanyok tábláján. PRIMARY KEY( azonosito ). Az adatok felviteléhez össze kell állítanunk és le kell futtatnunk egy SQL parancsot. így ideje némi adatot is bevinni a táblákba. A következõ példákhoz képzeljük el. az email mezõ pedig a felhasználó elektronikus levélcímét. Meg kell jegyeznünk. a tartomany mezõ változó számú karaktert tartalmazhat (VARCHAR). Ha a program sikeresen lefutott. Ekkor a die() kimenete valami ilyesmi lesz: Nem lehet megnyitni a nincsmeg adatbázist: Access denied å for user: 'jozsi@localhost' to database 'nincsmeg' Adatok hozzáadása táblához Már sikerült hozzáférést szerezni az adatbázishoz. nem CHAR( 1 ). óra Ha az $adatbazis változó értékét mondjuk "nincsmeg"-re módosítjuk. a nem mezõ egyetlen karaktert. erre a célra a PHP-ben a mysql_query() függvény szolgál. A táblát a következõ SQL paranccsal készíthetjük el: CREATE TABLE tartomanyok ( azonosito INT NOT NULL å AUTO_INCREMENT. a program egy nem létezõ adatbázist próbál meg elérni. a mysql_query()pozitív értéket ad vissza. email VARCHAR( 20 ) ). A függvény paraméterként egy SQL parancsot tartalmazó karakterláncot és szükség szerint egy kapcsolatazonosítót vár. a visszatérési érték hamis lesz. amely automatikusan növel egy egész értéket. ahogy újabb bejegyzések kerülnek a táblába. hogy egy sikeresen lefutott SQL program nem feltétlenül okoz változást az adatbázisban vagy tér vissza valamilyen eredménnyel. . Ha ez utóbbit elhagyjuk. A 12. hogy az általunk készítendõ oldalon a látogatóknak lehetõségük lesz tartományneveket vásárolni.216 12. a függvény automatikusan az utoljára megnyitott kapcsolaton keresztül próbálja meg kiadni az SQL parancsot. ha azonban formai hibát tartalmaz vagy nincs jogunk elérni a kívánt adatbázist. Az azonosito mezõ lesz az elsõdleges kulcs. A pelda adatbázisban készítsük el az öt oszlopot tartalmazó tartomanyok táblát.

'okoska@tartomany. 17: mysql_query( $parancs. Természetesen minden esetben.hu' )". 8: $jelszo = "bubosvocsok".2.3 példa a felhasználó által bevitt adatot tölti be a táblába.Adatbázisok kezelése – MySQL 217 12.2. 20: mysql_close( $kapcsolat ). 13: mysql_select_db( $adatbazis. 21: ?> 22: </body> 23: </html> 12 Vegyük észre.com'. $kapcsolat ) 18: or die ( "Nem lehet adatot hozzáadni a \"tartomanyok\" táblához: " 19: . $felhasznalo. program Új sor hozzáadása táblához</title> 4: </head> 5: <body> 6: <?php 7: $felhasznalo = "jozsi". nem. amikor a böngészõben újratöltjük a 12. 'F'. email ) 16: VALUES ( '123xyz. 10: $kapcsolat = mysql_connect( "localhost". $kapcsolat ) 14: or die ( "Nem lehet megnyitni a $adatbázist: ". 15: $parancs = "INSERT INTO tartomanyok ( tartomany. program Új sor hozzáadása táblához 1: <html> 2: <head> 3: <title>12. A mezõ értéke automatikusan növekszik az INSERT hatására. hogy nem adtunk értéket az azonosito mezõnek. 9: $adatbazis = "pelda". $jelszo ). 11: if ( ! $kapcsolat ) 12: die( "Nem lehet kapcsolódni a MySQL kiszolgálóhoz!" ). A 12.2 példaprogramot.mysql_error() ).mysql_error() ). ugyanaz a sor adódik hozzá a táblához. .

&$dbhiba ) 22: { 23: $felhasznalo = "jozsi".218 12. $email. 14: else 15: print "Köszönjük!". 30: return false. program A felhasználó által megadott adatok beszúrása a táblába</title> 4: </head> 5: <body> 6: <?php 7: if ( isset( $tartomany ) && isset( $nem ) && isset( $email ) ) 8: { 9: // Ne feledjük ellenõrizni a felhasználó által megadott adatokat! 10: $dbhiba = "". 12: if ( ! $vissza ) 13: print "Hiba: $dbhiba<BR>". 31: } 32: if ( ! mysql_select_db( $adatbazis. $email. 27: if ( ! $kapcsolat ) 28: { 29: $dbhiba = "Nem lehet kapcsolódni a MySQL kiszolgálóhoz!".3. $jelszo ). $nem. $kapcsolat ) ) 33: { 34: $dbhiba = mysql_error(). $dbhiba ).3. 26: $kapcsolat = mysql_pconnect( "localhost". óra 12. 11: $vissza = adatbazis_bovit( $tartomany. $felhasznalo. $nem. 19: } 20: 21: function adatbazis_bovit( $tartomany. . 16: } 17: else { 18: urlap_keszit().program A felhasználó által megadott adatok beszúrása a táblába 1: <html> 2: <head> 3: <title>12. 24: $jelszo = "bubosvocsok". 25: $adatbazis = "pelda".

50: print "<form action=\"$PHP_SELF\" method=\"POST\">\n". 45: } 46: 47: function urlap_keszit() 48: { 49: global $PHP_SELF. 54: print "<input type=\"text\" name=\"email\"> ".3. 58: print "</select>\n". 42: return false. $kapcsolat ) ) 40: { 41: $dbhiba = mysql_error().Adatbázisok kezelése – MySQL 219 12. Meg kell jegyeznünk. 43: } 44: return true. 60: } 61: ?> 62: </body> 63: </html> 12 A tömörség érdekében a 12. mivel így jobban összpontosíthattunk az óra témájára. Megbíztunk a felhasználókban: semmilyen formában nem ellenõriztük a felhasználó által bevitt adatokat. email ) 38: VALUES ( '$tartomany'. 56: print "\t<option value=\"N\"> Nõ\n". 52: print "<input type=\"text\" name=\"tartomany\"> ". hogy a beérkezõ adatok ellenõrzése mindig fontos feladat. nem.3. '$email' )". '$nem'. 59: print "<input type=\"submit\" value=\"Elküld\">\n</form>\n".program (folytatás) 35: return false. 53: print "Email cím<p>\n". 39: if ( ! mysql_query( $parancs. 51: print "A kívánt tartomány<p>\n". Ezt a feladatot a 17. példából kihagytunk egy fontos részt. . itt csak azért maradt el. 57: print "\t<option value=\"F\"> Férfi\n". 36: } 37: $parancs = "INSERT INTO tartomanyok ( tartomany. órában tárgyalt karakterlánckezelõ függvényekkel végezhetjük el. 55: print "<select name=\"nem\">\n".

amely egy HTML ûrlapot jelenít meg a böngészõben. $nem és $email változókat. a másolat helyett tulajdonképpen az eredeti paraméter értékét módosítjuk. Ha a mysql_select_db() vagy a mysql_query() függvény nem sikeres. Miután az adatbazis_bovit() lefutott. így hivatkozásként kell átadnunk. ha azonnal szükségünk van az értékre? Fölösleges külön lekérdezést végrehajtani. Ha true. amely elvégzi az adatbázisban a kívánt mûveletet. hiszen a PHP tartalmazza a mysql_insert_id() függvényt. feltehetjük.220 12. így ezt a szöveget is belefoglaljuk a hibaüzenetbe. illetve a $dbhiba karakterlánc. akkor hozzárendelünk egy hibaszöveget a $dbhiba változóhoz és false értéket visszaadva befejezzük a függvény futását. A mysql_insert_id() függvénynek szükség esetén átadhatunk . értékére pedig nem volt szükségünk. Ha a csatlakozás sikeres volt. ezért meghívunk egy másik általunk írt függvényt. Egyébként ki kell írnunk a böngészõbe a hibaüzenetet. De mi van akkor. óra Ellenõrizzük a $tartomany. kiválasztjuk a tartomany táblát tartalmazó adatbázist és összeállítunk egy SQL utasítást a felhasználó által küldött értékek felhasználásával. így meghívjuk az adatbazis_bovit() függvényt. Ha megvannak. vagyis ha a mûvelet sikeres volt. Ha a kezdeti if kifejezés nem találja meg a $tartomany. a $dbhiba változóba betöltjük a mysql_error() függvény által visszaadott értéket és false értékkel térünk vissza. true értéket adunk vissza. egy SQL lekérdezéssel bármikor lekérdezhetjük az adatbázisból. Ez utóbbiba fogjuk betölteni az esetlegesen felbukkanó hibaüzeneteket. az urlap_keszit()-et. a $nem és az $email változók. Ennek hatására ha a függvénytörzsön belül megváltoztatjuk a $dbhiba értékét. Az adatbazis_bovit()-nek négy paramétere van: a $tartomany. Ha ez nem sikerül. hiszen az adatok beszúrásával az folyamatosan növekedett. hogy a felhasználó adatokat küldött az ûrlap kitöltésével. hogy a felhasználó nem küldött el semmilyen adatot. $nem vagy $email valamelyikét. majd az utasítást átadjuk a mysql_query() függvénynek. megvizsgáljuk a visszatérési értéket. Elõször megkísérlünk megnyitni egy kapcsolatot a MySQL kiszolgálóhoz. Ha mégis szükségünk lenne rá. az adatok bekerültek az adatbázisba. amely a legutóbbi INSERT kifejezés során beállított automatikusan növelt mezõ értékét adja vissza. Az adatbazis_bovit() függvény által visszaadott $dbhiba változó most már hasznos adatokat tartalmaz a hiba természetét illetõen. Automatikusan növekvõ mezõ értékének lekérdezése Az elõzõ példákban úgy adtuk hozzá a sorokat a táblához. nyugodtan feltehetjük. így üzenetet küldhetünk a felhasználónak. Minden egyéb esetben. hogy nem foglalkoztunk az azonosito oszlop értékével.

4. '$nem'. miután végrehajtottunk egy sikeres SELECT-et. program Sorok száma a SELECT utasítás eredményében. Nos. 12 Az eredménytábla sorainak száma A SELECT utasítás eredményeként kapott tábla sorainak számát a mysql_num_rows() függvény segítségével kérdezhetjük le. $parancs = "INSERT INTO tartomanyok ( tartomany. A 12. hogy milyen azonosító alatt rögzítettük az adatait. print "Köszönjük. å email ) VALUES ( '$tartomany'.Adatbázisok kezelése – MySQL egy kapcsolatazonosító paramétert. 221 Adatok lekérdezése Miután adatainkat már képesek vagyunk az adatbázisban tárolni. A függvény paramétere a kérdéses eredmény azonosítója. hogyan jutunk hozzá a lekérdezés eredményéhez. $azonosito = mysql_insert_id(). $kapcsolat ). az adatok rögzítése után közvetlenül hívjuk meg a mysql_insert_id() függvényt. nem.". amelyet elhagyva a függvény alapértelmezés szerint a legutoljára létrejött MySQL kapcsolat azonosítóját használja. program A mysql_num_rows() függvény használata</title> 4: </head> 5: <body> 6: <?php . melynek felhasználásával elérhetjük az eredménytáblát és információkat nyerhetünk róla.4. '$email' )". a mysql_query() visszaad egy úgynevezett eredményazonosítót. 12. Mint bizonyára már nyilvánvaló. Az azonban már korántsem ilyen egyszerû. megismerkedhetünk azokkal a módszerekkel. Az Ön tranzakció-azonosítója: å $azonosito. amelyek az adatok visszanyerésére szolgálnak.4. visszatérési értéke pedig a sorok száma a táblában. példaprogramban lekérdezzük a tartomany tábla összes sorát és a mysql_num_rows() függvénnyel megkapjuk a teljes tábla méretét. a mysql_query() függvény használatával ki kell adnunk egy SELECT utasítást. mysql_query( $parancs. Így ha meg akarjuk mondani a felhasználónak. 1: <html> 2: <head> 3: <title>12. Kérjük jegyezze meg ezt a kódot.

a program automatikusan a következõre ugrik. visszatérési értéke pedig egy tömb.222 12.4. $kapcsolat ) or die ( "Nem lehet megnyitni a $adatbazis adatbázist: ". a mysql_fetch_row() függvény false értékkel tér vissza. $kapcsolat = mysql_connect( "localhost". óra 12. A 12. amely a sor összes mezõjét tartalmazza. print "Jelenleg $sorok_szama sor van a táblában<P>". . Ezt átadjuk a mysql_num_rows() függvénynek. program (folytatás) 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: $felhasznalo = "jozsi". $jelszo = "bubosvocsok". mysql_select_db( $adatbazis. A PHP egy belsõ mutató segítségével tartja nyilván. $felhasznalo. $adatbazis = "pelda". A függvény paramétere egy eredményazonosító. példa a teljes tartomany táblát megjeleníti a böngészõben. Ha elértük az eredménykészlet végét. $eredmeny = mysql_query( "SELECT * FROM tartomanyok" ). hogy melyik sort olvastuk utoljára. Ha kiolvasunk egy eredménysort. $jelszo ).mysql_error() ). amely megadja a sorok számát. A mysql_fetch_row() függvénnyel kiolvashatjuk a belsõ mutató által hivatkozott sort az eredménytáblából. $sorok_szama = mysql_num_rows( $eredmeny ). ?> </body> </html> A mysql_query() függvény egy eredményazonosítót ad vissza.5. Az eredménytábla elérése Miután végrehajtottuk a SELECT lekérdezést és az eredményazonosítót tároltuk. if ( ! $kapcsolat ) die( "Nem lehet kapcsolódni a MySQL kiszolgálóhoz!" ). mysql_close( $kapcsolat ). egy ciklus segítségével férhetünk hozzá az eredménytábla soraihoz.

19: while ( $egy_sor = mysql_fetch_row( $eredmeny ) ) 20: { 21: print "<tr>\n". program Tábla összes sorának és oszlopának megjelenítése</title> 4: </head> 5: <body> 6: <?php 7: $felhasznalo = "jozsi".5. $kapcsolat ) 14: or die ( "Nem lehet megnyitni a $adatbazis adatbázist: ". 22: foreach ( $egy_sor as $mezo ) 23: print "\t<td>$mezo</td>\n". 12 . 11: if ( ! $kapcsolat ) 12: die( "Nem lehet kapcsolódni a MySQL kiszolgálóhoz!" ).mysql_error() ). 9: $adatbazis = "pelda". 18: print "<table border=1>\n". 25: } 26: print "</table>\n". 27: mysql_close( $kapcsolat ). 13: mysql_select_db( $db. $felhasznalo. 10: $kapcsolat = mysql_connect( "localhost". 15: $eredmeny = mysql_query( "SELECT * FROM tartomanyok" ). amit az eredménysorok számának lekérdezéséhez használunk. program Tábla összes sorának és oszlopának megjelenítése 1: <html> 2: <head> 3: <title>12. $jelszo ). 16: $sorok_szama = mysql_num_rows( $eredmeny ). 28: ?> 29: </body> 30: </html> Kapcsolódunk a kiszolgálóhoz és kiválasztjuk az adatbázist. majd a mysql_query() függvénnyel egy SELECT lekérdezést küldünk az adatbázis kiszolgálójához. 24: print "</tr>\n".5. 8: $jelszo = "bubosvocsok". ahogy korábban láttuk.Adatbázisok kezelése – MySQL 223 12. 17: print "Jelenleg $sorok_szama sor van a táblában<P>". Az eredményt az $eredmeny változóban tároljuk.

amíg a mysql_fetch_row() függvény nem nulla értékkel tér vissza. mint a mysql_fetch_row() függvényé.$egy_sor["email"]. å "</td>\n".$egy_sor->email."</td><td>". hogy az értékadó kifejezés értéke megegyezik a jobb oldal értékével. } print "</table>\n". while ( $egy_sor = mysql_fetch_array( $eredmeny ) ) { print "<tr>\n". a mysql_fetch_array() függvény felhasználásával: print "<table border=1>\n". ezért a kiértékelés során a kifejezés értéke mindig igaz lesz."</td>\n".5. hogy a sorból kinyert információkat szûrjük és végrehajtásuk sem kerül sokkal több idõbe. A következõ kódrészletben módosítottuk a 12. A mysql_fetch_array() függvény egy asszociatív tömböt ad vissza. ahol a kulcsok a mezõk nevei. . A mezõket név szerint is elérhetjük. példa while ciklusát. óra A while kifejezésben a mysql_fetch_row() függvény visszatérési értékét az $egy_sor változóba töltjük.$egy_sor["tartomany"].224 12. print "</tr>\n". print "<td>". print "<td>". Ne feledjük. A mysql_fetch_object() függvény segítségével egy objektum tulajdonságaiként férhetünk hozzá a mezõkhöz. A mysql_fetch_array() és mysql_fetch_object() függvények lehetõvé teszik számunkra. print "<table border=1>\n". print "</tr>\n". méghozzá kétféle módon. while ( $egy_sor = mysql_fetch_object( $eredmeny ) ) { print "<tr>\n".$egy_sor-> å tartomany. A ciklusmagban kiolvassuk az $egy_sor változóban tárolt elemeket és egy táblázat celláiként jelenítjük meg azokat a böngészõben. A mezõnevek lesznek a tulajdonságok nevei. A következõ kódrészletben ismét módosítottuk a kérdéses részt."</td><td>". } print "</table>\n". ezúttal a mysql_fetch_object() függvényt használtuk.

10: $adatbazis = "pelda". amely lehetõvé teszi az adatbázis karbantartója számára. $kapcsolat ) 15: or die ( "Nem lehet megnyitni a $adatbazis adatbázist: ". példa egy olyan programot tartalmaz.6.mysql_error() ). amely feltehetõen módosított egy vagy több sort az adattáblában. amelyet természetesen a mysql_query() függvénnyel kell átadnunk az adatbázis kiszolgálójának. 12: if ( ! $kapcsolat ) 13: die( "Nem lehet kapcsolódni a MySQL kiszolgálóhoz!” ). azaz egy sikeres UPDATE utasítás nem feltétlenül jelent változást az adatokban. amelynek szükség szerint egy kapcsolatazonosítót kell átadnunk. hogy bármelyik sor tartomany mezõjét megváltoztassa. program Sorok frissítése az adatbázisban 4: </title> 5: </head> 6: <body> 7: <?php 8: $felhasznalo = "jozsi".Adatbázisok kezelése – MySQL 225 Adatok frissítése Az adatokat az UPDATE utasítással frissíthetjük. 11: $kapcsolat = mysql_connect( "localhost". 12 .6. A megváltozott sorok számát a mysql_affected_rows() függvénnyel kérdezhetjük le. 14: mysql_select_db( $adatbazis. Itt is igazak a korábban elmondottak. $felhasznalo. 12. A 12. A mysql_affected_rows() függvényt bármely olyan SQL lekérdezés után használhatjuk. program Sorok frissítése az adatbázisban 1: <html> 2: <head> 3: <title>12. $jelszo ). 9: $jelszo = "bubosvocsok". Ennek hiányában a függvény – mint azt már megszokhattuk – a legfrissebb kapcsolatra értelmezi a mûveletet. 19: $eredmeny = mysql_query( $parancs ).6. 16: if ( isset( $tartomany ) && isset( $azonosito ) ) 17: { 18: $parancs = "UPDATE tartomanyok SET tartomany = '$tartomany' WHERE azonosito=$azonosito".

print "> $egy_sor->tartomany\n".226 12. de a mysql_affected_rows() függvény visszatérési értéke 0 lesz. mysql_affected_rows() . " sor változott</h1><p>". . nem kapunk hibaüzenetet. ahol az azonosito mezõ tartalma megegyezik az $azonosito változó értékével.mysql_error()). ?> </select> <input type="text" name="tartomany"> <input type="submit" value="Frissítés"> </form> </body> </html> A mûvelet a szokásos módon indul: kapcsolódunk az adatbázis kiszolgálójához és kiválasztjuk az adatbázist. Ha nem létezõ azonosito értékre hivatkozunk vagy a kérdéses sorban a $tartomany változó értéke megegyezik a tartomany mezõ tartalmával. amely a $tartomany változó értékének megfelelõen frissíti azt a sort. program (folytatás) 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: if ( ! $eredmeny ) die ("Nem sikerült a módosítás: " . óra 12. ".6. A módosított sorok számát kiírjuk a böngészõbe. } mysql_close( $kapcsolat ). if ( isset($azonosito) && $azonosito == $egy_sor->azonosito ) print " selected". print "<h1>A tábla módosítva. while( $egy_sor = mysql_fetch_object( $eredmeny ) ) { print "<option value=\"$egy_sor->azonosito\"". azonosito FROM tartomanyok" ). } ?> <form action="<? print $PHP_SELF ?>" method="POST"> <select name="azonosito"> <? $eredmeny = mysql_query( "SELECT tartomany. Ezek után megvizsgáljuk a $tartomany és az $azonosito változók meglétét. összeállítjuk az SQL utasítást. Ha mindent rendben találunk.

. amelyen keresztül elvégezheti a változtatásokat. $felhasznalo. A PHP azonban számos olyan eszközzel szolgál. Az összes adatbázis számát a mysql_list_dbs() függvény után meghívott mysql_num_rows() függvény adja meg. visszatérési értéke pedig egy eredményazonosító. Az adatbázisok neveit a mysql_tablename() függvénnyel kérdezhetjük le. Ha a karbantartó már elküldte egyszer az ûrlapot. 227 Információk az adatbázisokról Mindezidáig egyetlen adatbázisra összpontosítottunk.7. így a módosítások azonnal látszódni fognak a menüben.Adatbázisok kezelése – MySQL A karbantartó számára készítünk egy HTML ûrlapot. melyek az adott kapcsolaton keresztül hozzáférhetõk. 12 12. $jelszo ). melyik bejegyzést kívánja módosítani. 10: $kapcsolat = mysql_connect( "localhost". amelyek segítségével megállapíthatjuk. Az elérhetõ adatbázisok kiíratása A mysql_list_dbs() függvény segítségével listát kérhetünk az összes adatbázisról. 9: $jelszo = "bubosvocsok". akkor az utoljára hivatkozott azonosito érték mellé a SELECTED módosítót is kitesszük. hány adatbázis hozzáférhetõ az adott kapcsolaton keresztül és milyen ezek szerkezete. Ehhez ismét a mysql_query() függvényt kell használnunk: lekérdezzük az azonosito és tartomany oszlopok összes elemét és beillesztjük azokat egy HTML SELECT listába. visszatérési értéke pedig az adatbázis neve. A karbantartó ezáltal egy lenyíló menübõl választhatja ki. program Adott kapcsolaton keresztül elérhetõ adatbázisok 1: <html> 2: <head> 3: <title>12. amelynek paramétere ez az eredményazonosító és az adatbázis sorszáma.7. megtanulva. hogyan lehet adatokkal feltölteni egy táblát és az adatokat lekérdezni. program Adott kapcsolaton keresztül elérhetõ adatbázisok 4: </title> 5: </head> 6: <body> 7: <?php 8: $felhasznalo = "jozsi". A függvény paramétere szükség szerint egy kapcsolatazonosító. Az adatbázisok sorszámozása 0-val kezdõdik.

"<br>".7 program eredménye látható egy böngészõablakban. 13: $adatbazis_lista = mysql_list_dbs( $kapcsolat ). $x ). 17: mysql_close( $kapcsolat ). A 12. 12. 18: ?> 19: </body> 20: </html> A mysql_list_dbs() függvény visszaad egy eredményazonosítót. majd az eredményazonosítóval együtt átadjuk a mysql_tablename() függvénynek az adatbázis nevének lekérdezéséhez.228 12. Az így megkapott adatbázisok számát a $szam változóba töltjük és felhasználjuk a for ciklusban. $x < $szam. ábra Az elérhetõ adatbázisok listája .7. amelyet paraméterként átadunk a mysql_num_rows() függvénynek.1 ábrán a 12. Az $x indexet minden lépésben eggyel növeljük. 14: $szam = mysql_num_rows( $adatbazis_lista ). $x++ ) 16: print mysql_tablename( $adatbazis_lista.1. program (folytatás) 11: if ( ! $kapcsolat ) 12: die( "Nem lehet kapcsolódni a MySQL kiszolgálóhoz!" ). 0-tól a talált adatbázisok számáig. óra 12. 15: for( $x = 0.

A függvény paraméterei az adatbázis neve és szükség szerint a kapcsolat azonosítója. a számozás 0-val kezdõdik. vagyis a tényleges neveket a mysql_fetch_row() függvénnyel is lekérdezhetnénk. A visszatérési érték egy eredményazonosító. $x<$mezok_szama. $mezok_szama = mysql_num_fields( $eredmeny ). $x++ ) mysql_field_name( $eredmeny. melynek elsõ eleme tartalmazná az adatbázis nevét. $x ) . A függvény paramétere egy eredményazonosító. A sorszám és az eredményazonosító alapján számos információt lekérdezhetünk a mezõrõl. A mezõ nevének lekérdezésére a mysql_field_name() függvény szolgál.Adatbázisok kezelése – MySQL A mysql_list_dbs() függvény által visszaadott eredményazonosítót a mysql_query() eredményéhez hasonlóan is felhasználhatnánk. $eredmeny = mysql_query( "SELECT * from tartomanyok" ). ha az adatbázis létezik és jogunk van hozzáférni. "<br>\n". $eredmeny = mysql_query( "SELECT * from tartomanyok" ). 229 Adatbázistáblák listázása A mysql_list_tables() függvénnyel egy adott adatbázis tábláinak nevét soroltathatjuk fel. Ekkor eredményül egy tömböt kapnánk. 12 Információk a mezõkrõl A SELECT lekérdezés után az eredménytábla mezõinek számát a mysql_num_fields() függvénnyel kaphatjuk meg. for ( $x=0. amely a mezõk számát adja meg. típusát. while ( $tabla_sor = mysql_fetch_row( $eredmeny ) ) print $tabla_sor[0]. Az eredményazonosítót mysql_tablename() vagy mysql_fetch_row() hívásokhoz használhatjuk fel. A mezõkhöz sorszámokat rendelünk. a fent látott módon. legnagyobb hosszát és egyéb jellemzõit is. . beleértve a nevét. $kapcsolat ). $eredmeny = mysql_list_tables( "pelda". A következõ kódrészlet a mysql_list_tables() függvény segítségével az adatbázis összes tábláját kiírja. visszatérési értéke pedig egy egész szám. $mezok_szama = mysql_num_fields( $eredmeny )."<BR>\n".

$mezok_szama = mysql_num_fields( $eredmeny ). $x ) . Lehetõségünk van még a mezõ típusának megállapítására. 9: $kapcsolat = mysql_connect( "localhost". $x++ ) mysql_field_len( $eredmeny. $x ) . $x<$mezok_szama. A mezõ egyéb jellemzõit a mysql_field_flags() függvénnyel olvashatjuk ki: $eredmeny = mysql_query( "SELECT * from tartomanyok" ). 8: $jelszo = "titkos".230 12. for ( $x=0.8. $mezok_szama = mysql_num_fields( $eredmeny ). $x<$mezok_szama. $x ) . tábla és mezõ megjelenítése</title> 4: </head> 5: <body> 6: <?php 7: $felhasznalo = "root". program Minden adatbázis.8 program Minden adatbázis. $felhasznalo. $x<$mezok_szama.8 példa egyesíti a fenti eljárásokat és megjelenít minden elérhetõ adatbázist. . "<BR>\n". Az adatbázis szerkezete – összeáll a kép A 12. $x++ ) mysql_field_type( $eredmeny. 12. $x++ ) mysql_field_flags( $eredmeny. tábla és mezõ megjelenítése 1: <html> 2: <head> 3: <title>12. óra A mezõ legnagyobb hosszát a mysql_field_len() függvénnyel kaphatjuk meg. "<BR>\n". a mysql_field_type() függvénnyel: $eredmeny = mysql_query( "SELECT * from tartomanyok" ). for ( $x=0. $eredmeny = mysql_query( "SELECT * from tartomanyok" ). táblát és mezõt. $mezok_szama = mysql_num_fields( $eredmeny ). for ( $x=0. $jelszo ). "<BR>\n".

"</b>\n". 13: while ( $adatbazisok = mysql_fetch_row ( $adatbazis_lista ) ) 14: { 15: print "<b>". print "</b> <i>". $x<$mezok_szama. print mysql_field_len( $eredmeny. print mysql_field_name( $eredmeny. $x++ ) { print "\t\t<i>". 20: } 21: $tablak = mysql_list_tables( $adatbazisok[0]. $x ). mysql_error() . print mysql_field_type( $eredmeny.Adatbázisok kezelése – MySQL 231 12. for ( $x=0. 22: print "\t<dl><dd>\n". $x ). $kapcsolat ) ) 17: { 18: print "<dl><dd>Nem lehet kiválasztani — " . 16: if ( !@mysql_select_db( $adatbazisok[0]. 23: while ( $tabla_sor = mysql_fetch_row( $tablak ) ) 24: { 25: print "\t<b>$tabla_sor[0]</b>\n". print "</i><br>\n". $kapcsolat ). $x ). } print "\t\t</dl>\n". 26: $eredmeny = mysql_query( "SELECT * from " . print "</i> <i>". print mysql_field_flags( $eredmeny. print "</i> <b>". 19: continue.8 program (folytatás) 10: if ( ! $kapcsolat ) 11: die( "Nem lehet kapcsolódni a MySQL kiszolgálóhoz!" ). 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: $mezok_szama = mysql_num_fields( $eredmeny ). print "\t\t<dl><dd>\n".$adatbazisok[0]. } 12 .$tabla_sor[0] )." </dl>". $x ). 12: $adatbazis_lista = mysql_list_dbs( $kapcsolat ).

A program egy áttekinthetõ szerkezeti vázlatot jelenít meg a böngészõablakban. adattáblát és mezõt tartalmazza. A 12. Ha ki tudjuk választani az adatbázist. táblázatba rendezve elküldjük a böngészõnek.8 program (folytatás) 43: 44: 45: 46: 47: 48: print "\t</dl>\n". A mysql_query() függvénnyel végrehajtjuk a lekérdezést. Ha nincs hozzáférési jogunk. tároljuk az új eredményazonosítót. Minden táblán a következõ mûveletsort hajtjuk végre: kiírjuk a tábla nevét. Az adatbázis nevét átadjuk a mysql_list_tables() függvénynek. A for ciklusban minden mezõn elvégezzük a következõ mûveletsort: beállítjuk az $x változót. Ezeket a mûveleteket minden elérhetõ adatbázison elvégezzük. ?> </body> </html> Elõször is a szokásos módon a MySQL kiszolgálóhoz kapcsolódunk. a mûveletet a táblanevek kiírásával folytatjuk. . Ezután a sorszám ismeretében meghívjuk az elõzõ részben tárgyalt összes ellenõrzõ függvényt. majd a mysql_fetch_row() függvénnyel kiolvassuk a táblák neveit. amely az adott kapcsolaton keresztül elérhetõ összes adatbázist.232 12. majd összeállítunk egy SQL utasítást. ábra a program kimenetét mutatja. A kapott eredményazonosítót átadjuk a mysql_fetch_row() függvénynek és az $adatbazisok tömb elsõ elemébe betöltjük az aktuális adatbázis nevét. Ezután megpróbáljuk kiválasztani az adatbázist a mysql_select_db() függvénnyel. óra 12. akkor megjelenítjük a hibaüzenetet a böngészõablakban.2. majd meghívjuk a mysql_list_dbs() függvényt. majd a continue utasítással továbblépünk a következõ adatbázisra. hogy az aktuális mezõ sorszámát tartalmazza (ez kezdetben 0). } mysql_close( $kapcsolat ). amely az összes oszlopot lekérdezi az adott táblában. eredményüket pedig átlátható formában. majd az eredményazonosító alapján a mysql_num_fields() függvénnyel meghatározzuk a mezõk számát.

lekérdeztük a hibát a mysql_error() függvénnyel. ábra Az összes elérhetõ adatbázis. SQL utasításokat adtunk ki a mysql_query() függvény segítségével és a függvény által visszaadott eredményazonosító segítségével elértük az adatokat vagy megtudtuk a módosított sorok számát. Ha a kiválasztás nem sikerült. Megtanultuk. táblákat és mezõket. 12 . Az adatbázist a mysql_select_db() függvénnyel választottuk ki. tábla és mezõ listája Összefoglalás Ebben az órában a MySQL adatbáziskezelés alapjait tanultuk meg: az adatok tárolását és visszanyerését. hogyan építsük fel a kapcsolatot a MySQL kiszolgálóval a mysql_connect() és mysql_pconnect() függvények segítségével.2. és az egyes mezõkrõl is bõvebb információkat szereztünk. A PHP MySQL függvényeinek segítségével kiírattuk az elérhetõ adatbázisokat.Adatbázisok kezelése – MySQL 233 12.

A válaszokat az A függelékben helyeztük el. 6. Melyik függvénnyel állapíthatjuk meg. amelyet könnyû átültetni egy másik adatbázis kiszolgáló környezetbe? Gyakran jó ötlet az adatbázis-lekérdezõ függvényeket egy egyszerû osztályba vagy könyvtárba csoportosítani.234 12. de más SQL kiszolgálóknak is megvannak a saját PHP függvényeik. Melyik függvénnyel kérdezhetjük le az adatbázisban található táblák neveit? . Kvíz 1. amelyekkel hozzáférhetünk az eredményhez. Hogyan kell csatlakozni a MySQL adatbáziskiszolgálóhoz? 2. ha az adatbáziskapcsolaton keresztül elérhetõ adatbázisok nevét szeretnénk megtudni? 8. SQL utasításokat minden adatbáziskiszolgálónak küldhetünk. Mit csinál a mysql_insert_id() függvény? 5. Melyik függvénnyel küldhetünk SQL utasítást a kiszolgálónak? 4. nem lesz különösebb problémánk az adatbáziskiszolgálók közötti átálláskor. Tegyük fel. Melyik függvényt kellene használnunk. Mûhely A mûhelyben kvízkérdések találhatók. Hogyan ültethetjük át ezeket a fogalmakat más adatbázissal mûködõ rendszerekre? Az mSQL-kezelõ függvények például szinte teljesen megegyeznek a MySQL függvényekkel. Tegyük fel. óra Kérdések és válaszok Ez az óra szigorúan a MySQL-re vonatkozik. Ha szabványos ANSI SQL-lel dolgozunk. a kódnak csak kis részét kell átírni. Így ha fel kell készíteni a kódot egy másik adatbáziskezelõvel való együttmûködésre. Nevezzünk meg három függvényt. melyek segítenek megszilárdítani az órában szerzett tudást. Hogyan írhatunk olyan kódot. hogy küldtünk egy UPDATE lekérdezést a MySQL-nek. hány sort érintett a módosítás? 7. hogy küldtünk egy SELECT lekérdezést a MySQL-nek. Melyik függvény szolgál az adatbázis kiválasztására? 3.

hogy feltöltsék az adatbázist. 2. Tegyük lehetõvé a felhasználóknak. pontban elkészített tábla tartalmát. Hozzunk létre egy adattáblát három mezõvel: email (legfeljebb 70 karakter).Adatbázisok kezelése – MySQL 235 Feladatok 1. Készítsünk programot. uzenet (legfeljebb 250 karakter) és datum (a UNIX idõbélyegzõt tartalmazó egész szám). amely megjeleníti az 1. 12 .

.

13. amelyek a „külvilággal” való érintkezést teszik lehetõvé. ÓRA Kapcsolat a külvilággal Ezen az órán olyan függvényekkel ismerkedünk meg. Az óra során a következõkrõl tanulunk: • Környezeti változók – részletesebben • A HTTP kapcsolat felépítése • Távoli kiszolgálón levõ dokumentumok elérése • Saját HTTP kapcsolat létrehozása • Kapcsolódás más hálózati szolgáltatásokhoz • Levélküldés programból .

amely a webcímet kiegészíti (formátuma kulcs=ertek&masikkulcs=masikertek). program Néhány környezeti változó felsorolása</title> 4: </head> 5: <body> 6: <?php 7: $korny_valtozok = array( "HTTP_REFERER". "HTTP_USER_AGENT". táblázat ezek közül a változók közül mutat be néhányat. Néhány ilyen változóval több dolgot is megtudhatunk weboldalunk látogatóiról. A látogató IP címe. ezeket a PHP a kiszolgáló segítségével bocsátotta rendelkezésünkre. esetleg a kiszolgálóprogram nem támogatja azokat. program Néhány környezeti változó felsorolása 1: <html> 2: <head> 3: <title>13. "QUERY_STRING". így használatuk elõtt érdemes ezt ellenõrizni. A 13. hogy lehet. Az esetleg a webcímhez illesztett további információ. arra azonban gondoljunk. "REMOTE_ADDR". táblázat Néhány hasznos környezeti változó Változó $HTTP_REFERER $HTTP_USER_AGENT $REMOTE_ADDR $REMOTE_HOST $QUERY_STRING Leírás A programot meghívó webhely címe. Az a (kódolt) karakterlánc.1. óra Környezeti változók Már találkoztunk néhány környezeti változóval. hogy váljanak programunk részére a megfelelõ globális változókban is.1. .238 13. hogy ezek a változók a mi rendszerünkön nem elérhetõk. példaprogram ezen változók értékét jeleníti meg a böngészõben.1.1. $PATH_INFO A 13. E kulcsok és értékek elérhetõvé kell. 13. Információ a látogató böngészõjérõl és rendszerérõl. "REMOTE_HOST". 13. A látogató számítógépének neve. "PATH_INFO" ).1.

1. kód kimenetét láthatjuk. a hivatkozás relatív útvonalat használ a 13.1. hogyan alakítottuk a szövegként tárolt változóneveket valódi változókká. } ?> </body> </html> Figyeljük meg. (jelen esetben a /tovabbi/utvonal) a $PATH_INFO változóban áll majd rendelkezésünkre. mely programunk nevét követi. Az ábrán látható adatokat úgy kaptuk.program. ábra Néhány környezeti változó kiíratása a böngészõben 13 Az elérési út azon része.php/tovabbi/utvonal?nev=ertek'>gyerünk</A> Amint láthatjuk. program (folytatás) 8: 9: 10: 11: 12: 13: 14: 15: foreach ( $korny_valtozok as $valtozo ) { if ( isset( $$valtozo ) ) print "$valtozo: ${$valtozo}<br>".1. 13. A programot meghívó hivatkozás így nézett ki: <A HREF='13. A 13. hogy a programot egy másik oldal hivatkozásán keresztül hívtuk meg.1.program.1. Ezt a módszert a negyedik órán tanultuk.1.php meghívására. .Kapcsolat a külvilággal 239 13. ábrán a 13.

Ezt úgy oldották meg. illetve böngészõt használ a látogató. de magunk is elõállíthatunk ilyet. pontosan a kódolt mivolta miatt. Az adatpárok URL kódolású formában kerülnek a webcímbe. mert ez és tulajdonképpen bármely másik környezeti változó is nagyon könnyen „meghamisítható”.) A nevet sajnálatos módon a kezdetekkor egy fejlesztõ elírta (helyesen HTTP_REFERRER-nek kellene neveznünk). A $REMOTE_HOST változó nem biztos. A $REMOTE_ADDR változó a látogató IP címét tartalmazza. hogyan nyerhetjük ki a számunkra fontos adatokat ebbõl a karakterláncból. Ne feledjük azonban. hogyan. hogy a problémás karaktereket hexadecimális megfelelõjükre cserélik. így a webhely látogatóinak azonosítására használható. hiszen az internetszolgáltatók általában dinamikusan osztják ki felhasználóiknak a címeket. ez a kiszolgáló beállításaitól függ. Nagy körültekintéssel kell eljárnunk azonban. ha egy GET metódust használó ûrlap hívja meg a programot. A $HTTP_USER_AGENT változó szétbontásával rájöhetünk. de ettõl függetlenül az a $QUERY_STRING változóban lesz elérhetõ. A tizenhetedik és tizennyolcadik órában mindent megtanulunk arról. hogy hozzáférhetõ. nagyon ritkán lehet szükségünk rá. mert az összes név–érték pár rendelkezésünkre áll globális változók formájában is (jelen esetben például létrejön a $nev változó és az értéke ertek lesz). ha nyomon szeretnénk követni. óra A lekérdezés szövegét nem dinamikusan illesztettük a hivatkozásba (nev=ertek). Bár a teljes karakterlánc elérhetõ a $QUERY_STRING környezeti változóban. így a kiszolgáló ezen képességét . hogy a bennük szereplõ. A $HTTP_REFERER változó értéke akkor lehet hasznos számunkra. a webcímekben nem megengedett vagy mást jelentõ karakterek ne okozzanak hibát. hogy ezek az adatok is hamisíthatók. ami idõigényes feladat. hogy programunkat mely hivatkozáson keresztül érték el. De azért is mellõzük a használatát. ha a böngészõ típusától vagy a változattól függõen más és más HTML kódot vagy JavaScriptet szeretnénk elküldeni a látogatónak. Ezenkívül nem minden böngészõ adja meg ezt az információt. így az minden csatlakozás során más lehet. de tudnunk kell. melyeket ÉS jel (&) választ el egymástól. milyen operációs rendszert. A változóban elérhetõ értéket akkor használhatjuk. hogy segítségével adatokat továbbíthassunk lapról lapra. A lekérdezõ karakterláncokkal legtöbbször akkor találkozunk.240 13. így használatát célszerû elkerülnünk. Ha létezik. a felhasználó számítógépének nevét találhatjuk benne. A változó meglétéhez a kiszolgálónak az IP cím alapján minden kéréskor le kell kérdeznie a gép nevét. A lekérdezõ karakterlánc név–érték párokból áll. hogy a felhasználók IP címe többnyire nem állandó. módosítása a korábbi változatokkal való összeegyeztethetõség megõrzése érdekében nem történt meg. tehát ugyanaz az IP cím különbözõ látogatókat jelenthet és a különbözõ IP címek is takarhatnak egyetlen felhasználót. (Az óra folyamán azt is megtudhatjuk.

Más szóval lekér egy dokumentumot. késõbb azt is látjuk majd. A kérés legfeljebb három részbõl állhat: • A kérés sora • Fejléc • Törzs A legfontosabb a kérés sora. HEAD vagy POST).0 Ekkor az ügyfél egy GET kérést kezdeményez. Ha nem létezne ilyen változó. 241 A HTTP ügyfél-kiszolgáló kapcsolat rövid ismertetése A kiszolgáló és az ügyfél közti adatforgalom részletes ismertetése túlmutat könyvünk keretein. ha olyan programot szeretnénk írni.Kapcsolat a külvilággal a hatékonyság kedvéért gyakran letiltják. Mind az ügyfél. Ezen információk legtöbbjét a PHP-bõl környezeti változókon keresztül érhetjük el.html HTTP/1. melyek elõírják.0 vagy HTTP/1. hogyan. mind a kiszolgáló információt szolgáltat magáról és a küldött adatokról. A folyamatot azonban nem hiábavaló alapjaiban megismerni. 13 . ÚJDONSÁG A HTTP jelentése hiperszöveg-átviteli protokoll. amely weboldalakat tölt le vagy webcímek állapotát ellenõrzi. A kérés Az ügyfél szigorú szabályok szerint kérhet adatokat a kiszolgálótól. mert a PHP ezen részletek szakszerû kezelésérõl is gondoskodik helyettünk. a kért dokumentum címét és az átviteli protokoll változatszámát (HTTP/1. Ez legtöbbször HTML ûrlapok esetében használatos. hogy adjon.) A HEAD módszer akkor alkalmazandó. mint szabályok halmaza. hogy adatokat küldjünk az ügyféltõl a kiszolgálónak. Egy jellemzõ kérés a következõképpen néz ki: GET /egy_dokumentum. Nem más. ha azt lekérdezõ karakterlánc formájában hozzáírjuk az URL végéhez. ha nem magára a dokumentumra. végül a POST kérés arra szolgál.1). de adatokat nem küld. Itt határozzuk meg a kérés fajtáját (GET. mert szükségünk lehet rá. az információhoz a $REMOTE_ADDR segítségével juthatunk hozzá. csak annak tulajdonságaira vagyunk kíváncsiak. (Valójában kisebb mennyiségû adat küldésére a GET kérés alkalmazásakor is van lehetõség. hogy az ügyfél milyen kérésekkel fordulhat a kiszolgálóhoz és az milyen válaszokat kell. többek között azért.

hogy egy üres sort küldünk neki. a POST típusnál azonban az üres sort az üzenet törzse követi. Ilyen esetekben komoly jelentõsége van ennek az adatnak.242 13. Az ügyfél által elõnyben részesített nyelv (a magyar nyelv esetében „hu”).7 kezdeményezett. mindennapos kérést mutatunk be. melyet egy Netscape 4. a lekérdezõ karakterláncokhoz hasonlóan.2 táblázat néhány lehetséges fejléc-nevet sorol fel. amely név–érték párokból áll.2 táblázat Néhány fejléc-kulcs Név Accept Accept-Encoding Accept-Charset Accept-Language Host Leírás Az ügyfél által kezelhetõ dokumentumtípusok listája. 13. A 13. A legtöbb ügyfél (általában böngészõprogram) a kérõsoron kívül küld egy fejléc részt is. Azon dokumentum címe. Az oldal lekérésével érkezett fejlécek legtöbbjéhez környezeti változók formájában hozzá is férhetünk programunkból. A kérés végét úgy tudathatjuk a kiszolgálóval. Egyes kiszolgálók csak látszólagos (virtuális) kiszolgálók. .2 példában egy jellemzõ. A törzs tartalmazza a kiszolgálónak szóló összes adatot. Az ügyfélprogram típusa és változatszáma. melynek egyik hivatkozása alapján a kérés létrejött. Referer User-Agent A GET és a HEAD eljárásoknál a kérést a fejléc és az utána következõ üres sor zárja. jobbára URL kódolású név–érték párok. Az ügyfél számára elfogadható kódolási és tömörítési formátumok listája. Az ügyfél kérése által megcímzett gép neve. Az ügyfél fejlécének minden sora egy kettõsponttal elválasztott névbõl és értékbõl áll. óra A kifogástalan GET kéréshez egyetlen kérõsor elküldése is elegendõ. Az ügyfél által elõnyben részesített nemzetközi karakterkészlet. a beérkezõ kéréseket nem önálló számítógép kezeli. A 13.

image/pjpeg.1) adja meg. a kérés és a válasz szerkezete igen hasonló.linuxvilag. nevezetesen azok.utf-8 A válasz Miután a kiszolgáló fogadta az ügyfél kérését. választ küld. Az állapot sor a kiszolgáló által használt protokollt (HTTP/1. */* Accept-Encoding: gzip Accept-Language: en Accept-Charset: iso-8859-1.*.hu Accept: image/gif.2. mindegyik a kérés sikerességérõl vagy sikertelenségérõl ad információt. image/png. A fejléc bizonyos sorai tulajdonképpen ügyfél és kiszolgáló által küldve egyaránt megállják helyüket. amelyek a törzsre vonatkoznak.13 i686) Host: www. példa Jellemzõ Netscape-kérés GET / HTTP/1.3-as táblázat a leggyakoribb kódok jelentését tartalmazza. Linux 2.0 Referer: http://www.7 [en] (X11. image/jpeg.Kapcsolat a külvilággal 243 13. A 13.0 vagy HTTP/1. 13 . Számos válaszkód létezik. image/x-xbitmap. A válasz általában a következõ három részbõl tevõdik össze: • Állapot • Fejléc • Törzs Amint látjuk.hu/index.2.html Connection: Keep-Alive User-Agent: Mozilla/4. I. illetve egy válaszkódot és egy azt magyarázó szöveget.kiskapu.

3 táblázat Néhány válaszkód Kód 200 301 302 404 500 Szöveg OK Leírás A kérés sikeres volt és a törzsben megtalálható a válasz. elküldi a törzset (a kérésben tulajdonképpen igényelt dokumentumot). 13. .4 táblázat a legsûrûbben alkalmazott fejlécelemekbõl szemezget. Ennek megfelelõen a jellegzetes válaszsor a következõképpen fest: HTTP/1.3 példa egy jellemzõ választ mutat be. Not Found Internal Server Error A kért adat nem található a megadott címen. de a fejléc elárulja. A 13. A 13. óra 13. A kiszolgáló vagy egy CGI program komoly problémába ütközött a kérés teljesítése során. hogy hová.244 13. de a fejlécben megtalálható annak új helye.1 200 OK A fejléc rész a válaszfejléc soraiból áll. melyek formátuma a kérésfejléc soraihoz hasonló. Moved Permanently A kért adat nem található a kiszolgálón.4 táblázat A kiszolgáló válaszfejlécének leghétköznapibb elemei Név Date Server Content-Type Content-Length Location Leírás Az aktuális dátum A kiszolgáló neve és változatszáma A törzsben szereplõ adat MIME típusa A törzs mérete bájtban Egy alternatív dokumentum teljes elérési útja (kiszolgálóoldali átirányítás esetén) Miután a kiszolgáló elküldte a fejlécet és a szokásos üres sort. Moved Temporarily A kért adatot ideiglenesen áthelyezték.

Az fopen()-nel ugyanúgy megnyithatunk egy webcímet. 30 Jan 2000 18:02:20 GMT Server: Apache/1.4. A 13. majd megjeleníti azokat a böngészõben. hogy a kettõ között – formailag – semmi különbség nincs. "r" ) or die("A $weboldal nem nyitható meg"). példaprogram egy távoli kiszolgálóhoz kapcsolódva adatokat kér le.3.php".1 200 OK Date: Sun. nem okozhat komoly gondot a távoli helyen lévõ adatok lekérése sem. . 13 13. esetenként ügyfélként viselkedve adatokat kérhet egy távoli címrõl és a kapott adatokat programunk rendelkezésére bocsáthatja.Kapcsolat a külvilággal 245 13.4.net/index.9 (Unix) Connection: close Content-Type: text/html <html> <head> <title>13.4. példa A kiszolgáló válasza 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: HTTP/1. program Weboldal letöltése és megjelenítése az fopen()-nel 1: <html> 2: <head> 3: <title>13. program Weboldal letöltése és megjelenítése az fopen()-nel</title> 4: </head> 5: <body> 6: <?php 7: $weboldal = "http://www. 8: $fajlmutato = fopen( $weboldal. lista A kiszolgáló válasza</title> </head> <body> Üdvözlet! </body> </html> Dokumentum letöltése távoli címrõl Bár a PHP kiszolgálóoldali nyelv. ahogy azt egy fájl esetében tennénk. Az a helyzet ugyanis.php.3. Ha már jártasak vagyunk a kiszolgálón lévõ fájlok kezelésében.3.

A PHP a távoli kiszolgálónak úgy mutatkozik be. hogy a HEAD HTML elemet az alábbi sorral bõvítjük: <base href="http://www. hanem a feldolgozás a feladat. hogy a képek nem jelennek meg.net/index. print fgets( $fajlmutato.php. mint a helyi fájlok kezelése esetében.php.246 13. mint egy PHP ügyfél. a látogató címéhez minden bizonnyal hozzájuthatunk a $REMOTE_ADDR változóból. ha ezt alkalmazzuk weblapok letöltéséhez. akkor a PHP honlapját kell látnunk. elemezve annak fejlécét.0 Host: www. Ezen úgy segíthetünk. az óra folyamán lesz még errõl szó. vagy épp csak többet szeretnénk megtudni a dokumentumról.3 Ez a megközelítés elég egyszerû. ha nem jött létre a kapcsolat vagy nem találta a fájlt. A szerzõ rendszerén a PHP a következõ kérést küldi el: GET /index. program (folytatás) 9: while ( ! feof( $fajlmutato )) 10: 11: ?> 12: </body> 13: </html> Ha megnézzük ezt az oldalt. azzal a kis különbséggel.0. Szükségünk lehet viszont más hálózati szolgáltatásokhoz való kapcsolódásra.php HTTP/1. Ekkor már más eszközökhöz kell folyamodnunk. Az fopen() egy fájlmutatóval tér vissza. ha sikerült felépítenie a kapcsolatot és false (hamis) értékkel. A függvény egy IP címet ábrázo- . A kapott fájlmutató a továbbiakban ugyanúgy használható az olvasáshoz. így az oldal megjelenítésekor a böngészõ a mi kiszolgálónkon keresi azokat. így az esetek többségében elegendõ.4.php"> Az esetek többségében azonban nem a letöltött adatok megjelenítése. hogy az oldalon található IMG hivatkozások általában relatívak. Átalakítás IP címek és gépnevek között Ha kiszolgálónk nem is bocsátja rendelkezésünkre a látogató gépének nevét a $REMOTE_HOST változóban. 1024 ). óra 13. Hogy ezt hogyan tehetjük meg? Nos. A változóra alkalmazva a gethostbyaddr() függvényt megtudhatjuk a látogató gépének nevét.net User-Agent: PHP/4. Ennek oka.

Ha minden kísérletünk csõdöt mondott."<br>". akárki is Ön. Néha azonban nagyobb felügyeletet kell gyakorolnunk egy-egy hálózati kapcsolat felett. megpróbáljuk a $REMOTE_ADDR alapján a gethostbyaddr() függvénnyel elõállítani a gépnevet. program Gépnév lekérdezése a gethostbyaddr() segédletével 1: <html> 2: <head> 3: <title>13. Ha hiba lép fel a név elõállítása során. kimenetként a beadott IP címet kapjuk meg változatlanul. általános üdvözlõ szöveget jelenítünk meg. 9: elseif ( isset ( $REMOTE_ADDR ) ) 10: print " Üdvözöljük ". Hálózati kapcsolat létesítése Eddig minden feladatunkat könnyen meg tudtuk oldani.5. 11: else 12: print " Üdvözöljük. program Gépnév lekérdezése a gethostbyaddr() segédletével</title> 4: </head> 5: <body> 6: <?php 7: if ( isset( $REMOTE_HOST ) ) 8: print "Üdvözöljük $REMOTE_HOST<br>". Ha nem létezik.gethostbyaddr( $REMOTE_ADDR ). 247 13. Ennek paramétere egy gépnév. sikeres átalakítás esetén viszont a megnevezett gép IP címe.5. de legalábbis a szokásosnál több jellemzõjét kell ismernünk.<br>". visszatérési értéke pedig hiba esetén ugyanez a gépnév. Egy gép címének a név alapján történõ meghatározásához a gethostbyname() függvényt használhatjuk.Kapcsolat a külvilággal ló karakterláncot vár paraméterként és az annak megfelelõ gépnévvel tér vissza. . mert a PHP a távoli weblapok lekérését közönséges fájlkezeléssé egyszerûsítette számunkra. 13: ?> 14: </body> 15: </html> 13 Ha a $REMOTE_HOST változó létezik. egyszerûen megjelenítjük annak értékét. A 13.5-ös program a $REMOTE_HOST hiánya esetén a gethostbyaddr() függvény segítségével elõállítja a felhasználó gépének nevét.

egy kapuszám és két változóhivatkozás.6-os programban megnyitunk egy HTTP kapcsolatot. majd egy változóban tároljuk azt. Változóhivatkozásokat úgy készítünk. a $hibaszam sikertelen mûvelet esetén egy hibakódot tartalmaz. Most már elegendõ tudás birtokában vagyunk ahhoz. å &$hibaszoveg. A következõ kódrészlet kapcsolatot nyit egy webkiszolgáló felé. 10: if ( ! $fajlmutato ) . &$hibaszoveg). &$hibakod. Ha sikerült megteremtenie a kapcsolatot.kiskapu. a kapcsolaton keresztül az fputs() és fgets() függvények segítségével írhatunk és olvashatunk is. A 13. ahogy ezt egy közönséges fájl esetében is tehetjük.6.html". egyébként pedig false értéket ad. egy fájlmutatóval tér vissza. Az elsõ hivatkozott változó. Munkánk végeztével a kapcsolatot az fclose() függvénnyel bonthatjuk. $fajlmutato = fsockopen( "www. óra A hálózati kiszolgálók felé az fsockopen() függvénnyel nyithatunk meg egy kapcsolatot. lekérünk egy fájlt. 80. 8: $lap = "/index. ameddig a függvény vár a kapcsolat létrejöttére. Miután visszakaptuk a kapcsolat fájlmutatóját. hogy ÉS (&) jelet írunk a változó neve elé. amely annak az idõtartamnak a hossza (másodpercben). Megadhatunk továbbá egy nem kötelezõ idõkorlát-paramétert is.6. 30 ).hu". A webkiszolgálók általában a 80-as kapun várják a kéréseket. program Weboldal lekérése az fsockopen() használatával 1: <html> 2: <head> 3: <title>13.248 13. hogy kapcsolatot létesíthessünk egy webkiszolgálóval. program Weboldal lekérése az fsockopen() használatával</title> 4: </head> 5: <body> 6: <?php 7: $kiszolgalo = "www. 80.kiskapu. &$hibaszam. Paramétere egy IP cím vagy gépnév.hu". 13. a $hibaszoveg pedig bõvebb magyarázattal szolgál a hibáról. 9: $fajlmutato = fsockopen( "$kiszolgalo".

mintha a http://www. 13 . A távoli gép webmestere a fejléc User-Agent sorában feltüntetett adatokat látni fogja a webkiszolgáló naplójában. lehetõleg ne hamisítsuk meg adatainkat. program (folytatás) 11: die ( "Nem sikerült kapcsolódni a $kiszolgalo géphez:\nA hiba kódja: $hibaszam\nA hiba szövege: $hibaszoveg\n" ). 16: $lekeres . Emiatt programjainkban némi fenntartással kell kezelnünk az ezen fejlécekbõl elõálló környezeti változók tartalmát és sokkal inkább segédadatoknak kell azokat tekintenünk. A 13.html címrõl mutatott volna egy hivatkozás a kért oldalra és mi ennek segítségével kértük volna le az oldalt.hu/index.Kapcsolat a külvilággal 249 13. hiszen döntéseiket a kiszolgáló gyûjtötte statisztikák alapján kell meghozniuk. mintsem tényeknek. A webmester számára ráadásul úgy fog tûnni. milyen kérésfejlécet küldtünk a kiszolgálónak. Vannak esetek. Ennek a webmesterek nem igazán örülnek. ha a User-Agent fejlécsorban egy Netscape böngészõre jellemzõ karakterláncot küldünk.6-os program nem sokkal bõvítette a PHP beépített lapkérõ módszereit.linuxvilag. 14: $lekeres ." sort küldött el!". 21: fclose( $fajlmutato ).= "Host: $kiszolgalo\r\n". $lekeres ). amelyeket a kiszolgáló csak Netscape böngészõnek küld el. Hogy segíthessünk ebben nekik. A 13.6.= "User-Agent: PHP browser\r\n\r\n".linuxvilag. Szükségünk lehet például olyan adatokra.0\r\n". 18: fputs ( $fajlmutato.hu/index. 22: print "A kiszolgáló ". 17: $lap = array().html\r\n".(count($lap)).= "Referer: http://www. 15: $lekeres . 1024 ). amikor meg kell hamisítani a fejléceket. hacsak feltétlenül nem szükséges. 19: while ( ! feof( $fajlmutato ) ) 20: $lap[] = fgets( $fajlmutato.7-es példa azonban már az fsockopen()-es módszert alkalmazza egy tömbben megadott weboldalak letöltéséhez és közben a kiszolgáló által visszaadott hibakódokat is ellenõrzi. 23: ?> 24: </body> 25: </html> Figyeljük meg. Ezek elérésének egyetlen módja. 12: 13: $lekeres = "GET $lap HTTP/1.

kiskapu. 22: fputs( $fajlmutato. 8: "www. &$hibaszam. óra 13. 18: print "<br><hr><br>\n". 10).com" => "/nincsilyenlap.0\r\n\r\n" ). program Az állapotsor megjelenítése webkiszolgálók válaszaiból 1: <html> 2: <head> 3: <title>13.. 11: foreach ( $ellenorzendo as $kiszolgalo => $lap ) 12: { 13: print "Csatlakozási kísérlet a $kiszolgalo géphez .<BR>\n".7.hu" => "/index.250 13. .html". Ezeket sorra vesszük a foreach utasítás segítségével. 15: if ( ! $fajlmutato ) 16: { 17: print "A $kiszolgalo géphez nem sikerült csatlakozni:\n<br>A hiba kódja: $hibaszam\n<br>Szövege: $hibaszoveg\n". “HEAD $lap HTTP/1. 25: fclose( $fajlmutato ). Minden elemnél az fsockopen()-nel kezdeményezünk egy kapcsolatot az adott címmel.html" 10: ). 26: } 27: ?> 28: </body> 29: </html> Elõször létrehozunk egy asszociatív tömböt az ellenõrzendõ kiszolgálónevekbõl és az oldalak címeibõl. 14: $fajlmutato = fsockopen( "$kiszolgalo". 9: "www. &$hibaszoveg.<br>\n".7.html". 24: print "<br><br><br>\n".com" => "/nemletezogep. 23: print fgets( $fajlmutato. 80. 19: continue.4332blah.virgin. 20: } 21: print "A $lap oldal fejlécének letöltése .. program Az állapotsor megjelenítése webkiszolgálók válaszaiból</title> 4: </head> 5: <body> 6: <?php 7: $ellenorzendo = array ( "www... 1024 ).

Kapcsolat a külvilággal de a válaszra csak 10 másodpercig várunk. majd továbblépünk a következõ címre. A jelen példában nem elemezzük a fejléc többi részét. ezért lezárjuk a kapcsolatot az fclose() függvénnyel. példában egy NNTP (Usenet) kiszolgálóhoz kapcsolódunk: kiválasztunk egy hírcsoportot.2.2-es ábrán a 13. program Egyszerû NNTP kapcsolat az fsockopen() használatával</title> 4: </head> 5: <body> 6: <?php 7: $kiszolgalo = "news". ábra Kiszolgálók válaszát megjelenítõ program 13 NNTP kapcsolat létrehozása az fsockopen()-nel Az fsockopen() függvény tetszõleges internetkiszolgálóval képes kapcsolatot teremteni.8.7. program Egyszerû NNTP kapcsolat az fsockopen() használatával 1: <html> 2: <head> 3: <title>13. program kimenete látható. 251 13. majd megjelenítjük elsõ üzenetének fejlécét.8. A 13. kérelmet is küldünk a kiszolgálónak. A kéréshez a HEAD eljárást használjuk. Az fgets() segítségével beolvassuk az elsõ sort. 13. // ezt saját hírkiszolgálónk címére kell beállítanunk . Ha a kapcsolatteremtés sikeres volt. üzenetet jelenítünk meg a böngészõben. az állapotsort. majd a continue utasítással a következõ címre lépünk. A 13.8. mert a lap tartalmára nem vagyunk kíváncsiak. Ha ezen belül nem érkezne válasz.

$sor ). $sor ). &$hibaszam.test". 10 ). óra 13. if ( ! $fajlmutato ) die("Csatlakozás a $kiszolgalo géphez sikertelen\n$hibaszam\n$hibaszoveg\n\n"). print "<pre>\n". if ( $allapot[0] != 211 ) { fputs( $fajlmutato. &$hibaszoveg."\n" ). $sor = "". print "— Kapcsolat a $kiszolgalo géppel felvéve\n\n". "close" ). 1024 ). } print "$sor\n". die("Hiba: $sor\n\n"). program (folytatás) 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: $csoport = "alt. die("Hiba: $sor\n\n"). 1024 ). "group ". print "$sor\n". "close" ). 119. } . $sor = fgets( $fajlmutato. $allapot = explode( " ". $fajlmutato = fsockopen( "$kiszolgalo". 1024 ). "close" ). "head\n" ). fputs( $fajlmutato. $sor ). fputs( $fajlmutato. $allapot = explode( " ". $sor = fgets( $fajlmutato. if ( $allapot[0] != 200 ) { fputs( $fajlmutato.252 13. print "— Az elsõ üzenet fejlécének lekérése\n\n".$csoport. print "— A $csoport kiválasztása\n\n".8. $allapot = explode( " ". } print "$sor\n". if ( $allapot[0] != 221 ) { fputs( $fajlmutato. die("Hiba: $sor\n\n"). print "— Csatlakozás a $kiszolgalo kiszolgálóhoz\n\n". $sor = fgets( $fajlmutato.

melyhez kapcsolódni szeretnénk. hogyan nyissunk az fsockopen()nel NNTP kapcsolatot. 13 . a $csoport-ot kedvenc csoportunkra.") === 0 ) ) { $sor = fgets( $fajlmutato. amit az fgets() függvénnyel próbálunk fogadni. mert ez a hírcsoport szolgáltatás szabványos kapuja. egyrészt azért. ?> </body> </html> A 13. Ha a kapott tömb elsõ eleme (a nullás indexû) 200. ". hogy megszabaduljunk az ismétlésektõl. Valós alkalmazás esetén a visszakapott sorok elemzését célszerû egy függvénnyel végezni. Ennek ellenõrzéséhez az explode() függvénnyel a szóközök mentén szétdaraboljuk a $sor változót és a darabokat egy tömbbe helyezzük. print "</pre>". amelyekkel mindez a munka automatizálható. Ha ez is sikerült. a $csoport pedig annak a csoportnak a nevét. program (folytatás) 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: while ( ! ( strpos($sor. Ezt is ellenõrizzük és sikertelenség esetén kilépünk a programból.8. 1024 ). Ha minden zökkenõmentesen zajlott. hogy több adatot is kinyerhessünk a válaszból. A fenti programban a $kiszolgalo változó tárolja a hírkiszolgáló nevét. egyébként pedig befejezzük a programot. "close\n" ). javítsuk át a $kiszolgalo változó értékét az internetszolgáltatónk által megadott hírkiszolgáló nevére. másrészt azért. akkor a "group" paranccsal kiválasztjuk a kívánt hírcsoportot. Ha minden az elvárásoknak megfelelõen haladt. program egy kicsit többet mutat annál. Az fsockopen()-nel a kiszolgáló 119-es kapujára csatlakozunk. Ha nem kapunk vissza használható fájlmutatót. print $sor. célszerû. Ha ki szeretnénk próbálni ezt a programot. a visszakapott szöveg a 200-as állapotkóddal kezdõdik. Mielõtt azonban újra feltalálnánk a kereket. a kiszolgálónak egy 211-es állapotkóddal kezdõdõ szöveget kell válaszul küldenie. } fputs( $fajlmutato.8. Az explode() függvénnyel részletesebben a tizenhetedik órában foglalkozunk.Kapcsolat a külvilággal 253 13. ha megismerkedünk a PHP IMAP függvényeivel. akkor továbblépünk. a die() függvény segítségével megjelenítünk egy hibaüzenetet a böngészõben és kilépünk a programból. Kapcsolódás esetén a kiszolgálótól kapnunk kell egy nyugtázó üzenetet.

A 13. mely a 211-es állapotkódot kell. $targy = "üdvözlet". A fejléc csak ezt követõen érkezik. óra A hírcsoport kiválasztása után küldünk egy "head" parancsot. A mail() false értékkel tér vissza. 13. A fejlécet záró sor egyetlen pontot tartalmaz. mail( $cimzett. Ezt a sort egy while ciklussal keressük meg. további sorokat olvasunk be és mindegyiket megjelenítjük a böngészõben. ha problémába ütközik a levél küldése során. a második a levél tárgya. A következõ kódrészlet egy rövid levél küldését példázza: $cimzett = "valaki@tartomany. $uzenet ) or å print "A levél elküldése sikertelen". Végsõ lépésként bontjuk a kapcsolatot. Természetesen kérésünkre ez esetben is elõször egy nyugta érkezik. Mindaddig.254 13. míg a kiszolgáló válaszsora nem ponttal kezdõdik.3. Az elsõ a címzett.3-as ábra a 13. számos hasznos információt tartalmazó sorral. hogy tartalmazza. a harmadik pedig maga az üzenet. Ennek hatására visszakapjuk a csoport elsõ üzenetének fejlécét. A mail() függvény három karakterláncot vár paraméterként. $targy. .8-as program egy lehetséges eredményét mutatja be. ábra NNTP kapcsolat megteremtése Levél küldése a mail() függvénnyel A PHP leveszi a vállunkról az elektronikus levelezés gondját is.hu". $uzenet = "ez csak egy próba üzenet! ".

255 Összefoglalás Ezen az órán megtudhattuk.ini fájl SMTP utasításával kell beállítani. A kiszolgálót a php. Az fsockopen()-nel más hálózati szolgáltatásokhoz is kapcsolódtunk. . $uzenet = "ez csak egy proba üzenet! ". $uzenet. A példa a következõ: $cimzett = "valaki@tartomany. hogyan vethetjük be a környezeti változókat. Ha nem tudjuk a látogató gépének nevét. Láthattuk miként zajlik egy HTTP kapcsolat megteremtése a kiszolgáló és az ügyfél között. Az alábbi példában egy From (Feladó) és egy X-Priority (Fontosság) mezõvel bõvítjük a fejlécet. például weboldalakat letölteni. Nem kell a mail() kötelezõ paraméterei által elõállított fejlécekre szorítkoznunk. å "From: $felado\r\nX-Priority: 1 (Highest)" ) or print "A levél elküldése sikertelen". A függvénynek van ugyanis egy elhagyható negyedik paramétere is.Kapcsolat a külvilággal Ha a PHP-t UNIX rendszeren futtatjuk. a Sendmailt fogja használni. hogyan töltsünk le egy dokumentumot a webrõl az fopen() segítségével és hogyan építsük ki saját HTTP kapcsolatunkat az fsockopen() függvény felhasználásával. Tényleg szükség van az ismeretére. 13 Kérdések és válaszok A HTTP meglehetõsen misztikusnak tûnik. más rendszereken a helyi vagy egy távoli SMTP kiszolgálót fog feladata elvégzéséhez igénybe venni. végül pedig elektronikus levelet küldtünk a programból a mail() függvény egyszerû meghívásával. $targy. ha több adatot szeretnénk megtudni látogatóinkról. megtanultuk. ha jó PHP kódot szeretnénk írni? Nem. Ez utóbbit csak bizonyos levelezõrendszerek veszik figyelembe. ha kicsit bonyolultabb feladatokat szeretnénk programozottan végrehajtani. mail( $cimzett.hu".hu". $felado = "masvalaki@masiktartomany. Másfelõl azonban szükség van ilyen alapvetõ ismeretekre. $targy = "üdvözlet ". mellyel szabadon alakíthatjuk az elküldendõ levél fejléceit. a gethostbyaddr() függvénnyel kideríthetjük. Az ebben felsorolt fejlécsorokat a CRLF (\r\n) karakterpárral kell elválasztanunk. Kitûnõ programok készíthetõk a kiszolgáló-ügyfél párbeszéd részletes ismerete nélkül is.

hogy milyen ügyfélprogramtól érkezett a kérés? 5. Mely környezeti változó árulja el nekünk annak a lapnak a címét. Minek a rövidítése és mit jelent a HTTP? 4. A PHP mely függvényével küldenénk elektronikus levelet? . melyek segítenek megszilárdítani az órában szerzett tudást. Melyik függvény használható hálózati kapcsolat létrehozására? 9. mely függvénnyel tölthetünk le egy weboldalt róla? 7. nincs értelme foglalkoznunk azzal. Az ügyfélprogramok tekintélyes hányada azonban nem hazudik: ha a böngészõtípust és az egyéb felhasználói jellemzõket olyan céllal gyûjtjük. hogy külön kapcsolatot építenénk fel egy kiszolgálóval. akkor mennyire bízhatok a mások fejlécei alapján létrehozott környezeti változókban? Az olyan környezeti változókban. mint a $HTTP_REFERER vagy a $HTTP_USER_AGENT. Mûhely A mûhelyben kvízkérdések találhatók. Anélkül.256 13. hogy az abból készített statisztikák elemzése alapján a felhasználókat jobban szolgálhassuk. Kvíz 1. Miért nem felel meg a $REMOTE_ADDR változó a látogató nyomon követésére? 3. hogy nem minden adat feltétlenül helytálló. Adott IP cím alapján hogyan deríthetõ ki a hozzá tartozó gép neve? 8. amennyiben ezen információk pontos ismerete programunkban alapvetõ követelmény. nem szabad megbíznunk. óra Ha én is könnyedén küldhetek hamis fejléceket. amely a programunkra hivatkozott? 2. A válaszokat az A függelékben helyeztük el. Mit takar a kiszolgáló 404-es válaszkódja? 6. A fejléc mely sorából tudhatja meg a kiszolgáló.

Készítsünk olyan programot. hogy begépeljen némi szöveget. hogy a kapcsolat nem mindig jön létre. amely a felhasználónak lehetõvé teszi. Készítsünk egy programot. hogy a környezeti változók mit is állítanak róla. Ne feledkezzünk meg arról. Áruljuk el a felhasználónak. amely egy webcímet kér be (például http://www.kiskapu. Jelenítsük meg a kapott választ a böngészõben. 13 . majd egy HEAD kérést küldve felveszi a kapcsolatot azzal.Kapcsolat a külvilággal 257 Feladatok 1. 2. majd elektronikus levél formájában továbbítsa azt a mi e-mail címünkre.hu/) a felhasználótól.

.

Sok rendszer még mindig a könyvtár egy régebbi változatát futtatja. Ha rendszerünkre a könyvtár egy újabb változatát telepítettük. úgy is lefuttathatjuk a PHP-t. amelyet a legtöbb böngészõ támogat. például köríveket. amely a képeket GIF formátumban hozza létre. hogy a képalkotó függvények kimeneti formátuma PNG legyen. A GD könyvtár segítségével menet közben hozhatunk létre bonyolult alakzatokat a PHP grafikus függvényeivel. melynek segítségével futásidõben képeket hozhatunk létre és kezelhetjük azokat. ÓRA Dinamikus képek kezelése Az ezen az órán vett függvények a GD nevû nyílt forráskódú programkönyvtáron alapulnak. A könyvtár késõbbi változatai licenszokok miatt nem támogatják a GIF formátumot. A GD könyvtár olyan eszközcsoport. elkezdhetünk dinamikus képeket létrehozni a PHP grafikus függvényeivel.14. Ha a könyvtárat telepítettük és a PHP-t is lefordítottuk.com/gd/ weboldal szolgál bõvebb információval. A GD-rõl a http://boutell. Az óra során a következõket tanuljuk meg: • Hogyan hozzunk létre és jelenítsünk meg egy képet? • Hogyan dolgozzunk a színekkel? • Hogyan rajzoljunk alakzatokat. téglalapokat és sokszögeket? .

elõször szert kell tennünk egy képazonosítóra. A programot a böngészõ már közvetlenül vagy egy IMG elem részeként hívhatja meg. 14. program Dinamikusan létrehozott kép 1: 2: 3: 4: 5: <?php header("Content-type: image/gif"). imagegif($kep). hogy megjelenítsük elsõ képünket a böngészõben. amelynek paramétere a képazonosító. ?> Fontos. ábrán láthatjuk a 14. Ehhez az imagegif() függvényre van szükségünk.1.1. amelyet az órán tárgyalt majdnem mindegyik függvény esetében használni fogunk. Közölnünk kell a böngészõvel. Ezt az imagecreate() függvény segítségével tehetjük meg. Miután megkaptuk az azonosítót. 200 ).1. a másik a szélességére. az egyik a kép magasságára vonatkozik. Ennek két paramétere van. már majdnem készen állunk arra. programban a kép létrehozásához és megjelenítéséhez használt függvényeket láthatjuk.1. de egyelõre nem tudjuk annak színét beállítani. Egy téglalapot hoztunk létre. hogy a Content-type fejlécsort minden egyéb elõtt küldtük a böngészõnek. hogy egy képet küldünk. $kep = imagecreate( 200. Ekkor egy képazonosítót kapunk vissza. .260 14. különben a program kimenetét HTML-ként kezeli. A 14. program kimenetét.1.program. óra • Hogyan töltsünk ki színnel alakzatokat? • Hogyan kezeljük a TrueType betûtípusokat? Képek létrehozása és megjelenítése Mielõtt elkezdhetnénk a képekkel foglalkozni. <img src="14.php" alt="egy PHP készítette kép"> A 14.

Egy színazonosítót kapunk vissza. 14 Vonalak rajzolása Mielõtt egy képre vonalat rajzolhatnánk. Az imagecolorallocate() függvény elsõ meghívásakor egyúttal átállítja a paraméterül kapott alakzat színét is.Dinamikus képek kezelése 261 14. $piros = imagecolorallocate($kep. . A számozás kezdõpontja a kép bal felsõ sarka. A képet úgy képzeljük el. Így ha az elõzõ kódrészletet hozzáadjuk a 14. illetve három 0 és 255 közötti egész szám.0). amellyel késõbb alakzatok. amelynek paramétere a képazonosító. meg kell adnunk annak két végpontját. 8) koordinátájú képpont a hatodik képpont fentrõl lefelé és a kilencedik képpont balról jobbra számolva. ábra Dinamikusan létrehozott alakzat A szín beállítása A szín beállításához egy színazonosítóra van szükségünk. melynek mindkét tengelye 0-tól számozódik. zöld és kék színösszetevõket jelentik. mint képernyõpontokból álló tömböt.1. egy vörös téglalapot kapunk. 255. amelyek a vörös. kitöltések vagy szövegek színét határozhatjuk meg.1. Más szóval az (5. Ezt az imagecolorallocate() függvénnyel kaphatjuk meg.0. programhoz.

199. 199) és nem a (200. 200) koordinátákban végzõdik.0. hogy a vonal a (199. egyet a piros és egyet a kék színnek. négy egész számot. 199. A függvény paraméterként egy képazonosítót vár. 0. $kek = imagecolorallocate($kep.0). ábrán a 14. 255. $kek ). tekintve.262 14.2. $kep = imagecreate( 200. program eredményét láthatjuk. 200 ). amelyek az egyenes két végpontjának koordinátáit jelentik. óra Az imageline() függvény két képpont közé rajzol egy egyenest. hogy a képpontokat 0-tól kezdve számozzuk. 14. 0. 14. program Egyenes rajzolása az imageline() függvénnyel 1: 2: 3: 4: 5: 6: 7: 8: <?php header("Content-type: image/gif"). A 14.2. ábra Egyenes rajzolása az imageline() függvénnyel .2. programban megrajzoljuk a téglalap egy átlóját. valamint egy színazonosítót.2.255 ). Fontos megjegyeznünk. imagegif($kep). ?> Két színazonosítót kapunk.0. imageline( $kep. Ha a 14. 0. $piros = imagecolorallocate($kep. Ezután a $kek változóban tárolt azonosítót használjuk a vonal színének megadására.2.

program kimenetét láthatjuk. 0.0. program Az imagefill() függvény használata 1: 2: 3: 4: 5: 6: 7: 8: 9: <?php header("Content-type: image/gif").255 ). $kek = imagecolorallocate($kep. program a képet az imagefill() függvény meghívásával teszi egy kicsit érdekesebbé. a kitöltés kezdõkoordinátái. 0. 0. 199. ?> A 14.3.0). Az imagefill() függvény bemenete egy képazonosító. imagegif($kep). A 14. 0. mint kedvenc grafikai programunkkal. $piros = imagecolorallocate($kep.3. 199. imageline( $kep. ábrán a 14.0. ábra Az imagefill() függvény használata 14 . $kek ).3.3. $kep = imagecreate( 200.3.Dinamikus képek kezelése 263 Alakzatok kitöltése A PHP segítségével ugyanúgy kiszínezhetünk alakzatokat. 255. 199. valamint egy színazonosító. 14. imagefill( $kep. 14. 200 ). $kek ). A függvény a kezdõ képponttal megegyezõ színû szomszédos képpontokat a kijelölt színre állítja.

90. 99. imagefill( $kep. imagegif($kep). $kek = imagecolorallocate($kep. A körív 3 óránál kezdõdik és 90 fokot rajzolunk (azaz 6 óráig). 3 órától kezdve rajzoljuk. 200 ). a középpont koordinátája. 200. A teljes magasság és szélesség 200-200 képpontnyi. 360. 99. program kimenetét a 14. 99. ábrán láthatjuk.és egy végpont (fokban mérve). 180. $kek ). 0. valamint egy színazonosító. 200. 0. program teljes kört rajzol és kék színnel tölti ki. program Kör rajzolása az imagearc() függvénnyel 1: 2: 3: 4: 5: 6: 7: 8: 9: <?php header("Content-type: image/gif").264 14. $kep = imagecreate( 200. 99.4. A 14.0. egy kezdõ. ?> A 14.4. 99) koordinátájú pontban van. 14. imagearc( $kep. $kek ). 99.255 ). melynek középpontja a (99.4. a magasságot meghatározó egész szám. Ez egy olyan körívrészletet jelenít meg. $piros = imagecolorallocate($kep. $kek ). A következõ kódrészlet egy negyed körívet rajzol ki: imagearc( $kep. A köríveket az óramutató járásának megfelelõen. a szélességet meghatározó egész szám. 180.0).0. óra Körív rajzolása Az imagearc() függvény segítségével köríveket rajzolhatunk.4. 255. 99. 0. Bemenete egy képazonosító. .

4. program egy kiszínezett téglalapot hoz létre és megjeleníti a böngészõben.5. 179): imagerectangle( $kep. mint az imagerectangle(). 179. Mivel ez meglehetõsen gyakori mûvelet. ábra Kör rajzolása az imagearc() függvénnyel Téglalap rajzolása A PHP imagerectangle() függvényével téglalapot rajzolhatunk. A 14. 19. Az imagerectangle() bemenete egy képazonosító. 179. A következõ kódrészlet olyan téglalapot rajzol. a téglalap bal felsõ és jobb alsó sarkának koordinátája. 19) és (179. valamint egy színazonosító. melynek bal felsõ és jobb alsó koordinátái rendre (19. a PHP-ban létezik az imagefilledrectangle() függvény. Az alakzatot ezután az imagefill() függvénnyel tölthetjük ki.Dinamikus képek kezelése 265 14. 19. amely ugyanazokat a bemeneti értékeket várja. $kek ). de az általunk meghatározott színnel ki is tölti a téglalapot. 14 .

255.0. 19. Az elsõ két elem az elsõ pont koordinátáit adja meg. ábrán a 14. 19. program Téglalap rajzolása az imagefilledrectangle() függvénnyel 1: 2: 3: 4: 5: 6: 7: 8: <?php header("Content-type: image/gif").0). imagegif( $kep ). 14. imagefilledrectangle( $kep. A 14.5. a második kettõ a második pontét és így tovább. Az imagepolygon() bemenetét képezõ tömbnek számmal indexeltnek kell lennie.266 14.5. $piros = imagecolorallocate($kep.0.255 ). . a pontok koordinátáiból álló tömb. 0. Az imagefilledpolygon() függvény segítségével színnel kitöltött sokszögek hozhatók létre. ábra Téglalap rajzolása az imagefilledrectangle() függvénnyel Sokszög rajzolása Az imagepolygon() függvény segítségével kifinomultabb alakzatokat is rajzolhatunk. óra 14. $kep = imagecreate( 200. ?> $kek ). $kek = imagecolorallocate($kep. 179. az alakzat pontjainak számát jelzõ egész szám és egy színazonosító.5. E függvény bemenete egy képazonosító. 200 ). program által elõállított képet láthatjuk. Az imagepolygon() függvény megrajzolja a pontok közötti vonalakat és az utolsó pontot automatikusan összeköti az elsõvel.5. 179.

imagefilledpolygon( $kep.6.6. ábra Sokszög rajzolása az imagefilledpolygon() függvénnyel 14 .6. 0. hogy az összekötendõ pontok száma az imagefilledpolygon() függvény hívásakor megegyezik a $pontok tömb elemei számának felével. 190. 14. 255. $kep = imagecreate( 200. $kek ). count ( $pontok )/2.0. 10. 200 ).6. 190 ). 13: ?> 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: Vegyük észre. program eredményét láthatjuk. program Sokszög rajzolása az imagefilledpolygon() függvénnyel <?php header("Content-type: image/gif"). 190.255 ). $pontok = array (10.0). 190. 267 14. program egy kitöltött sokszöget rajzol és jelenít meg a böngészõben.6. $piros = imagecolorallocate($kep. ábrán a 14.Dinamikus képek kezelése A 14. $kek = imagecolorallocate($kep. A 14. $pontok.0. 10. 12: imagegif($kep). 10.

program A színek átlátszóvá tétele az imagecolortransparent() függvénnyel 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: <?php header("Content-type: image/gif"). 16: imagegif($kep).7.0. $kep = imagecreate( 200. program kimenetét láthatjuk. 15: imagecolortransparent( $kep. $pontok = array (10. count ( $pontok )/2. program kimenete a sokszöget rajzoló programot úgy változtatja meg. $kek ). ábrán a 14.255 ). $piros = imagecolorallocate($kep. 17: ?> A 14. 190. $piros ). 0. hogy az alakzat „úszni” fog a böngészõben. ahelyett. 10. 200 ). A 14. hogy egy háttérszín elõtt jelenne meg. az imagecolortransparent() függvénynek átadott szín áttetszõ lesz.0. 10. hogy a kiválasztott színeket az ábrán belül áttetszõvé tegyük.7. 14. 190 ).268 14. 190.0). . 255. óra A színek átlátszóvá tétele A PHP az imagecolortransparent() függvénnyel lehetõvé teszi.és egy színazonosító. imagefilledpolygon( $kep. $kek = imagecolorallocate($kep. $pontok. 10. A függvény bemenete egy kép. Ha a képet megjelenítjük egy böngészõben.7.7. 190.

Szövegírás az imageTTFtext() függvénnyel Az imageTTFtext() függvénnyel az ábrákra szöveget írhatunk. A GD programkönyvtár mellett szükségünk lesz a FreeType programkönyvtár telepítésére is. A kiírandó szöveg kezdõkoordinátája határozza meg. a kezdõ x és y koordináták. hol lesz a szöveg elsõ karakterének alapvonala. szög. amellyel ellenõrizhetjük. A függvény nyolc bemenõ paramétere a következõ: képazonosító. ábra A színek átlátszóvá tétele az imagecolortransparent() függvénnyel Szövegek kezelése Ha rendszerünkön vannak TrueType betûk.7. program egy karakterláncot ír az ábrára. a TrueType betûtípus elérési útvonala és a kiírandó szöveg.8. méret.Dinamikus képek kezelése 269 14. A 14. színazonosító. a képekre írhatunk is. 14 . A PHP biztosít számunkra egy olyan eszközt is. majd az eredményt megjeleníti a böngészõben. hogy a beírandó szöveg elfér-e a rendelkezésre álló helyen. egy képben megjelenõ diagramokat és navigációs elemeket is létrehozhatunk. Ha ezek rendelkezésünkre állnak. amely a kiírandó szöveg magasságára utal.

8: 9: imageTTFtext( $kep.255 ).270 14. Figyelem.8. Az imageTTFtext() meghívásához az 50-es magasságot. $betukeszlet = "/usr/local/office52/share/fonts/ /TrueType/arial.ttf". "Üdvözöljük!" ). program Szövegírás az imageTTFtext() függvénnyel 1: 2: 3: 4: 5: 6: 7: <?php header("Content-type: image/gif").0. végül a kiírandó szöveget.ttf kiterjesztésû fájlokat. 100) kezdõkoordinátát adtuk át. ábrán láthatjuk. Ezután ráírjuk az ábrára a “Üdvözöljük!” szöveget.8. keressük a . 255.0. 12: ?> Létrehozunk egy 400 képpontnyi széles és 200 képpontnyi magas vásznat. Az eredményt a 14. $betukeszlet. $piros = imagecolorallocate($kep. 10: 11: imagegif($kep). ábra Szöveg írása az imageTTFtext() függvénnyel . megadunk két színt és a $betukeszlet változóban tároljuk a TrueType betûtípus elérési útját. $kek. 50. 0 fokos szöget és (20. 0. 200 ).8. 100. 20. 0. a betûtípusok a kiszolgálón feltehetõleg más könyvtárban találhatók! Ha nem vagyunk biztosak a helyben. 14. $kek = imagecolorallocate($kep.0). Emellett a függvény megkapja még a $kek változóban tárolt színazonosítót és a $betukeszlet változóban tárolt betûtípust. $kep = imagecreate( 400. óra 14.

Dinamikus képek kezelése Persze most még csak találgatunk. hogy próbálkozzunk. a szélességérõl még kevesebbet. A betûméret nem árul el sokat a szöveg magasságáról. melyekhez nem kell a képazonosító. a betûtípus elérési útja és a kérdéses szöveg. 3-as. Az imageTTFbox() által figyelembe vett koordinátarendszert úgy kell elképzelnünk. Az imageTTFtext() függvény persze visszaad információt a szöveg kiterjedésérõl. amelynek koordinátája 0. táblázat Az imageTTFbox() függvény által visszaadott tömb Sorszám 0 1 2 3 4 5 6 7 Leírás bal alsó (vízszintes tengely) bal alsó (függõleges tengely) jobb alsó (vízszintes tengely) jobb alsó (függõleges tengely) jobb felsõ (vízszintes tengely) jobb felsõ (függõleges tengely) bal felsõ (vízszintes tengely) bal felsõ (függõleges tengely) 14 A függõleges tengelyhez visszaadott számok (1-es. hány képponttal nyúlik a szöveg az alapvonal alá. amely onnan kapta nevét. hová tegyük a szöveget. A szöveg tetejének a függõleges tengelyen mért értékei ehhez képest általában negatív számok. mielõtt még élesben elvégeznénk a mûveletet. és 7-es tömbelemek) a szöveg alapvonalához viszonyulnak. hogy a szöveget határoló dobozt írja le. 14. A függvény bemenete a betûméret. 271 Szöveg kiterjedésének ellenõrzése az imageTTFbox() függvénnyel A szöveg kiterjedésérõl az imageTTFbox() függvénnyel szerezhetünk információt.1. de akkorra már minden eldõlt. a visszakapott tömbben az 1-es indexû elem lehet. Szerencsére a PHP lehetõséget nyújt arra. A 14. Azon kevés függvények egyike. táblázatban a függvény által visszaadott tömböt értelmezzük. amely a szöveg kiírásához szükséges terület paramétereit (koordinátáit) tartalmazza. Egy nyolcelemû tömböt ad vissza. mivel az "y" alsó szára három képponttal nyúlik . a szög. 5-ös.1. míg a szöveg aljának itt mért értékei általában pozitívak. a pozitívak pedig attól lefelé helyezkednének el. Így kapjuk meg. mintha a szöveg alapvonala lenne az y irányban vett 0 érték és a negatív koordináták attól felfelé. hogy 3 lesz. Így például ha az imageTTFbox() függvénnyel ellenõrizendõ szövegben van egy "y".

úgy tûnik. $betumeret = 50. Ez általában alacsony szám. $kek = imagecolorallocate($kep.255 ). $piros = imagecolorallocate($kep. hogy a 7-es elem –10 lesz. hogy mind a vízszintes. $betukeszlet = "/usr/local/office52/share/fonts/ /TrueType/arial.0). $szovegszelesseg = $szelesseg. úgy. $betukeszlet. 0. $szovegmagassag = ( abs($doboz[7]) )-2.0. mind a függõleges tengelyen középre helyezi azt. hogy szükségünk van-e a koordináták kiigazítására. . A pontos értékek betûtípustól és betûmérettõl függnek. g vagy j betûkre). mint az x irányú kezdõkoordinátától (gondoljunk a p. Lehetséges.9. hogy az imageTTFbox() függvény által visszaadott alapvonal és a rajzolás közben látható között 2 képpontos eltolás van.0. A 14. mint amilyennek az imageTTFbox() függvény mutatja. $szovegmagassag. $szelesseg = 200. 14. 0. 255.9. if ( ! isset ( $szoveg ) ) $szoveg = "Változtasson meg!". program dinamikusan küldi a böngészõnek a szöveget. $magassag = 100. óra az alapvonal alá. $magassag ). mivel a szöveg 10 képponttal van az alapvonal fölé emelve.ttf". Az imageTTFbox() függvény által visszaadott értékeket arra is használhatjuk. program Szöveg elhelyezése az imageTTFbox() függvény használatával 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: <?php header("Content-type: image/gif"). $szovegszelesseg = abs( $doboz[2] ). mivel a betûk jellemzõen jelentõsebb eltérést mutatnak az alapvonaltól. while ( 1 ) { $doboz = imageTTFbox( $betumeret. Ezt úgy ellensúlyozhatjuk. hogy az ábrán belül a szöveget igazítsuk. A vízszintes tengelyen a bal oldali számok (a 0-ás és a 6-os elem) esetében az imageTTFbox() függvény az adott kezdõpont elõtt kezdõdõ szöveget negatív számmal kifejezett eltolással jelöli. A vízszintes tengelyen így már csak az elvárt pontosság kérdése. hogy az alapvonalat két képpontnyival magasabbnak képzeljük. Csak hogy bonyolítsuk a helyzetet.272 14. $szoveg ). $kep = imagecreate( $szelesseg.

befejezzük a ciklust. összevethetjük az ábra szélességével (tíz képpontnyival kell kevesebbnek lennie. hogy ez sikerülni fog-e. hogy létezik-e már a $szoveg nevû változó. mint a kép szélessége. $gifYkozep = (int) ( $magassag/2 ). (int) ($gifYkozep+($szovegmagassag/2)). hogy kiszámítottuk a szöveg szélességének értékét. Ha a szöveg keskenyebb. $szoveg ).9. hogy a $szoveg változóban tárolt karaktersorozat elférjen a rendelkezésére álló helyen. 14 . bár ezt még ki kell igazítanunk a fent említett két képponttal. ha nem. fogadhat adatot egy weboldalról – akár egy URL keresõkifejezésébõl. A szöveget függõlegesen is középre szeretnénk helyezni. $kek. de egyelõre nem tudhatjuk. imageTTFtext( $kep. Ezzel az eljárással egy ábrának is lehetnek paraméterei. A színazonosítókat a szokásos módon állítjuk elõ. beállítjuk egy alapértékre. Most. $betukeszlet. Azt szeretnénk. a keret miatt). $betumeret.Dinamikus képek kezelése 273 14. A képazonosító elõállításához az imagecreate() függvényt használjuk. program (folytatás) 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: if ( $szovegszelesseg < $szelesseg . 0. imagegif($kep). Ellenkezõ esetben csökkentjük a betûméretet és újra próbálkozunk. Megvizsgáljuk. a betûtípus alapbeállítású méretét pedig 50-re állítjuk. A while utasításon belül átadjuk a betûtípus elérési útját és a szöveget az imageTTFbox() függvénynek. akár egy kitöltött ûrlapról. a $betukeszlet nevû változóban pedig a TrueType betûtípus elérési útját rögzítjük. az eredményül kapott tömböt pedig a $doboz változóba helyezzük. de a szöveg alapvonala alatt lévõ részt figyelmen kívül hagyva. Ezt vesszük a karaktersorozat szélességének és a $szovegszelesseg változóban tároljuk. Ezt az értéket a $szovegmagassag változóban tároljuk. } $gifXkozep = (int) ( $szelesseg/2 ). (int) ($gifXkozep-($szovegszelesseg/2)). A $doboz[2] tartalmazza a jobb alsó sarok helyét a vízszintes tengelyen. ?> A kép magasságát és szélességét a $magassag és $szelesseg változókban tároljuk.20 ) break. Az alapvonal feletti magasság meghatározásához használhatjuk a $doboz[7] változóban található szám abszolút értékét. $betumeret--.

óra A $magassag és a $szelesseg változók értékét elfelezve megkapjuk az ábra hozzávetõleges középpontját. amely tartalmazza a megjelenítendõ szöveget. ábra Szöveg elhelyezése az imageTTFbox() függvény használatával . ?> <form action="<? print $PHP_SELF ?>" method="POST"> <input type="text" name="szoveg"> </form> <p> <img src="14. A következõ részlet egy olyan programot hoz létre. egy olyan keresõkifejezéssel egészítjük ki a hívást.program.9. illetve szélességébõl kiszámított eltolással az ábrára írjuk.urlencode($szoveg) ?>"> Amikor a 14. egy IMG elem részeként.9.9. végül megjelenítjük a képet a böngészõben. hogy saját szöveget jelenítsenek meg az ábrán: 1: 2: 3: 4: 5: 6: 7: 8: 9: <?php if ( ! isset( $szoveg ) ) $szoveg = "Dinamikus szöveg!".php?<? print "szoveg=". programot meghívjuk. A tizenkilencedik órában többet is tanulhatunk az információk programról programra való átadásáról.274 14.9. Ezt a kódot egy másik oldal is meghívhatja. 14. program kimenetét. A 14. amely lehetõvé teszi az egyes felhasználóknak. A szöveget az ábra középpontjából és a szöveg magasságából. ábrán láthatjuk a 14.9.

Dinamikus képek kezelése 275 A fenti elemek összegyúrása Készítsünk egy példát az ezen az órán tanult függvények használatával! Tegyük fel. // az ábra alján kimaradó hely å (a margót nem számolva) $betukeszlet = "/usr/local/office52/share/fonts/ å /TrueType/arial. Ügyfelünk a változók módosításával meghatározhatja az ábra magasságát és szélességét. így az adatokat csak látszólagos pontossággal kell megjeleníteni. Most hogy megvannak ezek az értékek. $max = max( $cellak ). // az oszlopok közötti hely $alsokeret = 40. ki kell számolnunk az oszlopok számát és a tömb legnagyobb értékét: $cellak = array ( "tetszik"=>200. Ügyfelünknek tudnia kell módosítani a grafikon oszlopainak számát. "közömbös"=>900 ). hogy arra kértek bennünket. A grafikont fogyasztói szavazáshoz fogják használni. Az $oszlopkoz az oszlopok közötti távolságot határozza meg. Az $xmargo és $ymargo a grafikon körüli margóvastagságot adja meg.ttf". "nem tetszik"=>400. Az oszlopokat és értékeiket a legegyszerûbb módon egy asszociatív tömbben tárolhatjuk. Az egyes oszlopok alatt a megfelelõ címkének kell lennie. a kép szélességét és magasságát és a grafikont körülvevõ keret méretét. amely több címkézett számot hasonlít össze. Miután megvan ez a tömb. // felsõ és alsó margó $oszlopkoz = 5. Egy sokkal részletesebb lebontást az ábrát tartalmazó oldal HTML részében találhatunk. // jobb és bal margó $ymargo = 20. hogy készítsünk egy dinamikus oszlopgrafikont. a némi számolgatás árán belõlük kapott hasznos számokat változókba tesszük: 14 . Létre kell hoznunk néhány változót. így ügyfelünk egyéni igényeihez igazíthatja az ábrát: $teljesszelesseg = 400. az $alsokeret változó pedig az oszlopok alatti címkéknek szánt hely nagyságát. $teljesmagassag = 200. $cellaszam = count( $cellak ). $xmargo = 20.

( $oszlopkoz * å ( $cellaszam-1 ) )) / $cellaszam) . ahová majd az oszlopok kerülnek). hogy az értékét megkapjuk. ezt vonjuk ki a diagram szélességébõl.$alsokeret. majd az eredményt osszuk el az oszlopok számával. // a rajzolás kiindulópontja az x tengelyen $yPoz = $teljesmagassag . $vaszonmagassag = ( $teljesmagassag . A függõleges mérethez az $alsokeret változót is számításba kell vennünk. hogy egyezzen a szöveg számára szabadon maradt terület magasságával (amit az $alsokeret változóban tárolunk). $szovegmeret = (int)($alsokeret). hogy a teljes szélességbõl kivonjuk a margó kétszeresét. } } . // å a rajzolás kiindulópontja az y tengelyen $cellaszelesseg = (int) (( $vaszonszelesseg . if ( $szovegszelesseg < $cellaszelesseg ) break. $betukeszlet. meg kell határoznunk a szöveg méretét. ha az ábra teljes magasságából kivonjuk a margót és a címkéknek kihagyott hely nagyságát. Az oszlopok talppontját tároló $yPoz változó értékét úgy kapjuk meg. számoljuk ki az oszlopok közötti helyek összegét. hogy a címkéknek helyet hagyjunk. milyen szélesek lesznek a címkék és mindenképpen azt szeretnénk. hogy az egyes címkék elférjenek a felettük levõ oszlop szélességén belül. Az $xPoz tárolja azt az x koordinátát.$ymargo*2 . $szovegmeret—. $szovegszelesseg = $doboz[2]. Ahhoz.$alsokeret ). óra $vaszonszelesseg = ( $teljesszelesseg . 0.$xmargo*2 ).$ymargo . A $cellaszelesseg az egyes oszlopok szélességét tárolja. amelyet az $alsokeret változóban tároltunk. Viszont nem tudjuk. A vízszintes összetevõt úgy kapjuk meg.276 14. Mielõtt megkezdenénk a munkát az ábrával. $xPoz = $xmargo. Kiszámítjuk a rajzfelületet (azt a területet. A $cellak tömbön egy ciklus segítségével meghatározzuk a legnagyobb címke méretét: forach( $cellak as $kulcs => $ertek ) { while ( 1 ) { $doboz = ImageTTFbBox( $szovegmeret. $kulcs ). amely a margó értékének vízszintes összetevõjét tárolja. amelytõl az oszlopok rajzolását kezdjük. Kezdetben úgy állítjuk be a szöveg méretét. így ennek értékét az $xmargo változó értékére állítjuk.

$teljesmagassag ). 277 14 . $kulcs ). $szovegmeret. ($xPoz+$cellaszelesseg). $betukeszlet. míg a tömb összes címkéje kisebb nem lesz az oszlopszélességnél. $szovszel = $doboz[2]. 0. 255 ). $kulcs ). } imagegif( $kep ). 0. amely egy oszlop szélességét tartalmazza. Kiszámoljuk a középpont x koordinátáját. $fekete. $fekete = ImageColorAllocate($kep. 0. 0. $yPoz. ($teljesmagassag-$ymargo). $kep = imagecreate( $teljesszelesseg. 0. Újra végiglépkedünk a $cellak tömbön. $kek ). $piros = ImageColorAllocate($kep. amely megegyezik az $xPoz és a fél oszlop szélességének összegével.Dinamikus képek kezelése Minden elem esetében egy ciklust kezdve. 0 ). Kiszámítjuk az oszlop magasságát és az eredményt a $cellamagassag-ba helyezzük. Az imagefilledrectangle() függvénynek az $xPoz. $doboz = ImageTTFBox( $szovegmeret. forach( $cellak as $kulcs => $ertek ) { $cellamagassag = (int) (($ertek/$max) * $vaszonmagassag). A ciklust abban az esetben állítjuk le. A kapott értéket a $doboz[2] változóban találhatjuk meg. mint az oszlopszélesség. 0. imagefilledrectangle( $kep. 255. ($kozeppont($szovszel/2)). ha a szöveg szélessége kisebb. amit összevetünk a $cellaszelesseg változóval. ImageTTFText( $kep. ($yPoz-$cellamagassag). majd kiosztunk néhány színt is. $yPoz. 0. A $szovegmeret addig csökken. 0). Ezt az imagecreate() függvénnyel tesszük meg. $cellamagassag és $cellaszelesseg változókat átadva megrajzoljuk az oszlopot. az imageTTFbox() segítségével információt szerzünk a címke méretét illetõen. Egyébként pedig csökkentjük a $szovegmeret értékét és újra ellenõrizzük a méreteket. $xPoz += ( $cellaszelesseg + $oszlopkoz). $xPoz. $betukeszlet. Most már végre létrehozhatunk egy képazonosítót és elkezdhetünk dolgozni vele. $kozeppont = (int)($xPoz+($cellaszelesseg/2)). $kek = ImageColorAllocate($kep.

ezt bemásoljuk a $szovszel átmeneti változóba. 6: $teljesszelesseg = 300. A ciklus végeztével megjelenítjük az elkészült képet. amelynek eredménytömbjét a $doboz változóban tároljuk. // jobb és bal margó 9: $ymargo = 20.$ymargo*2 .ttf". // az ábra alján kimaradó hely (a margót nem számolva) 12: $betukeszlet = "/usr/local/office52/share/fonts/ /TrueType/arial. // az oszlopok közötti hely 11: $alsokeret = 30. 4: $max = max( $cellak ).278 14.$xmargo*2 ). az y koordináta pedig az alakzat magasságának és a margónak a különbsége. 14: $vaszonmagassag = ( $teljesmagassag .10. 13: $vaszonszelesseg = ( $teljesszelesseg . 3: $cellak = array ( "tetszik"=>200.$alsokeret ). példában láthatjuk. Most már elegendõ információ áll rendelkezésünkre ahhoz. 15: $xPoz = $xmargo. A $doboz[2] értéket fogjuk munkaszélességnek választani. // a rajzolás kiindulópontja az y tengelyen 17: $cellaszelesseg = (int) (( $vaszonszelesseg ( $oszlopkoz * ( $cellaszam-1 ) )) / $cellaszam) .10. // fenti és lenti margó 10: $oszlopkoz = 10. 5: $cellaszam = count( $cellak ). felkészülve ezzel a következõ oszlop feldolgozására. a végeredményt pedig a 14.10. ábrán. hogy kiírassuk a címkét. "nem tetszik"=>400. Megnöveljük az $xPoz változót. . 14.$alsokeret. 7: $teljesmagassag = 200. Az x koordináta a $kozeppont változó és a szövegszélesség felének különbsége lesz. // a rajzolás kiindulópontja az x tengelyen 16: $yPoz = $teljesmagassag . "közömbös"=>900 ). óra A szöveg középre igazításához megint szükségünk van az imageTTFbox() függvényre. A teljes programot a 14. program Egy dinamikus oszlopdiagram 1: <?php 2: header("Content-type: image/gif").$ymargo . 8: $xmargo = 20.

$szovegmeret. 45: ($teljesmagassag-$ymargo). 0. $betukeszlet.10. $xPoz. $kulcs ). 46: $xPoz += ( $cellaszelesseg + $oszlopkoz). 33: $kek = ImageColorAllocate($kep. $betukeszlet. 35: $szurke = ImageColorAllocate($kep. $kulcs ). 0). 41: imagefilledrectangle( $kep. 34: $fekete = ImageColorAllocate($kep. 28: $szovegmeret—. 32: $piros = ImageColorAllocate($kep. 42: $doboz = ImageTTFbBox( $szovegmeret. ($yPoz-$cellamagassag). 0. 100 ). ($kozeppont-($szovszel/2)). $kek ). 49: ?> 14 . program (folytatás) 18: $szovegmeret = (int)($alsokeret). 0 ). 0. 19: // betûméret kiigazítása 20: forach( $cellak as $kulcs => $ertek ) 21: { 22: while ( 1 ) 23: { 24: $doboz = ImageTTFbBox( $szovegmeret. 44: ImageTTFText( $kep. 0. $betukeszlet. 100. $kulcs ). 0.Dinamikus képek kezelése 279 14. 26: if ( $szovegszelesseg < $cellaszelesseg ) 27: break. $yPoz. 47: } 48: imagegif( $kep ). 255 ). $teljesmagassag ). 0. 0. 29: } 30: } 31: $kep = imagecreate( $teljesszelesseg. ($xPoz+$cellaszelesseg). 25: $szovegszelesseg = abs( $doboz[2] ). 40: $kozeppont = (int)($xPoz+($cellaszelesseg/2)). 43: $szovszel = $doboz[2]. 100. 36: 37: forach( $cellak as $kulcs => $ertek ) 38: { 39: $cellamagassag = (int) (($ertek/$max) * $vaszonmagassag). $fekete. 0. 255.

amelyben a tanult eljárásokat a gyakorlatban is láthattuk. hogyan szerezzünk színazonosítót és hogyan töltsünk ki színnel területeket az imagecolorallocate() és az imagefill() függvényekkel. Megtanultuk. hogy dinamikus oszlopdiagramokat és navigációs elemeket hozhassunk létre. . Megnéztük. Azt is megtanultuk. hogyan használjuk az imagecreate() és az imagegif() függvényeket képek létrehozására és megjelenítésére. hogyan használjuk a PHP által támogatott FreeType programkönyvtárat a TrueType betûtípusokkal való munkára. valamint elemeztünk egy programot. viszonylag könnyen. ábra Egy dinamikus oszlopdiagram Összefoglalás A GD programkönyvtár PHP-s támogatása lehetõvé teszi.280 14. A program hatékonyságától függõen ezt a felhasználó nem feltétlenül veszi észre. óra 14.10. de azért a dinamikus képeket módjával használjuk. mint egy már létezõ fájl. hogyan használjunk vonal. amelyben egy alakzatra szöveget írtunk és megnéztünk egy példát. Ezen az órán megtanultuk.és alakzat függvényeket alakzatok körvonalainak megrajzolására és kitöltésére. Kérdések és válaszok Fellépnek-e teljesítménybeli problémák dinamikus képek használata esetén? Egy dinamikusan létrehozott kép lassabban töltõdik be a böngészõbe.

14 . Hogyan rajzoljunk sokszöget? 10. az elõtér és a háttér színét. Tegyük lehetõvé. hogy a felhasználó határozza meg a rajzterületet. A válaszokat az A függelékben helyeztük el. Milyen függvényt használnánk a létrehozott GIF kép megjelenítésére? 4. Írjunk egy programot. amely mutatja. amely egy folyamatjelzõt hoz létre. Melyik függvénnyel rajzolnánk vonalat egy dinamikus képre? 6. Melyik függvényt használhatjuk körív rajzolására? 8. mennyi pénz folyt be egy gyûjtés alkalmával az adott célra szükséges pénzbõl. Milyen függvény segítségével szerezhetjük meg a színazonosítót? 5. Melyik függvénnyel írnánk egy dinamikus alakzatra (a FreeType programkönyvtár segítségével)? Feladatok 1.Dinamikus képek kezelése 281 Mûhely A mûhelyben kvízkérdések találhatók. Hogyan rajzoljunk téglalapot? 9. Kvíz 1. Milyen függvényt használnánk egy képazonosító elõállításához. valamint az árnyék meglétét és annak méretét. melyek segítenek megszilárdítani az órában szerzett tudást. Melyik függvénnyel töltenénk ki színnel egy dinamikus alakzatot? 7. amelyet a többi függvénynél használhatunk? 3. 2. Milyen fejlécsort kell a böngészõnek küldenünk a GIF kép létrehozása és megjelenítése elõtt? 2. amely egy fõcímet ábrázoló képet ír ki egy bejövõ ûrlap vagy lekérdezés adataiból. Írjunk egy programot.

.

15. naptárunk fortélyainak helyes kezelése azonban a programokat meglehetõsen bonyolulttá teheti. amely megkönnyíti a feladatot. ÓRA Dátumok kezelése A dátumok annyira mindennapjaink részét képezik. hogy nem is gondolkodunk. Szerencsére a PHP hatékony eszközöket biztosít a dátumszámításhoz. Ebben a fejezetben a következõkrõl tanulunk: • Hogyan kérdezhetjük le a pontos idõt és dátumot? • Hogyan szerezhetünk információt egy dátumról? • Hogyan formázzunk meg egy dátumot? • Hogyan ellenõrizzük a dátumok érvényességét? • Hogyan állítsuk be a dátumot? • Hogyan írjunk egyszerû naptárprogramot? . amikor velük dolgozunk.

Az idõbélyeg átalakítása a getdate() függvénnyel Most. amely egy kicsit nehezen értelmezhetõ. Ha nem adjuk meg az idõbélyeget. óra A dátum kiderítése a time() függvénnyel A PHP time() függvénye mindent elárul. akkor ahelyett. az évet pedig 2000-re. hónapokat és a hónapok napjait jegyezzük fel. mintha azt a time() függvénytõl kapta volna. Ha ez a dátum éppenséggel 1999. Most képzeljünk el egy olyan programot. A 15. az azóta eltelt másodpercek számát pedig idõbélyegnek (néha idõbélyegzõ. olyan programot kellene írni. viszont nagyon informatív. de felmerül a kérdés: még ha ilyen nagyszerû eszközök is állnak rendelkezésünkre. amelyben az éveket. mint azt gondolnánk.284 15. hogy 1-et adnánk a dátumhoz.1. a függvény az éppen aktuális idõbélyeggel dolgozik. január 1. éjfél óta eltelt másodpercek számát adja meg. a hónapot januárra. A getdate() elhagyható bemenete egy idõbélyeg. éppen ellenkezõleg: egyetlen számból rengeteg információt szerezhetünk. amely a napot 1-re írná át. A függvénynek nincs bemenete (paramétere) és egy egész számot ad vissza. az idõbélyeggel sokkalta könnyebben lehet számításokat végezni. december 31. amire szükségünk lehet a pontos idõvel és dátummal kapcsolatban. az idõbélyeg nem feleslegesen túlbonyolított módja a dátum tárolásának? Nem. hogy rendelkezésünkre áll az idõbélyeg. Ez a dátum a „UNIX kor kezdete” néven ismeretes.1. time stamp) nevezik. át kell alakítanunk. Az idõbélyeget a PHP eszközeivel „emberi fogyasztásra alkalmasabb” formára hozhatjuk. táblázat A getdate() függvény által visszaadott asszociatív tömb Kulcs seconds minutes hours mday Leírás A percbõl eltelt másodpercek száma (0-59) Az órából eltelt percek száma (0-59) A nap órája (0-23) A hónap napja (1-31) Példa 28 7 12 20 . amellyel egy napot kell hozzáadnunk egy adott dátumhoz.. Az idõbélyegben viszont csak egy napnyi másodpercet kell hozzáadni az aktuális dátumhoz és már készen is vagyunk. visszatérési értéke pedig egy asszociatív tömb. 15. táblázat a getdate() által visszaadott tömb elemeit részletezi. És ami még ennél is jobb. A time() által visszaadott egész szám a greenwichi középidõ szerinti 1970. Képzeljünk csak el egy házi dátumrendszert. mielõtt megmutatnánk a felhasználónak. Ezt az új számot pedig kedvünk szerint alakíthatjuk át valamilyen barátságosabb formára.

ábrán a getdate() függvény egy lehetséges kimenetét láthatjuk.1.1.1. majd a foreach utasítással kiírjuk az egyes elemeket. program Dátum lekérdezése a getdate() függvénnyel 1: <html> 2: <head> 3: <title>15. így a mai dátumot fogja visszaadni 8: foreach ( $datum_tomb as $kulcs => $ertek ) 9: { 10: print "$kulcs = $ertek<br>". programban a getdate() függvénnyel szétbontjuk az idõbélyeget. táblázat (folytatás) wday mon year yday weekday month 0 A hét napja (0-6) Az év hónapja (1-12) Év (négy számjeggyel) Az év napja (0-365) A hét napja (névvel) Az év hónapja (névvel) Az idõbélyeg 4 1 2000 19 Thursday January 948370048 A 15. // nem adtunk meg bemenetet. 16: ?> 17: </body> 18: </html> 15 .Dátumok kezelése 285 15. A getdate() a helyi idõzóna szerinti dátumot adja vissza.1. program Dátum lekérdezése a getdate() függvénnyel</title> 4: </head> 5: <body> 6: <?php 7: $datum_tomb = getdate(). 11: } 12: ?> 13: <hr> 14: <? 15: print "A mai dátum: " $datum_tomb["year"] " " $datum_tomb["mon"] " " $datum_tomb["mday"] <p>". 15. A 15.1.

bevezetõ nullák nélkül) Óra (24 órás formátum. A formázó karakterláncon kívül a date() függvénynek átadhatjuk az idõbélyeget is. táblázat A date() által használt formázási kódok. 15. táblázatban láthatjuk azokat a kódokat. bár ez nem kötelezõ.2. ábra A getdate() függvény használata Az idõbélyeg átalakítása a date() függvénnyel A getdate() függvényt akkor használjuk. bevezetõ nullák nélkül) Példa pm PM 05 Thu January 03 3 5 . bevezetõ nullákkal) Óra (24 órás formátum. A date() függvénynek átadott formázóban található minden egyéb szöveg a visszaadott értékben változatlanul meg fog jelenni. A 15. nagybetûvel A hónap napja (bevezetõ nullákkal írt szám) A hét napja (három betûvel) A hónap neve Óra (12 órás formátum. a dátumot azonban általában szövegként szeretnénk megjeleníteni. amikor a kimenetét képezõ elemeket szeretnénk használni.1. óra 15. Formátum a A d D F h H g G Leírás ‘am’ (délelõtt) vagy ‘pm’ (délután).286 15.2. A date() függvény a dátumot formázott karakterlánc formájában adja vissza. kisbetûvel ‘AM’ (délelõtt) vagy ‘PM’ (délután). bevezetõ nullákkal) 05 Óra (12 órás formátum. A date() függvény által visszaadott érték formátuma a paraméterként átadható formázó karakterlánccal nagymértékben befolyásolható. amelyeket a formázó karakterlánc tartalmazhat.

"augusztus". 15. program Dátum formázása a date() függvénnyel 1: <html> 2: <head> 3: <title>15. 14:42:55 9: 10: $de_du = Array ("am" => "délelõtt". "február". program néhány formátumkódot mutat be.12.2. "július". "november". program Dátum formázása a date() függvénnyel</title> 4: </head> 5: <body> 6: <?php 7: print date("Y. 13: "október".2. bevezetõ nullák nélkül) 1 Az óra percei Idõbélyeg Év (két számjegy) Év (négy számjegy) Az év napja (0-365) A greenwichi középidõtõl való eltérés másodpercben Példa 47 5 Thursday 1 01 Jan 24 948372444 00 2000 19 0 A 15. time()). 11: $honapok = Array("január". 12: "május". "április".2. táblázat (folytatás) Formátum i j l L m M n s U y Y z Z Leírás Perc A hónap napja (bevezetõ nullák nélkül) A hét napja (névvel) Szökõév (‘1’ ha igen. "december").d. 15 .m. 8: // 2000. "pm" => "délután").Dátumok kezelése 287 15. "szeptember". "március". ‘0’ ha nem) Az év hónapja (számmal. bevezetõ nullákkal) Az év hónapja (három betûvel) Az év hónapja (számmal. H:i:s<br>".10.2. "június".

288 15. 21: ?> 22: </body> 23: </html> A magyar dátumok formázása kétségtelenül bonyolultabb. hogy a date() függvény ne tekintse ezek karaktereit értelmezendõ formátum-meghatározásoknak. amelyek a \ után válnak vezérlõkarakterré. amely a „délelõtt” és „délután” szavakat tartalmazza. " ). Ha olyan szöveget szeretnénk a formázáshoz adni. \\n\ap\j\a v\a\\n. a $honap-hoz pedig a tömb date("n")-1-edik elemét kell vennünk. 19: print $napszak . amely formátumkód-betûket tartalmaz.2. mint a belsõleg támogatott angol dátumformátumok. valamint egy másik tömböt a hónapok nevei számára. A fenti példában a formátumkarakterek ütközését elkerülendõ vettük külön a $honap és $napszak kiírását. Bár a formázás bonyolultnak tûnik. mivel a tömbök nullától számozódnak. $honap . date(" g ór\a i perc"). nagyon könnyû elvégezni. délután 2 óra 42 perc. Idõbélyeg készítése az mktime() függvénnyel Már képesek vagyunk az aktuális dátumot használni. használjuk a gmdate() függvényt. hogy az utána jövõ karakter nem formátumkód. A "\n"-t például ennek megfelelõen "\\n"-nek kell írnunk. GMT) szerint kapjuk meg. 17: 18: print " Ma " . Az mktime() függvény által visszaadott idõbélyeget a date() vagy a getdate() függvényekkel használhatjuk. date(" j. hogy greenwichi középidõ (Greenwich Mean Time. 16: $honap = $honapok[date("n")-1]. program (folytatás) 14: 15: $napszak = $de_du[date("a")]. de tetszõleges dátumokat még nem tudunk kezelni. a fordított perjel (\) karakterrel jelezhetjük. Azon karakterek esetében. A date() függvény a helyi idõzóna szerint adja vissza a dátumot. Ha azt szeretnénk. óra 15. 20: // Ma 2000 december tizedike van. ha egy “n”-t szeretnénk a formázási karaktersorozatba írni. amely egyébként minden más tekintetben ugyanígy mûködik. date("Y ") . ezért létre kell hoznunk egy tömböt. Az mktime() függvény bemenete hat egész szám. a következõ sorrendben: . ezt a \ elé tett újabb \ segítségével kell jeleznünk. A $napszak egyszerûen a date() függvény "a" formátumra adott kimenetébõl származtatható.

meg kell bizonyosodnunk róla. 1999 ). a napot. 9: print date("Y. 289 15. 15 A dátum ellenõrzése a checkdate() függvénnyel Elõfordulhat. H:i:s<br>". illetve dátumszámításokhoz lehet hasznos. ilyenkor az aktuális idõnek megfelelõ értékeket használja. akkor a meghatározott nap. Az mktime() emellett azokat az értékeket is kiigazítja. amit aztán a date() függvénnyel használ. és az évet kéri paraméterként (ebben a sorrendben) és true (igaz) értéket ad vissza.01. év paraméterek utáni nap reggeli 1.3. 0. Mielõtt nekikezdenénk a munkának vagy tárolnánk a dátumot. a nap elfogadható az adott . hogy a felhasználó által bevitt dátummal kell dolgoznunk. 5. 1. program az mktime() függvénnyel állít elõ idõbélyeget. program Idõbélyeg készítése az mktime() függvénnyel </title> 4: </head> 5: <body> 6: <?php 7: // idõbélyeget készít 1999. amelyek túl vannak a megfelelõ értéktartományon. 01. 05. így ha 25-öt adunk meg óra paraméterként. hogy az érvényes-e.3.m. $ido). 12 óra 30 perchez 8: $ido = mktime( 12. program Idõbélyeg készítése az mktime() függvénnyel 1: <html> 2: <head> 3: <title>15.3. Az mktime() függvény kimenete általában adatbázisban vagy fájlban való tároláshoz. a hónapot. ha a hónap 1 és 12 közt van.d. hónap.Dátumok kezelése óra perc másodperc hónap hónap napja év A 15.00-ként fogja kezelni azt. A checkdate() függvény három egész számot. 12:30:00 11: ?> 12: </body> 13: </html> Az mktime() függvény néhány vagy akár az összes eleme elhagyható. 10: // 1999.05. 30.

Egy példa Próbáljunk meg ezen függvények közül egyetlen példán belül minél többet használni. Vigyázzunk azonban. 7: } . a $honap és az $ev változókat. Ez a függvény a false (hamis) értéket adja vissza. óra hónapban és évben (számításba véve a szökõéveket) és az év 0 és 32 767 közé esik. 4. hogy egy dátum ugyan érvényes. program A felhasználó által bevitt adatok ellenõrzése a naptárprogram számára 1: <?php 2: if ( ! checkdate( $honap. mert elõfordulhat. Két globális változót használunk. 6: $ev = $mostTomb["year"]. melyek adatait a felhasználó adja meg. valószínûleg nem fogja megadni a bekért adatokat. Például a következõ sor true (igaz) értéket ad vissza: checkdate( 4. Általános szabályként fogadjuk el. példa azt a kódrészletet tartalmazza. A felhasználó által bevitt adatok ellenõrzése Amikor egy felhasználó elõször látogat el weboldalunkra. (Használhatjuk helyette a checkdate() függvényt is. az mktime() által visszaadott idõbélyeg –1 lenne. $ev ) ) 3: { 4: $mostTomb = getdate(). A felhasználó lenyíló menüvel választhatja ki a hónapot és az évet. 15. ha a neki átadott változó nem meghatározott. 1066 ) Viszont ha ezekkel az értékekkel egy dátumot szeretnénk létrehozni. Erre az isset() függvény segítségével készíthetjük fel programunkat. de a bevitt adat nem érvényes.4.) A 15. amely ellenõrzi a $honap és az $ev változókat és egy idõbélyeget hoz létre belõlük. Ha nem adtuk meg az évet vagy a hónapot. vagy megadtuk.290 15. hogy az 1902 elõtti évekre nem használjuk az mktime() függvényt és az 1970 elõttiekre is csak elõvigyázatosan. Készítsünk naptárat. 5: $honap = $mostTomb["mon"]. 1. A két változó segítségével elkészítjük a meghatározott hónap elsõ napjának idõbélyegét. amely egy 1980 és 2010 közötti tetszõleges hónap napjait mutatja. A program kimenetében az adott hónap dátumai a hét napjainak megfelelõen kerülnek elrendezésre. a program bemenetének alapbeállításként a folyó év aktuális hónapjának elsõ napját tekintjük. de más dátumfüggvények számára mégsem elfogadható.4.

a checkdate() false (hamis) értéket ad vissza. így önmagában nincs kimenete.4. Bár ezeket módosíthatatlan elemekként. $honap.5. a többi nap pedig eggyel elõrébb. 0. 10: if ($elsoNapTombje["wday"] == 0) { $elsoNapTombje["wday"] = 6. 0. programban a létrehozott ûrlapot láthatjuk. a HTML kódban is megadhatnánk. 1. Végül a magyar héthasználatnak megfelelõen át kell alakítanunk a hét napjára vonatkozó értéket. ahol szükséges. akkor hetedikre írjuk át. azaz a hétfõ az elsõ helyen szerepel. A getdate() és más dátumfüggvények a hét elsõ napjának a vasárnapot tekintik. Így a vasárnap a hét végére kerül. 9: $elsoNapTombje = getdate($kezdet). } 11: else { $elsoNapTombje["wday"]--. Ennek érdekében SELECT elemeket fogunk használni. 15 . Az if utasításban a checkdate() függvényt használjuk a $honap és az $ev változók ellenõrzésére. A késõbbiek során még szükségünk lesz ennek az idõbélyegnek a napjára és hónapjára.4. ezért létrehozunk egy $elsoNapTombje nevû változót. egyébként pedig a nap számát eggyel csökkentjük.Dátumok kezelése 291 15. azt is biztosítanunk kell. ezért a menüket dinamikusan hozzuk létre és csak ott adjuk hozzá a SELECTED tulajdonságot az OPTION elemhez. Ha a dátum nem érvényes. Ezért ha a hét elsõ napján vagyunk (ez kapja a nullás számot). amellyel a felhasználók lekérdezhetik egy hónap és év adatait. az aktuális dátumon alapuló asszociatív tömböt. Most hogy megbizonyosodtunk. mivel nem hozhatunk létre érvényes dátumot meghatározatlan hónap és év paraméterekbõl. Ezután a tömb mon és year elemeivel magunk állítjuk be a $honap és az $ev változók értékeit. $ev ). hogy a lenyíló menük alapbeállítása az adott hónap legyen. } 12: ?> A 15. A 15. amely a getdate() függvény által visszaadott és ezen az idõbélyegen alapuló asszociatív tömb lesz. hogy a program bemenetét képezõ két változó érvényes adatot tartalmaz. a getdate() függvénnyel létrehozunk egy. hogy egyúttal a felhasználó által bevitt adat érvényességét is ellenõrizzük. program (folytatás) 8: $kezdet = mktime ( 0. A HTML ûrlap létrehozása Olyan kezelõfelületet kell létrehoznunk. az mktime() függvényt használjuk a hónap elsõ napja idõbélyegének létrehozására. program egy nagyobb program részlete. Ha ezek nem meghatározottak. E megközelítés további haszna.

"május". "március".$honapok[$x-1]. "december"). $x<2010. "július". "november". 1. print ">". $honap = $mostTomb["mon"]. } ?> <html> <head> <title><?php print "Naptár:" $elsoNapTombje["year"] $elsoNapTombje["month"] ?></title> <head> <body> <form method="post"> <select name="honap"> <?php $honapok = Array ("január". "szeptember". $x <= count( $honapok ). "június". $elsoNapTombje = getdate($kezdet). 0. óra 15. "augusztus". "október". } $kezdet = mktime ( 0. $ev ). 0. 1. $x++ ) { print "\t<option". program A naptárprogram HTML ûrlapja 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: <?php if ( ! checkdate( $honap."\n".5. $ev ) ) { $mostTomb = getdate(). $ev = $mostTomb["year"].292 15. } ?> </select> <select name="ev"> <?php for ( $x=1980. print ($x == $honap)?" SELECTED":"". $x++ ) { print "\t<option value=\"$x\"". print ($x == $ev)?" SELECTED":"". } else { $elsoNapTombje["wday"]--. $honap. . "február". if ($elsoNapTombje["wday"] == 0) { $elsoNapTombje["wday"] = 6. for ( $x=1. "április".

Vegyük észre. Ez az egyszerû SELECT elem létrehozásának túlbonyolított módja lenne. Ha az $x és a $honap megegyezik. megírjuk az oldal HTML kódját. Hasonló módszerrel írjuk meg az év menüjét is. hogy biztosítsuk.2. A kész ûrlapot a 15. amely a 12 hónap nevét tartalmazza. hogy a megfelelõ hónap automatikusan kijelölõdik a lap betöltésekor. hogy ha egy FORM kódból kihagyjuk az ACTION paramétert. és amelynek vagy az aktuális év és hónap. program (folytatás) 39: 40: 41: 42: 43: 44: 45: 46: ?> </select> <input type="submit" value="Megjelenítés!"> </form> </body> </html> print ">$x\n". ha nem kellene közben figyelnünk az $x változót (a for ciklusváltozóját). Az elõzõ példákban a FORM elemen belüli $PHP_SELF globális változót használtuk arra. mindegyikbõl készítve egy OPTION címkét. Ezen aztán végiglépkedünk egy ciklussal. hogy az évet és a hónapot a TITLE (cím) elemhez adhassuk. Elõször létrehozunk egy $honapok nevû tömböt. hogy létrehozzuk az egyes OPTION címkéket.Dátumok kezelése 293 15. végül HTML módba visszatérve létrehozzuk a Megjelenítés gombot. az ûrlap az elküldés után újra megjeleníti magát. amely saját magának elküldi a hónap és év paramétereket. Így egy olyan ûrlapot kapunk. e programban viszont azt a tényt használtuk ki. hogy az $elsoNapTombje változót arra használjuk. 15 . } Miután létrehoztuk a $kezdet idõbélyeget és az $elsoNapTombje változót. vagy pedig az elõzõleg megadott év és hónap az alapbeállítása. biztosítván ezzel. alapbeállítás szerint ugyanez történik. ábrán láthatjuk. A lenyíló menük SELECT elemének létrehozásához visszalépünk PHP módba. a SELECTED kifejezést hozzáadjuk az OPTION címkéhez.5.

} ?> <html> <head> <title><?php print "Naptár:" $elsoNapTombje["year"] $elsoNapTombje["month"] ?></title> <head> <body> . if ( ! checkdate( $honap. ábra A naptár ûrlapja A naptár táblázatának létrehozása Most egy táblázatot kell létrehoznunk. $honap = $mostTomb["mon"]. óra 15.2. (60*60*24) ). $ev ) ) { $mostTomb = getdate(). } $kezdet = mktime ( 0. program A teljes naptárprogram 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: <?php define("EGYNAP". 0. 1. $elsoNapTombje = getdate($kezdet). 1. if ($elsoNapTombje["wday"] == 0) { $elsoNapTombje["wday"] = 6.6. $ev = $mostTomb["year"]. } else { $elsoNapTombje["wday"]--. amit a kiválasztott hónap napjaival kell feltöltenünk. példában követhetjük nyomon. 15.6. $ev ). $honap. 0. amely a teljes naptárprogramot tartalmazza. Ezt a 15.294 15.

print ($x == $honap)?" SELECTED":"".6. print ">$x\n". } ?> </select> <select name="ev"> <?php for ( $x=1980. "november". $x <= count( $honapok ). "augusztus". $szamlalo++ ) { $napTomb = getdate( $kiirando ). $x++ ) { print "\t<option". "vasárnap"). $x++ ) { print "\t<option value=\"$x\"". "szombat". "április". "péntek". print "<TABLE BORDER=1 CELLPADDING=5>\n". "csütörtök”. "június". $kiirando = $kezdet. for ( $x=1. "október".$honapok[$x-1]. "július". print ($x == $ev)?" SELECTED":"". "február". $x<2010. "május". "december")."\n". for ( $szamlalo=0. program (folytatás) 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: <form method="post"> <select name="honap"> <?php $honapok = Array ("január". "szeptember". "szerda". 15 . "kedd". "március". } ?> </select> <input type="submit" value="Megjelenítés!"> </form> <p> <?php $napok = Array ("hétfõ". $szamlalo < (6*7).Dátumok kezelése 295 15. print ">". foreach ( $napok as $nap ) print "\t<td><b>$nap</b></td>\n".

. Bár a ciklus indításakor a $kiirando változó értéke a hónap elsõ napja lesz. az idõbélyeget a ciklus minden lefutásakor 24 órával növeljük. Erre azért van szükség. print "</tr><tr>\n". óra 15. Az ehhez az if utasításhoz tartozó kódrész csak akkor fut le. ?> </body> </html> Mivel a táblázat fejlécébe a hét napjai kell. } } print "</tr></table>". hogy befejezzük-e a ciklust vagy új sort kezdjünk. Megadjuk a $szamlalo változó kezdeti értékét.6. $honapok[$napTomb["mon"]-1] " $napTomb["mday"] "</td>\n". } if ( $szamlalo < $elsoNapTombje["wday"] || $napTomb["mon"] != $honap ) { print "\t<td><br></td>\n". A lényeg a program utolsó for ciklusában történik. A ciklusban a $kiirando változót a getdate() függvénnyel egy dátumtömbbé alakítjuk és az eredményt a $napTomb változóba tesszük. a programot végigléptetjük a napok neveinek tömbjén és mindegyiket saját cellájába írjuk. hogy a ciklus 42 ismétlés után leáll. } else { print "\t<td>" . ha a $szamlalo 0 vagy a 7 többszöröse. program (folytatás) 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: if ( (($szamlalo) % 7) == 0 ) { if ( $napTomb["mon"] != $honap ) break. hogy a dátumoknak elegendõ cellát hozzunk létre. Így eldönthetjük. $kiirando += EGYNAP. hogy a $szamlalo változó értéke osztható-e 7-tel. hogy kerüljenek. A maradékos osztás segítségével megnézzük.296 15. majd biztosítjuk.

egy pár üres cellát is kell írnunk. A végsõ else utasításnál jön a feladat érdekes része. A maradékosztás igazolta. Egyszerûen hozzáadjuk egy nap másodperceinek számát (ezt az értéket a program elején határoztuk meg) és már újra is kezdhetjük a ciklust a $kiirando változó egy új értékével. hogy éppen egy sor végén állunk: ha új hónapban járunk. hogy egy-két üres cellával indítunk. hogy még a ciklus elsõ lefutásában vagy egy cellasor végénél vagyunk. így az is valószínû. mint ami a $kezdet-ben. Mindkét esetben egy üres cellát írunk ki a böngészõbe. Végül növeljük a $kiirando változót. Ha nem egyenlõ. Ugyanezt felhasználva ha a $honap változó már nem egyenlõ a $napTomb["mon"] változóval.3. Emlékezzünk vissza. hogy írjunk-e szöveget a cellába. tudhatjuk. így könnyen meglehet. hogy a $napTomb mon (hónapszám) eleme nem egyenlõ-e a $honap változóval. 297 15 . a $napTomb[mon] más számot fog tartalmazni. amely az idõbélyeget tartalmazza. Most kerül felhasználásra a ciklus korábbi részében létrehozott $napTomb asszociatív tömb. elvégzünk még egy ellenõrzést: megvizsgáljuk. elhagyhatjuk a ciklust. Ha a $kezdet túljut az aktuális hónapon. mint a felhasználó által megadott $honap szám. hogy kiírjuk a hónap nevét és napját egy cellába. befejezzük a sort és újat kezdünk. A következõ if utasításban azt határozzuk meg. amelyet megjelenítünk. ábrán a program egy lehetséges eredményét láthatjuk. hogy mielõtt lezárnánk a táblázatot. Azzal már tisztában vagyunk. hogy még nem értük el azt a cellát. A 15. ha viszont a sor végére értünk és még mindig ugyanabban a hónapban vagyunk. ami viszont a hónapnak pontosan az a része. Ebbõl az $elsoNapTombje["wday"] kifejezés segítségével kideríthetõ. a ciklust befejezhetjük. akkor tudjuk.Dátumok kezelése Ha látjuk. Ha a $szamlalo kisebb. hogy a kiírandó hónapban vagyunk és az aktuális nap oszlopa megegyezik az $elsoNapTombje változóban tárolt számmal. hogy a $napTomb-ben ugyanaz az idõpont van. A hónap elsõ napjának adatait az $elsoNapTombje változóban találjuk. valamint a hónapok magyar neveit tartalmazó $honapok tömb. hogy elértük a hónap végét (de a sor végét még nem). mint ez a szám. Emellett kevés hónap végzõdik sor végén. hogy az adott dátum hányadik nap a héten. amelybe már írhatnánk. Nem minden hónap kezdõdik hétfõvel.

a http://www. óra 15. hogyan használjuk az idõbélyegbõl a dátum részeinek kinyerésére a getdate() függvényt és az idõbélyeget formázott szöveggé alakító date() függvényt. hogyan használjuk a time() függvényt az aktuális idõbélyeg megszerzésére. amely az említett függvényeket alkalmazta. hogyan hozzunk létre idõbélyeget az mktime() függvénnyel. Arról is tanultunk. amelyekkel a különbözõ naptárak között váltogatni lehet? Igen. Kérdések és válaszok Vannak olyan függvények.3. Megtanultuk ellenõrizni a dátum érvényességét a checkdate() függvénnyel. végül tanulmányoztunk egy példaprogramot. . Ezekrõl a hivatalos PHP kézikönyvben olvashatunk.298 15.calendar. a PHP naptárak teljes sorozatát biztosítja. Megtanultuk. ábra A naptárprogram Összefoglalás Ezen az órán megtanultuk.net/manual/ref.php. magyar elvárások szerint formáztunk dátumokat.php címen.

az adott dátumot jelképezõ asszociatív tömböt ad vissza? 3. amely közli a felhasználóval. Ûrlappal lehessen megadni az év. Melyik függvényt használjuk egy dátum érvényességének ellenõrzésére? Feladatok 1. A válaszokat az A függelékben helyeztük el. másodperc van még hátra a nagy napig. Készítsünk egy születésnapig visszaszámláló programot. melyek segítenek megszilárdítani az órában szerzett tudást. amelynek bemenete egy idõbélyeg és egy. hogy hány nap. kimenete pedig egy üzenet legyen. óra. Mely függvényt használnánk a dátum formázására? 4.Dátumok kezelése 299 Mûhely A mûhelyben kvízkérdések találhatók. hó és nap értékeit. 15 . Hogyan kapjuk meg egy tetszõleges dátum idõbélyegét? 5. amely a pontos dátumot és idõt jelöli? 2. Kvíz 1. Hogyan kapunk meg egy UNIX idõbélyeget. Melyik az a függvény. perc.

.

16. ÓRA Az adatok kezelése Ezen az órán az adatellenõrzésben és az adatmûveletekben fogunk egy kicsit elmélyedni. Újra áttekintjük az adattípusokat. Visszatérünk a tömbökhöz is és végül megismerkedünk a PHP fejlettebb adatkezelési. megbízható hálózati alkalmazásokat kell írnunk. hogy egy tömb tartalmaz-e egy bizonyos elemet? • Hogyan alakítsuk át egy tömb minden elemét? • Hogyan lehet saját szempontok alapján tömbrendezést végezni? . adatosztályozási eljárásaival. A PHP ugyan automatikusan kezeli ezeket. de elengedhetetlen. hogy egy változónak van-e értéke? • Hogyan lehet másként bejárni egy tömböt? • Hogyan deríthetjük ki. Az óra folyamán a következõkrõl tanulunk: • Hogyan alakítsuk át az egyes adattípusokat más adattípusokká? • Hogyan alakítja át automatikusan a PHP az adattípusokat a kifejezésekben? • Milyen további módjai vannak az adattípusok ellenõrzésének? • Miért fontos megértenünk az adattípusokat? • Hogyan ellenõrizzük. hogy értsük az adatkezelést. ha nagy.

lebegõpontos szám (double). kimenete pedig a változó adattípusát leíró szöveg: $adat = 454. mi csupán a típusátalakítás eredményét írattuk ki. hogy a PHP változóinak értéke egész szám (integer). karakterlánc (string). // "4"-et ír ki Az $adat változó lebegõpontos szám típusú maradt. settype( $adat. azaz egész szám A változók adattípusát közvetlen típusátalakítással vagy a settype() függvénnyel módosíthatjuk. Van azonban még valami. A gettype() függvénnyel bármelyik változótípust lekérdezhetjük. objektum vagy tömb lehet. A változók adattípusának módosításához a settype() függvényt használhatjuk. logikai érték (boolean). // "4"-et ír ki Az $adat változó most már egy egész számot tartalmaz. print $adat. A függvény bemenete egy tetszõleges típusú változó. $adat = 4. ehelyett egy átalakított másolatot kapunk vissza. majd sorra vesszük azokat a feltételeket. hogy "integer". print ( integer ) $adat. "integer" ). A folyamat közben a változó tartalmát a legcsekélyebb mértékben sem módosítjuk. . Egy kis ismétlés Azt már tudjuk.333. ami eddig kimaradt.302 16. Ebben a részben a változók adattípusának ellenõrzésére használt függvények közül ismerkedünk meg néhánnyal. A következõ kódrészlet egy tizedestörtet alakít át egész számmá. print gettype( $adat ). óra Újra az adattípusokról A negyedik órában már tanultunk néhány dolgot a PHP adattípusairól. // azt írja ki.333. amelynek bemenete az átalakítandó változó és a céladattípus neve. amelyek mellett a PHP automatikusan elvégzi helyettünk az adattípus-átalakításokat. Az adattípusok átalakításához a zárójelbe tett adattípust a megváltoztatandó változó vagy érték elé írjuk. $adat = 4.

$this->y = $y. ha egyszerû (egész és nem egész számok) és összetett adattípusok (objektumok és tömbök) között kell típust váltani? Amikor egy egyszerû adattípust tömbbé alakítunk.Az adatok kezelése 303 Összetett adattípusok átalakítása Néhány egyszerû (skaláris és szöveges) adattípus közötti átváltást már láttuk részleteiben is. print $obj_szoveg->scalar. Mi történik viszont akkor. "varos" => "Nagyfalva" ). ez tartalmazza az eredeti értéket: $szoveg = "ez az én szövegem" $obj_szoveg = (object) $szoveg. $y ) { $this->x = $x. hogy "Fõutca" Fordított esetben. print $tomb_szoveg[0]. melynek elsõ eleme az eredeti érték lesz: $szoveg = "ez az én szövegem" $tomb_szoveg = (array) $szoveg. class Pont { var $x. olyan tömb jön létre. var $y. amelyben minden objektum tulajdonságnak megfelel egy tömbelem. function Pont( $x. // kiírja az "ez az én szövegem" karakterláncot A dolog a tömbök és objektumok közötti váltáskor válik igazán izgalmassá. A metódusokat az átalakítás figyelmen kívül hagyja. Amikor egy tömböt objektummá alakítunk. // kiírja az "ez az én szövegem" karakterláncot Amikor a skaláris vagy szöveges változókat objektumokká alakítjuk. olyan tömb jön létre. $cimek = array ( "utca" => "Fõutca". amelyben a tömb egyes kulcsainak egy-egy tulajdonság felel meg. egy olyan új objektum jön létre. 16 . $obj_cimek = ( object ) $cimek. print $obj_cimek->utca. egy objektum tömbbé alakításakor. // azt írja ki. egy egyetlen scalar nevû tulajdonságot tartalmazó objektum jön létre.

akkor az lebegõpontos értékké alakul. hogy egy felhasználót megkérdezünk. hogy tudtunk volna róla. hány órát tölt a hálózaton hetente. Az automatikus átalakítás szabályai viszonylag egyszerûek. Az $orak ellenõrzésekor a "15" karakterlánc egész számmá alakul. de ezeket használhattuk igaz–hamis értékû kifejezésekben is vagy számolásoknál. ha éppen arra volt szükségünk. 0-vá alakul.2" . óra } } $pont = new Pont( 5. Valószínûleg ezt már igénybe vettük. $orak = "15" if ($orak > 15) print "Ilyen gyakori felhasználónak akár árengedmény is járhatna". // azt írja ki. Így a következõ kifejezés eredménye 80: 4 * "20mb" Ha a karakterlánc nem számmal kezdõdik. a PHP automatikusan átalakítja az egyiket a számíthatóság kedvéért.304 16. Tegyük fel. és a választ az $orak nevû változóban tároljuk. 7 ). Így a következõ sor 0-át ad eredményül: 4 * "körülbelül 20mb" Ha a karakterláncban a számot egy pont követi.8 lesz: 4 * "1. amelyben két különbözõ adattípus szerepel operandusként. Ha egy karakterlánc egész számmal kezdõdik. $tomb_pont = (array) $pont. így a kifejezés eredménye true (igaz) lesz. Ez kezdetben szövegként kerül tárolásra. print $tomb_pont["x"]. a szám az annak megfelelõ érték. Egész számokból vagy lebegõpontosakból álló környezetben a karakterláncok tartalmuknak megfelelõen kerülnek átalakításra. anélkül. Az ûrlapokból származó változók mindig karakterláncok. Ennek megfelelõen a következõ sor eredménye 4. hogy "5" Az adattípusok automatikus átalakítása Ha olyan kifejezést hozunk létre.

Maga az új érték azonban karakterlánc marad: $szoveg = "4".mûveletek karakterláncokra való alkalmazása különleges eset. // kiírja az 5-öt print gettype( $szoveg ). $szoveg++. de csak abban az esetben. azaz lebegõpontos Fontos megjegyeznünk. // azt írja ki. hogy "integer". a PHP a másik operandust is lebegõpontossá alakítja és az eredmény is lebegõpontos lesz: $eredmeny = ( 1 + 20. azaz egész szám Az elõzõ példában a $szoveg változó elõször 0-vá (egész számmá) alakul. // azt írja ki. 305 16 . // 1-et ír ki print gettype( $szoveg ). aztán adjuk hozzá az 1-et. A változó most már egy egész számot fog tartalmazni. Az egész számok és a lebegõpontosak közötti automatikus átváltás még ennél is egyszerûbb. print $szoveg. amelyet újra a $szoveg változóba helyezünk. egyedül az utolsó karakter kódja fog megnõni: $szoveg = "alszol". mint ahogy azt elvártuk. Ha egy operandust át kell alakítani. hogy "string" Ha egy betûket tartalmazó karakterláncot próbálunk növelni. A karakterlánc növelése.Az adatok kezelése Az ++ és -.0). $szoveg += 1. akkor annak átalakított másolata fog szerepelni a kifejezés részeként. print $szoveg. print gettype( $eredmeny ). Ennek a mûveletnek az eredménye 1. print $szoveg. // azt írja ki. // azt írja ki. ha a karakterlánc kizárólag számokból áll. hogy "alszom" Vessük össze ezt a karakterlánc növelésének egy másik megközelítésével: $szoveg = "alszol". $szoveg++. hogy "double". Ha egy kifejezés bármelyik operandusa lebegõpontos. hogy ha az automatikus átalakítás egy kifejezés kiértékeléséhez szükséges. a kifejezés egyik operandusa sem változik meg. 1-et ad a karakterlánc átalakított értékéhez.

Leírásukat a 16. visszatérési értéke pedig logikai. hogy értékeket egész számmá. A PHP ehhez az egyes adattípusoknak megfelelõ függvényeket biztosít. táblázat Az adattípusok ellenõrzésének függvényei Függvény is_array() is_bool() is_double() is_int() is_object() is_string() Leírás Igaz (true) értéket ad vissza. ami a hibakeresésnél jól jöhet. (A $valtozo ellenõrzésének második módja egy kicsit tömörebb. lebegõpontos számmá vagy szöveggé alakítsunk át.1. táblázatban találhatjuk meg. kóddal. Gyakran viszont csak azt szeretnénk megnézni.306 16. A függvények listáját a 16. Az if ( gettype( $valtozo ) == "array" ) print "ez egy tömb". hiszen minden változóról meg tudjuk mondani. ha a paraméter karakterlánc Ezek a függvények egy kicsit megkönnyítik az adattípusok ellenõrzését. Ezek mellett a PHP bizonyos függvényekkel lehetõvé teszi. ha a paraméter egész szám Igaz (true) értéket ad vissza. vagy a settype() függvényt használjuk. ha a paraméter tömb Igaz (true) értéket ad vissza. óra Az adattípusok ellenõrzése Már le tudunk kérdezni adattípusokat a gettype() függvénnyel.) Az adattípus-váltás további módjai Eddig az adattípus-váltás két módjával ismerkedtünk meg: vagy egy értéket alakítunk át meghatározott adattípussá. hogy a változó egy bizonyos adattípusú értéket tartalmaz-e. 16. ha a paraméter objektum Igaz (true) értéket ad vissza. táblázat tartalmazza. . megegyezik a if ( is_array( $valtozo ) ) print "ez egy tömb". ha a paraméter logikai érték Igaz (true) értéket ad vissza.1. hogy milyen típusú. E függvények bemenete tömbön és objektumon kívül bármilyen adattípus lehet. amelyek bemenete egy változó vagy egy érték. kimenetük pedig az átalakított érték. ha a paraméter lebegõpontos szám Igaz (true) értéket ad vissza.2.

kimenete egy azonos értékû karakterlánc Miért olyan fontosak az adattípusok? A PHP nem követeli meg tõlünk. 4. tombKiir ( array(4. } A következõ függvény jól mûködik.2. akkor miért van szükségünk mégis az adattípusok nyomon követésére? Azért. az hibához vezet. Ha figyelmetlenségünkben skaláris paramétert adunk át neki. kimenete egy azonos értékû lebegõpontos szám intval() strval() Bemenete egy érték. ha tömb paraméterrel hívják meg.php program 5. hogy megelõzhessük a hibákat. 55) ). A PHP-ben a függvényparaméterek típusát sem adhatjuk meg. amikor a függvényt meghatározzuk.php on line 5 // azaz "Figyelmeztetés: a foreach() függvénynek nem tömb å paramétert adtunk át // a /home/httpd/htdocs/proba2. amely egy tömb kulcsait és értékeit írja ki egy böngészõbe.Az adatok kezelése 307 16. de elvégzi az adattípus átalakításokat helyettünk. ha a kifejezésekben különbözõ adattípusú változókat használunk. function tombKiir( $tomb ) { foreach ( $tomb as $kulcs => $ertek ) print "$kulcs: $ertek<P>". å sorában" 16 . kimenete egy azonos értékû egész szám Bemenete egy érték. amint azt a következõ példa is mutatja: tombKiir ( 4 ). // Warning: Non array argument supplied for foreach() in // /home/httpd/htdocs/proba2. Képzeljünk el egy olyan függvényt. Ha a PHP ennyire leegyszerûsíti az életünket. hogy a meghívó kód egy tömböt adjon át nekünk. hogy egy változó létrehozásakor megadjuk annak adattípusát. táblázat Az adattípus-váltás függvényei Függvény Leírás doubleval() Bemenete egy érték. így nem írhatjuk elõ.

Az adattípus ellenõrzése akkor is jól jöhet. } A tombKiir() függvény nagyon rugalmassá vált. return true. amikor eléri a beolvasott könyvtár végét. A PHP-nak nincsenek ilyen megkötései. sokkal alkalmazkodóbbá tesszük a függvényt. minden más esetben viszont a könyvtár egyik elemének nevét tartalmazó karakterláncot. hogy a skaláris adatot tömbként használhassuk fel: function tombKiir( $tomb ) { if ( ! is_array( $tomb )) $tomb = (array) $tomb. Adatátalakítást is használhatunk. Hagyományosan a következõhöz hasonló szerkezetet használnánk. viszont az ilyen rugalmasság alkalmanként kétértelmûségekhez vezethet. ha egy könyvtár elemeit szeretnénk beolvastatni: $kvt = opendir( "konyvtar" ). while ( $nev = readdir( $kvt ) ) print "$nev<br>". minden metódusa mindig egy elõre meghatározott adattípust ad vissza. hogy a függvény szép csöndben visszatér. most már tetszõleges adattípust képes feldolgozni. ha a függvények visszaadott értékeit szeretnénk ellenõrizni. végre tudta-e hajtani feladatát. Azt is megtehetjük. ha skaláris értéket kap: function tombKiir( $tomb ) { if ( ! is_array( $tomb )) return false. hogy megállapíthassa. akár objektumot is.308 16. return true. hogy ellenõrizzük a kapott paraméter adattípusát. A readdir() függvény hamis (false) értéket ad vissza. óra Azzal. } Most már a hívó kód ellenõrizheti a függvény visszaadott értékeit. closedir( $kvt ). foreach ( $tomb as $kulcs => $ertek ) print "$kulcs: $ertek<P>". Erre láttunk egy példát a tizedik órában. például a Java. . foreach ( $tomb as $kulcs => $ertek ) print "$kulcs: $ertek<P>". Néhány nyelv.

16 . // kiírja. kimenete pedig true (igaz). Hogy az ilyen helyzetekkel megbirkózhassunk. hogy a változó egyáltalán létezik-e. de amelynek még nem adtunk értéket. amelyet már bevezettünk. ha a változó tartalmaz valamiféle értéket: $nincsertek. amelyeket a bejövõ ûrlapok töltenek fel értékkel. még akkor is. closedir( $kvt ). else print " a \$nincsertek változónak nincs értéke ". a függvény nem beállítottként. elkerülhetjük ezt a problémát: $kvt = opendir( "konyvtar" ). Ha ellenõrizzük a readdir() visszaadott értékének adattípusát. Ezt az isset() függvénnyel tehetjük meg. if ( isset( $nincsertek ) ) print "a \$nincsertek változónak van értéke". elõször ellenõriznünk kell. a függvény azt már beállítottként. értékkel rendelkezõnek fogja tekinteni: $nincsertek = "". ha a felhasználó egyetlen mezõt sem töltött ki adattal. ám elõzõleg meg kell bizonyosodnunk róla. hogy "a $nincsertek változónak nincs értéke" Azt a változót. és meg kell néznünk. érték nélküliként fogja kezelni. if ( isset( $nincsertek ) ) print "a \$nincsertek változónak van értéke". Az empty() függvény bemenete egy változó. hogy "a $nincsertek változónak van értéke" Azok a változók. else print "a \$nincsertek változónak nincs értéke". milyen értéket tartalmaz. Egy veszélyre azonban hadd hívjuk fel a figyelmet: ha 0-át vagy üres karakterláncot rendelünk egy változóhoz. amelynek bemenete egy változó. hogy üres-e a változó. a while utasítás kifejezése erre a karakterláncra false (hamis) értéket ad vissza és befejezi a felsorolást. // kiírja. mindig beállítottként fognak szerepelni. while ( is_string( $nev = readdir( $kvt ) ) ) print "$nev<br>". 309 A változók meglétének és ürességének ellenõrzése Az adattípusok ellenõrzése hasznos lehet.Az adatok kezelése Ha azonban a readdir() által visszaadott egyik alkönyvtár neve "0".

Ebben a részben további függvényekkel és ötletekkel ismerkedhetünk meg. // azt írja ki. Az each() függvény bemenete egy tömbváltozó. A könyvben lévõ példák legnagyobb részében ezt használjuk. "tantargy" å => "Térbeli ábrázolás" ). kimenete pedig egy négyelemû tömb.310 16. $elem = each( $reszletek ). if ( empty( $nincsertek ) ) print "a \$nincsertek változó üres". mint a 0 vagy egy üres karakterlánc. A PHP 3 esetében még egész másképpen kellett bejárni a tömböket. Tömb létrehozásakor a PHP egy belsõ mutatót alkalmaz. Akkor is igaz értéket ad vissza. Ezek közül az elemek közül kettõ számmal indexelt. amellyel tömbök elemeit olvashatjuk be. Ennek az elemnek a kulcsához és értékéhez az each() függvénnyel férhetünk hozzá. Hozzunk létre egy tömböt és próbáljuk ki az each() függvényt: $reszletek = array( "iskola" => "Képzõmûvészeti". print "$elem[0]<br>". hogy "Képzõmûvészeti" . óra kimenete pedig true (igaz). hogy "a $nincsertek változó üres" További tudnivalók a tömbökrõl A hetedik órában már bemutattuk a tömböket és a tömbök kezeléséhez szükséges függvényeket. ha a változó nincs beállítva vagy olyan adatot tartalmaz. hogy "iskola" print "$elem[1]<p>". kivéve. ha a változó üres tömböt tartalmaz: $nincsertek = "". Tömbök bejárása más megközelítésben A PHP 4 új eszköze a foreach utasítás. amely a tömb elsõ elemére mutat. A függvény meghívása után a belsõ mutató a vizsgált tömb következõ elemére fog mutatni. hogy "Képzõmûvészeti" print "$elem["key"]<br>". hogy "iskola" print "$elem["value"]<br>". // kiírja. ezzel tisztában kell lennünk. // azt írja ki. // azt írja ki. ilyenkor false (hamis) értéket ad vissza. else print " a \$nincsertek változó adatot tartalmaz". kettõ pedig a "key" (kulcs) és az "value" (érték) címkét viseli. ha elérte a tömb végét. Ha a PHP 3-nak is megfelelõ programokat szeretnénk írni vagy szeretnénk érteni a PHP 4 elõtti forráskódokat is. // azt írja ki.

Az adatok kezelése A $reszletek nevû tömböt két elemmel hozzuk létre, ezután átadjuk az each() függvénynek és a visszaadott értéket az $elem nevû tömbbe helyezzük. Az $elem tartalmazza a $reszletek tömbváltozó elsõ elemének kulcsát és értékét. Az each() által visszaadott tömböt kicsit nehézkes skaláris változókhoz rendelni, de szerencsére a PHP list() függvénye megoldja ezt a problémát. A list() függvény tetszõleges számú változót elfogad bemenetként és ezek mindegyikét a jobb oldalán megadott tömbváltozó megfelelõ értékeivel tölti fel: $tomb list( print print print = array( 44, 55, 66, 77 ); $elso, $masodik ) = $tomb; "$elso"; // azt írja ki, hogy "44" "<BR>"; "$masodik"; // azt írja ki, hogy "55"

311

Vegyük észre, hogy a list() függvénnyel könnyedén másolhatjuk át az elõzõ példa tömbjének elemeit a külön változókba. Használjuk arra a list() függvényt, hogy az each() minden egyes meghívásakor két változónak adjon értéket. $reszletek = array( "iskola" => "Képzõmûvészeti", "tantargy" => "Térbeli ábrázolás" ); while ( list( $kulcs, $ertek ) = each( $reszletek ) ) print "$kulcs: $ertek<BR>"; Bár a kód mûködni fog, valójában még egy sor hiányzik. Ha tömbünkre már használtuk a belsõ mutatót módosító függvények egyikét, az már nem a tömb elejére mutat. A reset() függvénnyel visszaállíthatjuk a mutatót a tömb kezdetére. Ez a függvény paraméterként egy tömbváltozót vár. Így az alábbi ismerõsebb szerkezet foreach( $reszletek as $kulcs => $ertek ); print "$kulcs: $ertek<BR>"; egyenértékû a következõvel: reset( $reszletek ); while ( list( $kulcs, $ertek ) = each( $reszletek ) ) print "$kulcs: $ertek<BR>";

16

312

16. óra

Elem keresése tömbben
A PHP 4-et megelõzõleg ha azt szerettük volna megtudni, hogy egy elem elõfordule egy tömbben, addig kellett bejárnunk a tömböt, míg megtaláltuk az elemet vagy elértük a tömb végét. A PHP 4-ben azonban már rendelkezésünkre áll az in_array() függvény. Két paramétere van, az egyik a keresett érték, a másik az a tömb, amelyben keresni kívánunk. A függvény true (igaz) értéket ad vissza, ha megtalálja a keresett értéket, egyébként false (hamis) értéket kapunk. $reszletek = array( "iskola" => "Képzõmûvészeti", "tantargy" å => "Térbeli ábrázolás" ); if ( in_array( "Térbeli ábrázolás", $reszletek ) ) print "A kurzus további intézkedésig felfüggesztve<P>\n";

Elemek eltávolítása a tömbbõl
Az unset() függvénnyel elemeket is eltávolíthatunk egy tömbbõl. A függvény bemenetéül egy változót vagy egy tömbelemet vár, majd azt minden teketória nélkül megsemmisíti. Ha a paraméter egy tömb egy eleme, a tömböt automatikusan lerövidíti. unset( $proba["cim"] ); unset( $szamok[1] ); Az unset() függvény egyetlen csapdája az lehet, hogy a tömb indexei nem követik a tömb megváltozott méretét. Az elõzõ példa tömbje a $szamok[1] elem eltávolítása után a következõképpen fest: $szamok[0] $szamok[2] $szamok[3] Szerencsére a foreach() függvénnyel ezen is gond nélkül végiglépkedhetünk.

Függvények alkalmazása a tömb összes elemére
A kifejezésekben szereplõ skaláris változókat könnyen módosíthatjuk, egy tömb összes elemét megváltoztatni már egy kicsit nehezebb. Ha például a tömb összes elemének értékéhez egy számot akarunk adni, azt úgy tehetnénk meg, hogy a tömb összes elemén végiglépkedve frissítjük az értékeket. A PHP azonban ennél elegánsabb megoldást kínál.

Az adatok kezelése Az array_walk() függvény egy tömb minden elemének kulcsát és értékét átadja egy, a felhasználó által meghatározott függvénynek. A függvény bemenete egy tömbváltozó, egy, a függvény nevét megadó karakterlánc érték, és egy elhagyható harmadik paraméter, amelyet a választott függvénynek szeretnénk még átadni. Vegyünk egy példát. Van egy adatbázisból kinyert ártömbünk, de mielõtt munkához kezdenénk vele, az összes árhoz hozzá kell adnunk a forgalmi adót. Elõször azt a függvényt hozzuk létre, amely hozzáadja az adót: function ado_hozzaado( &$ertek, $kulcs, $adoszazalek ) { $ertek +=( ($adoszazalek/100) * $ertek ); } Az array_walk() számára készített összes függvénynek egyértéket, egy kulcsot és egy elhagyható harmadik paramétert kell várnia. Ha paraméterként nem értéket szeretnénk átadni, hanem egy változót, melyben tükrözõdhetnek a függvény okozta változtatások a függvény hatókörén kívül is, a függvény-meghatározásban egy ÉS jelet (&) kell az adott paraméter elé írni. Ez fogja biztosítani, hogy ha a függvényen belül módosítjuk az értéket, az megjelenik a függvényen kívül a tömbben is. Ez az oka annak is, hogy példánkban az ado_hozzaado() függvénynek nincs szokásos értelemben vett visszatérési értéke. Most hogy megvan a függvényünk, máris meghívhatjuk az array_walk() függvényt a megfelelõ paraméterekkel: function ado_hozzaado( &$ertek, $kulcs, $adoszazalek ) { $ertek +=( ($adoszazalek/100) * $ertek ); } $arak = array( 10, 17.25, 14.30 ); array_walk( $arak, "ado_hozzaado", 10 ); foreach( $arak as $ertek ) print "$ertek<BR>"; // kimenete: // 11 // 18.975 // 15.73 A $arak tömbváltozót az ado_hozzaado() függvény nevével együtt átadjuk az array_walk() függvénynek. Az ado_hozzaado() függvénynek tudnia kell az érvényes adókulcsot. Az array_walk() harmadik, elhagyható paramétere átadódik a megnevezett függvénynek és ezzel elérjük, hogy az értesüljön az adókulcsról.

313

16

314

16. óra

Tömbök egyéni rendezése

A kulcs vagy érték alapján történõ rendezéssel már megismerkedtünk, nem mindig szoktunk azonban ilyen egyszerûen rendezni tömböket. Elõfordulhat, hogy többdimenziós tömbbe beágyazott értékek alapján vagy a szokványos alfanumerikus összehasonlítástól eltérõ szempont szerint szeretnénk rendezni. A PHP lehetõvé teszi, hogy magunk határozzuk meg az összehasonlító tömbrendezõ függvényeket. Számmal indexelt tömbök esetében ilyenkor az usort() függvényt kell meghívnunk, melynek bemenete a rendeznivaló tömb és annak a függvénynek a neve, amely egy elempár összehasonlítását képes elvégzi. Az általunk meghatározott függvénynek két paramétert kell elfogadnia, amelyek az összehasonlítandó tömbértékeket tartalmazzák. Ha a feltételek alapján ezek azonosak, a függvény a 0 értéket kell, hogy visszaadja, ha a tárgytömbben az elsõ paraméternek a második elõtt kell jönnie, akkor –1-et, ha pedig ez elsõ paraméternek kell a második után szerepelnie, akkor 1-et. A 16.1. programban azt láthatjuk, hogyan használjuk az usort() függvényt egy többdimenziós tömb rendezésére.

16.1. program Többdimenziós tömb rendezése mezõ alapján az usort() függvénnyel
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: <?php $termekek = array( array( "nev"=>"HAL 2000", "ar"=>4500.5 ), array( "nev"=>"Modem", "ar"=>55.5 ), array( "nev"=>"Nyomtató", "ar"=>2200.5 ), array( "nev"=>"Csavarhúzó", "ar"=>22.5 ) ); function arHasonlito( $a, $b ) { if ( $a["ar"] == $b["ar"] ) return 0; if ( $a["ar"] < $b["ar"] ) return -1; return 1; } usort( $termekek, "arHasonlito" ); foreach ( $termekek as $ertek ) print $ertek["nev"] ":" $ertek["ar"] "<br>\n"; ?>

Az adatok kezelése Elõször létrehozzuk a $termekek tömböt, amelyet az egyes értékek ár mezõje alapján szeretnénk rendezni. Ezután létrehozzuk az arHasonlito() függvényt, amelynek két paramétere van, $a és $b. Ezek tartalmazzák azt a két tömböt, amely a $termekek tömb második szintjét alkotja. Összehasonlítjuk az "ar" elemeiket és ha a két ár azonos, 0-át, ha az elsõ kevesebb, mint a másik, –1-et, egyébként pedig 1-et adunk vissza. Miután meghatároztuk a rendezõ függvényt és a tömböt is, meghívhatjuk az usort() függvényt, amelynek átadjuk a $termekek tömböt és az összehasonlító függvény nevét. Az usort() ismételten meghívja függvényünket, mindig átadja annak a $termekek egy elemét és felcseréli az elemeket, a visszaadott értékeknek megfelelõen. Végül végigléptetünk a tömbön, hogy megmutassuk az új elrendezést. Az usort() függvényt számmal indexelt tömbök esetében használjuk. Ha más egyéni rendezést szeretnénk egy asszociatív tömbön végrehajtani, használjuk az uasort() függvényt. Az uasort() úgy rendez, hogy megtartja a kulcsok és az értékek közötti társítást is. A 16.2. program az uasort() használatát egy asszociatív tömb rendezésén keresztül mutatja be.

315

16.2. program Többdimenziós tömb rendezése mezõ alapján az uasort() függvénnyel
1: <?php 2: $termekek = array( 3: "HAL 2000" => array( "szin" =>"piros", "ar"=>4500.5 ), 4: "Modem" => array( "szin" =>"kék", "ar"=>55.5 ), 5: "Nyomtató" => array( "szin" =>"zöld", "ar"=>2200.5 ), 6: "Csavarhúzó" => array( "szin" =>"piros", "ar"=>22.5 ) 7: ); 8: function arHasonlito( $a, $b ) 9: { 10: if ( $a["ar"] == $b["ar"] ) 11: return 0; 12: if ( $a["ar"] < $b["ar"] ) 13: return -1; 14: return 1; 15: } 16: uasort( $termekek, "arHasonlito" );

16

316

16. óra

16.2. program (folytatás)
17: foreach ( $termekek as $kulcs => $ertek ) 18: print "$kulcs: " $ertek["ar"] "<br>\n"; 19: ?>

Az uksort() függvénnyel az asszociatív tömbökön a kulcsok alapján végezhetünk egyéni rendezést. Az uksort() pontosan ugyanúgy mûködik, mint az usort() és az uasort(), azzal a különbséggel, hogy az uksort() a tömb kulcsait hasonlítja össze. A 16.3. programban az uksort() függvénnyel az egyes kulcsok karakterszáma alapján rendezünk egy tömböt. Megelõzve a következõ óra anyagát, az strlen() függvénnyel állapítjuk meg a kulcsok hosszúságát. Az strlen() függvény bemenete egy karakterlánc, visszaadott értéke pedig annak hosszúsága karakterben mérve.

16.3. program Asszociatív tömb rendezése kulcshosszúság alapján az uksort() függvénnyel
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: "xxxx" => 4, "xxx" => 5, "xx" => 7, "xxxxx" => 2, "x" => 8 ); function hosszHasonlito( $a, $b ) { if ( strlen( $a ) == strlen( $b ) ) return 0; if ( strlen( $a ) < strlen( $b ) ) return -1; return 1; } uksort( $ikszek, "hosszHasonlito" ); foreach ( $ikszek as $kulcs => $ertek ) print "$kulcs: $ertek <br>\n"; // a kimenet: <?php $ikszek = array(

Az adatok kezelése

317

16.3. program (folytatás)
22: 23: 24: 25: 26: 27: 28: // // // // // ?> x: 8 xx: 7 xxx: 5 xxxx: 4 xxxxx: 2

Összefoglalás
Az óra során a tömbökkel és adattípusokkal kapcsolatos ismeretekben mélyedtünk el. Megtanultuk, mi történik, ha összetett adattípust skalárissá alakítunk és fordítva. Megtudtuk, hogyan kezeli a PHP a különbözõ adattípusokat egy kifejezésben, hogyan határozza meg automatikusan az eredmény adattípusát helyettünk. Megismerkedtünk számos függvénnyel; például az is_array()-jel, amely különféle adattípusokat ellenõriz, vagy az intval()-lal, amely az adatot egész értékûvé alakítja át. Megtanultuk, hogyan lehet a PHP-ben hagyományos módon tömböt bejárni, az each() és a list() függvénnyel. Az in_array() függvénnyel képesek vagyunk ellenõrizni, hogy létezik-e egy adott érték egy tömbben, és el tudunk távolítani egy elemet egy tömbbõl az unset() függvénnyel. Az array_walk() függvénnyel már egy tömb összes elemén is végezhetünk mûveleteket, végül azt is tudjuk, hogyan használjuk az usort(), az uasort() és az uksort() függvényeket arra, hogy a tömbök egyéni rendezését végezzük.

Kérdések és válaszok
A PHP minden tömbkezelõ függvényével megismerkedtünk? Nem, az egész könyv sem lenne elég az összes tömbkezelõ függvény bemutatásához. Teljes listájukat és leírásukat a http://www.php.net/manual/ref.array.php weboldalon találhatjuk.

16

318

16. óra

Mûhely
A mûhelyben kvízkérdések találhatók, melyek segítenek megszilárdítani az órában szerzett tudást. A válaszokat az A függelékben helyeztük el.

Kvíz
1. Melyik az a függvény, amellyel adattípusokat tetszõleges más adattípussá alakíthatunk? 2. Sikerülhet ez függvény nélkül is? 3. Mit ír ki a következõ kód? print "four" * 200; 4. Hogyan határoznánk meg, hogy egy adott változó tömb-e? 5. Melyik függvény adja vissza paraméterének értékét egész számként? 6. Hogyan ellenõrizzük, hogy egy változónak adtunk-e már értéket? 7. Hogyan ellenõrizzük, hogy egy változó üres értéket (például 0-át vagy üres karakterláncot) tartalmaz? 8. Melyik függvénnyel törölnénk egy tömb egy elemét? 9. Melyik függvénnyel rendeznénk egy számmal indexelt tömböt?

Feladatok
1. Nézzük végig még egyszer a könyv során megoldott feladatokat. Alakítsunk át minden foreach utasítást úgy, hogy az megfeleljen a PHP 3 követelményeinek is. 2. Hozzunk létre egy vegyes adattípusú tömböt. Rendeztessük a tömböt adattípusok szerint.

17. ÓRA
Karakterláncok kezelése
A Világháló valójában szöveges fájlokra épülõ környezet, és igazából nem számít, mivel gazdagodik a jövõben a tartalma, a mélyén mindig szöveges állományokat fogunk találni. Így nem meglepõ, hogy a PHP 4 sok olyan függvényt biztosít, amellyel szövegmûveletek végezhetõk. Az óra során a következõket tanuljuk meg: • Hogyan formázzunk karakterláncokat? • Hogyan határozzuk meg a karakterláncok hosszát? • Hogyan találjunk meg egy karakterláncon belüli karakterláncot? • Hogyan bontsuk szét a karakterláncot alkotóelemeire? • Hogyan távolítsuk el a szóközöket a karakterláncok végérõl vagy elejérõl? • Hogyan cseréljünk le karakterlánc-részleteket? • Hogyan változtassuk egy karakterláncban a kisbetûket nagybetûre és fordítva?

320

17. óra

Karakterláncok formázása
A megjeleníteni kívánt karakterláncot eddig egyszerûen kiírattuk a böngészõbe. A PHP két olyan függvényt tartalmaz, amely lehetõvé teszi az elõzetes formázást, függetlenül attól, hogy tizedestörteket kell valahány tizedes pontosságra kerekíteni, egy mezõn belül kell jobbra vagy balra igazítani valamit, vagy egy számot kell különbözõ számrendszerekben megjeleníteni. Ebben a részben a printf() és az sprintf() függvények által biztosított formázási lehetõségekkel ismerkedünk meg.

A printf() függvény használata
Ha már dolgoztunk C-vel, biztosan ismerõs lesz a printf() függvény, amelynek PHP-s változata hasonló, de nem azonos azzal. A függvény bemenete egy karakterlánc, más néven a formátumvezérlõ karakterlánc (röviden formázó karakterlánc vagy egyszerûen formázó), emellett további, különbözõ típusú paraméterek. A formázó karakterlánc ezen további paraméterek megjelenítését határozza meg. A következõ kódrészlet például a printf() függvényt használja, hogy egy egész számot decimális értékként írjon ki: printf("az én számom az %d", 55 ); // azt írja ki, hogy "az én számom az 55" A formázó karakterláncban (ami az elsõ paraméter) egy különleges kódot helyeztünk el, amely átalakítási meghatározásként ismert. ÚJDONSÁG Az átalakítási meghatározás százalékjellel (%) kezdõdik, és azt határozza meg, hogyan kell a printf() függvény neki megfelelõ paraméterét kezelni. Egyetlen formátumvezérlõ karakterláncba annyi átalakítási meghatározást írhatunk, amennyit csak akarunk, feltéve, hogy a printf() függvénynek ugyanennyi paramétert adunk át a formázót követõen. A következõ kódrészlet két számot ír ki a printf() használatával: printf("Az elsõ szám: %d<br>\nA második szám: %d<br>\n", 55, 66 ); // A kiírt szöveg: // Az elsõ szám: 55 // A második szám: 66 Az elsõ átalakítási meghatározás a printf() második paraméterének felel meg, ami ebben az esetben az 55. A következõ átalakítási meghatározás a 66-nak felel meg. A százalékjelet követõ d betû miatt a függvény az adatot decimális egészként értelmezi. A meghatározásnak ez a része típusparaméterként ismeretes.

Karakterláncok kezelése 321 A printf() és a típusparaméterek Egy típusparaméterrel már találkoztunk. program a printf() függvénnyel egy számot a 17. 9: printf("Bináris: %b<br>". 8: printf("Decimális: %d<br>". Vegyük észre. A többi típusparamétert a 17. ez volt a d. program Néhány típusparaméter használatának bemutatása 1: <html> 2: <head> 3: <title>17. A paramétert lebegõpontos számként ábrázolja. 17 17. program Néhány típusparaméter használatának bemutatása</title> 4: </head> 5: <body> 6: <?php 7: $szam = 543. Egy egész számot annak ASCII megfelelõjeként jelenít meg. $szam ).1. Egész számokat bináris számként jelenít meg. hogy a formázó karakterlánc nem egyszerûen csak átalakítási meghatározásokat tartalmaz.1. .1.1. táblázatban láthatjuk. Egy egész számot nagybetûs hexadecimális (16-os számrendszerû) számként jelenít meg A 17. táblázat típusparaméterei segítségével jelenít meg. minden további benne szereplõ szöveg kiírásra kerül.1. 17. táblázat Típusparaméterek Paraméter d b c f o s x X Leírás A paramétert decimális számként jeleníti meg. Egy egész számot oktális (8-as számrendszerû) számként jelenít meg. amely az adatot decimális formátumban jeleníti meg. Egy egész számot kisbetûs hexadecimális (16-os számrendszerû) számként jelenít meg. A paramétert karakterlánc-állandónak tekinti. $szam ).1.

A printf() függvénnyel gyorsan tudunk adatokat egyik számrendszerbõl a másikba átalakítani és az eredményt megjeleníteni.1. ábra Néhány típusparaméter használatának bemutatása Ha a HTML-ben hivatkoznunk kell egy színre. $zold = 204. ?> </body> </html> A 17.1. $szam ). printf( "#%X%X%X". printf("Hexa (nagybetûs): %X<br>". óra 17. 17. $piros. $zold. printf("Karakterlánc: %s<br>". program (folytatás) 10: 11: 12: 13: 14: 15: 16: 17: printf("Kétszeres pontosságú: %f<br>".322 17. A printf() függvényt használhatjuk arra. hogy "#CCCCCC" . printf("Oktális: %o<br>". hogy a három 0 és 255 közé esõ decimális számot azok hexadecimális megfelelõire alakítsuk át: $piros = 204.1. zöld és kék színt képviselõ hexadecimális számot kell megadnunk. $szam ). $szam ). $kek = 204. // azt írja ki.1. három 00 és FF közé esõ. $szam ). ábrán láthatjuk. $szam ). a vörös. program kimenetét a 17. printf("Hexa (kisbetûs): %x<br>". $kek ).

$kek változóit úgy módosítjuk. hogy " 36" . a különbség nullákkal kerül kitöltésre. ami problémát okoz. Ha a kimenet hossza ennél a számnál kisebb lenne. ha például az elõzõ kódrészlet $piros. 12345 ) // a kimenet "12345" lesz Ha a kimenetet bevezetõ szóközökkel szeretnénk kitölteni. ha nagyobb. a kitöltõ paraméternek nincs hatása: printf( "%04d". Ha a kimenetet bevezetõ nullákkal szeretnénk kitölteni. hogy 1-et tartalmazzanak. A HTML színkódjában minden hexadecimális számot két karakteresre kell kitölteni. azt nem tudjuk meghatározni. Kimenetül "#111"-et kapnánk. A kitöltõ paraméter közvetlenül az átalakító paramétert kezdõ százalékjelet követi. a kitöltõ paraméternek tartalmaznia kell egy szóköz karaktert. 36 ) // azt írja ki.Karakterláncok kezelése Bár a típusparaméterrel a decimális számokat hexadecimálissá alakíthatjuk. hogy az egyes paraméterek kimenete hány karaktert foglaljon el. ahány karakteresre szeretnénk a kimenetet bõvíteni. 36 ) // a kimenet "0036" lesz printf( "%04d". 323 17 A kitöltõ paraméter Beállíthatjuk. amelyet a kimenet elvárt karakterszáma követ: printf( "% 4d". hogy a kimenet bizonyos karakterekkel megfelelõ szélességûre töltõdjön ki. A bevezetõ nullák használatát egy kitöltõ paraméter segítségével biztosíthatjuk. $zold. a kitöltõ paraméterben a 0 karaktert az a szám követi.

Ha szóközön vagy nullán kívül más karaktert szeretnénk a kitöltéshez használni.324 17. Ha a kimenet két karakternél rövidebb. header("Content-type: text/plain"). $kek = 1. melyekkel a korábbi HTML kódot kiegészíthetjük. $kek ). 36 ) // azt írja ki "xx36" Most már rendelkezésünkre állnak azok az eszközök. hogy a megfelelõ módon mûködjön. a hiányt bevezetõ nullák pótolják. hogy "#010101" Most már minden változó hexadecimális számként fog megjelenni. mivel a kimenet megkezdésekor a válasz fejrészét már elküldtük a böngészõnek. $piros. // azt írja ki. $zold = 1. a kitöltõ paraméteren belül a kitöltõ karakter elé írjunk egyszeres idézõjelet: printf( "%'x4d"." Ha teljes dokumentumot szeretnénk szövegként megformázni. printf( "#%02X%02X%02X". a header() függvényt használhatjuk a dokumentumtípus (Content-Type) fejlécének módosításához. <pre> <?php print "A ?> </pre> szóközök láthatóvá válnak. Eddig ugyan már át tudtuk alakítani a három számot. Ne feledjük. óra Bár a HTML dokumentumokban egymás után szereplõ több szóközt a böngészõk nem jelenítik meg. hogy programunk nem küldhet semmilyen kimenetet a böngészõnek a header() függvényhívást megelõzõen. $zold. de nem tudtuk bevezetõ nullákkal kitölteni azokat: $piros = 1. a megjelenítendõ szöveg elé és után helyezett <PRE> címkével mégis biztosíthatjuk a szóközök és sortörések megjelenítését. .

printf("%20s\n". A balra igazítást a mezõszélesség paramétere elé tett mínuszjellel (-) érhetjük el. "CDk"). printf("%20s\n". printf("%20s\n". . ábrán a fenti kódrészlet eredményét láthatjuk. "Játékok"). hogy ha lebegõpontos számot írunk ki. Fontos megjegyezni. A következõ kódrészlet kimenete egy négyelemû felsorolás. 17 A 17. print "<pre>". hogy nem használunk helykitöltõ karaktereket). A szóközök láthatóvá tételéhez a kimenetet egy PRE elembe ágyazzuk. "Balra zárt"). Más szóval jobbra igazításkor a lebegõpontos számnak a tizedesponttól balra esõ része a mezõ bal oldali. A mezõszélesség paramétere egy olyan egész szám. printf("%20s\n". az igazítás csak a kimenetben levõ szám (ponttól jobbra levõ) tizedesrészére vonatkozik.Karakterláncok kezelése 325 A mezõszélesség meghatározása Meghatározhatjuk a kimenet által elfoglalt mezõ szélességét is. amelynek mezõszélessége 20 karakternyi.eddig tart a balra zárás\n". amely a százalékjel után következik az átalakító paraméterben (feltéve. "Magazinok"). ábra Igazítás a mezõszélességhez A kimenet alapértelmezés szerint a mezõn belül jobbra igazodik. print "</pre>". "Könyvek").2. printf ("%-20s|<. 17.2. túlsó végén marad.

Megjegyzendõ. A pontosságot meghatározó paraméter egy pontból és egy számból áll. ha decimális kimenet esetén kérünk kitöltést.326 17.2f\n". 17. így azt tanácsoljuk. Példa ' 4' Mezõszélesség paraméter Pontosság paraméter '20' '. Meghatározza az eredmény adattípusát. táblázatban az átalakító paramétereket foglaljuk össze. A formázandó karakterlánc méretét adja meg. A PHP 4-ben a pontosság paraméterének nincs semmilyen hatása a decimális kimenetre. hogy a kétszeres pontosságú számokat hány tizedesre kell kerekíteni. ha a kimenet f típusparaméterû: printf ("%. Meghatározza. 5. Ez fõleg a pénznem átváltásakor szokott fontos lenni.2. hogy a két (kitöltõ és mezõszélesség) paraméter együttes használata bonyolult. Átalakító paraméterek (Ismétlés) A 17. // azt írja ki. A megadott szám határozza meg. egyszerre csak az egyiket használjuk. hány tizedesre szeretnénk kerekíteni. Egész számok nullákkal való bevezetéséhez a kitöltõ paramétert kell használnunk. meghatározhatjuk a kerekítés pontosságát.2.333333).4' Típusparaméter 'd' . óra A pontosság meghatározása Ha az adatot lebegõpontos formában szeretnénk megjeleníteni. Ez a paraméter csak akkor érvényes. és közvetlenül a típusparaméter elé kell írni. hogy "5. táblázat Az átalakítás lépései Név Kitöltõ paraméter Leírás A kimenet által elfoglalandó karakterszámot és a kitöltésre használt karaktert adja meg.33" A C nyelv printf() függvényében akkor is lehetõségünk van a pontosság megadására.

program Termékárlista formázása a printf() függvénnyel 1: <html> 2: <head> 3: <title>17. Ezt úgy érjük el. Ebben a mezõben egy karakterlánc típusú paramétert helyezünk el. 8: "Gyertyatartó" => "4".2. "Név". $kulcs. 9: "Kávézóasztal" => "80.2f\n". 12: printf("%-20s%23s\n". 14: foreach ( $termekek as $kulcs=>$ertek ) 15: printf( "%-20s%20. 327 17. .2. A printf() elsõ meghívása a következõ formázó karakterláncot adja meg: "%-20s%23s\n" Az elsõ átalakító meghatározás ("%-20s") a mezõszélességet balra zárt 20 karakteresre állítja. Két átalakító meghatározást használunk. hogy egy üres karakterláncot kitöltõ paraméterrel jelenítünk meg.Karakterláncok kezelése A 17.4". hogy a szóközöket és a soremeléseket értelmezze. "Ár"). 11: print "<pre>". A printf() függvénynek ez a meghívása hozza létre leendõ táblázatunk fejlécét. program a printf() használatával egy termékárlistát hoz létre. A második meghatározás ("%23s") egy jobbra zárt mezõszélességet ad meg. 17: ?> 18: </body> 19: </html> 17 Elõször a termékek nevét és árát tartalmazó tömböt adjuk meg. 16: print "</pre>". ""). $ertek ). 13: printf("%'-43s\n". amely végiglépked a termékek tömbjén.2. program Termékárlista formázása a printf() függvénnyel</title> 4: </head> 5: <body> 6: <?php 7: $termekek = Array("Zöld karosszék"=>"222. A printf() második meghívásával egy 43 karakter hosszú.6" 10: ). mínuszjelekbõl (-) álló vonalat húzunk. Egy PRE elemmel jelezzük a böngészõnek. A printf() legutolsó meghívása annak a foreach utasításnak a része.

hogy eredménye programunk számára nem elérhetõ. program eredményét láthatjuk. óra Az elsõ ("%-20s") a termék nevét írja ki egy 20 karakteres mezõbe. viszont az eredményét egy karakterláncban adja vissza. . 23. balra igazítva. ábrán a 17. majd az fputs() függvénnyel fájlba írjuk. ami azzal jár. amelyet aztán késõbbi használatra egy változóba helyezhetünk. A másik ("%20. A sprintf() függvény egy lehetséges felhasználása. print "Még $kerek forintot költhetsz".3.3. A 17. hogy vele a megformázott adatot fájlban lehet tárolni. ábra Termékárlista formázása a printf() függvénnyel Formázott karakterlánc tárolása A printf() az adatokat a böngészõben jeleníti meg. a visszaadott értékét egy változóban tároljuk. 17.34454). hogy az eredmény egy 20 karakteres mezõben jobbra igazítva jelenjen meg. A következõ kódrészlet a sprintf() függvény segítségével egy lebegõpontos értéket két tizedesre kerekít és az eredményt a $kerek változóban tárolja: $kerek = sprintf("%. hogy elõször meghívjuk a sprintf() függvényt.2f") a mezõszélesség paraméterrel azt biztosítja.2f". a pontossági paraméterrel pedig azt.2. amelynek használata megegyezik a printf() függvényével. Ennek az a módja. Használhatjuk azonban a sprintf() függvényt is.328 17. hogy a megjelenített kétszeres pontosságú érték két tizedesre legyen kerekítve.

A karakterláncok többféle forrásból is érkezhetnek. // azt írja ki. mint a tömb elemeit – 0-tól kezdve számozzuk. Ez a függvény például kimondottan jól jöhet a felhasználó által megadott bemenet hosszának ellenõrzésére. Szöveg hosszának megállapítása az strlen() függvénnyel Az strlen() függvény segítségével megállapíthatjuk egy karakterlánc hosszát. hogy ezekrõl a külsõ forrásból érkezõ adatokról többet tudjunk meg. Egy karakterláncot elképzelhetünk egy karakterekbõl álló tömbként is. amely a függvénynek átadott változó karaktereinek száma. A következõ kódrészlettel ellenõrizhetjük. . mint egy tömb elemeihez: $proba = "gazfickó". A függvény bemenete egy karakterlánc. megköszönjük a felhasználónak. // azt írja ki. amelyekkel dolgozunk. de a tömböknél még gyakrabban találkozhatunk vele. hogy rendelkezésünkre bocsátotta. mint azt gondolnánk. Valójában a karakterláncok és a tömbök nem állnak olyan messze egymástól. 17 Szövegek indexelése A karakterláncokkal kapcsolatban gyakran használjuk az indexelés szót. érkezhetnek adatbázisokból. print $proba[0]. beviheti a felhasználó.Karakterláncok kezelése 329 Részletesebben a karakterláncokról Nem minden esetben tudunk mindent azokról az adatokról. Ennek megfelelõen a karakterláncok egyes karaktereihez ugyanúgy férhetünk hozzá. hogy a tagnyilvántartó azonosító négykarakteres-e: if ( strlen( $tagazonosito ) == 4) print "Köszönöm!". hogy amikor egy karakterláncon belüli karakter indexérõl vagy helyérõl beszélünk. hogy "z" Ne felejtsük el. else print "Az azonosítónak négykarakteresnek kell lennie<P>". A tömbökkel kapcsolatos félreértések elkerülése érdekében a PHP 4 bevezette a $proba{0} formát is erre a célra. hogy "g" print $proba[2]. más esetben hibaüzenetet jelenítünk meg. akkor a karaktereket – ugyanúgy. visszatérési értéke pedig egy egész szám. A PHP 4 több függvénye segítségünkre lehet abban. Ha a $tagazonosito globális változó értéke négykarakteres. fájlokból és weboldalakról.

és a karakterlánc.és nagybetûket. ellenkezõ esetben a függvény a forrásláncból a keresett karakterlánccal kezdõdõ részt adja vissza. mégpedig azt az indexet megadó egész szám. . így a szokványos üzenet kerül a böngészõhöz. "mz") === 0 ) print "Üdv. hogy egy karakterlánc megtalálható-e beágyazva egy másik karakterláncban. használjuk az stristr() függvényt. Ez true (igaz) eredménynek számít. Bemenetét két paraméter képezi. Ha vagy AB-t. if ( strstr( $tagazonosito. óra Szövegrész megkeresése az strstr() függvénnyel Ezzel a függvénnyel azt állapíthatjuk meg. amelytõl kezdve keresni szeretnénk. amelyben keresünk. viszont nem különbözteti meg a kis. A következõ programrészletben az strpos() függvénnyel gyõzõdünk meg arról. a visszatérési érték false (hamis) lesz. hogy egy karakterlánc az mz karakterekkel kezdõdik-e: $tagazonosito = "mz00xyz". így nem találja meg az AB karakterláncot. melynek mûködése azonos az strstr()-ével. a függvény a false (hamis) értéket adja vissza. azaz azt a karakterláncot. Az if utasítás feltétele nem válik igazzá. így egy különleges üzenetet ír ki. ha a felhasználó a "pab7" karakterláncot adja meg? Az strstr() megkülönbözteti a kis. A következõ példában megkülönböztetetten kezeljük azokat a tagazonosítókat. Mi történik akkor. mz.".330 17. Ne feledje. és ha igen. Ezek mellett létezik még egy harmadik. Ha a keresett karakterlánc nem található. hogy tagsága hamarosan lejár!". vagy ab-t szeretnénk kerestetni a szövegben. Mivel a $tagazonosito változó tartalmazza az AB karakterláncot. Az strstr() függvény két paramétert kap bemenetéül: a keresendõ szöveget és a forrásláncot. ellenkezõ esetben azt az egész számot. Ha a keresett karakterlánc nem található a szövegben. amelyekben megtalálható az AB karakterlánc: $tagazonosito = "pAB7". "AB" ) ) print "Köszönöm. mely indextõl a keresett szöveg kezdõdik. az strstr() az AB7 karakterláncot adja vissza. hogy egy szöveg megtalálható-e egy másik szöveg részeként. nem kötelezõ paraméter. Részlánc elhelyezkedésének meghatározása az strpos() függvénnyel Az strpos() függvény segítségével kideríthetjük. else print "Köszönöm!". hol. amelyet keresünk. a forráslánc.és nagybetûket. if ( strpos($tagazonosito. amelyben keresnie kell.

// azt írja ki "fickó" print substr($proba. akiknek e-mail címe . Karakterlánc elemekre bontása az strtok() függvénnyel Az strtok() függvénnyel karakterláncok szintaktikai elemzését végezhetjük. majd a változó–érték párokat bontja szét. Harmadik. hogy 0 értéket ad vissza. A 17.hu-val végzõdik.Karakterláncok kezelése Vegyük szemügyre azt a trükköt. A 17. . program egy URL-t bont elemeire: elõször leválasztja a gazdagépet és az elérési útvonalat a karakterláncról.hu" ) print "Ne felejtse el magyar vásárlóinknak járó speciális ajánlatainkat!". Bemenetét két paraméter képezi. ábrán láthatjuk. $cim = "felhasznalo@szolgaltato. amely alapján a karakterláncot felbontja. az elemzendõ karakterláncot és egy határolójelet. nem kötelezõ paramétere egy egész szám. amellyel a kívánt eredményt kaptuk. A függvény legelsõ meghívásakor két paramétert vár.3. A függvény elsõ meghívásakor átmenetileg a memóriába helyezi a teljes forrásláncot. amely a visszaadandó szöveg hosszát jelenti. Ha ezt is megadjuk. program eredményét a 17. ami viszont a kifejezés kiértékelése során hamis értéket eredményezne. print substr($proba. A függvény az összes karaktert visszaadja a kezdõindextõl a forráslánc végéig. else print "Üdvözöljük üzletünkben!". Ezt a függvényt legtöbbször cikluson belül használjuk.3. $proba = "gazfickó". 331 17 Szövegrészlet kinyerése a substr() függvénnyel A substr() függvény egy kezdõindextõl kezdve meghatározott hosszúságú karakterláncot ad vissza. Az strpos() megtalálja az mz karaktersort a lánc elején. A következõ kódrészlet meghatározott üzenetet ír ki azoknak. a PHP 4 új azonosság mûveleti jelét (===) alkalmazzuk.3.4). így a további meghívások alkalmával már csak a határolójelet kell megadnunk. Az strtok() minden meghívásakor a következõ megtalált elemet adja vissza. Hogy ezt elkerüljük.3). -3 ) == ". amely akkor ad vissza true (igaz) értéket. hanem a végétõl. ha bal és jobb oldali operandusa egyenlõ értékû és azonos típusú is egyben. Ez azt jelenti. a karakterlánc végére érkezést a false (hamis) érték visszaadásával jelzi. az egyik a forráslánc.3. a másik a kezdõindex. A határolójel tetszõleges számú karakterbõl állhat.hu" if ( substr( $cim. a függvény csak a meghatározott mennyiségû karaktert adja vissza a kezdõindextõl számítva. a függvény nem a karakterlánc elejétõl számolja a karaktereket. // azt írja ki "fick" Ha kezdõindexként negatív számot adunk meg.

3. Azért ellenõrizzük a visszaadott érték típusát. $szo = strtok( $hatarolo ). Így. $szo = strtok( $proba.3. A while ciklus feltételében azt ellenõrizzük.332 17. while ( is_string( $szo ) ) { if ( $szo ) print "$szo<br>". tudhatjuk.xp? OP=dnquery. } ?> </body> </html> Az strtok() függvény önmagában nem sok mindent támogat. Elõször a $hatarolo változóban tároljuk a határolójelet.xp&ST=MS&DBS=2&QRY=developer+php". ha a függvény még nem érte el a forráslánc végét. program Karakterlánc elemekre bontása az strtok() függvénnyel 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: <html> <head> <title>17.deja. még akkor is. Meghívjuk az strtok() függvényt. az alábbi példában látható szokványosabb próbálkozás sikertelen lesz. program Karakterlánc elemekre bontása az strtok() függvénnyel</title> </head> <body> <?php $proba = "http://www. hogy a $szo karakterlánc-e. hogy elértük az URL végét és a feladat befejezõdött. ha a $szo egy üres karakterlánc. az strtok() az elsõ határolójel elérésekor üres karakterláncot ad vissza. $hatarolo ). mert ha egy karakterlánc egy sorában két határolójel van.com/qs. óra 17. Az elsõ eredményt a $szo változóba helyezzük. így csak különféle trükkökkel bírhatjuk igazán hasznos munkára. átadjuk neki az elemzendõ URL-t és a $hatarolo karakterláncot. Ha nem az. mivel a while feltétele hamissá válik: while ( $szo ) { $szo = strtok( $hatarolo ). } . $hatarolo = "?&".

tabulátorjel. hogy a $szo változó karakterláncot tartalmaz.Karakterláncok kezelése Ha meggyõzõdtünk róla. Vegyük észre. elkezdhetünk dolgozni vele. mivel ott a chop() függvény egy kicsit más jelentéssel bír. Aztán újra meg kell hívnunk a strtok() függvényt. megjelenítjük a böngészõben. Bemenete a megtisztítandó szöveg. újra a forráslánc elsõ szavát találná meg. print $szoveg // azt írja ki. Elképzelhetõ. szóköz stb. amely az elválasztó karaktereket csak a karakterlánc elejérõl távolítja el. ha Perl ismeretekkel is rendelkezünk. kimenete pedig az elválasztó karakterektõl csupán a bal oldalán mentes karakterlánc: . hogy a második alkalommal nem adtuk át a függvénynek a forrásláncot. hogy az adat elõtt vagy után nincs egy vagy több fölösleges elválasztó karakter. Persze lehet. így végtelen ciklusba kerülnénk. hogy a $szo változót újabb karakterlánccal töltse fel a következõ kiértékeléshez. Vigyázzunk. $szoveg = "\t\t\teléggé levegõs ez a szöveg ". bemenete az átalakítandó szöveg. Ha ezt mégis megtennénk. $szoveg = "\t\t\teléggé levegõs ez a szöveg $szoveg = trim( $szoveg ). Ahogy az elõzõeknél is. sohasem lehetünk biztosak benne. A probléma áthidalására a PHP fejlesztõi ugyanezen szolgáltatás eléréséhez megadták az rtim() függvénynevet is. Ha a $szo nem üres karakterlánc. hogy ez a túlbuzgó függvény nem a legmegfelelõbb számunkra. hogy a szöveg elején levõ elválasztó karaktereket meg szeretnénk tartani és csak a szöveg végérõl akarjuk eltávolítani azokat. A trim() függvény ezeket az elválasztó karaktereket (soremelés. hogy " eléggé levegõs ez a szöveg" Lehetõségünk van az ltrim() függvény használatára is. $szoveg = chop( $szoveg ). kimenete pedig a megtisztított. print $szoveg // azt írja ki.) hagyja el a karakterlánc elejérõl és végérõl. 333 17 A karakterláncok kezelése A PHP 4 a karakterlánc paraméterek kisebb-nagyobb átalakításához számos függvényt biztosít. Pontosan erre a feladatra találták ki a chop() függvényt. Szöveg tisztogatása a trim() típusú függvényekkel Ha egy felhasználótól vagy fájlból kapunk információt. hogy "eléggé levegõs ez a szöveg" ".

334 17. ."2000". print "Az új tagnyilvántartó azonosító: $tagazonosito<p>". " Karakterlánc részének lecserélése a substr_replace() függvénnyel A substr_replace() hasonlóan mûködik. 2 ). a különbség abban rejlik. $tagazonosito = substr_replace( $tagazonosito. A következõ példában egy karakterláncban az 1999 összes elõfordulását 2000-re cseréljük: $karakterlanc = "Ezt az oldal 1999-ben szerzõi jog által védett". A következõ kódrészletben egy felhasználó tagazonosítójának megújításához le kell cserélnünk annak harmadik és negyedik karakterét: <? $tagazonosito = "mz99xyz". hogy "Az új tagnyilvántartó azonosító: mz00xyz" ?> Az összes részlánc lecserélése az str_replace() függvénnyel Az str_replace() függvény a keresett karakterlánc-rész összes elõfordulását lecseréli egy másik karakterláncra. mint a substr(). óra $szoveg = "\t\t\teléggé levegõs ez a szöveg $szoveg = ltrim( $szoveg ). Bemenetének három paramétere a lecserélendõ karakterlánc.$karakterlanc). és a teljes átalakított karakterláncot adja vissza. print str_replace("1999". $karakterlanc . A substr_replace() függvény megtalálja a kezdõindex és a hosszúság paraméter által meghatározott részláncot. a csereszöveg és a forrásszöveg. negyedik hosszúság paraméter is. a csereszöveget és a kezdõindexet. hogy "eléggé levegõs ez a szöveg ". lecseréli azt a csereszövegre. 2. "00". Ezek mellett létezik egy nem kötelezõ.= "Felsõoktatási tájékoztató 1999". // azt írja ki. hogy itt lehetõség nyílik a kivonatolt karakterlánc-részlet lecserélésére is. A függvény kimenete az átalakított karakterlánc. A függvény három paramétert vár: az átalakítandó karakterláncot. print $szoveg // azt írja ki.

$teljes_nev = ucwords( strtolower($teljes_nev) ). Ennek egyetlen bemenete az átalakítandó szöveg és a csupa kisbetûs karakterláncot adja vissza: $honlap_url = "WWW. A következõ programrészletben a felhasználó által beírt karakterláncban a szavak elsõ betûjét nagybetûre cseréljük: $teljes_nev = "vitéz tinódi lantos sebestyén". print $teljes_nev. print $honlap_url. hiszen a tüneti kezelés eredménye "ViTÉz TINóDi LaNtos SEBeSTyéN" lesz. $tagazonosito = strtoupper( $tagazonosito ). hogy "ViTÉz tINóDi laNtos sEBeSTyéN". print $teljes_nev.és nagybetûk cseréjében. // azt írja ki. ez a függvény nem sokban lesz segítségére. “http://” ) === 0 ) ) $honlap_url = "http://$honlap_url". fontos lehet mindent csupa nagybetûsre vagy csupa kisbetûsre alakítani.hu" A PHP-nek van egy nagyszerû. if ( ! ( strpos ( $honlap_url. Az strtoupper() függvény segítségével egy karakterláncot csupa nagybetûsre alakíthatunk.Karakterláncok kezelése 335 Kis. hogy "Vitéz Tinódi Lantos Sebestyén" A függvény kizárólag a szavak elsõ betûjét cseréli le. hogy "MZ00XYZ" Karakterláncunk csupa kisbetûssé való alakításához használjuk az strtolower() függvényt. hogy "http://www. $teljes_nev = ucwords( $teljes_nev ). az ucwords(). „tüneti kezelést” biztosító függvénye. így ha a felhasználónak nehézségei vannak a SHIFT billentyûvel és azt írta be. print "$tagazonosito<P>".kiskapu. visszatérési értéke pedig a csupa nagybetûs karakterlánc: $tagazonosito = "mz00xyz". $honlap_url = strtolower( $honlap_url ). // azt írja ki.és nagybetûk közti váltás A PHP több függvénnyel is segítségünkre van a kis.HU". hogy "Vitéz Tinódi Lantos Sebestyén" 17 . hogy az ucwords() meghívása elõtt az strtolower() függvénnyel elõször csupa kisbetûssé alakítjuk a karakterláncot: $teljes_nev = "ViTÉz tINóDi laNtos sEBeSTyéN". hogy aztán könnyebben összehasonlíthatóak legyenek. Ezen úgy segíthetünk. A függvény egyetlen bemenete az átalakítandó szöveg.KISKAPU. Amikor felhasználók által beírt adattal dolgozunk. // azt írja ki. // azt írja ki. Ez a függvény egy karakterlánc minden szavának elsõ betûjét teszi nagybetûssé.

amelyek egyrészt átalakítják. . ezek együtt fogják alkotni a határolójelet. Ez a függvény azonban egy karakterláncot tömbbé bont fel. A nemzeti beállítások testreszabására használható setlocale() függvényt kell alkalmaznunk. ahol a megadott karakterlánc minden karaktere egy-egy önálló határolójel lesz. ami alapján fel szeretnénk bontani a forrásláncot. ltrim() vagy a chop() függvénnyel. // $datum_tomb[0] == "2000" // $datum_tomb[1] == "12" // $datum_tomb[2] == "00" Összefoglalás A PHP külvilággal való kapcsolattartása és adattárolása leginkább karakterláncokon keresztül valósul meg. Végül azokról a függvényekrõl tanultunk. Karakterláncok tömbbé alakítása az explode() függvénnyel A mókásan „robbantó”-nak nevezett függvény bizonyos mértékben hasonló az strtok() függvényhez. rendezhetünk. a másik maga a forráslánc. valamint egy karakterlánc összes elõfordulását lecseréltethetjük az str_replace() segítségével. Most már el tudjuk tüntetni az elválasztó karaktereket a trim().12. óra Fel kell.336 17. hogy a magyar szövegekkel az ékezetes betûk miatt alapbeállításban problémáink akadhatnak. ez egyik egy határolójel. amelyek információt árulnak el a karakterláncokról. amit aztán tárolhatunk. Bemenetét két paraméter alkotja. A printf() és az sprintf() függvények segítségével megtanultuk formázni a karakterláncokat. válthatunk a kis. Az órán a programjainkban levõ karakterláncok kezelésével ismerkedtünk meg. $datum_tomb = explode(". vagy kiszakíthatunk részláncokat az strtok() segítségével. vagy azt tehetünk vele. $kezdet). Tanultunk olyan függvényekrõl. az strtolower() és az ucwords() függvényekkel.01". amelyek karakterláncokat alakítanak át.". amit csak szeretnénk. (Ez eltér az strtok() függvény mûködésétõl. hogy a kívánt eredményt elérjük. Ezt a két függvényt olyan karakterláncok létrehozására használjuk.és nagybetûk között az strtoupper().) A következõ kódrészlet egy dátumot bont fel részeire és az eredményt egy tömbben tárolja: $kezdet = "2000. hogy hívjuk a kedves olvasó figyelmét arra. Meg tudjuk állapítani egy karakterlánc hosszúságát az strlen(). A határolójel több karakterbõl is állhat. másrészt el is rendezik az adatokat. egy részlánc jelenlétét az strpos() függvénnyel.

amelyek a karakterlánckezelés még hatékonyabb formáját biztosítják. kérdésben átalakított számot nullákkal úgy. de még mindig nem végeztünk a karakterláncokkal.php címen található.Karakterláncok kezelése Ezek után nehéz elhinni.net/manual/ref. ha közöljük a böngészõvel. hogy a tizedespont elõtti (attól balra esõ) rész 4 karakter hosszúságú legyen? 3. Kvíz 1. Ez a legjobb módja a formázott szöveg megjelenítésének a böngészõben? A <PRE> címkék akkor szükségesek. Milyen átalakító paramétert használnánk a printf() függvényben egy egész szám lebegõpontos számként való megformázására? 2. ha a sima szöveg (plain text) formázást HTML-es környezetben is meg szeretnénk tartani. 337 17 Kérdések és válaszok Vannak még egyéb hasznos karakterlánc-függvények? Vannak. A printf() mûködését bemutató példában a formázást úgy jelenítettük meg. Hogyan kerekítenénk az elõzõ kérdés lebegõpontos számát két tizedesjegyre? 4. A válaszokat az A függelékben helyeztük el. A PHP ugyanis támogatja a szabályos kifejezéseket.strings. a legokosabb. Mûhely A mûhelyben kvízkérdések találhatók. amelynek megfelelõ része a http://php. melyek segítenek megszilárdítani az órában szerzett tudást. Hogyan egészítsük ki az 1. Ha viszont a teljes dokumentumot így szeretnénk megjeleníteni. hogy a kimenetet <PRE> elemek közé tettük. hogy sima szövegként formázza meg azt. Ez a header() függvénnyel érhetõ el: Header("Content-type: text/plain"). A PHP több mint 60 ilyen függvénnyel rendelkezik! Ezekrõl a PHP 4 kézikönyvében olvashatunk. Milyen függvényeket használnánk egy részlánc más karakterláncon belüli kezdetének meghatározására? . Milyen függvényeket használnánk egy szöveg hosszának kiderítéséhez? 5. A szabályos kifejezések alkotják a következõ óra anyagát.

. Hogyan bontanánk fel egy határolójelekkel elválasztott karakterláncot tömbökre? Feladatok 1.338 17. óra 6. Ellenõrizzük. amely a felhasználó nevét és e-mail címét kéri be. Milyen függvényeket használnánk arra. Léptessünk végig a tömbön és kerekítsük az összes lebegõpontos számot két tizedesjegyre. Hogyan távolíthatjuk el az elválasztó karaktereket egy karakterlánc elejérõl? 8. ha nem. Hozzunk létre egy olyan vélemény-visszajelzõ ûrlapot. Hogyan alakítanánk át egy karakterláncot csupa nagybetûsre? 9. majd jelenítsük meg az eredményt a böngészõben. Használjuk a kis. 2. Hozzunk létre egy lebegõpontos és egész számokból álló tömböt.és nagybetûket átalakító függvényeket a nevek elsõ betûjének nagybetûsítésére. Igazítsuk jobbra a kimenetet egy 20 karakter szélességû mezõben. hogy egy szövegbõl kivonjuk annak egy darabját? 7. hogy a cím tartalmaz-e @-jelet. figyelmeztessük a felhasználót.

Mindkettõvel meg fogunk ismerkedni.18. Egyrészt támogatja a Perl által használtakat. inkább használjuk a hagyományos karakterlánc-kezelõ függvényeket. ÓRA A szabályos kifejezések használata A szövegek vizsgálatának és elemzésének nagyszerû módja a szabályos kifejezések (regular expressions) használata. hogy egy karakterláncon belül mintákat keressünk. Így azt tanácsoljuk. a találatokat pedig rugalmasan és pontosan kapjuk vissza. Mivel hatékonyabbak az elõzõ órában tanult karakterlánc-kezelõ függvényeknél. Az óra során a következõkrõl tanulunk: • Hogyan illesszünk mintát egy karakterláncra a szabályos kifejezések segítségével? • Mik a szabályos kifejezések formai követelményei? . A PHP a szabályos kifejezések két típusát támogatja. lassabbak is azoknál. hogy ha nincs különösebb szükségünk a szabályos kifejezések által biztosított hatékonyságra. Ezek lehetõvé teszik. másrészt a korlátozottabb tudású POSIX szabályos kifejezés formát. az azoknak megfelelõ függvényekkel.

mert a POSIX bõvített szabályos kifejezés (extended regular expression) szabványát követik. és egy tömbváltozó. Felmerülhet a kérdés. Használatuk elsajátítása így jóval többet jelent annál. A szabályos kifejezések olyan jelegyüttesek. hogy egy szövegben bonyolult mintákat keressünk és cseréljünk le. Ezeket általában egyszerûen szabályoskifejezés-függvényeknek szokták nevezni. Az ismerkedést a függvényekkel kezdjük és rajtuk keresztül vezetjük be az olvasót a szabályos kifejezések formai követelményeibe. milyen esetben lehet ez hasznos. amelyek egy szövegben egy mintára illeszkednek. A $tomb változó elsõ elemében a megtalált karakterlánc lesz. print ereg("tt". másrészt azért. amit aztán a böngészõben megjelenítünk.és kimeneti paramétereit. a false (hamis) értéket adja vissza. amely a megtalált minta illeszkedõ karaktereinek számát adja meg. hogy megkülönböztethessük õket a hasonló. amiben keresünk. A pontot (. ám hatékonyabb Perl típusú szabályos kifejezésektõl. hogy megtanuljuk a PHP szabályoskifejezés-függvényeinek be. print "<br>$tomb[0]<br>". Minta keresése karakterláncokban az ereg() függvénnyel Az ereg() bemenete egy mintát jelképezõ karakterlánc. egy karakterlánc. illetve ha a függvény nem találja meg a mintát. Nem kell azonban mindig elõre meghatározott karaktereket keresnünk.340 18. ezért az ereg() 2-t ad vissza. ez az illeszkedõ betûk száma. $tomb). hogy mi a keresett minta. egyrészt azért. hiszen elõre tudjuk. Keressük a "tt"-t az "ütõdött tánctanár" karakterláncban. A függvény egy egész számot ad vissza. óra • Hogyan cseréljünk le karakterláncokat szabályos kifejezésekkel? • Hogyan keressünk és cseréljünk le mintákat egy szövegben a hatékony Perl típusú szabályos kifejezésekkel? A POSIX szabályos kifejezések függvényei A POSIX szabályos kifejezéseket kezelõ függvények lehetõvé teszik. mi azonban POSIX szabályoskifejezés-függvényekként utalunk rájuk.) használhatjuk tetszõleges karakter keresésekor: . // a kimenet: // 2 // tt A "tt" az "ütõdött" szóban megtalálható. amelyben a keresés eredményét tároljuk. "ütõdött tánctanár".

} a{. hogy ez a szabályos kifejezés annyi karakterre illeszkedik. "ütõdött tánctanár". 18.n} {n1.1. hogy az "a"-nak legalább egyszer elõ kell fordulnia. // azt írja ki."aaaa". amely megfelel annak a meghatározásnak.n2} Leírás Nulla vagy több elõfordulás Egy vagy több elõfordulás Nulla vagy egy elõfordulás n elõfordulás Legalább n elõfordulás Legfeljebb n elõfordulás Legalább n1 és legfeljebb n2 elõfordulás Példa a* a+ a? a{3} a{3. print "<br>$tomb[0]<br>". minta illeszkedik minden olyan szövegre. $tomb) ) print $tomb[0]. egy mennyiségjelzõvel (kvantorral) határozhatjuk meg. hogy „egy d betû és egy azt követõ tetszõleges karakter”. amit 0 vagy több "a" betû követ.A szabályos kifejezések használata print ereg("d. $tomb). Próbáljuk ki: if ( ereg("a+".2} Erre illeszkedik xxxx xaax xaxx xaaa aaaa xaax xaax Erre nem illeszkedik (Mindenre illeszkedik) xxxx xaax aaaa aaxx aaax xaaa .". táblázat az ismétlõdõ karakterek keresésére szolgáló mennyiségjelzõket ismerteti. 341 18 Egynél többször elõforduló karakter keresése mennyiségjelzõvel Amikor egy karakterláncban egy karaktert keresünk. hányszor forduljon elõ a karakter a mintában. A 18. táblázat Az ismétlõdõ karakterek mennyiségjelzõi Jel * + ? {n} {n.2} a{1. // a kimenet: // 2 // dö A d. hogy "aaaa". így a $tomb[0] értéke máris értelmet nyer. mi lesz a második karakter. Az a+ minta például azt jelenti.} {. Ebben az esetben nem tudjuk elõre. Vegyük észre. amennyire csak tud.1.

tetszõleges típusú karakterláncot kereshetünk. ezzel megoldottuk a feladatot. $proba = "A ttXGDH99 tagunk befizette már a tagsági díjat?". hogy egy szóköz legyen az utolsó karakter. Vegyünk egy példát. hogy a t és a 99 közötti karakterek kizárólag betûk vagy számok és egyikük sem szóköz. a négy nagybetût pedig megtalálja a . . hányszor ismétlõdjön egy adott karakter. majd a 99-es szám zárja. pedig még attól meglehetõsen távol állunk. Egy érvényes azonosítóban egy és négy közötti alkalommal fordul elõ a "t". A feltételek között a 99-cel való végzõdést azzal próbáltuk biztosítani. hogy annyi karakterre illeszkednek.*. hogy ha a forráslánc "Azonosítóm ttXGDH99 megkaptad már az 1999 -es tagsági díjat?" akkor a fenti szabályos kifejezés a következõ karakterláncot találná meg: "tóm ttXGDH99 megkaptad már az 1999" Mit rontottunk el? A szabályos kifejezés megtalálta a t betût az azonosítóm szóban. Az alsó és felsõ határt a kapcsos zárójelen belül határozzuk meg. hogy a tennivalókat tartalmazó naplóból emeljük ki a tagazonosítókat. hogy "A megtalált azonosító: ttXGDH99" Az elõzõ kódrészletben a tagazonosító két t karakterrel kezdõdik. Úgy tûnik. amellyel tetszõleges számú. a 99-re végzõdõ azonosító helyett. Egy klub tagsági azonosítóval jelöli tagjait. $tomb ) ) print "A megtalált azonosító: $tomb[0]". A hibát kijavíthatjuk. Ezt aztán találat esetén vissza is kaptuk. ÚJDONSÁG A korlát határozza meg. Segítségükkel határozhatjuk meg. $proba. óra A kapcsos zárójelben levõ számok neve korlát. hogy a minta érvényes legyen rá. Például az a{4. Jellemzõ a szabályos kifejezések „mohóságára”.*99 ". hogy megadtuk. Emiatt történt. hogy a minta egészen az 1999-ig illeszkedett. A t{1. if ( ereg( "t{1. majd végül a 99 jön.342 18.5} kifejezés az a négynél nem kevesebb és ötnél nem több elõfordulására illeszkedik. Még ennél is nagyobb baj. ezt négy nagybetû követi. Az ilyen feladatokat egyszerûsítik le a karakterosztályok. amennyire csak tudnak.4}.4} minta illeszkedik a két t-re. A klub arra kért fel bennünket. ha biztosan tudjuk. ezt tetszõleges számú szám vagy betû karakter követi. hogy egy karakternek vagy karakterláncnak hányszor kell ismétlõdnie egy szabályos kifejezésben. majd utána a tetszõleges számú karaktert egészen a szóközzel zárt 99-ig. // azt írja ki.

amely alapján meggyõzõdhetünk. ha úgy javítunk a szabályos kifejezésen. a csúcsos ékezet (^) kezdõ szögletes zárójel után való írásával: az [^A-Z] mindenre illeszkedik. az [A-Z] tetszõleges nagybetûre. a szabályos kifejezés megint nem illeszkedik: $proba = "Azonosítóm ttXGDH99. // a szabályos kifejezés nem illeszkedik Ez azért van. Így ha egy szövegben az azonosító zárójelek közt van. a minta nem illeszkedik rá. Viszont ha az azonosító után a próba-karakterlánc végére vesszõt írunk. A karakterosztályok lehetõvé teszik. hogy karakterek meghatározott csoportját keressük. A karakterosztályokat „tagadhatjuk” is. A karakterosztály meghatározásához a keresendõ karaktereket szögletes zárójelek közé írjuk. a [0-9] pedig tetszõleges számjegyre illeszkedik. Karaktertartományokat is használhatunk karakterosztályok megadására: az [a-z] tetszõleges kisbetûre.A szabályos kifejezések használata 343 Karakterlánc keresése karakterosztályokkal Az eddigi esetekben megadott karakterekkel vagy a . amit a 99 zár. Az a karakterosztály. $proba. $proba. // azt írja ki. így végre az azonosítót kapjuk meg. hogy "A megtalált azonosító: ttXGDH99 " Szép lassan alakul. így az [ab]+ az aaa. ami vagy a vagy b. Térjünk vissza legutóbbi példánkra. Az [ab] minta egyetlen betûre illeszkedik. mert a minta végén egy szóközt várunk el. hogy mindenre illeszkedjék. csak a nagybetûkre nem. megkaptad már az 1999 -es tagsági díjat?". Ezeket a sorozatokat és az egyedi karaktereket egyetlen karakterosztályba is gyúrhatjuk.4}[a-zA-Z0-9]*99 ". hogy elértük az azonosító végét. if ( ereg( "t{1. if ( ereg( "t{1. így az [a-z5] minta tetszõleges kisbetûre vagy az 5-ös számra illeszkedik.4}[a-zA-Z0-9]*99 ". $proba = "Azonosítóm ttXGDH99 megkaptad már az 1999 -es tagsági díjat?". amelyet tetszõleges számú betû vagy számjegy karakter követ. Közelebb visz a megoldáshoz. A karakterosztályokat meghatározásuk után karakterként kezelhetjük. Mintát kell illesztenünk egy 1 és 4 közötti alkalommal elõforduló betûre. már nem fog szóközökre illeszkedni. segítségével kerestünk karaktereket. $tomb ) ) print "A megtalált azonosító: $tomb[0]". $tomb ) ) print "A megtalált azonosító: $tomb[0]". csak szám és betû karakterekre nem: 18 . kötõjel vagy vesszõ követi. bbb és ababab karakterláncokra egyaránt illeszkedik. amit hozzáadtunk.

óra $proba = "Azonosítóm ttXGDH99. Az atomok kezelése ÚJDONSÁG Az atom egy zárójelek közé írt minta (gyakran hivatkoznak rá részmintaként is). A következõ kódrészletben meghatározunk egy mintát. $tomb ) ) print "$tomb[0]". A következõ kódrészletben egy IP címre illesztünk mintát. hiszen megköveteltük. $proba. Más szóval ugyanazt a 18. hogy utána még egy karakter legyen. ha az azonosító a karakterlánc legvégén van. zárójelezzük. de még mindig van két probléma. másrészt a szabályos kifejezés nem illeszkedik. if ( ereg( "t{1. így az ([ab]+x){2} illeszkedni fog az "abbaxaabax" karakterláncra. és az így kapott atomnak kétszer kell illeszkednie a keresendõ szövegre: $proba = "abbaxaabaxabbax". ahányszor csak akarjuk. Meghatározása után az atomot ugyanúgy kezelhetjük. // azt írja ki. if ( ereg( "([ab]+x){2}". Erre a problémára késõbb még visszatérünk. $proba. " Már majdnem kész is vagyunk. Ez azt jelenti.1. hogy a teljes találat mellett a megtalált minta egyes részeihez is hozzáférhetünk. Az ereg() függvénynek átadott tömbváltozó elsõ elemében kapjuk vissza a teljes. Az ezt követõ elemek az egyes megtalált atomokat tartalmazzák. megtalált. // azt írja ki. mintha maga is egy karakter vagy karakterosztály lenne. táblázatban bemutatott rendszer alapján felépített mintát annyiszor kereshetjük. megkaptad már az 1999 -es tagsági díjat?". hogy "abbaxaabax" Az [ab]+x illeszkedik az "abbax" és az "aabax" karakterláncokra egyaránt. hogy "A megtalált azonosító: ttXGDH99. $tomb ) ) print "A megtalált azonosító: $tomb[0]". hanem egyes alkotóelemeit is: .344 18. és nem csupán a teljes címet tároljuk.4}[a-zA-Z0-9]*99[^a-zA-Z0-9]". Egyrészt a vesszõt is visszakapjuk. illeszkedõ karakterláncot. Más szóval a szóhatárt kellene megbízható módon megtalálnunk.

Ezzel fejeztük ki. amely egyedi szereppel bír a szabályos kifejezésekben. 345 18 Elágazások A szûrõkarakter (|) segítségével mintákat összekötve a szabályos kifejezéseken belül elágazásokat hozhatunk létre. // azt írja ki.A szabályos kifejezések használata $ipcim = "158. A ^a illeszkedik az "alma". a szabályos kifejezés elejére írjunk egy csúcsos ékezetet (^).([0-9]+)\. egyszerû karakterként szeretnénk kezelni.([0-9]+)\.hu". $tomb ) ) print "ez egy $tomb[0] tartomány<BR>".([0-9]+)". } // Az eredmény: // 158.hu karakterláncot keressük: $domain = "www. a . hogy "ez egy . hogy a . Ha a mintát a karakterlánc kezdetére szeretnénk illeszteni.55.hu tartomány" A szabályos kifejezés helye Nemcsak a keresendõ mintát adhatjuk meg. $tomb ) ) { foreach ( $tomb as $ertek ) print "$ertek<BR>". hol illeszkedjen egy karakterláncban. karaktert itt minden különleges tulajdonsága nélkül.de|\. de nem illeszkedik a "banán" szóra.com|\. hogy dollárjelet ($) írunk a szabályos kifejezés végére.hu". hanem azt is. Az a$ illeszkedik a "róka". hogy a pontokat a szabályos kifejezésben fordított perjel elõzte meg.35 // 158 // 152 // 55 // 35 Vegyük észre. de nem illeszkedik a "hal" szóra. $ipcim.152.152. if ( ereg( "([0-9]+)\. A következõ kódrészletben a .com. A karakterlánc végén úgy illeszthetjük a mintát. if ( ereg( "\. Ettõl lesz a szabályos kifejezések nyelvtana még rugalmasabb.35". vagy a második mintára illeszkedõ karakterláncokat keresi meg. .egydomain. Egy kétágú szabályos kifejezés vagy az elsõ mintára. Minden olyan karakternél ez a követendõ eljárás.55. $domain.de vagy a .

hogy éppen a szöveg elején vagy végén található. Nem használhatjuk a szóközt. // azt írja ki. mivel a szavakat írásjelekkel is el lehet választani. általában egész könnyen értelmezhetõk. megkaptad már az 1999 -es tagsági díjat?". Az eredményt a $tomb tömb harmadik (2-es indexû) elemében találhatjuk meg. Elértük.és nagybetûket. Az ereg() megkülönbözteti a kis. de miután kisebb egységekre bontjuk azokat. $proba. ezt tetszõleges számú szám vagy betû karakter követi.346 18. $tomb ) ) print "A megtalált azonosító: $tomb[2]". Az sem lehet feltétel. használjuk az eregi() függvényt. amelyekben a "t" egy és négy közötti alkalommal fordul elõ. megadhatjuk feltételként. a feladat az volt. Emlékeztetõül. . melyekkel megoldhatjuk a tagazonosítás problémáját. amely egyébként minden más tekintetben megegyezik az ereg() függvénnyel. vagy pedig a karakterlánc vége. hogy illeszkedõ mintánknak szóhatárra kell esnie. hiszen a tagazonosító lehet. Ugyanezzel a gondolatmenettel adhatjuk meg a kód elején elõforduló szóhatárt is. hogy szövegeket elmezve kigyûjtsük azokat a tagazonosítókat. A zárójelek használatával a tagazonosítót minden központozás és szóköz nélkül kaphatjuk vissza: $proba = "Azonosítóm ttXGDH99. hogy a tagazonosítót vagy egy nem szám vagy betû karakter kövesse. hogy "A megtalált azonosító: ttXGDH99" Amint láthatjuk. hogy képesek vagyunk elágazásokat megadni és helyhez kötni a szabályos kifejezéseket. Mivel nem vagyunk kíváncsiak semmilyen. hogy mintánk egy szóhatárra illeszkedjen (pontosan úgy. a minta számunkra hasznos részét zárójelek közé írjuk. a szabályos kifejezések elsõre egy kicsit riasztók. hogy egy nem alfanumerikus karakter alkossa a határt.4}[a-zA-Z0-9]*99)([^a-zAZ0-9]|$)". Jelenlegi problémánk az. a mintát megelõzõ vagy követõ szövegre. amelyet a 99 zár. hogyan határozzuk meg. Ha nem szeretnénk megkülönböztetni õket. ahogy azt a feladat megkövetelte). Most. if ( ereg( "(^|[^a-zA-Z0-9])(t{1. óra A tagazonosítót keresõ példa újragondolása Most már rendelkezésünkre állnak azok az eszközök.

A .\\1. $proba). // azt írja ki. a sorszámozás kívülrõl befelé. Ehhez szabályos kifejezésünk összes felhasználandó elemét zárójelbe kell írnunk. a csereszöveg. hogy "2000.". Az ereg_replace() függvény lehetõvé teszi. hogy míg az ereg() függvény csak a legelsõ megtalált mintára illeszkedik. Ezekre a részminták segítségével megtalált karakterláncokra két fordított perjellel és az atom számával hivatkozhatunk (például \\1) a csereláncokban. print ereg_replace("([0-9]+)/([0-9]+)/([0-9]+)"." Fontos megjegyezni. "László István". .". print ereg_replace ("Vilmos Sarolta". az elsõ paraméterben kapja a tetszõleges karakterre illeszkedés különleges jelentését.25" Vegyük észre. ellenkezõ esetben az eredeti forrásszöveget kapjuk. Találat esetén a függvény a megváltoztatott karakterláncot adja vissza. László István. hogy megkeressük és lecseréljük az adott szöveg egy mintára illeszkedõ részláncát. majd felülírjuk utódjának nevével: $proba = "Titkárunk. amivel felül szeretnénk írni a megtalált mintát és a forrásszöveg. // azt írja ki. A következõ kódrészletben egy klubtisztviselõ nevét keressük ki. hogy a fenti kód csereszövegében a pontok nem különleges értelmûek.12. balról jobbra halad és \\1-tõl indul. szeretettel üdvözli önt. hogy az illeszkedõ kifejezés egy részét felhasználhassuk a felülíró karakterláncban. hogy " Titkárunk. szeretettel üdvözli önt. Bemenete három karakterlánc: egy szabályos kifejezés. A \\0 az egész illeszkedõ karakterláncot jelenti. 18 Visszautalás használata az ereg_replace() függvénnyel A visszautalások azt teszik lehetõvé.nn. "\\3.A szabályos kifejezések használata 347 Minták lecserélése karakterláncokban az ereg_replace() függvénnyel Eddig csupán mintákat kerestünk a karakterláncokban. Vilmos Sarolta.hh. $datum). formátumúvá: $datumt = "12/25/2000". A következõ kódrészlet a hh/nn/éééé formátumú dátumokat alakítja éééé.\\2. az ereg_replace() a minta összes elõfordulását megtalálja és lecseréli. amelyben keresünk. így nem is kell \ jelet tenni eléjük. magát a karakterláncot nem módosítottuk. Az atomok sorszámozottak.

nem kötelezõ paramétere a visszaadandó elemek legnagyobb számát határozza meg. Az említett függvény hatékonyságát az csökkenti. úgy. A következõ példában egy elágazó szabályos kifejezéssel egy karakterláncot bontunk fel. A függvény harmadik. vele rugalmas határolójelet adhatunk meg. óra Az ereg_replace() függvény megkülönbözteti a kis. . akkor a POSIX szabályos kifejezések függvényeit valamelyest nehézkesnek találhatjuk. A jó hír viszont az. narancsok. Ha nem szeretnénk megkülönböztetni ezeket. Ezek formája még az eddig tanultaknál is hatékonyabb. Karakterláncok felbontása a split() függvénnyel Az elõzõ órában már láttuk. hogy a határolójel egy vesszõ és egy szóköz vagy egy szóközökkel közrefogott és szó: $szoveg = "almák. $szoveg). körték és barackok". amelyben a határolókat keressük. $gyumolcsok = split(". hogy a PHP 4 támogatja a Perlnek megfelelõ szabályos kifejezéseket is. hogy az explode() függvény segítségével egy karakterláncot elemeire bontva tömbként kezelhetünk. Ebben a részben a két szabályoskifejezés-forma közötti különbségekkel ismerkedünk meg.348 18. foreach ( $gyumolcsok as $gyumolcs ) print "$gyumolcs<BR>". A függvény bemenete a határolójelként használt minta és a forráslánc. használjuk az eregi_replace() függvényt. amely minden más tekintetben megegyezik az ereg_replace() függvénnyel. kimenete pedig egy tömb. // a kimenet: // almák // narancsok // körték // barackok Perl típusú szabályos kifejezések Ha Perlös háttérrel közelítjük meg a PHP-t.és nagybetûket. hogy határolójelként csak egy karakterhalmazt használhatunk. | és ". A PHP 4 split() függvénye a szabályos kifejezések hatékonyságát biztosítja.

hogy "ház húz hülyéz hazardíroz" Viszont ha kérdõjelet (?) írunk a mennyiséget kifejezõ jel után. hogy "ház" 18 A Perl típusú szabályos kifejezések és a mohóság Alapértelmezés szerint a szabályos kifejezések megkísérelnek a lehetõ legtöbb karakterre illeszkedni. $szoveg.*z" minta azt jelenti. ha illeszkedõ kifejezést talál és false (hamis) értéket.*?z" minta jelentése a „h és z közötti lehetõ legkevesebb karakter”. amelyben az illeszkedõ karakterláncokat adja vissza. // azt írja ki. A true (igaz) értéket kapjuk vissza. $szoveg. rávehetjük a Perl típusú szabályos kifejezést.A szabályos kifejezések használata 349 Minták keresése a preg_match() függvénnyel A preg_match() függvény három paramétert vár: egy szabályos kifejezést. a forrásláncot és egy tömbváltozót.*z/". $tomb ) ) print $tomb[0]. a "h. . Általában perjeleket használunk határolójelként. $tomb ) ) print $tomb[0]. // azt írja ki. A következõ példában a preg_match() függvénnyel egy h-valami-z mintájú karakterláncot keresünk: $szoveg = "üvegház". if ( preg_match( "/h. if ( preg_match( "/h.*z/". Így a "/h. bár más. hogy egy kicsit mértékletesebb legyen.*z/" minta a h-val kezdõdõ és z karakterre végzõdõ lehetõ legtöbb karaktert közrefogó karakterláncra fog illeszkedni. ha nem. nem szám vagy betû karaktert is használhatunk (kivétel persze a fordított perjel). hogy „h és z között a lehetõ legtöbb karakter”. Így míg a "h. A Perl típusú szabályos kifejezéseket határolójelek közé kell helyezni. A preg_match() és az ereg_match() függvények közötti különbség a szabályos kifejezést tartalmazó paraméterben van. a következõ példában a teljes szövegre: $szoveg = "ház húz hülyéz hazardíroz".

$szoveg. táblázatban láthatjuk. Az ilyen típusú szabályos kifejezések olyan karaktereket is leírhatnak. ami nem elválasztó karakter Bármely szóalkotó karakterre (aláhúzást is beleértve) Mindenre. az \n pedig a soremelést. Vessük össze a szóalkotó karakterekre illeszkedõ mintát az ereg() és a preg_match() függvényben: ereg( "h[a-zA-Z0-9_]+z". Ismertetésüket a 18. preg_match( "/h\w+z". $tomb ). A \t például a tabulátor karaktert jelenti. amelyek teljes karakterhalmazokra.350 18. mint ahogy azt karakterláncokkal tettük. karaktertípusokra illeszkednek. $tomb ). táblázatban találhatjuk. amely h-val kezdõdik és z-vel végzõdik: $szoveg = "ház húz hülyéz hazardíroz". $szoveg. ugyanúgy. óra A következõ kódrészlet ezzel a módszerrel keresi meg a legrövidebb szót. $szoveg. A Perl típusú szabályos kifejezések több váltókaraktert is támogatnak. $tomb ) ) print $tomb[0]. Nélkülük karaktersorozatok keresésekor saját karakterosztályokat kellene használnunk. 18. hogy "ház" A Perl típusú szabályos kifejezések és a fordított perjeles karakterek A Perl típusú szabályos kifejezésekben is vezérlõkarakterré változtathatunk bizonyos karaktereket. . A fordított perjeles karakterek listáját a 18. ami nem szám Bármely elválasztó karakterre Mindenre. táblázat Karaktertípusokra illeszkedõ beépített karakterosztályok Karakter \d \D \s \S \w \W Illeszkedik Bármely számra Mindenre. if ( preg_match( "/h.2.3. ami nem szóalkotó karakter Ezek a karakterosztályok nagymértékben leegyszerûsíthetik a szabályos kifejezéseket. A hivatkozási pontok a karakterláncon belül helyekre illeszkednek. // azt írja ki.2.*?z/". nem pedig karakterekre. melyek hivatkozási pontként mûködnek.

hogy megszabaduljunk a karakterek jelentésétõl.A szabályos kifejezések használata 351 18. de legfeljebb négy t karakterre illeszkedik. ami nem szóhatár Karakterlánc végére (az utolsó soremelés vagy a karakterlánc vége elõtt illeszkedik) Karakterlánc végére (a karakterlánc legvégére illeszkedik) 18 Emlékszünk még. hogy egy . $tomb ). hogy a minta karakterláncon belüli összes elõfordulását bonyolult megkeresni. Így ha az ereg() függvénnyel keressük a b-vel kezdõdõ. $szoveg. csak a legelsõ találatot kapjuk vissza. A váltókaraktereket arra is használhatjuk.4}[a-zA-Z0-9_]*99) å ([^a-zA-Z0-9_]|$)". Próbáljuk meg magunk is: . milyen problémáink voltak a szóhatárra való illesztéssel a tagsági azonosítást megvalósító példában? A Perl típusú szabályos kifejezések jelentõsen leegyszerûsítik ezt a feladatot. hogyan illeszt mintát szóalkotó karakterre és szóhatárra az ereg() és a preg_match(): ereg ( "(^|[^a-zA-Z0-9_])(y{1. Ahhoz például. karakterre illeszthessünk. Vessük össze. preg_match( "\bt{1. majd vagy arra. t-vel végzõdõ szavakat. amelyet bármennyi szövegalkotó karakter követhet és amit a szóhatáron levõ 99 karaktersor zár.4}\w*99\b". csupán megerõsíti. A szóhatárt jelölõ váltókarakter igazából nem is egy karakterre illeszkedik. táblázat Hivatkozási pontként használt váltókarakterek Karakter \A \b \B \Z \z Illeszkedik Karakterlánc kezdetére Szóhatárra Mindenre. Teljeskörû keresés a preg_match_all() függvénnyel A POSIX szabályos kifejezésekkel az az egyik probléma. vagy pedig szóhatárra kell illeszteni. Az ereg_match() meghívásához elõször létre kell hoznunk egy nem szóalkotó karakterekbõl álló mintát. egy fordított perjelet kell elé írnunk. $tomb ). hogy az illeszkedéshez szóhatár kell. $szoveg.3. Az elõzõ példában a preg_match() függvény meghívásakor a szóhatáron levõ legalább egy.

18.1. hogy hívjuk a kedves olvasó figyelmét arra. Hogy megkapjuk az összes illeszkedõ kifejezést a szövegben. program Minta teljeskörû illesztése a preg_match_all() függvénnyel 1: <html> 2: <head> 3: <title>18.1. // $tomb[1]: // $tomb[2]: barackot // $tomb[3]: . hogy a magyar szövegekre az ékezetes betûk miatt alapbeállításban nem alkalmazható a fentihez hasonló egyszerû szabályos kifejezés. melynek elsõ eleme a szabályos kifejezésben megadott mintára illeszkedõ összes találatot tartalmazza. a "barackot". if ( ereg( "(^|[^a-zA-Z0-9_])(b[a-zA-Z0-9_]+t) å ([^a-zA-Z0-9_]|$)". $szoveg. hogy egyetlen hívásból a minta összes elõfordulását megkapjuk. a negyedik a vesszõt. $x++ ) print "\$tomb[$x]: $tomb[$x]<br>\n". a $tomb harmadik elemében találjuk az elsõ találatot. a forráslánc és egy tömbváltozó. Két for ciklust használunk. a második a szóközt.1. $x< count( $tomb ). } // kimenete: // $tomb[0]: barackot. bort. program Minta teljeskörû illesztése a preg_match_all() függvénnyel</title> 4: </head> 5: <body> . ciklikusan. banánt. Ahogy azt vártuk. az ereg_replace() függvényt kellene használnunk. óra $szoveg = "barackot. A tömbváltozó egy többdimenziós tömb lesz. hogy a kívánt eredményt elérjük. A preg_match_all() bemenete egy szabályos kifejezés. búzát és békákat árulok". hogy eltávolítsuk a találatokat a szövegbõl.352 18. A nemzeti beállítások testreszabására használható setlocale() függvényt kell alkalmaznunk. $tomb ) ) { for ( $x=0. Találat esetén true (igaz) értéket ad vissza. mielõtt újra illesztenénk a mintát. A tömb elsõ eleme tartalmazza a teljes találatot. hogy megjelenítsük a többdimenziós eredménytömböt. A preg_match_all() függvényt használhatjuk arra. Fel kell. programban a preg_match_all() függvénnyel illesztettük mintánkat egy szövegre. A 18.

Minden további elem a szabályos kifejezés egyes atomjainak (zárójeles részmintáinak) értékeit tartalmazza az egyes találatokban. A preg_match_all() függvénynek átadott tömb elsõ eleme tartalmazza a teljes szabályos kifejezés minden egyes találatát."<br>\n".A szabályos kifejezések használata 353 18. $y++ ) 13: print "\$tomb[$x][$y]: ".$tomb[$x][$y]. hogy az atomok találatait is tárolhassa. Így a preg_match_all() alábbi meghívásával $szoveg = "01-05-99.1. preg_match_all( "/(\d+)-(\d+)-(\d+)/". program (folytatás) 6: <?php 7: $szoveg = "barackot. A preg_match_all() ebbõl a tömbbõl azért készít egy többdimenziósat. 14: } 15: } 16: // A kimenet: 17: // $tomb[0][0]: barackot 18: // $tomb[0][1]: banánt 19: // $tomb[0][2]: bort 20: // $tomb[0][3]: búzát 21: // $tomb[0][4]: békákat 22: ?> 23: </body> 24: </html> A $tomb változónak a preg_match_all() függvénynek történõ átadáskor csak az elsõ eleme létezik és ez karakterláncok egy tömbjébõl áll. Ez a tömb tartalmazza a szöveg minden olyan szavát. 8: if ( preg_match_all( "/\bb\w+t\b/". $szoveg. a $tomb[0] az összes találat tömbje: $tomb[0][0]: 01-05-99 $tomb[0][1]: 01-10-99 $tomb[0][2]: 01-03-00 A $tomb[1] az elsõ részminta értékeinek tömbje: $tomb[1][0]: 01 18 . 01-03-00". $tomb ) ) 9: { 10: for ( $x=0. búzát és békákat árulok". $szoveg. banánt. $y< count( $tomb[$x] ). amely b-vel kezdõdik és t betûre végzõdik. 01-10-99. $tomb ). $x++ ) 11: { 12: for ( $y=0. bort. $x< count( $tomb ).

hogy a szûrõkaraktert (|) használtuk határolójelként. azzal a különbséggel. Ilyenkor a visszaadott érték az átalakított karakterláncok tömbje lesz. 18. A preg_replace() ugyanúgy támogatja a visszautalásokat a csereszövegben. A preg_replace() bemenete egy szabályos kifejezés. Emellett a preg_replace() függvénynek szabályos kifejezések és csere-karakterláncok tömbjét is átadhatjuk. "\\1 2000" ). hogy "99/12/25. $szoveg ). $mikre = array( "\\3/\\2/\\1". // azt írja ki. . az ebben az esetben minden tömbelemet egyesével átalakít. Ezzel megtakarítottuk a perjelek kikerülésére használandó váltókaraktereket az illesztendõ mintában. å "/([Cc]opyright) 1999/" ). egy csere-karakterlánc és egy forráslánc. 00/5/14" Vegyük észre. A következõ kódrészlet a nn/hh/éé formátumú dátumokat alakítja át éé/hh/nn formátumúvá: $szoveg = "25/12/99. $szoveg = preg_replace( "|\b(\d+)/(\d+)/(\d+)\b|". A szabályos kifejezéseket egyenként illeszti a forrásláncra és a megfelelõ csereszöveggel helyettesíti. 14/5/00. de emellett a forráslánc szerzõi jogi (copyright) információját is módosítjuk: $szoveg = "25/12/99. print "$szoveg<br>".354 $tomb[1][1]: $tomb[1][2]: A $tomb[2] a $tomb[2][0]: $tomb[2][1]: $tomb[2][2]: és így tovább. hogy hozzáférünk a Perl típusú szabályos kifejezések által kínált kényelmi lehetõségekhez. ellenkezõ esetben magát a forrásláncot kapjuk vissza változtatás nélkül. óra 01 01 második részminta értékeinek tömbjét tárolja: 05 10 03 Minták lecserélése a preg_replace() függvénnyel A preg_replace() használata megegyezik az ereg_replace() használatával. Copyright 1999". A következõ példában az elõzõ példa formátumait alakítjuk át. Találat esetén a módosított karakterláncot. mint az ereg_replace(). 14/5/00". $miket = array( "|\b(\d+)/(\d+)/(\d+)\b|". A preg_replace() függvénynek a forráslánc helyett karakterláncok egy tömbjét is átadhatjuk. å "\\3/\\2/\\1".

\t. Ha a csere-karakterláncok tömbje kevesebb elemet tartalmaz. // azt írja ki. Copyright 2000" Két tömböt hozunk létre. 355 18 Módosító paraméterek A Perl típusú szabályos kifejezések lehetõvé teszik.4. $mikre. a második a másodikkal. A $ és a ^ az aktuális sor elejére és végére illeszkedik. ÚJDONSÁG A módosító paraméter olyan betû. táblázatban találhatjuk. vagy a \ (fordított perjel–szóköz) mintákat. amelyet a Perl típusú szabályos kifejezések utolsó határolójele után írunk. $szoveg ). táblázat A Perl típusú szabályos kifejezések módosító paraméterei Minta i e m s x Leírás Nem különbözteti meg a kis.-ra). a csere-karakterlánc nélkül maradó szabályos kifejezéseket a függvény üres karakterláncra cseréli.A szabályos kifejezések használata $szoveg = preg_replace( $miket. akkor az a szabályos kifejezések tömbjének összes mintáját ugyanazzal a csereszöveggel helyettesíti. a $mikre tömb pedig csere-karakterláncokat tartalmaz. print "$szoveg<br>". 18. A karakterosztályokon kívüli elválasztó karakterekre az olvashatóság érdekében nem illeszkedik. A soremelésre is illeszkedik (a soremelések általában nem illeszkednek a . A Perl típusú szabályos kifejezések módosító paramétereit a 18. A preg_replace() csereláncát PHP-kódként kezeli.4. és így tovább. használjuk a \s. mint a szabályos kifejezéseké. Ha elválasztó karakterekre szeretnénk mintát illeszteni. A $miket tömb elsõ eleme a $mikre tömb elsõ elemével helyettesítõdik. . 00/5/14.és nagybetûket. A $miket tömb két szabályos kifejezést. és amely tovább finomítja szabályos kifejezéseink jelentését. de csak egy csereláncot. hogy "99/12/25. Ha a preg_replace() függvénynek szabályos kifejezések egy tömbjét adjuk át. hogy módosító paraméterek segítségével pontosítsuk a minta illesztési módját.

356 18. A ^ és $ minták alapértelmezés szerint a teljes karakterlánc elejét és végét jelzik. amelyben bármely szóalkotó karaktert vesszõ és tetszõleges számú szóköz követ. foreach ( $tomb[1] as $ertek ) print "$ertek<br>". Csak a karakterlánc végén illeszkedik (ilyen megszorítás nincs a Perlben). A / k \S* r /ix kifejezés például illeszkedik a "kar" és "KAR" szavakra. $tomb ). A következõ kódrészletben az m paraméterrel módosítjuk a $^ viselkedését: $szoveg = "név: péter\nfoglalkozás: programozó\nszeme: kék\n". az i megszorítást pedig arra.*)$/m". de a "K A R" szóra már nem. Az m paraméter miatt a $ az egyes sorok végére illeszkedik a teljes karakterlánc vége helyett. // kimenet: // péter // programozó // kék Egy olyan szabályos kifejezést hozunk létre. Az x-szel módosított szabályos kifejezések váltókarakter nélküli szóközei nem fognak illeszkedni semmire sem a forrásláncban. óra 18. Az m paraméter akkor jöhet jól. $szoveg.4. egyszerre többet is használhatunk belõlük. táblázat. amely olyan mintára illeszkedik. azaz a lehetõ legkevesebb karaktert tartalmazó találatokat adja vissza (ez a módosító sem található meg Perlben). (folytatás) Minta A E U Leírás Csak a karakterlánc elején illeszkedik (ilyen megszorítás nincs a Perlben). hogy könnyebb legyen olvasni a szabályos kifejezéseket. ha egy szöveg több sorában szeretnénk hivatkozási pontos mintára illeszteni. . hogy mintánk kis. preg_match_all( "/^\w+:\s+(. Ezután tetszõleges számú karaktert követõ „karakterlánc vége” karakterre ($) illesztünk. Az x megszorítást például arra használhatjuk. Kikapcsolja a szabályos kifejezések „mohóságát”. Ahol ezek a megszorítások nem mondanak egymásnak ellent.és nagybetûktõl függetlenül illeszkedjék a szövegre. a különbség csupán esztétikai lesz.

\\3)". hogy "kezdetként végül" Az e paraméter különlegesen hasznos lehet számunkra. A függvényeknek paraméterként visszautalásokat vagy számokból álló listákat adhatunk át. j.$nap.*?(\w+)$/s". ". amely ugyanazt a dátumot más formában adja vissza. A következõ példában az e paraméterrel adunk át illesztett számokat egy függvénynek. // 2000. $szoveg. $tomb ).0. $datumok).$ev) ). preg_match( "/^(\w+). $ev ) { $ev = ($ev < 70 )?$ev+2000:$ev.\\2. Ez a kód semmit nem ír ki.$honap. print $datumok. $szoveg. 22. // azt írja ki. $nap. 03. ha a . $tomb ). print "$tomb[1] $tomb[2]<br>". a . preg_match( "/^(\w+). $ido).*?(\w+)$/". // ezt írja ki: // 1999. 07. $ido = ( mktime( 0. hogy a preg_replace() függvény csereszövegét PHP kódként kezeljük. 18. return date("Y. } $datumok = "3/18/99<br>\n7/22/00". $datumok = preg_replace( "/([0-9]+)\/([0-9]+)\/([0-9]+)/e". print "$tomb[1] $tomb[2]<br>". Az s paraméter ezen változtat: $szoveg = "kezdetként indítsunk ezzel a sorral\nés így å egy következtetéshez\n érkezhetünk el végül\n". karakterrel szeretnénk többsoros karakterláncban karakterekre illeszteni. nem illeszkedik a szövegben található soremelésre. "datumAtalakito(\\1.A szabályos kifejezések használata Az s paraméter akkor jön jól. m. <?php function datumAtalakito( $honap. ?> 357 18 .0. Bár a szabályos kifejezés megtalálja a szóalkotó karaktereket a karakterlánc kezdeténél. hiszen lehetõvé teszi. A következõ példában megpróbálunk a karakterlánc elsõ és utolsó szavára keresni: $szoveg = "kezdetként indítsunk ezzel a sorral\nés így å egy következtetéshez\n érkezhetünk el végül\n".

amellyel karakterláncokban mintákat kereshetünk. Mivel az e módosító paramétert használjuk. a http://www.net) találhatunk némi felvilágosítást.html címen találhatunk bevezetést. illetve az ereg_replace()-szel. amellyel egy minta összes elõfordulását cserélhetjük le.perl. Megismerkedtünk az ereg() szabályoskifejezés-függvénnyel. Kérdések és válaszok A Perl típusú szabályos kifejezések nagyon hatékonynak tûnnek.perl. A Perl típusú szabályos kifejezésekben váltókarakterekkel hivatkozási pontos illesztést kérhetünk. hogy bonyolult karakterláncokat találjunk meg és cseréljünk le egy szövegben. úgy.358 18. Összefoglalás A szabályos kifejezések hatalmas témakört alkotnak.perl. az elágazásokkal mintákat vagylagosan kereshetünk. óra Három. . Hol található róluk bõvebb információ? A szabályos kifejezésekrõl a PHP weboldalán (http://www. mi csak felületesen ismerkedtünk meg velük ezen óra során.php. a Perl típusú szabályos kifejezésekhez pedig a http://www. Arra viszont már biztosan képesek leszünk. hogy a három visszautalást adjuk át neki. Emellett még a http://www. Részmintákat is kigyûjthetünk és rájuk visszautalásokkal hivatkozhatunk. a cserelánc paraméterbõl meghívhatjuk az általunk meghatározott datumAtalakito() függvényt. amellyel aztán kicseréli az eredetit. a mennyiségjelzõk használatával több mintát. Ezenkívül a módosító paraméterekkel képesek vagyunk finomítani a Perl típusú szabályos kifejezések viselkedésén.com/pub/doc/manual/html/pod/perlfaq6. A karakterosztályok használatával karakterláncokat.htm címen és Tom Christiansen cikkében.com oldalain találhatunk információt. perjelekkel elválasztott számhalmazt keresünk és a zárójelek használatával rögzítjük a megtalált számokat.com/pub/doc/manual/html/pod/perlre. de karakterosztályok illesztésére is rendelkezésre állnak váltókarakterek. A datumAtalakito() csupán fogja a számbemenetet és egy jobban festõ dátummá alakítja.

hogy a megtalált minta legelsõ elõfordulását keresse meg? 8. . Gyûjtsük ki az e-mail címeket egy fájlból. Hogyan tagadnánk a 3.A szabályos kifejezések használata 359 Mûhely A mûhelyben kvízkérdések találhatók. hogy egy minta összes elõfordulását megtaláljuk? 10. A címeket tároljuk egy tömbben és jelenítsük meg az eredményt a böngészõben. Nagy mennyiségû adattal finomítsuk szabályos kifejezéseinket. ha kis. A Perl típusú szabályos kifejezésekkel hogyan alakítanánk át a fenti szabályos kifejezést úgy. A . ha a "b" betû legalább egyszeri. Melyik Perl típusú szabályos kifejezést használnánk. Hogyan határoznánk meg a "d" és az "f" betûk közé esõ karakterek karakterosztályát? 4. A Perl típusú szabályos kifejezéseknél melyik fordított perjeles karakterrel illesztünk elválasztó karakterre? 9. Milyen szabályos kifejezést használnánk. Kvíz 1. Milyen formában keresnénk tetszõleges számra vagy a "bokor" szóra? 6. melyek segítenek megszilárdítani az órában szerzett tudást. de hatnál nem többszöri elõfordulására szeretnénk keresni? 3. kérdésben meghatározott karaktertartományt? 5. A válaszokat az A függelékben helyeztük el.bc* szabályos kifejezés mohón illeszkedik. azaz inkább az "abc0000000bc" karakterláncra illeszkedik. Melyik POSIX szabályos kifejezés függvényt használnánk egy megtalált minta lecserélésére? 7. Melyik függvényt használnánk egy karakterláncban minta illesztésére. ha az a célunk. ha POSIX szabályos kifejezéssel szeretnénk a mintát meghatározni? 2.és nagybetûtõl függetlenül szeretnénk egy mintára illeszteni? 18 Feladatok 1. Melyik módosító karaktert használnánk egy Perl típusú szabályoskifejezésfüggvényben. mint az "abc"-re.

.

ráadásul az egyes oldalakon belül a képek. Ezen az órán az információtárolás azon két módszerével fogunk megismerkedni. amelyben egyetlen oldal is egy nagyobb egész része.19. azaz olyan térként érzékelik a weboldalakat. Másrészt viszont a felhasználók és a weboldalak készítõi környezetként. amelyek lehetõvé teszik. külsõ fájlok letöltésére is külön kapcsolatok nyílnak. Az óra során a következõket tanuljuk meg: • Mik a sütik és hogyan mûködnek? • Hogyan olvassuk a sütiket? . hogy egy adott oldalon található adat a következõ oldalakon is elérhetõ legyen. hogy az oldalról oldalra való információátadás módszerei egyidõsek magával a Világhálóval. Ez azt jelenti. Így viszont nem meglepõ. annyi önálló kapcsolat létesül. hogy ahány oldalt a felhasználó letölt kiszolgálónkról. ÓRA Állapotok tárolása sütikkel és GET típusú lekérdezésekkel A HTTP állapot nélküli protokoll.

362 • Hogyan írjunk sütiket?

19. óra

• Hogyan tároljuk adatbázisban a weboldalak lekérési statisztikáját sütik segítségével? • Mik azok a GET módú lekérések? • Hogyan írjunk olyan függvényt, amely egy asszociatív tömböt egy lekérdezõ karakterlánccá alakít át?

Sütik
A Netscape munkatársai által kiötölt „csodasüti” (magic cookie) kifejezés még a Netscape 1 aranykorából származik. A kifejezés pontos eredete mindmáig viták tárgya, bár meglehetõsen valószínûnek tûnik, hogy a szerencsesütinek valami köze lehetett hozzá. Azóta viszont már más böngészõk is alkalmazzák ezt a szabványt. ÚJDONSÁG A süti (cookie) kis mennyiségû adat, amelyet a felhasználó böngészõje tárol egy kiszolgáló vagy egy program kérésének eleget téve. Egy gép legfeljebb 20 sütit tárolhat a felhasználó böngészõjében. Minden süti egy nevet, egy értéket, a lejárati idõpontot és a gazdagépre és elérési útra vonatkozó információkat tartalmazza. Az egyes sütik mérete legfeljebb 4 KB lehet. A süti értékeinek beállítása után csak az a számítógép olvashatja az adatokat, amely azokat létrehozta, ezzel is garantálva a felhasználó biztonságát. A felhasználó azt is beállíthatja böngészõjében, hogy az értesítse az egyes sütik létrehozásának kérelmérõl, vagy elutasíthatja az összes sütikérelmet. Ezekbõl adódóan a sütiket módjával kell használni, nem lehet teljesen rájuk támaszkodni a környezet megtervezésekor anélkül, hogy a felhasználót elõször ne értesítenénk. Mindezekkel együtt a sütik kiválóan alkalmasak arra, hogy kis mennyiségû információt tároljunk velük, mialatt a felhasználó oldalról-oldalra lépdel, vagy akár hosszabb távon is, a webhely egyes látogatásai között.

A sütik felépítése
A sütik létrehozása általában a HTTP fejlécében történik (bár a JavaScript közvetlenül a böngészõvel is létre tudja hozni a sütiket). Egy sütibeállító PHP program ilyesféle HTTP fejlécelemet kell, hogy létrehozzon: Set-Cookie: zoldseg=articsoka; expires=Friday, å 04-Feb-00 22:03:38 GMT; path=/; domain=kiskapu.hu

Állapotok tárolása sütikkel és GET típusú lekérdezésekkel Mint ahogy azt láthatjuk, a Set-Cookie fejléc egy név–érték párt, egy greenwichi középidõ szerinti lejárati idõpontot (expires), egy elérési utat (path) és egy tartományt (domain) tartalmaz. A név és az érték URL felépítésû kell, hogy legyen. A lejárat mezõ (expires) arra ad utasítást a böngészõnek, hogy mikor „felejtse el” a sütit. Az elérési út a weboldalon azt a helyet jelöli, amelynek elérésekor a sütit vissza kell küldeni a kiszolgálóra. A tartomány mezõ azokat az internetes tartományokat jelöli ki, ahová a sütit el kell küldeni. A tartomány nem különbözhet attól, ahonnan a sütit küldték, viszont egy bizonyos szintû rugalmasságot is meghatározhat. Az elõzõ példánál a böngészõ a www.kiskapu.hu és a leeloo.kiskapu.hu kiszolgálóknak egyaránt hajlandó elküldeni a sütit. A HTTP fejlécérõl a tizenharmadik óra anyagában többet is olvashattunk. Ha a böngészõ úgy van beállítva, hogy tárolja a sütiket, akkor az azokban tárolt adatok a süti lejártáig elérhetõk maradnak. Ha a felhasználó a böngészõvel olyan oldalra jut, amely egyezik a sütiben tárolt elérési útvonallal és tartománnyal, akkor elküldi a sütit a kiszolgálónak. Ehhez általában az alábbihoz hasonló fejlécelemet állít elõ: Cookie: zoldseg=articsoka Így aztán a PHP program hozzáférhet a sütihez a HTTP_COOKIE környezeti változón keresztül (amely az összes süti nevét és értékét tárolja), de a $zoldseg globális változón keresztül vagy a $HTTP_COOKIE_VARS[“zoldseg”] globális tömbváltozó segítségével is elérhetjük azt: print "$HTTP_COOKIE<BR>"; // azt írja ki, hogy å "zoldseg=articsoka" print getenv("HTTP_COOKIE")."<br>"; // azt írja ki, hogy å "zoldseg=articsoka" print "$zoldseg<br>"; // azt írja ki, hogy "articsoka" print "$HTTP_COOKIE_VARS["zoldseg"]<br>"; // azt írja ki, hogy å "articsoka"

363

19

Sütik beállítása a PHP-vel
A PHP-vel kétféleképpen hozhatunk létre egy sütit. Egyrészt a kilencedik óra során megismert header() függvény segítségével beállíthatjuk a fejléc Set-Cookie sorát. A header() egy karakterláncot vár, amit az oldal HTTP fejlécébe ír. Mivel a fejlécek automatikusan kerülnek kiírásra, a header() függvényt még azelõtt kell meghívnunk, mielõtt bármi egyebet küldenénk a böngészõnek. Figyeljünk arra, hogy a PHP blokk kezdõeleme elé írt egyetlen szóköz vagy újsor karakter is kimenetként jelenik meg a böngészõben.

364

19. óra header ("Set_Cookie: zoldseg=articsoka; expires=Friday, å 04-Feb-00 22:03:38 GMT; path=/; domain=kiskapu.hu"); Bár ez a módszer nem túl bonyolult, mégis írnunk kell egy olyan függvényt, amely elõállítja a fejléc szövegét. Ez persze nem túl rázós feladat, hiszen csak a megfelelõ formátumú dátumot, illetve az URL formátumú név–érték párt kell elõállítanunk. Kár azonban ezzel veszõdnünk, mert létezik egy olyan PHP függvény, amely pontosan ezt végzi el helyettünk. A setcookie() függvény neve önmagáért beszél: a fejléc Set-Cookie sorát állítja elõ. Ennek megfelelõen azelõtt kell még meghívnunk, mielõtt valamit kiküldenénk a böngészõnek. A függvény bemenetét a süti neve, értéke, UNIX idõbélyeg formátumban megadott lejárata, elérési útja, a feljogosított tartomány, valamint egy egész szám alkotja. Ezt a legutolsó paramétert 1-re állítva biztosíthatjuk, hogy a süti csak biztonságos kapcsolaton keresztül tudjon közlekedni. A süti nevén kívül egyik paraméter sem kötelezõ. A 19.1. programban arra láthatunk példát, ahogy a setcookie() függvény segítségével beállítunk egy sütit.

19.1. program Süti értékének beállítása és kiíratása
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: <?php setcookie( "zoldseg", "articsoka", time()+3600, "/", "kiskapu.hu", 0 ); ?> <html> <head> <title>19.1. program Süti értékének beállítása és kiíratása</title> </head> <body> <?php if ( isset( $zoldseg ) ) print "<p>Üdv, az ön által kiválasztott zöldség a(z) $zoldseg</p>"; else print "<p>Üdvözöljük! Ez az ön elsõ látogatása.</p>"; ?> </body> </html>

Állapotok tárolása sütikkel és GET típusú lekérdezésekkel Bár a program elsõ lefuttatásakor már beállítjuk a sütit, a $zoldseg változó ekkor még nem jön létre. A süti csak akkor lesz hozzáférhetõ, amikor a böngészõ elküldi azt a kiszolgálónak. Ez csak akkor következik be, ha a felhasználó újra meglátogatja tartományunkat. A példában egy "zoldseg" nevû sütit hozunk létre, melynek értéke "articsoka". A time() függvénnyel lekérdezzük a pillanatnyi idõt, majd ebbõl 3600-at hozzáadva számítjuk ki a lejárat idejét. (A 3600 másodpercben értendõ, tehát a süti 1 óra elteltével fog elavulni.) Útvonalként a "/"-t adjuk meg, amibõl az következik, hogy sütink a webhely összes oldaláról elérhetõ lesz. A tartományt "kiskapu.hu"-ra állítottuk, aminek következtében ennek a tartománynak mindegyik kiszolgálója jogosult a süti fogadására (a www.kiskapu.hu tehát ugyanúgy megkapja a sütit, mint a leeloo.kiskapu.hu). Ha azt szeretnénk, hogy egy sütihez csak az a kiszolgáló férjen hozzá, amelyik a sütit létrehozó programot szolgáltatta, használjuk a $SERVER_NAME környezeti változót, ahelyett, hogy a tartomány, illetve kiszolgálónevet beépítenénk a programba. Ez a megoldás azzal az elõnnyel is rendelkezik, hogy a programok módosítás nélkül átvihetõk egy másik kiszolgálóra és ott is az elvárásoknak megfelelõen fognak futni. Végül egy nullát is átadunk a setcookie()-nak, jelezvén, hogy a sütit nem biztonságos kapcsolaton keresztül is el szabad küldeni. Bár az elsõ kivételével mindegyik paraméter elhagyható, hasznos, ha minden paramétert megadunk és csak a tartomány és biztonság adatok meghatározásától tekintünk el. Erre azért van szükség, mert bizonyos böngészõk csak az útvonal megadása esetén képesek a sütik rendeltetésszerû használatára. Az útvonal elhagyásával a süti használatát az aktuális, illetve az alatta elhelyezkedõ könyvtárak oldalai számára korlátozzuk. Ha a setcookie() szöveges paramétereiként ""-t, azaz üres karakterláncot adunk át, a szám paramétereinek pedig 0-t, a függvény ezeket a paramétereket nem veszi figyelembe.

365

19

Süti törlése
A sütik törlésének „hivatalos” módja az, hogy a setcookie() függvényt egyetlen paraméterrel, mégpedig a törlendõ süti nevével hívjuk meg: setcookie( "zoldseg" ); Ebben a megoldásban nem bízhatunk meg teljesen, mert nem minden esetben mûködik kifogástalanul. Ezért célszerûbb, ha egy múltbeli dátummal új értéket adunk a sütinek: setcookie( "zoldseg", "", time()-60, "/", "kiskapu.hu", 0); Ennek alkalmazásakor viszont ügyelnünk kell, hogy a megadott útvonal, tartomány és biztonsági paraméter tökéletesen egyezzen a süti létrehozásakor megadottakkal.

366

19. óra

Munkamenet-azonosító sütik
Ha olyan sütit szeretnénk létrehozni, amely csak addig létezik, amíg a felhasználó be nem zárja a böngészõt, csak annyi a teendõnk, hogy a süti élettartamát nullára állítjuk. Amíg ki nem lépünk a böngészõbõl, az így készített sütiket a kiszolgáló gond nélkül megkapja, ám ha bezárjuk a programot, a sütik megszûnnek, így hiába indítjuk újra a böngészõt, már nem érjük el azokat. Ezen eljárás legfõbb alkalmazási területe a felhasználók azonosítása. A felhasználó elküldi a nevét és jelszavát, válaszként pedig egy olyan oldalt kap, amely egy sütit hoz létre a böngészõben. Ezek után a böngészõ a sütit minden személyes adatokat tartalmazó laphoz történõ hozzáféréskor visszaküldi a kiszolgálónak, az pedig ennek hatására engedélyezi a hozzáférést. Ilyen esetekben nem kívánatos, hogy a böngészõ újraindítása után is hozzáférhessünk ezekhez a lapokhoz, mert nem lehetünk biztosak benne, hogy nem egy másik felhasználó indította el a böngészõt. A munkamenet-azonosítót hagyományosan sessionid-nek nevezik, a böngészõ bezárásáig élõ sütit pedig session cookie-nak. setcookie( "session_id", "55435", 0 );

Példa: Webhelyhasználat nyomon követése
Képzeljük el, hogy egy tartalomszolgáltató azzal bízott meg bennünket, hogy sütik, valamint egy MySQL adatbázis segítségével kimutatást készítsünk a látogatókról. Szükség van a látogatók számára, a látogatások alkalmával letöltött lapok számának átlagára és az olvasók által a webhelyen töltött átlagidõre, látogatókra lebontva. Az elsõ dolgunk, hogy megértessük megbízónkkal a sütik alkalmazásának korlátait. Nem mindegyik felhasználó böngészõjében engedélyezett a sütik használata. Ilyen esetben a lekért oldal mindig úgy fog tûnni, mintha ez lenne az adott felhasználó elsõ látogatása. Így hát a kapott eredményeket kissé meghamisítják azok a böngészõk, amelyek nem tudják vagy nem akarják kezelni a sütiket. Továbbá abban sem lehetünk biztosak, hogy egy felhasználó mindig ugyanazt a böngészõt használja, és abban sem, hogy egy adott böngészõn nem osztozik-e esetleg több ember. Ha megbízónk mindezt tudomásul vette, nekiveselkedhetünk a tényleges megvalósításnak. Egy mûködõ mintát kevesebb, mint 90 sorból összerakhatunk! Szükségünk lesz elõször is egy adatbázistáblára, mely a 19.1-es táblázatban felsorolt mezõkbõl áll.

Állapotok tárolása sütikkel és GET típusú lekérdezésekkel

367

19.1. táblázat Adatbázismezõk
Név vendeg_azon Típus egész Leírás Automatikusan növekvõ mezõ, amely minden látogató számára egyedi azonosítót állít elõ és tárol.
A látogató elsõ látogatásának idõbélyege. A legutóbb lekért lap idõpontjának idõbélyege. Az elkülöníthetõ látogatások száma. A webhelyen töltött idõ közelítõ értéke. A látogató összes letöltési kérelmeinek száma.

elso_latogatas utolso_latogatas latogatas_szam ossz_ido ossz_letoltes

egész egész egész egész egész

19

A vendeg_naplo MySQL tábla létrehozásához a következõ CREATE utasításra lesz szükség: create table vendeg_naplo ( vendeg_azon INT NOT NULL AUTO_INCREMENT, PRIMARY KEY( vendeg_azon ), elso_latogatas INT, utolso_latogatas INT, latogatas_szam INT, ossz_ido INT, ossz_letoltes INT ); Most, hogy elkészítettük a táblát, amivel dolgozhatunk, írnunk kell egy programot, amely megnyit egy adatbázis-kapcsolatot és képes ellenõrizni a süti jelenlétét. Ha a süti nem létezik, új sort hoz létre a táblában és feltölti az új látogató adataival. Ennek megvalósítása látható a 19.2. példában.

368

19. óra

19.2 program A MySQL adatbázist új felhasználó adataival bõvítõ program
1: <?php 2: $adatbazis = mysql_connect( "localhost", "janos", "majomkenyerfa" ); 3: if ( ! $adatbazis ) 4: die( "Nem lehet a mysql-hez kapcsolódni!" ); 5: mysql_select_db( "minta", $adatbazis ) or die ( mysql_error() ); 6: if ( ! isset ( $vendeg_azon ) ) 7: $vendeg_allapot = ujvendeg( $adatbazis ); 8: else 9: print "Örülünk, hogy ismét körünkben üdvözölhetjük, $vendeg_azon<P>"; 10: function ujvendeg( $adatbazis ) 11: { 12: // egy új vendég! 13: $vendeg_adatok = array ( 14: "elso_latogatas" => time(), 15: "utolso_latogatas" => time(), 16: "latogatas_szam" => 1, 17: "ossz_ido" => 0, 18: "ossz_letoltes" => 1 19: ); 20: $lekerdezes = "INSERT INTO vendeg_naplo ( elso_latogatas, 21: utolso_latogatas, 22: latogatas_szam, 23: ossz_ido, 24: ossz_letoltes ) "; 25: $lekerdezes .= "values ( ". $vendeg_adatok["elso_latogatas"].", ". 26: $vendeg_adatok["utolso_latogatas"].", ". 27: $vendeg_adatok["latogatas_szam"].", ". 28: $vendeg_adatok["ossz_ido"].", ". 29: $vendeg_adatok["ossz_letoltes"]." )"; 30: $eredmeny = mysql_query( $lekerdezes ); 31: $vendeg_adatok["vendeg_azon"] = mysql_insert_id(); 32: setcookie( "vendeg_azon", $vendeg_adatok["vendeg_azon"], 33: time()+(60*60*24*365*10), "/" ); 34: return $vendeg_adatok; 35: } 36: ?>

Állapotok tárolása sütikkel és GET típusú lekérdezésekkel A szokványos módon csatlakozunk a MySQL kiszolgálóhoz és kiválasztjuk azt az adatbázist, amelyben a vendeg_naplo tábla található (a MySQL adatbáziskiszolgáló kezelését a tizenkettedik óra tartalmazza). Ellenõrizzük a $vendeg_azon változó jelenlétét, amely a felhasználót azonosító egyedi egész számot tartalmazza. Ha ez a változó nem létezik, feltételezzük, hogy új felhasználóról van szó és bejegyzéséhez meghívjuk az ujvendeg() nevû függvényt. Az ujvendeg() függvény egy hivatkozás-azonosítót kér és egy tömböt ad vissza. A függvényben létrehozunk egy $vendeg_adatok nevû tömböt. A tömb elso_latogatas és utolso_latogatas elemeit a pillanatnyi idõre állítjuk. Mivel ez az elsõ látogatás, így a latogatas_szam és az ossz_letoltes elemeket 1-re állítjuk. Az ossz_ido 0 lesz, hiszen ezen látogatás alkalmával még nem telt el idõ. A létrehozott tömb alapján elkészítjük a táblába illesztendõ új sort, úgy, hogy a tömb mindegyik elemét a tábla azonos nevû oszlopának adjuk értékül. Mivel a vendeg_azon mezõ automatikusan növekszik, megadásától eltekinthetünk. A süti beállításakor azonban szükség lesz erre az újonnan elõállított azonosítóra. Ezt válaszként a mysql_insert_id() függvénytõl kaphatjuk meg. Most, hogy elláttuk az új látogatót egy azonosítóval, nincs más hátra, mint kibõvíteni a tömböt az azonosítóval, amely így már megfelel az adatbázisrekordnak, amit az imént létrehoztunk. Végsõ lépésként létrehozzuk a vendeg_azon nevû sütit egy setcookie() hívással és visszaadjuk a $vendeg_adatok tömböt a hívó programnak. Legközelebb, amikor a látogató mûködésbe hozza a programot, a PHP már látni fogja a $vendeg_azon változón keresztül a vendeg_azon sütit. A program ezt úgy értékeli, hogy egy régi ismerõs visszatérésérõl van szó és ennek megfelelõen frissíti a vendeg_naplo táblát, majd üdvözli a felhasználót. A frissítés elvégzéséhez meg kell még vizsgálnunk, hogy a program futását egy folyamatban lévõ böngészés eredményezte vagy új látogatás elsõ lépésérõl van szó. Ennek eldöntésében egy globális változó lesz segítségünkre, mely egy másodpercben mért idõtartamot tárol. Ha a program által érzékelt legutolsó letöltés ideje az elõbb említett idõtartamnál régebbi, akkor a mostani letöltés egy újabb látogatás kezdetének tekintendõ, ellenkezõ esetben a folyamatban lévõ látogatás részének tekintjük. A 19.3. példa a regivendeg() függvénnyel bõvíti a 19.2. programot.

369

19

370

19. óra

19.3 program Felhasználókövetõ program sütik és MySQL adatbázis felhasználásával
1: <?php 2: $lhossz = 300; // a látogatás hossza 5 perc, másodpercben kifejezve 3: $adatbazis = mysql_connect( "localhost", "janos", "majomkenyerfa" ); 4: if ( ! $adatbazis ) 5: die( "Nem lehet a mysqld-hez kapcsolódni!" ); 6: mysql_select_db( "minta"", $adatbazis ) or die ( mysql_error() ); 7: if ( ! isset ( $vendeg_azon ) ) 8: $vendeg_allapot = ujvendeg( $adatbazis ); 9: else 10: { 11: $vendeg_allapot = regivendeg( $adatbazis, $vendeg_azon, $lhossz ); 12: print "Örülünk, hogy ismét körünkben üdvözölhetjük, $vendeg_azon<P>"; 13: } 14: function ujvendeg( $adatbazis ) 15: { 16: // egy új vendég! 17: $vendeg_adatok = array ( 18: "elso_latogatas" => time(), 19: "utolso_latogatas" => time(), 20: "latogatas_szam" => 1, 21: "ossz_ido" => 0, 22: "ossz_letoltes" => 1 23: ); 24: $lekerdezes = "INSERT INTO vendeg_naplo ( elso_latogatas, 25: utolso_latogatas, 26: latogatas_szam, 27: ossz_ido, 28: ossz_letoltes ) "; 29: $lekerdezes .= "values ( ". $vendeg_adatok["elso_latogatas"].", ". 30: $vendeg_adatok["utolso_latogatas"].", ". 31: $vendeg_adatok["latogatas_szam"].", ". 32: $vendeg_adatok["ossz_ido"].", ". 33: $vendeg_adatok["ossz_letoltes"]." )"; 34: $eredmeny = mysql_query( $lekerdezes ); 35: $vendeg_adatok["vendeg_azon"] = mysql_insert_id();

Állapotok tárolása sütikkel és GET típusú lekérdezésekkel

371

19.3 program folytatás
36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: setcookie( "vendeg_azon", $vendeg_adatok["vendeg_azon"], time()+(60*60*24*365*10), "/" ); return $vendeg_adatok; } function regivendeg( $adatbazis, $vendeg_azon, $lhossz ) { // egy ismerõs vendég, aki már járt nálunk korábban! $lekerdezes = "SELECT * FROM vendeg_naplo WHERE vendeg_azon=$vendeg_azon"; $eredmeny = mysql_query( $lekerdezes ); if ( ! mysql_num_rows( $eredmeny ) ) // süti van ugyan, de azonosító nincs — tehát mégiscsak új vendég return ujvendeg( $adatbazis ); $vendeg_adatok = mysql_fetch_array( $eredmeny, $adatbazis ); // ez most egy újabb letöltés, tehát növeljük a számlálót $vendeg_adatok["ossz_letoltes"]++; if ( ( $vendeg_adatok["utolso_latogatas"] + $lhossz ) > time() ) // még mindig ugyanaz a látogatás, tehát növeljük az összidõt. $vendeg_adatok["ossz_ido"] += ( time() - $vendeg_adatok["utolso_latogatas"] ); else // ez már egy új látogatás, $vendeg_adatok["latogatas_szam"]++; // ennek megfelelõen módosítjuk az adatbázist $lekerdezes = "UPDATE vendeg_naplo SET utolso_latogatas=".time().", "latogatas_szam=".$vendeg_adatok ["latogatas_szam"].", ". "ossz_ido=".$vendeg_adatok["ossz_ido"].", ". "ossz_letoltes=". $vendeg_adatok["ossz_letoltes"]." "; $lekerdezes .= "WHERE vendeg_azon=$vendeg_azon"; $eredmeny = mysql_query( $lekerdezes ); return $vendeg_adatok; } ?>

19

hogy találtunk egy megfelelõ sort. . A regivendeg() függvény elsõ lépésként lekérdezi a felhasználóról tárolt adatokat. írhatunk egy kis programot. Ezt egyszerûen úgy tesszük. Ha a mysql_num_rows() válasza 0. Ezt a sort a mysql_fetch_array() függvénnyel emelhetjük át egy PHP tömbbe (esetünkben a $vendeg_adatok nevûbe). Ebben adjuk meg azt az idõtartamot. hogy kaptunk egy sütit. amely alapján megítéljük. A mysql_query() által visszaadott sorok számát megtudhatjuk. akkor mégis új felhasználóról van szó. Befejezésül a $vendeg_adatok tömb tartalmával frissítjük a vendeg_naplo táblát és a hívó program is megkapja ezt a tömböt. A függvény megvalósítását a 19. átfogóbb képet kell adnunk a látogatókról. hogy a programot az $lhossz nevû változóval bõvítettük.372 19. Megvizsgáljuk. tehát a $vendeg_adatok["ossz_letoltes"] változó értékét eggyel növelnünk kell. de a lényeg megértéséhez ez a példa is bõven elegendõ. azaz 5 percre állítottunk. átadva annak az adatbázisra hivatkozó. A korábbi példák kódjához az include() függvény alkalmazásával férhetünk hozzá. óra Látható. Erre válaszul meghívjuk a regivendeg() függvényt. ha meghívjuk a mysql_num_rows() függvényt az eredménysorok azonosítójával. akkor az azt jelenti. amit 300 másodpercre. hogy a $vendeg_adatok["utolso_latogatas"] és az $lhossz összege a pillanatnyi idõnél késõbbi idõpont-e. hogy ellenõrizzük. hogy a legutóbbi letöltés óta eltelt idõt hozzáadjuk a $vendeg_adatok["ossz_ido"] változóhoz. vagyis a legutóbbi látogatás még folyamatban van és ez a letöltés még annak a része. Ha úgy találtuk. példában találjuk.4. melyben a vendeg_azon mezõ egyenlõ a $vendeg_azon változó értékével. melynek azonosítója egyezik a süti értékével. A program mostani futása egy oldal letöltésének következménye. Elkészítjük az allapotMegjelenites() függvényt. hogy már új látogatásról van szó. tehát meg kell hívnunk az ujvendeg() függvényt. Ha késõbbi. amely kiszámolja a lekérõ felhasználó átlagértékeit és megjeleníti azokat a böngészõben. hogy a feladaton túl vagyunk. Tegyük fel. hogy a letöltés mely látogatáshoz tartozik. az elmélet valóban mûködik-e a gyakorlatban. Ennek tényét úgy õrizzük meg. hogy a legutóbbi letöltés óta kevesebb. hogy rögzítsük ezt a tényt. A valóságban persze komolyabb megjelenésû. Most. hogy kikeressük a vendeg_naplo tábla azon sorát. egyszerûen növeljük a $vendeg_adatok["latogatas_szam"] változó értékét. Bár ezt külön nem emeltük ki. A $vendeg_azon változó jelenlétének érzékelése azt jelenti számunkra. mint $lhossz idõ telt el. a $vendeg_azon és az $lhossz változót. természetesen az utolso_latogatas mezõt is a pillanatnyi idõhöz igazítottuk.

hogy egy felhasználó látogatásonként átlagosan hányszor kattintott olyan hivatkozásra. Hasonló sorral kell bõvítenünk webhelyünk minden olyan oldalát. majd mondatokká formálva megjelenítjük azokat a felhasználónak.php"). hogy a felhasználókövetõ kód lefusson. ($vendeg_allapot["ossz_letoltes"]/ /$vendeg_allapot["latogatas_szam"]) ). print "<p>Az Ön látogatásainak száma $vendeg_allapot["latogatas_szam"]. . print "<p>Átlagos látogatási idõtartam: $idotartam másodperc</p>\n\n".1 ábra a 19.3.Állapotok tárolása sütikkel és GET típusú lekérdezésekkel 373 19.2f". ($vendeg_allapot["ossz_ido"]/ /$vendeg_allapot["latogatas_szam"]) ). Ezt vagy az ujvendeg(). print "<p>Üdvözöljük! Az Ön azonosítója". úgy számoljuk ki. $letoltesek = sprintf( "%. Azt. allapotMegjelenites().4 program kimenetét mutatja.2f".4 program A 19. function allapotMegjelenites() { global $vendeg_allapot. Az include() sorral biztosítottuk. Az allapotMegjelenites() függvény a $vendeg_allapot globális változó alapján dolgozik. } ?> 19 A 19."</p>\n\n". Ugyanezzel az értékkel a $vendeg_allapot["ossz_ido"]-t elosztva a látogatások átlagidejét kaphatjuk meg. $vendeg_allapot["vendeg_azon"].program. mely a webhely valamelyik oldalára mutatott. vagy a regivendeg() függvény hozza létre és tölti fel a vendeg_naplo tábla megfelelõ sorának értékeivel."</p>\n\n". melyet be szeretnénk vonni a statisztikába. print "<p>Letöltések átlagos száma látogatásonként: $letoltesek</p>\n\n".3-as program által begyûjtött letöltési statisztikák megjelenítése 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: <?php include("19. $idotartam = sprintf( "%. hogy elosztjuk a $vendeg_allapot["ossz_letoltes"] változót a látogatások számával. Ezeket a számokat az sprintf() segédletével kerekítjük két tizedesjegyre.

Hogy mire lehet mindezt használni? Könnyíthetjük felhasználóink eligazodását webhelyünkön. ha sütiket használunk. de akár naplóztathatnánk a látogatáshoz használt böngészõ típusát vagy a látogatók IP címeit is. hogy a program rögzítse a felhasználó érdeklõdési területeit a webhelyen belül. jobban járunk. A felhasználó letilthatja a sütik használatát. de a felhasználó böngészõjétõl is függ használatuk. Nem csak a felhasználó kénye-kedvének vagyunk kitéve. Vegyünk példaként egy olyan ûrlapot. illetve az általa futtatott programok számára. Ha csak egy látogatás folyamán szeretnénk állapot-adatokat tárolni. vastag betûvel kiemeljük a számukra feltehetõleg különösképp érdekes mondanivalót. úgy. Egyikük-másikuk a sütik kezelése területén dokumentált hibákkal is rendelkezik. a böngészõk pedig nem mindig egyformán valósítják meg a szabványt. ahová az ûrlapot küldjük. óra Természetesen a példát úgy is bõvíthetnénk. kép A használati statisztika megjelenítése Lekérdezõ karakterláncok használata A sütik hatalmas hátránya azok felhasználó-függõsége.hu/proba5.1. Ha egy ûrlapot a GET eljárással küldünk el. hogy böngészési szokásaikat kielemezve.kiskapu. ha egy sokkal hagyományosabb megoldáshoz folyamodunk. akkor annak mezõit és azok értékeit URL kódolásban hozzáillesztjük ahhoz a címhez (URL-hez).php?nev= å 344343&felhasznalo=Szy+Gyorgy . Az értékek ekkor elérhetõk lesznek a kiszolgáló.374 19. amely egy felhasznalo és egy nev mezõt tartalmaz. Ekkor a lekérés a következõképp fog festeni: http://php. 19.

kiskapu.hu". Erre a PHP urlencode() függvénye használható. hogy http%3A%2F%2Fwww. A PHP visszafejti a jeleket. hogy egy címet (URL-t) szeretnénk átadni egy lapnak paraméterként.urlencode( $erdeklodes ).urlencode( $honlap ). a talált adatokat a $HTTP_GET_VARS asszociatív tömbben teszi elérhetõvé a program számára. így a fontos adatokat könnyedén továbbíthatjuk lapról lapra. viszonylag könnyen készíthetünk mi is ilyen karakterláncokat. A felhasznalo nevû GET változóhoz így az alábbi két módon férhetünk hozzá: $HTTP_GET_VARS["felhasznalo"]. Tegyük fel. $lekerdezes = "honlap=". és emellett a mezõk nevével azonos nevû globális változókat is létrehoz.hu").php?honlap=http%3A%2F%2Fwww. $honlap = "http://www. hogy a kulcs–érték párokat URL formára alakítsuk. $felhasznalo. akár saját GET lekéréseket is összerakhatunk. ezeket a név–érték párokat pedig ÉS jelek (&) határolják. // azt írja ki.kiskapu. ?> <A HREF="masiklap.kiskapu.kiskapu.= "&erdeklodes=". A következõ kódrészlet két változóból épít fel egy lekérdezõ karakterláncot: <?php $erdeklodes = "sport". 375 19 Lekérdezõ karakterlánc készítése Alapvetõ feladatunk a lekérdezõ karakterláncok készítésekor. a megfelelõ tartalommal.hu& å erdeklodes=sport .hu Az URL kódolású szövegek elõállítása így nem okoz gondot. A GET lekérések szerencsére nem csak ûrlapokkal kapcsolatban használhatók. mely egy tetszés szerinti karakterláncot vár és annak kódolt változatával tér vissza: print urlencode("http://www.php?<?print $lekerdezes ?>">Gyerünk!</A> Ennek hatására a böngészõhöz az URL már a kódolt lekérdezõ karakterlánccal bõvítve jut el: masiklap. $lekerdezes . azaz egy lekérdezõ karakterlánc részeként.Állapotok tárolása sütikkel és GET típusú lekérdezésekkel Minden mezõ nevét egy egyenlõségjel (=) választja el annak értékétõl.

5.hu/lajos/" 22: ). Ez így a problémának kissé kezdetleges megoldása.php programon belül ugyanilyen nevû. . mert a változónevek kódba ágyazásával megnehezítjük a kód újrahasznosítását. Ez különösen fontos. egyszerûvé kell tennünk a lekérdezõ karakterláncokat tartalmazó hivatkozások készítését.5. hogy hatékonyan küldhessünk adatokat lapról-lapra. 15: $lsztring . 21: "honlap" => "http://www. Ahhoz. ha meg szeretnénk tartani a PHP azon hasznos tulajdonságát. 20: "erdeklodes" => "Filmek (fõleg mûvészfilmek)".= "&". program Lekérdezõ karakterláncot készítõ függvény 1: <html> 2: <head> 3: <title>19. 10: if ( ! $lekerdezes ) return $QUERY_STRING. miszerint a nem kifejezetten programozók is könnyedén eligazodhatnak rajta.5 program Lekérdezõ karakterláncot készítõ függvény</title> 4: </head> 5: <body> 6: <?php 7: function lsztring( $lekerdezes ) 8: { 9: global $QUERY_STRING. amely a kapott asszociatív tömb alapján elkészít és visszaad egy lekérdezõ karakterláncot. példa egy olyan lsztring() nevû függvény megvalósítását tartalmazza. "=" . URL-bõl visszafejtett globális változókként lesznek elérhetõk.= urlencode( $kulcs ) . A 19. 11: $lsztring = "".376 19.kiskapu. 18: } 19: $lekerdezes = array ( "nev" => "Kis Lajos Bence". 19. 23: print lsztring( $lekerdezes ). óra A honlap és az erdeklodes paraméterek a masiklap. 12: foreach( $lekerdezes as $kulcs => $ertek ) 13: { 14: if ( strlen( $lsztring ) ) $lsztring . urlencode( $ertek ). 16: } 17: return $lsztring.

módosítatlan ûrlapadatok könnyedén továbbadhatóak legyenek más lapok számára. kódolt karakterláncot. amit jelen esetben a $lekerdezes változó képében adunk át neki. Ezzel oldhatjuk meg azt. A kulcs–érték párokat & jellel kell elválasztanunk.kiskapu. hogy adatokat adhassunk át egyes lapjaink között. a programot tartalmazó lap lekérdezõ karakterláncát adjuk vissza. Ha a $lekerdezes tömb nem üres. amit a $QUERY_STRING változóval érhetünk el. hogy nev=Kis+Lajos+Bence&erdeklodes= Filmek+%28f%F5leg+m%FBv%E9szfilmek 25: // %29&honlap=http%3A%2F%2Fwww. program (folytatás) 24: // azt írja ki. A $kulcs és $ertek változókat az urlencode() függvénnyel kódolva és egy egyenlõségjellel (=) elválasztva adjuk hozzá az $lsztring végéhez. A foreach segítségével sorra vesszük a tömb elemeit.php?<? print lsztring($lekerdezes) ?>">Gyerünk!</a> 29: </p> 30: </body> 31: </html> Az lsztring() egy asszociatív tömböt vár paraméterként. úgy.5. ezt a karaktert is hozzátesszük a lekérdezõ karakterlánchoz. Ha a $lekerdezes még nem kapott volna értéket.Állapotok tárolása sütikkel és GET típusú lekérdezésekkel 377 19.hu%2Flajos%2F 26: ?> 27: <p> 28: <a href="masiklap. 19 . így ha nem a ciklus elsõ lefutásánál tartunk – azaz az $lsztring változó már nem üres –. a visszaadandó lekérdezõ karakterláncot az $lsztring változóba helyezzük. Ezek után már csak vissza kell adnunk az összeállított. hogy a GET-tel továbbított. hogy azok a $kulcs és $ertek változókon keresztül legyenek elérhetõk. E függvény alkalmazásával pár sornyi PHP kód is elég.

Létezik azonban egy tömb is. Tudjuk. Ennek kapcsán láthattuk. hogy lekérdezõ karakterláncban szerepelhessen? 4. Lehetõség van azonban arra. Tehát ha sok webhely jelentet meg egy külsõ reklámszolgáltató vagy számláló programot oldalain. azzal semmiféle további kapcsolatba nem kerül. hogyan tárolhatók adatok a webhely felhasználóinak szokásairól sütik és egy adatbázis felhasználásával. Melyik beépített változó tartalmazza a lekérdezõ karakterláncot nyers formában? 5. Mûhely A mûhelyben kvízkérdések találhatók. óra Összefoglalás Ezen az órán a weblapok közti információátadás két módjával ismerkedhettünk meg. Azon túl. amely jelentõsen egyszerûsíti ezek használatát. hogyan kell azokat kódolni és egy hasznos eszközt is a magunkénak mondhatunk. A válaszokat az A függelékben helyeztük el. A lekérdezõ karakterlánc formájában elküldött név–érték párok globális változókként válnak elérhetõvé. hogy sütit állítsunk be egy kép letöltésének válaszaként. melyek segítenek megszilárdítani az órában szerzett tudást. Kvíz 1. hogyan használjuk a setcookie() függvényt sütik létrehozására. Kérdések és válaszok Van e valamiféle komoly biztonságot vagy személyiségi jogokat sértõ velejárója a sütik használatának? A kiszolgáló csak a saját tartományán belül levõ gépek sütijeihez férhet hozzá. melyek a felhasználók igényeit is figyelembe veszik. amely tartalmazza õket. Mi ennek a tömbnek a neve? . Tudjuk. Segítségükkel több oldalból álló webes alkalmazások alakíthatók ki. hogy a süti a felhasználó fájlrendszerében tárolódik. ezek szolgáltatója képes lehet a látogatók követésére különbözõ webhelyek között is. Milyen függvénnyel tehetünk egy tetszõleges karakterláncot alkalmassá arra. Milyen függvénnyel vehetjük rá a weboldalunkat letöltõ felhasználó böngészõjét. hogy létrehozzon egy sütit és tárolja azt? 2. Láttunk lekérdezõ karakterláncokat is. Hogyan törölhetjük a sütiket? 3.378 19.

Írjuk át az elõbbi feladat programját úgy.Állapotok tárolása sütikkel és GET típusú lekérdezésekkel 379 Feladatok 1. hogy minden oldal köszönjön. 2. ne sütikben. milyen néven köszöntsék a webhely oldalai. Tegyük lehetõvé. 19 . illetve a megfelelõ háttérszínnel jelenjen meg. valamint hogy megadhassa. Oldjuk meg sütikkel. hogy a webhelyünket meglátogató felhasználó beállíthassa a weboldalak háttérszínét. hogy az adatokat lekérdezõ karakterláncban tároljuk.

.

A PHP 4 ezeken kívül további lehetõségeket is nyújt.20. különbözõ függvényei vannak a felhasználó állapotának mentésére is. az állapot mentése egyszerû függvényhívásokkal végezhetõ el. Ebben az órában a következõkrõl tanulunk: • Mik azok a munkamenet-változók és hogyan használhatók? • Hogyan indítsunk el és folytassunk egy munkamenetet? • Hogyan tartsuk nyilván a munkamenetek változóit? • Hogyan semmisítsünk meg egy munkamenetet? • Hogyan töröljük egy munkamenet egyes változóit? . hogy hogyan lehet süti vagy lekérdezõ karaktersorozat használatával menteni az oldalak állapotát. Ezen függvények használata nagyon hasonló az elõzõ órában tanultakhoz. ÓRA Állapotok tárolása munkamenet-függvényekkel Az elõzõ órában áttekintettük. de mivel közvetlenül a nyelvbe vannak építve.

A munkamenet-függvények mindkét. a munkameneteket mindig saját magunknak kell elindítanunk. A php. Az elõzõekhez képest igen nagy elõny. Ezek egy különleges felhasználói azonosítót biztosítanak.ini fájlban található a következõ sor: session. Ha nem változtatjuk meg az értéket. így biztosítva. az elõzõ órában tanult módszert támogatják. hozzákapcsolva azokat ehhez az azonosítóhoz. a session_id() függvénnyel rögtön hozzáférhetünk a felhasználó munkamenet-azonosítójához. ugyanakkor az azonosítókat minden.auto_start = 0 Változtassuk a session. hogy a függvények használatával kevesebb munka hárul ránk. Ezt követõen a munkamenethez kapcsolt összes globális változó elérhetõ lesz a kódban. mindig meg kell hívnunk a session_start() függvényt. vagy a régebbi látogatásakor szerzett meglévõ azonosítója kerül felhasználásra.auto_start értékét 1-re. kap egy azonosítót. A munkamenet állapotát a rendszer általában egy ideiglenes fájlban tárolja. Alapértelmezés szerint a sütiket használják. A session_id() függvénnyel lekérdezhetjük vagy módosíthatjuk az azonosítót. példában található program a munkamenet-azonosítót írja ki a böngészõbe. . Munkamenet indítása a session_start() függvénnyel Hacsak nem változtattuk meg a php. így a PHP dokumentumokban a munkamenetek rögtön elindulnak. a saját oldalunkra mutató kereszthivatkozásban elhelyezhetjük. Miután a munkamenet elindult. alapállapotban azok nem indulnak el automatikusan.ini fájlt. amelyekrõl az elõzõ órában tanultunk. hogy az oldal a sütiket nem támogató böngészõvel is használható legyen.382 20. amellyel oldalról oldalra különbözõ információkat vihetünk át. óra Mik azok a munkamenet-függvények? A munkamenet-függvényekkel egyszerûen végezhetjük el azokat a mûveleteket. Amikor a felhasználó lekér valamilyen munkamenetet támogató oldalt. A 20. de a megfelelõ modulok használatával az adatokat adatbázisba is tehetjük.1.

amíg a böngészõ aktív. ugyanazt az azonosítót kapja meg. mielõtt bármit kiíratnánk a böngészõvel. Vegyük észre. de ez a viselkedés a php. A süti a következõkben lett beállítva: HTTP/1. 20 .cookie_lifetime beállításának megváltoztatásával módosítható.ini fájl session. program Munkamenet indítása vagy folytatása</title> </head> <body> <?php print "<p>Üdvözöljük! Az Ön munkamenet-azonosítója " . 07 Jan 2001 13:50:36 GMT Server: Apache/1.Állapotok tárolása munkamenet-függvényekkel 383 20.1. ?> </body> </html> A fenti program elsõ lefutása után létrehoz egy munkamenet-azonosítót. Ezzel mindegyik munkamenetnek megadjuk a mûködési határidõt. Amikor a felhasználó leállítja a böngészõt. ?> <html> <head> <title>20. path=/ Connection: close Content-Type: text/html Mivel a session_start() megpróbálja beállítani a sütit. amikor munkamenetet hoz létre.9 (Unix) PHP/4. hogy a munkamenet csak addig tarthat.1. program Munkamenet indítása vagy folytatása 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: <?php session_start(). Ez azt jelenti.session_id().1 200 OK Date: Sun. hogy a felhasználó engedélyezze a sütiket a böngészõjében. Az alapértelmezett beállítás 0. Ehhez természetesen szükséges."</p>\n\n". el kell indítani.3 Set-cookie: PHPSESSID=2638864e9216fee10fcb8a61db382909. itt kell a lejárati idõt másodpercben megadni. hogy nincs lejárati idõ. példa kimenetének fejléceit. a sütit nem menti.0.3.1. Vizsgáljuk meg a 20. Ha a felhasználó késõbb újratölti az oldalt.

. A függvény visszatérési értéke true. nem pedig a változók értékeit. A 20. amelyeket késõbb bármelyik. példában egy olyan PHP program látható.2. A 20.2. A változó bejegyzéséhez.384 20.2.3. ?> </body> </html> A 20. print "A változókat bejegyeztük". példában bejegyzett változókat használja. így határozva meg egy vagy több bevezetendõ változó nevét.2. példában látható kódnak nincs túl sok értelme. session_register( "termek2" ). program Változók bejegyzése 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: <?php session_start(). ?> <html> <head> <title>20. 20.2. print session_encode(). $termek1 = "Ultrahangos csavarhúzó". $termek2 = "HAL 2000". Egy munkamenet során tetszõleges számú globális változót vezethetünk be. példában két változó bejegyzését láthatjuk. A session_register() függvény paramétereiben karaktersorozatokat kell megadni. a munkameneteket támogató oldalunkról elérhetünk. amely a 20. óra Munkamenet-változók A munkamenet-azonosító hozzárendelése a felhasználóhoz csak az elsõ lépés. program Változók bejegyzése</title> </head> <body> <?php session_register( "termek1" ). bevezetéséhez a session_register() függvényt kell használnunk. amíg a felhasználó be nem tölt egy új oldalt. A függvény paramétereiben csak a változók nevét kell megadni. ha a bejegyzés sikeres volt.

program Bejegyzett változók használata 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: <?php session_start(). program Bejegyzett változók használata</title> </head> <body> <?php print "Az Ön által kiválasztott termékek:\n\n". program eredménye a 20.3. ábra Bejegyzett változók használata Hogyan mûködik mindez? A PHP 4 a háttérben folyamatosan fenntart egy ideiglenes fájlt a munkamenet számára. Ha ezt meghatározzuk. Látjuk.1. az ideiglenes munkamenet-fájlok ezután . ?> </body> </html> A 20. 20 20.3. ?> <html> <head> <title>20. hogy az oldalról hozzáférünk a másik programban bejegyzett $termek1 és $termek2 változókhoz.3.1. print "<ul><li>$termek1\n<li>$termek2\n</ul>\n". de a függvénynek egy könyvtár elérési útját is megadhatjuk.Állapotok tárolása munkamenet-függvényekkel 385 20. A session_save_path() függvény használatával e fájl elérési útját deríthetjük ki. ábrán látható.

óra ide kerülnek. láthatjuk.1. Ha a session_register() függvénnyel bejegyeztünk egy változót. A 20.4. Ezután munkamenetváltozókkal létrehozunk egy egyszerû „bevásárlókosarat”. ha a felhasználó többféle terméket tartalmazó változókat szeretne bevezetni? Szerencsére a session_register() függvény paraméterében tömb típusú változót is megadhatunk. ahová a rendszer az ideiglenes munkamenetfájlokat menti. A 20. Mit tehetünk. ?> <html> <head> <title>20. A szerzõ rendszerén a print session_save_path().386 20. a PHP beírja a fájlba a változó nevét és értékét. visszatérési értéke /tmp.4. 20. de a függvény mûködése nem tûnik túl rugalmasnak.termek2|s:8:"HAL 2000".4. visszatérési értéke annak a könyvtárnak az elérési útja lesz. program Tömb típusú változó bejegyzése</title> 7: </head> . példa bemutatta a session_register() függvény használatát. hogyan tárolódnak a bejegyzett változók: termek1|s:22:"Ultrahangos csavarhúzó". Ha a függvényt paraméter nélkül futtatjuk. példában a felhasználó több termék közül választhat. Amikor meghívjuk a session_register() függvényt. A /tmp könyvtár például a következõ fájlokat tartalmazhatja: sess_2638864e9216fee10fcb8a61db382909 sess_76cae8ac1231b11afa2c69935c11dd95 sess_bb50771a769c605ab77424d59c784ea0 Amikor megnyitjuk azt a fájlt. példában visszaadott munkamenet-azonosítót tartalmazza. Késõbb innen kapjuk meg a változó értékét. annak a PHP program futása során módosított értéke a munkamenet-fájlban is meg fog változni. melynek neve a 20. program Tömb típusú változó bejegyzése 1: 2: 3: 4: 5: 6: <?php session_start().2.

szögletes zárójellel együtt kell megadni a NAME paraméterét.4. A HTML dokumentumon belül a FORM elem ACTION tulajdonságát beállítjuk a jelenlegi dokumentumra. program (folytatás) 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: <body> <h1>Termékböngészõ lap</h1> <?php if ( isset( $termekek_urlap ) ) { $termekek = $termekek_urlap.Állapotok tárolása munkamenet-függvényekkel 387 20. print "<p>A termékeit bejegyeztük!</p>. A $termekek_urlap tömböt közvetlenül nem jegyezzük be. amely a termékek számával megegyezõ OPTION összetevõt tartalmaz. Ezt a változót hozzárendeljük a $termekek változóhoz.program.php">Tartalom</a> </body> </html> 20 Elõször elindítjuk a munkamenetet a session_start() függvénnyel. mert ez egy késõbbi kitöltés során ütközést okozhat az ugyanilyen nevû. . session_register( "termekek" ). POST eljárással érkezett változóval. } ?><p> <form method="POST"> <select name="termekek_urlap[]" multiple size=3> <option> Ultrahangos csavarhúzó <option> HAL 2000 <option> Kalapács <option> TV <option> Targonca </select> </p><p> <input type="submit" value="Rendben"> </form> </p> <a href="20. Emlékezzünk rá. amit a session_register() függvénnyel bejegyzünk. hogy létezik-e a $termekek_urlap tömb. feltehetjük. hogy a kérdõívet kitöltötték. Ha a változó létezik. Létrehozunk egy termekek_urlap[] nevû SELECT elemet. Ezzel hozzáférünk minden korábban beállított munkamenet-változóhoz. A PHP kód blokkjában megvizsgáljuk. hogy a HTML dokumentum azon elemeinek.5. Így a felhasználó választása egy tömbbe kerül. amelyek engedélyezik több elem kiválasztását.

4. 1: 2: 3: 4: 5: 6: 7: . Természetesen egy igazi „bevásárlókosár-program” megírásakor a termékeket érdemes adatbázisban. program Hozzáférés bejegyzett tömb típusú változóhoz <?php session_start(). //kódolt karaktersorozat kiírása ?> <html> <head> <title>20. és nem a futtatandó kódban tárolni. program Hozzáférés bejegyzett tömb típusú változóhoz</title> 8: </head> 9: <body> 10: <h1>Tartalom lap</h1> 11: <?php 12: if ( isset( $termekek ) ) 13: { 14: print "<b>A bevásárlókocsi tartalma:</b><ol>\n".5. példa csak azt mutatta be.program.5. hogy létezik-e a $termekek változó. A 20. elemeit egyenként kiírjuk a böngészõbe.5. hogy valóban hozzáférünk a bejegyzett tömbhöz. 17: print "</ol>".5. ahol bemutatjuk. Ez a kód a 20. hogyan érhetõ el egy tömb típusú változó egy másik oldalról. print session_encode().4. 20. és 20. Ha létezik.php">Vissza a termékválasztáshoz</a> 21: </body> 22: </html> A session_start() használatával folytatjuk a munkamenetet. óra A kód végén megadunk egy hivatkozást. 15: foreach ( $termekek as $egytermek ) 16: print "<li>$egytermek". 18: } 19: ?> 20: <a href="20. Ellenõrizzük.388 20. példában található.

A session_unset() a munkamenet-fájlból és a programból is eltávolítja a változókat. amely egy munkamenetet vár. és minden más bejegyzett változót a memóriából. a változók továbbra is elérhetõk. Valójában a session_destroy() függvény nem semmisíti meg a bejegyzett változókat. session_register( "proba" ). a $proba változó å már nem létezik. ezért létre kell hoznia egy újat. az már nem látja a korábban törölt munkamenetet. Minden korábban bejegyzett változó elvész. $proba = 5. // kiírja. session_destroy(). session_register( “proba” ). 20 . amely eltávolítja a $proba. A session_destroy() függvénynek nincsenek paraméterei. A következõ kódrészlet létrehoz. majd rögtön megsemmisít egy munkamenetet: session_start(). Amikor olyan oldalt töltünk be. A következõ kódrészletben látható.Állapotok tárolása munkamenet-függvényekkel 389 A munkamenet és a változók bejegyzésének törlése A munkameneteket és a bejegyzett változókat a session_destroy() függvénnyel törölhetjük. hogy 5 A munkamenetbõl a bejegyzett változókat a session_unset() függvénnyel távolíthatjuk el. futtatásához azonban szükséges egy folyamatban lévõ munkamenet. print $proba. ezért óvatosan használjuk. amelyben a session_destroy() függvényt futtattuk. A munkamenet megszüntetése nem törli a bejegyzett változókat. print $proba. session_destroy(). Abban a kódban. hogy az 5-re állított $proba változó a session_destroy() meghívása után is elérhetõ marad. session_destroy(). session_start(). session_unset(). $proba = 5. session_start(). // nem ír ki semmit. A munkamenet megszüntetése elõtt meghívjuk a session_unset() függvényt.

} Látható. Tudnunk kell azonban. amelyet beágyazhatunk a munkamenetet támogató oldalra mutató HTML hivatkozásokba: <a href="masik_lap. hogy a változó valóban be lett-e jegyezve és értéke megfelelõ-e. ?>">Másik lap</a> A böngészõben ez már így jelenik meg: <a href="masik_lap. Ez a lehetõség alapállapotban kikapcsolt.php?<? print SID. óra Munkamenet-azonosítók a lekérdezõ karakterláncban Áttekintettük a sütin alapuló munkamenetek kezelését.i:1. print session_encode(). A probléma elkerülése végett építsünk be programunkba egy. de használatával kódjaink hordozhatóbbá válnak. Nem feltételezhetjük ugyanis. . Ha a PHP 4-et az --enable-trans-sid kapcsolóval fordítottuk le a fenti lekérdezõ karakterlánc automatikusan hozzáadódik minden HTML hivatkozáshoz. session_start(). láttuk. A PHP létrehozza a SID állandót. és az összes korábban bejegyzett változó a szokásos módon elérhetõ lesz. amikor a céloldalon meghívjuk a session_start() függvényt. így ellenõrizhetjük.390 20.s:8: å "HAL 2000". Munkamenet-változók kódolása és visszafejtése Amikor megnéztük a munkamenet-fájl tartalmát. a munkamenet-azonosító továbbadására alkalmas lekérdezõ karakterláncot. A SID név–érték alakú állandó karakterlánc. ha a böngészõ nem küldött vissza azonosítót tartalmazó sütit. hogyan mûködik a session_encode() függvény. hogy a látogató böngészõje támogatja a sütik használatát.php?PHPSESSID= å 08ecedf79fe34561fa82591401a01da1">Másik lap</a> A munkamenet-azonosító automatikusan átvételre kerül. A következõ kódrészletben láthatjuk. hogyan menti és kódolja a PHP a bejegyzett változókat. Ez hasznos lehet a munkamenetek nyomkövetésénél. A session_encode() függvény használatával bejegyzett változókat tartalmazó adatbázisokat is készíthetünk. hogy ez nem a legbiztosabb módszer.s:8:"Targonca". A kódolt karaktersorozathoz a session_encode() függvény használatával bármikor hozzáférhetünk. hogy a függvény tárolási alakjukban adja vissza a bejegyzett változókat."<br>". // minta eredmény: termekek|a:2:{i:0.

391 20 Munkamenet-változó bejegyzésének ellenõrzése Mint láttuk. ha a változó bejegyzett. hogy létezzenek å munkamenet-változók session_decode( "termekek|a:2:{i:0. A függvény paraméterében egy változó nevét tartalmazó karakterláncot kell megadni. Ezt ellenõrizzük is: a $termekek tömb minden elemét kiíratjuk.Állapotok tárolása munkamenet-függvényekkel A session_decode() függvény használatával a változók kódolt formájából visszanyerhetjük az értéküket. } // Kimenet: // HAL 2000 // Targonca A szokásos módon elindítjuk a munkamenetet. A következõ kódrészlet ezt mutatja be: session_start(). azaz. å i:1. . Erre való a session_is_registered() függvény. a bejegyzett változó jelenlétét az isset() függvénnyel ellenõrizhetjük. if ( session_is_registered ( "termekek" ) ) print "A 'termekek' változó bejegyzett!".s:8:\"Targonca\". a session_unset() függvénnyel töröljük az összes korábban bejegyzett változót. foreach ( $termekek as $egytermek ) { print "$egytermek<br>\n". Hogy tiszta lappal induljunk. Ez akkor lehet hasznos. // nem szabad.s:8:\”HAL 2000\". session_unset().}" ). de más módon is megvizsgálhatjuk a változó létezését. a visszatérési érték pedig true. A függvény párosítja a változóneveket a megfelelõ értékekkel. hogy a változó tényleg a munkamenet bejegyzett változója vagy csak egy GET kérelem eredményeként kaptuk. Ezután átadjuk a session_decode() függvénynek a változók kódolt formáját. ha biztosak akarunk lenni a változó forrásában.

hogyan indítsunk el munkamenetet a session_start() függvénnyel.392 20. Elég csúnyán néz ki. De emlékezzünk rá. lekérdezõ karakterláncainkban használjuk a SID állandót a munkamenet-azonosító átadására. A munkamenet megsemmisítésére a session_destroy() függvényt használtuk. hogyan ellenõrizhetjük a bejegyzést a session_is_registered() függvénnyel. Az adatok fájlban vagy adatbázisban való tárolása miatt a sebesség csökkenhet. Különféle módszereket alkalmaztunk: sütiket és lekérdezõ karakterláncokat használtunk. A süti nem igazán megbízható és nem tárolhat sok információt.use_cookies 0ra állításával a php. ami gondot okoz egy népszerû webhelyen. Mindegyik megközelítési módnak megvannak a maga elõnyei és hátrányai. Használatáról a körülmények mérlegelése után kell dönteni. Kérdések és válaszok Van valamilyen veszélye a munkamenet-függvények használatának. Láttuk. hogy a sütik használata nem lehetséges több tartományon keresztül. amirõl még nem tudunk? A munkamenet-függvények alapvetõen megbízhatók. de viszonylag nagy mennyiségû információt hordoz magában. Ugyanakkor egy egyszerû azonosítóval nagy mennyiségû adathoz férhetünk hozzá. hogyan menthetjük az állapotokat egy állapot nélküli protokollban.ini fájlban. valamint hogyan semmisíthetjük meg a változókat a session_unset() függvénnyel. Ezzel szemben hosszú ideig fennmaradhat. ha több tartománynevet használunk ugyanazon a kiszolgálón (elektronikus kereskedelemi alkalmazásoknál ez gyakori). óra Összefoglalás Ebben és az elõzõ órában áttekintettük. Hogy minél több felhasználó érhesse el a munkamenetet támogató környezetet. Ezért. . tiltsuk le a sütik használatát a session. A lekérdezõ karakterlánc a süti ellentéte. hogyan jegyezhetünk be változókat a session_register() függvénnyel. néha ezeket fájlokkal és adatbázisokkal ötvöztük. Ebben az órában megtanultuk.

amely sütit vagy lekérdezõ karakterláncot használ. Hogyan semmisíthetjük meg a munkamenetet és törölhetjük el minden nyomát? 5.Állapotok tárolása munkamenet-függvényekkel 393 Mûhely A mûhelyben kvízkérdések találhatók. Melyik függvény adja vissza a jelenlegi munkamenet azonosítóját? 3. Ezután a környezet minden oldala a beállított háttérszínnel indult és név szerint üdvözölte a felhasználót. Melyik függvényt használjuk egy munkamenet elindítására? 2. Hogyan rendelhetünk változókat a munkamenethez? 4. hogy a $proba nevû változó be van-e jegyezve egy munkameneten belül? 20 Feladatok 1. Készítsünk programot. Hogyan ellenõrizhetjük. hogy mozgása nyomon követhetõ legyen. Készítsük el ezt a programot a PHP 4 munkamenet-függvényeivel. Mi a SID állandó értéke? 7. hogy oldalról oldalra vigye tovább a felhasználó válaszait. Az elõzõ óra Feladatok részében készítettünk egy programot. hogy a felhasználó a környezet mely oldalait látogatta meg. . Kvíz 1. melyek segítenek megszilárdítani az órában szerzett tudást. A válaszokat az A függelékben helyeztük el. amely munkamenet-függvények használatával emlékezik rá. Hogyan semmisíthetjük meg az összes munkamenet-változót a futó programban és az egész munkamenetben? 6. 2. Készítsük el a felhasználó lépéseit tartalmazó hivatkozások sorozatát.

.

21. hogyan társaloghatunk távoli számítógépekkel és hogyan vehetünk át adatokat a felhasználótól. de a legtöbb alapelv felhasználható Microsoft Windows rendszerben is. amelyek külsõ programok saját gépünkön való futtatására használhatók. A fejezetben a következõket tekintjük át: • Hogyan közvetítsünk adatokat a programok között? • A héjparancsok végrehajtására és az eredmények megjelenítésére milyen lehetõségeink vannak? • Hogyan írhatunk biztonságosabb PHP programokat? . A fejezet példái Linux operációs rendszerre készültek. ÓRA Munka kiszolgálói környezetben A korábbi fejezetekben áttekintettük. olyan eljárásokat tanulunk meg. Ebben a fejezetben ismét kitekintünk.

"r" ) or die( "A 'who' paranccsal nem vehetõ fel kapcsolat" ). $kiszolgalo="www. hogy írási módban. és a kapott felhasználóneveket mailto hivatkozásokban használjuk fel. Ugyanazzal az adatcsatornával nem lehet egyszerre írni és olvasni is egy folyamatot. A 21. és azt. $sor ).396 21. A popen()-nek a 'w' jelzõvel adhatjuk meg. $sor = ereg_replace( "^([a-zA-Z0-9_\-]+). a pclose() paranccsal le kell zárnunk az adatcsatornát.*". A popen() paramétereiben meg kell adni egy parancsot elérési úttal.1. A popen() visszatérési értéke az fopen() visszatérési értékéhez hasonló fájlazonosító. } . hogy írási vagy olvasási módban akarjuk használni a függvényt. amikor egy folyamat kimenetét sorról sorra szeretnénk elemezni. A pclose() függvény paraméterében egy érvényes fájlazonosítót kell megadni.1-es példában a GNU who parancs kimenetét elemezzük. Amikor befejeztük a munkát a popen() által megnyitott folyamattal. program A who UNIX parancs kimenetének olvasása a popen() segítségével 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: <html> <head> <title>21. hogy olvasási módban akarjuk használni a függvényt. if ( strlen( $sor ) <= 1 ) continue. program A who UNIX parancs kimenetének olvasása a popen() segítségével</title> </head> <body> <h2>A rendszerbe bejelentkezett felhasználók</h1> <?php $ph = popen( "who".kiskapu.hu". óra Folyamatok összekötése a popen() függvénnyel Ahogy a fájlokat nyitottuk meg írásra vagy olvasásra az fopen() segítségével.1. "<a href=\"mailto:\\1@$kiszolgalo\">\\1</a><br>\n". 1024 ). A popen() használata akkor javasolt. 21. print "$sor". while ( ! feof( $ph ) ) { $sor = fgets( $ph. az 'r' jelzõvel pedig azt. ugyanúgy nyithatunk adatcsatornát két folyamat között a popen() paranccsal.

. 21. ha egy parancs a szabványos bemenetrõl vár parancssori kapcsolókat.1. Végül a pclose() függvénnyel lezárjuk az adatcsatornát. Ez akkor hasznos. példában azt láthatjuk. ábra A who UNIX parancs kimenetének olvasása 21 A popen() függvény használható parancsok bemenetének írására is. A 21. különben az ereg_replace() függvénnyel újabb HTML hivatkozással és soremeléssel bõvítjük a végeredményt. Ha a sorban olvasható kimenet csupán egyetlen karakter. hogyan használhatjuk a popen() függvényt a column parancs bemenetének írására. így a while utasítás segítségével sorról sorra elemezhetjük a kimenetet. ?> </body> </html> A who parancs eredményének kiolvasásához szükségünk van egy fájlmutatóra a popen() függvénytõl.1.1. kihagyva az elemzést. ábrán látható. a while ciklus következõ lépésére ugrunk.Munka kiszolgálói környezetben 397 21. A program egy lehetséges kimenete a 21.2. program (folytatás) 22: 23: 24: 25: pclose( $ph ).

11: array( "Karóra".2."\n"). A column kimenetét például a mail parancs segítségével postázhatjuk valakinek: . hogyan érhetõk el és írhatók ASCII táblázatként fájlba a többdimenziós tömbök elemei. program A column parancs bemenetének írása a popen() függvény segítségével 1: <html> 2: <head> 3: <title>21. Megadjuk. 16: foreach ( $termekek as $termek ) 17: fputs( $ph.2. 19: ?> 20: </body> 21: </html> A 21. hogy az adatcsatorna használatával.398 21. egy folyamat futtatásával más feladatokat is elindíthatunk. a –c 3 megadja a szükséges oszlopok számát. $termek). 3. join(‘/’. "piros" ).2. 12: array( "Ultrahangos csavarhúzó". 14: $ph = popen( "column -tc 3 -s / > fizetve/3as_felhasznalo. Most egyetlen utasítással egyszerre több dolgot tettünk.txt fájlba írja. 10: array( "Modem". hogy a végeredményt a 3as_felhasznalo. "rózsaszín" ). A column parancs bemenetéhez adatcsatornát kapcsolunk. hogy a program írhasson bele. Meghívtuk a column programot és kimenetét fájlba írtuk. óra 21. 18: pclose( $ph ). példában megfigyelhetõ. program A column parancs bemenetének írása 4: a popen() függvény segítségével</title> 5: </head> 6: <body> 7: <?php 8: $termekek = array( 9: array( "HAL 2000". 2. 1. "w" ) 15: or die( "A 'column' paranccsal nem vehetõ fel kapcsolat" ). a –s / a /-t állítja be mezõelválasztóként. hogy táblázattá formázza a kimenetet. A fizetve könyvtárnak léteznie kell és a megfelelõ jogosultság szükséges. Valójában parancsokat adtunk ki a héjnak: ez azt jelenti. "narancssárga" ) 13: ). A –t kapcsolóval megadjuk.txt". "kék" ). amin keresztül parancssori kapcsolókat küldünk. 1.

amelyekkel parancsokat adhatunk ki a héjnak. amelybõl a parancs visszatérési értéke tudható meg.3. Az átalakítás után a karakterláncot és egy újsor karaktert írunk ki az fputs() függvénnyel. Ha az exec() függvénynek az 'ls –al . hogy a felhasználó által beírt adatokkal rendszerparancsokat hajtsunk végre PHP függvényekkel. A 3as_felhasznalo.hu". mert ha üres karakterek jelennének meg a termékek tömbjében. Miután rendelkezünk egy fájlazonosítóval.3. Parancsok végrehajtása az exec() függvénnyel Az exec() egyike azoknak a függvényeknek.3. Ez látható a 21. Végül lezárjuk az adatcsatornát. mely a parancs kimenetének sorait fogja tartalmazni és egy változó. Ez azért szükséges. program Könyvtárlista betöltése a böngészõbe 1: <html> 2: <head> 3: <title>21. az összezavarná a column parancsot. program Könyvtárlista betöltése a böngészõbe </title> 4: </head> 5: <body> . A függvény paraméterében meg kell adni a futtatandó program elérési útját. amit a join() függvény segítségével karakterlánccá alakítunk. akkor az aktuális könyvtár tartalmát jeleníti meg. a $termekek tömb minden elemén végiglépkedünk. ha a szöveg formázására a sprintf() függvényt használjuk. 21 21.' parancsot adjuk meg. példában. "w" ) Így elérhetjük. Ezen kívül megadható még egy tömb. Az üres karakter helyett mezõelválasztóként a ’/’ karaktert választjuk.txt fájlban a következõk szerepelnek: HAL 2000 Modem Karóra Ultrahangos csavarhúzó 2 3 1 1 piros kék rózsaszín narancssárga 399 A kódot hordozhatóbbá tehetjük.Munka kiszolgálói környezetben popen( "column -tc 3 -s / | mail kiskapu@kiskapu. Ennek néhány hátrányos tulajdonságát még áttekintjük az óra további részében. Minden elem maga is egy tömb.

amikor rendszerparancsokkal vagy korábban megírt Perl programokkal sokkal gyorsabban megoldhatjuk a feladatot. 21. foreach ( $kimenet as $fajl ) print "$fajl<br>". Meg kell azonban jegyeznünk. $vissza ). Ha a program a megadott könyvtárat nem találja vagy az nem olvasható. hogy rendszerparancsok használatával programjaink több memóriát fogyasztanak és többnyire futásuk is lassabb. ?> </body> </html> Ha az ls parancs sikeresen végrehajtódik. legalábbis rövid távon. mint átültetni azt PHP-be. print "<p>Visszatérési érték: $vissza</p>". mint PHP függvényekkel. hiszen az opendir() és a readdir() függvényekkel ugyanezt elérhettük volna.2. Ha a PHP program kifejlesztésének sebessége fontos szempont. A végeredmény szempontjából nem tettünk semmi újat.". óra 21. program (folytatás) 6: 7: 8: 9: 10: 11: 12: 13: <?php exec( "ls -al .3. de elképzelhetõ olyan eset. a visszatérési érték 0 lesz. ábra A könyvtárlista betöltése a böngészõbe az exec() függvény segítségével .400 21. $kimenet. a visszatérési érték 1. esetleg érdemesebb a korábban megírt Perl program meghívása mellett dönteni.

hogy különbözõ súgóoldalakat tekinthessenek meg. A system() függvényt használtuk. A következõ kódrészlet a man parancs leírását adja meg: <?php print "<pre>". $vissza ).4. ennek kimenetét hozzákapcsoltuk a col parancshoz. print "</pre>". 21 Biztonsági rések megszüntetése az escapeshellcmd() függvény használatával Az escapeshellcmd() függvény ismertetése elõtt tekintsük át. Íme az elõzõ példa ilyetén megvalósítása: print "<pre>". Ugyanezt az eredményt érhetjük el a ` mûveletjel használatával. a felhasználó bármit beírhat oda. ?> A PRE HTML elemet azért adtuk meg. A system() közvetlenül a böngészõbe írja a kimenetet. print `man man | col -b`. A példa erejéig tegyük fel. Ha bekérjük egy oldal nevét. Vegyük észre. Az így megadott parancsot a rendszer végrehajtja és visszatérési értékként a parancs kimenetét adja. hogy meghívjuk a man parancsot. mert biztonsági rést tartalmaz! . hogy meg szeretnénk engedni a látogatóknak. példában található programot ne telepítsük. amit kiírhatunk vagy változóban tárolhatunk. mivel szemben van szükségünk védelemre.Munka kiszolgálói környezetben 401 Külsõ programok futtatása a system() függvénnyel vagy a ` mûveletjel segítségével A system() függvény az exec() függvényhez hasonlóan külsõ programok indítására használható. amely ASCII-ként újraformázza a megjelenõ szöveget. hogy ebben a megvalósításban rögtön kiírtuk a végeredményt. hogy a böngészõ megtartsa a kimenet eredeti formátumát. A system() függvény a kimenetet közvetlenül a böngészõbe írja. print "</pre>". A kiadandó parancsot egyszerûen ilyen fordított irányú aposztrófok közé kell tennünk. A visszatérési értéket a $vissza változóba mentjük. amely a program visszatérési értékét tartalmazza majd. system( "man man | col -b". A 21. A függvénynek meg kell adni a futtatandó program elérési útját. valamint megadható egy változó.

program A man program meghívása.3. UNIX rendszeren azonban a felhasználó a manoldal mezõhöz hozzáadhatja saját parancsait. így hozzáférhet a kiszolgálón számára tiltott részen lévõ adatokhoz is. Ez a kód nem biztonságos</title> </head> <body> <form> <input type="text" value="<?php print $manoldal. 21.3. ábrán. ?>" name="manoldal"> </form> <pre> <?php if ( isset($manoldal) ) system( "man $manoldal | col -b" ). Megbízhatónak tûnik.402 21. ?> </pre> </body> </html> Korábbi példánkat egy szöveges mezõvel és a system() függvénnyel egészítettük ki. óra 21. Erre láthatunk példát a 21.4. ábra A man program meghívása .4. program A man program meghívása 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: <html> <head> <title>21.

ha az escapeshellcmd() függvénnyel fordított perjel (\) karaktert adunk minden metakarakterhez. Az escapeshellcmd() függvény paramétere egy karakterlánc. az /etc/shadow-ban vannak tárolva. Ennél kicsit több lehetõséget ad. amely csak a rendszergazda (root) által olvasható. Ezzel a támadó kiírathatja a rendszer bármelyik olvasható könyvtárának tartalmát. cat /etc/passwd Bár a jelszavak egy titkosított fájlban. program A felhasználói bemenet javítása 4: az escapeshellcmd() függvény használatával</title> 5: </head> 6: <body> 7: <form> 8: <input type="text" value="<?php print $manoldal. Ebben az esetben a col parancs bemenete a teljes könyvtárlista lesz. A korábbi kód biztonságosabb változata a 21. ls –al parancsot.Munka kiszolgálói környezetben A felhasználó az oldalon keresztül kiadta az xxx. A következõ utasítással például a /etc/passwd tartalmát kapja meg: xxx. példában található. ez mégis egy igen veszélyes biztonsági rés. 403 21.5. A legegyszerûbben úgy védekezhetünk ellene. hogy soha nem engedélyezzük. végeredménye pedig egy átalakított másolat. hogy a felhasználók közvetlenül adjanak parancsot a rendszernek. ami természetesen nem létezik. Ezt a $manoldal változóban tároljuk. A program futása közben a system() függvénynek a következõ parancsot kell végrehajtania: "man xxx. program A felhasználói bemenet javítása az escapeshellcmd() függvény használatával 1: <html> 2: <head> 3: <title>21. amit a felhasználó kiadhat. ls -al | col -b" Vagyis meg kell jelenítenie az xxx parancshoz tartozó súgóoldalt.5.5. ?>" name="manoldal"> 9: </form> 10: <pre> 11: <?php 21 .

cat etc/passwd parancsot. azaz a cat utasítás súgóját kapjuk a jelszófájl helyett. hanem bináris formátumú. system( "man $manoldal | col -b" ). program (folytatás) 12: 13: 14: 15: 16: 17: 18: 19: 20: if ( isset($manoldal) ) { $manoldal = escapeshellcmd( $manoldal ). hogyan küldhetünk a képrõl mintát a böngészõnek. azzal a különbséggel. Lehetõség szerint kerüljük azokat a helyzeteket. } ?> </pre> </body> </html> Ha a felhasználó most kiadja az xxx. akkor a system() függvény meghívása elõtt az escapeshellcmd() az xxx\. A programot még biztonságosabbá tehetjük. összevetjük a felhasználó által beírtakat ezzel a listával. példában látható. cat /etc/passwd paranccsá alakítja azt. Külsõ programok futtatása a passthru() függvénnyel A passthru() függvény a system()-hez hasonló. A rendszer biztonságát az escapeshellcmd() függvény segítségével tovább növelhetjük. hogy a passthru()-ban kiadott parancs kimenete nem kerül átmeneti tárba.5. . így a program nagyon egyszerû lesz. óra 21. amely a képeket kicsinyített mintaként jeleníti meg és meghívható HTML vagy PHP oldalalakról is. A feladatot külsõ alkalmazások használatával oldjuk meg. A változóba kerül a kiadott parancs visszatérési értéke. A 21. ha listát készítünk az elérhetõ súgóoldalakról és még mielõtt meghívnánk a system() függvényt.6. ahol a felhasználók közvetlenül a rendszernek adnak ki parancsokat. amelyek kimenete nem szöveges.404 21. Lássunk egy példát! Készítsünk programot. A passthru() függvény paramétere egy rendszerparancs és egy elhagyható változó. Így olyan parancsok kiadására is lehetõség nyílik.

ha csak bizonyos kiterjesztésû fájlokat engedélyezünk és korlátozzuk az elérhetõ könyvtárakat is.5 -yscale . Ha ezt a programot használni akarjuk.gif") ?>"> 21 Külsõ CGI program meghívása a virtual() függvénnyel Ha egy oldalt HTML-rõl PHP-re alakítunk. nem is próbáljuk megjeleníteni. A program még biztonságosabbá tehetõ. Az beolvassa a GIF képet és hordozható formátumúra alakítja. program A passthru() függvény használata képek megjelenítésére 1: <?php 2: if ( isset($kep) && file_exists( $kep ) ) 3: { 4: header( "Content-type: image/gif" ).6.6.program. . rendszerünkre telepítenünk kell ezen alkalmazásokat és meg kell adni azok elérési útját. Ezt a kimenetet rákapcsoljuk a pnmscale bemenetére. A programot a következõ utasítással bármelyik weboldalról meghívhatjuk: <img src="21. 5: passthru( "giftopnm $kep | pnmscale -xscale . ehelyett a felhasználó által megadott fájl létezését ellenõriztük a file_exists() függvénnyel. a virtual() függvénnyel külsõ CGI programokat hívhatunk meg.".php?kep=<?php å print urlencode("/utvonal/kep. Elõször a giftopnm-nek átadjuk a $kep változó értékét. hogy nem használtuk az escapeshellcmd() függvényt.Munka kiszolgálói környezetben 405 21. azt vesszük észre. majd a kapott képet megjelenítjük a böngészõben. amely 50 százalékkal lekicsinyíti a képet. Ezt a kimenetet a ppmtogif bemenetére kapcsoljuk. 6: } 7: else 8: print "A(z) $kep nevû kép nem található. Ha a $kep változóban tárolt kép nem létezik. A passthru() hívásakor három alkalmazást indítunk el.5 | ppmtogif" ). Ha Apache modulként futtatjuk a PHP-t. Minden felhasznált CGI programnak érvényes HTTP fejléccel kell kezdenie a kimenetét. hogy a kiszolgálóoldali beillesztések nem mûködnek. amely visszaalakítja GIF formátumúvá. például Perl vagy C nyelven írt számlálókat. 9: ?> Vegyük észre.

Láttuk. hogyan fogadhatók bináris adatok rendszerparancsoktól a passthru() függvénnyel és hogy hogyan valósíthatjuk meg a kiszolgálóoldali beillesztéseket (SSI) a virtual() függvénnyel. ?> Összefoglalás Ebben a fejezetben áttekintettük. hogy külsõ programok használatával az adott probléma elegánsabb megoldásához jutunk. A PHP sok mindenre használható. Ez a program egyszerûen egy HTTP fejlécet ír ki és minden rendelkezésre álló környezeti változót felsorol: #!/usr/bin/perl -w print "Content-type: text/html\n\n". valamint a fordított irányú aposztróf mûveletjel a felhasználói utasítások közvetítésére a rendszermag felé. ha nem ismerjük a Perlt. hogyan védekezzünk a betörésre használható utasítások ellen az escapeshellcmd() függvény segítségével. de lehet. hogyan használható az exec() és a system() függvény. amikor a programok a szabványos bemenetrõl várnak adatokat. de mi egy alkalmazás kimenetébõl szeretnénk továbbítani azokat.pl néven. Megnéztük. Láttuk. foreach ( keys %ENV ){ print "$_: $ENV{$_}<br>\n". hogyan kapcsolhatunk össze alkalmazásokat a popen() függvény segítségével.406 21. hogyan mûködhetünk együtt a héjjal és rajta keresztül a külsõ alkalmazásokkal. } Mentsük a programot a cgi-bin könyvtárba proba. Megtanultuk.pl"). . óra Írjunk egy Perl CGI programot! Ne aggódjunk. Ez akkor hasznos. Ezután a virtual() függvénnyel a következõképpen hívhatjuk meg: <?php virtual("/cgi-bin/proba.

Mit csinál a system() függvény a végrehajtott külsõ parancs kimenetével? 6. Hogyan hajthatunk végre külsõ CGI programot a PHP programokból? . miután elindítottuk? 4. Mi a fordított irányú aposztróf visszatérési értéke? 7. 21 Kvíz 1. a fejlesztési sebességet és a hatékonyságot. miután elindítottuk? 3. melyek segítenek megszilárdítani az órában szerzett tudást. Mûhely A mûhelyben kvízkérdések találhatók. Másrészrõl nagyobb feladatoknál sokat segíthetnek a kész külsõ programok. Az exec() függvény közvetlenül a böngészõbe írja a végeredményét? 5. saját kóddal oldjuk meg a problémát. Ha saját kódot használunk külsõ programok helyett. Hogyan adhat ki biztonságosan a felhasználó parancsokat a rendszerhéjnak? 8. mivel képességeiket nehéz lenne megvalósítani PHP-ben. Megtalálható a http://www.w3. Érdemes a PHP kézikönyv biztonságról szóló részét is tanulmányozni. Hogyan írunk adatokat egy folyamat bemenetére. Egyszerû feladatoknál. A válaszokat az A függelékben helyeztük el. Melyik függvényt használjuk alkalmazások összekapcsolására? 2. Hogyan olvasunk adatokat egy folyamat kimenetérõl. Ezekben az esetekben egy külön erre a célra készített külsõ alkalmazás használata javasolt. Honnan tudhatunk meg többet a szükséges biztonsági óvintézkedésekrõl? A legbõvebb számítógépes biztonsággal foglalkozó forrás Lincoln Stein (a híres Perl modul. például könyvtár tartalmának kiíratásakor. a CGI.org/Security/Faq/ címen. mivel nem kell minden futás alkalmával egy külsõ programot meghívnunk. Mikor használjunk külsõ alkalmazásokat saját PHP kódok helyett? Három szempontot kell megvizsgálnunk: a hordozhatóságot.pm szerzõje) által fenntartott FAQ. így csökkenthetjük a futási idõt.Munka kiszolgálói környezetben 407 Kérdések és válaszok Sokat emlegettük a biztonságot ebben a fejezetben. programunk könnyebben átvihetõ lesz a különbözõ rendszerek között.

hogy nem biztonságos. ha a felhasználók futtathatják a programot!). amely a UNIX ps parancsának segítségével megjeleníti a böngészõben a futó folyamatokat! (Megjegyezzük. Ne küldjünk ellenõrizetlen utasításokat a rendszermagnak! . óra Feladatok 1. Írjunk programot. 2. Nézzük meg a ps parancs súgójában a lehetséges parancssori kapcsolókat! Módosítsuk az elõzõ programot.408 21. hogy a felhasználó a kapcsolók egy részét használhassa.

például hogy a verem tartalmát nyomon követhessük. a legfrissebb kiadás már tartalmaz valamilyen fejlettebb hibakeresõ eszközt. Ebben a fejezetben a kódban rejlõ hibák felderítésének néhány egyszerû módját mutatjuk be. Az órában a következõ témákkal foglalkozunk: • A PHP beállításainak lekérdezése • A PHP által automatikusan elérhetõvé tett változók • Hibaüzenetek kiírása naplófájlba • Az adatok nyomon követése a programban • A gyakori hibák felfedezése • Információk a PHP-rõl és adott programokról . ezért elképzelhetõ.22. A fejlesztõk ígéretet tettek hibakeresõ szolgáltatások beépítésére. hogy mire e könyv az Olvasó kezébe kerül. ÓRA Hibakeresés E könyv írásakor a PHP 4 semmilyen hibakeresõ eszközt nem tartalmazott.

Ebben a részben két módszert is megvizsgálunk arra. hogy van egy "felhasznalo" nevû ûrlapmezõnk. a kiszolgálói környezetrõl és a futó program változóiról. A következõ táblázat részletezi a PHP beállításait – ezeket a php. ábra PHP információk megjelenítése Az oldal tetején a használt PHP-változatról. ábrán láthatjuk. akkor megvizsgálhatjuk a forráskódot egy olyan eszközzel. a rendszerrõl és a szerzõkrõl találunk információkat. A phpinfo() A phpinfo() függvény az egyik leghasznosabb hibakeresõ eszköz: részletes információkkal szolgál magáról a PHP-rõl. a webkiszolgáló típusáról. de a programban valamilyen okból nem jön létre a $felhasznalo változó.ini fájlban módosíthatjuk. óra Ha egy program nem mûködik megfelelõen. A phpinfo() kimenetét a 22. és ha még mindig nem találjuk a hibát. érdemes elõször is a PHP beállításait megvizsgálnunk.410 22. Tegyük fel például. Ezután jöhetnek a PHP által létrehozott és a saját változók.1. A függvénynek nem kell átadnunk semmilyen paramétert és csak egy logikai értéket ad vissza. Vessünk egy pillantást a következõ beállításokra: track_vars On register_globals Off . 22. amely színkiemeléssel jelzi a nyelvtani elemeket – így hamar rábukkanhatunk a problémás részre. hogyan szerezhetünk információkat a használt PHP-értelmezõrõl és magáról a futó programról. viszont egy csinos HTML oldalt küld a böngészõnek.1.

különösen akkor. Ha ez hiányzik.ini-ben. A másik lehetõségünk. hogy a "felhasznalo" mezõ tartalmára a program ne $felhasznaloként. Keressük meg a register_globals bejegyzést a php. illetve a kiszolgáló környezeti változóit is (például HTTP_REFERER). Ha a PHP-t adatbázis-támogatással fordítottuk. Alapállapotban mindkét lehetõség engedélyezett. Nem tudjuk. 22 . az erre vonatkozó beállításokat is láthatjuk. hanem $HTTP_POST_VARS["felhasznalo"]-ként hivatkozzunk. Tegyük fel például. amely a felhasználói munkamenetek kezelésére vonatkozó beállításokat tartalmazza. Láthatjuk például a programmal kapcsolatban forgalmazott összes kérés.Hibakeresés Már meg is találtuk a probléma forrását. amikor a felhasználó bezárja a böngészõ ablakát. amelyek bizonyos ideig fennmaradnak. ha Apache fut a gépünkön. A phpinfo() a webkiszolgálóról is rengeteg hasznos információval szolgál. Ebben az esetben az azonosítás során a lekérdezõ karakterláncra kell hagyatkoznunk vagy módosítanunk kell a beállítást a php.cookie_lifetime értéket kell átállítanunk a php.ini állomány a következõ sort tartalmazza: session.ini fájlban. például az alapértelmezett felhasználót. és a phpinfo() a következõ beállítást mutatja: session. IP címet és kaput. A táblázatban hasznos információkat találunk a munkamenetek kezelését megvalósító kód hibakereséséhez. A track_vars hatására a GET változók a $HTTP_GET_VARS[] tömbben tárolódnak.cookie_lifetime 0 411 már meg is találtuk a probléma forrását.és válaszfejlécet. hogy a változók nem jönnek létre globális PHP változók formájában. míg a sütik a $HTTP_COOKIE_VARS[] tömbben.ini fájlban és változtassuk On-ra. a register_globals kikapcsolása azonban azt jelenti. hogy hány másodpercig szeretnénk fenntartani a munkameneteket.ini fájlt? Nos. akkor a PHP-változatunkba nem fordítottuk bele a munkamenetek kezelésének támogatását. Ha a php. Egy olyan táblát is találnunk kell. a phpinfo() táblázataiban errõl is kaphatunk információt. merre keressük a php. a POST változók a $HTTP_POST_VARS[] tömbben. hogy olyan munkameneteket szeretnénk létrehozni.use_cookies 0 a sütik nem engedélyezettek a munkamenetek kezelése során. Ez eddig rendben is van. annak megfelelõen. Ha a munkamenet elvész. Ebben az esetben két lehetõségünk van. A session.

program A phpinfo() függvény kipróbálása</title> 7: </head> 8: <body> 9: <form action="<?php print "$PHP_SELF" ?>" METHOD="get""> 10: <input type="text" name="felhasznalo"> 11: <br> 12: <select name="termekek[]" multiple> 13: <option>Krumpli 14: <option>Sajt 15: <option>Kenyér 16: <option>Csirke 17: </select> 18: <br> 19: <input type="submit" value="Lássuk!"> 20: </form> 21: <p></p> 22: <hr> 23: <p></p> 24: <?php 25: phpinfo(). 26: ?> 27: </body> 28: </html> Ha a „Lássuk!” gombra kattintunk. 3: ?> 4: <html> 5: <head> 6: <title>22.1.1. program A phpinfo() függvény kipróbálása 1: <?php 2: setcookie( "azonosito". 22. ábrán láthatjuk. A 22.412 22. a program megkapja a felhasználó által megadott adatokat és a süti is beállítódik. példa egy egyszerû programot tartalmaz. . Lássunk erre egy példát. time()+3600. látni fogjuk ezeket a változókat – a kimenet lényeges részét a 22. óra Az egyik legfontosabb információforrásunk lehet az a tábla.1. Ha meghívjuk a phpinfo() függvényt. "2344353463433". "/" ). amely létrehoz egy HTML ûrlapot és beállít egy sütit. amelyben a PHP által létrehozott globális változók vannak felsorolva az értékeikkel együtt.2.

phps kiterjesztésû fájl színkiemeléssel fog megjelenni a böngészõablakban.phps Ezután minden . használjuk a show_source() függvényt. ábra Globális változók elérése Látható. Ha nincs jogunk megváltoztatni a kiszolgáló beállítóállományát. ráadásul a kulcsszavakat.2. Nagyobb lélegzetû feladatoknál gyakran gondot okoz az ûrlapváltozók és a sütik nyomon követése. ilyenkor a phpinfo() felbecsülhetetlen segítséget nyújthat. Jó ötlet lehet egy újabb pillantást vetni a forráskódra. amelybõl több elemet is kiválaszthattunk – a változók között a teljes tömb megjelenik.conf) kell hozzáadnunk a következõ sort: AddType application/x-httpd-php-source . A PHP segítségével megtekinthetjük a program forráskódját. a megjegyzéseket és a HTML kódot színkiemeléssel is megjeleníthetjük. Ha Apache kiszolgálót használunk. Az ûrlap tartalmazott egy olyan listát is. talán nem is a beállításokkal van baj. hogy a süti és a $HTTP_GET_VARS változó elérhetõ. a beállítófájlhoz (többnyire httpd. amely a paraméterül megadott fájlt színkiemeléssel jeleníti meg a böngészõablakban. a karakterláncokat. 22 .Hibakeresés 413 22. A forráskód megjelenítése színkiemeléssel Ha nem találjuk meg a probléma forrását a phpinfo() függvény segítségével.

?>"> 9: <p></p><hr><p></p> 10: <?php 11: if ( isset( $file ) ) 12: show_source( $file ) or print "nem lehet megnyitni a következõ fájlt: \"$file\"". példaprogram segítségével megtekinthetjük programjaink forráskódját. 13: ?> 14: </body> 15: </html> A 22.2. példaprogramot mutatja mûködés közben.2.3.2. . program Dokumentum forrásának megjelenítése</title> 4: </head> 5: <body> 6: <form action="<?php print "$PHP_SELF" ?>" method="get"> 7: Kérem a fájl nevét: 8: <input type="text" name="file" value="<?php print $file.2. Igen könnyû észrevenni például az elgépeléseket. hiszen ezeket nem kulcsszóként értelmezi a megjelenítõ. ábra Színkiemelés használata Miért hasznos ez a lehetõség? Hiszen megnézhetnénk a kódot megszokott szövegszerkesztõnkkel is.414 22. 22. program Dokumentum forrásának megjelenítése 1: <html> 2: <head> 3: <title>22. ábra a 22. 22. ezért más színnel jelöli. óra A 22.3. A legnagyobb elõny a színkiemelésben rejlik.

gyakran rossz helyen jelzi a hibát. Ne feledjük. táblázat a színkiemelések jelentését tartalmazza.ini fájlban a display_errors bejegyzést "On"-ra. Mivel a PHP az idézõjel utáni szöveget karakterláncként értelmezi. Állítsuk a php. Az idézõjelben lévõ karakterláncok szintén más színnel jelöltek. Például elfelejtettünk zárójelbe tenni egy kifejezést vagy elgépeltük egy függvény nevét. hogy hibaüzeneteket kaptunk a várt eredmény helyett. Ha be akarunk állítani egy alapértelmezett szintet. rendeljünk a php.comment highlight.default highlight. 415 22. mert így bárki belenézhet forrásainkba. A hibaüzenetek nagyon fontosak a hibakeresés során. meg kell adnunk. Miután meggyõzõdtünk arról. hogy elég nehéz nyomon követni egy félig nyitott idézõjel-párt. táblázat Színkiemelések php.ini bejegyzés highlight.1.ini fájlban az error_reporting bejegyzéshez egy számot. hogy a PHP elküldje a hibaüzeneteket a böngészõnek. hogy be van-e kapcsolva ez a lehetõség. ezzel biztosíthatjuk. hogy mennyire legyenek „szigorúak” az üzenetek. így ez a típusú hiba nagyon könnyen észrevehetõ.keyword Alapértelmezett szín Vörös Narancs Zöld Kód #DD0000 #FF8000 #007700 Jelentés Idézõjelek és karakterláncok PHP megjegyzések Mûveletjelek. Szerencsére nem kell fejben 22 .string highlight.html Kék Fekete #0000BB #000000 PHP hibaüzenetek Miközben e könyv segítségével elsajátítottuk a PHP programozás alapjait. nyelvi elemek és a legtöbb beépített függvény Minden egyéb PHP kód HTML kód highlight. hogy programunk tudatni fogja velünk az esetleges hibákat. hogy a phpinfo() függvény segítségével megnézhetjük. bizonyára elõfordult. Csak fejlesztéskor használjuk ezt a kódot! A 22.1. Ne tegyük ezt a programot elérhetõvé webhelyünkön.Hibakeresés Egy másik gyakori probléma.

mivel rendelkezésünkre állnak azok az állandók. táblázat Hibakezelési szintek Állandó E_ALL E_ERROR Név Mind Hibák Leírás Mindenféle hiba Végzetes hibák (például memóriakiosztási problémák) Mi történik? Függ a hiba típusától Felhasználó értesítése és a program futásának megállítása Értesíti a felhasználót. A következõ sor például engedélyezi a hibaüzenetek és a figyelmeztetések megjelenítését is: error_reporting = E_ERROR|E_WARNING . Természetesen egyszerre több hibakezelési szintet is engedélyezhetünk. csak abba van beleszólásunk. mi történjen a hiba felbukkanásakor. ekkor az egyes szinteket a VAGY (|) jellel elválasztva kell megadnunk.Az értelmezõ indítása. táblázat tartalmazza. 22.Megszakítja mezõ indításakor kor fellépõ végzetes hibák az értelmezõ indítását E_CORE_WARNING Figyelmeztetõ Az értelmezõ indítása.2. hogy a hibaüzenetet el akarjuk-e küldeni a böngészõnek vagy sem. de nem szakítja meg Felhasználó értesítése és a program futásának megállítása Értesíti a felhasználót és folytatja a program futtatását E_WARNING Figyelmeztetések Nem végzetes hibák (például nem szabá- lyos paraméterátadás) a program futását E_PARSE Értelmezõ hiba Az értelmezõ nem érti az utasítást E_NOTICE Megjegyzések Lehetséges problémaforrás (például egy kezdeti értékkel el nem látott változó) E_CORE_ERROR Belsõ hiba az értel. A különbözõ értékeket a 22.Értesíti a felhasználót és kor fellépõ nem végzetes hibák folytatja a program futtatását üzenet az értelmezõ indításakor Ezekkel a beállításokkal nem változtathatjuk meg.2.416 22. óra tartanunk az összes számot. amelyeket a hibakezelés szintjének beállításához használhatunk.

Ha azonban az error_reporting() függvénynek az E_ERROR|E_WARNING|E_PARSE|E_NOTICE értéket adnánk át (ez magában foglalja a megjegyzések elküldését is). programban. A kód bekerül a programba és a lehetõ legrosszabb pillanatban mûködésbe lép.3. ha az összes típust engedélyezni szeretnénk. Lássuk. ahol a hibakezelési szint módosítása a segítségünkre lehet. 417 22.Hibakeresés Ha a hibakezelést az összes hibatípusra ki akarjuk terjeszteni. de a módszer ettõl még remélhetõleg érthetõ marad. A php. } else { print "Tudom. Az E_ERROR|E_WARNING és az E_ALL&~E_NOTICE tulajdonképpen kettes számrendszerbeli aritmetikai mûveletek. használjuk az E_ALL állandót. hogy a \$flag változó értéke NEM 45". hogy a \$flag változó értéke 45". }.3. a program a következõ kimenetet küldené: . visszatérési értéke pedig a megelõzõ hibakezelési beállítás. Lássunk egy példát egy olyan esetre. melyek eredménye egy új hibakezelési szintet megadó szám. Nincs végzetes hiba a programban. Mi a teendõ akkor. a $flag változó értékét akarjuk vizsgálni.ini beállítását az error_reporting() függvénnyel bírálhatjuk felül. de elgépeltük. kivéve egyet? A következõ sor éppen ezt valósítja meg: error_reporting = E_ALL & ~E_NOTICE Az értelmezõ a megjegyzéseken kívül minden felmerülõ üzenetet elküld a böngészõnek. A kettes számrendszerbeli aritmetikával ebben a könyvben nem foglalkozunk. így minden további nélkül lefut és az E_ERROR|E_WARNING|E_PARSE hibakezelési beállítás mellett még csak üzenetet sem küld a böngészõnek. program Egy szándékos hiba 1: 2: 3: 4: 5: 6: 7: 8: 9: <?php error_reporting( E_ERROR|E_WARNING|E_PARSE ). $flag = 45. melynek bemenõ paramétere a hibakezelési szintet megadó egész szám. ?> 22 Mint látható. if ( $flg == 45 ) { print "Tudom. Természetesen ennél a függvénynél is használhatjuk az elõzõekben megismert állandókat. észrevesszük-e a szándékolt hibát a 22.

hogy ha egy nem meghatározott változó értékét íratjuk ki. mert megváltozik a futtató környezet. ennek azonban lehetnek nem kívánt mellékhatásai is.3. amely a hiba típusát írja le.php fájlban a 4. Ugyanezt a hatást úgy is elérhetjük. hogy valami nincs rendben. kipróbáljuk. de még a problémás sor számát is megtudtuk. A PHP error_log() függvénye pontosan az ilyen esetekre kifejlesztett hibakeresõ eszköz. mérjük a teljesítményét éles körülmények között. Vannak azonban olyan problémák is. hogy végezze a feladatát. amellyel a kiszolgáló naplófájljába vagy egy általunk megadott fájlba naplózhatjuk a felmerülõ hibákat. amely a hiba szövegét tartalmazza és egy egész szám. Ha a megjegyzések elküldését is engedélyeztük. fejlesztés közben keletkezõ hibák voltak. óra Warning: Undefined variable: flg in /home/httpd/htdocs/ å peldak/22. hogy szükségünk van egy programra. hibaüzenetet kapunk. hogy szándékosan alkalmazunk nem meghatározott változókat.program. Az error_log() függvénynek két bemenõ paramétere van: egy karakterlánc. sorban Tudom. A hiba típusától függõen egy további paramétert is meg kell adnunk az error_log() függvénynek: egy elérési utat vagy egy e-mail címet. amely a felhasználó által kitöltött ûrlap adatait írja fájlba. amely az adott fájlt tartalmazza. amelyek késõbb jönnek elõ. Elkészítjük a programot.418 22.3. hogy a $flag változó értéke NEM 45 Az üzenetbõl nem csak az derül ki számunkra. akkor annak hasonló a hatása ahhoz. amelyekre eddig vadásztunk. Tegyük fel például. majd magára hagyjuk. . Vegyük például a következõ kódrészletet: <INPUT TYPE="text" NAME="felhasznalo" VALUE="<? å print $felhasznalo.php on line 4 Tudom. nagyobb részben azonnali. Ez egy beépített függvény. ?>"> Itt azt használjuk ki. például azért. mintha egy üres karakterláncot jelenítenénk meg (tulajdonképpen semmilyen hatása nincs). Hibaüzenetek kiírása naplófájlba Azok a hibák. Elképzelhetõ az is. A "felhasznalo" mezõ egy elõzõleg elküldött értéket vagy semmit sem tartalmaz.program. Néhány héttel késõbb azonban véletlenül töröljük azt a könyvtárat. hogy a $flag változó értéke NEM 45 Azaz: Figyelem: Nem meghatározott változó: flg a /home/httpd/htdocs/ å peldak/22. ha az error_reporting() függvénynek az E_ALL állandót adjuk át paraméterként.

A hibaüzenetet a harmadik paraméterben megadott fájlba kell kiírni.3. ha nem tudunk megnyitni egy fájlt: fopen( ". Ha nincs. 0 )./fontos.ini fájlban megadott helyre kerüljön. illetve az eseménynaplóba (NT) kerülnek. sor: å Nem lehet megnyitni a következõ fájlt: .Hibakeresés A 22.3.". táblázat Az error_log() függvény hibatípusai Érték 0 1 3 Leírás A hibaüzenetet a php. 4.txt Ha a hibaüzenetet adott fájlba akarjuk kiküldeni. A hibaüzenet a __FILE__ és __LINE__ állandókat használja. adjunk meg egy naplófájlt a php. adjuk hozzá a fájlhoz például a következõ bejegyzést: error_log = /home/httpd/logs/php_errors Ha NT vagy Unix operációs rendszert használunk. ".__LINE__. 419 22. táblázat az elérhetõ hibatípusokat sorolja fel. A hibaüzenetet a harmadik paraméterben megadott e-mail címre kell küldeni.txt". Ezek alapján valami ilyesmi bejegyzés kerül a naplófájlba: /home/httpd/htdocs/proba5.php. amelyek az éppen futó program elérési útját. illetve az aktuális sor számát tartalmazzák.ini fájl error_log bejegyzésénél megadott fájlba kell kiírni. A 0-ás hibatípussal azt adjuk meg. van-e már ilyen beállítás a php.ini error_log bejegyzésénél. Ekkor a 0-ás hibatípussal meghívott error_log() hibaüzenetek a rendszernaplóba (Unix). "a" ) or error_log( __FILE__.ini fájlban. A következõ kódrészlet egy hibaüzenetet hoz létre. Természetesen a phpinfo() függvénnyel megnézhetjük. használjuk a 3-as hibatípus paramétert: 22 . hogy a hibaüzenet a php.txt"./fontos./fontos. sor: å Nem lehet megnyitni a következõ fájlt: . a "syslog" karakterláncot is hozzárendelhetjük az error_log bejegyzéshez. Ha hibanaplózást szeretnénk.".

az error_log() harmadik paraméterében meg kell adnunk az e-mail címet is. egy harmadik paraméterben azt is meg kell adnunk az error_log() függvénynek. sor: ".php.__LINE__.hu" ). Ehhez az 1-es típuskódot kell használnunk: if ( ! file_exists( "kritikus. } Ha 3-as típusú hibaüzenetet hozunk létre. return false." Nem lehet csatlakozni az adatbázishoz". "a" ) or error_log( __FILE__. 3. hogy a hibaüzenetet egy e-mail címre postázza. "dbhiba. "veszeset@kritikus. å 1."a") . Ha 1-es típusú hibaüzenetet küldünk. hasznos lehet.". óra if ( ! $megvan = mysql_connect( "localhost".420 22. A hibaüzenet elfogása Ha hibaüzeneteket írunk egy fájlba vagy elektronikus levélben küldjük el azokat. hogy hová kerüljön a hibaüzenet. "valami" ) ) { error_log( date("d/m/Y H I"). A $php_errormsg változó felhasználásával a hibaüzeneteket és naplóbejegyzéseket beszédesebbé tehetjük. 0 ). Az üzenet így fog festeni: /home/httpd/htdocs/proba.txt" )./fontos. ha hozzáférünk a PHP által elõállított hibaüzenethez.txt".txt". ". A következõ kódrészlet által létrehozott hibaüzenet már sokkal használhatóbb.ini fájlban a track_errors bejegyzést "On"-ra kell állítanunk – ennek hatására a legutolsó PHP hibaüzenet bekerül a $php_errormsg változóba (hasonlóan a Perl $! változójához). Az error_log() függvénynek azt is megadhatjuk.txt" ) ) or error_log( "Ó. Ehhez a php.".$php_errormsg. mint az elõzõek: fopen( ".Permission denied . 21.txt-nek vége van!". sor: fopen(". "jozsi". nem! kritikus./fontos.

4. ha megtûzdeljük a kódunkat print utasításokkal és kiíratjuk a fontosabb változók értékét. $x += 2 ) 13: { 14: print "&nbsp. 7: $argumentumok = func_get_args(). példa egy olyan függvényt tartalmaz. $x< count($argumentumok). 22. Természetesen a fent alkalmazott módszer nem kötelezõ érvényû – mindenki kialakíthatja a saját módszerét.$argumentumok[$x+1]. \$$argumentumok[$x]: " . sor: $uzenet<br>". A 22. $uzenet) 3: { 4: static $hivasok = 1. amit beszúrhatunk a programba.&nbsp. például: print "<p>". a $valtozo értékének ellenõrzésére.": \$teszt értéke: $teszt</p>". Talán a legkényelmesebb módszer. ha írunk egy függvényt a változók értékének nyomon követésére és az include() használatával elérhetõvé tesszük a fejlesztési szakaszban. 10: else 11: { 12: for ( $x=2. A futás során a változók ugyanis gyakran nem várt értékeket vesznek fel Egy jellemzõ nyomkövetõ sor: print "<p>\$valtozo: $valtozo</p>".Hibakeresés 421 Kézi hibakeresés Mindig nagyon nehéz azonban az olyan hibák kijavítása. amelyek nem váltanak ki hibaüzenetet. 8: if ( count( $argumentumok ) % 2 ) 9: print "Páratlan számú paraméter!<BR>".__LINE__. A hibakeresés egyik kézenfekvõ módja. 6: print "DEBUG $hivasok: $sor. amely lehetõvé teszi a fejlesztõ által megadott formátumú nyomkövetési üzenetek megjelenítését. Ez egy gyors próba. 22 . program Formázott nyomkövetési üzenetek megjelenítése 1: <?php 2: function debug( $sor. 5: print "<P><HR>\n".4.

hibaüzenetet kell adnunk.. hogy egy függvényt változó számú paraméterrel is meghívhatunk. Mivel név–érték párokat várunk. "proba". ha páratlan számú elem érkezik a tömbben.4. óra 22. "proba2". program kimenetét mutatja.")<BR>\n". Egyébként végiglépkedünk a tömb összes elemén (a harmadikkal kezdve) és kiíratjuk az összes párt a változó adattípusával együtt. } $proba = 55. "Második üzenet".gettype( $argumentumok[$x+1] ).4. egy üzenetet.4. program (folytatás) 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: print " . } } print "<hr><p></p>\n". $proba. (". illetve tetszõleges számú név–érték párt adhatunk át. "Elsõ üzenet:". ábra A debug() függvény használata . $proba2 )... $proba2 = $proba/2.422 22. A func_get_args() által visszaadott tömb függvényünk összes paraméterét tartalmazza – ezeket a változókat töltjük be az $argumentumok tömbbe. 22. ábra a 22. debug( __LINE__. 26: ?> A debug() függvénynek egy sorszámot. A sor számát és az üzenetet kiírni a feladat könnyebbik része. $proba ).4. debug( __LINE__. A 22. Ezután ki kell használnunk a PHP 4 azon tulajdonságát. "proba". $teszt = 66. $hivasok++.

Ismét sikerült végtelen ciklusba ejtenünk a PHP-t.Hibakeresés 423 Gyakori hibák Mindannyian követünk el hibákat. } A kapkodás sokszor vezet hibához – például az utasítássort jelölõ pontosvesszõt gyakran kitesszük olyan helyeken is. } Az elöltesztelõ ismétléses vezérlési szerkezet ciklustörzsének végrehajtása a zárójelben található kifejezés logikai értékétõl függ. A következõ kódrészletben rejlõ hiba elég alattomos: if ( $proba = 4 ) { print "<P>A \$proba értéke 4</P>\n". Csakhogy ez soha nem fog bekövetkezni. ami azt jelzi az értelmezõnek. ha vészesen közeledik a leadási határidõ. Így kerülhetett a fenti while kifejezés mögé is pontosvesszõ. ezért a program végtelen ciklusba kerül. } 22 . while ( $ertek != 50 ) { print $ertek. $ertek+=2. mivel a változó értéke 1-rõl indul és minden lépésben kettõvel növekszik – vagyis csak páratlan értékeket vesz fel. $valtozo++. Vannak olyan csapdák. Észrevesszük a hibát a következõ kódrészletben? $valtozo=0. hogy a ciklus törzse üres – a $valtozo értéke soha nem fog nõni. Lássunk még egy példát: $ertek = 1. Vagyis a ciklustörzs addig ismétlõdik. { print "$valtozo<BR>". ha az $ertek változó értéke 50. különösen akkor. amíg az $ertek értéke nem 50. A fenti példában ez a kifejezés csak akkor lesz hamis. while ( $valtozo < 42 ). ahol nem kellene. amelyekbe elõbb-utóbb minden programozó beleesik.

jeleznünk kell az értelmezõnek. date('d/m/Y H I’). hol végzõdik a karakterlánc. • Hozzárendelés használata az „egyenlõ” logikai mûveletjel helyett. Ezt a típusú hibát azért nehéz felfedezni. Az alábbi elég gyakori: $datum = "A mai dátum: . Ha idézõjelet akarunk kiíratni. a program egyszerûen nem úgy fog mûködni. Mivel nem zártuk le az idézõjelet. mivel gyakran rossz sorszámot kapunk. Az elõbbi kódrészlet a következõképpen fest helyesen: print "Ön a $tartomany-ról \"$felhasznalo\"-kent å jelentkezett be". • Végtelen ciklus létrehozása hibás vezérlõfeltétellel. A következõ hibát viszont elég könnyû megtalálni: print "Ön a $tartomany-ról "$felhasznalo"-kent å jelentkezett be". mert semmilyen üzenetet nem hoz létre. ebben a részben a következõ gyakori hibatípusokkal foglalkoztunk: • Üres ciklustörzs létrehozása hibásan alkalmazott pontosvesszõvel. A karakterláncok kezelése során szintén elkövethetünk típushibákat.424 22. hogy itt nem különleges karakterként kell kezelnie. a logikai kifejezés értéke a $proba-tól függetlenül mindig igaz lesz. . Ez szinte mindig hibajelzéssel jár. Összefoglalva. A kód azonban ehelyett 4-et rendel a $proba-hoz. Mivel a hozzárendelés mint kifejezés értéke a jobb oldali operandussal egyenlõ (jelen esetben 4-gyel). de nehézkes visszakeresni. ahogyan azt elvárjuk. • Levédetlen idézõjelek használata miatt elcsúszott karakterlánc-határok. A zárójelpárok hibás kezelése szintén hasonló jelenséghez vezet. óra A végrehajtást vezérlõ logikai kifejezésben nyilvánvalóan ellenõrizni akartuk a $proba változó értékét. az értelmezõnek fogalma sincs. print $datum.

22 Kvíz 1. Végül megnéztünk néhány olyan típushibát. mi történik. elindítjuk. Rossz megközelítés. Oldjunk meg egy részfeladatot (lehetõleg függvények formájában). Melyik függvénnyel jeleníthetjük meg a színekkel kiemelt forráskódot a böngészõablakban? . majd próbáljuk ki az elkészült kódot.Hibakeresés 425 Összefoglalás A fejlesztés talán egyik leghálátlanabb része a hibakeresés. Ebben az órában tanultunk arról. melyek segítenek megszilárdítani az órában szerzett tudást. viszonylag könnyen és gyorsan megtalálhatjuk a hibákat. amellyel csökkenthetjük a kódba kerülõ hibákat? Legyünk szemfülesek! Tulajdonképpen szinte lehetetlen egy olyan nagyobb lélegzetû programot létrehozni. amelyekkel programunk dolgozik. Használjunk moduláris tervezést. Tanultunk a kézi hibakeresésrõl a fontosabb változók értékének kiíratásával és írtunk egy függvényt a feladat megkönnyítésére. Olyan gyakran ellenõrizzük a kódot. mehetünk a következõ részfeladatra. amelyek még a tapasztaltabb programozók életét is megkeserítik. Melyik függvénnyel kaphatunk hasznos információkat a PHP-rõl és a rendszerünkrõl? 2. nézzük meg. ha megírjuk a programot. azután várjuk. Ha ismerjük az adatokat. hogy gyorsan elkülöníthessük a hibát tartalmazó kódrészletet. amilyen gyakran csak lehetséges. A megfelelõ módszerekkel azonban megkönnyíthetjük az életünket. Ha az egyik leglényegesebb lépés például az adatok kiírása egy megadott fájlba. Kérdések és válaszok Létezik módszer. hogy a phpinfo() függvény segítségével hogyan nyerhetünk információkat a rendszer beállításairól és a környezeti változókról. Az error_log() függvénnyel hibaüzeneteket írtunk ki fájlba és küldtünk el elektronikus levélben. Mûhely A mûhelyben kvízkérdések találhatók. A válaszokat az A függelékben helyeztük el. amely elsõre tökéletesen mûködik. mi történik. Ha tökéletesen mûködik. ha a fájl hiányzik. Próbáljunk „bolondbiztos” kódot készíteni és ellenõrizzük mûködését szélsõséges körülmények között.

óra 3. Melyik függvénnyel naplózhatjuk a hibákat? 6. Melyik php. ha a track_errors bejegyzés engedélyezett a php.426 22. Vizsgáljuk meg eddig elkészült programjaink kódját és felépítését az ebben az órában tanult módszerek segítségével. Melyik függvénnyel bírálhatjuk felül ezt a beállítást? 5.ini bejegyzéssel szabályozhatjuk a hibaüzenetek kijelzésének szintjét? 4.ini fájlban? Feladatok 1. Melyik beépített változó tartalmazza a hibaüzenetet. .

óra Teljes példa (elsõ rész) 24.IV. RÉSZ Összefoglaló példa 23. óra Teljes példa (második rész) .

.

hogy függvénykönyvtárakat és újrahasznosítható navigációs elemeket készítsünk? • Hogyan tartsuk nyilván az állapotokat GET típusú lekérdezésekkel. Az órában a következõket tanuljuk meg: • Hogyan készítsünk tervet? • Hogyan használjuk az include() nyelvi szerkezetet. amely az elõzõ órákban tárgyalt eljárásokból építkezik.23. jó alapokkal rendelkezünk a PHP programozáshoz. Ebben és a következõ órában egy teljes. mûködõ programot készítünk. hogy a programozásban járatlan grafikus is dolgozhasson az oldalon? • Hogyan védjük meg szolgáltatásunk oldalait felhasználó-azonosítással? . adatbázisokkal és munkamenet-függvényekkel? • Hogyan válasszuk el a HTML és a PHP kódot. ÓRA Teljes példa (elsõ rész) Ha figyelmesen követtük az egyes órák anyagát.

hogy lássák. Az oldalak felépítése Mielõtt akár egy sor kódot is írnánk. A továbbiakban tagoknak nevezzük azokat a személyeket. hogy egy közösségi webhely tulajdonosai felkértek bennünket. A második a felhasználók területe. akik klubjukat bejegyezve felügyeleti feladatokat látnak el. Az elsõ a tagok számára kialakított terület. hogyan fog mûködni programunk. A felhasználók képesek lesznek a lista szûkítésére a klubok típusa vagy akár a szervezett rendezvény helye szerint is. hogy készítsünk el egy kis interaktív eseménynaptárt az általuk kiszolgált kisváros számára. hogy reklámozzák rendezvényeiket. milyen rendezvények lesznek a városban. akik a listákat böngészve barangolnak a klubok és események között. Milyen módon fogják elérni a felhasználók a rendszer különbözõ elemeit? Milyen oldalakra van szükségünk? A program természetesen két részre tagolódik. ábra Az alkalmazás felépítése .430 23. ahol az adatbázison lekérdezéseket kell majd végrehajtani.1. ábra az alkalmazás felépítését mutatja. 23.1. Klubok és együttesek jegyeztethetik be magukat. A webhely felhasználói ezután különbözõ formákban kiírathatják majd az adatbázist. A 23. és felhasználóknak azokat az érdeklõdõket. új események hozzáadására szolgál majd. óra A feladat rövid leírása Tegyük fel. amely a klubok információinak kezelésére. el kell döntenünk.

klubnev VARCHAR(50). ahonnan a tagok részére készített valamennyi oldal elérhetõ. jelszo VARCHAR(8) ).php oldalon bármikor módosíthatják. Lehetõség lesz a klubok felsoroltatására is.php).Teljes példa (elsõ rész) Az új tagok a csatlakozas. tipus CHAR(3).php). Nyilvánvaló. A klubok tábla a következõképpen hozható létre: CREATE TABLE klubok ( azonosito INT NOT NULL AUTO_INCREMENT PRIMARY KEY. a tagok menüjéhez kerül (tagmenu. egyetlen PHP oldal segítségével (esemenyekinfo. napok. egy név–jelszó pár megadásával. ahol egy ûrlapon meg kell adnia a klubról a szükséges információkat. klubinfo. egyenesen a tagmenu. A táblákat SQL parancsokkal hozzuk létre.php oldalra kerül. nev VARCHAR(8). Ha a választott név még nem foglalt.php oldalon csatlakozhatnak a rendszerhez (itt jegyeztethetik be magukat a tagok közé). Ha a megadott név és jelszó helyesnek bizonyult. Ha a tag a hozzá tartozó klub adatait sikeresen bevitte. teruletek. 431 Az adatbázis kialakítása Az alkalmazás adatainak tárolásához létre kell hoznunk a szervezo adatbázist és ebben négy táblát: klubok. tipusok. A menü oldalról indulva a tagok új rendezvényeket adhatnak a rendszerhez (esemenyfrissites. esemenyek. terület vagy típus alapján (klubokinfo.php).php). nem vihet be új rendezvényeket a rendszerbe. hiszen egy klubhoz több rendezvény is tartozhat. Minden felhasználó képes lesz az események hónapok.php). A klub adatait a klubfrissites.php. hogy a klubok és rendezvények adatait külön táblákban kell tárolnunk. típusok és területek alapján történõ rendezett kiíratására. Végül a felhasználók egy klubra vagy eseményre kattintva bõvebb információkat tudhatnak meg (esemenyinfo.php) és megtekinthetik az adatbázisban levõ rendezvényeik listáját (esemenylista. 23 .php).php oldalra kerülnek. A már bejegyzett tagok a belépõ oldalról indulnak (belepes. terulet CHAR(3). email VARCHAR(50). A területek és típusok számára kialakított táblák jelentõsen megkönnyítik a listázáshoz és adatbevitelhez szükséges lenyíló menük kialakítását. „kézi úton”. ismerteto BLOB. Amíg ki nem tölti ezt az ûrlapot. a leendõ tag a klubfrissites.

amelyik az adott esemény szervezõje. ecim VARCHAR(255). "Családi"). CREATE TABLE tipusok ( azonosito CHAR(3). A 23. és 23. A teruletek és tipusok táblák igen egyszerûek: CREATE TABLE teruletek ( azonosito CHAR(3). A tagok ezekbõl a listákból választhatnak majd. å tipus VARCHAR(30)). hiszen elõfordulhat. Vegyük észre. tipus) VALUES å ("CSA".1. INSERT INTO tipusok (azonosito. Az esemenyek tábla az eseményekre vonatkozó valamennyi információt tartalmazza: CREATE TABLE esemenyek ( eazonosito INT NOT NULL AUTO_INCREMENT PRIMARY KEY. de politikai találkozót is. hogy egy klub összes rendezvényét felsoroljuk. enev VARCHAR(100). . de valamelyik rendezvényét a déli városrészben tartja. óra A tagok a klubnev. A tagok számára nem adunk lehetõséget ezen táblák módosítására. hogy ez a tábla is tartalmaz etipus és eterulet mezõket. ehelyszin VARCHAR(100). email. A tipus és terulet mezõk értelemszerûen a tipusok és teruletek megfelelõ soraira vonatkozó azonosítókat tartalmazzák majd. melyeket INSERT SQL parancsokkal adunk a táblákhoz. Egy társadalmi csoport tarthat oktatási szemináriumot. ismerteto. nev és jelszo mezõk adatait fogják megadni. edatum INT. táblázatban az említett táblákba illesztendõ adatok láthatók. eirsz CHAR(4). eklub INT NOT NULL ). inkább elõre meghatározott csoportokat alakítunk ki.432 23. eismerteto BLOB. etipus CHAR(3). A kapcsolat arra használható fel. hogy egy klub a város északi részén található. illetve hogy elérjük az eseményhez köthetõ klub adatait. å terulet VARCHAR(30)). eterulet CHAR(3). Az eklub mezõ annak a klubnak az azonositószámát tartalmazza.2.

képesnek kell lennünk a tagok felvételére. hogy megkezdjük a kód írását. hogy egyetlen hatalmas programot építenénk fel. amely a körülményeknek megfelelõen más-más oldalakat szolgáltat.1. Úgy döntöttünk. 23 . Az óra további részében az alkalmazás tagoknak szánt oldalait készítjük el. mintha pusztán HTML kódot tartalmazna. A tagoknak szánt oldalak Most már itt az ideje. táblázat A teruletek táblához adott adatok azonosito ESZ DEL KEL NYU terulet Észak Dél Kelet Nyugat 23. Ennek a döntésnek természetesen vannak elõnyei és hátrányai is. Jó ötlet ezekkel kezdeni.2. ahelyett. akik majdnem úgy kezelhetik azt. Mielõtt azonban az adatbevitelt megkezdhetnénk. a kódok ismétlésének hibájába eshetünk és a program növekedésével megnehezíthetjük a fejlesztõk dolgát. mivel így könnyebben vihetünk be próbaadatokat a rendszerbe. Ha egy ilyen dinamikus környezetet több oldalból építünk fel. Másrészt viszont a befejezett prototípust átadhatjuk grafikusainknak. táblázat A tipusok táblához adott adatok azonosito ZEN CSA TRS KZS tipus Zenei Családi Társadalmi Közösségi Tervezési döntésünk Az elõzõ bekezdésekben már láttuk.Teljes példa (elsõ rész) 433 23. milyen szerkezetû alkalmazást készítünk. hogy a különbözõ szolgáltatásokhoz különbözõ PHP programokat készítünk.

Az adatbázissal kapcsolatot tartó kódok külön fájlba helyezése könnyebbé teszi a program késõbbi módosítását vagy más adatbázismotorra való átültetését. elõször meg kell nyitnunk egy kapcsolatot az adatbázis felé. hogy felvehessük az adatokat és kiszûrhessük az ismétlõdéseket. de a hívó kódok módosítására nem lesz szükség. Mivel ezen mûveletek sikere döntõ fontosságú a teljes alkalmazás mûködése szempontjából. . $kapcsolat ) 10: or die ( "Nem lehet megnyitni az adatbázist: ". amely végrehajtja a csatlakozást: 23. Ezt a külsõ fájlt késõbb minden oldalon az include() nyelvi elemmel illesztjük a kódba.inc fájlból 1: $kapcsolat. program Részlet az adatbazis.php tartalmazza azt az ûrlapot. 9: mysql_select_db( "szervezo". hanem megpróbáljuk kiválasztani a szervezo adatbázist is. "jelszo" ). Nem csupán a MySQL kiszolgálóhoz csatlakozunk ebben a függvényben. hogy a mysql_connect() által visszaadott kapcsolatazonosítót tárolja.434 23.php és adatbazis. 6: $kapcsolat = mysql_connect( "localhost". Ez az ilyen alkalmazásoknak annyira jellemzõ eleme.inc A csatlakozas. 3: function dbCsatlakozas() 4: { 5: global $kapcsolat. szerepe és a beillesztés módja után. a mysql_connect() vagy mysql_select_db() végrehajtásának kudarca esetén befejezzük a program futását.mysql_error() ). "felhasznalo". Tulajdonképpen minden adatbázissal kapcsolatos függvényt ebben tárolunk majd. Ahhoz.1.inc nevet kapja. 11: } A dbCsatlakozas() függvény a $kapcsolat globális változót használja arra. ezért az adatbazis. hogy célszerû külön függvényt készíteni erre a célra. 7: if ( ! $kapcsolat ) 8: die( "Nem lehet csatlakozni a MySQL-hez" ). 2: dbCsatlakozas(). Ezzel a fájllal a további PHP oldalakat mindennemû SQL parancstól mentesítjük. Mivel a változó globális. melyet jelen esetben egy külsõ állományban fogunk tárolni. amelyen keresztül az új tagok egy név és jelszó segítségével bejegyeztethetik klubjukat a rendszerbe. Elõfordulhat. óra csatlakozas. hogy késõbb újra kell írnunk a függvényeket. Hozzuk létre a függvényt. a többi adatbázisfüggvény is elérheti.

a változónkat pedig a session_register() függvénnyel rendeljük ehhez: 435 23.inc állomány session_start() függvénye arra szolgál.= "A jelszavak nem egyeznek!<br>\n". 23. 16: 23 . de ez rengeteg kódismétléstõl kímél majd meg bennünket.php oldal megírására. Emlékezzünk rá. hogy minden PHP kód.2. 6: 7: if ( isset( $mitkelltenni ) && $mitkelltenni=="csatlakozas") 8: { 9: if ( empty( $urlap["nev"] ) || 10: empty( $urlap["jelszo"] ) || 11: empty( $urlap["jelszo2"] ) ) 12: $uzenet .inc fájlból 1: session_start(). program csatlakozas. amikor oldalainkat elkészítjük. amit ezen külsõ fájlokba írunk.php 1: <?php 2: include("adatbazis. hogy a különbözõ szolgáltatásokat külsõ állományokba helyezzük.inc"). A munkamenet-függvényeket arra használjuk. hogy megkezdjünk vagy folytassunk egy munkamenetet. Értelmetlen bonyolításnak tûnhet. hogy legyen. 13: 14: if ( $urlap["jelszo"] != $urlap["jelszo2"] ) 15: $uzenet . 4: 5: $uzenet="".Teljes példa (elsõ rész) A munkamenetek követése és az azonosítással kapcsolatos feladatokat ellátó függvények számára egy újabb külsõ állományt használunk.inc"). PHP blokk kezdõ (<?php) és záró (?>) elemek között kell. 2: session_register( "munkamenet" ). hogy egy $munkamenet nevû asszociatív tömböt õrizzünk meg kérésrõl kérésre. 3: include("kozosfv. A kozosfv.3. Most már készen állunk a csatlakozas. program Részlet a kozosfv.= "Ki kell töltenie minden mezõt!<br>\n".

$urlap["nev"]. munkamenetFeltoltes( $azon. $urlap["jelszo"] ).SID ).3.inc"). exit.\"" $urlap["nev"] .= "A tagsági név hossza legfeljebb 8 karakter lehet!<br>\n". program (folytatás) 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: if ( strlen( $urlap["jelszo"] ) > 8 ) $uzenet . ?> <p> <h1>Csatlakozás</h1> .= "A megadott tagsági néven. header( "Location: klubfrissites. óra 23.436 23. } ?> } <html> <head> <title>Csatlakozás</title> </head> <body> <?php include("kozosnav. "nev".= "A jelszó hossza legfeljebb 8 karakter lehet!<br>\n". if ( sorLekeres( "klubok"."\" már van bejegyzett tagunk. adjon meg más nevet!<br>\n". $urlap["jelszo"] ). Kérjük. $urlap["nev"] ) ) $uzenet . if ( $uzenet == "" ) // nem találtunk hibát { $azon = ujTag( $urlap["nev"].php?". if ( strlen( $urlap["nev"] ) > 8 ) $uzenet .

Létrehozunk egy $uzenet nevû változót.?>"> <input type="hidden" name="mitkelltenni" value="csatlakozas"> <input type="hidden" name="<?php print session_name() ?>" value="<?php print session_id() ?>"> Tagsági név: <br> <input type="text" name="urlap[nev]" value="<?php print $urlap["nev"] ?>" maxlength=8> </p> <p> Jelszó: <br> <input type="password" name="urlap[jelszo]" value="" maxlength=8> </p> <p> Jelszó megerõsítés: <br> <input type="password" name="urlap[jelszo2]" value="" maxlength=8> </p> <p> <input type="submit" value="Rendben"> </p> </form> </body> </html> 23 Elõször az include() használatával beillesztjük a külsõ állományokat. tehát azonnal rendelkezésünkre áll egy adatbáziskapcsolat és egy aktív munkamenet.3.Teljes példa (elsõ rész) 437 23. Ezzel a kettõs célú változóval még . program (folytatás) 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: <?php if ( $uzenet != "" ) { print "<b>$uzenet</b><p>". } ?> <p> <form action="<?php print $PHP_SELF.

hogy a navigációs elemeket külön állományba helyezzük. Ha PHP programunkban a $mitkelltenni változó létezik és a várt érték található benne. program Részlet a kozosnav.php?<?php print SID ?>">Belépés</a> | 6: <a href="index. Célszerû már a kezdetektõl beilleszteni a navigációs sávot. ahogy folyamatosan fejlesztjük azt. tudhatjuk. Ezután a $mitkelltenni változó létezését és tartalmát vizsgáljuk.438 23. A body HTML elemen belül elõször egy újabb külsõ fájlt illesztünk be.php?<?php print SID ?>">Klubinformációk</a> | 3: <a href="esemenyekinfo. volt-e hibaüzenet vagy sem. másrészt használhatjuk feltételes kifejezésekben.inc nevû állományban helyezzük el. hogy ellenõrizzük. illetve az elemek kinézetét a teljes alkalmazásra vonatkozóan. feltételezhetjük. óra számos más oldalon találkozni fogunk. amit késõbb kiírhatunk a böngészõ számára. egyetlen mozdulattal módosíthatjuk a hivatkozásokat. 23.inc fájlból 1: <p> 2: <a href="klubokinfo. amely a különbözõ oldalakra mutató hivatkozásokat tartalmazza. Ha a változó nem létezik. így folytathatjuk a programot az ûrlap adatainak ellenõrzésével. hogy a látogató egy hivatkozáson keresztül vagy a böngészõjében lévõ könyvjelzõ révén érkezett az oldalra és nem töltötte ki az ûrlapot. hogy tartalmazza a hibaüzenetet. . Ez is olyan elem. Egyelõre ugorjunk a HTML rész tárgyalására. hogy minden ellenõrzés sikeresen végrehajtódott. hogy az ûrlapot kitöltötte valaki. mivel ez megkönnyíti az alkalmazás ellenõrzését. az adott szolgáltatásra vonatkozó értéket adunk neki. amely többször felbukkan majd az alkalmazásban. Minden általunk készített ûrlapon beállítunk egy mitkelltenni nevû rejtett elemet és egy. Egyelõre ez a fájl csak a látogatók számára is elérhetõ oldalakra mutató hivatkozásokat tartalmazza.4. A navigációs elemeket a kozosnav.php?<?php print SID ?>">Honlap</a> 7: </p> Azzal.php?<?php print SID ?>">Csatlakozás</a> | 5: <a href="belepes. Az $uzenet célja egyrészt.php?<?php print SID ?>">Eseményinformációk</a> | 4: <a href="csatlakozas. Ha a változó üres marad. biztosak lehetünk abban.

akik nem tudnak vagy nem akarnak sütiket fogadni. Ezután meghívjuk az új sorLekeres() függvényt. mert a PHP az így megadott nevekkel érkezõ értékeket egy asszociatív tömbbe rendezi. rátérhetünk arra a kódra. hogy a globális változók környezetét „beszennyezzük”. a harmadik egy érték. Ez azon függvények egyike. a második egy mezõnév. Elõször meg kell bizonyosodnunk róla. Az alkalmazás elkészítése során mindig oldalról-oldalra fogjuk adni a munkamenetazonosítót.php oldalra. amelyek az adatbazis. Célszerû a lehetõ legkevesebbre csökkenteni a globális változók számát egy ilyen méretû programban. hogy megelõzzük a kavarodást. ellenõrizzük az $uzenet változót. Az ûrlapban létrehozzuk a már korábban említett mitkelltenni rejtett elemet is. Ha nem üres.Teljes példa (elsõ rész) Visszatérve a csatlakozas. Programjainkban így minden munkamenet-érték a $munkamenet asszociatív tömbben. azaz feleslegesen sok globális változót hozzunk létre. valamint egy másikat. visszaadva azt egy tömbben. Ez megóv bennünket attól. hogy a leendõ tag valóban kitöltötte-e az összes mezõt és hogy egyik mezõ hossza sem haladja meg a nyolc karaktert. amely a munkamenet nevét és értékét tartalmazza majd. célszerû kikapcsolni a böngészõben a sütik elfogadását. miután kiírjuk az oldal címsorát. Így pontosan tudni fogjuk. Ezen adatok alapján a függvény egy illeszkedõ sort keres az adatbázisban. az urlap[nev]. kiírjuk a tartalmát a böngészõ számára. mivel nem kívánjuk elveszteni azokat a látogatókat. Elsõ paramétere egy táblanév. A HTML ûrlap elemei között három látható mezõt hoztunk létre. hogy megnéztük a HTML ûrlapot. A továbbiakban minden ûrlapot tartalmazó oldalon az $urlap tömbbel fogunk találkozni. 23 . amit $urlap néven érhetünk majd el. Azért használjuk ezeket az elsõre esetleg furcsának látszó elnevezéseket. Ha munkameneteket használó programokat ellenõrzünk. hogy a munkamenet azonosítóját sikeresen át tudjuk-e adni oldalról oldalra ezen szolgáltatás nélkül is vagy sem. az ûrlapértékek pedig az $urlap asszociatív tömbben érhetõk el. urlap[jelszo] és urlap[jelszo2] mezõket. Ez megvéd bennünket a változók ütközésétõl. 439 Most. amely a bemenõ adatok ellenõrzését végzi. Az összegyûjtött hibaüzenetek kiírásával jelezhetjük a tagnak. hogy a bevitt adatok nem dolgozhatók fel.inc fájlban találhatók.

$kapcsolat). Elõször is frissíteni kell az adatbázist. 7: return mysql_fetch_array( $eredmeny ). hogy megkapja a felvett új tag azonosítóját. $jelszo ) 2: { 3: global $kapcsolat. Ha a mysql_fetch_array() nem üres tömböt ad vissza. $kapcsolat ).440 23. a nev mezõnevet és a látogatók által bevitt $urlap["nev"] mezõértéket adjuk át.inc fájlból 1: function sorLekeres( $tabla. Ehhez egy új függvény tartozik az adatbazis. 6: return mysql_insert_id( $kapcsolat ). ezért hibaüzenetet kell adnunk. $mezonev. 5: if ( ! $eredmeny ) 6: die ( "sorLekeres hiba: ". jelszo) 5: VALUES('$nev'. 8: } A függvénynek a klubok táblanevet. 4: $eredmeny = mysql_query( "INSERT INTO klubok (nev. program Részlet az adatbazis. Ha az ellenõrzések után az $uzenet változó még mindig üres. Ez két lépésbõl tevõdik össze. . '$jelszo')".mysql_error() ). ujTag() néven: 23. 7: } A függvény egy név és egy jelszó paramétert vár. létrehozhatjuk az új tagot a bevitt adatokkal.inc állományból. hogy egy ilyen belépési névvel rendelkezõ tag már van a rendszerben. majd ezeket új sorként felveszi a klubok táblájába. program Részlet az adatbazis.5. óra 23.inc fájlból 1: function ujTag( $nev. A függvény a mysql_insert_id()-t használja. tudhatjuk. 4: $eredmeny = mysql_query( "SELECT * FROM $tabla WHERE $mezonev='$mezoertek'". $mezoertek ) 2: { 3: global $kapcsolat.6.

php oldal frissítette az adatbázist és a munkamenethez rendelt értékeket. ábra A csatlakozas. program Részlet a kozosfv. 23. Meghívjuk a header() függvényt. egy belépési nevet és egy jelszót vár paraméterül és hozzáadja azokat a $munkamenet tömbhöz. 8: } Az azonosító. ábrán láthatjuk. ahol a tagnak be kell majd állítania az újonnan bejegyzett klub részletes adatait. 7: $munkamenet["belepett"] = true. 6: $munkamenet["jelszo"] = $jelszo. $nev.php kimenetét a 23. meghívhatjuk a felvételéhez szükséges újabb függvényt. Így ezek az értékek már elérhetõek lesznek minden munkamenetet kezelõ oldalunk számára. Ezzel képesek leszünk a tag azonosítására a további oldalakon is. miután a csatlakozas. A munkamenetFeltoltes() függvény egy azonosítót.2. $jelszo ) 2: { 3: global $munkamenet.Teljes példa (elsõ rész) Mivel már rendelkezünk az új tag azonosítójával. A csatlakozas. 441 23.php oldalra.2. átirányítva a böngészõt a klubfrissites.inc fájlban található. név és jelszó megadása mellett a belépési állapotot jelzõ értéket (belepett) is beállítjuk a munkameneteket kezelõ oldalaink számára. Végül. 5: $munkamenet["nev"] = $nev. útjára engedhetjük új tagunkat. ami a kozosfv. 4: $munkamenet["azonosito"] = $azonosito.php kimenete 23 .inc fájlból 1: function munkamenetFeltoltes( $azonosito.7.

“azonosito”. óra klubfrissites. 26: } 27: } . $urlap["ismerteto"] ).inc").="A klubnév mezõ nincs kitöltve!<br>\n". 6: 7: $uzenet = "".php?". program klubfrissites. 16: 17: if ( ! sorLekeres( "tipusok".inc").SID).= "KRITIKUS HIBA: A terület kódja nem található!<br>". Egyrészt az új tagoknak itt kell megadniuk a klub részletes adatait.php 1: <?php 2: include("adatbazis. $urlap["klubnev"]. a bejegyzett tagok pedig itt módosíthatják ezeket. 8: 9: if ( isset( $mitkelltenni ) && $mitkelltenni=="frissites" ) 10: { 11: if ( empty( $urlap["klubnev"] ) ) 12: $uzenet .442 23. $urlap["terulet"] ) ) 15: $uzenet .= "KRITIKUS HIBA: A típus kódja nem található!<br>". 4: 5: $klub_sor = azonositas(). 23. $urlap["email"].php Ez az oldal kettõs célt szolgál. $urlap["tipus"] ) ) 18: $uzenet . 13: 14: if ( ! sorLekeres( “teruletek”. 25: exit. 19: 20: if ( $uzenet == "" ) 21: { 22: klubFrissites( $munkamenet["azonosito"].8. $urlap["terulet"]. 3: include("kozosfv. 24: header("Location: tagmenu. 23: $urlap["tipus"]. "azonosito".

$urlap["terulet"] ) ?> 23 .Teljes példa (elsõ rész) 443 23. } ?> <html> <head> <title>Klubinformációk frissítése</title> </head> <body> <?php include("kozosnav.inc"). } ?> <form action="<?php print $PHP_SELF. ?> <h1>Klubinformációk frissítése</h1> <?php if ( $uzenet != "" ) { print "<b>$uzenet</b><p>".?>"> <input type="hidden" name="mitkelltenni" value="frissites"> <input type="hidden" name="<?php print session_name() ?>" value="<?php print session_id() ?>"> <p> Klub neve: <br> <input type="text" name="urlap[klubnev]" value="<?php print stripslashes($urlap["klubnev"]) ?>"> </p> <p> Klub helye: <br> <select name="urlap[terulet]"> <?php optionLista( "teruletek". program (folytatás) 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: else { $urlap = $klub_sor.8.

program Részlet a kozosfv. Ez összehasonlítja a munkamenet adatait az adatbázissal.8. $urlap["tipus"])?> </select> </p> <p> Kapcsolattartó e-mail címe: <br> <input type="text" name="urlap[email]" value="<?php print stripslashes($urlap["email"]) ?>"> </p> <p> Klub ismertetõje: <br> <textarea name="urlap[ismerteto]" rows=5 cols=30 wrap="virtual"> <?php print stripslashes($urlap["ismerteto"]) ?> </textarea> </p> <p> <input type="submit" value="Rendben"> </p> </form> </body> </html> Beillesztjük az adatbazis. 4: $munkamenet["belepett"] = false.inc fájlból 1: function azonositas( ) 2: { 3: global $munkamenet.inc nevû külsõ állományainkat. ami a kozosfv.444 23.9.inc és kozosfv. $belepett. így rögtön kész adatbáziskapcsolattal és munkamenettel kezdjük az oldalt. program (folytatás) 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: </select> </p> <p> Klub típusa: <br> <select name="urlap[tipus]"> <?php optionLista( "tipusok". Ezután meghívjuk az új azonositas() nevû függvényt. 23. óra 23. .inc fájlban található.

9.inc állományt illesztjük be.Teljes példa (elsõ rész) 445 23. Ismételten ugorjunk a HTML részre. A $munkamenet["azonosito"] elemét használjuk arra. így pedig felesleges a csalás. Miért vállaljuk fel az adatbázis lekérdezésének költségét az azonosításhoz? Miért nem egyszerûsítjük a problémát a belepett elem ellenõrzésére? Ez visszaéléseknek engedne teret. } Az azonositas() jól átlátható függvény. a PHP ugyanis ezt a $munkamenet tömbbé alakítja. hogy a sorLekeres() függvény segítségével lekérjük a klubhoz tartozó sort az adatbázisból. exit. $munkamenet["azonosito"] ). Késõbb az oldalak ezt az információt saját céljaikra használhatják fel. Ezt a $klub_sor asszociatív tömbben tároljuk és ellenõrizzük a nev és jelszo elemek egyezését a $munkamenet megfelelõ tömbelemeivel. ezt a $klub_sor változónak adjuk értékül. hogy belépést nyerjen. mivel egy rosszindulatú látogató egyszerûen hozzáadhatna az oldal címéhez egy ilyen részt: munkamenet%5Bbelepett%5D=1&munkamenet%5Bazonosito%5D=1 így átvéve az 1-es azonosítóval rendelkezõ tag fölött az irányítást. de mivel az adatbázisban lévõ névvel és jelszóval történõ egyezést vizsgáljuk. Ebben a fájlban azonban továbblépünk az eddigieknél és szerepeltetjük a tagok menüjét is: 23 . amely a kérdéses klubról az adatbázisban található összes adatot tartalmazza. return $klub_sor. } $munkamenet["belepett"] = true.php oldalra küldjük a tagot. Az azonositas() függvény mellékterméke a visszaadott tömb. Itt elõször a kozosnav. amely egy felületesebb ellenõrzésen túljuthatna. "azonosito". a „hamisított” $munkamenet változónak helyes tartalommal kell rendelkeznie. if ( ! $klub_sor || $klub_sor["nev"] != $munkamenet["nev"] || $klub_sor["jelszo"] != $munkamenet["jelszo"] ) { header( "Location: belepes. a belepes. A rosszindulatú látogató most is alkalmazhat egy hasonló trükköt.php" ). Miután az azonositas() függvény visszatér a klub adatait tartalmazó tömbbel. Ha nem egyeznek. program (folytatás) 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: $klub_sor = sorLekeres( "klubok".

inc 1: <p> 2: <a href="klubokinfo.php?<?php print SID ?>">Belépés</a> | 6: <a href="index. ismertetõje és a kapcsolattartó elektronikus levélcíme számára. program kozosnav.php?<?php print SID ?>"> Bejegyzett események</A> | 15: <A HREF="esemenyfrissites. így biztosítjuk. hogy az azonosító oldalról-oldalra átadódjon.php oldal ûrlapja igazán figyelemreméltó. A klubtípusok és területek lenyíló menüinek elõállítására egy új függvény. hogy minden hivatkozásban megadjuk a SID állandót. még akkor is.446 23. az optionLista() szolgál. .php?<?php print SID ?>"> Csatlakozás</a> | 5: <a href="belepes. Vegyük észre.php?<?php print SID ?>"> Új esemény</A> | 16: <A HREF="tagmenu. a csak tagok számára megjelenítendõ hivatkozásokat is kiírjuk.php?<?php print SID ?>”> Klub részletei</A> | 14: <A HREF="esemenylista. ha a sütik nincsenek bekapcsolva.php?<?php print SID ?>"> Klubinformációk</a> | 3: <a href="esemenyekinfo. A klubfrissites. óra 23.10. Szövegmezõket biztosítunk a klub neve.php?<?php print SID ?>">Honlap</a> 7: </p> 8: <?php 9: if ( $munkamenet["belepett"] ) 10: { 11: ?> 12: <p> 13: <A HREF="klubfrissites.php?<?php print SID ?>"> Tagok honlapja</A> 17: </p> 18: <? 19: } 20: ?> 21: <hr> Ha a $munkamenet["belepett"] igazra van állítva.php?<?php print SID ?>"> Eseményinformációk</a> | 4: <a href="csatlakozas. Ez tartalmazza a munkamenet nevét és azonosítóját. Az eddigieknek megfelelõen a mitkelltenni és a munkamenetet azonosító rejtett mezõket is felvesszük az ûrlapba.

Ha az $uzenet változó ezeket követõen üres marad. 4: $eredmeny = mysql_query( "SELECT * FROM $tabla". program Részlet az adatbazis. a SELECTED karakterláncot is kiírja. amely végrehajtja a szükséges módosítást az adatbázisban. a klubFrissites()-nek. 8: return false. egy típust. 12: if ( $azon == $egy_sor[0] ) 13: print "SELECTED". A függvény egy klubazonosítót. 5: if ( ! $eredmeny ) 6: { 7: print "Nem lehet megnyitni: $tabla<p>". elsõ feltételünk az urlap["klubnev"] kitöltöttségének tényét vizsgálja. 14: print ">$egy_sor[1]\n". hogy a megfelelõ elem kerül alapbeállításban kiválasztásra az ûrlapon.inc fájlból 1: function optionLista( $tabla. kiírva egy HTML option elemet a böngészõ számára.Teljes példa (elsõ rész) 447 23. $azon ) 2: { 3: global $kapcsolat. Ezután az urlap["terulet"] és urlap["tipus"] értékek helyességét ellenõrizzük. egy területet. ahol ellenõrizzük a bevitt adatokat. Ha a mysql_fetch_array() által visszaadott tömb elsõ eleme egyezik az $azon paraméterben megadott azonosítóval. A PHP kódban. $kapcsolat ). 15: } 16: } A függvény a $tabla paramétert használja. egy klubnevet. hogy az adatok a meghatározott feltételeknek eleget tesznek. 9: } 10: while ( $egy_sor = mysql_fetch_row( $eredmeny ) ){ 11: print "<option value=\"$egy_sor[0]\"". 23 . Ezzel biztosítjuk. ezért átadjuk azokat egy új függvénynek. tudjuk. hogy kiválasszon minden sort a teruletek vagy tipusok táblából. egy e-mail címet és egy ismertetõt vár a klubok tábla számára. Ezután végiglépked minden soron az eredménytáblában.11.

5: email='$email'. Még mindig van azonban egy feladatunk. 7: if ( ! $eredmeny ) 8: die ( "klubFrissites hiba: ". 4: $lekeres = "UPDATE klubok set klubnev='$klubnev'. $email. a $mitkelltenni változó nem kerül beállításra és az ellenõrzést és frissítést végzõ kód nem hajtódik végre.php kimenete . Ha a tag az oldalt egy hivatkozásra kattintva vagy a böngészõjében lévõ könyvjelzõvel érte el. $ismerteto ) 2: { 3: global $kapcsolat. A 23. $klubnev. így biztosítva. amit az azonositas() függvénnyel töltöttünk fel.12. 6: $eredmeny = mysql_query( $lekeres. program Részlet az adatbazis.3.448 23. ábra a klubfrissites. ismerteto='$ismerteto' WHERE azonosito='$azonosito'". óra 23. tipus='$tipus'. ábra A klubfrissites. 23. 9: } Miután a sort frissítettük.mysql_error() ).php kimenetét mutatja. A $klub_sor asszociatív tömb tartalmazza a klub adatait.php oldalra küldhetjük. $kapcsolat ). hogy az ûrlap alapbeállításban az adatbázisban található érvényes információkat tartalmazza. Ezt a tömböt adjuk értékül az $urlap tömbnek. $terulet. Ebben találhatók az adott klubhoz tartozó mezõnevek és értékek az adatbázisból.3. $tipus. terulet='$terulet'.inc fájlból 1: function klubFrissites( $azonosito. a tagot a tagmenu.

inc állományban található és azt ellenõrzi.php?<?php print SID ?>"> Bejegyzett események</a><br> 23: <a href="esemenyfrissites.php?<?php print SID ?>"> Új esemény</a><br> 24: 25: </body> 26: </html> Az oldalon egyetlen újdonság található. 4: 5: $klub_sor = azonositas().php 1: <?php 2: include("adatbazis.13.php a tagok területének központja.inc"). Miután meghívjuk az azonositas() függvényt. hogy a látogatónk tag. 7: ?> 8: 9: <html> 10: <head> 11: <title>Üdvözlet!</title> 12: </head> 13: 14: <body> 15: <?php 16: include("kozosnav. a kozosfv.php A tagmenu. hogy meggyõzõdjünk róla. Amíg egy tag ki nem tölti legalább a klub nevét.Teljes példa (elsõ rész) 449 tagmenu. 17: ?> 18: 19: <h1>Tagok honlapja</h1> 20: 21: <a href="klubfrissites. Ez a függvény.php?<?php print SID ?>"> Klub részletei</a><br> 22: <a href="esemenylista.inc").inc"). de a tagok számára fontos hírek és ajánlatok is helyet foglalhatnak az oldalon. a klubAdatEllenorzes(). nem adhat rendezvényeket a rendszerhez. hogy a tag megadta-e már a klub adatait. 3: include("kozosfv. Alapvetõen hivatkozások listájából áll. az általa visszaadott tömböt egy új függvénynek adjuk át. program tagmenu. 23. 6: klubAdatEllenorzes( $klub_sor ). 23 .

3: include("kozosfv. hogy a késõbbiekben belépjenek a rendszerbe. 4: 5: $uzenet="".php?". próbálkozzon újra!<br>\n".php programot.= "Hibás név vagy jelszó.inc fájlból 1: function klubAdatEllenorzes( $klubtomb ) 2: { 3: if ( ! isset( $klubtomb["klubnev"] ) ) 4: { 5: header( "Location: klubfrissites. el kell készítenünk a belepes. program Részlet a kozosfv. 11: 12: if ( ! ( $sor_tomb = 13: jelszoEllenorzes( $urlap["nev"]. 7: } 8: } belepes.450 23. 15: . 6: 7: if ( isset( $mitkelltenni ) && $mitkelltenni == "belepes" ) 8: { 9: if ( empty( $urlap["nev"] ) || empty( $urlap["jelszo"] ) ) 10: $uzenet . program belepes.php 1: <?php 2: include("adatbazis.= "Ki kell töltenie minden mezõt!<br>\n". Ez az oldal ad lehetõséget a bejegyzett tagoknak. 6: exit.inc"). $urlap["jelszo"] ) ) ) 14: $uzenet . 23.15. óra 23.inc").SID ).14.php Mielõtt továbblépünk a rendezvényeket kezelõ oldalakra.

?> <h1>Belépés</h1> <?php if ( $uzenet != "" ) { print "<p><b>$uzenet</b></P>". program (folytatás) 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: if ( $uzenet == "" ) // nem találtunk hibát { munkamenetFeltoltes( $sor_tomb["azonosito"].Teljes példa (elsõ rész) 451 23.?>"> <input type="hidden" name="mitkelltenni" value="belepes"> <input type="hidden" name="<?php print session_name() ?>" value="<?php print session_id() ?>"> </p><p> Tagsági név: <br> <input type="text" name="urlap[nev]" value="<?php print $urlap["nev"] ?>"> 23 . $sor_tomb["nev"].SID ). header( "Location: tagmenu.inc"). $sor_tomb["jelszo"] ). } } ?> <html> <head> <title>Belépés</title> </head> <body> <?php include("kozosnav. } ?> <p> <form action="<?php print $PHP_SELF.php?".15.

inc fájlból 1: function jelszoEllenorzes( $nev. Az adatbazis. $jelszo ) 2: { 3: global $kapcsolat. program Részlet az adatbazis. 23. hogy legyen. 12: } .inc és kozosfv. 6: $kapcsolat ).inc függvényt használjuk arra. 9: if ( mysql_num_rows( $eredmeny ) ) 10: return mysql_fetch_array( $eredmeny ). nev.16. Ha a $mitkelltenni változó be van állítva és a várt "belepes" értéket tartalmazza. 11: return false. hogy az urlap["nev"] és urlap["jelszo"] értékeket vizsgáljuk. program (folytatás) 54: 55: 56: 57: 58: 59: 60: 61: 62: </p><p> Jelszó: <br> <input type="password" name="urlap[jelszo]" value=""> </p><p> <input type="submit" value="Rendben"> </form> </body> </html> Az oldal szerkezete már ismerõs kell.mysql_error() ).452 23. 4: $eredmeny = mysql_query( "SELECT azonosito.15. óra 23. ellenõrizzük az ûrlapról érkezett adatokat. 7: if ( ! $eredmeny ) 8: die ( "jelszoEllenorzes hiba: " . hogy adatbáziskapcsolatot létesítsünk és aktív munkamenettel rendelkezzünk.inc állományokat használjuk. Az új adatbazis. jelszo FROM klubok 5: WHERE nev='$nev' and jelszo='$jelszo'".

7: klubAdatEllenorzes( $klub_sor ). meghívjuk a munkamenetFeltoltes() függvényt. $eazonosito ).inc"). "eazonosito". 3: include("kozosfv. 453 esemenyfrissites. Ezután a tagot átirányítjuk a tagmenu.php 1: <?php 2: include("adatbazis.Teljes példa (elsõ rész) A jelszoEllenorzes() egy belépési nevet és egy jelszót vár. 4: include("datum. Ezek felhasználásával egy egyszerû SELECT lekérdezést küld az adatbázisnak a klubok táblájára vonatkozóan. 14: else 15: $eazonosito = false. A teljes esemenyfrissites. 10: $uzenet = "". amely beállítja az azonosito. lehetõséget kell adnunk a rendezvények bevitelére és módosítására.php oldalra. 23.inc"). Visszatérve a belepes. ha nem találunk hibát.php Most. nev. 21: 23 . 5: 6: $klub_sor = azonositas(). 8: 9: $edatum = time(). program esemenyfrissites. programban látható. 16: 17: if ( isset( $mitkelltenni ) && $mitkelltenni=="esemenyFrissites" ) 18: { 19: if ( empty( $urlap["enev"] ) ) 20: $uzenet . 11: 12: if ( ! empty( $eazonosito ) ) 13: $esemeny_sor = sorLekeres( "esemenyek".inc").php oldalra.="Az eseménynek névvel kell rendelkeznie!<br>\n". jelszo és belepett elemeket a $munkamenet tömbben.17. valamint módosítani is tudják az adataikat.php oldal a 23.17. hogy a tagok már képesek csatlakozni és belépni a rendszerbe.

if ( $uzenet == "" ) { esemenyModositas( $urlap["enev"].= "KRITIKUS HIBA: A típus kódja nem található!<br>".= "Múltbeli dátum nem fogadható el!".php?". break. $urlap["eev"] ). $eazonosito ).= "KRITIKUS HIBA: A terület kódja nem található!<br>". "azonosito". } } $edatum = mktime( $urlap["eora"]. $urlap["eterulet"] ) ) $uzenet . "azonosito". $urlap["enap"]. "enap". $urlap["etipus"]. $urlap["etipus"] ) ) $uzenet . $urlap["eterulet"]. $urlap["eismerteto"]. foreach ( array( "ehonap". if ( ! sorLekeres( "tipusok". $urlap["ehelyszin"]. } . 0.17. $munkamenet["azonosito"].SID ). $urlap["eirsz"]. $urlap["ecim"]. program (folytatás) 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: if ( ! sorLekeres( "teruletek". "eev". $edatum. $urlap["eperc"].454 23. óra 23. $urlap["ehonap"].= "KRITIKUS HIBA: A dátum nem értelmezhetõ!". header( "Location: esemenylista. "eperc" ) as $datum_egyseg ) { if ( ! isset( $urlap[$datum_egyseg] ) ) { $uzenet . if ( $edatum < time() ) $uzenet .

?> <h1>Esemény hozzáadása/frissítése</h1> <?php if ( $uzenet != "" ) { print "<b>$uzenet</b>".Teljes példa (elsõ rész) 455 23.inc"). } else { $urlap["eterulet"] = $klub_sor["terulet"]. } ?> <p> <form action="<?php print $PHP_SELF. $edatum = $esemeny_sor["edatum"].?>"> <input type="hidden" name="mitkelltenni" value="esemenyFrissites"> <input type="hidden" name="<?php print session_name() ?>" value="<?php print session_id() ?>"> 23 . $urlap = $esemeny_sor. } ?> <html> <head> <title>Esemény hozzáadása/frissítése</title> </head> <body> <?php include("kozosnav. program (folytatás) 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: } elseif ( $eazonosito ) { //foreach( $esemeny_sor as $kulcs=>$ertek ) // $urlap[$kulcs] = $ertek. $urlap["etipus"] = $klub_sor["tipus"].17.

óra 23. program (folytatás) 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: <input type="hidden" name="eazonosito" value="<?php print $eazonosito ?>"> Esemény neve: <br> <input type="text" name="urlap[enev]" value="<?php print stripslashes($urlap["enev"]) ?>"> </p> <p> Dátum és idõ: <br> <select name="urlap[ehonap]"> <?php honapLehetosegek( $edatum ) ?> </select> <select name="urlap[enap]"> <?php napLehetosegek( $edatum ) ?> </select> <select name="urlap[eev]"> <?php evLehetosegek( $edatum ) ?> </select> <select name="urlap[eora]"> <? oraLehetosegek( $edatum ) ?> </select> <select name="urlap[eperc]"> <? percLehetosegek( $edatum ) ?> </select> </p> <p> Esemény helye: <br> <select name="urlap[eterulet]"> <?php optionLista( "teruletek".17. $urlap["eterulet"] ) ?> </select> </p> <p> Esemény típusa: <br> <select name="urlap[etipus]"> <?php optionLista( "tipusok".456 23. $urlap["etipus"])?> </select> .

akkor le kell kérdeznünk az adatbázisból a módosítandó adatokat. program (folytatás) 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: </p> <p> Esemény ismertetõje: <br> <textarea name="urlap[eismerteto]" wrap="virtual" rows=5 cols=30> <?php print stripslashes($urlap["eismerteto"]) ?> </textarea> </p> <p> Helyszín: <br> <input type="text" name="urlap[ehelyszin]" value="<?php print stripslashes($urlap["ehelyszin"])?>"> </p> <p> Helyszín címe: <br> <textarea name="urlap[ecim]" wrap="virtual" rows=5 cols=30> <?php print stripslashes($urlap["ecim"]) ?> </textarea> </p> <p> Helyszín irányítószáma: <br> <input type="text" name="urlap[eirsz]" value="<?php print stripslashes($urlap["eirsz"]) ?>"> </p> <p> <input type="submit" value="Rendben"> </p> </form> </body> </html> 23 Ezen az oldalon az esemenyek táblának megfelelõ elemekkel készítünk egy ûrlapot.Teljes példa (elsõ rész) 457 23.17. hogy nem esemény hozzáadása a cél. Szokás szerint ellenõriznünk kell a beérkezõ értékeket és frissítenünk kell az adatbázist. Ha azonban az oldal meghívása alapján úgy ítéljük. . hanem módosítás. Az oldal meghívása során az $eazonosito változót kapja.

inc fájlból 1: function esemenyModositas( $enev. a sorLekeres() függvényt alkalmazva kapjuk meg az $esemeny_sor tömbben a rendezvény adatait. eklub.458 23. program Részlet az adatbazis. $eazonosito ) 2: { 3: global $kapcsolat. edatum ) 8: VALUES( '$enev'. $ecim. Ezt az esemenyModositas() függvény arra használja. $eterulet. Ez a függvény minden olyan értéket vár. Ha az $eazonosito nincs megadva vagy üres. új eseményt kell felvennie vagy módosítania kell egy már létezõt. hogy megállapítsa. hogy a klub azonosítószáma a $munkamenet["azonosito"] változóban található. Ha az adatok megfelelnek az általunk támasztott követelményeknek. '$etipus'. ehelyszin. eterulet. 10: } 11: else 12: { . eirsz.18. $ehelyszin. 4: if ( ! $eazonosito ) 5: { 6: $lekeres = "INSERT INTO esemenyek (enev. eismerteto. 23. '$eklub'.inc egy új függvényét hívjuk meg. '$edatum')". 9: '$eirsz'. '$ecim'. $edatum. Ha a változó nem üres. $etipus. így ezt helyezzük az esemenyek tábla eklub mezõjébe. etipus. $eismerteto. $eirsz. '$eismerteto'. az adatbazis. hogy az nem egy múltbeli érték-e. akkor hamis értékre állítjuk. Az utolsó paraméter a rendezvény azonosítószáma. Ha az oldal ûrlapkitöltés hatására hívódott meg. Figyeljük meg. '$eterulet'. óra ha egy meglévõ esemény módosítását kell elvégezni. Ennek érdekében beállítunk egy $edatum nevû globális változót a beadott adatok függvényében. melynek neve esemenyModositas(). $eklub. 7: ecim. '$ehelyszin'. A dátum adatbázisban történõ tárolására idõbélyeget használunk. A dátummal kapcsolatban meg kell vizsgálnunk. amit az esemenyek táblában el kell helyeznünk. ellenõriznünk kell a beérkezett adatokat.

Teljes példa (elsõ rész) 459 23. Az alapbeállításban kiválasztandó értéket már elhelyeztük az $edatum változóban. Ha hamis értékû. ha már meglévõ eseményt módosítunk. hogy a függvény az $eazonosito paraméter értékétõl függõen mûködik. etipus='$etipus'. egy INSERT SQL parancs hajtódik végre a megadott adatokkal. eterulet='$eterulet'. átugorjuk az ellenõrzõ és adatbázis-frissítõ kódokat. az $urlap["terulet"] és $urlap["tipus"] elemeknek a klubnak megfelelõ adatokat adjuk értékül a $klub_sor tömbbõl. az esemenyek tábla edatum mezõjének értékét adjuk az $edatum változónak.php oldalra irányítjuk. 19: if ( ! $eredmeny ) 20: die ( "esemenyModositas hiba: " . Ha azonban rendelkezünk az $eazonosito változóval. Ezzel a megfelelõ lenyíló menükben a klubokhoz tartozó értékek lesznek alapbeállításban kiválasztva. ecim='$ecim'. eklub='$eklub'. Ha a tag még nem töltötte ki az ûrlapot. Egyéb esetben. 15: eismerteto='$eismerteto'. Miután az adatbázist frissítettük.mysql_error() ). a tagot az esemenylista.18. de szükségünk van arra. 23 . Ha beérkezõ adatokat észlelünk. Ezt úgy tehetjük meg. a tag által korábban választott idõt. ehelyszin='$ehelyszin'. Ezeket a menüket elég egyszerûen beépíthettük volna a PHP kódba. 21: } Látható. már lekértük az esemény információit az adatbázisból és az ûrlapra írhatjuk azokat. hogy az $esemeny_sor változót értékül adjuk az $urlap változónak. ahol a teljes rendezvénynaptárt láthatja. program (folytatás) 13: 14: $lekeres = "UPDATE esemenyek SET enev='$enev'. Egyéb esetben az $eazonosito egy UPDATE kérés feltételében szerepel. Ezt a program elején az aktuális idõre állítottuk be. 17: } 18: $eredmeny = mysql_query( $lekeres. annak megfelelõen állítjuk be ezt az értéket. edatum='$edatum' 16: WHERE eazonosito='$eazonosito'". A HTML ûrlapon az egyetlen említésre méltó kód a dátum és idõ számára készített lenyíló menüket állítja elõ. $kapcsolat ). az $edatum változót pedig az $esemeny_sor["edatum"] értékével töltjük fel. eirsz='$eirsz'. vagy az esemenyek táblában tárolt idõt jelezzék. hogy alapbeállításban az aktuális idõt. Ha nem kaptunk ûrlapértékeket és $eazonosito változónk sincs.

"Aug". "Ápr". $honapok = array( "Jan". print ( ( $datum_tomb["mday"] == $x )?"SELECTED":"" )."\"". print ">$ertek\n". "Okt". } } function napLehetosegek( $datum ) { $datum_tomb = getDate( $datum ).inc nevû külsõ állományban találhatók. $x++ ) { print "<OPTION VALUE=\"$x\"". $x<=31."Jún". . 23. for ( $x = $most_tomb["year"]."Már". $most_tomb = getDate(time()). "Júl".inc fájlból 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: function honapLehetosegek( $datum ) { $datum_tomb = getDate( $datum )."Feb".($kulcs+1).460 23. print ">$x\n". program Részlet a datum. Ezek az új datum. $x++ ) { print "<OPTION VALUE=\"$x\""."Máj". $x <= ($most_tomb["year"]+5). print ( ( $datum_tomb["mon"] == ($kulcs+1) )?"SELECTED":"" ). foreach ( $honapok as $kulcs=>$ertek ) { print "<OPTION VALUE=\""."Nov". for ( $x = 1. } } function evLehetosegek( $datum ) { $datum_tomb = getDate( $datum )."Dec" )."Szep". óra Minden lenyíló menühöz az $edatum változóban lévõ idõbélyeget adjuk át a megfelelõ függvénynek.19.

sprintf("%'02d". } } Minden függvény egy idõbélyeget vár és HTML OPTION elemek listáját írja ki.$x).sprintf("%'02d". A getDate() PHP függvényt használják arra. 23 .Teljes példa (elsõ rész) 461 23. print ">". $x<= 59. print ( ( $datum_tomb["minutes"] == $x )?"SELECTED":"" ). így választják ki a megfelelõ sort. for ( $x = 0. } } function oraLehetosegek( $datum ) { $datum_tomb = getDate( $datum ). program (folytatás) 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: print ( ( $datum_tomb["year"] == $x )?"SELECTED":"" ). a perceknél 0-tól 59-ig terjed).4. print ">". ábra az esemenyfrissites. perc). $x++ ) { print "<OPTION VALUE=\"$x\". for ( $x = 0.$x). } } function percLehetosegek( $datum ) { $datum_tomb = getDate( $datum ). $x++ ) { print "<OPTION VALUE=\"$x\"". Ezután a kapott számot összehasonlítják az alkalmazott tartomány értékeivel (a tartomány a hónap napjainál 1-tõl 31-ig. a SELECTED jelzõt adják az OPTION elemhez. print ( ( $datum_tomb["hours"] == $x)?"SELECTED”:"" )."\n". Ha egyezést észlelnek. $x< 24. hogy az idõbélyeg megfelelõ elemének indexét megállapítsák (év.php kimenetét mutatja.19."\n". A 23. print ">$x\n". óra. hónap. hónap napja.

10: $esemenyek = esemenyekLekeres ( $klub_sor["azonosito"] ).462 23. 6: 7: function esemenyKiiras() 8: { 9: global $klub_sor. Ennek az oldalnak lehetõséget kell adnia arra is. 23. 11: if ( ! $esemenyek ) 12: { 13: print "Nincs esemény a listában<P>".inc").php az eddigiek ismeretében egyszerû program. 15: } . ábra Az esemenyfrissites.php kimenete esemenylista.20. óra 23. 14: return. 3: include("kozosfv. program esemenylista.php Végül biztosítanunk kell a tagoknak egy oldalt.4.inc"). 5: klubAdatEllenorzes( $klub_sor ). Az esemenylista. 4: $klub_sor = azonositas(). ahol minden általuk bevitt eseményt végigtekinthetnek. hogy a tagok az eseményeket szerkeszthessék vagy törölhessenek egyet.php 1: <?php 2: include("adatbazis.

"?eazonosito=". print "törlés</a><br></td>\n". hogy törli ezt az eseményt?')\">". print "onClick=\"return window. $uzenet .= "Az esemény törlése megtörtént!<br>". } ?> <html> <head> <title>Események listája</title> </head> 23 ."&". } $uzenet="".SID.SID. $sor["edatum"]).20. $sor["eazonosito"]. print "<td><b>Dátum</b></td>\n<td> <b>Név</b></td>\n <td><b>&nbsp.date("j M Y H."</a></td>\n"."\" ". html($sor["enev"]). } print "</table>\n". if ( isset( $mitkelltenni ) && $mitkelltenni == "esemenyTorles" && isset( $eazonosito ) ) { esemenyTorles( $eazonosito ). $GLOBALS["PHP_SELF"].confirm('Biztos benne. program (folytatás) 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: print "<table border=1>\n". print "&mitkelltenni= esemenyTorles&". print "</tr>\n". print "<td><a href= \"esemenyfrissites. foreach ( $esemenyek as $sor ) { print "<tr>\n". print "<td><a href=\""."</td>\n".php?eazonosito=".</b></td>\n".i". $sor["eazonosito"].Teljes példa (elsõ rész) 463 23. print "<td>"."\">".

inc fájlt. hacsak nem érzékelünk teljesítménybeli problémákat a program futása során. egyelõre elegendõ annyit tudnunk. Ha az $esemenyek hamis értékû. Emlékezzünk rá. hogy kész adatbáziskapcsolattal kezdjük az oldalt és a kozosfv. figyelmeztetõ üzenetet küldünk a kimenetre és befejezzük a függvény futását. hogy a klubhoz tartozó összes rendezvényt listába írjuk. hogy aktív munkamenetünk legyen. így egy kétdimenziós tömbben adja vissza a klubhoz tartozó összes esemény minden adatát. Ezt a függvényt alaposabban a következõ órában tárgyaljuk.inc esemenyekLekeres() függvényét használjuk. hogy az azonositas() függvény által visszaadott $klub_sor tömb tartalmazza a klubadatokat. hogy érvényes tag kérte-e le az oldalt. Úgyszintén a megszokott módon ellenõrizzük.20. . óra 23. amely közvetlenül a böngészõbe írja az eseményrõl elérhetõ információkat. hogy egy klubazonosítót vár elsõ paraméteréül. de az esemenyekLekeres() függvény olyan rugalmas.inc fájlt használjuk. program (folytatás) 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: <body> <?php include("kozosnav. } ?> <?php esemenyKiiras(). Egyéb esetben egy HTML táblázatot építünk fel: végiglépkedve az $esemenyek tömbön kiírunk minden eseményre vonatkozóan néhány információt. mint amennyire szükségünk van. hogy nyugodtan használhatjuk. A $klub_sor["azonosito"] értéket használhatjuk arra. ?> </body> </html> Szokás szerint az adatbazis. Valójában több adatot kérünk le. ?> <h1>Események listája</h1> <?php if ( $uzenet != "" ) { print "<b>$uzenet</b>". Ehhez az adatbazis.464 23. A függvény visszatérési értékét az $esemenyek tömbben tároljuk. Ezután létrehozunk egy új esemenyKiiras() nevû függvényt.inc").

Ez az adott esemény törlésére szolgál majd. Az átadandó eazonosito változó mellett szerepeltetjük a SID állandót. felhasználva az esemény azonosítóját és az enev értéket. Miután elkészítettük az esemenyKiiras() függvényt. 4: $lekeres = "DELETE FROM esemenyek WHERE eazonosito='$eazonosito'".php egy lehetséges kimenetét a 23.inc függvényt. Végül minden rendezvény sorában egy erre az oldalra visszamutató hivatkozást is szerepeltetünk.php oldalra mutat.inc fájlból 1: function esemenyTorles( $eazonosito ) 2: { 3: global $kapcsolat. 6: if ( ! $eredmeny ) 7: die ( "esemenyTorles hiba: ".21. formázott dátumokat írunk ki. $kapcsolat ). 5: $eredmeny = mysql_query( $lekeres. Ha rendben megkaptuk ezeket. 9: } Az esemenylista. az esemenyTorles()-t hívjuk meg. egy új adatbazis.Teljes példa (elsõ rész) A date() PHP függvénynek átadva minden tömb edatum elemét. hogy ne lehessen véletlenül törölni egy rendezvényt sem. Ehhez az eazonosito mellett egy esemenyTorles értékû mitkelltenni paramétert is meghatározunk. ezért egy JavaScript eseménykezelõt is adunk a hivatkozáshoz. ábra mutatja. amikor a tag törölni kíván egy eseményt. A hivatkozás az esemenyfrissites. Ezt a $mitkelltenni és az $eazonosito változók ellenõrzésével tehetjük meg. így biztosítva. A dátum mellett minden esemény számára egy hivatkozást hozunk létre. amely így meg tudja jeleníteni az esemény adatait a szerkesztés számára. program Részlet az adatbazis. átadva az $eazonosito értéket.5.mysql_error() ). hogy a munkamenet érvényes marad az új oldalon is. kezelnünk kell azt az esetet is. 8: return ( mysql_affected_rows($kapcsolat) ). 465 23. 23 .

Van valami titok emögött? A példaalkalmazás elkészítése során majdnem minden oldalon egyszerû mintát követtünk. óra 23. hogy a lehetõ legtöbb kódot külsõ állományokban helyeztük el.466 23. a teljes környezetrõl egyetlen programként kell gondolkodnunk. A különálló oldalak csak a látogató csatlakozási pontjai az egész alkalmazáshoz. azzal. Gyakran használtuk a header() függvényt. Lehetõséget teremtettünk grafikusainknak az oldalak jó kialakítására. ábra Az esemenylista. Kérdések és válaszok A több oldalból álló alkalmazások megtervezése és karbantartása bonyolultnak tûnik. A belépési információk tárolásához munkamenet-kezelõ függvényeket. tagok számára készült környezettel a rendezvényeket nyilvántartó rendszerhez.5. Ahogy alkalmazásaink nagyobbá válnak.php kimenete Összefoglalás Az óra végére elkészültünk a teljesen mûködõ. A következõ órában hasonló megoldásokat fogunk használni a program nyilvános felületének kialakításához. hogy új oldalra irányítsuk a tagot. Tartsuk az összes egynél több oldalon ismétlõdõ kódot külön állományban! . a tagok azonosításához adatbázislekérdezéseket használtunk minden oldalon. ha adatokat várunk tõle.

Melyik függvényt alkalmazzuk a munkamenet elkezdésére vagy folytatására? 3. Melyik állandót alkalmazhatjuk arra. Minden más tartalom dinamikusan áll majd elõ a program futása során. hogy egyetlen központi programot készítünk a teljes alkalmazás számára. Szükségünk lesz egy mitkelltenni típusú változóra. Találunk olyan megoldásokat.Teljes példa (elsõ rész) Ha esetleg úgy döntünk. alapvetõ HTML elemeket tartalmazó oldalt kell készítenünk. hogy MySQL adatbázishoz csatlakozzunk? 2. Ez sokkal formásabbá teheti a kódot és segít elkerülni a nem túl elegáns Location fejléctrükköt. melyek segítenek megszilárdítani az órában szerzett tudást. Kvíz 1. Melyik PHP függvényt használjuk arra. Hogyan küldhetjük tovább a látogatót egy másik oldalra? 7. 467 Mûhely A mûhelyben kvízkérdések találhatók. hogy sokkal több HTML-t kell beépítenünk a PHP kódok közé. egy egyszerû. A válaszokat az A függelékben helyeztük el. Tekintsünk végig az órában tárgyalt forráskódokon. Melyik függvény alkalmas arra. Melyik PHP függvénnyel küldünk SQL kéréseket egy MySQL adatbázis számára? 5. Másrészt ez azzal jár. Melyik függvény alkalmas dátumok formázására? Feladatok 1. amely mindig a megfelelõ szolgáltatást választja ki a teljes alkalmazásból. amelyeket saját programjainkban is tudunk majd hasznosítani? 23 . hogy külsõ állományokat illesszünk a PHP kódba? 4. hogy a munkafolyamat-azonosítót eljuttassuk egyik oldalról a másikra egy HTML hivatkozásban? 6.

.

melyek lehetõvé teszik a listák böngészését. Most az átlagos felhasználók számára elérhetõ programokat kell elkészítenünk. hogy a HTML kódba írhassuk azokat? . amivel új klubok és rendezvények kerülhetnek a rendszerbe. amelyek egyetlen lekérdezéssel több táblából hívnak le adatokat? • Hogyan készíthetünk a paramétereiktõl függõ SQL parancsokat végrehajtó függvényeket? • Hogyan menthetjük a felhasználó régebbi beállításait munkamenetfüggvényekkel? • Hogyan kell átalakítanunk az egyszerû szöveges adatokat. ÓRA Teljes példa (második rész) Az elõzõ órában felépítettük a klubok számára a bejegyzõ és karbantartó felületet. Ebben az órában a következõket tanuljuk meg: • Hogyan készítsünk olyan függvényeket.24.

inc"). 15: $munkamenet["esemenyek"]["honap"] = $datum_tomb["mon"]. itt az ideje. 5: 6: if ( isset($mitkelltenni) && $mitkelltenni == "esemenyLista" ) 7: $munkamenet["esemenyek"] = $urlap. 13: $munkamenet["esemenyek"]["terulet"] = "BÁRMELY".php Az esemenyekinfo. 20: $munkamenet["esemenyek"]["ev"] ). 17: } 18: 19: $idoszak = datumIdoszak( $munkamenet["esemenyek"]["honap"].470 24.inc"). 14: $munkamenet["esemenyek"]["tipus"] = "BÁRMELY".php oldalra. bármilyen idõpont szerinti szûréssel párosítva. amelyek lehetõséget adnak a felhasználónak. 4: include("kozosfv. program esemenyekinfo. óra Az eseménynaptár nyilvános oldalai Miután a tagok bejegyeztethetik klubjaikat és az eseményeket.php 1: <?php 2: include("adatbazis. Ezek az oldalak a listák böngészésére és nem a bennük való keresésre szolgálnak majd. de nagyobb rugalmasságot és több információt nyújt a felhasználónak.php oldal lehetõséget ad a rendszerben lévõ rendezvények böngészésére. 10: else 11: { 12: $datum_tomb = getDate( time() ). bár nem lenne túl bonyolult ez utóbbit sem megvalósítani. 24. hogy az átlagos felhasználó számára is elérhetõ oldalak készítésébe fogjunk. hogy kiírassa egy adott terület vagy téma rendezvényeit. amit az elõzõ órában tárgyaltunk. 16: $munkamenet["esemenyek"]["ev"] = $datum_tomb["year"]. 3: include("datum. . 8: elseif ( $munkamenet["esemenyek"] ) 9: $urlap = $munkamenet["esemenyek"]. esemenyekinfo. Ebben az órában négy oldalt készítünk el.1.inc"). Bizonyos szempontból hasonlít az esemenylista.

html($sor["klubnev"]). print "<td><b>Klub</b></td>\n"."\">". program (folytatás) 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: function esemenyLista( ) { global $idoszak.i". print "<td><a href=\"esemenyinfo. $munkamenet["esemenyek"]["terulet"].php?eazonosito="."</td>\n". $esemenyek = esemenyekLekeres( 0. } ?> <html> <head> <title>Esemény információk</title> 24 . print "<td><b>Esemény</b></td>\n". $munkamenet["esemenyek"]["tipus"] )."\">".SID. $munkamenet. html($sor["enev"]). return. print "<td><b>Terület</b></td>\n". if ( ! $esemenyek ) { print "Nincs megjeleníthetõ esemény<p>".SID."</a></td>\n". print "<td>". $sor["edatum"])."</td>\n". print "<td><a href=\"klubinfo. print "<td><b>Típus</b></td>\n".php?kazonosito="."</a></td>\n"."&". $sor["eazonosito"]. print "</tr>\n". $idoszak.Teljes példa (második rész) 471 24.date("j M Y H.1."&". foreach ( $esemenyek as $sor ) { print "<tr>\n". $sor["eklub"]. } print "</table>\n".$sor["tipusnev"]. print "<td>". print "<td><b>Dátum</b></td>\n". print "<td>".$sor["teruletnev"]."</td>\n". } print "<table border=1>\n".

?> </select> <select name=urlap[terulet]> <option value="BÁRMELY">Bármely terület <?php optionLista( "teruletek". program (folytatás) 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: </head> <body> <?php include("kozosnav.inc").472 24. ?> <h1>Esemény információk</h1> <p> <form action="<?php print $PHP_SELF. $urlap["terulet"]) ?> </select> <select name=urlap[tipus]> <option value="BÁRMELY">Bármely típus <?php optionLista( "tipusok".1.?>"> <input type="hidden" name="mitkelltenni" value="esemenyLista"> <input type="hidden" name="<?php print session_name() ?>" value="<?php print session_id() ?>"> <select name=urlap[honap]> <?php honapLehetosegek( $idoszak[0] ). óra 24. $urlap["tipus"] ) ?> </select> <input type = "submit" value="Listázás"> </form> </p> <?php esemenyLista( ). ?> </body> </html> . ?> </select> <select name=urlap[ev]> <?php evLehetosegek( $idoszak[0] ).

inc külsõ állományok beillesztésével kezdjük. hogy a belépett tag adatait nyilvántartsuk. viszont a $munkamenet["esemenyek"] tömb már tartalmaz elemeket. Ebben a tömbben fogjuk tárolni a csak ehhez az oldalhoz tartozó beállításokat. Ezek a terület. amelyek a felhasználó beállításait tartalmazzák majd. azok elõnyt élveznek minden korábban elraktározott adattal szemben. hogy az ûrlapban a megfelelõ beállítások látsszanak. de korábban már tároltuk a felhasználó által elõnyben részesített beállításokat.inc állományban rendeltük a munkamenethez (mint azt már az elõzõ órában láttuk): session_start(). Az elõzõ órában láthattuk. Ez a függvény hónap és év paramétereket vár és két idõbélyeggel tér vissza. Ebben az órában új elemeket adunk ehhez. megjelölve a hónap kezdetét és végét. Ezután ellenõrizzük. hogy érkezett-e ûrlapadat. Már tudjuk. Lehetséges. session_register( "munkamenet" ). Ha ûrlap adat érkezett. Ezeket az értékeket a datum. akár ûrlapértékekbõl. A visszaadott tömb alapján állítjuk be a $munkamenet["esemenyek"]["honap"] és $munkamenet["esemenyek"]["ev"] elemeket az aktuális hónap és év értékekre. hogy élõ adatbáziskapcsolattal rendelkezünk és aktív munkamenettel dolgozhatunk. típus. akár korábbi beállításból. Ebben az esetben az $urlap tömböt írjuk felül a korábban tárolt értékekkel. hogy elérhetjük majd az ezekben tárolt függvényeket. A getDate() beépített PHP függvényt használjuk arra. A $munkamenet változót a kozosfv. a korábbi beállításokat ezzel írjuk felül. mivel a $munkamenet["esemenyek"] tömbelemnek egy asszociatív tömböt adunk értékül. Ebben az esetben a $mitkelltenni változó nincs beállítva.inc egy új függvényének. nekünk kell alapértékekkel feltöltenünk a $munkamenet["esemenyek"] tömböt. 473 24 . hogy az év és hónap értékek érvényes adatot tartalmaznak. a datumIdoszak() függvénynek adjuk át.inc és a kozosfv. Ha kitöltött ûrlap adatai érkeztek. akár az aktuális dátumból származnak. Ez biztosítja. hogyan rendeltünk egy asszociatív tömböt a munkamenethez. Ezt a már ismert mitkelltenni ûrlapelembõl származó $mitkelltenni változó vizsgálatával tehetjük meg.Teljes példa (második rész) Szokás szerint az adatbazis. hónap és év értékek. Most ezt a $munkamenet tömböt többdimenziós tömbbé alakítjuk. hogy a program futásakor éppen nem érkezett ûrlapinformáció. Ha a felhasználó nem küldött be ûrlap adatokat és korábban sem tároltuk a beállításait. Amellett. biztosak lehetünk abban. hogy elemeire bontsuk a dátumot.

azonosito=esemenyek.*. de kevés jó tulajdonságát ismerhettük meg. 1. $tipus=0 ) 2: { 3: global $kapcsolat.azonosito 8: AND esemenyek. teruletek. 24.= "klubok.eterulet=teruletek.= "AND esemenyek.etipus=tipusok. $idoszak=0. óra 24.3 program Részlet az adatbazis. Ezzel a függvénnyel érintõlegesen már az elõzõ órában is találkoztunk. $honap+1.474 24.azonosito ". 1. $ev ). $honap.tipus as tipusnev ". amely a megfelelõ eseményekrõl ír majd információkat a böngészõbe.klubnev. Létrehozunk egy új esemenyLista() függvényt.= "FROM klubok. $vege ).eklub= '$kazonosito' ". hogy az események listáját megkapjuk.inc fájlból 1: function esemenyekLekeres( $kazonosito=0. esemenyek. 11: if ( ! empty($idoszak) ) . $ev ) 2: { 3: $eleje = mktime( 0. $terulet=0. 6: return array( $eleje. 0. 9: if ( ! empty( $kazonosito ) && $kazonosito !="BÁRMELY" ) 10: $lekeres . 0.eklub 7: AND esemenyek. tipusok WHERE ". program Részlet a datum. $ev ).terulet as teruletnev. esemenyek.inc állományban található. 5: $lekeres . tipusok. 7: } A függvény által visszaadott tömböt az $idoszak globális változónak adjuk értékül. 4: $vege = mktime( 0. 0. 6: $lekeres . teruletek. Ezt késõbb a HTML törzsrészében hívjuk meg. Ahhoz. 0. az esemenyekLekeres() függvényt használjuk. 5: $vege--. 4: $lekeres = "SELECT klubok.inc fájlból 1: function datumIdoszak( $honap.2. amely az adatbazis.

return $vissza. 24 . A $tipus és $terulet paraméterek akkor is figyelmen kívül maradnak.= "klubok.etipus='$tipus' ".= "AND esemenyek. if ( ! empty($tipus) && $tipus != "BÁRMELY" ) $lekeres .eterulet=teruletek. $vissza = array().= "ORDER BY esemenyek.etipus=tipusok.azonosito ".edatum <='$idoszak[1]' ". A lekérés alapvetõen összekapcsolja az adatbázisban lévõ táblákat. $lekeres = "SELECT klubok. egy két idõbélyeget tartalmazó tömbbõl álló idõszakot. $eredmeny = mysql_query( $lekeres.= "AND esemenyek. } 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: A függvény neve nem igazán fejezi ki sokoldalúságát.edatum".tipus as tipusnev ". while ( $sor = mysql_fetch_array( $eredmeny ) ) array_push( $vissza.= "FROM klubok. illetve üres értékkel helyettesíthetõ. esemenyek.Teljes példa (második rész) 475 24. if ( ! empty($terulet) && $terulet != "BÁRMELY" ) $lekeres . tipusok WHERE ". ha a "BÁRMELY" karakterláncot tartalmazzák. hogy a megfelelõ függvényparaméter be van-e állítva.és egy típuskódot.azonosito AND esemenyek.3 program (folytatás) 12: $lekeres .edatum >= '$idoszak[0]' AND esemenyek. egy terület.eterulet='$terulet' ". $lekeres .terulet as teruletnev. teruletek.eklub AND esemenyek. Négy paramétert vár: egy klubazonosítót. $lekeres . hogy a klubnév. Minden paramétere elhagyható vagy hamis.*.klubnev. attól függõen. $sor ). A függvény lényegében egy SQL kérést állít össze a paraméterek alapján. esemenyek. teruletek. tipusok. if ( ! $eredmeny ) die ( "esemenyLekeres hiba: ". Ezután a függvény további feltételeket ad ehhez. $lekeres .= "AND esemenyek.mysql_error() ). ezzel biztosítva. területnév és típusnév mezõk is elérhetõk legyenek az eredménytáblában. $kapcsolat ).azonosito=esemenyek.

Ebben a ciklusban egy újabb HTML hivatkozást is készítünk a klubinfo. Az edatum elemeket felhasználva kiírjuk a formázott dátumokat a date() beépített függvény segítségével. annál szûkebb eredménytáblát fogunk kapni. 10: } 11: .és típusneveket a böngészõbe. Ehhez az esemény azonosítóját és a SID állandót kell átadnunk.476 24. hogy egy html() nevû függvényt használtunk arra. Ha csak a második $idoszak paramétert adjuk meg. csak az adott idõszakba esõ rendezvényeket láthatjuk és így tovább. program Részlet a kozosfv.php oldalra. az újsor karakterek például <br>-é. Egy karakterláncot vár és annak böngészõbe íráshoz alkalmassá tett. Ezután egy hivatkozást készítünk az esemenyinfo. Ha nem adunk át semmilyen paramétert. 24. 8: } 9: return htmlszoveg( $szoveg ).4. ahol több információ érhetõ el egy rendezvényrõl. hogy szöveges adatokat írjunk ki a böngészõbe. hogy minél több paramétert kap a függvény. Ez az általunk írt függvény a kozosfv. amely a kiválasztott események részleteit tartalmazza. ahogy az események információin végiglépkedünk. Ha csupán egy $kazonosito paramétert adunk meg. csak az adott klubhoz tartozó eseményeket kapjuk vissza. óra A gyakorlatban ez azt jelenti.inc fájlból 1: function html( $szoveg ) 2: { 3: if ( is_array( $szoveg ) ) 4: { 5: foreach ( $szoveg as $kulcs=>$ertek ) 6: $szoveg[$kulcs] = htmlszoveg( $ertek ). végig kell lépkednünk annak elemein. A különleges karakterek HTML elemekké alakulnak. a klub azonosítójával és a SID állandóval.php oldalra. Az esemenyLista() függvényben.inc állományban található. átalakított változatával tér vissza. Talán feltûnt az elõzõ órában. ismét a html() függvényt hívjuk meg. Miután a függvény által visszaadott kétdimenziós tömböt az $esemenyek változóba helyeztük. az összes esemény információit megkapjuk. végül kiírjuk a terület. 7: return $szoveg. Végül a függvény az SQL parancsot végrehajtja és egy kétdimenziós tömbbel tér vissza.

php egy lehetséges kimenetét a 24. 16: return $szoveg. 17: } Látható. a htmlszoveg()-ben valósul meg. illetve bõvítésére. Ha tömböt kap. miután beállítottuk az alapadatokat és létrehoztuk az események kiírására szolgáló függvényt. 15: $szoveg = nl2br( $szoveg ). ábra Az esemenyekinfo. már csak annyi van hátra. ami nem jelenne meg helyesen a HTML kódban. amely két beépített függvényt alkalmaz a kapott karakterláncra. Az nl2br() minden újsor karaktert <br> sortöréssel helyettesít.1.php oldalra. hogy ez valójában nem egy. hogy egy ûrlapot biztosítsunk a felhasználónak. Az esemenyekinfo.Teljes példa (második rész) 477 24. program (folytatás) 12: function htmlszoveg( $szoveg ) 13: { 14: $szoveg = htmlspecialchars( $szoveg ). Visszatérve az esemenyekinfo. végiglépked rajta. A tényleges átalakítás egy másik függvényben. amely lehetõséget ad a lista szûkítésére. melyek közvetlenül OPTION HTML elemeket írnak ki a böngészõbe. átalakítva minden elemet. hanem két függvény.1. 24.php kimenete 24 .4. ábra mutatja. A html() egy karakterláncot vagy egy tömböt vár paraméterül. egyéb esetben magát a kapott karakterláncot alakítja át. A felhasználónak választási lehetõséget adó ûrlap egyszerûen elkészíthetõ az elõzõ órában megismert függvényekkel. A htmlspecialchars() minden karaktert. a hozzá tartozó HTML elemre cserél.

24. program klubokinfo.php A felhasználó jogos igénnyel nem csak rendezvények.478 24. 13: } 14: function klubLista( ) 15: { 16: global $munkamenet.php 1: <?php 2: include("adatbazis. 19: if ( ! $klubok ) 20: { 21: print "Nincs megjeleníthetõ klub<p>\n". 26: print "<td><b>Terület</b></td>\n". 22: return. 12: $munkamenet["klubok"]["tipus"] = "BÁRMELY". óra klubokinfo. . 4: include("kozosfv.inc"). hanem klubok szerint is ki szeretné íratni az adatbázis adatait. 5: if ( isset($mitkelltenni) && $mitkelltenni == "klubLista" ) 6: $munkamenet["klubok"] = $urlap.inc"). 28: foreach ( $klubok as $sor ) 29: { 30: print "<tr>\n". 23: } 24: print "<table border=1>\n". 7: elseif ( $munkamenet["klubok"] ) 8: $urlap = $munkamenet["klubok"]. 9: else 10: { 11: $munkamenet["klubok"]["terulet"] = "BÁRMELY".5. 3: include("datum.inc").php oldal ezt az igényt elégíti ki. 17: $klubok = klubokLekeres ( $munkamenet["klubok"]["terulet"]. 18: $munkamenet["klubok"]["tipus"] ). 27: print "<td><b>Típus</b></td>\n". 25: print "<td><b>Klub</b></td>\n". A klubokinfo. típus vagy terület szerint szûkítve azokat.

5. print "</tr>\n".php?[kazonosito]=".?>"> <input type="hidden" name="mitkelltenni" value="klubLista"> <input type="hidden" name="<?php print session_name() ?>" value="<?php print session_id() ?>"> <select name=urlap["terulet"]> <option value="BÁRMELY">Bármely terület <?php optionLista( "teruletek"."&".inc"). $urlap[terulet] ) ?> </select> <select name=urlap[tipus]> <option value="BÁRMELY">Bármely típus <?php optionLista( "tipusok". } print "</table>\n"."</a></td>\n".SID.Teljes példa (második rész) 479 24. print "<td>$sor["teruletnev"]</td>\n". html($sor["klubnev"]). ?> <P> <h1>Klub információk</h1> <p> <form action="<?php print $PHP_SELF. program (folytatás) 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: print "<td><a href=\"klubinfo. print "<td>$sor["tipusnev"]</td>\n". } ?> <html> <head> <title>Klub információk</title> </head> <body> <?php include("kozosnav. $urlap["tipus"] ) ?> </select> <input type = "submit" value="Rendben"> </form> 24 . $sor["azonosito"]."\">".

azokkal írjuk felül a korábbi tartalmát.= "ORDER BY klubok. óra 24. teruletek.azonosito ". program Részlet az adatbazis.inc fájlból 1: function klubokLekeres( $terulet="".= "klubok. teruletek.5. 7: if ( $terulet != "BÁRMELY" && ! empty( $terulet ) ) 8: $lekeres .480 24.= "AND klubok. a klubokLekeres()-t hívjuk meg. 9: if ( $tipus != "BÁRMELY" && ! empty( $tipus ) ) 10: $lekeres . klubok. Ha egyik feltétel sem teljesül.terulet=’$terulet’ ". 5: $lekeres . ha nem érkezett ûrlap és már be van állítva. akkor az $urlap tömböt írjuk felül a $munkamenet["klubok"] változóval.terulet=teruletek. tipusok. Az ehhez az oldalhoz tartozó „memória” azonban a $munkamenet["klubok"] tömbbe kerül. hogy ez a program szerkezetében és logikájában igencsak hasonlít az elõzõ példában szereplõre. 6: $lekeres .= "FROM klubok.terulet. $tipus="" ) 2: { 3: global $kapcsolat. 12: $eredmeny = mysql_query( $lekeres. ?> </body> </html> Láthatjuk. 24.azonosito AND klubok. Ez a függvény a klub területére. Ha ûrlapadatok érkeznek. Egy klubLista() függvényt hozunk létre.tipus='$tipus' ". 11: $lekeres . klubok.6.tipus. alapértékekkel töltjük fel.mysql_error() ). amelyben az adatbazis. 13: if ( ! $eredmeny ) 14: die ( "klubokLekeres hiba: ".tipus=tipusok.klubnev". program (folytatás) 65: 66: 67: 68: 69: 70: </p> <?php klubLista( ). 4: $lekeres = "SELECT klubok. $kapcsolat ). .inc egy új függvényét. tipusok WHERE ".= "AND klubok. illetve típusára vonatkozó elhagyható paramétereket vár.tipus as tipusnev ".terulet as teruletnev.*.

Hivatkozások segítségével juthat ide a felhasználó.Teljes példa (második rész) 481 24. teruletek és tipusok táblákat.$klub["email"]. akár az esemenyekinfo. 6: $klub = klubLekeres( $kazonosito ).SID ). Mint eddig. 9: if ( $klub["email"] != "" ) 10: $klub["email"] = "<A HREF=\"mailto:$klub[email]\ ">". 3: include("kozosfv.php."</A>".php oldalon végiglépkedünk ezen a tömbön. program klubinfo. program (folytatás) 15: 16: 17: 18: 19: $vissza = array(). Az oldalt az eddig megismert megoldások és függvények segítségével építhetjük fel.php vagy a klubokinfo.php oldalakról is. a klub neve most is egy hivatkozásban szerepel.php?".inc"). } A klubokLekeres() függvény paraméterei függvényében dinamikusan állít elõ egy SQL utasítást.php oldalra mutat.7. 24. $sor ). 4: if ( ! isset($kazonosito) ) 5: header( "Location: klubokinfo. return $vissza. Alapesetben csupán összekapcsolja a klubok. tovább szûkíti az eredménytáblát a WHERE feltételhez adott újabb elemekkel. klubinfo. 24 .6.php 1: <?php 2: include("adatbazis.php A klubinfo. amely a klubinfo.php oldal lehetõséget ad egyetlen klub minden adatának megtekintésére. kiírva a teruletnev és tipusnev értékeket is a böngészõ számára. while ( $sor = mysql_fetch_array( $eredmeny ) ) array_push( $vissza. A klubokinfo.inc"). Ha üres karakterláncon és a "BÁRMELY" karaktersorozaton kívül bármi mást kap a $terulet vagy $tipus paraméterekben. az esemenyinfo. Végül egy kétdimenziós tömbbel tér vissza. amint az alábbi kód mutatja. 7: 8: $klub = html( $klub ).

$sor["teruletnev"]. program (folytatás) 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: function klubEsemenyei () { global $kazonosito. print "<td><b>Terület</b></td>\n"."</td>\n". } print "</table>\n".SID.date("j M Y H. print "<td><b>Esemény</b></td>\n".php?eazonosito="."</td>\n". print "<td>". print "<td><b>Típus</b></td>\n". return."</a></td>\n".inc"). if ( ! $esemenyek ) { print "Nincs megjeleníthetõ esemény<P>". $sor["edatum"]). } print "<table border=1>\n". } ?> <html> <head> <title>Klub részletek</title> </head> <body> <?php include("kozosnav. print "<td><b>Dátum</b></td>\n".i".482 24. $esemenyek = esemenyekLekeres( $kazonosito ).htm l($sor["enev"])."</td>\n". print "<td>".$sor["tipusnev"]. $sor["eazonosito"]. print "</tr>\n". foreach ( $esemenyek as $sor ) { print "<tr>\n"."&". print "<td><a href=\"esemenyinfo. óra 24.7. print "<td>"."\">". ?> <p> <h1>Klub részletek</h1> <h4><?php print $klub["klubnev"] ?></h4> 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: .

12: return mysql_fetch_array( $eredmeny ). a klubLekeres()-t alkalmazzuk.terulet as teruletnev.mysql_error() ). 10: if ( ! $eredmeny ) 11: die ( "klubLekeres hiba: ". teruletek.php oldalra küldjük. 5: $lekeres .azonosito 7: AND klubok. 13: } 24 .inc függvényt. 6: $lekeres . Ez a függvény egy klubazonosítót vár és egy tömböt ad vissza: 24. teruletek. $kapcsolat ). a felhasználót a klubokinfo.tipus as tipusnev ".8. tipusok.terulet=teruletek. hogy tartalmazza.inc fájlból 1: function klubLekeres( $kazonosito ) 2: { 3: global $kapcsolat.azonosito 8: AND klubok. 4: $lekeres = "SELECT klubok. program Részlet az adatbazis.Teljes példa (második rész) 483 24. program (folytatás) 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: <p> Terület: <b><?php print $klub["teruletnev"] ?></b> <br> Típus: <b><?php print $klub["tipusnev"] ?></b> <br> Email: <b><?php print $klub["email"] ?></b> </p> Ismertetõ:<br> <b><?php print $klub["ismerteto"] ?></b> <hr> <?php klubEsemenyei(). 9: $eredmeny = mysql_query( $lekeres. ?> </body> </html> A program egy $azonosito paramétert vár.7.= "FROM klubok.= "klubok.azonosito='$kazonosito'".*. A klub adatainak kiderítésére egy új adatbazis. tipusok WHERE ". amely egy klub azonosítószámát kell. Ha az oldal nem kapott ilyen paramétert.tipus=tipusok. esemenyek.

A klubinfo. felhasználva az esemenyekLekeres() néven korábban létrehozott függvényünket. Az oldalon létrehozunk még egy klubEsemenyei() nevû függvényt is.php az utolsó oldal. tartalmát pedig a HTML törzsrészében írjuk ki a böngészõ számára. teruletek és tipusok táblák összekapcsolásával érhetjük el. Az oldal minden információt megad az $eazonosito segítségével kiválasztott eseményrõl.2. mivel így az eredménytábla a teruletnev és tipusnev elemeket is tartalmazza majd. 24.484 24. . A klubLekeres()által visszaadott tömböt a $klub változóban tároljuk. ábra mutatja.php egy lehetséges kimenetét a 24. Ezt a klubok.2. amit az alkalmazáshoz el kell készítenünk.php kimenete esemenyinfo. óra A klub adatainak megszerzésére a sorLekeres() függvényt is használhattuk volna. Azért készítettünk mégis egy célfüggvényt erre a feladatra. Erre az oldalra bármely eseményinformációkat adó lapról el lehet jutni egy hivatkozás segítségével. ábra A klubinfo.php Az esemenyinfo. amely a klubhoz tartozó események kiírását végzi.

inc"). Ennek segítségével kapjuk meg az adott $eazonosito-hoz tartozó esemény részleteit."&".Teljes példa (második rész) 485 24.inc"). már csak ki kell írnunk azokat a böngészõbe.SID. 16: ?> 17: <P> 18: <h1>Esemény részletei</h1> 19: <h4><?php print $esemeny["enev"] ?></h4> 20: <p> 21: Klub: 22: <b> 23: <?php print "<a href=\"klubinfo. 6: $esemeny = esemenyLekeres( $eazonosito ).php?". 3: include("kozosfv. program esemenyinfo. 4: if ( ! isset($eazonosito) ) 5: header( "Location: esemenyeklista. $esemeny["eklub"]. 8: ?> 9: <html> 10: <head> 11: <title>Esemény részletei</title> 12: </head> 13: <body> 14: <?php 15: include("kozosnav. az adatbazis.php?kazonosito=". 7: html( $esemeny ). Egyetlen új függvénnyel találkozhatunk.inc").SID ).php 1: <?php 2: include("adatbazis.inc állomány esemenyLekeres() függvényével."\"> 24: $esemeny["klubnev"]</a>" 25: ?> 26: </b> 27: <br> 28: Terület: <b><?php print $esemeny["teruletnev"]?></b> 29: <br> 30: Típus: <b><?php print $esemeny["tipusnev"] ?></b> 31: </p> 32: Ismertetõ:<br> 33: <?php print $esemeny["eismerteto"] ?> 34: </body> 35: </html> Az eddigiek után ez az oldal már elég egyszerûnek látszik. Miután ezek egy tömbben rendelkezésre állnak. 24 .9.

5: $lekeres .486 24.tipus as tipusnev ". A munkamenetfüggvények nélkül feltehetõen sokkal több információt kellett volna kérésrõlkérésre átadnunk oldalainknak az URL-ekben. Különösen érdemes megfigyelni. óra Az esemenyLekeres() függvényt a 24.klubnev as klubnev.= "FROM klubok.azonosito=esemenyek. teruletek. 24. 14: } A jövõ Mostanra elkészültünk a teljes rendezvénynaptárral. $kapcsolat ). teruletek. mivel ezek használatával igen egyszerû az adatok megõrzése kérésrõl kérésre . tipusok.eklub 7: AND esemenyek. pontosan azokat a beállításokat fogja találni.mysql_error() ). Remélem sikerült érzékeltetni ezzel a valós életbeli kisalkalmazások dinamikus kialakításának lehetõségeit és a PHP szerteágazó képességeit. példában láthatjuk. mint amelyeket legutóbb otthagyott.= "klubok. amely a klubok és az esemenyek táblákat kapcsolja össze.10.etipus=tipusok. .eazonosito='$eazonosito'". program Részlet az adatbazis.azonosito 8: AND esemenyek. 4: $lekeres = "SELECT klubok. esemenyek.*. 6: $lekeres .inc fájlból 1: function esemenyLekeres( $eazonosito ) 2: { 3: global $kapcsolat.azonosito 9: AND esemenyek. Tulajdonképpen csupán egy egyszerû SQL lekérésbõl áll.php oldalra.terulet as teruletnev. 11: if ( ! $eredmeny ) 12: die ( "esemenyLekeres hiba: ".10. 13: return mysql_fetch_array( $eredmeny ). 10: $eredmeny = mysql_query( $lekeres.eterulet=teruletek.Ha a felhasználónk a munkamenet során késõbb visszatér mondjuk az esemenyekinfo. esemenyek. mennyire megkönnyítik munkánkat a PHP 4 munkameneteket kezelõ függvényei. tipusok WHERE ".

amely alkalmas arra. Majdnem minden programnak. szükségünk lesz egy karbantartó felületre. Végül át kell adnunk a munkát egy grafikus tervezõnek. Ez új dimenziót nyitna az alkalmazás számára. különösképpen egy kulcsszavas keresés. Mielõtt az alkalmazást átnyújtanánk a megbízónak. aki ügyes vezérlõsávot. 24 . komoly grafikát és más elemeket ad az oldalhoz. olyan problémákat oldottunk meg. Egy többoldalas alkalmazás végigvitele egy könyvben nem könnyû dolog.Teljes példa (második rész) Bár az eseménynaptár bizonyos megközelítésbõl teljesnek tekinthetõ. hogy egy technikailag képzetlen adminisztrátor is módosíthasson vagy törölhessen tagokat. hogy programjaink kimenete eléggé spártai. 487 Összefoglalás Ebben és az elõzõ órában elkészítettünk egy teljesen mûködõ többoldalas PHP alkalmazást.és típuskategóriákat megváltoztathassa. amit írunk. Valószínûleg feltûnt már. Az alkalmazás hasznára válna néhány további szolgáltatás. hogy megjegyzéseket fûzhessenek a rendezvényekhez. Gyakoroltuk az állapot mentésének. Akár azt is megoldhatnánk. az adatbázis-adatok módosításának és megjelenítésének módjait és sok más kérdést is érintettünk. a HTML-tõl függetlenül. mindazonáltal csak egy jó prototípus. de megéri a kitartást. igazán érdekes környezetté alakítva azt. Lehetõséget adhatnánk a tagok számára. illetve az eseményeket. ha az eseményeket lemásolhatnák vagy a rendezvények ismétlõdõ jellegét is kezelhetnék. de elképzelhetõ. A tagok feltehetõen örülnének. egynél több felhasználó kéréseit kell majd egyidõben kiszolgálnia. amelyekkel munkánk során idõrõl idõre találkozni fogunk. ahogy haladunk a munkával. hogy szükség lesz ránk is a ciklusok újraírásánál. hogy képekre mutató hivatkozásokat helyezzenek el a klubok ismertetõiben. a felhasználói azonosításnak. Olyan kérdésekre adtunk válaszokat. Kellemes lenne lehetõséget adni a látogatóknak. Szerencsére a legtöbb PHP kód külsõ állományokban található. amit meg tudunk mutatni a megrendelõnek. hogy képeket tölthessenek fel böngészõjük segítségével. valamint a terület. tehát ügyes megoldásokra van szükség az állapotok mentésére.

Elég információt találhatunk ebben a könyvben ahhoz. Lapozzuk át a könyvet és jegyzeteinket. hogy érdemes kis idõ elteltével újra átnézni a jegyzeteket. Találunk olyan megoldásokat. Kvíz 1. óra Kérdések és válaszok Ennyi volt. Melyik függvény használható új elem tömb végére való beszúrásához? 2. Ezzel és a Világhálón elérhetõ rengeteg információval nincs. hogy saját kifinomult alkalmazásainkat el tudjuk készíteni. Hogyan érhetõ el ugyanez a hatás ûrlap készítésekor? Feladatok 1. A válaszokat az A függelékben helyeztük el. .488 24. A SID állandó a munkamenet-azonosító oldalról-oldalra küldéséhez hivatkozások készítésénél használható. hogy minél több hasznunk legyen a befektetett munkából. Hogyan tovább? Ez már nem a könyvön múlik. ha írtunk ilyeneket. Melyik függvény alakítja át az újsor karaktereket <br> elemekké? 5. ami megállíthatna bárkit is a fejlõdésben! Mûhely A mûhelyben kvízkérdések találhatók. Tekintsünk végig az órában tárgyalt forráskódokon. Melyik függvény alkalmazható a különleges karakterek átalakítására HTMLkiírás céljából? 4. Lehetséges egy új elem felvétele a tömb végére függvény használata nélkül is? 3. melyek segítenek megszilárdítani az órában szerzett tudást. Jusson késõbb eszünkbe. amiket fel tudunk használni saját programjainkban? 2.

Sign up to vote on this title
UsefulNot useful