You are on page 1of 101

A PHP nyelv

Ksztette: Rvsz Gyrgy informatikatanri szak


Tmavezet: Ills Zoltn ELTE Informatikai Kar Szakmdszertani Csoport

Pcs, 2004. december 22.

Tartalomjegyzk
1 BEVEZETS...............................................................................................................................................6 1.1 A PHP TRTNETE....................................................................................................................................6 1.2 A PHP ELNYEI........................................................................................................................................7 1.3 A PHP TELEPTSE....................................................................................................................................8 1.4 ELFELTTELEK.........................................................................................................................................9 1.5 LEMEZMELLKLET......................................................................................................................................9 2 ISMERKEDS A PHP-VEL....................................................................................................................10 2.1 A PHP KD RSA...................................................................................................................................12 2.2 MEGJEGYZSEK A PHP KDBAN................................................................................................................14 3 ADATOK...................................................................................................................................................15 3.1 VLTOZK..............................................................................................................................................15 3.2 KONSTANSOK...........................................................................................................................................15 3.3 TPUSOK.................................................................................................................................................15 3.3.1 A vltoz tpusnak vizsglata s mdostsa.............................................................................16 3.4 MVELETEK ADATOKKAL..........................................................................................................................16 3.4.1 Kifejezsek...................................................................................................................................17 3.4.2 Opertorok...................................................................................................................................17 3.4.3 Mveleti sorrend..........................................................................................................................19 4 VEZRLSI SZERKEZETEK...............................................................................................................20 4.1 AZ ELGAZS..........................................................................................................................................20 4.1.1 Az egyg s a ktg elgazs...................................................................................................20 4.1.2 A tbbg elgazs......................................................................................................................21 4.1.3 A ?: opertor...............................................................................................................................23 4.2 A CIKLUS................................................................................................................................................23 4.2.1 A while ciklus...............................................................................................................................23 4.2.2 A do ciklus...................................................................................................................................24 4.2.3 A for ciklus...................................................................................................................................24 4.2.4 A break utasts...........................................................................................................................25 4.2.5 A continue utasts.......................................................................................................................26 5 FGGVNYEK........................................................................................................................................27 5.1 FGGVNYEK LTREHOZSA, AZ RTK SZERINTI PARAMTERTADS...............................................................27 5.2 RTKEK VISSZAADSA.............................................................................................................................28 5.3 CM SZERINTI PARAMTERTADS...............................................................................................................28 5.4 VLTOZ SZM PARAMTEREK.................................................................................................................29 5.5 ELHAGYHAT PARAMTER.........................................................................................................................30 5.6 HATKR...............................................................................................................................................30 5.7 STATIKUS VLTOZK................................................................................................................................31 5.8 MATEMATIKAI FGGVNYEK......................................................................................................................31 5.9 DTUM- S IDFGGVNYEK......................................................................................................................32 5.10 SZTRINGFGGVNYEK.............................................................................................................................33 6 TMBK S OBJEKTUMOK...............................................................................................................37 6.1 TMBK.................................................................................................................................................37 6.1.1 Tmbk ltrehozsa.....................................................................................................................37 6.1.2 Asszociatv tmbk......................................................................................................................38 6.1.3 Tbbdimenzis tmbk................................................................................................................38 6.1.4 A tmbmutat...............................................................................................................................39 6.1.5 Tmbk bejrsa.........................................................................................................................39 6.1.6 Mveletek tmbkkel...................................................................................................................41 6.1.7 Tmbk rendezse........................................................................................................................42 6.2 OBJEKTUMOK...........................................................................................................................................43 6.2.1 Osztlyok s objektumok ltrehozsa..........................................................................................44

6.2.2 Adattagok (tulajdonsgok)..........................................................................................................45 6.2.3 Tagfggvnyek (metdusok)........................................................................................................45 6.2.4 Konstruktor..................................................................................................................................46 6.2.5 rkls.........................................................................................................................................47 6.2.6 Sokalaksg.................................................................................................................................48 6.2.7 Objektumfggvnyek....................................................................................................................50 7 RLAPOK.................................................................................................................................................52 7.1 GLOBLIS S KRNYEZETI VLTOZK..........................................................................................................52 7.2 RLAP LTREHOZSA................................................................................................................................53 7.3 RLAPELEMEK HASZNLATA......................................................................................................................55 7.4 RLAP S PHP KD EGY OLDALON............................................................................................................58 8 FJLOK S KNYVTRAK.................................................................................................................60 8.1 KNYVTRAK..........................................................................................................................................60 8.1.1 Knyvtrak listzsa....................................................................................................................60 8.1.2 Egyb knyvtrfggvnyek..........................................................................................................61 8.2 FJLOK...................................................................................................................................................61 8.2.1 Fjlok begyazsa.......................................................................................................................61 8.2.2 Fjlok listzsa attribtumokkal egytt......................................................................................61 8.2.3 Fjlok ltrehozsa s trlse.......................................................................................................62 8.2.4 Fjlok olvassa............................................................................................................................62 8.2.5 Fjlok rsa..................................................................................................................................63 8.2.6 Fjlok feltltse...........................................................................................................................64 9 ADATBZISOK: MYSQL......................................................................................................................66 9.1 MYSQL ADATTPUSOK.............................................................................................................................66 9.2 KAPCSOLDS A KISZOLGLHOZ...............................................................................................................67 9.3 ADATBZISOK KIVLASZTSA, LISTZSA....................................................................................................67 9.4 ADATBZISOK TBLINAK LISTZSA..........................................................................................................68 9.5 TBLK MEZINEK LISTZSA....................................................................................................................69 9.6 TBLK ADATAINAK MEGJELENTSE...........................................................................................................69 9.7 ADATBZIS LTREHOZSA S TRLSE.........................................................................................................70 9.8 TBLA LTREHOZSA S TRLSE...............................................................................................................70 9.9 ADATOK BESZRSA.................................................................................................................................71 9.10 ADATOK LEKRDEZSE............................................................................................................................71 9.11 ADATOK FRISSTSE................................................................................................................................72 9.12 ADATOK TRLSE...................................................................................................................................73 9.13 PLDA: A HREK MODUL..........................................................................................................................73 10 KPEK.....................................................................................................................................................77 10.1 KPEK LISTZSA...................................................................................................................................77 10.2 KPEK LTREHOZSA..............................................................................................................................78 10.3 KPEK VLTOZTATSA............................................................................................................................80 11 SESSION-K...........................................................................................................................................83 11.1 PHP-SZOLGLTATSOK..........................................................................................................................83 11.2 SESSION-FGGVNYEK.............................................................................................................................84 11.3 SESSION INDTSA..................................................................................................................................85 11.4 VLTOZK REGISZTRLSA......................................................................................................................85 11.5 A REGISZTRLT VLTOZK S A SESSION MEGSZNTETSE............................................................................86 11.6 SESSION-FGGVNYEK HASZNLATA..........................................................................................................86 11.7 PLDA: A FRUM MODUL.........................................................................................................................87 12 BIZTONSG...........................................................................................................................................95 12.1 CGI FUTTATHAT LLOMNYKNT TELEPTETT PHP..................................................................................95 12.2 APACHE MODULKNT TELEPTETT PHP......................................................................................................96 12.3 FJLRENDSZER.......................................................................................................................................97 12.4 ADATBZIS...........................................................................................................................................97 12.5 FELHASZNLTL RKEZ ADATOK...........................................................................................................98

12.6 HIBAKEZELS.........................................................................................................................................99 12.7 GLOBLISAN ELRHET VLTOZK............................................................................................................99 12.8 A PHP ELREJTSE...............................................................................................................................100 12.9 FRISSTSEK.........................................................................................................................................100 IRODALOMJEGYZK...........................................................................................................................101

1 Bevezets
A Vilghl kezdetben nem volt tbb egyszer adatnl, a HTML (HyperText Markup Language) els vltozata mg azt sem tette lehetv, hogy kpeket helyezznk el weboldalunkon. Mra azonban hatalmas vltozsokon ment keresztl, rengeteg szolgltatst tartalmaz: kpeket, hangokat, mozgkpeket, s mindezek mellett szrakoztat, tant s kapcsolatot tart. A Web fejldsvel prhuzamosan fejldtek az eszkzk is, az egyszer lernyelvhez valdi programozsi nyelvek csatlakoztak. A statikus weboldalak igen fontos szerepet tltttek be a WWW szolgltatsaiban az Internet hskorban. Ma azonban nagyon sok olyan feladat ltezik, melyeket nem lehet, vagy nem clszer statikus oldallal megoldani. A cgek adataikat tbbnyire adatbzisokban troljk. Ezekbl az adatbzisokbl le lehet ugyan kpezni az adatokat klnbz eljrsokkal statikus oldalakra, azonban ez tbb olyan problmt is felvet, mely az informci kzzttelnek ezen mdjt kizrja a lehetsges megoldsok kzl. Vannak olyan feladatok, melyek ugyancsak szksgess teszik a szerver-oldali programfuttatst, ilyen lehet pldul egy egyszer letlts-szmll az adott oldalon, de lehet pldul egy Internetes portl friss hrek rovata, mely igen gyakran frissl. A dinamikus weboldal egyik vltozata, mely kliens-oldali programok (client-side scripts) segtsgvel kommunikl a felhasznlval. Ma a feladatok igen szles skljt tudjuk a kliens oldalon elvgezni, kezdve a legegyszerbb krdv adatainak ellenrzstl, a kln csatornn lebonyoltott titkostott banki tranzakci kezelsig. A legelterjedtebb kliens-oldali szkript nyelvek a JavaScript s a VBScript. A kliens oldali programozsnak azonban van nhny htultje: a lasssg s a bngszfggsg. A felhasznlk gyors, knnyen tlthat, knnyen kezelhet, stabilan mkd oldalakat szeretnek hasznlni. Nhny ve a hangsly ezrt ismt a szerveroldali megoldsokra tereldtt. A CGI (Common Gateway Interface) szabvny lehetv teszi ms programok futtatst s a kimenetek szvegbe, hangba vagy videba sszegezve a kliensre juttatst. Szabvnyos felletet biztostva a CGI lehetv teszi a programozk szmra programozsi nyelvek szles spektrumnak hasznlatt. CGI programok dolgozhatjk fel a kliens ltal kitlttt rlapokat, szmllhatjk az oldalt ltogat felhasznlkat, adatokat kezelhetnek adatbzisokban s tbb szz egyb feladatot oldhatnak meg. A szerver-oldali programozshoz sorolhat: a Perl (Practical Extraction and Report Language), a Python, a PHP, az ASP (Active Server Pages), a JSP (Java Server Pages).

1.1 A PHP trtnete


A PHP els vltozatt - mely egy makrkszlet volt - Rasmus Lerdorf ksztette 1994-ben. Ezeket a segt eszkzket egyttesen a Personal Home Page Tools nvvel illette. Ksbb egy friss elem kerlt a csomagba, a Form Interpreter (rlapfeldolgoz), gy PHP/FI nven vlt ismertebb. A felhasznlk szemszgbl a PHP/FI nagyon hasznos segdeszkz volt, tbb fejleszt is felfigyelt r, gy 1997-re mr szmos programoz dolgozott rajta. Az gy elkszlt PHP3-as mr egy csapat egyttmkdsbl szletett. A PHP3-as azonban mg elg lass volt ahhoz, hogy mentsgl szolgljon a Perl-hz rt programozknak, mirt nem vltottak. Az 1990-es vek vgn a Web-szerver nyelvek nagy fejldsen mentek t. A Perl-t s az els PHP-t mivel HTML oldalak voltak soronknt rtelmeztk. A fejlesztk ksbb olyan rendszereket vlasztottak, amelyek memriba fordtottak. A nylt forrskd fejlesztseknek ksznheten megjelent PHP4 s a PHP3 kztti risi teljestmnyklnbsg az rtelmezsrl a fordtsra val ttrsnek ksznhet. A PHP4 egy olyan nylt forrskd

nyelv az j webfejlesztk szmra, amely folyamatosan vltja fel a Perl-hz hasonl rgebbi nyelveket. Ma a PHP - hivatalosan a PHP: Hypertext Preprocessor elnevezst hasznlja - egy szles krben hasznlt, nylt forrskd, ltalnos cl programozsi nyelv, klnsen j webfejleszts tmogatssal s HTML-be gyazsi kpessgekkel. A szintakszisa a C, Java s Perl nyelvekre pl, knnyen megtanulhat. A nyelv f clja lehetsget teremteni dinamikusan generlt weboldalak gyors ksztsre, de a PHP ennl sokkal tbbre is kpes. A PHP fleg szerver-oldali szkriptek rsra kszlt, azaz brmire kpes, amire ms CGI programok, ilyen funkcik pldul az rlap adatok feldolgozsa, dinamikus tartalom generlsa, vagy stik kldse s fogadsa.

1.2 A PHP elnyei


Egyrtelm, hogy a PHP az egyetlen igazi nyelv, de vannak akiket csak a tnyek gyznek meg, a tnyek pedig azt mutatjk, hogy napjaink weboldalaihoz a PHP a megfelel szkript nyelv. Tapasztalataim alapjn lltom, hogy a PHP-t knnyebb tantani, mint az olyan keverknyelveket, mint a Visual Basic vagy az IIS. (MOULDING, 2002, 5. old.) Fejlesztsi sebessg Mivel a PHP lehetsget ad a HTML elemek s a programkdok elklntsre, az alkalmazsok fejlesztsekor lehetsg van elvlasztani a kdolsi, tervezsi, s sszelltsi szakaszt. Ez jelentsen megknnyti a programozk lett azzal, hogy elmozdtja az akadlyokat a hatkony s rugalmas alkalmazsok kialaktsnak tjbl. Nylt forrskd A PHP mint nylt forrskd termk j tmogatssal rendelkezik, radsul a PHP az elterjedtebb opercis rendszerek brmelyikn kpes futni, a legtbb kiszolglprogrammal egyttmkdve. Felvehetjk a kapcsolatot a knnyen elrhet s elktelezett felhasznli kzssggel, ahol szmos nagy tapasztalattal rendelkez embert tallunk. Nagy az esly r, hogy brmilyen problmval is kerljnk szembe, kis keresgls utn vlaszt kapunk r, ha mgsem, egy levelezlistra kldtt zenetre ltalban hamar rkezik a megfelel vlasz. A feldolgozprogram hibinak javtsa nem sokkal felfedezsk utn megtrtnik, s a felmerlt j ignyeket kielgt szolgltatsok is hamar beplnek a nyelvbe. Nem kell vrni a kvetkez hivatalos kiadsra, hogy a fejlesztsek elnyeit lvezzk. Nincs a PHP mkdtetshez egyedileg kivlasztott kiszolgl vagy opercis rendszer. Szabadon vlaszthatunk olyan rendszert, amely kielgti sajt vagy gyfeleink ignyeit, kdunk tovbbra is futtathat lesz, brmi mellett is dntnk. Teljestmny A hatkony Zend Engine-nek (a Zend Engine a PHP modulok mgtt tallhat, a programokat futtat mag elnevezse) ksznheten a PHP4-es a mrsek szerint messze maga mgtt hagyja legtbb versenytrst. Hordozhatsg A PHP-t alapveten gy terveztk, hogy alkalmas legyen szmos opercis rendszeren val hasznlatra, egyttmkdve klnbz kiszolglkkal s adatbzis-kezelkkel. Fejleszthetnk UNIX rendszerre s ttrhetnk NT alapokra minden problma nlkl. A PHP alkalmazsokat kiprblhatjuk Personal Web Serverrel, s ksbb telepthetjk azokat egy UNIX rendszerre, ahol a PHP-t Apache modulknt hasznljuk.

1.3 A PHP teleptse


A PHP nem mkdik 16 bites krnyezetben, mint pldul a Windows 3.1, s a PHPhez Web-szerver szksges. Ha nincs Web-szerver teleptve szmtgpnkn, akkor elszr el kell dntennk, hogy milyen szervert fogunk telepteni, vagy van egy egyszer lehetsg: az AppServ teleptse, amely a PHP mellett minden szksges programot tartalmaz. Ez az ingyenes programcsomag Windows s UNIX rendszereken is telepthet, letlthet a http://www.appservnetwork.com cmrl. Jelenlegi verziszma a 2.5.1, s a kvetkez modulokat tartalmazza: Apache Web Server 1.3.31 PHP Script Language 5.0.1 MySQL Database 4.0.20 Zend Optimizer 2.5.3 phpMyAdmin Database Manager 2.6.0-rc1 Perl 5.8.4

Gyakorlatilag minden szksges modult tartalmaz, az Apache-rl pedig sokan gy vlekednek, hogy a legjobb Web-szerver. Ha mgsem az AppServ mellett dntennk, akkor rdemes az albbi Web-szerverek kzl vlasztani: Personal Web Server (friss verzi javasolt) Apache 1.3.x Internet Information Server 5 Omni HTTPd 2.0b1 vagy jabb Oreilly Website Pro Xitami Netscape Enterprise Server, iPlanet

Elszr a vlasztott szervert kell telepteni, s ellenrizni, hogy jl mkdik-e. Szmos adatbzis - Adabas D, InterBase, Solid, dBASE, mSQL, Sybase, Empress, Microsoft SQL, MySQL, Velocis, FilePro, Oracle, UNIX dbm, Informix s PostgreSQL kzvetlenl csatlakoztathat a PHP-hez (mi a MySQL-lel fogunk dolgozni). A MySQL adatbzisrendszer a http://www.mysql.com cmrl tlthet le. Szmos opercis rendszerre elrhet, belertve a UNIX, Windows s OS/2 rendszereket. A MySQL magyar tkrkiszolglja a http://mysql.sote.hu. A PHP teleptprogram ingyenesen letlthet a http://www.php.net cmrl. Magyarorszgon a http://hu.php.net tkrkiszolglt rdemes ltogatni. A PHP webhelye kivl informciforrs PHP programozknak. A http://www.php.net/manual cmen a teljes kziknyv elolvashat, kiegsztve ms programozk ltal rt hasznos megjegyzsekkel. Ezen a cmen olvashat a magyar PHP kziknyv is. A PHP honlaprl a dokumentci is letlthet klnbz formtumokban. A Zend Engine s ms Zend termkek honlapja a http://www.zend.com. Itt hreket, illetve cikkeket olvashatunk a PHP s a Zend vilgbl. Az InstallShield teleptprogrammal nagyon knny letre kelteni a PHP-t, de ez nagyon sok szempontbl korltozott vltozat, pldul a kiterjesztsek automatikus teleptst nem vgzi el. Telept futtatsa utn ktfle telepts kzl lehet vlasztani - a standard 8

telepts jl hasznlhat alapbelltsokat ad, az advanced krdseket tesz fel. A telepts varzslja elg informcit gyjt ahhoz, hogy elvgezhesse a php.ini fjl belltst, s konfigurlja a szervert a PHP szmra. IIS esetn, vagy NT Workstation alatt PWS hasznlatakor az sszes ponton fellelhet script map belltst megmutatja, s kivlaszthat, hogy mely pontokra kerljn be a PHP tmogats. Lehetsg van a PHP-t az eredeti forrsbl fordtani Windows rendszerben is, ha van Microsoft Visual Studio teleptve a szmtgpen. Ha brhol elakadnnk a teleptsben, vagy tovbbi informcikra lenne szksgnk, akkor ltogassunk el a kvetkez cmre: http://php.benscom.com.

1.4 Elfelttelek
Ez a munka az alapoktl indulva prblja bemutatni a PHP4-es programozsi nyelv azon elemeit, melyek nlklzhetetlenek egy dinamikus weblap ksztsekor. A megrtshez szksges programozsi ismeretek az alapfogalmakon nem mutatnak tl, de ha a C vagy a Perl nyelvekkel mr dolgoztunk korbban, egyes fejezeteknl knnyebben, gyorsabban haladhatunk. A kilencedik fejezet a PHP s a MySQL kapcsolatval foglalkozik, m az adatbziskezels alapjait nem tartalmazza, gy annak megrtse elismeretek nlkl nehzkes. A PHP webes programozsi nyelv, ezrt alapvet ismerettel rendelkezni kell a Vilghlval s a HTML-lel kapcsolatban is.

1.5 Lemezmellklet
Ehhez a munkhoz tartozik egy lemezmellklet, melyen megtallhat az sszes bemutatott PHP-program fejezetenknt kln knyvtrakban. A CD-n tovbb megtallhat a PHP, az Apache, a MySQL, s az AppServ jelenleg legfrissebb vltozata, valamint a teljes PHP dokumentci klnbz formtumokban.

2 Ismerkeds a PHP-vel
A PHP egy szerver-oldali szkript nyelv. A vlaszlap formtumt ler utastsok egy HTML dokumentumba gyazva helyezkednek el. A Web-szerver a meghvott dokumentum URL-jbl ismeri fel, hogy a krst a PHP szervernek kell feldolgoznia. A minta dokumentum HTML utastsai vltoztats nlkl tkerlnek a vlaszlapra, a PHP specifikus elemeket a PHP vgrehajtja, s a generlt vlasz kerl be az eredmnylapra. Ugyan a PHP ler nyelve nem adatbzis orientlt, hanem a C ltalnos programozsi nyelvre pl, mgis tartalmaz adatbzis kapcsoldsi kiegszt modult, amely lehetv teszi, hogy elrhessk, s a vlaszlapon megjelenthessk a legklnbzbb adatbzisokban trolt adatokat is. A PHP rendszer mkdsi struktrja az albbi elemekbl pl fel: Web-szerver PHP-szerver Minta dokumentum Web-szerver PHP-szerver Adatbzisszerver

Browser URL

A fenti struktra alapjn a PHP krsek feldolgozsa az albbi lpsekben fut le: 1. Az olvasott lapon kiadnak egy hiperlink kapcsoldst egy olyan URL-re, mely mgtt PHP hvs rejlik. Egy ilyen cm lehet pldul a kvetkez:
http://babits.pte.hu/php/index.php

illetve a hivatkozst ms esetekben a


http://babits.pte.hu/index.php

formban is megadhatjuk. A hivatkozsokban az URL els rsze jelli ki, hogy mely gpen tallhat a Webszerver s a PHP szerver. Az els mintban a /php/ rsz egy virtulis knyvtr, mely jelzi a Web-szervernek, hogy itt egy PHP dokumentumot kell kezelni, s meg kell majd hvni a PHP szervert. A virtulis tvonal kijellsnek menete Webszerver specifikus, rendszerint a Web-szerver konfigurcis llomnyt kell mdostani a virtulis tvonal kijellshez. A msodik mintban a nem kellett virtulis knyvtr ahhoz, hogy a Web-szerver tudja, hogy a PHP szervert kel meghvnia. Ebben az esetben ugyanis a dokumentum kiterjesztse utal arra, hogy a dokumentumot a PHP fogja kezelni. A kiterjesztsek s a kezel programok sszerendelse is a Web-szerver konfigurcis llomnyban trtnik. Az URL utols tagja, pldnkban az index.php rsz a sma dokumentumot jelli ki, mely megadja a vlaszlap ellltsnak mdjt. 10

2. A Web-szerver rzkeli, hogy a meghvott URL a PHP szerverhez kapcsoldik, ezrt meghvja a PHP modult vgrehajtsra. A PHP szerver ktfle mdban is mkdhet: CGI s API mdban. Az els lehetsg esetn minden oldal lekrsekor s feldolgozsakor egy j pldny fut le a PHP feldolgozbl. Mivel a szkript futtatsa utn egy ilyen pldny lell, minden erforrs, amit lefoglalt, megsznik. A npszerbb a msodik forma, amikor a PHP-t modulknt futtatjuk egy tbb process-es Web-szerveren. Egy tbb process-es Web-szerver tipikusan rendelkezik egy szl process-el, ami koordinlja a tbbi kapcsold process (a gyermekek) munkjt, amik valjban a weboldalak kiszolglst vgzik. Ha egy krs rkezik egy klienstl, egy ppen szabad gyermekprocess kapja meg a kiszolglsra az utastst. 3. A PHP modul megkapja a vgrehajtsi feladatot a feldolgozand sma dokumentum azonostjval egytt, tolvassa s elemzi a sma dokumentumot. A PHP specifikus utastsokat rtelmezi s vgrehajtja. 4. Ha adatbzis hozzfrsi ignyek is felmerltek a PHP specifikus utastsok kztt, akkor a PHP szerver kapcsolatba lp az adatbzis-kezelvel, s vgrehajtja a kijellt mveletsort. A PHP specifikus utastsok kztt megtallhatok azon elemek is melyekkel lerhat, hogyan jelenjenek meg az eredmnyadatok a vlaszdokumentumban. 5. A generlt vlaszlap a HTML utastsok s a dinamikus elemekbl felplve, tkerl a Web-szerverre, majd onnan eljut az t ignyl bngszhz. A PHP szerver is egy tbbrteg, tbb komponensbl ll rendszer. A rendszer elvi felptsi vzt mutatja be a kvetkez bra:

Web-szerver

SAPI PHP Core PHP szerver Zend Core Extension API Extension (pl. MySQL)

Sma lers

11

Az SAPI (Szerver Absztrakcis Rteg) a klnbz Web-szerverekhez trtn kapcsoldst oldja meg egy egysges felletet kpezve a felette elhelyezked rtegek szmra. Jelenleg tmogatott felletek: Apache, Roxen, Java (servlet), ISAPI, AOLserver s CGI. A Zend Core modul nyelvi parser szerepet tlt be a rendszerben. Az egyes kiterjesztsek (extension) teszik lehetv a klnbz adatbzis forrsok elrst.

2.1 A PHP kd rsa


A PHP specifikus utastsok a HTML utastsok kz beillesztve, begyazva foglalnak helyet. A HTML utastsoktl val egyrtelm s knnyen kezelhet sztvlaszts rdekben az egyes PHP specifikus utastsokat keretbe foglaljuk. Az elhatrols az albbi vltozatok valamelyikvel lehetsges: <?php PHP elemek ?> <script language="php"> PHP elemek </script> <? PHP elemek ?> <% PHP elemek %> - hagyomnyos - szkript stlus - rvid - ASP stlus

A fenti kezd- ill. zrelemek kzl az utols kett hasznlatt a php.ini fjlban engedlyezni kell a short_open_tag=on ill. a asp_tags=on belltsokkal. ppen emiatt clszer az elst vagy a msodikat hasznlni. A PHP elemek a C nyelvi kifejezsekhez hasonl formtumot ltenek. Egy tagolt rsz tbb elemi PHP kifejezst, utastst is tartalmazhat. Ekkor az egyes PHP utastsokat pontosvesszvel hatroljuk el egymstl: <?php PHP utasts1; PHP utasts2; ?> A fenti pldbl is lthat, hogy a tagolsi rsz s a PHP elemi utasts is tbb forrssoron keresztl is folytatdhat, a sorvgjel nem jelent utasts hatrt. Mivel a HTML fjlok egyszer szveges fjlok, brmilyen szvegszerkeszt segtsgvel rhatjuk a PHP kdokat is. A HTML-szerkesztk ltalban viszont nyjtanak valamilyen klnleges tmogatst PHP-szerkesztshez is, ilyenek pldul a kdsznezs, a kifejezsszerkeszt vagy a tesztel. Nzznk is rgtn egy PHP kdot!
01: <?php 02: print("Hello, World!"); 03: ?>

Az vek sorn hagyomnny vlt, hogy a programozsi nyelvek megismerst e program bemutatsval kezdik. A sorok elejn tallhat szmozs s a kettspont nem a kd rsze, ezek csak a kdhoz tartoz magyarzatok megknnytse miatt kerltek oda. Ez a kd nem tartalmaz HTML tag-eket, mgis mkdkpes. Gpeljk be a kdot s mentsk el a fjlt hello.php nven! Most mr csak annyi dolgunk van, hogy a szerveren elhelyezzk a fjlt. Ha otthoni szmtgpnkn dolgozunk, akkor meg kell keresni azt a knyvtrat, ami a localhost-hoz tartozik, s oda be kell msolni (az AppServ esetben ez 12

a www nev knyvtr), egybknt pedig FTP segtsgvel fel kell tltennk egy msik szmtgpre. Ha minden rendben ment, akkor elrhetjk fjlunkat egy bngsz segtsgvel, s a kvetkez eredmnyt kapjuk:

Ha a PHP-t nem sikerlt telepteni a kiszolglra vagy nem a megfelel kiterjesztst hasznltuk, felteheten nem az elz brn lthat kimenetet kapjuk. Ebben az esetben ltalban a PHP program forrskdjt ltjuk viszont. Elemezzk ki a kdot! Az els s a harmadik sorban tallhat nyit- ill. zrelemeken kvl egyetlen egy j dolgot tallunk. A print() parancs kirja a bngszbe a neki tadott adatokat. Az adat jelen esetben egy szveg (a szveget vagy ms nven a karakterlncot mindig egyes vagy ketts idzjelek kz kell tenni), mely az utasts vgrehajtsakor a bngszbe kirdik. A print() igazsg szerint egy fggvny. A fggvnyek olyan parancsok, amelyek valamilyen mveletet vgeznek ltalban a nekik tadott adatokkal. A fggvnyeknek tadott adatokat majdnem mindig zrjelek kz kell tennnk a fggvny neve utn. Ebbl a szempontbl a print() kivteles, mert a zrjelprja elhagyhat. A print() helyett hasznlhat az echo() fggvny is, melyek segtsgvel a HTML tag-eket is kirathatjuk, pldul a print("<br>"); egyenrtk a <br> tag HTML kdbeli elhelyezsvel. Fggvnyekrl rszletesen az tdik fejezetben lesz sz. Ksztsk el az elbbi kd HTML tag-eket tartalmaz vltozatt!
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: <html> <head> <title>Hello</title> </head> <body> <?php print("Hello, World!"); ?> </body> </html>

Egy dokumentumban a HTML elemek kz tetszleges szm PHP kdblokk rhat, s ezek egyttesen alkotnak egy programot. Brmi, amit egy megelz blokkban hatroztunk meg (vltozk, fggvnyek vagy osztlyok), a dokumentumon bell elrhet lesz a ksbbi blokkokban is. PHP blokk nem csak a <body> s </body> tag-ek kztt helyezhet el (br ebben a munkban mindig a dokumentum trzsrszben lesz a kd), hanem hasznlhatjuk a PHP-t pldul dinamikus oldalcm generlsra is, ha a <title> s </title> tag-ek kz helyezzk el a kdot. A kvetkezkben a HTML tag-eket csak a fontos helyeken hagyjuk meg a kd rvidthetsge rdekben. 13

2.2 Megjegyzsek a PHP kdban


A PHP utastsok kz elhelyezhet megjegyzseknek is tbbfle szintaktikja van: // szoveg : ekkor a megjegyzs kezdettl az aktulis sor vgig terjed rsz lesz a megjegyzs rsz, a kzrefogott szveg nem kerl rtelmezsre a PHP szerver ltal. # szoveg : ugyanolyan rtelmezs, mint az elz formtum. /* szoveg */ : ekkor tbb sorra is kiterjedhet a megjegyzs rsz. A ksbbiekben rendszeresen megjegyzsek tallhatk majd a pldaprogramokban magyarzat cljbl.

14

3 Adatok
Az adat a program alapvet alkoteleme. A PHP-ben az adatokat definilhatjuk szvegknt (karakterlnc vagy sztring), egszknt, lebegpontos szmknt, logikai rtkknt, s a tpusok sszetett keverkeknt.

3.1 Vltozk
$a="alma";

A $a egy vltoz, mely az alma szveget tartalmazza, rtkt brmikor megvltoztathatjuk. A konstansok rtkt s a vltozk rtelmezsi tartomnyt viszont nem lehet megvltoztatni. A vltozkra a kvetkez felttelek teljeslnek: - A vltozk azonostja mindig a $ (dollr) jellel kezddik, az azonost pedig betket, szmokat, s az _ jelet tartalmazhatja, kiktve, hogy szmmal nem kezddhet. - A felvett rtk szabja meg a vltoz tpust. A vltozk meghatrozott tpusak lehetnek, pldul egsz vagy sztring, a PHP azonban szksg esetn tkonvertlja a vltozt ms tpusv.
$s="0";

A $s, amely a 0 (nulla) szveget (karaktert) tartalmazza, automatikusan tkonvertlhat ress vagy hamiss. A vltozk nagysga/hosszsga korltozott, de a sztringek majdnem korltlan hosszak lehetnek (csak a memria korltoz). A hinyz vltozkat a PHP automatikusan ltrehozza:
$szam=4; print($szma);

Az elgpelsnek nem hibazenet az eredmnye. A PHP ugyanis ltrehozza a $szma vltozt, a print() fggvny pedig egy res vagy tartalom nlkli vltozt kap, aminek hatsra a bngszben nem jelenik meg semmi. Az isset() fggvny ellenrzi, hogy a vltoz ltezik -e, s logikai rtket szolgltat vissza, mg az unset() fggvny eltvoltja a vltozt. A ksbbi fejezetekben lthatunk majd pldt e kt fggvny hasznlatra.

3.2 Konstansok
define("a","alma");

A define parancs az els paramterknt megadott nvvel ltrehozza a konstanst, s a msodik paramterknt megadott rtket rendeli hozz. A define parancs brhol hasznlhat, a definilt konstansok pedig globlis hatkrek, azaz mindenhol, gy a fggvnyek belsejben is elrhetk.

3.3 Tpusok
Az elbbiekben mr eset sz arrl, hogy milyen tpusok lteznek a PHP-ben. Most ezek rszletesebb lersa kvetkezik:

15

Tpus integer double string boolean array object

Lers egsz szm lebegpontos szm (vals szm) szveg vagy karakterlnc logikai (rtke igaz/true vagy hamis/false) tmb objektum

Plda
12 9.967 "Hello" true

hatodik fejezet hatodik fejezet

3.3.1 A vltoz tpusnak vizsglata s mdostsa


A vltoz tpusnak meghatrozsra a PHP gettype() fggvnyt hasznlhatjuk. Ha a fggvnyhvs zrjelei kz vltozt tesznk, a gettype() egy karakterlnccal tr vissza, amely a vltoz tpust adja meg. A vltoz tpusnak mdostsra a PHP a settype() fggvnyt biztostja. A settype()-ot gy kell hasznlnunk, hogy a megvltoztatand tpus vltozt, valamint a vltoz j tpust a zrjelek kz kell tennnk, vesszvel elvlasztva.
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: <?php $proba=3.14; print "A(z) '$proba' tpusa: "; print gettype($proba); //kirja, hogy double print "<br>"; settype($proba,"string"); //karakterlncc alaktja print "A(z) '$proba' tpusa: "; print gettype($proba); //kirja, hogy string print "<br>"; settype($proba,"integer"); //egssz alaktja print "A(z) '$proba' tpusa: "; //kirja, hogy A(z) '3' tpusa: print gettype($proba); //kirja, hogy integer print "<br>"; settype($proba,"boolean"); //logikai tpusv alaktja print "A(z) '$proba' tpusa: "; //kirja, hogy A(z) '1' tpusa: print gettype($proba); //kirja, hogy boolean ?>

Azok, akik mr hasznltk a C programozsi nyelvet, nyugodtan alkalmazhatjk e nyelvben megismert tpustalaktst:
$proba=(string)$proba;

Ez a sor egyenrtk a settype($proba,"string"); sorral. Fggvnyek formjban lteznek olyan tpuslekrdez parancsok, melyek paramterknt megadva a vltoz nevt, logikai rtkkel trnek vissza, ilyenek pldul: is_array(), is_bool(), is_double(), is_numeric(), is_string(), is_object().

3.4 Mveletek adatokkal


A PHP rengeteg kifejezst, opertort, fggvnyt, osztlyt knl, tovbb tbbfle lehetsget nyjt az adatok kezelsre mind az adatbzisok, mind pedig a HTML fel.

16

3.4.1 Kifejezsek
A PHP-ben minden kifejezs. A $kor=29; utasts hrom kifejezst tartalmaz. Egyszer a $kor vltozt, a 29-et, s magt az egsz utastst. A kifejezs a fggvnyek, rtkek s opertorok (mveletjelek) olyan egyttese, amely rtket hatroz meg. ltalnossgban azt mondhatjuk, hogy ha rtkknt hasznlhatunk valamit, akkor az kifejezs.

3.4.2 Opertorok
Az opertor (mveletjel) jel vagy jelsorozat, amelyet ha rtkek sszekapcsolsra hasznlunk, valamilyen mveletet vgezhetnk, amely ltalban j rtket eredmnyez. Az operandus egy rtk, amelyet a mveletjellel kapcsolatban hasznlunk. Egy mveletjelhez ltalban kt operandus tartozik. (ZANDSTRA, 2000, 47. old.) Hozzrendel opertor: = A $kor=29; utasts a baloldali vltozhoz a jobb oldal rtkt rendeli. Egy utastsban tbb hozzrendel opertort is hasznlhatunk: $szam=$kor=29; sszehasonlt opertorok: == != === !== < > <= >= Az sszehasonlt opertorok kt rtket hasonltanak ssze, s hibkhoz vezethetnek a PHP automatikus tpuskonverzija miatt. A hamis logikai rtk s a 0 megklnbztetsre alkalmasak a === vagy a !== opertorok, ugyanis a == ezen rtkeknl nem a vrt eredmnyt adja. Opertor == != === !=== < > <= >= Jelents egyenl rtk nem egyenl rtk egyenl rtk s egyez tpus nem egyenl rtk vagy nem egyez tpus kisebb nagyobb kisebb vagy egyenl nagyobb vagy egyenl Igaz
4==4 3!=4 0===0 0!==false 3<4 5>4 4<=4 9>=3

Hamis
3==4 4!=4 0===false 0!==0 6<4 5>7 5<=4 6>=8

Aritmetikai opertorok: + - * / % A + sszeadshoz, a - kivonshoz, a * szorzshoz, a / osztshoz hasznlhat, a % pedig az oszts maradkt adja. A maradkos osztst kt lebegpontos szmmal is elvgzi gy, hogy elhagyja a tizedesjegyeket. A maradkos oszts eredmnye mindig egsz. Az aritmetikai mveleteket az opercis rendszer a szmtgp hardvervel vgezteti el, gy ezek pontossga egyrszt a hardvertl fgg, msrszt attl, hogy az opercis rendszer hogyan kezeli a hardvertl kapott eredmnyt. Sztringopertorok: . .= Kt sztring sszefzshez hasznlhat a . opertor, mg egy sztring vghez egy msikat a .= opertorral lehet csatolni.
$szin="piros"." "."kk"; $szin.=" lila"; //$szin="piros kk" //$szin="piros kk lila"

17

Nvel/cskkent opertorok: ++ -A ++ s -- opertorok egyarnt rhatk vltozk el s mg. A klnbsg az, hogy ha pldul a $szam vltoz rtke 7, s kiadjuk a print(++$szam); parancsot, akkor a $szam vltoz elbb felveszi a 8 rtket, majd ez megjelenik a bngszben, ha pedig a print($szam++); parancsot adjuk ki, akkor elbb kirdik a 7, s utna nveldik meg a vltoz tartalma eggyel. Ez teljesen hasonlan mkdik a -- opertor esetben, csak a vltoz tartalma eggyel cskkeni fog. Egyb hozzrendel opertorok: += -= *= /= %= Ezek szintn az egyszerbb lerst segtik. Pldul a $szam+=4 utasts egyenrtk a $szam=$szam+4 utastssal, a $szam*=4 utasts pedig a $szam=$szam*4 utastssal. Logikai opertorok: ! && || and xor or A logikai opertorok logikai rtkeken vgeznek mveleteket. A kvetkez tblzat a lehetsges logikai mveleteket mutatja be. Opertor Nv Igaz, ha a bal vagy a jobb operandus igaz a bal vagy a jobb operandus igaz vagy a bal, vagy a jobb operandus igaz, de csak az egyikk a bal s a jobb operandus is igaz a bal s a jobb operandus is igaz az egyetlen operandus hamis Plda Eredmn y
true true

|| or

vagy vagy kizr vagy s s tagads

true || false true or false

xor

true xor true

false

&& and !

true && false true and false !true

false false false

Arra a krdsre, hogy mirt van ktfle vagy s s logikai mvelet, a mveletek sorrendje adja meg a vlaszt. Binris opertorok: & | ^ ~ << >> A szmtgpben minden binrisan van trolva, azaz minden egy klnbz hosszsg binris sztring. Ezek kezelsre alkalmasak a binris opertorok. Ha van egy 1-es s egy 2-es szmunk, akkor a nekik megfelel binris alakok a 01 s az 10 (napjainkban 32 biten szoktak trolni, gy pldul az 1-es 31 db 0 utn egy 1-es). A bitenknti s (&) eredmnyben azokon a helyeken lesz 1-es, ahol mindkt operandusban 1-es volt. gy az 1-es s a 2-es bitenknti s-e 0. A bitenknti vagy (|) eredmnyben azokon a helyeken lesz 1-es, ahol legalbb az egyik operandusban 1-es volt, azaz az 1-es s 2-es esetben az eredmny a binris 11 lesz, ami 3-at r. A bitenknti xor (^) eredmnyben azokon a helyeken lesz 1-es, ahol a kt operandus kzl az egyikben s csakis az egyikben 1-es volt. Az 1 ^ 2 szintn a 3-at adja. 18

A bitenknti tagads (~) az sszes bitet invertlja, azaz ahol 1-es volt, ott 0 lesz, s fordtva. Mr csak kt opertor maradt htra: a jobbra tols (>>) s a balra tols (<<). Ezek az opertorok meghatrozott rtkkel eltoljk a biteket a megfelel irnyba. Ha a $szam vltoz rtke 3, akkor a $szam>>=1; utasts hatsra a $szam rtke 1 lesz (a binris 11-et 1-gyel jobbra tolva a binris 01-et kapjuk). Ha pedig a $szam<<=2; utastst nzzk, akkor a $szam a 12-vel lesz egyenl (az 11-bl az 1100-t kapjuk). Hivatkozs opertor: & A hivatkozs opertort vltoznv el kell tenni. Ha a $szam vltoz rtke 4, s kiadjuk a $sz=&$szam; utastst, akkor a $sz vltoz ugyanarra a memriacmre fog mutatni, mint a $szam, szksgkppen az rtke is meg fog egyezni a $szam vltoz rtkvel, azaz 4 lesz. Ha ksbbiekben brmelyik rtkt vltoztatjuk, vltozik a msik is, hiszen ugyanarra a memriacmre mutatnak. Hibaellenrz opertor: @ A @ opertor elrejti a fggvnyek s klnbz kifejezsek hibit, ami nhny weboldalon hasznos lehet, hiszen a hibazenetek ltalban a felhasznlknak nem mondanak semmit. A hibaellenrz opertort a fggvnynv el kell tenni.

3.4.3 Mveleti sorrend


A kvetkez lista az opertorokat a prioritsuk alapjn lltja sorba, kezdve a legmagasabb prioritsval. Az ugyanolyan priorits opertorok jobbrl balra hajtdnak vgre.

new [ ! ~ ++ -- (int) (double) (string) (array) (object) @ * / % + - . << >> < <= > >= == != === !== & ^ | && || ?: = += -= *= /= .= %= &= |= ^= ~= <<= >>= print and xor or ,

19

4 Vezrlsi szerkezetek
Az idig bemutatott kdokban az utastsok mindig sorban egyms utn vgrehajtdtak, s a program mindig ugyanazt az eredmnyt adta. Ez a szekvencilis vgrehajts nem biztost tl nagy teret a rugalmassgnak. A bonyolultabb programokban lehetsg van felttelek kirtkelsre, s a program ennek megfelelen vltoztatja viselkedst.

4.1 Az elgazs
Az elgazs teszi lehetv, hogy a programunk egy adott ponton egy kifejezs logikai rtknek megfelelen haladjon tovbb. Az elgazsoknak ltalban hrom tpusa szokott megjelenni a programozsi nyelvekben: az egyg (egyirny), a ktg (ktirny), s a tbbg (tbbirny).

4.1.1 Az egyg s a ktg elgazs


if (kifejezs) { utasts; } Ha a kifejezs logikai rtke igaz, akkor a zrjelprok ltal meghatrozott blokk vgrehajtdik. A kt zrjel elhagyhat, ha a blokk egyetlen utastsbl l. Az elhagys azonban sokszor rontja az tlthatsgot, valamint ha ksbb ms utastst is felvesznk a blokkba, esetleg megfeledkezhetnk a zrjelekrl.
01: 02: 03: 04: 05: 06: 07: 08: <?php $szam=2; if ($szam==2) { print "A szm rtke 2"; } //kirja, hogy A szm rtke 2 ?>

A fenti kdban a $szam vltoz tartalmt vizsgljuk. Ha a vltoz tartalma 2, akkor az if utni blokkban tallhat utasts vgrehajtdik, egybknt nem tesz semmit a program. Jelen esetben a bngszben megjelenik A szm rtke 2 szveg. Fontos megjegyezni, br mr volt rla sz, hogy a kifejezs vizsglatakor a dupla = jelet hasznljuk a szimpla helyett. Ezek sszekeverse slyos hiba! Ha azt rtuk volna, hogy if ($szam=2), akkor ez mindig az igaz logikai rtket szolgltatja, ugyanis ilyenkor a $szam vltoznak rtkl adjuk a 2-t (mivel ez mindig sikeres, igaz logikai rtket adunk az if szmra). A ktg elgazs lehetsget ad arra, hogy a kifejezs hamis logikai rtke esetn is utastsokat hajtsunk vgre. if (kifejezs) { utasts; } else {

20

utasts; } Ilyenkor a kt blokk kzl valamelyik fog vgrehajtdni. A kvetkez pldaprogramban egy szm reciprokt szeretnnk ellltani majd megjelenteni, de figyelembe kell vennnk, hogy a nullnak nincs reciproka.
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: <?php $szam=2; print "A szm: $szam<br>"; if ($szam!=0) { print "A szm reciproka: "; print 1/$szam; } else { print "Nincs reciproka!"; } //kirja, hogy 0.5 ?>

4.1.2 A tbbg elgazs


Tbbg elgazst ltrehozhatunk az elbbi ktg elgazsok egymsba gyazsval, vagy az elseif kulcssz hasznlatval, s ksbb ltni fogjuk, hogy ltezik egy kln utasts is ehhez. Az if-elseif-else szerkezet alakja: if (kifejezs) { utasts; } elseif (kifejezs) { utasts; } else { utasts; } Ha az els kifejezs logikai rtke hamis volt, akkor program az elseif gra ugrik, ahol megvizsglja a msodik kifejezst, ha ez a logikai igaz, akkor vgrehajtja az elseif ltal meghatrozott blokkot, ha a logikai hamis, akkor az else gra ugorva vgrehajtja az else blokkjt. Termszetesen annyi elseif kulcsszt rhatunk ebbe a szerkezetbe, amennyit csak akarunk. A kvetkez egyszer plda az if-elseif-else hasznlatt mutatja be.
01: 02: 03: 04: 05: 06: <?php $hom=120; print "A vz hmrsklete: $hom C<br>Halmazllapota: "; if ($hom<0) { print "szilrd";

21

07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17:

} elseif ($hom<100) { print "folykony"; } else { print "gz"; } //kirja, hogy gz ?>

A switch utasts is egy lehetsges mdja annak, hogy egy kdrszletet egy kifejezs rtktl fggen hajtsunk vgre. Van azonban nhny klnbsg az if s a switch kztt. Az if-et az elseif-el hasznlva tbb kifejezs rtktl tehetjk fggv, mg a switch esetben a program csak egy kifejezst vizsgl meg, s annak rtktl fggen klnbz utastsokat hajt vgre. A kifejezsnek valamilyen tpusnak kell lennie (szm, karakterlnc vagy logikai rtk). switch (kifejezs) { case rtk1: utasts1; break; case rtk2: utasts1; break; default: utasts; } A case alapszavak utn tntetjk fel az egyes rtkeket, s az sszes tbbi lehetsges rtket lefedhetjk a default-tal. A switch gy mkdik, hogy ha egy case utni rtk azonos a kifejezs rtkvel, akkor vgrehajtja az sszes ez utni utastst az gakon. Emiatt hasznljuk a break kulcsszt, amely segtsgvel kiugorhatunk a switch-bl. A kvetkez pldaprogram a switch hasznlatt mutatja be:
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: <?php $szam=4; print "A szm: $szam<br>"; switch($szam) { case "1": print "1-est dobott!"; break; case "2": print "2-est dobott!"; break; case "3": print "3-ast dobott!"; break; case "4": print "4-est dobott!"; break; case "5": print "5-st dobott!"; break; default: print "6-ost dobott!"; } //kirja, hogy 4-est dobott!

22

25: ?>

4.1.3 A ?: opertor
A ?: ternlis (hromoperandus) mveletjel egy olyan if utastshoz hasonlt, amely rtket is kpes visszaadni. A visszaadott rtket a vizsglt felttel hatrozza meg: (felttel) ? rtk_ha_a_felttel_igaz : rtk_ha_a_felttel_hamis; Ha a vizsglt felttel igaz, a ? s a : kzti kifejezs rtkt adja, ha hamis, akkor a : utnit. Ehhez kapcsold egyszer plda egy szm abszoltrtkt adja meg:
01: 02: 03: 04: 05: 06: <?php $szam=-3; print "A szm: $szam<br>"; $abs=($szam>=0) ? $szam : -$szam; print "Az abszoltrtke: $abs"; //kirja, hogy 3 ?>

4.2 A ciklus
A ciklusok segtsgvel arra is kpesek vagyunk, hogy bizonyos programrszeket tbbszr lefutassunk. ltalban meg szoktunk klnbztetni feltteles s nem feltteles ciklusokat. Nem feltteles ciklus a szmll ciklus, mg a feltteles ciklusokhoz tartozik ez ell- ill. a htultesztel ciklus.

4.2.1 A while ciklus


A while ciklus az elltesztel ciklus megfelelje a PHP nyelvben. Az elltesztel ciklus a kifejezs logikai rtkt az ismtlend rsz eltt vizsglja. A while szerkezete nagyon hasonl az if szerkezethez: while (kifejezs) { utasts; } Amg a kifejezs igaz logikai rtk, addig a program folytatja a blokk ismtlst. Ebbl kvetkezik, hogy kell lennie egy olyan utastsnak az ismtlend rszben (vagy maga a kifejezs tartalmazza az utastst), ami egyszer hamiss teszi a kifejezst, klnben vgtelen ciklust kapnnk.
01: 02: 03: 04: 05: 06: 07: 08: <?php $szam=1; while ($szam<=10) { print "A szam vltoz rtke: $szam<br>"; $szam++; } ?>

Ez az egyszer program 1-tl 10-ig kirja az egsz szmokat a bngszbe. A fontos utasts, amely segtsgvel majd kilpnk a ciklusbl, a 6. sorban tallhat. A kvetkez kd 10-tl kettesvel visszafele 1-ig kirja a szmokat s a ngyzetket (az 1et nem).

23

01: 02: 03: 04: 05: 06: 07: 08: 09: 10:

<?php $szam=10; while ($szam>0) { print "A szam vltoz rtke: $szam, ngyzete: "; print $szam*$szam; print "<br>"; $szam-=2; } ?>

4.2.2 A do ciklus
A do ciklus hasonl a while ciklushoz, csupn egyetlen lnyegi klnbsg van: a kifejezs vizsglata a blokk utn trtnik, ezrt is hvjk htultesztel ciklusnak. Ebbl kvetkezik, hogy egyszer mindenkppen vgrehajtdnak a blokkban tallhat utstsok, mg ha hamis is kezdetben a kifejezs logikai rtke. do { utasts; } while (kifejezs); Pldk a do ciklus hasznlatra:
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: <?php $szam=1; do { print "A szam vltoz rtke: $szam, ngyzete: "; print $szam*$szam; print "<br>"; $szam+=2; } while ($szam<=10); ?> <?php $szam=14; do { print "A szam vltoz rtke: $szam, ngyzete: "; print $szam*$szam; print "<br>"; $szam+=2; } while ($szam<=10); ?>

A 14 s a ngyzete megjelenik a bngszben, holott a felttelben a kisebb vagy egyenl, mint 10 szerepel. A do ciklust nem ilyen esetekben hasznljuk, ennek a ciklusnak is megvan az alkalmazsi terlete. A ksbbi fejezetekben ltunk majd erre pldt.

4.2.3 A for ciklus


A for ciklust szoktk szmll ciklusnak hvni, m ez a szerkezet a PHP-ben sokkal ltalnosabb, mint pldul a Pascal vagy a Basic nyelvekben. A for a while-hoz kpest rvidebb lerst s biztonsgosabb hasznlatot eredmnyez. A for ciklus ltalnos alakja:

24

for (kifejezs1;kifejezs2;kifejezs3) { utasts; } A for ciklust knnyen while cikluss rhatjuk t, gy az elbbivel egyenrtk while ciklus: kifejezs1; while (kifejezs2) { utasts; kifejezs3; } A kifejezsek kzl brmelyik elhagyhat, gy vgtelen ciklust a legknnyebben az sszes elhagysval csinlhatunk: for (;;) Egy korbbi plda megvalstsa a for ciklus segtsgvel:
01: 02: 03: 04: 05: 06: 07: 08: <?php for ($szam=1;$szam<=10;$szam+=2) { print "A szam vltoz rtke: $szam, ngyzete: "; print $szam*$szam; print "<br>"; } ?>

A 2. sorban elszr kezdrtket adunk a $szam vltoznak (ciklusvltoz), majd megadjuk a ciklusban marads felttelt, vgl megadunk egy utastst, ami ksbb majd a ciklus befejezdst vltja ki. For ciklusok egymsba gyazsa:
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: <?php for ($i=1;$i<5;$i++) { for ($j=1;$j<4;$j++) { print "Az i vltoz rtke: $i"; print ", a j vltoz rtke: $j<br>"; } } ?>

Ennl a pldnl kt ciklusunk van, kt ciklusvltozval ($i s $j). A futtats utn jl ltszik, hogy az ilyen egymsba gyazott ciklusoknl a kls ciklus ciklusvltozja egy rtknl a bels ciklus ciklusvltozja flveszi az sszes lehetsges rtket.

4.2.4 A break utasts


A break utastssal elhagyhat (befejezhet) a while, do, for ciklus. Plda:

25

01: 02: 03: 04: 05: 06: 07: 08: 09:

<?php for ($szam=1;$szam<=10;$szam+=2) { if ($szam*$szam>50) break; print "A szam vltoz rtke: $szam, ngyzete: "; print $szam*$szam; print "<br>"; } ?>

A 4. sorban meghatrozzuk, hogy ha az adott szm ngyzete nagyobb lenne, mint 50, akkor fejezzk be a ciklust.

4.2.5 A continue utasts


A continue utasts segtsgvel a vezrl kifejezsek kirtkelsre knyszerthetjk a while, do, for ciklust (a kvetkez ismtls azonnali elkezdsre knyszertjk a ciklust). Plda:
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: <?php for ($i=1;$i<6;$i++) { for ($j=1;$j<5;$j++) { if ($j==2) continue; print "Az i vltoz rtke: $i"; print ", a j vltoz rtke: $j<br>"; } } ?>

Mivel a continue a bels ciklusban tallhat, gy arra rvnyes. Amikor a $j vltoz rtke 2, nem hajtdnak vgre a continue utn tallhat print utastsok, hanem a kvetkez ismtlsre ugrunk (azaz a $j 2 rtke sosem jelenik meg a bngszben).

26

5 Fggvnyek
Elfordulhat, hogy egy problma megoldsra clszer a feladatot nllan is rtelmes rszekre bontani, majd ezeket tovbb elemezve jabb, egyre elemibb egysgekbe tagolni, amelyek megoldsa mr korbbrl ismert, azaz ismert programozsi szablyok vagy hozz hasonl algoritmusok segtsgvel megvalsthat. Az is tbbszr elfordul, hogy a feladat tbbszr is felhasznl ilyen elemi rszt. Ha minden esetben ezt le kellene rnunk, akkor a programunk rendkvl terjengss vlna, ezrt kzenfekv megolds lenne, ha az ilyen rszek nevet kaphatnnak, ekkor csak a nevkre kellene hivatkozni. Az nllan rtelmes rszfeladat megoldst vgz algoritmust eljrsnak nevezzk. Sokszor elfordul, hogy az eljrssal egyetlen rtket hatrozunk meg, amelyet clszer lenne a matematikai fggvnyek mintjra kezelni. Ez azt jelenti, hogy olyan specilis eljrsokat kell ltrehoznunk, amelyek a meghvst kveten egyetlen, jl meghatrozott tpussal rendelkez rtket szolgltatnak, olyan mdon, hogy ezt az rtket az eljrs azonostja hordozza. A kznsges eljrsoktl val megklnbztets cljbl az elbbi tulajdonsggal rendelkez, nllan rtelmes algoritmusrszeket nevezzk fggvnynek. Ha a fggvny nevre hivatkozunk, a fggvnyt meghvjuk, azaz a fggvny trzse lefut. A fggvnynek feldolgozs cljbl rtkeket adhatunk t, amikor pedig a fggvny vget r, a hvnak egy rtket ad vissza. Az elz fejezetekben mr lttunk pldkat a fggvnyekre, a fggvnyhvsra. Ilyen volt pldul a print("Hello, World!");. A fggvnyhvsnl a fggvny neve utn zrjelek kztt (a print ebbl a szempontbl kivteles, zrjelei elhagyhatk) a fggvny bemen paramtereit soroljuk fl vesszvel elvlasztva (azokat az adatokat, amiket tadunk a fggvnynek). A fggvnyeknek ltalban van visszatrsi rtke is, melyet a hvnak visszaad, pldul a print() visszatrsi rtke logikai rtk, azaz arrl informl minket, hogy sikeres volt e a fggvny vgrehajtsa.

5.1 Fggvnyek ltrehozsa, az rtk szerinti paramtertads


A fggvnyek ltrehozshoz a function kulcsszt kell hasznlnunk: function fuggvenynev(formlis paramterek) { utasts; } A fuggvenynev azonost szerepet tlt be, gy kt egyforma nev fggvny nem lehet egy PHP programban, valamint bett, szmot, s az _ jelet tartalmazhat, de szmmal nem kezddhet. A formlis paramterek azok a paramterek, melyekkel a fggvny le van rva, a hvs sorn ezek helyre az aktulis paramterek kerlnek. Nzznk egy pldt a paramter nlkli fggvnyre:
01: 02: 03: 04: 05: 06: 07: <?php function koszon() //a koszon fggvny definilsa { print "dvzlm!"; } koszon(); //a koszon fggvny meghvsa ?>

Nzznk most egy pldt a paramterrel rendelkez fggvnyre:

27

01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11:

<?php function koszont($kit) //fggvny definilsa egy paramterrel { print "dvzlm, $kit!<br>"; } koszont("Istvn"); //a koszont fggvny meghvsa $ki="Gza"; koszont($ki); //a koszont fggvny meghvsa $ki="Ferenc"; koszont($ki); //a koszont fggvny meghvsa ?>

A fenti pldban a fggvnyt meghvtuk konstans rtkkel, s gy, hogy a PHP a vltoz tartalmt helyettestette be.

5.2 rtkek visszaadsa


A fggvnyeknek visszatrsi rtke is lehet (az olyan fggvnyt, amelynek nincs visszatrsi rtke, eljrsnak szoktunk nevezni), ehhez a return utastst fogjuk hasznlni. A return befejezi a fggvny futtatst, s az utna rt kifejezst kldi vissza a hvnak. A kvetkez pldaprogram kt szm tlagval tr vissza:
01: <?php 02: function atlag($egyik,$masik) 03: { 04: $atlag=($egyik+$masik)/2; 05: return $atlag; 06: } 07: $szam1=2; 08: print "Az els szm: $szam1<br>"; 09: $szam2=5; 10: print "A msodik szm: $szam2<br>"; 11: print "A kt szm tlaga: "; 12: print atlag($szam1,$szam2); 13: //az atlag fggvny meghvsa (az atlag ltal visszaadott rtk kiratsa) 14: print "<br>"; 15: print "A 6 s a 8 tlaga: "; 16: print atlag(6,8); 17: //az atlag fggvny meghvsa konstans paramterekkel: kirja, hogy 7 18: ?>

5.3 Cm szerinti paramtertads


Az eddigi programjainkban paramtereket csak rtk szerint adtunk t, ami azt jeleni, hogy a paramterek rtkeit felhasznlni tudja csak a fggvny, megvltoztatni nem. Mit tehetnk akkor, ha azt szeretnnk, hogy a bemen paramterek rtkei is megvltozhassanak? Ehhez hasznlnunk kell az & (hivatkoz) opertort. A lenti program feladata, hogy felcserlje a paramterknt megadott kt vltoz tartalmt.
01: <?php 02: function csere(&$egyik,&$masik) 03: { 04: $seged=$masik; 05: $masik=$egyik;

28

06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17:

$egyik=$seged; } $szam1=2; print "Az els szm: $szam1<br>"; $szam2=6; print "A msodik szm: $szam2<br>"; csere($szam1,$szam2); print "Csere utn:"; print "<br>"; print "Az els szm: $szam1<br>"; //kirja, hogy 6 print "A msodik szm: $szam2"; //kirja, hogy 2 ?>

Az egyetlen dolog, amit tennnk kellett, hogy a kt formlis paramter el beszrtuk a & jelet (2. sor).

5.4 Vltoz szm paramterek


Elfordulhat, hogy nem tudjuk hny paramter kerlhet egy fggvnybe. A PHP lehetv teszi, hogy megllaptsuk, hny paramtere van a fggvnynek, s ennek megfelelen hasznljuk. A fggvnyben a paramterek kezelsre a func_num_args(), a func_get_arg(), s a func_get_args() fggvnyeket hasznlhatjuk. Az els megadja a paramterek szmt, a msodik az adott sorszm paramtert (0-tl sorszmozva), a harmadik pedig egy tmbbe rendezi az sszes paramtert. Nzznk erre egy kicsit bonyolultabb pldt:
01: <?php 02: function voros() 03: { 04: $szoveg=""; 05: $paramszam=func_num_args(); //a paramterek szmnak letrolsa 06: for ($i=0;$i<$paramszam;$i++) 07: { 08: $szoveg.=func_get_arg($i)."<br>"; //a paramterek sszefzse 09: } 10: return print "<font color=\"red\">$szoveg</font>"; 11: //a kapott sztring megjelentse vrs sznnel 12: } 13: voros("Ez egy vrs szn sor","Ez is","Meg ez is"); //a fggvny meghvsa 14: ?>

Ebben a pldban mr felhasznltuk a korbban megismert . s .= opertorokat. A $szoveg vltoz kezdetben az res sztringet tartalmazza (4. sor), majd miutn letroltuk a paramterek szmt a $paramszam vltozba (5. sor), hozzfzzk a soron kvetkez paramter tartalmt az elzekhez s kzjk az j sor tag-et (8. sor) egy for ciklus segtsgvel. Ami mg magyarzatra szolgl, hogy a 10. sorban mirt kerlt a red -ei el egy \ jel. Erre azrt van szksg, mert a PHP gy venn, hogy ott kezddik egy sztring vagy ott van vge. A \ jel s utna lert karaktereket vezrlkaraktereknek hvjuk. A $ jelet pldul csak gy rathatjuk ki, hogy \$-t runk a print-be, ellenkez esetben a PHP egy vltozt keresne a kirshoz. Akkor is mkdkpes programot kapunk, ha a tagekben a " jeleket egyszeren elhagyjuk.

29

5.5 Elhagyhat paramter


Megtehetjk azt is, hogy egy formlis paramternek rtket adunk a fggvny paramterlistjban, s ekkor a paramter a fggvny hvsnl elhagyhat lesz, a PHP azzal rtkkel fog dolgozni, amit a paramterlistban megadtunk. Ha viszont a hvsnl rtket adunk, akkor lecserldik a listban megadott arra, amivel hvunk. Ezt mutatja be a kvetkez kd:
01: <?php 02: function kiir($mit,$meret,$szin="red") 03: { 04: return print "<font size=\"$meret\" color=\"$szin\">$mit</font><br>"; 05: } 06: kiir("Ez egy 4-es mret, kk szn szveg.",4,"blue"); //a fggvny meghvsa 07: kiir("Ez egy 3-as mret, vrs szn szveg.",3); //a fggvny meghvsa 08: ?>

5.6 Hatkr
Amikor a hatkr kifejezst fggvnyekkel s vltozkkal kapcsolatban hasznljuk, arra gondolunk, hogy a kd mely rszben ltjuk ezeket az elemeket, s mely rszben lehet hasznlni ket. A PHP-ben a hatkr szablyai: A fggvny paramterlistjval bevitt vltozk loklis vltozk, kivve, ha & jel van elttk. A fggvnyen bell definilt vltozk loklis vltozk, kivve, ha a global kulcsszt eljk rtuk a definilskor. A fggvnyen kvl definilt vltozk nem rhetk el a fggvnyen bell, kivve, ha paramterknt vittk be ket a fggvnybe, vagy ha a global utastssal definiltuk ket. A define() utastssal definilt konstansok mindig globlisak, fggetlenl attl, hogy a fggvnyen bell vagy kvl definiltuk ket. A fggvnyek mindig globlisak, gy egy msik fggvny belsejben definilt fggvny mindenhol elrhet.

A global kulcssz hasznlata:


01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: <?php function csere($egyik,$masik) { global $seged; $seged=$masik; $masik=$egyik; $egyik=$seged; } csere(6,2); print "A segdvltoz tartalma: "; print $seged; //kirja, hogy 2 ?>

A global alapszt itt arra hasznltuk, hogy a fggvny belsejben definilt vltozt a fggvnyen kvl is elrjk. Ha a fggvnyen kvl definilunk egy vltozt, amit a fggvnyen bell szeretnnk hasznlni, akkor a vltoz definilsakor szintn ki kell tennnk a global kulcsszt. 30

5.7 Statikus vltozk


Lehet a kdunkban egy olyan fggvny, amelyet tbbszr hasznlunk, s minden hasznlatnl tovbbtania kell egy rtket a kvetkeznek. Ezt meg lehetne oldani egy globlis vltoz segtsgvel, de ennl egyszerbb s logikusabb megolds, ha statikus vltozt hasznlunk. Nzznk egy pldt, amely egyszeren kirja a fggvnyhvsok szmt:
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: <?php function kiir() { static $szam=0; $szam++; print "Fggvnyhvsok szma: $szam<br>"; } kiir(); //kirja, hogy a Fggvnyhvsok szma: 1 kiir(); //kirja, hogy a Fggvnyhvsok szma: 2 ?>

Ez egy nagyon egyszer plda a static hasznlatra, nzzk, hogy a static nlkl mit kellett volna tennnk:
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: <?php $szam=0; function kiir() { global $szam; $szam++; print "Fggvnyhvsok szma: $szam<br>"; } kiir(); //kirja, hogy a Fggvnyhvsok szma: 1 kiir(); //kirja, hogy a Fggvnyhvsok szma: 2 ?>

A kvetkez hrom rszben a PHP fggvnyei kzl a fontosabbak kerlnek megemltsre egy kis magyarzat mellett. A PHP sszes fggvnynek lersa egyrszt nagyon terjedelmes lenne, msrszt nem is cl, a PHP dokumentci folyamatos bngszse ajnlott.

5.8 Matematikai fggvnyek


A kvetkez tblzat a PHP matematikai tvltsainak gyors ttekintst tartalmazza: Eredmny $integer_or_float = $float = $float = $float = $float = $float = Fggvny abs($int_or_float) acos($float) asin($float) atan($float) atan2($float_l, $float_2) cos($float) Lers Abszoltrtkt adja. A szg arkusz koszinuszt adja radinban. A szg arkusz szinuszt adja radinban. A szg arkusz tangenst adja radinban. A kt vltoz arkusz tangenst adja. A radinban meghatrozott szg 31

koszinuszt adja. $float = $float = $float = $float= $value = $value = $value = $value = $string = exp($float) lcg_value() Az e-t a $float hatvnyra emeli. Kombinlt lineris kongruencia genertor. log($float) A $float termszetes logaritmust adja. log10($float) A $float 10-es alap logaritmust adja. max($array) A tmbben lev maximlis rtket adja. max($value_l, $value_2 ... A paramterlistban lev $value_n) maximlis rtket adja. min($array) A tmbben lev minimlis rtket adja. min($value_l, $value_2 ... A paramterlistban lev $value_n) minimlis rtket adja. number_format($float, A tizedesjel s az ezreseket $decimal_places, elvlaszt karakter hasznlatval $decimal_point, megformz egy szmot. $decimal_separator) pi() A pi rtkt adja 13 tizedes pontossggal. pow($floatx, $floaty) A $floatx-et a $floaty-dik hatvnyra emeli. sin($float) A radinban meghatrozott szg szinuszt adja. sqrt($float) A $float ngyzetgykt adja. tan($float) A radinban meghatrozott szg tangenst adja.

$float = $float = $float = $float = $float =

A PHP-ben az egsz s lebegpontos matematikn kvl ltezik a tetszleges pontossg matematika is. Ez egy olyan matematika, ahol mi hatrozhatjuk meg a szksges pontossgot. A szoftver, jelen esetben a BCMath, valamilyen mdon mindig megbirkzik a nagy szmokkal, legfeljebb bizonyos mveletek tovbb tartanak. A dokumentciban a fggvny referencia cmsz alatt megtallhatk ezek a fggvnyek (mindegyik neve bcvel kezddik). A PHP ezen kvl tmogatja a korltlan hosszsg egszekkel val szmolst is. A GMP, vagy GNU MP egy nylt forrskd matematikai csomag, amely beillesztsvel szintn tetszleges pontossg aritmetikai fggvnyekhez juthatunk, amelyekkel eljeles egsz, racionlis s lebegpontos szmokon lehet mveleteket vgrehajtani. A csomag letlthet a http://www.swox.com/gmp cmrl.

5.9 Dtum- s idfggvnyek


A PHP tbb dtum- s idfggvnyt tartalmaz, mint a legjabb cscstechnolgij karra. A lenti tblzat a dtum s id kiszmtshoz szksges fggvnyeket tartalmazza, a tbbi szmtst ezekbl a fggvnyekbl kapott eredmnyekkel, illetve ezen eredmnyek talaktsval lehet elvgezni. Fggvny Lers 32

checkdate() date() getdate() gettimeofday() gmdate() gmmktime() gmstrftime() localtime() microtime() mktime() strftime() time() strtotime()

Ellenrzi, hogy a Gergely-naptr szerinti dtum helyes e. A helyi dtumot s idt formzva adja vissza. A helyi dtumot s idt tmbknt adja vissza. Az aktulis idt tmbknt adja vissza. Ugyanaz, mint a date(), de a helyi id helyett a GMT-t haszanlja A dtumot Unix-idjelzsre konvertlja. A GMT dtumot s idt formzza. A helyi idt tmb elemeiknt adja. A Unix-idjelzst a msodperc trtrszvel adja vissza. A Unix-idjelzst adja vissza egy dtumbl. Ugyanaz, mint a gmstrftime(), csak a helyi idt hasznlja. Unix-idjelzst ad vissza. A szveges dtumot/idt Unix-idjelzsre konvertl.

5.10 Sztringfggvnyek
A sztringfggvnyekkel dolgozni a PHP-ban egyrszt szrakoztat dolog, msrszt az adatkezelsnek egy hasznos mdja. A legtbb sztringfggvny binris adatokat kezel, a PHP azonban elvgzi a szksges konverzikat. A fontosabb sztringfggvnyek lerst lthatjuk a lenti tblzatban: Eredmny $string = Fggvny $addslashes($string) Lers Visszaper jeleket ad az idzjelekhez, ktszeres idzjelekhez, visszaper jelekhez s az res karakterekhez, gy a sztringet SQL-ekkel be lehet szrni adatbzisba. Az input sztring binris adatnak hexadecimlis megjelentst adja vissza. Eltvoltja a szvgn ll szkzket, gy a szkzket, \r, \n, \t s chr(13) karaktereket. A szm ASCII karakterkszletbeli megfeleljt adja (az ord() ellenttje). Egy tmbt ad vissza, mely a sztring egyes karaktereinek gyakorisgt tartalmazza. A $mode opcionlis s ellenrzi, hogy mi van szmolva. A sztring CRC32 rtkt szmolja ki. Egy opcionlis kulcs hasznlatval DES

$string = $string = $string = $array =

bin2hex($string) chop($string) chr($integer) count_chars($string, $mode)

$string = $string =

crc32($string) crypt($string, $key)

33

eljrssal rejtjelez egy sztringet. echo($string) Egy vagy tbb sztringet rat ki, hasonl a print()-hez. $array = explode($separator, Tmbt hoz ltre a sztringbl a $separator $string) egyes elfordulsainl sztvgva azt. $array = get_meta_tags A megnevezett fjl meta tag tartalmt adja ($file_name) tmbben vissza. $string = htmlentities($string) A<, >, ', ^, & s a nehezen megjelenthet karaktereket HTML-elemekre konvertlja. $string = htmlspecialchars($string) A <, >, ', ", s & karaktereket HTMLelemekre konvertlja. $string = implode($separator, A tmb elemeket egyestve sztringet hoz $array) ltre. Az explode() ellenttje. $string = levenstein($string_1, A kt sztring kztti Levenstein-tvolsgot $string_2) szmtja ki, ami az egyezsg mrtke. $string = ltrim($string) Levgja a szkzket, \n, \r, \t, \v s \0 karaktereket a sztring elejrl. $string = md5() A sztring MD5-tpus digitlis kivonatt adja vissza. $string = nl2br($string) A sztringben az sszes newline (\n) el HTML sortrst (<br>) szr be. $integer = ord($string) A karakter ASCII rtkt adja vissza (a karakter karakterkszleten belli ordinlis szmt adja vissza), $boolean = print($string) Egy sztringet rat ki, siker esetn igazat, hiba esetn hamisat ad vissza. $boolean = printf($format, $variables) A $format sztringgel formzott vltozkat rja ki. $array = sscanf($string, $format) Egy tmbt ad vissza, melynek az rtkei a $format hasznlatval kerltek be a sztringbl. $integer = strcasecmp($string_l, Binris-biztos, a kis-s nagybetket nem $string_2) megklnbztet sztring sszehasonulst vgez el. 0-t ad vissza, ha $string_l == $string_2, -1-et, ha $string_l < $string_2, vagy 1-et, ha $string_l > $string_2. $integer = strncasecmp($string_l, A strcasecmp() vltozata, mely a sztringeket $string_2, $length) a $length ltal megadott hosszsgig hasonltja ssze. $integer = strcmp($string_l, A strcasecmp() kis s nagybetket $string_2) megklnbztet vltozata. $string = strip_tags($string, $tags) Eltvoltja a sztringbl a HTML tag-eket a $tags-ben felsoroltak kivtelvel. $string = stripcslashes() Az addcslashes()-sel hozzadott visszaper jeleket tvoltja el. $string = stripslashes() Az addslashes()-sel hozzadott visszaper jeleket tvoltja el. Ha addslashes()-t hasznlunk, majd ezt kveten MySQLben troljuk az adatokat, a MySQL

34

$integer = $integer = $string =

stristr($search, $string) strlen($string) str_pad($string, $length, $pad, $mode)

eltvoltja a visszaperjeleket s hasznlatra ksz adatokat ad vissza. A strstr() kis- s nagybetket megklnbztet vltozata. A sztring hosszt adja vissza.

A szkzkkel a $length mrtkben jobbra igaztott sztringet adja vissza. Ha az opcionlis $pad sztring meg van adva, akkor azt hasznlja a szkzk helyett. Az opcionlis $mode-dal vlaszthatunk az igaztsok kzl. $integer = strpos($string_l, $string_2) A $string_l-el adja vissza a $string_2 pozcijt. $string = strrchr($string, $char) A $string-bl az utols $char utni sztringet adja vissza. $string = str_repeat($string, Olyan sztringet ad vissza, amely a bemeneti $integer) sztringet $integer alkalommal tartalmazza. $string= strrev($string) A sztringet fordtott karaktersorban adja vissza. $integer = strrpos($string, $char) A $string-ben lev utols $char pozcijt adja vissza. $string = strspn($string, $char) A $string els rszt adja vissza, amely csak a $char-ban lev karaktereket tartalmazza. $integer = strstr($search, $string) A $search-nek a $string-en belli els elfordulsnak pozcijt adja vissza. $string = strtok($string, $separator) A $separator-nl elvlasztja a sztringet s egyszerre egy szakaszt ad vissza. $string = strtolower($string) Kisbetsre konvertlja a sztringet. $string = strtoupper($string) Nagybetsre konvertlja a sztringet. $string = str_replace($find, A $string-ben a $find sszes elfordulst $replace, $string) $replace-re cserli. $string = strtr($string, $from, $to) A sztringben a karaktereket $from-rl $to-ra fordtja. $string = substr($string, $start, A sztring $start-tl kezdd $length $length) hosszsg rszt adja vissza. Ha a $length nincs meghatrozva, akkor a $start-tl sztring vgig halad. $integer = substr_count($string, A $string-ben lev $char elfordulsnak $char) szmt adja vissza. $string = substr_replace($string, Egy sztringet ad vissza, amelyben a $start$replace, $start, $length) tl kezdd szveg a $length hosszsgban a $replace-re van cserlve. Ha a $length nincs megadva, a sztring vgig cserli. $string = trim($string) Levgja a szkzket, \n, \r, \t, \v s \0 karaktereket a sztring elejrl s vgrl. $string = ucfirst($string) A sztring els karaktert nagybetss vltoztatja. Klnsen mondatok

35

$string =

$string =

formzsnl hasznos. ucwords($string) Minden sz els karaktert nagybetss vltoztatja. Fejezetcmek formzsnl hasznos (br magyar nyelvben ez nem szoks). wordwrap($string, $length, Newline-okat szr be a sztringbe gy, hogy a $char) szveget a $length-nek megfelel hosszsg sorokra tri. Ha a $length nincs megadva, akkor alapbelltsban soronknt 72 karakter. Ha a $char meg van hatrozva, akkor azt szrja be a newline helyett.

Lthatjuk, hogy a PHP milli lehetsget nyjt szmunkra akr szmokkal, dtumokkal vagy szveggel dolgozunk. Az kvetkez fejezetekben jnhny fggvny alkalmazsa megtallhat lesz majd a pldaprogramokban.

36

6 Tmbk s objektumok
6.1 Tmbk
Programjaink rugalmassgt a tmbk hasznlata nagymrtkben nveli, de vigyznunk kell, mert nhny csapdt is rejtenek magukban. A PHP-tmbket gy hasznlhatjuk, mintha a memriban trolt mini adatbzisok lennnek, hiszen rengeteg fggvny ll rendelkezsnkre. Legyenek az adatok szveges dokumentumokban, nyomtathat fjlokban, XML fjlokban vagy adatbzisokban, betlthetk tmbbe, s feldolgozhatk anlkl, hogy az eredeti fjlba belenylnnk. A tmb vltozk listja. Tbb vltozt tartalmaz, amelyeket szmok vagy karakterlncok segtsgvel azonosthatunk, gy a klnbz rtkeket egyetlen nvvel trolhatjuk, rendezhetjk s rhetjk el. (ZANDSTRA, 2000, 98. old.)

6.1.1 Tmbk ltrehozsa


Tmbket sokflekppen ltrehozhatunk: fggvnyek s a tmbazonost segtsgvel is. Az array() listbl hoz ltre tmbt, az explode() hatrolt sztringbl (megtallhat az elz fejezet sztringfggvnyei kztt), s hasznlhatjuk a szgletes zrjelek kztt a tmbazonostt is a tmbelemek rtkeinek meghatrozsra. Az array() fggvny s a [ ] hasznlata: Az array() fggvny akkor hasznos, ha egyszerre tbb rtket szeretnnk egy tmbhz rendelni:
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: <?php $nevek=array("Istvn",32,"Pter"); print $nevek[0]; //kirja, hogy Istvn print ": ".gettype($nevek[0])."<br>"; //kirja, hogy string print $nevek[1]; //kirja, hogy 32 print ": ".gettype($nevek[1])."<br>"; //kirja, hogy integer print $nevek[2]; //kirja, hogy Pter print ": ".gettype($nevek[2])."<br>"; //kirja, hogy string print $nevek[3]; //nem r ki semmit, mert nincs 4. elem $szamok[]=3.14; //els elem a '3.14' $szamok[]="ngy"; //msodik elem a 'ngy' $szamok[]=true; //harmadik elem a 'true', azaz a logikai igaz print $szamok[0]; //kirja, hogy 3.14 print ": ".gettype($szamok[0])."<br>"; //kirja, hogy double print $szamok[1]; //kirja, hogy ngy print ": ".gettype($szamok[1])."<br>"; //kirja, hogy string print $szamok[2]; //kirja, hogy 1 print ": ".gettype($szamok[2]); //kirja, hogy boolean ?>

A PHP-ben a tmb sokkal rugalmasabb, mint nhny programozsi nyelvben. A tmbknek brmennyi eleme lehet, brmikor hozzadhatunk jakat, s az is megengedett, hogy klnbz tpus adatok kerlhessenek bele. A fenti plda jl illusztrlja, hogy brmilyen tpus rtket adhatunk a tmb elemeinek (sszetett tpust is), majd az indexek (sorszmok) segtsgvel megjelenthetjk a tmb tartalmt (a sorszmozs 0-val kezddik). Egy tmb feltltshez, vagy jabb elemek hozzadshoz ugyangy hasznlhatjuk a szgletes zrjeleket (10. sor). A rugalmassg kedvrt mg a sorszmot sem kell megadni, a PHP tudja, hogy melyik a soron kvetkez (ltezik ugyanis egy n. tmbmutat). 37

6.1.2 Asszociatv tmbk


Ha a tmbelemeket sorszmozs helyett elnevezzk, asszociatv tmbt kapunk. Tulajdonkppen a PHP-ben minden tmb asszociatv tmb, a szmozott adatok is asszociatv adatokknt viselkednek. Az elnevezs sorn csak egy dologra kell gyelnnk: kt egyforma nevet nem adhatunk, mert ekkor nem tudnnk egyrtelmen azonostani ket, ezrt ezt a nevet kulcsnak hvjuk. Az asszociatv tmbk ltrehozshoz ugyangy hasznlhatjuk az array() fggvnyt s a szgletes zrjeleket is:
01: <?php 02: $szemely=array("nev"=>"Istvn","szulido"=>"1956.10.03","szulhely"=>"Kes zthely"); 03: print $szemely["szulido"]; //kirja, hogy 1956.10.03 04: print "<br>"; 05: $egyen["nev"]="Istvn"; 06: $egyen["szulido"]="1956.10.03"; 07: $egyen["szulhely"]="Keszthely"; 08: print $egyen["szulido"]; //kirja, hogy 1956.10.03 09: ?>

6.1.3 Tbbdimenzis tmbk


Ebben a fejezetben mr volt sz arrl, hogy sszetett tpus is lehet egy tmb eleme, gy lehet tmb s objektum is. Ez a lehetsg kifinomultabb adatszerkezeteket biztost szmunkra. A tbbdimenzis tmb azt jelenti, hogy a tmb elemei tmbk. A PHPtmbk brmennyi dimenzit elfogadnak, s az egyes dimenzik brmennyi elemet tartalmazhatnak. Valjban az a helyzet, hogy elbb futunk ki a memribl, mint elrnnk a PHP korltjait. Persze ms problma is lehet, ha tl sok dimenzival dolgozunk: egy id utn nem fogjuk mr tltni az egszet. Ezrt ersen javasolt, hogy hrom dimenzi fltt ne prblkozzunk, s abban is biztosak lehetnk, hogy kevesebb dimenziszmmal is meg lehet oldani a feladatot. A tbbdimenzis tmbk ltrehozsa:
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: <?php $tablazat=array ( array(2,3,4), array(6,5,1) ); print $tablazat[0][2]; //kirja, hogy 4 print "<br>"; print $tablazat[1][1]; //kirja, hogy 5 print "<br>"; $szemelyek=array //asszociatv tmbk tmbje ( array ( "nev"=>"Istvn", "szulido"=>"1956.10.03", "szulhely"=>"Keszthely" ), array ( "nev"=>"Bla", "szulido"=>"1963.02.13", "szulhely"=>"Zalaegerszeg"

38

24: 25: 26: 27: 28: 29:

) ); print $szemelyek[0]["nev"]; //kirja, hogy Istvn print "<br>"; print $szemelyek[1]["szulhely"]; //kirja, hogy Zalaegerszeg ?>

Ha vgiggondoljuk, csak a szerkezeteket kell egymsba gyazni, s el is ll a tbbdimenzis tmb (2. sortl a 6. sorig, 11. sortl a 25. sorig). A 7., 9., 26., s a 28. sor figyelmeztet minket arra, hogy egy tmbelem elrshez tbb indexet/azonostt kell hasznlnunk.

6.1.4 A tmbmutat
A tmbmutat csak nhny nyelvben ll rendelkezsre, s a PHP-ben tallhat az egyik legjobb megvalstsa. A tmbmutat segt meghatrozni, hogy hol vagyunk, amikor egy tmbben mozgunk. Tbb fggvny is tmogatja a tmbmutatt, hogy segtse a tmbben val mozgst. A reset() a tmb elejre lltja vissza a tmbmutatt. Ezt akkor clszer hasznlni, amikor egy ismeretlen llapot tmbn kell vgigmenni (azaz nem tudjuk, hogy hol ll benne a mutat). Amikor egy tmbt adunk t egy fggvnynek, az alaprtelmezsben rtkknt trtnik, gy egy msolatot kap a tmbrl, aminek az elejn ll a tmbmutat. Ha viszont hivatkozssal adjuk t, akkor a tmb az eredeti mutatt tartja meg, ami lehet, hogy ismeretlen pozciban van. A mutat aktulis helyzett a current() fggvnnyel krdezhetjk le, a next() a kvetkezre lptet, a prev() az elzre, mg az end() a tmb utols elemre lltja a tmbmutatt. Az each() fggvny megadja az aktulis elem kulcst s rtkt, s tviszi a mutatt a kvetkez adatra. Ennek segtsgvel bejrhatjuk a tmbt felhasznlva egy while ciklust (a bejrs eltt azonban meg kell gyzdni arrl, hogy a tmb elejn van a mutat).

6.1.5 Tmbk bejrsa


Egydimenzis tmbk bejrsa A tmbk bejrsa trtnhet az elbb emltett each() fggvny segtsgvel, de a PHPben nemrg bevezettek erre egy kln ciklustpust is. A kvetkezkben ezek hasznlata lthat:
01: 02: 03: 04: 05: 06: 07: 08: <?php $felhasznalok=array ("Istvn", "Gza", "Bla"); $felhasznalok[5]="Kismalac"; foreach ($felhasznalok as $egyen) { print"$egyen<br>"; } ?>

A ciklus a foreach() (4. sor). Ksbb ltni fogjuk, hogy ezt lehet tbbdimenzis tmbknl is hasznlni. Ennl a pldnl megadtuk a $felhasznalok tmbt paramterknt a ciklusnak, majd az as kulcsszval jelltk, hogy a tmbelemek rtkeit rendre a $ertek vltozba szeretnnk megkapni. Ezutn a ciklusmagban mr csak a $ertek vltoz tartalmt kell kiratni. Van itt mg egy rdekes dolog: A tmbnk elszr hrom elemet tartalmaz (0,1,2 sorszmokkal), ksbb hozzadunk egy jat, aminek a sorszmt 5-re lltunk be. Ez azt jelenti, hogy ez a 6. elem, gy nincs 4. s 5. 39

elem. A PHP nem fog res helyet hagyni, azaz a nem ltez elemekre nem pazarol res helyet (ebbl ltszik, hogy valjban a sorszmozott tmb is asszociatv tmb). Pontosan emiatt ltezik a foreach() s az each() utasts, mivel ezek a tmbmutatt hasznljk fel, gy nem lehet problma a bejrssal, a Kismalac is megjelenik a bngszben (ha for ciklust hasznltunk volna, mint ahogy sok nyelvben ezzel jrjuk be a tmbket, indexproblmk merltek volna fel). Az asszociatv tmbk bejrsa:
01: <?php 02: $szemely=array("nev"=>"Istvn","szulido"=>"1956.10.03","szulhely"=>"Kes zthely"); 03: foreach ($szemely as $kulcs=>$ertek) 04: { 05: print "$kulcs=$ertek<br>"; 06: } 07: reset($szemely); 08: while (list($kulcs,$ertek)=each($szemely)) 09: { 10: print $kulcs.": ".$ertek."<br>"; 11: } 12: ?>

A 3. sorban a ciklusnl mdostanunk kellett, itt a kulcs alapjn jelentjk meg az rtket. Ebben a pldban a list() fggvny minden egyes rtket kln vltozban ment el (8. sor, a kulcs s az rtk is vltozkba kerlnek), gy megknnyti az eredmnyek feldolgozst. Az each()-et a nem asszociatv tmbkn alkalmazva a kulcsok megfelelnek az elemek sorszmainak. Ha a tmb tbbdimenzis, akkor a $ertek vltoz egy tmb lesz, amit teljesen hasonlan fogunk bejrni. Tbbdimenzis tmbk bejrsa Mindent ismernk mr ahhoz, hogy a tbbdimenzis tmbket be tudjuk jrni:
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: <?php $tablazat=array ( array(2,3,4), array(6,5,1) ); foreach ($tablazat as $sor) { foreach ($sor as $ertek) { print "$ertek<br>"; } } $szemelyek=array ( array ( "nev"=>"Istvn", "szulido"=>"1956.10.03", "szulhely"=>"Keszthely" ), array ( "nev"=>"Bla", "szulido"=>"1963.02.13",

40

26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44:

"szulhely"=>"Zalaegerszeg" ) ); foreach ($szemelyek as $szemely) { foreach ($szemely as $kulcs=>$ertek) { print "$kulcs=$ertek<br>"; } } reset($szemelyek); while (list($kulcs,$ertek)=each($szemelyek)) { while(list($kulcs2,$ertek2)=each($ertek)) { print $kulcs2.": ".$ertek2."<br>"; } } ?>

6.1.6 Mveletek tmbkkel


A tblzat a gyakran hasznlatos tmbkezel-fggvnyeket foglalja ssze: Eredmny $array = $array = $array = $value = $integer = $integer = $value = $array = Fggvny array_flip($array) array_merge($array_1, $array_2) array_pad($array, $integer, $value) array_pop($array) array_push($array, $value_1, $value_2, $value_n) array_rand($array) array_shift($array) array_slice($array, $index_1, $index_2) Lers tvlt az rtkek s a kulcsok kztt. A kt megadott tmbt egyesti. A tmbt feltlti annyi darab $valuevel, hogy a tmb elemszma $integer legyen. A tmb utols elemt trli, majd az elem rtkvel tr vissza. A tmbhz hozzfzi a megadott rtkeket, s a tmb elemszmval tr vissza. A tmb egy elemt vletlenszeren kivlasztja, majd az indexvel tr vissza. Eltvoltja a tmb els elemt, s annak rtkvel tr vissza. Tmbt hoz ltre az els indextl kezdve a msodikig a megadott tmb elemeinek rtkbl. Ha a msodik indexet nem adjuk meg, akkor a vgig nzi. A tmbben lv elemek szmt adja meg. A $file_name-mel megadott fjl tmbbe olvassa. Egy vltozrl megmondja, hogy tmb e.

$integer = $array = $boolean =

count($array) file($file_name) is_array($variable)

41

$array = $array =

range($index_1, $index_2) shuffle($array)

Tmbt hoz ltre az els indextl kezdve a msodikig a kulcsokbl (kulcstartomny kijellse). A tmb elemeinek vletlen sorrendbe rendezse.

6.1.7 Tmbk rendezse


A PHP-tmbket az albbi lehetsgek szerint rendezhetjk fggvnyek segtsgvel:

rtk szerint kulcs szerint abc-sorrendbe szmos termszetes s specilis sorrendbe

A megfelel fggvnyeket tartalmaz tblzat: Fggvny sort($array) asort($array) rsort($array) arsort($array) ksort($array) natsort($array) usort($array) Lers Tmb rendezse rtk szerint. Asszociatv tmb rendezse rtk szerint. Tmb rtk szerinti fordtott sorrendbe rendezse. Asszociatv tmb rtk szerinti fordtott sorrendbe rendezse. Asszociatv tmb kulcs szerinti rendezse. Tmb rtk szerinti termszetes rendezse. Tmb nem termszetes rendezse.

A kvetkez pldaprogramban nhny tmbmvelet s rendezs alkalmazst lthatjuk:


01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: <?php function kiir($tomb) { foreach ($tomb as $ertek) { print "$ertek "; } print "<br>"; } function akiir($tomb) { foreach ($tomb as $kulcs=>$ertek) { print "$kulcs=$ertek "; } print "<br>"; } $elso=array("a","b","c"); print "Az els tmb elemei: ";

42

20: kiir($elso); 21: $masodik=array(3,1,2); 22: print "A msodik tmb elemei: "; 23: kiir($masodik); 24: $harmadik=array_merge($elso,$masodik); //kt tmb sszefzse 25: print "A kt tmb sszefzse: "; 26: kiir($harmadik); 27: array_push($harmadik,5,4,6); //az 5,4,6 hozzfzse a tmbhz 28: print "Az 5,4,6 hozzfzse: "; 29: kiir($harmadik); 30: $elso_elem=array_shift($harmadik); //az els elem eltvoltsa 31: print "Az els elem eltvoltsa: "; 32: kiir($harmadik); 33: print "A tmb els eleme volt: $elso_elem<br>"; 34: $harmadik=array_slice($harmadik,2,4); //a 3. elemtl 4 db elem kivtele 35: print "A 3. elemtl 4 db elem kivtele: "; 36: kiir($harmadik); 37: sort($harmadik); 38: print "A rendezett tmb elemei: "; 39: kiir($harmadik); 40: $szemely=array("nev"=>"Istvn","szulido"=>"1956.10.03","szulhely"=>"Kes zthely"); 41: print "Az asszociatv tmb elemei: "; 42: akiir($szemely); 43: asort($szemely); //rtk szerinti rendezs 44: print "rtk szerint rendezve: "; 45: akiir($szemely); 46: ksort($szemely); //kulcs szerinti rendezs 47: print "Kulcs szerint rendezve: "; 48: akiir($szemely); 49: ?>

6.2 Objektumok
Az objektumok a vltozkhoz hasonlan adatokat trolhatnak, ezeket az adatokat az objektumok adattagjaikban (tulajdonsgaikban) trolhatjuk. Kpzeljnk el egy objektumot, amely egy szemly adatait tartalmazza, az objektum adattagjai ebben az esetben a szemly neve, lakcme s telefonszma lehetnek. Ezzel semmi jat nem mondtunk mg, hiszen erre a feladatra egy asszociatv tmb is tkletesen megfelel. Az objektumok viszont tagfggvnyeket (metdusokat) is tartalmazhatnak. Ezek olyan fggvnyek, amelyek az objektum adataival dolgoznak. Az elbbi pldnl maradva, az objektum tartalmazhat egy megjelenit() metdust, amely a szemly adatait jelenti meg. Az objektum-orientlt (objektumkzpont) programozs (OOP) a termszetes gondolkodst, cselekvst kzelt programozsi md, amely a programozsi nyelvek tervezsnek kvetkezetes fejldse kvetkeztben alakult ki. Az gy ltrejtt nyelvek sokkal strukturltabbak, sokkal modulrisabbak s absztraktabbak, mint egy hagyomnyos programozsi nyelv. Az objektum-orientlt nyelveket hrom fontos dolog jellemez: Egysgbezrs (encapsulation): az adatstruktrkat (adattagokat) s az adott struktrj adatokat kezel fggvnyeket (tagfggvnyeket) kombinljuk, azokat egysgknt kezeljk, s elzrjuk ket a klvilgtl. Az gy kapott egysgeket objektumoknak nevezzk. Az objektumok megfelel trolsi egysge az osztly (class). Pldul, ksztnk egy kr objektumot, amely maga kpes elvgezni mindent, amit egy krrel megtehetnk, akkor ebbe beletartozik a kr adatainak

43

sugr s kzppont - nyilvntartsa, de ki kell tudnia szmtani pldul ms adatokbl a sugarat, vagy ppen kirajzolni a krt. Teht egy csomagot ksztnk, amelybe mindent beletesznk, ami szksges.

rkls (inheritance): az adott, ltez osztlyokbl jabb osztlyok szrmaztathatk, az rkls sorn pedig az osztlyok rklik a szl-osztly adatstruktrit s fggvnyeit, ugyanakkor j tulajdonsgokat s metdusokat definilhatnak, vagy jrartelmezhetnek, gy egy osztlyhierarchihoz jutunk. Pldul, a krbl gmbt kszthetnk, hiszen a gmb rendelkezik a kr minden jellemzvel, csak eggyel tbb dimenzija van. Sokalaksg (polymorphism): egy adott metdus azonostja (neve) ugyanaz lehet egy osztlyhierarchin bell, ugyanakkor a hierarchia minden egyes osztlyban a tevkenysget megvalst fggvny az osztlyra nzve specifikus. Pldul, tegyk fel, hogy klnbz alakzataink vannak, hromszgek, ngyzetek s krk. Ekkor a sokalaksg segtsgvel ltalban minden alakzattal kpesek lesznk dolgozni. A terulet() tagfggvny az alakzathoz alkalmazkodva ki tudja majd szmtani annak terlett. jrahasznosthatsg: miutn ksztettnk egy osztlyt, jra s jra felhasznlva tbb objektumot gyrthatunk belle. Az rkls s a sokalaksg segtsgvel olyan eljrsokat kszthetnk, melyeket tbbszr, tbbflekppen is hasznlhatunk, nem kell jra s jra ellenrizni a mkds rszleteit.

Az osztly teht egy ksbb ksztend elem meghatrozsa, a szban forg elem pedig az objektum. Gyakori plda ezek megklnbztetshez a stemnyforma s a stemny. A stemnyforma meghatrozza a sti alakjt, de nmaga nem stemny (mg csak nem is ehet), csak egy eszkz, amellyel stemnyeket kszthetnk. Hasznlatakor biztosak lehetnk abban, hogy a stik egyformk lesznek, s nem fog elkopni, akrmennyi stemnyt is ksztnk. A stemnyformhoz hasonlan az osztllyal is tbb objektumot kszthetnk, gy ha van pldul egy kr osztlyunk, akkor ezzel szmos krt ltrehozhatunk. Az objektum az osztly egy pldnya, vagyis egy objektum nem ms, mint az osztlyban rgztett mkdsi szablyok megtesteslse. Egy adott tpus objektum a new kulcssz utn rt objektumtpus nevnek segtsgvel testesthet meg. Amikor egy objektumpldny ltrejn, sszes tulajdonsga s tagfggvnye elrhetv vlik. (ZANDSTRA, 2000, 120. old.). A PHP4-et nem igazn az objektum-orientlt programozsra terveztk. Ugyan rengeteg dolgot tartalmaz, amirl sz volt idig, mgis vannak olyan rszek, melyek megvalstsa mg nem megfelel vagy hinyzik. A PHP 5-s vltozata teljesen j OOP lehetsgeket tartalmaz, amelyek sokkal inkbb kzelebb viszik a PHP-t az objektumorientlt nyelvekhez.

6.2.1 Osztlyok s objektumok ltrehozsa


Ahhoz, hogy ltre tudjunk hozni egy objektumot, elszr ltre kell hoznunk egy sablont (ez az osztly), ami megmondja pontosan, hogy az objektum milyen tulajdonsgokkal fog rendelkezni, valamint hogy mit tehetnk majd az objektummal a tulajdonsgait felhasznlva. Az osztly ltrehozshoz a class kulcsszt kell hasznlnunk:
class legegyszerubb { }

44

Ennl egyszerbb osztlyt nem lehet kszteni, gyakorlatilag semmit sem tartalmaz. Most mr van egy legegyszerubb nev osztlyunk, hogyan ksztjk el az osztly pldnyait?
$obj1=new legegyszerubb(); $obj2=new legegyszerubb();

A $obj1 s a $obj2 is teht egy pldnya az osztlynak. A pldnyostsnl a new kulcssz utn az osztly nevt (azonostjt) tntettk fel, valamint tettnk utna zrjeleket. gy tnik, mintha az osztly neve is egy fggvny lenne. Erre majd ksbb kapjuk meg a vlaszt a konstruktor rszben. Az objektumok tpusa az object a PHP-ben, gy ha a gettype() fggvnyt hasznljuk a $obj1 vagy a $obj2 vltozkkal, ezt kapjuk.

6.2.2 Adattagok (tulajdonsgok)


Az elbbi pldban bemutatott osztlynak pldnyai nem rendelkeztek sem tulajdonsgokkal, sem fggvnyekkel. Hozzunk ltre egy olyan osztlyt, ami majd hozzrendel tulajdonsgokat a pldnyhoz:
01: <?php 02: class szemely 03: { 04: var $nev="Pter"; //nev adattag ltrehozsa (string tpus) 05: var $eletkor=30; //eletkor adattag ltrehozsa (integer tpus) 06: } 07: $obj=new szemely(); //$obj objektum ltrehozsa (pldnyosts) 08: print "$obj->nev, $obj->eletkor<br>"; //adattagok tartalmnak kiratsa 09: $obj=new szemely(); 10: $obj->nev="Lszl"; 11: $obj->eletkor=26; 12: print "$obj->nev, $obj->eletkor"; 13: ?>

A szemely osztlyt a 2. sorban definiltuk, mely kt adattagot hatroz meg az objektumok szmra: nev s eletkor. Az adattagok deklarlshoz a var kulcsszt hasznltuk, majd kezdeti rtket rendeltnk hozzjuk, mint ahogy ez ltszik a program 4. s 5. sorban, gy a ltrehozott objektumok adattagjai felveszik ezeket az rtkeket a pldnyostskor. Az objektum adattagjait a -> opertor segtsgvel rhetjk el (8. sor), s ennek segtsgvel rtket is adhatunk nekik (10. s 11. sor).

6.2.3 Tagfggvnyek (metdusok)


A metdusok fggvnyek egy osztlyban, amelyek mveleteket hajtanak vgre egy objektumban. Ezeket a fggvnyeket teht az sszes pldnyban elrhetjk s meghvhatjuk. A kvetkez plda a szemely osztlyunkat egy tagfggvnnyel bvti, melynek segtsgvel a szemly neve megjelenthet lesz:
01: <?php 02: class szemely 03: { 04: var $nev="Pter"; 05: var $eletkor=30; 06: function nev() //nev tagfggvny (metdus) ltrehozsa 07: {

45

08: print $this->nev; //a leend objektum nev adattagnak tartalmt rja ki 09: } 10: } 11: $obj=new szemely(); //pldnyosts 12: $obj->nev(); //tagfggvny meghvsa: kirja, hogy Pter 13: $obj->nev="Lszl"; 14: print "<br>"; 15: $obj->nev(); //tagfggvny meghvsa: kirja, hogy Lszl 16: ?>

A tagfggvnyt a 6. sorban definiltuk, s a 8. sorban a $this-szel a ksbbi pldnyra hivatkoztunk. A $this-> segtsgvel gyakorlatilag az objektumbl elrhetjk az objektum brmely rszt, gy mdosthatjuk az adattagok rtkeit, meghvhatunk metdusokat. Egy objektumnak lehet ugyanolyan nev adattagja, mint tagfggvnye, a zrjelek segtsgvel meg tudjuk klnbztetni ket.

6.2.4 Konstruktor
A konstruktor fogalma mr nem teljesen j, hiszen egy emltst mr tettnk rla az osztlyok s objektumok ltrehozsa rszben. Igen, ltrehozhat egy olyan fggvny, aminek ugyanaz a neve, mint az osztlynak, ezt hvjk konstruktornak (constructor). A pldnyostsnl a konstruktort hvjuk meg (ha nem hoztunk ltre az osztlyban, a PHP generl egy reset), azaz ennek a feladata, hogy ltrehozza (construct ~ felpt) a pldnyt. A konstruktornak lehetnek paramterei, nhny nyelvben az is megengedett, hogy tbb konstruktort definiljunk, melyek a bemen paramterek szmban vagy tpusaiban klnbznek. A PHP-ben nem lehet kt egyforma azonostj (nev) fggvnyt definilni, gy nem lehet kt konstruktort sem, viszont a fggvnyek fejezetben megtanultuk, hogyan kezelhetjk a vltoz szm paramtereket. A pldban ezt hasznljuk fel:
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: <?php class szemely { var $nev="Anonymous"; var $eletkor=0; var $cim=""; function szemely() //konstruktor { $paramszam=func_num_args(); if ($paramszam>0) $this->nev=func_get_arg(0); if ($paramszam>1) $this->eletkor=func_get_arg(1); if ($paramszam>2) $this->cim=func_get_arg(2); } function nev() { print "$this->nev<br>"; } function eletkor() { print "$this->eletkor<br>"; } function cim() { print "$this->cim<br>"; } }

46

27: $obj=new szemely(); //konstruktor meghvsa paramter nlkl (pldnyosts) 28: $obj->nev(); //kirja, hogy Anonymous 29: $obj->eletkor(); //kiirja, hogy 0 30: $obj->cim(); //nem r ki semmit 31: $obj=new szemely("Kiss Lszl",25,"7624 Pcs, Petfi u. 14."); 32: //konstruktor meghvsa paramterekkel 33: $obj->nev(); //kirja, hogy Kiss Lszl 34: $obj->eletkor(); //kirja, hogy 25 35: $obj->cim(); //kirja, hogy 7624 Pcs, Petfi u. 14. 36: ?>

Az adattagok definilsa a 2. sortl kezddik, ahol belltottuk a megfelel kezdrtkeket, azrt, hogy a konstruktor paramter nlkli hvsnl is mondjon valamit az objektum szmunkra. A konstruktor lersa a 7. sortl kezddik, a paramterek kezelshez felhasznltuk a func_num_args() s a func_get_arg() fggvnyeket. A komolyabb objektum-orientlt nyelvekben az adattagok s tagfggvnyek hozzfrsi jogait is megadhatjuk. Azokhoz az adattagokhoz, amelyeket privtnak definilunk, kvlrl nem frnk hozz (csak az objektumbl). Ilyenkor minden privt adattaghoz kszthetnk publikus (brhonnan hozzfrhet) tagfggvnyeket, amelyek segtsgvel bellthatjuk s lekrdezhetjk az adattagok tartalmt (ltalban a bellt metdusok neve a set szval, mg a lekrdez metdusok neve a get szval kezddik). A PHP-ben nincs ehhez hasonl hozzfrsi jogosultsg, azaz az adattagok s tagfggvnyek brhonnan elrhetk, de clszer rni olyan tagfggvnyeket, amelyek segtsgvel kezelni tudjuk az adattagokat. Az elbbi pldban ezrt rhattunk volna a nev, eletkor s cim adattagokhoz olyan metdusokat, amelyek segtsgvel rtkket bellthatjuk. A konstruktor prja a destruktor (megsemmist) az objektum-orientlt nyelvekben, feladata az objektum megszntetse. A PHP-ben nincs destruktor, gy ha meg akarunk szntetni egy objektumot, meg kell rnunk hozz a kdot (felhasznlva a krnyezeti vltozkat s az unset() fggvnyt).

6.2.5 rkls
Az objektumkzpont szemllet egyik nagyon fontos jellemzje, hogy n. osztlyhierarchit pthetnk fel az rkls segtsgvel. Az rkls sorn a gyermekobjektumok rklnek minden tulajdonsgot s metdust szljktl, de definilhatnak jakat is. Nzznk egy egyszer pldt az rklsre:
01: <?php 02: class szemely 03: { 04: var $nev; 05: function szemely($neve="Anonymous") //konstruktor 06: { 07: $this->nev=$neve; 08: } 09: function nev() 10: { 11: print "$this->nev<br>"; 12: } 13: } 14: class dolgozo extends szemely //a dolgozo osztly a szemely osztly leszrmazottja 15: {

47

16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:

} $obj=new szemely(); $obj->nev(); //Kirja, hogy Anonymous $obj=new dolgozo("Istvn"); $obj->fizetes=126500; $obj->nev(); //Kirja, hogy Istvn $obj->fizetes(); //Kirja, hogy 126500 ?>

var $fizetes; function fizetes() { print "$this->fizetes<br>"; }

A dolgozo osztlyt a szemely osztly leszrmazottjaknt vezettk be az extends kulcsszval a 14. sorban, majd egy j tulajdonsggal (fizetes) bvtettk a 16. sorban. gy minden szemlynek csak neve van, mg minden dolgoznak fizetse is. A fizets lekrdezshez rtunk egy fizetes() tagfggvnyt is (17. sor). A 24. sorban ltrehoztunk egy dolgozt Istvn nvvel. A dolgozo szrmaztatott osztlynak nem rtunk konstruktort, gy a szl osztly (szemely) konstruktora hvdik meg. Ha valamely fggvny (belertve a konstruktort is) nincs jradefinilva a gyermekosztlyban, akkor a hvskor a szlosztlyban tallhat hvdik meg. Megtehettk volna, hogy j konstruktort, s j nev tagfggvnyt runk.

6.2.6 Sokalaksg
Most pedig megnzzk, hogy hogyan lehet fellrni a szl tagfggvnyeit, s ezutn mgis elrni, valamint hogy hogyan lehet objektumokbl tmbt kpezni:
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: <?php class szemely { var $nev; var $fizetes; function szemely($neve="Anonymous") { $this->nev=$neve; } function setnev($neve) { $this->nev=$neve; } function getnev() { print "Szemly: $this->nev<br>"; } function setfizetes($fiz) { $this->fizetes=$fiz; } function getfizetes() { print "Fizetse: $this->fizetes<br>"; } } class munkaltato extends szemely //a munkaltato osztly a szemely osztly leszrmazottja { var $erkezes;

48

31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: meg 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75:

function getnev() { print "Munkltat: $this->nev<br>"; } function seterkezes($erk) { $this->erkezes=$erk; } function geterkezes() { print "rkezsi v: $this->erkezes<br>"; } } class alkalmazott extends szemely //az alkalmazott osztly a szemely osztly leszrmazottja { function getnev() { print "Alkalmazott: $this->nev<br>"; } function getszemelynev() { parent::getnev(); //a szlosztly nev tagfggvnyt hvja } } $obj[0]=new szemely("Lszl"); $obj[0]->setfizetes(137500); $obj[1]=new munkaltato("Pter"); $obj[1]->setfizetes(250000); $obj[1]->seterkezes(1992); $obj[2]=new alkalmazott("Gza"); $obj[2]->setfizetes(85000); foreach ($obj as $egyen) { $egyen->getnev(); if (get_class($egyen)==alkalmazott) $egyen->getszemelynev(); /*ha az egyen objektum az alkalmazott osztly pldnya, akkor meghvjuk az enev tagfggvnyt*/ $egyen->getfizetes(); if (get_class($egyen)==munkaltato) $egyen->geterkezes(); /*ha az egyen objektum a munkaltato osztly pldnya, akkor meghvjuk az erkezes tagfggvnyt*/ print "------------------<br>"; } ?>

Ebben a pldban minden osztlyhoz megrtuk az adattagok belltshoz s lekrdezshez szksges metdusokat. A szemely osztlybl kt osztlyt is szrmaztattunk, a munkaltato (27. sor) osztlyt, s az alkalmazott (44. sor) osztlyt. A getnev() metdust jradefiniltuk a szrmaztatott osztlyokban (31, 47. sorok), s definiltunk jakat is (35, 39, 51. sorok). Az alkalmazott osztlyban elksztettnk egy olyan tagfggvnyt (getszemelynev()), amellyel meghvtuk a szl getnev() tagfggvnyt. Az 53. sorban a parent:: gondoskodik arrl, hogy elrjk a szl adott metdust. A parent a szl osztlyt nevezi meg, gy nem kell lerni annak a nevt. A 56. sortl kezdden hrom objektumot hoztunk ltre, s ezeket a $obj tmbbe helyeztk. A tmbt a ksbbiekben bejrtuk, s a tmbelem osztlytpusa szerint hvtuk

49

meg az objektumok tagfggvnyeit. Az objektum osztlynak meghatrozshoz a get_class() fggvnyt hasznltuk.

6.2.7 Objektumfggvnyek
A tblzatban a fontosabb objektumfggvnyeket foglaltuk ssze: Eredmny Fggvny call_user_method(string_1, string_2, , string_n, $object) Lers

$boolean = $string = $array = $array = $array = $array = $string = $boolean = $boolean =

A $object objektum metdusait hvja meg. A sztringek a metdusok nevei. call_user_method_array(string_1, Ha az objektumok egy tmbben string_2, , string_n, $array) vannak ($array-ben), akkor meghvhatjuk mindegyik (a sztringekkel meghatrozott) ugyanazon metdusait. class_exist($string) Logikai vlaszt ad arrl, hogy $string nev osztly ltezik e. get_class($object) Megadja a $object osztlyt. get_class_methods($string) Egy tmbbe tlti a $string nev osztly metdusait. get_class_vars($string) Egy tmbbe tlti a $string nev osztly adattagjait. get_declared_classes() Egy tmbbe tlti a deklarlt osztlyokat. get_object_vars($object) Egy tmbbe tlti a $object objektum adattagjait. get_parent_class($string) A $string nev osztly szlosztlyt adja meg. is_subclass_of($object, $string) Logikai vlaszt ad arrl, hogy a $object szlosztlya e a $string nev osztly. method_exist($object, $string) Logikai vlaszt ad arra, hogy ltezik e a $object objektumnak $string nev metdusa.

Ezeknek a fggvnyeknek a hasznlatt is egy pldn keresztl mutatjuk be:


01: <?php 02: class szemely 03: { 04: var $nev="Anonymous"; 05: function szemely($neve) 06: { 07: $this->nev=$neve; 08: } 09: function nev() 10: { 11: print "Szemly: $this->nev<br>"; 12: } 13:

50

14: } 15: class dolgozo extends szemely /*a munkaltato osztly a szemely 16: osztly leszrmazottja*/ 17: { 18: var $fizetes; 19: function nev() 20: { 21: print "Dolgoz: $this->nev<br>"; 22: } 23: function fiz($fiz) 24: { 25: $this->fizetes=$fiz; 26: } 27: function fizetes() 28: { 29: print "Fizetse: $this->fizetes<br>"; 30: } 31: } 32: $obj=new szemely("Lszl"); 33: call_user_method("nev",$obj); //ua, mint a $obj->nev(); 34: if (class_exists(dolgozo)) print "Van 'dolgozo' nev osztly.<br>"; 35: print "Az 'obj' objektum osztlya: ".get_class($obj)."<br>"; 36: 37: function kiir($lista) 38: { 39: foreach($lista as $kulcs=>$ertek) 40: { 41: print $kulcs.": ".$ertek."<br>"; 42: } 43: } 44: 45: $lista=get_class_vars(szemely); //list tmbbe tlti a ltez adattagok neveit 46: print "A 'szemely' osztly adattagjai: <br>"; 47: kiir($lista); 48: $lista=get_class_methods(dolgozo); //list tmbbe tlti a ltez metdusok neveit 49: print "A 'dolgozo' osztly metdusai: <br>"; 50: kiir($lista); //kirja a szemely s a dolgozo metdusokat (konstruktorokat) is 51: $lista=get_declared_classes(); 52: print "A deklarlt osztlyok: <br>"; 53: kiir($lista); //a PHP-ben ltez osztlyok is megjelennek 54: $lista=get_object_vars($obj); 55: print "Az 'obj' objektum adattagjai: <br>"; 56: kiir($lista); 57: print "A 'dolgozo' osztly szlosztlya: ".get_parent_class(dolgozo)."<br>"; 58: $obj=new dolgozo("Pter"); 59: if (is_subclass_of($obj,"szemely")) 60: print "Az 'obj' objektum eldosztlya a 'szemely' osztly.<br>"; 61: if (method_exists($obj,"dolgozo")) 62: print "Az 'obj' objektum tartalmaz 'dolgozo' metdust."; 63: ?>

51

7 rlapok
Eddigi programjainkbl egy fontos dolog hinyzott: nem tettk lehetv, hogy a felhasznl ltal megadott adatokkal dolgozzon a program, vagy hogy a felhasznl mdosthassa az adatokat. Ahhoz, hogy ezt a felhasznl megtehesse, egy felletet kell szmra biztostani. A Vilghln alapveten a HTML rlapokon keresztl ramlik az informci a felhasznl s a kiszolgl kztt. A PHP-t gy terveztk, hogy a kitlttt HTML rlapokat knnyen fel tudja dolgozni. Mieltt azonban rtrnnk az rlapok hasznlatra, meg kell ismerkednnk nhny lehetsggel, ugyanis informcit a felhasznlrl nem csak rlapok segtsgvel kaphatunk.

7.1 Globlis s krnyezeti vltozk


A globlis vltozkat a program legfels szintjn talljuk, s a fggvnyeken bell is hasznlhatjuk ket. A PHP rendelkezik egy $GLOBALS tmbbel, ami tartalmazza pldul a programban definilt vltozkat, s az n. krnyezeti vltozkat is. A pldaprogram a $GLOBALS tmb elemeit listzza ki:
01: 02: 03: 04: 05: 06: 07: <?php $nev="Pter"; foreach ($GLOBALS as $kulcs=>$ertek) { print $kulcs." = ".$ertek."<br>"; } ?>

A listban megtallhatjuk az ltalunk bevezetett $nev vltozt a Pter rtkvel, a tmb kilistzshoz felhasznlt $kulcs s $ertek vltozkat rtkkkel, s lthatunk sok, elsre ijesztnek tn nevet is. A PHP nhny krnyezeti vltozja: Vltoz $HTTP_GET_VARS $HTTP_POST_VARS $HTTP_REFERER $HTTP_USER_AGENT $PHP_SELF $QUERY_STRING $REMOTE_ADDR $REQUEST_METHOD Lers Az rlap mezinek neve s rtke a GET krelemnl (asszociatv tmb). Az rlap mezinek neve s rtke a POST krelemnl (asszociatv tmb). Az oldal cme, amelyrl a krs rkezett. Az gyfl bngszjnek neve s verziszma. nev=peter kor=32 nev=peter kor=32 http://www.proba.hu/index. html Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322) /proba.php Plda

Az ppen fut program elrsi tja s neve. A GET krelmeknl az URL- nev=peter&kor=32 hez kapcsolt adat. Az gyfl IP cme. 195.199.26.252 A krelem mdja: GET vagy GET POST.

52

$REQUEST_URI

A krelem teljes cme.

/proba/urlap.php? nev=peter&kor=32

A tblzatban szerepl vltozk elg informcit tudnak adni egy felhasznlrl, vagy nagy mrtkben tudjk a mi munknkat segtni. A PHP ltrehoz mg egyb krnyezeti vltozkat is, melyeknek szintn meg van a szerepk.

7.2 rlap ltrehozsa


Ksztsnk el egy olyan egyszer rlapot, amely egy beviteli mez segtsgvel bekri a felhasznl nevt, majd egy gombra kattintva ksbb megjelenti. Az rlap-fjl (nev.htm):
01: <html> 02: <head> 03: <title>Egyszer rlap</title> 04: <meta http-equiv="Content-Type" content="text/html; charset=iso8859-2"> 05: </head> 06: <body> 07: <form action="nevf.php" method="POST"> 08: <p>Adja meg a nevt: <input type="text" name="nev"></p> 09: <input type="submit" value="Mehet"> 10: </form> 11: </body> 12: </html>

Mint lthat, az rlapot a HTML kdban a <form> s a </form> hatrolja. E kt tag kz kell elhelyeznnk az rlapelemeket, amelyek lehetnek szveges beviteli mezk, listk, rdigombok, elkld (submit) gombok, stb. A 8. sorban egy beviteli mezt lthatunk, melynek azonostja nev, a 9. sorban pedig egy elkld gombot, melynek rtke a Mehet (ez a gomb felirata), s feladata az rlap tovbbtsa a megadott helyre. A 7. sorban lthat, hogy az rlap az rtkeket POSTmdszerrel tovbbtja a clfjlnak (nevf.php), melyet az action-nel hatroztuk meg. A POST mind nagy rtkekkel, mind az rtkek hossz listjval mkdik. Ha egy rlapot a GET-mdszerrel kldnk el, akkor annak mezi s azok rtkei (URL kdolsban) hozzfzdnek ahhoz a cmhez (URL-hez), ahov az rlapot kldjk. Az rtkek ekkor elrhetk lesznek a kiszolgl, illetve az ltala futtatott programok szmra. A krs pldul a kvetkezkppen nzne ki, ha a fenti pldban a POST helyett GET szerepelne:
http://localhost/nevf.php?nev=Kiss+Pista

Minden mez nevt egy = jel vlasztja el annak rtktl, a nv-rtk prokat pedig & jelek hatroljk. A PHP visszafejti a jeleket, a tallt adatokat a $HTTP_GET_VARS asszociatv tmbben teszi elrhetv a program szmra, valamint az rlapelemek nevvel azonos nev globlis vltozkat ltrehoz a megfelel tartalommal, fggetlenl a krelem tpustl. A nev nev GET vltozhoz az albbi kt mdon frhetnk hozz:
$HTTP_GET_VARS["nev"]; $nev;

A GET lekrsek szerencsre nem csak rlapokkal kapcsolatban hasznlhatk, knnyen kszthetnk mi is ilyen karakterlncokat, gy a fontos adatokat knnyedn tovbbthatjuk laprl lapra.

53

Az adatok feldolgozsnak vagy trolsnak megvalstsa a clfjl, ebben az esetben a nevf.php feladata lesz. A feldolgozshoz mr szksges a PHP, mg magt az rlapot ler fjl tisztn HTML-kdot tartalmaz. Nzzk a nevf.php fjlt, aminek a feladata, hogy a bert nevet megjelentse:
01: <?php 02: print "Az n neve: $nev"; 03: ?>

Az rlapelemek neveibl PHP vltozk lesznek, gy a nev name-paramtervel megadott beviteli mez tartalma egy $nev vltozba kerlt. Semmi ms dolgunk nem volt, mint kiratni a bngszbe a $nev vltoz tartalmt (2. sor). Nzznk egy msik pldt: Adjuk meg a msodfok egyenlet megoldsait a felhasznl ltal megadott egytthatk segtsgvel! Az rlap-fjl (masod.htm):
01: <html> 02: <head> 03: <title>A msodfok egyenlet megoldsai</title> 04: <meta http-equiv="Content-Type" content="text/html; charset=iso8859-2"> 05: </head> 06: <body> 07: <form action="masodf.php" method="POST"> 08: Adja meg az egytthatkat: <br><br> 09: <input type="text" name="a"> *x*x + 10: <input type="text" name="b"> *x + 11: <input type="text" name="c"> = 0<br><br> 12: <input type="submit" value="Megolds"> 13: </form> 14: </body> 15: </html>

A feldolgozst vgz fjl (masodf.php):


01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: <?php $d=$b*$b-4*$a*$c; if ($a==0) if ($b==0) print "Nincs megolds"; else { $x=-$c/$b; print "Megolds:<br>x = "; printf("%.3f",$x); } else { if ($d<0) { $d=$d*(-1); $e=-$b/(2*$a); $f=sqrt($d)/(2*$a); print "Megoldsok:<br>x1 = "; printf("%.3f",$e);print " + "; printf("%.3f",$f); print " * i<br>x2 = "; printf("%.3f",$e);print " - "; printf("%.3f",$f);print " * i"; }

54

25: else 26: { 27: 28: 29: 30: 31: 32: 33: } 34: } 35: ?>

$x1=(-$b+sqrt($d))/(2*$a); $x2=(-$b-sqrt($d))/(2*$a); print "Megoldsok:<br>x1 = "; printf("%.3f",$x1); print "<br>x2 = "; printf("%.3f",$x2);

Itt a feldolgozs mr bonyolultabb volt, mint az elz esetben, de jl ltszik, hogy a hrom vltoz a $a, a $b, s a $c a beviteli mezk neveibl keletkeztek. A printf() fggvnnyel a kapott lebegpontos szmokat fixpontosan ratjuk ki 3 tizedesjegyet megjelentve.

7.3 rlapelemek hasznlata


Itt az ideje, hogy elksztsnk egy komplett rlapot, amely felhasznlja valamennyi rlapelemet. Az rlap szintn a felhasznl adatait prblja megtudni, de a szveges beviteli mez mellett a rdigombok, listk, s egyb elemek is elfordulnak rajta. Az rlap-fjl (urlap.htm):
01: <html> 02: <head> 03: <title>rlapelemek hasznlata</title> 04: <meta http-equiv="Content-Type" content="text/html; charset=iso8859-2"> 05: </head> 06: <body> 07: <form action="urlapf.php" method="POST" target="_blank"> 08: <p>Adja meg a nevt: <input type="text" name="nev"></p> 09: <p>Adja meg a nemt: <br> 10: <label> 11: <input name="nemcsop" type="radio" value="N" checked> 12: N 13: </label> 14: <label> 15: <input name="nemcsop" type="radio" value="Frfi"> 16: Frfi 17: </label> 18: </p> 19: <p>Adja meg az letkort: 20: <select name="eletkor"> 21: <option>0-12</option> 22: <option>13-17</option> 23: <option selected>18-24</option> 24: <option>25-29</option> 25: <option>30-39</option> 26: <option>40-49</option> 27: <option>50-59</option> 28: <option>60-</option> 29: </select></p> 30: <p>Adja meg a kontinenst: <br> 31: <label> 32: <input name="kontcsop" type="radio" value="Eurpa" checked> 33: Eurpa 34: </label>

55

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: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79:

<br> <label> <input name="kontcsop" type="radio" value="szak-Amerika"> szak-Amerika </label> <br> <label> <input name="kontcsop" type="radio" value="Dl-Amerika"> Dl-Amerika </label> <br> <label> <input name="kontcsop" type="radio" value="zsia"> zsia </label> <br> <label> <input name="kontcsop" type="radio" value="Afrika"> Afrika </label> <br> <label> <input name="kontcsop" type="radio" value="Ausztrlia"> Ausztrlia </label> </p> <p>Adja meg az rdekldsi krt:<br> (tbbet is vlaszthat a CTRL lenyomsval)<br> <select name="erdeklodes[]" multiple> <option>Befektetsek</option> <option>Sportok</option> <option>Mvszetek</option> <option>Gygyszat</option> <option>Jog</option> <option>Oktats</option> <option>Jrmvek</option> <option>Szmtgpek</option> <option>Mobiltelefonok</option> </select></p> <p>Az adataim megfelenek a valsgnak: <input type="checkbox" name="megfelel" value="igen"></p> <input type="submit" value="Mehet"> </form> </body> </html>

A nem s a kontinens kivlasztshoz rdigombokat hasznltunk. Ezek rdigombok ltalban egy csoportot alkotnak, s a csoportbl mindig csak egy vlaszthat ki (a checked tulajdonsg jelzi azt, hogy kezdetben melyik van kivlasztva). A name tulajdonsg rtke (nemcsop s kontcsop) lesz a vltoz neve, ami tartalmazza a kivlasztott rtket (a value tulajdonsg rtkt). Az letkor kivlasztshoz egy listt hasznltunk (20. sor), a ksbb ltrejv $eletkor vltoz valamelyik <option> s </option> kztti rszt fogja tartalmazni. Az rdekldsi kr egy olyan lista (63. sor), amelybl tbb elem kivlaszthat (multiple), neve az erdelkodes[], jelezve, hogy ebbl egy tmb keletkezik. Ennek tartalmt ksbb egy foreach segtsgvel ratjuk ki. Vgl az rlap aljn a vlaszok megerstsre szolgl jellt (checkbox) lthatunk, melynek ksbb az llapott vizsgljuk meg (kipipltuk vagy sem).

56

A kd megjelentse a bngszben:

A PHP-fjl (urlapf.php):
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: <?php if ($nev=="") print "<h3>Nem adta meg a nevt!</h3>"; elseif (!isset($erdeklodes)) print "<h3>Nem adta meg az rdekldsi krt!</h3>"; elseif (!isset($megfelel)) print "<h3>Nem hitelestette adatait!</h3>"; else { print "<h3>n a kvetkez adatokat adta meg:</h3>" ."<b>Nv: </b>".$nev."<br>" ."<b>Neme: </b>".$nemcsop."<br>" ."<b>letkora: </b>".$eletkor."<br>" ."<b>Kontinens: </b>".$kontcsop."<br>" ."<b>rdekldsi kre:</b><br>"; foreach ($erdeklodes as $kor) {

57

18: 19: } 20: } 21: ?>

print $kor."<br>";

A programunk mr tartalmaz nmi ellenrz rszt is: az rlap kitltttsgt ellenriztk le (2-7. sor). A ksbbi fejezetekben lthatunk pldt egyb rlapelemekre, s az adatok fjlban ill. adatbzisban trolsra is. A PHP kd eredmnye:

7.4 rlap s PHP kd egy oldalon


A clunk az, hogy egy olyan oldalt ksztsnk, amely tartalmazza egyrszt az rlapot, msrszt a feldolgozst is megvalstja. Ez csak gy lehetsges, hogy az rlap-fjl tartalmazza a PHP kdot, s nmagt hvja meg. A pldaprogram egy szmkitalls jtk, 1 s 100 kztti egsz szmot kell kitallni maximum 10 lpsbl.
01: <html> 02: <head> 03: <title>Szmkitalls jtk</title> 04: <meta http-equiv="Content-Type" content="text/html; charset=iso8859-2"> 05: </head> 06: <body> 07: <?php 08: if (isset($szam)) 09: { 10: if ($db==10 || $szam==$aszam) 11: { 12: print "<h3>"; 13: if ($szam!=$aszam) 14: print "Sajnos n nem tudta kitallni a szmot 15: 10 prblkozssal!";

58

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:

else

print "n kitallta a szmot $db prblkozssal!"; print "</h3>"; unset($szam); print "<a href=$PHP_SELF>j jtk</a>"; die(); } else {

print "<h3>"; if ($szam<$aszam) print "Prblkozzon nagyobbal!"; else print "Prblkozzon kisebbel!"; print "</h3>"."<p>Prblkozsok szma: $db</p>"; $db++;

} } else { $aszam=rand(1,100); print "<h3>Adja meg a szmot:</h3>"; $db=1; } ?> <form action="<?php print $PHP_SELF."?db=".$db ?>" method="POST"> <p><input type="text" name="szam"></p> <input type="submit" value="Mehet"> <input type="hidden" name="aszam" value="<?php print $aszam ?>"> </form> </body> </html>

Az elgondolsunk az, hogy ha nincs a beviteli meznek rtke, azaz nincs kitltve (8. sorban vizsgljuk), akkor az azt jelenti, hogy most indul a jtk. Ekkor generlunk egy vletlen szmot ($aszam), s a szmllt ($db) 1-re lltjuk (34. s 36. sorok). Az elkld gombra kattintva a fjl nmagra hivatkozik a $PHP_SELF vltoz segtsgvel. Kapcsolt adat formjban kldjk tovbb a prblkozsok szmt tartalmaz szmllt (39. sor), s a kitalland szmot egy rejtett mez segtsgvel kldjk tovbb a ksbbi vizsglatok elvgzshez (42. sor). A szmllt minden j kitltsnl nveljk eggyel (29. sor), s megjelentjk a felhasznl szmra, hogy az ltala megadott szm nagyobb vagy kisebb e a kitallandnl (26. s 27. sorok). Ha eltalltuk a szmot, akkor kirjuk, hogy hny prblkozssal sikerlt (17. sor), majd a beviteli mez nevbl keletkezett vltozt ($szam) megszntetjk (19. sor), s a program futst meglltjuk a die() fggvnnyel (21. sor). A vltoz megszntetse a jtk jraindtshoz szksges. Ugyan ezt az utat jrjuk vgig, ha 10 lpsbl nem sikerlt kitallni a szmot, csak akkor a 'Sajnos n nem tudta kitallni a szmot 10 lpsbl!' szveg kiratsa utn szntetjk meg a vltozt, s lltjuk meg a programot.

59

8 Fjlok s knyvtrak
A fjlok szmtalan formtumban s funkciban fordulnak el a klnbz opercis rendszerekben, azonban elmondhat, hogy mindenhol az adattrols alapegysge. Szerencsre szmos programozsi nyelv mellett a PHP is biztost szmunkra lehetsget a fjl- ill. knyvtrkezelsre.

8.1 Knyvtrak
A PHP az opendir() knyvtr megnyitsa, readdir() knyvtr olvassa, closedir() megnyitott knyvtr bezrsa, s az is_dir() eldnti valamirl, hogy knyvtr e, fggvnyeket nyjtja a knyvtrak tartalmnak megjelentshez, mg az mkdir() j knyvtrat hoz ltre, az rmdir() pedig ltez knyvtrat trl.

8.1.1 Knyvtrak listzsa


Kt lehetsget mutatunk be a sok kzl erre a clra. Az els gy listzza a knyvtr tartalmt, hogy megjelenti a fjlok s knyvtrak nevt, s a knyvtrakhoz a [Dir] jelzst hozzteszi. A msik leszmolja, hogy hny darab fjl ill. knyvtr tallhat az aktulis knyvtrban. Nzzk az elst:
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: <?php $kvtnev="C:"; $kvt=opendir($kvtnev); while ($fajl=readdir($kvt)) { print "$fajl"; if (is_dir("$kvtnev/$fajl")) print " [Dir]"; print "<br>"; } closedir($kvt); ?>

Az egyetlen magyarzatra szorul sor a 4. sor. A while felttelben egy rtkads szerepel, ami azt jelenti, hogy a ciklus addig ismtel, amg sikeres az rtkads. A readdir() gy addig olvas a knyvtrbl a $fajl vltozba, amg van fjl a knyvtrban. A $fajl vltozrl pedig ksbb eldntjk az is_dir() fggvny segtsgvel (fggvnyparamternek abszolt elrsi tnak kell lennie), hogy knyvtr volt e (7. sor). A msodik megolds:
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: <?php $kvtnev="C:"; $kvt=opendir($kvtnev); while ($fajl=readdir($kvt)) { $tipus=filetype("$kvtnev/$fajl"); if (isset($melyik[$tipus])) $melyik[$tipus]++; else $melyik[$tipus]=0; } closedir($kvt); foreach ($melyik as $kulcs=>$ertek) { print $kulcs.": ".$ertek."<br>"; }

60

15: ?>

A 6. sorban tallhat filetype() fggvny sztringknt a fjl tpust adja vissza, ami a dir, file vagy link kzl valamelyik lehet. A klnbz tpusok szmt $melyik asszociatv tmbben troljuk (7. sor).

8.1.2 Egyb knyvtrfggvnyek


A dirname() fggvnybe a fjl elrsi tjt rva az elrsi t knyvtrrszt kapjuk, mg a basename() a maradkot, a fjlnevet eredmnyezi. A pathinfo() ugyanazt az informcit adja, mint a dirname() s a basename() sszekapcsolva. A realpath() a relatv tvonalat abszolt elrsi tt konvertlja.

8.2 Fjlok
A kvetkezkben megtudhatjuk, hogy hogyan kell egy ltez PHP fjlt begyazni egy msik PHP fjlba, hogyan lehet fjltulajdonsgokat megjelenteni, hogyan lehet fjlokat ltrehozni, olvasni, rni s trlni, valamint a fjlfeltltsrl is lesz sz.

8.2.1 Fjlok begyazsa


Az include() fggvny lehetsget ad arra, hogy fjlt gyazzunk be a PHP dokumentumokba. A fjlban szerepl PHP kd gy hajtdik vgre, mintha a fdokumentum rsze lenne, ami hasznos, ha egy tbboldalas programban kls kdokat szeretnnk begyazni. Msrszrl a tbbszr felhasznland rszeket clszer kln fjlokba elhelyezni, gy azokat brmikor, brmelyik fjlba knnyedn beilleszthetjk. Pl.: include("proba.php");

8.2.2 Fjlok listzsa attribtumokkal egytt


Ez a lehetsg azt mutatja meg, hogy hogyan fussunk vgig egy knyvtron bell a fjlokon a fjltulajdonsgok kiratsval:
01: <?php 02: $kvtnev="C:/"; 03: $kvt=opendir($kvtnev); 04: while ($fajl=readdir($kvt)) 05: { 06: fileinformaciok($kvtnev.$fajl); 07: } 08: closedir($kvt); 09: function fileinformaciok($f) 10: { 11: print "$f ".(is_file($f)?"":"nem")." fjl<br>"; 12: print "$f ".(is_dir($f)?"":"nem")." knyvtr<br>"; 13: print "$f ".(is_readable($f)?"":"nem")." olvashat<br>"; 14: print "$f ".(is_writable($f)?"":"nem")." rhat<br>"; 15: print "$f ".(is_executable($f)?"":"nem")." futtathat<br>"; 16: print "$f ".(filesize($f))." bjt mret<br>"; 17: print "$f utols megnyitsnak dtuma: ".date("Y.m.d H:i",fileatime($f))."<br>"; 18: print "$f utols mdostsnak dtuma: ".date("Y.m.d H:i",filemtime($f))."<br>"; 19: print "$f utols vltozsnak dtuma: ".date("Y.m.d H:i",filectime($f))."<br>"; 20: } 21: ?>

61

8.2.3 Fjlok ltrehozsa s trlse


Ha egy res fjlt szeretnnk ltrehozni, a touch() fggvnyt kell hasznlnunk. A paramterknt megadott fjlnv el az elrsi tvonalat is meg kell adnunk, ha nem az aktulis knyvtrban szeretnnk a fjlt ltrehozni. Ha a fjl mr ltezik, akkor az utols mdosts dtuma mdosul az utasts vgrehajtsi idejre. Pl.: touch("proba.txt"); Ltez fjlt trlni az unlink() fggvnnyel lehet. Az unlink() paramtere a fjl elrsi tja: Pl.: unlink("proba.txt"); A ltrehozs, trls, rs, olvass, mdosts csak akkor lehetsges egy fjlon, ha a megfelel jogosultsgokkal rendelkeznk.

8.2.4 Fjlok olvassa


A fjlokat szekvencilisan tudjuk olvasni s rni. A szekvencilis input fjt hromflekppen lehet a PHP-ben olvasni: bjtonknt, karakterenknt, soronknt. A kvetkez plda a fjl megnyitsa utn ezek mindegyikt bemutatja:
01: 02: 03: 04: 05: 06: 07: 08: 09: 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: <?php $fajl="proba.txt"; if (!file_exists($fajl)) { die("$fajl nem ltezik"); } else { kar($fajl); sor($fajl); bajt($fajl); } function kar($fa) { $f=fopen($fa,"r") or die("$fa nem nyithat meg"); print "A $fa fjl olvassa karakterenknt<br>"; while (!feof($f)) { $karakter=fgetc($f); print "$karakter"; } print "<br><br>"; fclose($f); } function sor($fa) { $f=fopen($fa,"r") or die("$fa nem nyithat meg"); print "A $fa fjl olvassa soronknt<br>"; while (!feof($f)) { $sor=fgets($f,1024); print "$sor<br>"; } print "<br>"; fclose($f); } function bajt($fa)

62

38: { 39: $f=fopen($fa,"r") or die("$fa nem nyithat meg"); 40: print "A $fa fjl olvassa 16 bjtonknt<br>"; 41: while (!feof($f)) 42: { 43: $reszlet=fread($f,16); 44: print "$reszlet<br>"; 45: } 46: print "<br>"; 47: fclose($f); 48: } 49: ?>

A 3. sorban a file_exists() fggvnnyel a fjl ltezst dntjk el. A karakterenknti olvasst a 13. sortl kezdve lthatjuk. A 15. sorban a fjlt megnyitjuk olvassra (r - read) az fopen() fggvnnyel, melynek eredmnye a $f fjlvltoz (a tovbbiakban ezzel dolgozunk). Ezek utn egy karaktert olvasunk a fjlbl az fgetc() fggvnnyel, amg a fjl vgre nem rnk (feof() logikai rtk fggvny, igaz rtket ad, ha a fjl vgre rtnk). A 25. sortl a soronknti olvasst lthatjuk, melyben jdonsg az fgets() fggvny. Jelen esetben ez egy sort vagy 1024 bjtot olvas a fjlbl. Vgl a 43. sorban a bjtonknti olvasshoz szksges fread() fggvny lthat, melynek paramtere a fjlvltoz s a bjtok szma.

8.2.5 Fjlok rsa


Fjlok rsnl ugyangy az fopen() fggvnyt hasznljuk, de a msodik paramtert "w"-re (write-ra) lltjuk, mg a hozzfzsnl "a"-ra (append-re). Abbl nem lehet problma, ha tbb felhasznl is ugyanazt a fjlt olvassa, de azt nem engedlyezhetjk, hogy valaki rjon egy fjlt, mg ms olvassa, vagy tbben ugyanazt a fjlt rjk. Ha egy fjlt rsra vagy hozzfzsre meg tudunk nyitni, akkor zroljuk, hogy ms felhasznl ne tudja addig rni, amg mi rjuk. A plda az rst s a hozzfzst mutatja be:
01: <?php 02: $fajlnev="proba.txt"; 03: print "$fajlnev fjlba rs<br>"; 04: if (!file_exists($fajlnev)) touch($fajlnev); 05: $fa=fopen($fajlnev,"w") or die("$fajlnev nem nyithat meg"); 06: flock($fa,2); //ms folyamatok nem olvashatjk s rhatjk ebben az idben 07: fwrite($fa, "Hell, vilg!\n"); 08: flock($fa,3); //zrols feloldsa 09: fclose($fa); 10: print "$fajlnev fjlhoz hozzfzs"; 11: $fa=fopen($fajlnev,"a") or die("$fajlnev nem nyithat meg"); 12: flock($fa,2); 13: fputs($fa,"Hell, Web!"); 14: flock($fa,3); 15: fclose($fa); 16: ?>

Egy proba.txt nev fjllal dolgozunk a pldaprogramban. A 4. sorban dntjk el, hogy ltezik e a fjl, ha nem akkor ltrehozzuk. Ha a fjl ltezett, akkor az rsnl elveszik korbbi tartalma. Az 5. sorban a fjlt megnyitjuk olvassra, majd a 6. sorban zroljuk az flock() utastssal. Az flock() msodik paramtere lehet 1, 2 s 3. Az 1-es jelentse, hogy ms folyamatok olvashatjk, de nem rhatjk. Ezt akkor hasznljuk, ha olvassuk a fjlt. A 2-es jelentse, hogy ms folyamatok nem olvashatjk s nem rhatjk. Ezt akkor

63

hasznljuk, amikor runk a fjlba. A 3-as feloldja a zrolst. A fjlba rshoz az fwrite() fggvnyt hasznljuk, melynek els paramtere a fjlvltoz, msodik paramtere jelen esetben egy string. A pldaprogram tovbbi rszben hozzfzzk a fjlhoz a Hell, Web! szveget az fputs() utastssal. Az fwrite() s az fputs() eredmnye ugyanaz, az fputs() az fwrite() aliasa.

8.2.6 Fjlok feltltse


Fjl feltltshez szksgnk lesz egy egyszer rlapra, s egy nem sokkal bonyolultabb PHP kdra:
01: <html> 02: <head> 03: <title>Fjl feltltse</title> 04: <meta http-equiv="Content-Type" content="text/html; charset=iso8859-2"> 05: </head> 06: <body> 07: <?php 08: $konyvtar="C:/munka/kepek"; 09: if(isset($uploadfile)) 10: /*ha kivlasztottuk a fjlt, akkor kirjuk az adatait*/ 11: { 12: print "Fjl: " . $uploadfile; 13: print "<br>Fjl neve: " . $uploadfile_name; 14: print "<br>Fjl mrete: " . $uploadfile_size; 15: print "<br>Fjl tpusa: " . $uploadfile_type; 16: } 17: else 18: { 19: print "<br>Adja meg a fjlt: "; 20: print "<form enctype=\"multipart/form-data\"" 21: ." action=$PHP_SELF method=\"post\">" 22: ."<input type=\"hidden\" name=\"MAX_FILE_SIZE\"" 23: ." value=\"200000\">" 24: ."<input type=\"file\" name=\"uploadfile\" size=\"40\">" 25: ."<br><input type=\"submit\" value=\"Feltlts\"></form>"; 26: } 27: if(is_uploaded_file($uploadfile)) 28: /*ha a Feltlts gombra rkattintottunk, akkor tmozgatjuk az ideiglenes knyvtrbl a fjlt a clknyvtrba*/ 29: { 30: if(move_uploaded_file($uploadfile,$konyvtar/$uploadfile_name)) 31: { 32: print "<br><br>Fjl feltltse sikerlt."; 33: } 34: else 35: { 36: print "<br><br>Fjl feltltse sikertelen."; 37: } 38: } 39: ?> 40: </body> 41: </html>

Az rlap megjelentse hasonl elven trtnik, mint a szmkitalls jtkban: ha nincs mg kivlasztva a fjl, akkor meg kell jelenteni az rlapot (9. sor). Az rlap a 20. sortl a 25. sorig tart, ahol lthatjuk, hogy a fjltvitelhez a form enctype="multipart/form-data" sor szerepel a HTML rszben, s a fjl nmagra fog hivatkozni a $PHP_SELF 64

vltozval. A fjl feltltshez szksges rlapelemet a 24. sorban talljuk, melynek neve uploadfile, gy ebbl a $uploadfile vltoz fog keletkezni. A maximlis fjlmretet (MAX_FILE_SIZE) belltjuk 200000 bjtra, s egy rejtett mez segtsgvel kldjk tovbb (22-23. sor). Ha kivlasztottuk a fjlt, akkor a fjl jellemzit megjelent rsz fut le (12-15. sor). A 27. sortl mr a zr lpsek lthatk: a fjl a clszerver ideiglenes fjlokat tartalmaz knyvtrba kerlt, s onnan el kell mozgatnunk a clknyvtrba (30. sor). Ha ez sikerl, akkor kszen vagyunk a feltltssel, ellenkez esetben valami hiba folytn vagy nem kerlt a fjl az ideiglenes fjlokat tartalmaz knyvtrba (pl. tl nagy a fjl), vagy nem lehet onnan elmozgatni.

65

9 Adatbzisok: MySQL
A PHP elnyei kz soroltuk, hogy rengeteg adatbzissal kpes dolgozni. Az adatbzisokhoz val csatlakozs, illetve azok kezelse a PHP-ben nagyon hasonl. A MySQL fejleszti azt a clt tztk ki, hogy egy praktikus, mindennapi hasznlatra alkalmas adatbzist fejlesszenek, amely biztostja a MySQL tovbbi sikeressgt. Tbb rv is a MySQL adatbzis mellett szl: Egyszer s gyors. Nylt forrskd. A kicsi s kzepes mret honlapokhoz idelis. A legtbb szolgltat a PHP-MySQL prost szokta nyjtani. A phpMyAdmin Database Manager egy olyan felletet nyjt, amely segtsgvel knnyen kezelhetjk a MySQL adatbzisainkat.

Termszetesen nem azt lltjuk, hogy a MySQL a legjobb adatbzis. Az adott feladat dnti el, hogy milyen adatbzist clszer vlasztani. Csupn megjegyeztk, hogy egy kzepes mret honlaphoz tkletes az egyszersge s gyorsasga miatt.

9.1 MySQL adattpusok


Ha adatbzisokban akarunk adatokat trolni, ugyangy figyelembe kell vennnk, hogy milyen adattpusokat hasznlhatunk. A kvetkez tblzatok a klnfle tpusokat tartalmazzk: a) Egsz szmok Tpus tinyint smallint mediumint int bigint decimal b) Lebegpontos szmok Tpus float double c) Sztringek Tpus char varchar tinytext text longtext mediumtext Hossz (bjt) 1 1 1 2 3 4 rtktartomny 1..255 1..255 1..255 1..65536 1..16777216 1..4294967295 Hossz (bjt) 4 8 rtktartomny 6 tzes helyirtk 15 tzes helyirtk Hossz (bjt) 1 2 3 4 8 vltoz rtktartomny -128..+127 -32768..+32767 -8388608..+8388607 -2147483648..+2147483647 17-tl 18 szmjegyig nincs korltozva

66

d)

Dtum is id Tpus Hossz (bjt) 3 8 4 3 1 Formtum -hh-nn -hh-nn :pp:mm hhnnppmm :pp:mm (1901-tl 2125-ig)

date datetime timestamp time year

Egyb tpusok is tallhatk a MySQL-ben, mint pldul az enum s a set, melyekrl most nem esik sz.

9.2 Kapcsolds a kiszolglhoz


Miutn teleptettk a MySQL-t szmtgpnkre, tvoli vagy helyi gpek felhasznli brmikor csatlakozhatnak hozz. A csatlakozshoz termszetesen felhasznlnvre s jelszra van szksg, s miutn sikerlt a csatlakozs sem biztos, hogy minden adatbzishoz hozzfrhetnk. A MySQL telepts kzben kr egy rendszergazda felhasznlnevet s jelszt. A ltogatkat azonban a ksbbiekben nem clszer a rendszergazda felhasznlnvvel s jelszval csatlakoztatni a MySQL-hez, mert a rendszergazdnak teljes jogosultsga van. A MySQL sikeres teleptse utn javasolt ltrehozni egy olyan felhasznlt, akinek csak a felttlenl szksges jogai vannak meg, majd ezzel csatlakoztatni az sszes ltogatt. A kapcsoldshoz a mysql_connect() fggvnyt hasznljuk, ami 3 paramtert vr: szervernv, felhasznlnv, jelsz. Ha nem adunk meg szervernevet, gy alaprtelmezetten a localhost-ot hasznlja. Az resen hagyott felhasznlnv helyre a Web-szerverfolyamat tulajdonosnak neve kerl, az resen hagyott jelsz helyre pedig res sztring. Ily mdon el is lehet hagyni mindent, ha a MySQL a gpnkn fut, s a honlap az egyedli honlap a gpen. Mi az sszes pldban megadjuk a paramtereket.
$kapcsolat=mysql_connect("localhost","felhasznalo","jelszo"); if (!$kapcsolat) die("Nem lehet csatlakozni a MySQL kiszolglhoz!");

A $kapcsolat vltozba mentjk a fggvny ltal visszaadott azonostt, hogy ksbb folytathassuk munknkat. Ha kapcsolat bontsra a mysql_close() fggvny szolgl.

9.3 Adatbzisok kivlasztsa, listzsa


Az adatbzis kivlasztshoz a mysql_select_db() utastst hasznljuk:
mysql_select_db("filmek",$kapcsolat) or die("Nem lehet megnyitni a filmek adatbzist: ".mysql_error());

A fggvny logikai rtket ad vissza, hamis logikai rtk esetn ellenriznnk kell, hogy ltezik e az adatbzis, illetve, hogy van e jogunk hozz. A mysql_error() fggvny segtsgvel jelenthetjk meg a hiba okt (a MySQL ltal legutoljra jelentett hibt adja vissza). A $kapcsolat paramter elhagyhat a legtbb fggvny esetben, az aktulis kapcsolat automatikusan behelyettestdik. Az ltez adatbzisok listzshoz a mysql_list_dbs() fggvnyt hasznljuk, ami egy eredmnyazonostval tr vissza, melyet a mysql_db_name() fggvnynek kell tadnunk, hogy az adatbzisok neveit megkapjuk. Az utbbi fggvny vr egy sorszmot is, ami az adatbzis sorszmt jelli. A plda a ltez adatbzisok neveit jelenti meg:

67

01: <?php 02: $felhasznalo="latogato"; 03: $jelszo="valami"; 04: $kapcsolat=mysql_connect("localhost",$felhasznalo,$jelszo); 05: if (!$kapcsolat) die("Nem lehet kapcsoldni a MySQL kiszolglhoz!"); 06: $adatbazisok=mysql_list_dbs(); 07: $adatbazisok_szama=mysql_num_rows($adatbazisok); 08: for ($i=0;$i<$adatbazisok_szama;$i++) 09: print mysql_db_name($adatbazisok,$i)."<br>"; 10: mysql_close(); 11: ?>

A 7. sorban tallhat mysql_num_rows() fggvny adja meg az adatbzisok szmt az eredmnyazonost segtsgvel. Ez a fggvny egy tbla sorainak szmt adja meg, gy a ksbbiekben mg hasznlni fogjuk. Az elbbi feladatot megoldhattuk volna mshogy is. Ha ismerjk az adatbzisok kiratshoz szksges SQL parancsot (SHOW DATABASES;), akkor ezt sztringknt tadva a mysql_query() fggvnynek (az SQL utastsok vgrl el kell hagynunk a pontosvesszt), megkapjuk az adatbzisok neveit. A mysql_query() fggvny tovbbtja az SQL-ben lert utastsokat a kiszolglhoz.
01: <?php 02: $felhasznalo="latogato"; 03: $jelszo="valami"; 04: $kapcsolat=mysql_connect("localhost",$felhasznalo,$jelszo); 05: if (!$kapcsolat) die("Nem lehet kapcsoldni a MySQL kiszolglhoz!"); 06: $eredmeny=mysql_query("SHOW DATABASES"); 07: while ($sor=mysql_fetch_row($eredmeny)) 08: print $sor[0]."<br>"; 09: mysql_close(); 10: ?>

A 6. sorban kiadtuk a parancsot a MySQL kiszolglnak, a kapott eredmny egy tbla formjban a $eredmeny vltozba kerlt. A tblt soronknt tudjuk olvasni az els sortl kezdden. Egy sor kiolvasshoz a mysql_fetch_row() fggvny szksges, amely a $sor tmbbe tlti a sorban tallhat adatokat. Mivel minden sor csak egy adatot tartalmaz (az aktulis adatbzis nevt), gy azt a $sor[0]-ban rjk el. A while ciklus addig fut, amg a mysql_fetch_row() tud j sort olvasni, azaz amg van sora a tblnak.

9.4 Adatbzisok tblinak listzsa


A tblanevek megjelentshez hasznlhatjuk a mysql_list_tables() PHP utastst, vagy adhatunk ki SQL parancsot (SHOW TABLES FROM adatbazisnev;), mint ahogy azt az elbb tettk. A pldaprogram szerkezete nagyon hasonlt az elzre:
01: <?php 02: $felhasznalo="latogato"; 03: $jelszo="valami"; 04: $kapcsolat=mysql_connect("localhost",$felhasznalo,$jelszo); 05: if (!$kapcsolat) die("Nem lehet kapcsoldni a MySQL kiszolglhoz!"); 06: $adatbazis="stone"; 07: mysql_select_db($adatbazis,$kapcsolat) or 08: die("Nem lehet megnyitni a(z) $adatbazis adatbzist: ".mysql_error());

68

09: 10: 11: 13: 14:

$tablak=mysql_list_tables($adatbazis,$kapcsolat); while ($sor=mysql_fetch_row($tablak)) print $sor[0]."<br>"; mysql_close(); ?>

9.5 Tblk mezinek listzsa


Az elbb eljutottunk odig, hogy egy adatbzis tblinak nevt meg tudtuk jelenteni, most a tblk mezinek nevre, s egyb tulajdonsgra vagyunk kvncsiak.
01: <?php 02: $felhasznalo="latogato"; 03: $jelszo="valami"; 04: $kapcsolat=mysql_connect("localhost",$felhasznalo,$jelszo); 05: if (!$kapcsolat) die("Nem lehet kapcsoldni a MySQL kiszolglhoz!"); 06: $adatbazis="stone"; 07: mysql_select_db($adatbazis,$kapcsolat) or 08: die("Nem lehet megnyitni a(z) $adatbazis adatbzist: ".mysql_error()); 09: $tabla="hir"; 10: $mezok=mysql_list_fields($adatbazis,$tabla); 11: $mezok_szama=mysql_num_fields($mezok); 12: print "<table border=1><tr><td>Mez</td><td>Tpus</td> 13: <td>Hossz</td><td>Flag-ek</td></tr>"; 14: for ($i=0;$i<$mezok_szama;$i++) 15: print "<tr><td>".mysql_field_name($mezok,$i)."</td> 16: <td>".mysql_field_type($mezok,$i)."</td> 17: <td>".mysql_field_len($mezok,$i)."</td> 18: <td>".mysql_field_flags($mezok,$i)."</td></tr>"; 19: print "<table>"; 20: mysql_close(); 21: ?>

A plda egy tbla mezinek nevt, tpust, hosszt, s flag-eit egy tblzatban jelentette meg. A szksges fggvnyek nagyon hasonltottak az elzekre, csak a fggvnynevekben a fields (mezk) sz szerepelt.

9.6 Tblk adatainak megjelentse


Az adatok lekrdezshez a SELECT * FROM tablanev; SQL parancsot hasznljuk a mysql_query() fggvnyben:
01: <?php 02: $felhasznalo="latogato"; 03: $jelszo="valami"; 04: $kapcsolat=mysql_connect("localhost",$felhasznalo,$jelszo); 05: if (!$kapcsolat) die("Nem lehet kapcsoldni a MySQL kiszolglhoz!"); 06: $adatbazis="stone"; 07: mysql_select_db($adatbazis,$kapcsolat) or 08: die("Nem lehet megnyitni a(z) $adatbazis adatbzist: ".mysql_error());; 09: $tabla="hir"; 10: $mezok=mysql_list_fields($adatbazis,$tabla); 11: $mezok_szama=mysql_num_fields($mezok); 12: $parancs="SELECT * FROM ".$tabla; 13: $eredmeny=mysql_query($parancs);

69

14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:

print "<table border=1><tr>"; for ($i=0;$i<$mezok_szama;$i++) print "<td>".mysql_field_name($mezok,$i)."</td>"; print "</tr>"; while ($sor=mysql_fetch_row($eredmeny)) { print "<tr>"; for ($i=0;$i<$mezok_szama;$i++) print "<td>".$sor[$i]."</td>"; print "</tr>"; } print "<table>"; mysql_close(); ?>

9.7 Adatbzis ltrehozsa s trlse


Adatbzis ltrehozshoz hasznlhatjuk a PHP mysql_create_db() utastst, vagy kiadhatjuk a CREATE DATABASE parancsot a kiszolglnak:
01: <?php 02: $felhasznalo="latogato"; 03: $jelszo="valami"; 04: $kapcsolat=mysql_connect("localhost",$felhasznalo,$jelszo); 05: if (!$kapcsolat) die("Nem lehet kapcsoldni a MySQL kiszolglhoz!"); 06: $adatbazis="forum"; 07: if (mysql_create_db($adatbazis)) 08: print "A(z) $adatbazis adatbzis sikeresen ltrehozva."; 09: else 10: print "A(z) $adatbazis adatbzist nem sikerlt ltrehozni: ".mysql_error(); 11: mysql_close(); 12: ?>

Adatbzis trlshez a mysql_drop_db() fggvnyt hasznlhatjuk a fentiekhez hasonl mdon, vagy a DROP DATABASE parancsot adhatjuk ki.

9.8 Tbla ltrehozsa s trlse


A tblk ltrehozshoz nincs kln PHP-fggvny, itt mindenkppen az CREATE TABLE parancsot kell hasznlnunk, miutn kivlasztottuk a megfelel adatbzist.
01: <?php 02: $felhasznalo="latogato"; 03: $jelszo="valami"; 04: $kapcsolat=mysql_connect("localhost",$felhasznalo,$jelszo); 05: if (!$kapcsolat) die("Nem lehet kapcsoldni a MySQL kiszolglhoz!"); 06: $adatbazis="forum"; 07: mysql_select_db($adatbazis,$kapcsolat) or 08: die("Nem lehet megnyitni a(z) $adatbazis adatbzist: ".mysql_error()); 09: $tabla="forumuser"; 10: $parancs="CREATE TABLE ".$tabla."(nev VARCHAR (30),fnev VARCHAR (30) 11: NOT NULL PRIMARY KEY,jszo VARCHAR(50),email VARCHAR (40))"; 12: if (mysql_query($parancs)) 13: print "A(z) $table tbla sikeresen ltrehozva."; 14: else

70

15: print "A(z) $table tblt nem sikerlt ltrehozni: ".mysql_error(); 16: mysql_close(); 17: ?>

A 10. sorban hoztunk ltre egy forumuser nev tblt 4 mezvel: nev, fnev, jszo, email. Mindegyik mez vltoz hosszsg szveget trolhat (rendre maximum 30, 30, 50, 40 karakterbl llt), az fnev az elsdleges kulcs. Tblk trlshez a DROP TABLE utastst hasznljuk:
$tabla="forumuser"; $parancs="DROP TABLE ".$tabla; if (mysql_query($parancs)) print "A(z) $table tbla sikeresen trlve. "; else print "A(z) $table tblt nem sikerlt trlni: ".mysql_error();

9.9 Adatok beszrsa


Ha mr sikerlt ltrehoznunk egy adatbzist egy tblval, akkor adatokat helyezhetnk el a tblban. Ahhoz, hogy az adatokat felvegyk, egy jabb SQL parancsra lesz szksgnk, az INSERT-re. A plda az elbb ltrehozott forum adatbzis forumuser tbljba szr be egy sort, azaz egy felhasznl adatait rgzti:
01: <?php 02: $felhasznalo="latogato"; 03: $jelszo="valami"; 04: $kapcsolat=mysql_connect("localhost",$felhasznalo,$jelszo); 05: if (!$kapcsolat) die("Nem lehet kapcsoldni a MySQL kiszolglhoz!"); 06: mysql_select_db("forum",$kapcsolat) or 07: die("Nem lehet megnyitni a forum adatbzist: ".mysql_error()); 08: $parancs="INSERT INTO forumuser(nev,fnev,jszo,email) 09: VALUES('Kiss Bla','bela','csigabiga','kissb@freemail.hu')"; 10: if (mysql_query($parancs)) 11: print "Az adatok sikeresen be lettek szrva az adatbzisba."; 12: else 13: print "Az adatokat nem lehet beszrni: ".mysql_error(); 14: mysql_close(); 15: ?>

Egy honlap esetben az adatokat termszetesen majd egy rlap segtsgvel fogjuk bekrni a felhasznltl. Amikor azonban a felhasznl adja meg az adatokat, elkerlhetetlen az adatok ellenrzse.

9.10 Adatok lekrdezse


Miutn rgztettnk adatokat az adatbzisban, ksbb vissza szeretnnk nyerni ket valamilyen formban. Egy tbla sszes sort mr sikerlt megjelentennk egy tblzatban, most egy olyan plda kvetkezik, amely eldnti, hogy van e 'bela' nev felhasznl a forum adatbzis forumuser tbljban:
01: 02: 03: 04: <?php $felhasznalo="latogato"; $jelszo="valami"; $kapcsolat=mysql_connect("localhost",$felhasznalo,$jelszo);

71

05: if (!$kapcsolat) die("Nem lehet kapcsoldni a MySQL kiszolglhoz!"); 06: mysql_select_db("forum",$kapcsolat) or 07: die("Nem lehet megnyitni a forum adatbzist: ".mysql_error()); 08: $parancs="SELECT * FROM forumuser WHERE fnev='bela'"; 09: $eredmeny=mysql_query($parancs) or 10: die("A parancsot nem lehet vgrehajtani: ".mysql_error()); 11: $sor=mysql_fetch_row($eredmeny); 12: if (isset($sor[0])) 13: print "Van bela nev felhasznl."; 14: else 15: print "Nincs bela nev felhasznl."; 16: mysql_close(); 17: ?>

A 9. sorban kiadtuk, azt az SQL parancsot, amely egy 'bela' nev felhasznl sszes adatt (a SELECT-ben a *-ot hasznltuk) egy eredmnytblba tlti. A tblnak egy sora van, ha ltezik 'bela' nev felhasznl (mert az fnev elsdleges kulcs), s a tblnak nincs egyetlen sora sem, ha nem ltezik 'bela' nev felhasznl. Ezutn a 11. sorban beolvastuk a $sor vltozba a tbla els sort. A 12. sorban azt dntttk el, hogy kerlt e valami a $sor tmbbe. Az eredmnytbla sorait a mysql_fetch_object() fggvnnyel is olvashatjuk, ami egy objektumot ad vissza, gy a mezket csak a nevk alapjn lehet elrni (pl.: $sor->nev). Ha a mezket indexk s nevk alapjn is el szeretnnk rni, akkor a mysql_fetch_assoc() utastst hasznljuk, ami egy asszociatv tmbbel tr vissza (ilyenkor rhatjuk: $sor[0] vagy $sor["nev"]).

9.11 Adatok frisstse


Az adatok frisstshez az UPDATE parancsot kell tadnunk a mysql_query() fggvny segtsgvel a kiszolglnak. A pldban mdostjuk 'bela' felhasznl jelszavt s e-mail cmt:
01: <?php 02: $felhasznalo="latogato"; 03: $jelszo="valami"; 04: $kapcsolat=mysql_connect("localhost",$felhasznalo,$jelszo); 05: if (!$kapcsolat) die("Nem lehet kapcsoldni a MySQL kiszolglhoz!"); 06: mysql_select_db("forum",$kapcsolat) or 07: die("Nem lehet megnyitni a forum adatbzist: ".mysql_error()); 08: $parancs="UPDATE forumuser SET jszo='kisbeka', 09: email='kissb@hotmail.com' WHERE fnev='bela'"; 10: if (mysql_query($parancs)) 11: print "Az adatok sikeresen mdostva lettek."; 12: else 13: print "A parancsot nem lehet vgrehajtani: ".mysql_error(); 14: mysql_close(); 15: ?>

Ha elhagyjuk az UPDATE parancs WHERE zradkt, akkor a mdosts a tbla sszes sorn vgrehajtdik (jelen esetben az sszes felhasznl jelszavt s e-mail cmt mdostja), ha pedig a felttelt tbb sor is kielgti, akkor azokon mind vgrehajtdik.

72

9.12 Adatok trlse


Gyakran elfordul, hogy az adatbzisban szerepl adatokat meg szeretnnk sznteti. Ehhez is egy SQL utasts szksges: a DELETE. A kvetkez plda trli a 'bela' nev felhasznlt, azaz a forumuser tbla egy sort:
01: <?php 02: $felhasznalo="latogato"; 03: $jelszo="valami"; 04: $kapcsolat=mysql_connect("localhost",$felhasznalo,$jelszo); 05: if (!$kapcsolat) die("Nem lehet kapcsoldni a MySQL kiszolglhoz!"); 06: mysql_select_db("forum",$kapcsolat) or 07: die("Nem lehet megnyitni a forum adatbzist: ".mysql_error()); 08: $parancs="DELETE FROM forumuser WHERE fnev='bela'"; 09: if (mysql_query($parancs)) 10: print "Az adatok sikeresen trlve lettek."; 11: else 12: print "A parancsot nem lehet vgrehajtani: ".mysql_error(); 13: mysql_close(); 14: ?>

Erre a parancsra is igaz az, hogy ha elhagyjuk a WHERE zradkot, akkor minden sorra rvnyes, azaz a tbla teljes tartalmt trli, egybknt csak azokat a sorokat, amelyek a WHERE utni felttelt kielgtik.

9.13 Plda: a hrek modul


Most egy olyan pldt mutatunk be, amely segtsgvel egy honlapon mindig friss hrek jelennek meg. A regisztrlt felhasznlknak biztostunk egy rlapot, amely segtsgvel elkldhetik a hreket, melyeket adatbzisban trolunk. A hreket feladsi id szerint cskken sorrendbe rendezve kiolvassuk az adatbzisbl, majd megjelentjk az oldalon. gy az oldal mindig friss lesz anlkl, hogy a honlap ksztjnek hozz kellene nylnia. A megoldshoz szksg lesz egy adatbzisra s kt tblra. Az egyik tblban a hreket troljuk aszerint, hogy melyik felhasznl adta fel, milyen tmban, milyen idpontban, s mi a hr szvege. A msik tblban troljuk azokat a felhasznlkat a nevkkel s jelszavukkal, akik hrt adhatnak fel. Nzzk meg elszr az adatbzist s a kt tblt ltrehoz kdot (abcreate.php):
01: <?php 02: $felhasznalo="latogato"; 03: $jelszo="valami"; 04: $kapcsolat=mysql_connect("localhost",$felhasznalo,$jelszo); 05: if (!$kapcsolat) die("Nem lehet kapcsoldni a MySQL kiszolglhoz!"); 06: $parancs="CREATE DATABASE hir"; 07: if (!mysql_query($parancs,$kapcsolat)) 08: print "Nem sikerlt ltrehozni a hir adatbzist: " 09: .mysql_error()."<br>"; 10: else 11: print "A hir adatbzis sikeresen ltrehozva!<br>"; 12: mysql_select_db("hir",$kapcsolat) or die("Nem lehet megnyitni a(z) 13: $adatbazis adatbzist: ".mysql_error()); 14: $parancs="CREATE TABLE hir(azon INT AUTO_INCREMENT PRIMARY KEY, 15: felado VARCHAR(30),tema VARCHAR(40),datum DATETIME,szoveg TEXT)"; 16: if (!mysql_query($parancs,$kapcsolat))

73

17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29:

print "Nem sikerlt ltrehozni a hir tblt: " .mysql_error()."<br>"; else print "A hir tbla sikeresen ltrehozva!<br>"; $parancs="CREATE TABLE hiruser(fnev VARCHAR(30) PRIMARY KEY, jszo VARCHAR(32))"; if (!mysql_query($parancs,$kapcsolat)) print "Nem sikerlt ltrehozni a hiruser tblt: " .mysql_error(); else print "A hiruser tbla sikeresen ltrehozva!"; mysql_close($kapcsolat); ?>

Az adatbzis-szerverhez val csatlakozst s az adatbzis kivlasztst egy kln fjlba tettk (adatbazis.php):
01: <?php 02: $felhasznalo="latogato"; 03: $jelszo="valami"; 04: $adatbazis="hir"; 05: $kapcsolat=mysql_connect("localhost",$felhasznalo,$jelszo); 06: if (!$kapcsolat) die("Nem lehet kapcsoldni a MySQL kiszolglhoz!"); 07: mysql_select_db($adatbazis,$kapcsolat) or die("Nem lehet megnyitni 08: a(z) $adatbazis adatbzist: ".mysql_error()); 09: ?>

Az hirek.php fjl feladata, hogy kiolvassa az adatbzisbl az t legfrissebb hrt, majd megjelentse a feladt, a tmt, s a hr szvegt, valamint ezen az oldalon tallhat link a hrfeladshoz, illetve a korbbi hrek megtekintshez:
01: <?php 02: print "<center><h2>Hrek</h3>"; 03: include("adatbazis.php"); 04: $eredmeny=mysql_query("SELECT felado,tema,datum,szoveg FROM hir 05: ORDER BY datum DESC"); 06: $i=0; 07: while ($i<5 && $hir=mysql_fetch_row($eredmeny)) 08: { 09: $hir[3]=nl2br($hir[3]); //a sortrs-jeleket <br> tag-ekre cserljk 10: print "<table border=1 width=400><tr><td><b>Felad: </b>".$hir[0] 11: ."<br><b>Tma: </b>".$hir[1]."</td><td width=150 align=right>" 12: .$hir[2]."</td></tr></table><table border=1 width=400><tr><td>" 13: .$hir[3]."</td></tr></table><br>"; 14: $i++; 15: } 16: mysql_close($kapcsolat); 17: print "<a href=khirek.php>Korbbi hrek</a><br> 18: <br><a href=login.htm>Hrfelads</a></center>"; 19: ?>

A korbbi hrek megjelentse (khirek.php):


01: 02: 03: 04: 05: 06: 07: 08: <?php print "<center><h2>Korbbi hrek</h3>"; include("adatbazis.php"); $eredmeny=mysql_query("SELECT felado,tema,datum,szoveg FROM hir ORDER BY datum DESC"); $i=0; while ($i<5 && $hir=mysql_fetch_row($eredmeny)) $i++; while ($hir=mysql_fetch_row($eredmeny))

74

09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:

} mysql_close($kapcsolat); print "<a href=login.htm>Hrfelads</a><br> <br><a href=hirek.php>Vissza</a></center>"; ?>

$hir[3]=nl2br($hir[3]); print "<table border=1 width=400><tr><td><b>Felad: </b>".$hir[0] ."<br><b>Tma: </b>".$hir[1]."</td><td width=150 align=right>" .$hir[2]."</td></tr></table><table border=1 width=400><tr><td>" .$hir[3]."</td></tr></table><br>"; $i++;

A bejelentkezshez szksges rlap (login.htm):


01: <html> 02: <head> 03: <title>Bejelentkezs</title> 04: <meta http-equiv="Content-Type" content="text/html; charset=iso8859-2"> 05: </head> 06: <body> 07: <form action="hurlap.php" method="post"> 08: <table> 09: <tr><td>Felhasznlnv:</td><td> 10: <input name="fh" type="text"></td></tr> 11: <tr><td>Jelsz:</td><td> 12: <input name="jsz" type="password"></td></tr> 13: </table> 14: <input type="submit" name="Submit" value="Belps"> 15: </form> 16: </body> 17: </html>

A hrfeladshoz szksges rlap (hurlap.php):


01: <html> 02: <head> 03: <title>Hr feltltse</title> 04: <meta http-equiv="Content-Type" content="text/html; charset=iso8859-2"> 05: <form action="hfeld.php?felado=<?php print $fh ?>" method="post"> 06: <?php 07: include("adatbazis.php"); 08: include("login.php"); 09: mysql_close($kapcsolat); 10: print "Felad: $fh<br>"; 11: ?> 12: Tma: <input name="tema" type="text"><br> 13: Hr:<br><textarea name="hir" cols="60" rows="10"></textarea><br> 14: <input type="submit" name="Submit" value="Felads"> 15: </form> 16: </body> 17: </html>

A ksbbiekben szksgnk lesz a felhasznl nevre, mert az adatbzisba mentjk, gy a kvetkez oldalra tovbbtjuk a $fh vltoz tartalmt, ahol majd felado nven rjk el (5. sor). A felhasznlnv s a jelsz helyessgt a login.php fjl ellenrzi (8. sor):
01: 02: 03: 04: <?php $eredmeny=mysql_query("SELECT jszo FROM hiruser WHERE fnev='$fh'"); $user=mysql_fetch_row($eredmeny); if ($user[0]!=md5($jsz))

75

05: { 06: print "Nem megfelel felhasznlnv/jelsz! 07: <br><a href=javascript:history.back()>Vissza</a>"; 08: die(); 09: } 10: ?>

A hr feltltst vgz fjl (hfeld.php):


01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: <?php if ($hir=="" || $tema=="") { print "Nem tlttte ki a szksges mezket! <br><a href=javascript:history.back()>Vissza</a>"; die(); } $datum=date("Y.m.d. H:i:s".time()); include("adatbazis.php"); $parancs="INSERT INTO hir(felado,tema,datum,szoveg) VALUES('$felado','$tema','$datum','$hir')"; if (!mysql_query($parancs,$kapcsolat)) { print "Nem lehet az adatbzisba rni! <br><a href=javascript:history.back()>Vissza</a>"; } else { print "A hrfelads sikeresen megtrtnt! <br><a href=hirek.php>Hrek megtekintse</a>"; } mysql_close($kapcsolat); ?>

A hrek feladsra jogosult felhasznlkat a honlap tulajdonosa hozza ltre. Kszthetnk egy ilyen egyszer kdot, amely ltrehozza pldul a 'bela' nev felhasznlt a 'csigabiga' jelszval (user.php):
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: <?php include("adatbazis.php"); $fnev="bela"; $jszo=md5("csigabiga"); //MD5 kdolst hasznlunk $parancs="INSERT INTO hiruser(fnev,jszo) VALUES ('$fnev','$jszo')"; if (!mysql_query($parancs,$kapcsolat)) print "Nem sikerlt ltrehozni a felhasznlt!"; else print "A felhasznl sikeresen ltrehozva!"; mysql_close($kapcsolat); ?>

76

10 Kpek
A honlapok soksznsgt a kpek nagyban biztostjk, gy elvrjuk, hogy egy nyelv klnbz formtum kpeket tudjon ltrehozni s manipullni. A PHP kpes GIF, JPEG, PNG, WBMP, PDF s SWF kimenetet produklni. Mindenkppen ajnlott, hogy a PHP dokumentcit tanulmnyozzuk a kpmanipull fggvnyek cmsz alatt, mert nhny fggvny elrshez tudnunk kell a PHP fordtsi s egyb belltsait. A kvetkezkben a kpek megjelentsrl, majd a klnbz formtum kpek ltrehozsrl, manipullsrl lesz sz.

10.1 Kpek listzsa


Az els pldaprogram megjelenti egy knyvtrban tallhat sszes kpet:
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: <?php $kvtnev="C:/munka/kepek"; $kvt=opendir($kvtnev); while ($fajl=readdir($kvt)) { if (is_file("$kvtnev/$fajl") && exif_imagetype("$kvtnev/$fajl")) print "<p><img src=$kvtnev/$fajl border=0></p>"; } closedir($kvt); ?>

A knyvtrat a $kvtnev vltozba mentettk el (2. sor), majd a knyvtr tartalmt kilistztuk egy while ciklus segtsgvel (4-8. sor). Ha a knyvtrbl kiolvasott (s a $fajl vltozba mentett) sztring egy fjlt jelent (6. sor), ami kp formtum, akkor azt megjelentettk a bngszben (7. sor). Az exif_imagetype() fggvny kiolvassa egy fjl fejlct, s ez alapjn eldnti, hogy kp formtum e (ha a fejlc egy lehetsges kpformtumot jelent, a fggvny az igaz logikai rtkkel tr vissza). A msodik pldaprogram egy knyvtrban tallhat kpek tulajdonsgait (fjlnv, fjlmret, valamint szlessg, magassg kppontokban megadva) rja ki a bngszbe:
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: <?php $kvtnev="C:/munka/kepek"; $kvt=opendir($kvtnev); while ($fajl=readdir($kvt)) { if (is_file("$kvtnev/$fajl") && exif_imagetype("$kvtnev/$fajl")) { $file[]["Nv"]=$fajl; $file[]["Fjlmret"]=filesize("$kvtnev/$fajl"); $size=getimagesize("$kvtnev/$fajl"); $file[]["Szlessg"]=$size[0]; $file[]["Magassg"]=$size[1]; } } closedir($kvt); foreach ($file as $info) { foreach ($info as $kulcs=>$ertek) { print $kulcs.": ".$ertek."<br>"; } print "<br>";

77

23: } 24: ?>

A 8. sortl kezdden lthat, hogy egy ktdimenzis tmbben troltuk kpfjlokbl nyert informcikat. A kp mrett a mr ismert filesize() fggvnnyel krdeztk le, mg a szlessgt illetve magassgt a getimagesize() fggvny segtsgvel tudtuk meg. A getimagesize() egy tmbt ad vissza, ahol a 0. indexnl a szlessg, az 1. indexnl pedig a magassg tallhat. Vgl bejrtuk a ktdimenzis tmbt az ismert mdon (16-23. sor).

10.2 Kpek ltrehozsa


A JPEG, GIF, PNG, WBMP formtum kpek ltrehozshoz s manipullshoz tartoz fggvnyek mind az image szval kezddnek, mg a pldul ClibPDF s SWFhez tartozk cpdf s swf kezdetek. A kvetkezkben a fontosabb image-fggvnyekrl lesz sz: Fggvny imagearc() imagefilledarc() imageellipse() imagefilledellipse() imagechar() imagecharup() imagestring() imagestringup() imagecolorallocate() imagecolordeallocate() imagecolorat() imagecolorclosest() imagecolorexact() imagegammacorrect() imagecolorset() imagecolortransparent() imagecolosforindex() imagecolorstotal() imagecopy() imagecopymerge() Lers Ellipszis mentn vonalat rajzol. Ha a kt paramter, a magassg s a szlessg egyenl, akkor krvet kapunk. Eredmnye az elz fggvnyvel megegyezik, majd az v elejt a vgvel sszektve kitlthetjk a terletet egy meghatrozott sznnel. Ellipszist rajzol, amennyiben a magassg egyenl a szlessggel, krt kapunk. Ellipszist rajzol, s maghatrozott sznnel kitlti. Vzszintesen r egy karaktert. Fgglegesen r egy karaktert. Vzszintesen r egy sztringet. Fgglegesen r egy sztringet. Sznt rendel egy kphez. Az els hozzrendelt sznt a httrre alkalmazza. Trli a sznhozzrendelst, gy jat adhatunk meg. Adott pixelben lev szn kdjt adja meg. RGB sznkdot fogad el, s a legkzelebb ll szn kdjt adja vissza. RGB sznt fogad el, s az adott szn kdjt adja vissza, vagy -1-et, ha nem tallja a sznt. Gamma-korrekcit hajt vgre egy kpen. Sznt llt be a skln. tltsznak llt be egy sznt (a GIF tmogatja). A megadott szn piros, zld s kk sszetevit egy tmbben adja vissza. A sznskla szneinek szmt adja vissza. Egy kp tglalap alak rszt egy clterletre msolja. Az elz fggvnyhez kpest mg megadhat, hogy a msolt rsz a clterletet milyen mrtkben fedje. 78

imagecopyresized() imagecopyresampled() imagecreate() imagecreatetruecolor() imagetruecolortopalette() imagecreatefromgif() imagecreatefromjpeg() imagecreatefrompng() imagecreatefromwbmp() imagegif() imagejpeg() imagepng() imagewbmp() imagedestroy() imagecreatefromstring() imagesetpixel() imageline() imagedashedline() imagerectangle() imagefilledrectangle() imagepolygon() imagefilledpolygon() imagesetbrush() imagesetthickness() imagefontheight() imagesfontwidth() imagettftext() imagettfbbox() imagefill() imagefilltoborder() imageinterlace() imagesx() imagesy()

Mkdse hasonl az imagecopy()-hoz, de tmretezi a kpet, ha a clterlet s a msolt rsz nem azonos mret. Mkdse hasonl az imagecopyresized()-hoz, de jra-mintavtelezi a kpet. Sznskla alap kpet (palettakpet) hoz ltre (8 bites szn). True color sznmlysg kpet hoz ltre (24 bites). True color kpet palettakpre konvertl. GIF fjlbl vagy URL-bl hoz ltre kpet. JPEG fjlbl vagy URL-bl hoz ltre kpet. PNG fjlbl vagy URL-bl hoz ltre kpet. WBMP (Windows Bitmap) fjlbl vagy URL-bl hoz ltre kpet. Elkldi a kpet a bngsznek, vagy GIF formtumban fjlba menti. Elkldi a kpet a bngsznek, vagy JPEG formtumban fjlba menti. Elkldi a kpet a bngsznek, vagy PNG formtumban fjlba menti. Elkldi a kpet a bngsznek, vagy WBMP formtumban fjlba menti. Eltvoltja a kpet a memribl. Kpet hoz ltre egy sztringben trolt kprl. Pontot rajzol. Egyenest rajzol kt pont kztt. Szaggatott vonalat rajzol. Tlalapot rajzol kt sarokpont kz (bal fels s jobb als). Kitlttt tlalapot rajzol. Sokszget rajzol egy tmbben meghatrozott pontok alapjn. Kitlttt sokszget rajzol. Ecset vlasztsa a vonalakhoz. Vonalvastagsg meghatrozsa. Egy bettpus magassgt adja vissza. Egy bettpus szlessgt adja vissza. TrueType bettpussal r szveget. Az imagettftext()-tel rt szveget hatrol tglalap mrett adja vissza. Az egsz kpet egy sznnel tlti ki. Meghatrozott sznnel tlt ki egy kpet a szn ltal meghatrozott keretig. Megadja, hogy az interlace-opci be van e kapcsolva a kpen, illetve segtsgvel be- vagy kikapcsolhatjuk. A kp szlessgt adja vissza. A kp magassgt adja vissza. 79

imagetypes()

A PHP ltal tmogatott kpformtumok listjt adja vissza.

Most pedig nzznk meg egy pldt nhny image-fggvny hasznlatra:


01: <?php 02: $image["Nev"]="celtabla.png"; 03: $image["Utvonal"]=$image["Nev"]; 04: $image["Kep"]=imagecreate(400,400); //a kpvltoz ltrehozsa 05: $feher=imagecolorallocate($image["Kep"],0xff,0xff,0xff); 06: $fekete=imagecolorallocate($image["Kep"],0,0,0); 07: $voros=imagecolorallocate($image["Kep"],0xff,0,0); 08: imagerectangle($image["Kep"],0,0,399,399,$fekete); 09: imagerectangle($image["Kep"],1,1,398,398,$fekete); 10: imagerectangle($image["Kep"],2,2,397,397,$fekete); 11: imagerectangle($image["Kep"],3,3,396,396,$fekete); 12: imagerectangle($image["Kep"],4,4,395,395,$fekete); 13: imagefilledellipse($image["Kep"],200,200,300,300,$fekete); 14: imagefilledellipse($image["Kep"],200,200,200,200,$feher); 15: imagefilledellipse($image["Kep"],200,200,100,100,$fekete); 16: $nyil=array(202,200,268,144,268,171,379,171,379,229,268,229,268,256); 17: imagefilledpolygon($image["Kep"],$nyil,7,$voros); 18: $betutipus="C:/Windows/Fonts/arial.ttf"; 19: $betumeret=20; 20: $szoveg="Ide clozzon!"; 21: $doboz=imagettfbbox($betumeret,0,$betutipus,$szoveg); 22: $hely=(400-$doboz[2])/2; //kzpre igaztjuk a szveget 23: imagettftext($image["Kep"],20,0,$hely,35,$voros,$betutipus, $szoveg); 24: imagepng($image["Kep"],$image["Utvonal"]); //ltrehozzuk a png fjlt 25: imagedestroy($image["Kep"]); 26: print "<img src=$image[Nev]>"; //megjelentjk a fjlt a bngszben 27: ?>

10.3 Kpek vltoztatsa


Ide sorolhatjuk a kpek szneit s mrett vltoztat fggvnyeket. rdemes vgiggondolnunk, mikor melyik kpformtumot clszer hasznlni. A GIF 8 bites sznt (256 klnbz szn), a JPEG 24 bites sznt hasznl. A GIF s a PNG pontos szneket trol, a JPEG viszont egy kzeltst trol, amely egyre pontatlanabb lesz, ha nveljk a tmrtst. Ha az imagejpeg()-et hasznljuk, s a minsgi paramtert (alaprtelmezett rtk a 100) 100-nl kisebbre lltjuk, vesztnk a sznhelyessgbl. A kpek tmretezsnl a nehzsget az optimlis kp ellltsa jelenti. A pixeles tmretezs az les vzszintes s fggleges vonalak esetben mkdik, ahol az j mret az eredetinek pros tredke. Egyb technikk az tls vonalakat s sznrnyalatokat rszestik elnyben. Kicsinyts utn az eredeti mretre nagytva a kpet, knny szrevenni, hogy az eredeti kp tiszta, les, egyenes vonalai egyenetlen grbkbe mennek t. A PHP kpek tmretezsre hasznlhat fggvnye az imagecopyresized(). Az jramintavtelezs segt az egyenetlensg eltntetsben, viszont elmosdott teszi a kpet. Az imagecopyresampled() fggvny szolgl a PHP-ben a kpek jbli mintavtelezssel trtn tmretezsre. A lenti pldaprogram a felhasznl ltal feltlttt kp kicsinytett mst kszti el, melyet megjelent az oldalon, s elkszti az eredeti kpre val hivatkozst.

80

Az rlap-fjl (kep.php):
01: <html> 02: <head> 03: <title>Kp feltltse</title> 04: <meta http-equiv="Content-Type" content="text/html; charset=iso8859-2"> 05: </head> 06: <body> 07: <?php 08: $konyvtar="C:/kepek"; 09: $kvt=opendir("$konyvtar/kicsi"); 10: $fajl=readdir($kvt); 11: $fajl=readdir($kvt); 12: while ($fajl=readdir($kvt)) 13: { 14: print "<a href=$konyvtar/nagy/$fajl target=_blank> 15: <img src=$konyvtar/kicsi/$fajl border=0></a><br>"; 16: } 17: closedir($kvt); 18: ?> 19: <form enctype="multipart/form-data" action="kepf.php" method="POST"> 20: Vlassza ki a kpet:<br> 21: <input type="file" name="fajl"><br> 22: <input type="hidden" name="MAX_FILE_SIZE" value="200000"><br> 23: <input type="submit" value="Feltlts"> 24: </form> 25: </body> 26: </html>

A feldolgozst vgz fjl (kepf.php):


01: <?php 02: $feltoltes_konyvtar="C:/kepek"; 03: if ($fajl_type=="image/gif" || $fajl_type=="image/pjpeg") 04: { 05: move_uploaded_file($fajl,"$feltoltes_konyvtar/nagy/$fajl_name") 06: or die("Nem lehet mozgatni!"); 07: if ($fajl_type=="image/gif") 08: $im=imagecreatefromgif("$feltoltes_konyvtar/nagy/ $fajl_name"); 09: else 10: $im=imagecreatefromjpeg("$feltoltes_konyvtar/nagy/ $fajl_name"); 11: $size=getimagesize("$feltoltes_konyvtar/nagy/$fajl_name"); 12: if ($size[0]>100) 13: { 14: $h=$size[0]/100; 15: $image=imagecreatetruecolor(100,$size[1]/$h); 16: imagecopyresized($image,$im,0,0,0,0,100,$size[1]/$h, 17: $size[0],$size[1]); 18: } 19: else 20: { 21: $image=imagecreatetruecolor($size[0],$size[1]); 22: imagecopy($image,$im,0,0,0,0,$size[0],$size[1]); 23: } 24: imageJPEG($image,"$feltoltes_konyvtar/kicsi/$fajl_name",255); 25: print "A kp feltltse sikeresen megtrtnt."; 26: print "<br><a href=kep.php>Vissza</a>"; 27: }

81

28: 29: 30: 31: 32: 33:

else { print "Nem GIF vagy JPEG formtum fjlt adott meg!"; print "<br><a href=kep.php>Vissza</a>"; } ?>

Miutn sikeresen feltltttk a kpfjlt (5. sor), eldntttk, hogy GIF vagy JPEG tpus kpet adott meg a felhasznl (7. sor), majd ennek megfelelen hoztuk ltre a $im kpvltozt (8. s 9. sor). Lekrdeztk az eredeti kp mrett, s ha a kp szlesebb volt, mint 100 kppont, kicsinytst hajtottunk vgre, gy egy pontosan 100 kppont szles 24 bites kpterletet ($image) ksztettnk (15. sor). A kapott terletre lekicsinytettk a $im vltozban tallhat teljes kpet az imagecopyresized() fggvnnyel (16. sor). Ha nem volt szksg a kicsinytsre, az eredeti kppel megegyez mret kpterletet ksztettnk (21. sor), majd oda tmsoltuk az eredeti kpet. Vgl JPEG formtumban mentettk a kpet (25. sor).

82

11 Session-k
A HTTP llapot nlkli protokoll. Ez azt jelenti, hogy ahny oldalt a felhasznl letlt kiszolglrl, annyi nll kapcsolat ltesl, radsul az egyes oldalakon bell a kpek, kls fjlok letltsre is kln kapcsolatok nylnak. A felhasznlk s a ksztk viszont krnyezetknt kezelnek egy weboldalt, amelyben egyetlen oldal is rsze egy nagyobb egsznek. Hogyan tovbbthatjuk teht adatainkat oldalrl oldalra, azaz hogyan valsthatjuk meg az informcitrolst? Tbb megolds is rendelkezsnkre ll, melyek kzl egyet mr ismernk: a GET tpus lekrdezst. A kifinomultabb lehetsgeknl emlthetjk meg a cookie-k (stik) s a session-k hasznlatt. A cookie-ban kis mennyisg adatot trol a felhasznl bngszje egy kiszolgl vagy egy program krsnek eleget tve. Minden cookie egy nevet, egy rtket, a lejrati idpontot, a kiszolglra s elrsi tra vonatkoz informcikat tartalmazza. Vegynk pldnak egy bevsrlkosr-szoftvert, amely a bevsrllistt cookie-ban trolja. Lesz olyan felhasznl, aki megvltoztatja a termkek rait a cookie-ban, lesz olyan, aki a kosara felt elhagyja, mert a cookie tllpi a bngszjben belltott 4 KB-os maximlis mretet. Olyan felhasznlk is lesznek, akik egyltaln nem tudnak vsrolni, mert letiltottk a cookie-kat. Ha cookie-kat hasznlunk, nem bzhatunk meg abban, ami a cookie-ban van. A session-k egy azonostt adnak a bngsznek s a kiszolglnak, hogy egy oldal lekrst ugyanabban a session-ben trtnt tbbi lekrshez kapcsoljk. A session a honlap tulajdonosnak s ltogatjnak is rengeteg hasznot nyjt. A tulajdonos - az elz pldnl maradva - megnzheti a ltogatk ltal keresett termkeket, gy tudja mivel clszer oldalt frissteni, valamint megtudhatja, hogy ki mit vsrolt. A ltogat pedig be tud jelentkezni, automatikusan a testre szabott profiljt hasznlhatja. A sessionazonostt szoktk cookie-ban trolni, de a session-khz nem felttlen kell cookie, s az azonostn kvl semmit nem trolnak benne. Ha a session-azonostt cookie-ban troljuk, mindig meg kell gyzdnnk arrl, hogy valdi e. A cookie-k segtsgvel tvol tarthatjuk a zavaros session-azonost sztringeket az URL-ektl, gy a ltogat felveheti az oldalt a kedvencek kz anlkl, hogy a session-azonost is belekerlne. Amikor egy ltogat a honlapunkon a kvetkez oldalra megy, keresnnk kell a bejv cookie-t annak a megllaptsra, hogy a bngszje be van e lltva a cookie-k fogadsra. Ha a ltogat kikapcsolta a cookie-kat, az URL-es megoldst hasznljuk.

11.1 PHP-szolgltatsok
A PHP-ben vannak beptett session-kezel szolgltatsok, melyek belltsait a php.ini fjl tartalmazza. Ezek a szolgltatsok a legtbb esetben mkdnek, ha azonban jobban akarjuk kontrolllni a session-ket, kikapcsolhatjuk ket. A kvetkez tblzatban nhny ilyen szolgltats szerepel: Szolgltats session.save_handler=files session.save_path=/tmp session.use_cookies=1 session.name=phpsessid Lers Alaprtelmezsben fjlban trolja a sessionket, az adatbzisban val trolshoz a files-t user-re kell megvltoztatni. Meghatrozza, hogy a PHP hova rja a sessionfjlokat. Bekapcsolja/kikapcsolja a cookie-kat. Az 1 a bekapcsolt, a 0 a kikapcsolt llapot. A cookie nevt adja. 83

session.auto_start=0

Bekapcsolja/kikapcsolja a session-k automatikus elindtst. session.cookie_lifetime=0 A cookie-k lettertamt hatrozza meg. Alapesetben addig futtatja a session-ket, amg a bngsz aktv. session.cookie_path=/ Meghatrozza, hogy a PHP hova rja a cookiekat. session.gc_probability=1 A PHP session-hulladkgyjtjt lltja be. Akrhnyszor egy oldalkrs PHP sessionkezel rutint indt el, a PHP ellenrzi, hogy szksg van e hulladkgyjtsre. Az 1-es rtk jelentse, hogy a hulladkgyjt 100 oldalanknt egyszer fusson. session.gc_maxlifetime=1440 Meghatrozza, hogy a session-rekord az utols hasznlat utn hny msodpercig rhet el. Az alaprtelmezs 1440 msodperc, azaz 24 perc. session.referer_check= Korltozza a felhasznlkat bizonyos oldalak elrsben, m az ellenrzs nem igazn megbzhat, mert az sem, hogy ki ltogatja az oldalt. session.entropy_file= Meghatroz egy kls fjlt, amely tovbbi adatokat biztost a session-azonost generl rutinnak. session.entropy_length=0 A kls fjlbl beolvasott bjtok szmt hatrozza meg, gy a 0 letiltja a kls fjlbl val beolvast. url_rewriter.tags="a=href,area= Meghatrozza, hogy melyik HTML tag kapja a href,frame=src,input=src,form= session-azonostt, amelyikben a cookie ki van fakeentry" kapcsolva.

11.2 Session-fggvnyek
A session-fggvnyekkel (munkamenet fggvnyekkel) manulisan lehet szablyozni a session-ket, gy a php.ini belltsait is. A kvetkez tblzat a fontosabb fggvnyeket tartalmazza: Fggvny session_decode() session_destroy() session_encode() session_get_cookie_params() session_id() session_is_registered() Lers A session-rekord manulis kikdolsra szolgl. Eltvoltja az adott session-hz kapcsold sszes adatot. A regisztrlt vltozkat a PHP-nek megfelel mdon kdolja. Visszaadja a session cookie paramtereit egy asszociatv tmbben (lifetime, domain, path, secure). Az aktulis session-azonostt adja vissza, s jat llt be. A sztringknt megadott vltoznvre igazat 84

session_module_name() session_name() session_register()

session_save_path() session_set_cookie_params() session_set_save_handler()

session_start() session_unregister() session_unset()

ad, ha a vltoz regisztrlva van a session-ben, hamisat, ha nem. Megadja, hogy a session.save_handler files-ra vagy user-re van e lltva, illetve jat llt be. A session.name ltal megadott session-nevet adja vissza, s jat llt be. A session-rekordban elmentsre kerl vltozkat regisztrlja, melyeket sztringknt kell megadni. Ha nem futattjuk a session_start()-ot, akkor a session_register() indtja el a session-t. A session-fjlok trolsnl hasznlt elrsi utat adja vissza, illetve jat llt be. Session cookie-t llt be. Adott knyvtrhoz adott cookie-kat llt be, s fellr cookie paramtereket. Az sszes - ltalunk megrt - session-rekord kezel fggvny nevt fogadja el, s regisztrlja ket a kdban val hasznlathoz, gy a PHP ezeket hasznlja majd a sessionkezelsre. Ha a session.save_handler user-re van lltva, azaz adatbzisba mentnk, akkor a session-rekord kezel fggvnyeket manulisan kell definilni. Elindt vagy folytat egy session-t. Eltvoltja a regisztrcis lista egy vltozjt. Minden regisztrlt vlozt megszntet. Megegyezik az session_unregister() lefutattsval az sszes regisztrlt vltozn.

11.3 Session indtsa


A session-ket mindig manulisan kell elindtanunk a session_start() fggvnnyel (vagy a session_register()-rel) kivve, ha a php.ini fjlban a session.auto_start-ot 1-re lltottuk. A munkamenet elindtsa utn a session_id() fggvnnyel lekrdezhetjk a generlt session-azonostt, s akr jat is megadhatunk. Keressk meg a session mentsi knyvtrat (session.save_path), s figyeljk meg, hogy minden session egy session-fjl formjban tallhat meg. A fjlok neve a sess_ karakterekkel kezddik, a fjlnv tovbbi rsze a session-azonost:
sess_11e4ac4f039606c194375fd192ca9685

11.4 Vltozk regisztrlsa


A vltozk munkamenetbe val regisztrlshoz a session_register() PHP-fggvnyt hasznljuk:
$szemely="Kiss Pista"; $kor=28; session_register("szemely","kor");

A regisztrls a session_register() hasznlatakor trtnik, de a vltozk tnylegesen akkor lesznek a session-rekordba rva, amikor a szkript vgre rnk. A szkript vgn a

85

vltozknak lteznik kell azzal az rtkkel, amit el akarunk menteni. Ezutn a sessionrekord minden vltozja a memriba kerl, regisztrlva lesz. A vltozkat nem kell minden szkriptben regisztrlni, amg a session tart, a vltozk regisztrlva maradnak. A vltozk elrshez azonban minden oldalnl meg kell hvnunk a session_start() fggvnyt. Ha regisztrltunk mr vltozkat, rdemes megtekinteni, hogy a PHP hogyan trolja a session-rekordot a session-fjlban:
szemely|s:10:"Kiss Pista";kor|i:28;

A vltoz neve utn | jel, majd a tpusa kvetkezik. Az i az egsz, a d a vals, a b a logikai, az s a sztring, az a a tmb, az o pedig az objektum. A : jel jelzi, hogy attribtum kvetkezik. A sztringnl az els attribtum a hossz, a msodik az rtk, az egsznl az egyetlen attribtum az rtk. A tmbknl a {} jelek a tmbn belli elemek definilsra szolglnak. Ha egy vltoz neve eltt a ! szerepel s nincsenek attribtumai, az azt jelenti, hogy a vltoznak nincsen rtke. Ha ellenrizni szeretnnk, hogy egy vltoz regisztrlva van e a munkamenetben, a session_is_registered() fggvnnyel tehetjk meg:
if (session_is_registered("szemely")) print "A szemly be van jegyezve."; else print "A szemly nincs bejegyezve.";

11.5 A regisztrlt vltozk s a session megszntetse


A session megszntetsre a session_destroy() fggvny alkalmas. Ez a fggvny a munkamenethez tartoz minden adatot trl, azaz trli a session-fjlt, de nem trli a globlis vltozkat s a session cookie-t. Ha kiadjuk a session_destroy() parancsot, utna mg elrhetk a regisztrlt vltozk, amg a bngsz fut, hiszen azok a memriban vannak. A session_unregister() PHP-fggvny trli a paramterknt megadott vltozkat a session-bl. Trlshez hasznlhatjuk a session_unset() parancsot is, amely minden bejegyzett munkamenet-vltozt felszabadt. Az sszes emltett fggvnyre igaz, hogy nem trli a megfelel globlis vltozkat, gy azokat az unset() fgvnnyel szntethetjk meg.

11.6 Session-fggvnyek hasznlata


A lenti pldaprogram az alapvet session-fggvnyek hasznlatt mutatja be. A session.php fjlban regisztrlt asszociatv tmbt a sessionf.php fjlban prbljuk meg elrni s tartalmt kiratni. A session.php fjl:
01: <?php 02: session_start(); //session indtsa 03: print "Session elindtva.<br>Session azanost: ".session_id()."<br>"; 04: $szemely=array("Nv"=>"Istvn","Szletsi id"=>"1956.10.03", 05: "Szletsi hely"=>"Keszthely"); 06: session_register("szemely"); 07: //a 'szemely' vltoz regisztrlsa a session-be 08: print "<br>Adatok:<br>"; 09: foreach($szemely as $kulcs=>$ertek) 10: { 11: print $kulcs.": ".$ertek."<br>"; 12: }

86

13: 14: 15: 16: 17: 18:

$kodolt=session_encode(); /*a regisztrlt vltozk kdolsa a PHP-nak megfelel mdon, az eredmny a $kodolt vltozba kerl*/ print "<br>Kdolva: ".$kodolt."<br><br> <a href=sessionf.php>Tovbb</a>"; ?>

A sessionf.php fjl:
01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: <?php session_start(); if (session_is_registered("szemely")) print "A 'szemely' vltoz regisztrlt!<br>"; session_decode($szemely); //a session-rekord-informcik kikdolsa print "<br>Az adatok:<br>"; foreach($szemely as $kulcs=>$ertek) { print $kulcs.": ".$ertek."<br>"; } session_unset(); // a regisztrlt vltozk megszntetse if (!session_destroy()) print "<br>A session-t nem sikerlt megszntetni!"; else print "<br>A session sikeresen megszntetve!"; //a session-hz tartoz adatok eltvoltsa ?>

11.7 Plda: a frum modul


A kvetkezkben egy egyszer frum-szoftvert mutatunk be. A frum hozzszlsait brmely ltogat megtekintheti tmk szerint csoportostva, hozzszls feladshoz viszont regisztrlnia kell magt. Egy tmn belli hozzszlsok tsvel jelennek meg egy oldalon, gy biztostunk gombokat a tovbbi s korbbi hozzszlsok elrshez. Mivel egy regisztrlt felhasznl ltalban tbb tmhoz is hozz szeretne szlni, nem lenne j megolds, ha minden egyes hozzszls eltt be kellene jelentkeznie. A frum nyitoldaln minden regisztrlt felhasznl bejelentkezhet, bejelentkezs utn pedig szabadon kldheti hozzszlsait brmelyik tmban, vagy hozhat ltre j tmt mindaddig, amg a kijelentkezs gombra nem kattint, vagy be nem zrja a bngszt. Egy j ltogat regisztrlshoz, vagy egy regisztrlt felhasznl adatainak mdostshoz lehetsget szintn a nyitoldalon biztostunk. A frum tbb fjlbl ll ssze, ezeket mutatjuk be sorban: A szksges adatbzis s tblk ltrehozsa (abcreate.php):
01: <?php 02: $felhasznalo="latogato"; 03: $jelszo="valami"; 04: $kapcsolat=mysql_connect("localhost",$felhasznalo,$jelszo); 05: if (!$kapcsolat) die("Nem lehet kapcsoldni a MySQL kiszolglhoz!"); 06: $parancs="CREATE DATABASE forum"; 07: if (!mysql_query($parancs,$kapcsolat)) 08: print "Nem sikerlt ltrehozni a forum adatbzist: " 09: .mysql_error()."<br>"; 10: else 11: print "A forum adatbzis sikeresen ltrehozva!<br>"; 12: mysql_select_db("forum",$kapcsolat) or die("Nem lehet megnyitni 13: a(z) $adatbazis adatbzist: ".mysql_error()); 14: $parancs="CREATE TABLE forum(azon INT AUTO_INCREMENT PRIMARY KEY, 15: felado VARCHAR(30),temaazon INT,datum DATETIME,szoveg TEXT)"; 16: if (!mysql_query($parancs,$kapcsolat))

87

17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36:

print "Nem sikerlt ltrehozni a forum tblt: " .mysql_error()."<br>"; else print "A forum tbla sikeresen ltrehozva!<br>"; $parancs="CREATE TABLE forumtema(azon INT AUTO_INCREMENT PRIMARY KEY,tema VARCHAR(40),datum DATETIME)"; if (!mysql_query($parancs,$kapcsolat)) print "Nem sikerlt ltrehozni a forumtema tblt: " .mysql_error()."<br>"; else print "A forumtema tbla sikeresen ltrehozva!<br>"; $parancs="CREATE TABLE forumuser(nev VARCHAR (30),fnev VARCHAR (30) PRIMARY KEY,jszo VARCHAR(32),email VARCHAR (40))"; if (!mysql_query($parancs,$kapcsolat)) print "Nem sikerlt ltrehozni a forumuser tblt: " .mysql_error(); else print "A forumuser tbla sikeresen ltrehozva!"; mysql_close($kapcsolat); ?>

Az adatbazis.php fjl:
01: <?php 02: $felhasznalo="latogato"; 03: $jelszo="valami"; 04: $adatbazis="forum"; 05: $kapcsolat=mysql_connect("localhost",$felhasznalo,$jelszo); 06: if (!$kapcsolat) die("Nem lehet kapcsoldni a MySQL kiszolglhoz!"); 07: mysql_select_db($adatbazis,$kapcsolat) or die("Nem lehet megnyitni 08: a(z) $adatbazis adatbzist: ".mysql_error()); 09: ?>

A frum nyitoldala (forum.php):


01: <html> 02: <head> 03: <title>Frum</title> 04: <meta http-equiv="Content-Type" content="text/html; charset=iso8859-2"> 05: </head> 06: <body> 07: <center> 08: <h2>Frum</h2> 09: <?php 10: session_start(); //a session indtsa 11: if (isset($name) && isset($pass)) 12: //ha kitlttte a nevet s a jelszt 13: { 14: $van=false; 15: include("adatbazis.php"); 16: $eredmeny=mysql_query("SELECT jszo FROM forumuser WHERE fnev='$name'"); 17: $user=mysql_fetch_row($eredmeny); 18: mysql_close($kapcsolat); 19: if ($user[0]==md5($pass)) //ha a nv s a jelsz is megfelel 20: session_register("name"); //felvesszk a nevet a session-be 21: } 22: if (session_is_registered("name")) 23: //ha a nv regisztrlva van a session-ben 24: { 25: $van=true;

88

26: print "<form method=post action=flogout.php> 27: <table width=300 border=1><td align=center><b>Bejelentkezve</b> 28: </td></tr><table><table width=300 border=1><tr><td width=150> 29: Felhasznlnv:</td><td width=150>".$name."</td></tr> 30: </table><p><input type=submit name=Submit value=Kilps> 31: </p></form>"; 32: } 33: else //ha a nv nincs regisztrlva a session-ben 34: { 35: if (isset($van)) //ha nem megfelelt adott 36: print "Nem megfelel felhasznlnv/jelsz!<p>"; 37: print "<form method=post action=$PHP_SELF> 38: <table width=300 border=1><td align=center><b>Bejelentkezs</b> 39: </td></tr></table><table width=300 border=1><tr><td width=140> 40: Felhasznlnv:</td><td width=160><input name=name type=text> 41: </td></tr><td width=140>Jelsz:</td><td width=160> 42: <input name=pass type=password></td></tr></table><p> 43: <input type=submit name=Submit value=Belps></p></form>"; 44: } 45: print "</form>Tmk:<br>"; 46: include("adatbazis.php"); 47: $eredmeny=mysql_query("SELECT azon,tema,datum FROM forumtema ORDER BY datum DESC"); 48: while ($t=mysql_fetch_row($eredmeny)) //tmk megjelentse 49: { 50: print "<table width=500 border=1><tr><td width=240> 51: <a href=flista.php?azon=$t[0]>$t[1]</a></td><td width=260 align=right> 52: Utols bejegyzs: "; 53: if (isset($t[2])) print $t[2]; 54: else print "nincs"; 55: print "</td></tr></table>"; 56: } 57: mysql_close($kapcsolat); 58: ?> 59: <form action="turlap.php" method="post"> 60: <input type="submit" name="Submit" value="j tma ltrehozsa"> 61: </form> 62: <?php 63: if ($van) print "<a href=furlapum.htm>Adatmdosts</a></p>"; 64: else print "<a href=furlapu.htm>Regisztrci</a></p>"; 65: ?> 66: </center> 67: </body> 68: </html>

A kivlasztott tmban tallhat hozzszlsok megjelentse (flista.php):


01: <html> 02: <head> 03: <title>Frum</title> 04: <meta http-equiv="Content-Type" content="text/html; charset=iso8859-2"> 05: </head> 06: <body> 07: <center><h2>Hozzszlsok</h2> 08: <?php 09: session_start(); 10: if (!isset($db)) 11: /*ha nem tudjuk hny hozzszls van a tmban 12: (most lpett be a ltogat tma hozzszlsaiba)*/

89

13: { 14: session_unregister("hozzaszolas"); 15: /*kivesszk a session-bl a hozzszlsok tmbt, mert lehet, 16: hogy egy msik tma hozzszlsai vannak benne*/ 17: unset($hozzaszolas); 18: /*megszntetjk magt a vltozt is, nehogy hozzfzze 19: az j hozzszlsokat*/ 20: include("adatbazis.php"); 21: $eredmeny=mysql_query("SELECT azon,tema FROM forumtema WHERE azon='$azon'"); 22: $tema=mysql_fetch_row($eredmeny); 23: $eredmeny=mysql_query("SELECT felado,temaazon,datum,szoveg FROM forum 24: WHERE temaazon='$tema[0]' ORDER BY datum DESC"); 25: for ($i=0;$hozzaszolas[$i]=mysql_fetch_row($eredmeny);$i++) 26: $hozzaszolas[$i][3]=nl2br($hozzaszolas[$i][3]); 27: //az sszes tmabeli hozzszls bersa a hozzaszolas tmbbe 28: $db=mysql_num_rows($eredmeny); //a hozzszlsok szma 29: mysql_close($kapcsolat); 30: session_register("tema"); 31: /*a tmaazonost regisztrlsa, hogy ksbb hozzszlst tudjuk 32: ltrehozni a tmban*/ 33: session_register("hozzaszolas"); 34: //a hozzaszolas tmb regisztrlsa 35: } 36: print "<< <b>$tema[1]</b> tma >><br><br>"; 37: if ($db==0) print "Nincs hozzszls a tmban<br>"; 38: if (!isset($szam)) $szam=0; 39: $i=$szam; 40: while ($szam<$i+5 && $hozzaszolas[$szam]!="") 41: //5 db hozzszls megjelentse 42: { 43: print "<table width=500 border=1><tr><td width=350><b>Felad:</b>" 44: .$hozzaszolas[$szam][0]."</td><td width=150 align=right>" 45: .$hozzaszolas[$szam][2]."</td></tr></table><table width=500 border=1> 46: <tr><td>".$hozzaszolas[$szam][3]."<br></td></tr></table><br>"; 47: $szam++; 48: } 49: ?> 50: </p> 51: <table width="500" border="0"><tr><td> 52: <?php 53: if ($szam>5) //a vissza gomb megjelentsnek vizsglata 54: { 55: $szam2=$i-5; 56: print "<form action=$PHP_SELF?szam=$szam2&db=$db method=post> 57: <p align=left><input type=submit name=Submit value=Vissza></p> 58: </form>"; 59: } 60: ?> 61: </td><td><div align="right"> 62: <?php 63: if ($db-$szam>0) //a tovbb gomb megjelentsnek vizsglata 64: { 65: print "<form action=$PHP_SELF?szam=$szam&db=$db method=post> 66: <p align=right><input type=submit name=Submit value=Tovbb></p> 67: </form>"; 68: } 69: ?> 70: </div></td></tr></table>

90

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: 96: 97: 98:

<?php if ($db!=0) //szmok megjelentse (az tsvel val ugrls) { $darab=$db/5; $maradek=$db%5; $i=1; $szam=-5; while ($i<=$darab) { $szam+=5; print "<a href=$PHP_SELF?szam=$szam&db=$db>$i<a> "; $i++; } if ($maradek!=0) { $szam+=5; print "<a href=$PHP_SELF?szam=$szam&db=$db>$i<a> "; } } ?> <form action="furlap.php" method="post"> <input type="submit" name="Submit" value="j hozzszls"> </form> <br><a href=forum.php>Vissza<a> </td></tr></table> </center> </body> </html>

Hozzszls ltrehozsa (furlap.php):


01: <html> 02: <head> 03: <title>Hozzszls feltltse</title> 04: <meta http-equiv="Content-Type" content="text/html; charset=iso8859-2"> 05: </head> 06: <body> 07: <?php 08: session_start(); 09: if (!isset($name)) 10: { 11: print "Nincs bejelentkezve! 12: <br><a href=forum.php>Bejelentkezs</a>"; 13: } 14: else 15: { 16: print "<form method=post action=ffeld.php> 17: <b>Tma: </b>$tema[1]<br><b>Felad: </b>$name<br> 18: <b>Hozzszls:<b><br> 19: <textarea name=szoveg cols=60 rows=10></textarea><br> 20: <input type=submit name=Submit value=Feltlts> 21: </form>"; 22: } 23: ?> 24: </body> 25: </html>

Hozzszls feltltse (ffeld.php):


01: <?php 02: session_start(); 03: if ($szoveg=="")

91

04: { 05: print "Nem tlttte ki a szksges mezt! 06: <br><a href=furlap.php>Vissza</a>"; 07: die(); 08: } 09: $datum=date("Y.m.d. H:i:s".time()); 10: include("adatbazis.php"); 11: $parancs="INSERT INTO forum(felado,temaazon,datum,szoveg) 12: VALUES('$name','$tema[0]','$datum','$szoveg')"; 13: if (!mysql_query($parancs,$kapcsolat)) 14: { 15: print "Nem lehet az adatbzisba rni! 16: <br><a href=furlap.php>Vissza</a>"; 17: mysql_close($kapcsolat); 18: die(); 19: } 20: $parancs="UPDATE forumtema SET datum='$datum' WHERE azon='$tema[0]'"; 21: if (!mysql_query($parancs,$kapcsolat)) 22: { 23: print "Nem lehet az adatbzisba rni! 24: <br><a href=furlap.php>Vissza</a>"; 25: } 26: else 27: { 28: print "Hozzszlst sikeresen rgztettk! 29: <br><a href=flista.php?azon=$tema[0]>Hozzszls megtekintse</a>"; 30: } 31: mysql_close($kapcsolat); 32: ?>

Tma ltrehozsa (turlap.php):


01: <html> 02: <head> 03: <title>Tma ltrehozsa</title> 04: <meta http-equiv="Content-Type" content="text/html; charset=iso8859-2"> 05: </head> 06: <body> 07: <?php 08: session_start(); 09: if (!isset($name)) 10: { 11: print "Nincs bejelentkezve! 12: <br><a href=forum.php>Bejelentkezs</a></p>"; 13: } 14: else 15: { 16: print "<form method=post action=tfeld.php> 17: Tma: <input type=text name=temanev><br> 18: <input type=submit name=Submit value=Ltrehozs> 19: </form>"; 20: } 21: ?> 22: </body> 23: </html>

Tma feltltse (tfeld.php):


01: <?php 02: session_start();

92

03: if ($temanev=="") 04: { 05: print "Nem tlttte ki a szksges mezt! 06: <br><a href=turlap.php>Vissza</a>"; 07: die(); 08: } 09: include("adatbazis.php"); 10: $eredmeny=mysql_query("SELECT tema FROM forumtema WHERE tema='$temanev'"); 11: $sor=mysql_fetch_row($eredmeny); 12: if (isset($sor[0])) 13: { 14: print "Ilyen tma mr szerepel! 15: <br><a href=turlap.php>Vissza</a>"; 16: mysql_close($kapcsolat); 17: die(); 18: } 19: $parancs="INSERT INTO forumtema(tema) VALUES('$temanev')"; 20: if (!mysql_query($parancs,$kapcsolat)) 21: { 22: print "Nem lehet az adatbzisba rni! 23: <br><a href=turlap.php>Vissza</a>"; 24: } 25: else 26: { 27: print "A tma ltre lett hozva!"; 28: $eredmeny=mysql_query("SELECT azon,tema FROM forumtema 29: WHERE tema='$temanev'"); 30: $tema=mysql_fetch_row($eredmeny); 31: session_register("tema"); 32: print "<br><a href=furlap.php> 33: j hozzszls ltrehozsa a tmban</a>"; 34: } 35: mysql_close($kapcsolat); 36: ?>

Kijelentkezs a frumbl (flogout.php):


01: 02: 03: 04: 05: 06: 07: 08: 09: <?php session_start(); session_unset(); if (!session_destroy()) print "A kijelentkezs sikertelen!"; else print "A kijelentkezs sikeresen megtrtnt!"; print "<br><a href=forum.php>Frum</a>"; ?>

Regisztrcis rlap (furlapu.php):


01: <html> 02: <head> 03: <title>Regisztrci</title> 04: <meta http-equiv="Content-Type" content="text/html; charset=iso8859-2"> 05: </head> 06: <body> 07: <form action="fufeld.php" method="post"> 08: <table> 09: <tr><td>Nv:</td><td><input name="nev" type="text"></td></tr> 10: <tr><td>Felhasznlnv:</td><td> 11: <input name="fh" type="text"></td></tr>

93

12: <tr><td>Jelsz:</td><td><input name="jsz" type="password"></td></tr> 13: <tr><td>Jelsz megerstse:</td><td> 14: <input name="jsz2" type="password"></td></tr> 15: <tr><td>E-mail:</td><td><input name="email" type="text"></td></tr> 16: </table> 17: <input type="submit" name="Submit" value="Regisztrci"> 18: </form> 19: </body> 20: </html>

A felhasznl adatainak feltltse (fufeld.php):


01: <?php 02: if ($nev=="" || $fh=="" || $jsz=="" || $jsz2=="" || $email=="") 03: { 04: print "Nem tlttte ki a szksges mezket! 05: <br><a href=furlapu.htm>Vissza</a>"; 06: die(); 07: } 08: if ($jsz!=$jsz2) 09: { 10: print "A kt jelsz nem egyezik meg! 11: <br><a href=furlapu.htm>Vissza</a>"; 12: die(); 13: } 14: include("adatbazis.php"); 15: $eredmeny=mysql_query("SELECT fnev FROM forumuser WHERE fnev='$fh'"); 16: $user=mysql_fetch_row($eredmeny); 17: if (isset($user[0])) 18: { 19: print "Ilyen felhasznl mr ltezik! 20: <br><a href=furlapu.htm>Vissza</a>"; 21: mysql_close($kapcsolat); 22: die(); 23: } 24: $j=md5($jsz); 25: $parancs="INSERT INTO forumuser(nev,fnev,jszo,email) 26: VALUES('$nev','$fh','$j','$email')"; 27: if (!mysql_query($parancs,$kapcsolat)) 28: { 29: print "Nem lehet az adatbzisba rni! 30: <br><a href=furlapu.htm>Vissza</a>"; 31: die(); 32: } 33: else 34: { 35: print "A regisztrci sikeresen megtrtnt! 36: <br><a href=forum.php>Vissza</a>"; 37: } 38: mysql_close($kapcsolat); 39: ?>

94

12 Biztonsg
A PHP egy igen hatkony nyelv s feldolgoz program, akr egy klnll CGI futtathat llomnyknt, akr kiszolglmodulknt mkdik. Kpes elrni fjlokat, futtatni parancsokat s hlzati kapcsolatokat nyitni a szerveren. Ezek a tulajdonsgok veszlyess is tehetik a Web-szerveren fut alkalmazsok szmra, a PHP-t azonban gy fejlesztettk, hogy biztonsgosabb legyen CGI programok rsra, mint a Perl vagy C nyelvek. A teljesen biztonsgos rendszer kialaktani tulajdonkppen lehetetlen, m a PHP fordtsi s futsidej belltsainak helyes megvlasztsval, s megfelel programrsi mdszerek betartsval nagy mrtkben nvelhetjk a biztonsgot. A tovbbiakban nhny biztonsgi tancs kerl emltsre a klnbz belltsi lehetsgekkel.

12.1 CGI futtathat llomnyknt teleptett PHP


A PHP CGI futtathat llomnyknt val hasznlata egy teleptsi lehetsg azok szmra, akik valami oknl fogva nem szeretnk a PHP-t modulknt a szerverbe integrlni (pl. Apache). Ez a forma magval vonja azt, hogy a PHP a szerver cgi-bin knyvtrba legyen teleptve. a PHP-t gy terveztk, hogy az ilyen teleptsekbl add tmadsokat kivdje:

Rendszerfjlok elrse:
http://domain.nev/cgi-bin/php?/etc/passwd

Az URL lekrsi informcija, ami a krdjel utn tallhat, parancssori paramterknt kerl tadsra a feldolgoznak. ltalban a feldolgozk megnyitjk, s lefuttatjk az els paramterknt adott fjlt. Ha a PHP CGI futtathat llomnyknt hvdik meg, nem veszi figyelembe a parancssori paramtereket.

Brmilyen web dokumentum elrse a szerveren:


http://domain.nev/cgi-bin/php/titkos/doc.html

Az elrsi t informci az URL rsze, a futtathat fjl neve utn lv /titkos/doc.html a CGI program ltal megnyitsra s futtatsra kerl fjl elrsnek meghatrozsra hasznlatos. Tipikusan nhny webkiszolgl belltsi lehetsg (Apache-ban: Action) hasznlatos a krsek tirnytsra a dokumentumhoz, mint a http://domain.nev/titkos/szkript.php a PHP rtelmez szmra. Ezzel a belltssal a szerver elszr ellenrzi az elrsi engedlyeket a /titkos knyvtrra, s ezutn lltja el az tirnyt krst a http://domain.nev/cgi-bin/php/titkos/szkript.php oldalra, amit gy mr a PHP feldolgoz. Azonban ha eredetileg is ebben a formban volt megadva a krs, nem trtnik elrsi ellenrzs a /titkos/szkript.php fjlra, csak a /cgi-bin/php fjlra. Ilyen mdon brki, aki elrheti a /cgi-bin/php cmet, egyben tetszleges vdett dokumentumot is elrhet. 1. Csak publikus llomnyok tallhatk a szerveren Ha a szerveren nincs olyan tartalom, ami jelsz vagy IP alap vdelemmel van elltva, nincs szksg ezekre a konfigurcis belltsokra. 2. Az --enable-force-cgi-redirect hasznlata Ez a fordtsi paramter megakadlyozza, hogy brki meghvja a PHP-t egy
http://domain.nev/cgi-bin/php/titkos/szkript.php URL-el. Ehelyett a

PHP csak akkor fog elfogadni egy ilyen krst ha egy szerver tirnytsban kapta. 95

Apache esetben tipikusan a kvetkez direktvkkal trtnik a bellts:


Action php-script /cgi-bin/php AddHandler php-script .php

3. A doc_root s a user_dir belltsok A PHP szkript dokumentumok gykrknyvtrt a doc_root konfigurcis belltssal hatrozhatod meg a konfigurcis fjlban, vagy a PHP_DOCUMENT_ROOT krnyezeti vltozban adhatod meg ezt az rtket. Ha ez be van lltva a PHP CGI verzija a fjl elrsi tjt a doc_root s a krs elrsi t informcija alapjn lltja el, ami azt jelenti, hogy ezen a knyvtron kvl nem futtathat fjl (kivve a user_dir esett). Egy msik itt hasznlhat opci a user_dir. Ha ez nincs megadva, akkor csak a doc_root szablyozza a megnyithat fjlok krt. Ekkor egy http://domain.nev/~user/doc.php URL nem a "user" nev felhasznl home knyvtrban lv fjlt keresi, hanem a ~user/doc.php fjlt keresi a doc_root alatt. Ha a user_dir meg van adva, pldul public_php, akkor a fenti http://domain.nev/~user/doc.php krs a doc.php nev fjlt fogja megnyitni a "user" nev felhasznl home knyvtrban lv public_php knyvtrban. Ha a "user" home knyvtra /home/user, a lefuttatand fjl a /home/user/public_php/doc.php lesz. 4. PHP feldolgoz a web knyvtrfn kvl Rendkvl biztonsgos lehetsg a PHP feldolgozt valahol a webrl lthat knyvtrakon kvlre tenni, pldul a /usr/local/bin knyvtrba. Az egyetlen igazi htrnya ennek az opcinak az, hogy minden PHP szkript els sornak egy ehhez hasonl sort kell megadni:
#!/usr/local/bin/php

ami meghatrozza, hogy hol tallhat a PHP feldolgoz, ami lefuttatja majd ezt a kdot. Radsul minden PHP szkriptnek futsi jogot kell adni. Ahhoz, hogy ebben az esetben a PHP helyesen kezelje a PATH_INFO s a PATH_TRANSLATED informcikat, a PHP feldolgozt az --enable-discard-path "configure" paramterrel kell fordtani.

12.2 Apache modulknt teleptett PHP


A PHP-t Apache modulknt hasznlva rkli az Apache-t futtat felhasznl (tipikusan a "nobody") jogait. Ennek tbbfle hatsa van a biztonsgra s az azonostsra. PHP-n keresztli adatbzis elrs esetn pldul, az adatbzist elrhetv kell tenni ezen felhasznl szmra is, kivve ha az adatbzisnak beptett azonostsa van. gy egy rosszindulat szkript elrheti, s mdosthatja az adatbzist, akr felhasznli nv s jelsz nlkl is. Ez ellen lehet vdekezni az Apache azonostsi technikkkal, vagy LDAP segtsgvel megvalstott sajt elrsi modellekkel. Az Apache felhasznl jogainak root szintre bvtse klnsen veszlyes, s tnkreteheti a teljes rendszert. Az open_basedir hasznlatval szablyozni lehet, hogy mely knyvtrakat olvashatja a PHP. Ki lehet jellni n. csak apache terleteket, hogy minden web alap mvelet ide, csak ezekre a nem rendszer- s nem felhasznli fjlokra korltozdjon.

96

12.3 Fjlrendszer
A PHP kpes a fjlok s knyvtrak hozzfrsi jogosultsgainak kezelsre. Ez lehetsget ad arra, hogy megszabjuk, mely fjlok olvashatak a rendszerben. A mindenki szmra olvashat fjloknl gyelni kell arra, hogy ne tartalmazzanak olyan adatot, amit nem szabad elolvasnia brmelyik felhasznlnak. Mivel a PHP gy kszlt, hogy felhasznli szint fjlrendszer hozzfrst ad, lehetsges olyan program ksztse, amely a rendszerfjlokat olvassa, mint pl. az /etc/passwd fjl. Ez maga utn vonja, hogy minden esetben meg kell gyzdni arrl, hogy a helyes fjlokat olvassa illetve rja a program. Nzzk a kvetkez szkriptet, ahol a felhasznl megadja, hogy le szeretne trlni egy fjlt a knyvtrban. Ez tbbnyire egy webes felletet jelent, ahol egy PHP program hasznlatos fjlkezelsre, ezrt az Apache-t futtat felhasznlnak engedlyezni kell a fjlok trlst a felhasznl knyvtrban.
<?php //egy fjl trlse akrhonnan, ahol a PHP usernek joga van erre $usernev=$_SERVER['REMOTE_USER']; //ez a user azonostott neve(ha volt eltte azonosts) $konyvtar="/home/$usernev"; $torlendo_file=basename("$userfile"); //elrsi trkkzs eldobsa unlink($konyvtar/$torlendo_file); $fp=fopen("/home/logging/filedelete.log","a"); //trls naplzsa $logstring="$usernev $konyvtar $torlendo_file"; fputs($fp,$logstring); fclose($fp); print "$torlendo_file trlve!"; ?>

Ha az aktulisan hasznlt hitelestsi mdszer megengedi a felhasznlknak, hogy sajt login nevet vlasszanak, s az egyikk a "../etc/" -t vlasztja, akkor a rendszer ugyanolyan vdtelenn vlik. Ebbl kiindulva a jobban testreszabott ellenrzs a kvetkezkpp alakulna:
<?php $usernev=$_SERVER['REMOTE_USER']; // hitelesites $homedir="/home/$usernev"; if (!ereg('^[^./][^/]*$',$userfile)) die('rossz fjlnv'); //vge, nincs feldolgozs if (!ereg('^[^./][^/]*$',$usernev)) die('rossz usernev'); //vge, nincs feldolgozs //stb. ?>

A hasznlt opercis rendszertl fggen szles a vdeni kvnt fjlok sklja, belertve az eszkz hivatkozsokat (/dev/ vagy COM1), konfigurcis fjlokat (/etc/ s az .ini fjlok), jl ismert trolhelyeket (/home/, My Documents). Emiatt knnyebb egy olyan rendszert kszteni, ahol mindent tiltunk azon kvl, amelyet kifejezetten megengednk.

12.4 Adatbzis
Az els lps mindig az adatbzis ltrehozsa, hacsak nem egy kvlllt kell hasznlni. Az adatbzis ltrehozsakor a tulajdonos lesz, az, aki lefuttatta az utastsokat. ltalban csak a tulajdonos - esetleg az n. superuser - jogosult brmifle az adatbzis elemeit rint mveletre. Annak rdekben, hogy ms felhasznlk is hozzfrjenek, jogokat kell nekik biztostani. Az alkalmazsoknak soha nem szabad a tulajdonosaknt vagy superuserknt csatlakozni az adatbzishoz, mert ezek brmilyen

97

utastst s lekrdezst tetszs szerint futtathatnak, gy pldul szerkezeti mdostsokat hajthatnak vgre vagy tblkat trlhetnek. Mindig csak a legszksgesebb jogokat szabad engedlyezni, s el kell kerlni, hogy ugyanazt a felhasznlt hasznljuk szerepeiben egymstl klnbz esetekben. Ez azt jelenti, hogy ha a behatol meg is szerzi valamelyik ilyen minstst (hitelestsi informci=felhasznli nv+jelsz), akkor is csak akkora vltozst tud okozni, mint az alkalmazs maga. Nem kell minden feladatfgg szablyozst a webalkalmazsban (PHP szkriptben) kdolni, ehelyett inkbb hasznljuk az adatbzis lehetsgeit: view-k (nzetek), trigger-ek, rule-ok (szablyok). Az rlapokbl szrmaz adatokat gyakran troljuk adatbzisokban. SQL-parancsokat kldnk az adatbzis-szervernek, melyek elre elksztett s a felhasznltl kapott rszekbl llnak ssze. Ha a bevitelek rvnyessgt nem ellenrizzk le mg egyszer szerver-oldalon, azt a hackerek kihasznlhatjk. Egy ellenrizetlen mezbe egyszeren bernak egy tovbbi SQL-parancsot, amely a lekrdezssel egy idben vgrehajtdik. gy olvasni vagy manipullni lehet az adatokat, ami a felhasznl eltt rejtve marad. A hackernek ehhez mg az adatbzis felptst sem kell ismernie. Ha a tmad kzvetlen hozzfrst szerzett az adatbzishoz (megkerlve a Webszervert), a trolt adatok vdtelenn vltak, s visszalhet velk, ha csak maga az adatbzis nem vdi valahogy azokat. Az adatok titkostsa enyhti ezt a veszlyt, de jelenleg nagyon kevs adatbzis kezel tmogatja a titkostst. Ebben az esetben a PHP segtsget nyjthat nhny kiterjesztsvel, mint pldul az Mcrypt vagy az Mhash, amelyek nagyon sokfle titkost algoritmust fednek le. Olyan teljesen rejtett adatok esetn, amelyeknek nylt brzolsukra nincs szksg, mert nem lesznek kiratva, a hashels alkalmazsa is meggondoland. A hashels jl ismert pldja az, hogy a jelszavak helyett, azoknak csak MD5 hash rtkt troljk az adatbzisban. Mindig ellenrizzk a bejv adat tpust, hogy az a vrtnak megfelel-e. A PHP a bevitelt ellenrz fggvnyek szles krvel rendelkezik kezdve a legegyszerbbektl (pl. vltozkkal kapcsolatos fggvnyek is_numeric()) a Perl kompatibilis regulris kifejezsek tmogatsig. Ha az alkalmazs szmot vr, akkor megfontoland az is_numeric() fggvnnyel ellenrizni a tpust, vagy megvltoztatni a tpust a settype() fggvnnyel, vagy szm szerinti brzolst hasznlni az sprintf() fggvnnyel. Semmilyen adatbzisra jellemz informcit - klnsen szerkezetit - nem szabad kirni. Idzjelek kz kell tenni minden nem szm jelleg, felhasznltl szrmaz adatot, erre hasznlhat az addslashes() vagy az addcslashes().

12.5 Felhasznltl rkez adatok


Mindig alaposan meg kell vizsglni a felhasznlk ltal beadott adatokat, feltve a kvetkez krdseket:

Biztos, hogy ez a szkript csak a kvnt fjlokat fogja mdostani? Elfordulhat egy ponton, hogy szokatlan vagy nem kvnatos adat jelenjen Hasznlhat-e az adott szkript nem kvnatos formban? Felhasznlhat-e ms szkriptekkel egytt egy negatv hats elrsre? Megfelelen naplzsra kerlnek-e a tranzakcik (elrsek, vltoztatsok)?

meg?

Alaposan tgondolva a fenti krdseket a szkript rsakor, megkmlhet minket attl, hogy ksbb szrevve a problmkat szerencstlen mdon jra kelljen rni a teljes kdot a vdelem nvelse rdekben. Persze ezzel sem lehet garantlni a rendszer biztonsgt, de segthet annak nvelsben vagy fenntartsban. 98

12.6 Hibakezels
A PHP biztonsgi krdsek fell a hibajelzseknek kt oldaluk van. Az egyiket nzve hasznos a vdelem nvelse szempontjbl, a msik szemszgbl viszont kros. Egy szoksos tmadsi technika minl tbb informci begyjtse a rendszerrl. Ezt gy prbljk megoldani, hogy helytelen adatokat kldenek be, s rgztik a hibazenetek tpusait s krnyezetket. Ez lehetsget ad a crackernek, hogy elg informcit gyjtsn a rendszerrl, s meghatrozza a lehetsges gyenge pontokat. Ha pldul a tmad sszeszedegetett elg informcit az elz rlap kitltsek alapjn, akkor megprblhatja a vltozkat fellrni vagy megvltoztatni ket. A PHP ltal visszaadott hibazenetek ltalban hasznosak a hibkat keres fejleszt szmra, megjellve a fjlt, s a fggvnyt, ami hibs, valamint megadva a megfelel programsor szmt. Nem ritka, hogy egy PHP fejleszt a show_source(), highlight_string(), vagy highlight_file() fggvnyeket a fejleszts sorn hibakeressre is hasznlja, de egy lesben lv webhelyen ez rejtett vltozkat, ellenrizetlen kdokat, s ms veszlyes informcikat fedhet fel. Kifejezetten veszlyes beptett hibakezelvel rendelkez ismert forrs kdok hasznlata. Ha a tmad rismer valamilyen ltalnos programozsi technikra, akkor megprblhatja feltrni az oldalt a klnbz megszokott hibakeres (debugging) vltozk elkldsvel. A fjlrendszer vagy ltalnos PHP hibk jelezhetik, hogy milyen jogokkal rendelkezik a Web-szerver, s megmutathatjk a fjlok elrendezst s struktrjt. A fejleszt ltal rt hibs kd slyosbthatja a helyzetet, egykori rejtett informcik knny kidertst lehetv tve. Hrom megoldsi lehetsg addik erre a problmra. Az els, megvizsglni alaposan a fggvnyeket, s megprblni elkerlni a hibkat. A msodik a a hibajelzs kikapcsolsa a teljes kdon bell. A harmadik a PHP testreszabhat hibajelentsi funkciinak hasznlata, gy sajt hibakezelket definilhatunk. A mr megtett biztonsgi intzkedsektl fggen esetleg mindhrom fenti mdszert vlaszthat. Hasznot nyjthat a PHP beptett error_reporting() fggvnye, amely segt biztonsgosabb tenni a programokat s megtallni a vltozk vszelyeket rejt hasznlati formit.

12.7 Globlisan elrhet vltozk


A PHP 4.2.0 vltozattl kezdden a register_globals direktva alaprtelmezett rtke OFF-ra van lltva. Amikor a register_globals be van kapcsolva, megmrgezi a szkriptet mindenfle vltozval, mint pldul a HTML rlapokbl szrmazkkal. Ehhez mg hozzaddik az, hogy a PHP nem kveteli meg a vltozk inicializlst, gy sokkal knnyebb veszlyes kdot rni. Ha bekapcsolt llapotban van, sokan gy hasznljk a vltozkat, hogy valjban nem is tudjk honnan szrmaznak, csak felttelezik. Ilyenkor a szkriptben definilt vltozk sszekeverednek a felhasznltl rkezkkel. A 4.1.0 vltozattl kezdden bevezetsre kerltek olyan szupergloblis hatkr tmbk, mint pldul a $_GET, $_POST, $_SERVER. Ezek segtsgvel knnyen ellenrizhetjk, hogy a vltozk honnan rkeztek. A lenti plda a session-khz kapcsoldik:
<?php //Nem tudhatjuk, hogy a $usernev honnan szrmazik, de azt igen, hogy //a $_SESSION a munkamenet adatokat hivatkozza if (isset($_SESSION['usernev'])) { print "Hello, <b>{$_SESSION['usernev']}</b>"; } else

99

{ } ?>

print "Hello, <b>Vendg</b><br>";

12.8 A PHP elrejtse


Nhny egyszer mdszerrel elrejthet, hogy PHP-t hasznlsz, gy lasstva le a tmadt, aki fel akarja derteni a rendszer gyenge pontjait. A php.ini-ben az expose_php=off belltssal cskkentheted ezeket az informcikat. Msik taktika a Web-szerver (pl. apache) olyan belltsa, hogy klnbz tpus fjlokat is PHP-n keresztl futtasson. HTML tpus hasznlata PHP fjlkiterjesztsknt:
AddType application/x-httpd-php .htm .html

Ahhoz, hogy ez jl mkdjn, minden PHP fjlt t kell nevezni a htm vagy html kiterjesztsek valamelyikre. Mivel ez is a rejtzsen alapul vdelmi forma, kevs htrnya mellett csekly megakadlyoz intzkedst jelent.

12.9 Frisstsek
A PHP, mint brmilyen ms nagy rendszer folyamatosan vltozsok s fejlesztsek alatt ll. Minden j vltozat kisebb-nagyobb vltoztatsokat tartalmaz, fejlesztve a nyelvet, kijavtva biztonsgi hibkat, belltsi kellemetlensgeket, s ms olyan elemeket, amik a teljes rendszer stabilitsra s biztonsgra hatnak. A legjobb hozzlls a gyakori frissts, valamint a friss vltozatokrl, s a fellp vltozsokrl val informlds.

100

Irodalomjegyzk
1. BAKKEN, STIG STHER http://www.hu.php.net. 2002-2004. SCHMID, EGON: PHP kziknyv.

2. CASTAGNETTO, JESUS RAWAT, HARISH SCHUMANN, SASCHA SCOLLO, CHRIS VELIATH, DEEPAK: Professional PHP Programming. Wrox Press, 1999. 3. GILMORE, WILLIAM JASON: A Programmers Introduction to PHP 4.0. Apress, 2001. 4. ILLS ZOLTN: Programozsi nyelvek: C++. lgia 23, ELTE TTK Informatikai Tanszkcsoport, Budapest, 1996. 5. KERNIGHAN, BRIAN W. RITCHIE, DENNIS M.: A C programozsi nyelv. Mszaki Knyvkiad, Budapest, 1988. 6. MOULDING, PETER: PHP Haladknak Fekete Knyv. Perfact, Budapest, 2002. 7. WELLING, LUKE THOMPSON, LAURA: PHP and MySQL Web Development, Second Edition. Sams Publishing, 2003. 8. ZANDSTRA, MATT: Tanuljuk meg a PHP4 hasznlatt 24 ra alatt. Kiskapu, Budapest, 2001.

101

You might also like