Fbin Zoltn 2005 v0.81 2 Tartalomjegyzk 1 BEVEZETS....................................................................................................................................................................4 1.1 MIRE J EZ A JEGYZET?.............................................................................................................................................4 1.2 1. 2 A PHP RVID TRTNETE..................................................................................................................................4 1.3 MI A PHP?................................................................................................................................................................5 2 MILYEN RENDSZEREN HASZNLHAT A PHP?................................................................................................7 2.1.1 Milyen opercis rendszer?.................................................................................................................................7 2.1.2 Milyen WEB szervert?.........................................................................................................................................7 3 A PHP4 TELEPTSE (WIN32 VLTOZAT).............................................................................................................8 3.1.1 Konfigurls Apache WEB szerver 1.3.xx vagy 2.0.xx esetn.............................................................................8 4 ESZKZK A PHP HASZNLATHOZ...................................................................................................................9 5 EGY HTML S EGY PHP OLDAL SZERKEZETE................................................................................................10 6 A PHP NYELVI SZABLYAI.....................................................................................................................................11 7 VLTOZK, ADATTPUSOK...................................................................................................................................12 7.1 A VLTOZ NEVE....................................................................................................................................................12 7.2 A VLTOZ RTKE................................................................................................................................................12 7.3 A VLTOZK S KIFEJEZSEK TPUSAI ....................................................................................................................12 7.4 ELRE DEFINILT VLTOZK..................................................................................................................................14 7.4.1 PHP Core A PHP rendszer alapvet vltozinak a listja............................. Hiba! A knyvjelz nem ltezik. 7.4.2 Environment......................................................................................................................................................14 7.4.3 PHP Variables - A PHP vltozk listja...........................................................................................................14 7.5 KONSTANSOK..........................................................................................................................................................15 8 ALAPVET# UTASTSOK........................................................................................................................................16 8.1 ECHO.......................................................................................................................................................................16 8.2 FORMZOTT KIRS ................................................................................................................................................17 8.3 A KIIRATS GYAKORLSA.............................................................................. HIBA! A KNYVJELZ# NEM LTEZIK. 9 OPERTOROK (M%VELETEK)...............................................................................................................................19 9.1 STRINGEK KZTTI M#VELETEK.............................................................................................................................19 9.2 ARITMETIKAI M#VELETEK......................................................................................................................................19 9.3 HOZZRENDELS, RTKADS ...............................................................................................................................19 9.4 NVEL/CSKKENT OPERTOROK........................................................................................................................19 9.5 LOGIKAI OPERTOROK............................................................................................................................................20 9.6 SSZEHASONLT OPERTOROK.............................................................................................................................20 9.7 BITORIENTLT OPERTOROK..................................................................................................................................20 9.8 HIBAKEZEL OPERTOROK.....................................................................................................................................21 9.9 VGREHAJT OPERTOROK....................................................................................................................................21 10 VEZRLSI SZERKEZETEK....................................................................................................................................22 10.1 ELGAZSOK..........................................................................................................................................................22 10.2 CIKLUSOK...............................................................................................................................................................24 10.3 ELGAZSOK S CIKLUSOK HASZNLATA HTML KDDAL KEVERVE.....................................................................26 10.4 PHP LAPOK BESZRSA, MAKRO-K HASZNLATA...............................................................................................26 10.5 TVOLI FILE-OK HVSA.........................................................................................................................................27 11 SAJT FGGVNYEK, VLTOZK LETTARTAMA S LTHATSGA.................................................28 11.1 FGGVNYEK..........................................................................................................................................................28 11.2 PARAMTERTADS...............................................................................................................................................28 11.3 FGGVNYEK VISSZATRSI RTKE......................................................................................................................29 11.4 VLTOZK LETTARTALMA S LTHATSGA.......................................................................................................29 11.5 VLTOZK TADSA LAPOK KZTT.....................................................................................................................30 11.5.1 Header utasts.............................................................................................................................................31 11.5.2 GET metdus................................................................................................................................................31 11.5.3 POST metdus..............................................................................................................................................32 11.5.4 $_SESSION vltozk.....................................................................................................................................35 11.5.5 COOKIE-k (stik).........................................................................................................................................36 3 12 KONVERZI ADATTPUSOK KZTT................................................................................................................38 13 TMBK.......................................................................................................................................................................39 14 SZTRINGEK, SZVEGEK MANIPULCIJA......................................................................................................42 15 FORMOK /%RLAPOK INTERAKTV PROGRAMOK RSA..........................................................................46 15.1.1 nmagukat meghv #rlapok........................................................................................................................46 16 FORMOK ADATAINAK FELDOLGOZSA SZERVER- S KLIENS OLDALON........................................48 17 LEVLKLDS, PLAIN TEXT, HTML LEVL, ATTACHEMENT...................................................................50 18 ADATBZISOK............................................................................................................................................................52 18.1 MYSQL..................................................................................................................................................................52 18.2 POSTGRES SQL.......................................................................................................................................................52 18.3 ADATBZIS-KEZELS NATV MDON.......................................................................................................................53 18.4 TIPIKUS FELADATOK ADATBZIS-KEZELSNL.......................................................................................................55 18.5 HIBAKEZELS..........................................................................................................................................................58 18.6 ADATBZISKEZELS MSKPPEN ABSZTRAKCIS RTEGEK, ADODB, ODBC....................................................58 18.6.1 Az absztrakcis rteg....................................................................................................................................58 18.6.2 ODBC programcsomag................................................................................................................................58 18.6.3 Az ADODB rteg...........................................................................................................................................59 18.7 TOVBBI ABSZTRAKCI..........................................................................................................................................62 18.8 ID KEZELSE PHP MYSQL ESETN....................................................................................................................63 18.9 SOKIG FUT PROGRAMOK.....................................................................................................................................64 19 FILE-OK, KNYVTRAK KEZELSE A SZERVEREN S TVOLI URL-EKEN..........................................65 LTOGATK SZMA:<BR> <?PHP.................................................................................................................................68 20 GRAFIKA......................................................................................................................................................................69 21 A KRNYEZET FELDOLGOZSA, AZONOSTS............................ HIBA! A KNYVJELZ NEM LTEZIK. 22 BELPTETS, JELSZAVAK ALKALMAZSA, TITKOSTS...........................................................................78 22.1 TITKOSTOTT TVITELE A KLIENS S A SZERVER KZTT: MD5()...........................................................................82 23 BIZTONSG, TIPPEK S TRKKK.....................................................................................................................89 SABLONOK TEMPLATE-EK, LIB-EK...........................................................................................................................90 23.1 TEMPLATE-EK, SMARTY..........................................................................................................................................90 23.2 PEAR CSOMAG.......................................................................................................................................................92
4 1 Bevezets 1.1 Mire j ez a jegyzet? A jegyzetnek az a clja, hogy bevezesse az olvast a ma robbansszer %en terjed' PHP nyelv vilgba, megtantsa az alapvet' eljrsokat, fogalmakat s kpess tegye az olvast sajt PHP scriptek rsra. Hasznljuk tovbb a Szily Klmn M%szaki Kzpiskolban. Ez nem teljes PHP dokumentci! Teljes dokumentcit az Internetr 'l lehet beszerezni, rszben magyar nyelven az albbi cmekr'l: http://www.php.net dokumentci angolul http://hu.php.net/docs.php oldal magyarul. A jegyzetben tallhat pldaprogramokat, tleteket, rszben az albbi forrsokbl szemezgettem s ezton ksznetet mondok nekik : http://hu.php.net A PHP site magyar oldalai php-lista@Gimli.externet.hu Magyar PHP lista http://php4.x3.hu, Korss Istvn (KI), kefa@mail.datanet.hu PHP-s cikksorozata a PC-World-b'l, resource-ok PHP s egyb tmkban http://phpbuilder.com/columns/ying20000602.php3?page=1 sessionok, Ying Zhang cikke http://phpmailer.sourceforge.net Emailklds http://php.weblogs.com/ADODB ADODB adatbziskezels http://adodb.sourceforge.net http://pear.php.net Pear programcsomag letltse http://smarty.php.net Smarty template rendszer http://www.phpclass.org PHP alkalmazsok s class-ok feltallsi helye 1.2 A PHP rvid trtnete A PHP trtnete 1994 'szre nylik vissza, amikor a munkt keres ' Rasmus Lerdorf egy Perl CGI szkriptet hasznlt a Web odalt felkeres 'k regisztrlsra. A ltogatkat naplz kdot "PHP-tools for Personal Home Page"-nek nevezte el. Az els ' nyilvnos vltozat gy 1995 tjn ltott napvilgot. Ez mg csak nhny egyszer%bb feladatra volt hasznlhat, tbbek kztt szmllt, vendgknyvet tartalmazott. A PHP fejlesztse a Toronti Egyetemen folytatdott, ahol Rasmus Lerdorf olyan interfszt fejlesztett ki, aminek segtsgvel a HTML kdba gyazott specilis utastsok kzvetlenl rtk el az egyetemi adatbzisokat. A rendszert Rasmus "Form Interpreter"-nek, FI-nek nevezte el. Az FI-ben hasznlt elv mr megegyezett a PHP alapelvvel, miszerint a HTML kdba begyazott utastsokat rtelmezte s hajtotta vgre az FI rtelmez 'je. Ks'bb a PHP s az FI sszehzastsbl szletett meg az els ' szles krben hasznlt parancsrtelmez ' a PHP/FI. Ez tartalmazta a PHP s az FI addigi szolgltatsait, s 't az mSQL adatbzisok elrst is tmogatta. Rasmus eleinte eljtszadozott a gondolattal, hogy a PHP-t kereskedelmi termkk teszi, de olyan komoly mennyisg% visszajelzst kapott ms programozktl, klnbz ' kiegsztseket s hibajavtsokat kldve a PHP-hez, hogy letett ebbli szndkrl. A PHP fejl 'dshez s sokrt%sghez nagymrtkben hozzjrult kls' programozk szabad s ingyenes rszvtele a rendszer fejlesztsben. A PHP a mai napig is ingyenes termk, s ez valban nagyon j dolog. Az els ' verzi megjelenst 'l kezdve a PHP felhasznli tbora tretlenl nvekedett. 1996-ban kzel 15.000 Web oldalon hasznltk a PHP/FI-t, 1997-ben mr tbb mint 50.000 Web oldalon. Ebben az vben kezd 'dtt el a PHP sokkal jobban szervezett tovbbfejlesztse. A PHP/FI-t rtelmez 'jt szinte az alapoktl kezdve jrartk, temelve a PHP/FI-ben alkalmazott technikkat s kdot, de szmos jat is hozztve. gy alakult ki a PHP 3-as vltozata, ami gyakorlatilag rendelkezett mindazokkal a kpessgekkel, amik a PHP npszer%sgt megalapoztk. A PHP fejl 'dse azonban nem ll meg. Jelenleg az 5.1.x vltozatnl tart a fejleszts, de ksznhet 'en a "szabad szoftver" filozfinak nem valszn%, hogy itt megreked. 5 1.3 Mi a PHP? Egy majdnem ltalnos cl programozsi nyelv, amely mra sokfle terleten alkalmazhat, amit a Weben keresztl meg lehet oldani. Dinamikus oldalak, adatbzis-kezels, akr gyviteli alkalmazsok, levelezs, portlok, grafikai alkalmazsok, file-kezels, tvoli adminisztrci, stb. Miel'tt a PHP m %kdst rszleteznnk, meg kell ismerkedni egy kicsit a Web-en lv ' alkalmazsok lelkivilgval. Amikor a bngsz'ben berjuk egy olyan oldal nevt, s letltjk azt, akkor az Interneten lv' WEB szerver kldi el a bngsz'nknek a kvnt oldalt. Ez az oldal egy HTML oldal, egy ASCII szveg llomny, amely megrkezve a bngsz'nkre azt a bngsz' rtelmezi, s a tartalmt megjelenti. Ezek statikus oldalak, mivel a kvetkez ' s az utna kvetkez ' krsekkor mindig pontosan ugyanazt az oldalt fogjuk jra meg jra megkapni, hiszen a szerveren ez egy file. Abban az esetben, ha azt szeretnnk, hogy az oldal tartalma vltozzon, azaz dinamikus oldalt szeretnnk, valamilyen mdon az oldalt a szerveren ltre kell hozni, mdostani kell. Ennek rdekben ki kell egszteni a WEB-szervert olyan alkalmazsokkal, amelyek az oldal krsekor futs kzben lltjk el ' az oldal tartalmt, majd odaadjk a szervernek, amely az eredmnyt tovbbtja a bngsz' fel. Az ilyen programokat sszefoglal nven CGI programoknak hvjuk, ami a Common Gateway Interface kifejezs rvidtse. Ezek a programok teht j funkcionalitssal b 'vtik ki a WEB szervereket. A legfontosabb ebben az, hogy ez ltal a bngsz 'k interaktv mdon tudnak kapcsolatot teremteni a WEB szerverrel, adatokat tudnak bevinni neki, a bevitt informci alapjn vltozik a visszaadott rtk. Az ilyen rendszer m %kdse olyan, hogy a bngsz 'ben bert informcit megkapja a WEB szerver, tadja a CGI programnak, ami az informci birtokban feldolgozza s visszakldi a WEB szervernek, amely tovbbtja a bngsz' fel HTML kd formjban. A CGI programok vagy a szerver opercis rendszern futni kpes programok, amelyeket valamilyen nyelven, pl. C-ben rtak meg s fordtottak le, vagy gynevezett scriptek, amelyek egy rtelmez' program kzrem%kdsvel futnak. A PHP programokat egy ilyen rtelmez futtatja a szerveren akkor, ha a bngsz ' PHP, PHP3, PHP4, vagy hasonl kiterjeszts % file-okra hivatkozik. Ekkor a WEB szerver meghvja a PHP rtelmez ' programot (interpretert), amely rtelmezi a krdses oldalt, majd az eredmnyt Web oldal formjban visszaadja a WEB szervernek, amely tovbbtja a bngsz'nek. Teht a PHP program egy WEB szerveren fut script, amelynek az eredmnye egy WEB bngsz 'n keresztl jelenik meg. A Javascriptek, a Vbscriptek JAVA appletek illetve Flash movie-k a bngsz'n hajtdnak vgre, a PHP scriptek a szerveren. A PHP script a bngsz 'n soha nem jelenik meg (ha megjelenik, akkor baj J ), csak az a HTML vagy egyb kd, amelyet el'llt. A bngsz' s a szerver kztti kommunikci folyamata: A bngsz'be a felhasznl ber egy URL-t, rkattint egy linkre, ekkor ugynevezett GET metdus krst kld el a bngsz ' a szervernek, vagy egy %rlapon rkattint az elklds gombra, ekkor POST metdus krst kld a szervernek a bngsz'. A krs tulajdonkppen egy adatcsomag. A krs rszei: o A krsben elmegy az URL, a metdus fajtja (POST vagy GET), a hasznland protokol (HTTP 1.0 vagy HTTP 1.1) o POST metdus esetn a krsben elmennek az %rlapban kitlttt adatmez'k adatai o A bngsz' neve, s specilis tulajdonsgai o A bngsz' ltal lekezelni kpes specilis adatfajtk szabvnyos nevei o A bngsz'ben trolt s az adott domainhez tartoz cookie-k adatai Ha az URL a szerveren .html, .htm ,.gif, .jpg, .AVI, .mpg, stb file-t jell meg, akkor a WEBszerver kikeresi a sajt httrtrn a megfelel ' fjlt s elkldi a bngsz 'nek klnbz ' plusz, gynevezett fejlcadatok (header)ksretben. A headerben lv' adatok az albbiak lehetnek: o A kdols nyelve, a cache-ek m%kdsre vonatkoz parancsok, o Az esetlegesen elkldend' cookie-k o A SESSION-khz tartoz un. session cookie-k. 6 Ha az URL .php kiterjeszts% file-t jell, akkor a webszerver tadja az URL-t a PHP motornak. o A PHP motor megkeresi a httrtron a megadott file-t o Betlti szintaktikailag ellen 'rzi a betlttt php file tartalmt, majd elkezdi rtelmezni s vgrehajtani azt. o Ha szksges a PHP-hez konfigurlt egyb modulokat elindt, kommunikl velk, mint pl. egy SQL szerver o A PHP kd segtsgvel a kimenetre lehet kldeni header parancsokat, cookie-k s session-k adatait, miel'tt brmi HTML kdot kikldene a PHP motor. o A vgrehajts sorn a PHP oldalakon keverni lehet a HTML s a PHP kdot. Ha az rtelmez ' HTML kd rszt tall, akkor azt a kdot kikldi a kimenetre vltozatlanul. o A program futsa sorn kir utastsokkal el'lltja a HTML kimenetet s kikldi a kimenetre. o A PHP motor ltal el'lltott HTML kimenetet a webszerver kapja meg. o A WEbszerver a tartalmat kikldi a bngsz'nek. A bngsz' a megkapott informcit betlti s rtelmezi. o Ha a kdban javascript, flash, java vagy egyb nem kifejezetten HTMl kd tallhat, akkor a bngsz' elindtja a kliens szmtgpre teleptett megfelel' feldolgoz modult.
7 2 Milyen rendszeren hasznlhat a PHP? 2.1.1 Milyen opercis rendszer? Ltezik az sszes elterjedt opercis rendszeren, Win32, Linux, Solaris, BSD, Netware. A PHP hazsnlathoz ltalban szksg van egy WEB szerverre is. Gondolva a tanulsra s az ltalban meglv ' szmtstechnikai krnyezetre n Linux, W2000 vagy Windows XP rendszert javaslok. 2.1.2 Milyen WEB szervert? A PHP teleptse el 'tt mindenkppen szksgnk lesz egy m %kd' WEB szerverre. Ehhez a Windows 2000 s Windows XP alatt hasznlhatjuk a Microsoft Internet Information Server nev% szoftvert, amely a rendszer rsze, vagy az internetr'l letlttt Apache WEB szervert. Mi az Apache WEB szervert ajnljuk, annak egyszer % teleptse, egyszer % belltsa miatt. Megjegyezzk, hogy az Apache belltsa majdnem ugyanaz LINUX alatt s Win32 alatt is, teht ennek a rendszernek a hasznlatakor nagyon kis klnbsgek kellenek a LINUX-os verzira val tllshoz. n Windows XP-t Apache 2.0.xx rendszert hasznlok. Lteznek el 're sszelltott s nagyon egyszer %en telepthet' csomagok windows-ra. Ilyen pl. a BigApache ( http://www.bigapache.org), illetve a tovbbiakban felsorolok mg ilyen rendszert. PHPTriad: http://Sourceforge.net/phptriad Uniform WEB server http://www.uniform.server.com Ms WEB szerverek. Amelyek tudnak futtatni PHP-t: AbysWS Personal WEB szerver: http://www.aprelium.com 8 3 A PHP4 teleptse (Win32 vltozat) A PHP teleptse opercis rendszerenknt s WEB szerverenknt ms s ms. A teleptsr 'l tovbbi informci a http://hu.php.net s a http://www.php4win.de oldalakon tallhat. Ha a korbban lert rendszert akarunk telepteni, akkor ltalban egy egyszer % windowsos program telweptsn kell vgigmennnk. A telepts utn lesz valahol egy PHP nev% knyvtrunk. Ha az Apache s a PHP tovbbi konfigurlsra van szksg, akkor egy PHP.INI nev % file-ban kell ezt megtenni, amelynek a Windows knyvtrban a helye. Az Apache konfigurlshoz az apache/conf knyvtrban a httpd.conf file-t kell lltani. Minden llts utn az Apache szervert jra kell indtani. A PHP4 esetn a php4ts.dll-t a C:\WINDOWS\SYSTEM32 vagy a C:\WINNT\SYSTEM32 knyvtrba kell tenni. 3.1.1 Konfigurls Apache WEB szerver 1.3.xx vagy 2.0.xx esetn 1. Az Apache szerver konfigurcis llomnya pldul az C:\Apache\conf\httpd.conf file. Szerkeszd meg ezt a file-t, az albbi mdon: Apache modul esetn: # Apache modul esetn LoadModule php4_module c:/php/sapi/php4apache.dll AddType application/x-httpd-php .php4 Msold be a \Winnt\system32 vagy a \windows\system knyvtrba a php4ts.dll file-t CGI modul esetn: #for the cgi binris esetben ScriptAlias /php4/ "C:/php/" Action application/x-httpd-php4 "/php4/php.exe" AddType application/x-httpd-php4 .php Sajnos jelenleg az Apache modul nem fut a 2.0.xx-es verziban. 2. Keresd meg a DirectoryIndex parancsot a konfigurcis llomnyban s egsztsd ki az albbi mdon DirectoryIndex index.html index.php index.php3 index.php4 3. Indtsd jra az Apache szervert, 4. rd meg a kedvenc ASCII editorod segtsgvel az albbi tartalm scriptet, mentsd el a szervered gykrknyvtrba, majd hvd meg a bngsz'ben az albbi mdon: <?php echo phpinfo(); ?>
5. Prbld ki az albbi programocskt a Bngsz'ddel a szervered root knyvtrbl: http://localhost/proba.php
Ennek hatsra lefut a script s kirja a bngsz'dbe az ppen hasznlt php rendszer rengeteg paramtert. 9 4 Eszkzk a PHP hasznlathoz Felmerl a krds, hogy mi kellhet a PHP hasznlathoz a fentieken kvl. A vrakozssal ellenttben nem sok, de azrt itt sszefoglalom a lehet'sgeket: Kell egy ASCII szvegszerkeszt , kezdetben j a NOTEPAD.EXE a Windowsbl is. Ha ennl komolyabbra vgysz, akkor vlaszd mondjuk az EditPlus nev % editort, amely a http://www.editplus.com cmr 'l tlthet ' le. Szmozza az oldalakat, s mg a szintaktikt is sznezi. Ha az oldalak bonyolultak, akkor tudom ajnlani a ZEND alkalmazscsomagot, amely fizet 's, de nagyon j (http://ww.zend.com) vagy a phpEdit nev% fejleszt'eszkzt (http://www.phpedit.com). Ezen kvl sok ms hasonl editor van forgalomban. A nagyok kzl tudnm ajnlani a Macromedia Dreamweaver Ultradev 4 vagy a Dreamweaver MX csomagot is. Nem rt, ha van egy j HTML editorod, mert a php oldalak jelent 's rszben azrt HTML kdbl is llnak. A freeware vagy shareware programok kztt nagy a vlasztk van, pl. CoffeCup. Kell egy bngsz ', ami adott a Windows-okban Internet Explorer 4/5/6-ot. Az IE azonban nem teljesen szabvnyos, ezrt alternatvaknt hasznlhat a Firefox-ot ( www.mozilla.org), a Mozilla ( www.mozilla.org) illetve az Opera, illetve brmilyen kedvenc bngsz'. Az opera letlthet' a www.opera.com -rl. Szksged lesz egy j Help-re. n a http://hu.php.net/docs.php oldalrl a CHM (Windows-os Help file) vltozatot javaslom, de hasznlhatod a HTML verzikat is, s ha gyors Internet kapcsolatod van, akkor a Internetr'l is lehet online mdon hasznlni 'ket. A HTML verzi sokkal tbb pldt tartalmaz a hozzszlk nagy szma miatt. Nem rt, ha a HTTP-r 'l is van egy j Help-ed. A http://www.htmlhelp.com/ -rl letlthet ' tbbfle formban, kztk Windows-os Help formjban a HTML nyelv szintaktikja. Elkerlhetetlen, hogy a PHP fejleszt 'k megismerkedjenek a Javascript szintaktikjval is. A Javascriptek hasznlathoz Javascript helpre is szksg van. Erre a clra tbb forrs ltezik, de sajnos magyar nyelven s Windows-os Help formjban nem tudok rla: Taln clszer % a kvetkez 't Web oldalt hasznlni http://weblabor.hu/leiras/javascr/ vagy megnzni az albbi oldalt: Szksg lehet egy j HTML / Javascript knyvre, pldul Bcz Pter Szsz Pter: A vilghl lehet'sgei s a CSS szabvnyok ismeretre, mert a formzs manapsg korszer % s elterjedt mdja CSS-en alapul. A http://www.weblabor.hu websiterl kiindulva tallunkmegfelel' CSS lerst is. Ha adatbzisokat akarsz hasznlni a PHP oldalaidon, akkor windowsos krnyezetben ajnlom a Microsoft Access hasznlatt un. ODBC drivereken keresztl, vagy az SQLite ( www.sqlite.org) adatbziskezel 't, amely kicsi, gyors, ingyenes, s a PHP5 rsze, illetve a MySQL-t, ha ( www.mysql.org) ha PHP4-et vagy a MySQLi-t, ha PHP5-t hasznlsz. A hatkony fejlesztshez a ks 'bbiekben clszer% megismerkedni a Pear ( http://pear.php.net ) oldalon tallhat rutinknyvtrral, az ADODB adatbzis absztrakcis rteggel ( http://adodb.sourceforge.net ), a Smarty sablonrendszerrel (http://smarty.php.net). 10 5 Egy HTML s egy PHP oldal szerkezete Miel'tt tovbbmennnk nzzk, mit akarunk programozni? Hogyan is nz ki egy HTML oldal: <HTML> <head> <TITLE>Prba web oldal</TITLE> </head> <BODY> <P> Hello World!!! </P> </BODY> </HTML> Na ez nagy durrans volt. A kisbet %-nagybet% krds nem szmt. A bekezdses rsmdot az ttekinthet 'sgrt hasznlok, de mint ltjuk ks 'bb, ez rendkvl fontos! A bngsz 'k a sor vge jelet, a szkzket s a tabultor jeleket kihagyjk, ezrt akr az egszet egy sorba is rhatnnk. A fenti HTML oldalt az albbi php scripttel tudjuk el'llttatni: <HTML> <head> <TITLE>Proba web oldal</TITLE> </head> <BODY> <P> <?php echo Hello World!!!; ?> </P> </BODY> </HTML> Tisztn ltszik, hogy a program szerkezete nagy vonalakban ugyanaz, de azrt vannak klnbsgek. A PHP rtelmez' a kd els' sorait vltozatlanul tovbbtja a Web szervernek, de amikor a <?php taghez r, rtelmezi az ott lv' sorokat, s az echo paranccsal kirja a Web szerver fel az echo utni szveget. A kvetkez' sorban lv' ?> tag jelzi az rtelmez'nek a PHP script vgt. Egy oldalon tbbszr is megnyithatjuk a scriptet s bezrhatjuk, azaz keverhetjk a php s a HTML kdot, s 't ha van mersznk, akkor beiktathatunk javascriptes rszeket is. Az albbi lehet'sgeink vannak arra, hogy php scriptet helyezznk el egy oldalon: <?php ..............php kd .............?> <script language=PHP> ..... php kd ...</script>
Ha berjuk a PHP.INI-ben, a short_open_tag= on sort, akkor ez a megolds is lehetsges: <?..... php kd ....?>
Ha berjuk a PHP.INI-be az asp_tags = on sort, akkor hasznlhat az albbi szintaktika is: <% ..... php kd ........%>
Specilis lehet 'sg. Ha egy vltoz rtkt szeretnnk csak kiiratni s a short_open_tag = on sor be van rva, akkor egy vltoz rtkt gy adhatjuk t a web oldalnak legegyszer%bben: <?=$valtozo ?>
11 6 A PHP nyelvi szablyai A PHP nyelv szintaktikja nagyon hasonlt a C nyelvre. A php scriptben lv' utastsok mindegyike utn ktelez'en ki kell tenni a ; elvlasztjelet. Megjegyzs: Br a dokumentci azt mondja, hogy egy PHP blokk zr tagja el'tt nem kell kitenni, azrt azt tancsolom, hogy megszoks cljbl mindenhol alkalmazzuk A Megjegyzseinket szintn C jelleg% szintaktikval ktflekppen tehetjk ki: // Az egysoros kommentek, a sor vgig tarthatnak, mint a C-ben # jellel, mint a Unixos shell programoknl /*...................................*/ A tbb soros kommentek <?php echo "Ez egy teszt"; // Ez egy egysoros c++ szer komment /* Ez egy tbbsoros komment Mg egy sor komment */ echo "Ez egy msik teszt"; echo "Ez az utols teszt"; # Ez egy shell-szer komment ?>
Amint ltjuk a fentiek alapjn a kirand szveget jelek kz tehetjk, de a jel pr lehet ... is. A tovbbiakban nzzk meg, hogy milyen tpus rtkekkel dolgozhatunk. 12 7 Vltozk, adattpusok A PHP-ben hasznlhatunk vltozkat is. A vltozkban rtkeket trolhatunk. A vltoz neve el 'tt mindig $ jel tallhat. A PHP flig tpusos nyelv. 7.1 A vltoz neve A vltoz neve bet %vel vagy alhzs jellel kezd 'dik s brmilyen alfanumerikus karakterrel, illetve 127...255 ASCII kd karakterrel folytatdhat. A kis s nagybet%k klnbznek! 7.2 A vltoz rtke Amikor el'szr adunk rtket egy vltoznak, akkor jn ltre a vltoz. $a = 5; $todo = szveg; Ha egy vltoz rtkt azel 'tt vizsgljuk meg, miel 'tt rtket adunk neki, az rtke NULL lesz s a PHP egy NOTICE zenetet kld neknk. Egy vltoz tpust tbbflekppen lehet meghatrozni. - rtket adunk neki, az rtk alapjn ltrejtt vltoznak a tpusa is egyrtelm%v vlik. Belltjuk a tpust a settype (vltoznv, tpus) paranccsal, ahol a tpus az albbiak kzl vlaszthat: "integer", "double", "string", "array", "object" - Tpuskonverzit alkalmazunk. Az alkalmazhat tpusok ugyanazok, mint a fenti pldban, hozzvve, hogy az integer lehet int is, a double lehet float s real is. $a = (int) $b; $c = (string) $d;
A vltozk rtkadsakor hasznlhatunk hasonl trkkket, mint a C-ben: $a = $b = 5; A fenti kifejezst gy kell rtelmezni, mintha az albbiakat rtuk volna le: $b = 5; $a = b; A ks'bbiekben foglalkozunk rszletesen az opertorokkal, amelyek egy vltoz rtkt meghatrozzk. A vltoznak brmilyen mdon rtket adtunk, akkor a tpust is meghatroztuk. 7.3 A vltozk s kifejezsek tpusai A klnbz' programozsi nyelveken megszokott tpusok a PHP-ban is megtallhatk: Numerikus tpusok: int, integer - egsz tpus rtke 32768-32767-ig tart Float, double, real Lebeg'pontos String A C-ben hasznlt string fogalomhoz hasonl, ... vagy .... jelek kz rt ASCII karaktersorozat. Array Tmb tpus. A tmb elemi tetsz 'legesen vegyesek lehetnek Egy tmb lehet egy, kt s tbb dimenzis tmb is. A tmb indexelse trtnhet hagyomnyosan 0-tl kezd 'd' indexelssel, vagy lehet gynevezett asszociatv tmbt is ltrehozni, amikor a tmbindex valamifle string, vagy egyb rtk. Ebben a pldban egy dimenzis tmbt hozunk ltre. $array = array (1, "hello", 1, "world", "hello");
13 Az albbi pldban ktdimenzis asszociatv hozunk ltre. $fruits = array ( "fruits" => array ("a"=>"orange", "b"=>"banana", "c"=>"apple"), "numbers" => array (1, 2, 3, 4, 5, 6), "holes" => array ("first", 5 => "second", "third") ); A hagyomnyos tmbk feldolgozshoz for vagy pedig while cklust hazsnlunk, az asszociattv tmbkhez foreach ciklust. A ciklusokrl ks'bb b'vebben szlunk. Object - Objektum. A tpus hasonlt a C++ objektumaira, de vannak lnyeges klnbsgek is. Egy objektum tpus vltoz ltrehozshoz el 'szr definilni kell magt az osztlyt a class kulcsszval, hasonlkppen, mint C++ -ban, majd a definci utn a new() opertorral ltre lehet hozni a megfelel ' vltozt. A class rszt kpezik vltozk s a classhoz tartoz fggvnyek is. A ks 'bbiekben rszletesen is szlunk az objektumokrl. Az albbiakban egy pldt ltunk. <?php class Kosar { var $dolgok; // A kosrban lev # dolgok
function berak ($sorsz, $db) { // berak a kosrba $db darabot az $sorsz index dologbl $this->dolgok[$sorsz] += $db; } function kivesz ($sorsz, $db) { // kivesz a kosrbl $db darabot az $sorsz index dologbl if ($this->items[$sorsz] > $db) { $this->items[$sorsz] -= $db; return true; } else { return false; } } } $a = new Kosar; ?> boolean Logikai rtkek. Kt rtk el're definilt, a TRUE s a FALSE null - Olyan vltozk, amelyeknek nincsen belltott rtkk Resource Er 'forrsok, mint pldul file vagy adatbziskezel ' mutatja. Valjban ezek a memria egyes helyre mutat pointerek! Unknown type - Ismeretlen tpusok Vltozk s kifejezsek visszatrsi rtknek tpust le lehet krdezni az albbi fggvnyekkel: int empty ($a) Megadja, hogy a vltoz res volt-e vagy nem. string gettype ($a) Visszaadja a vltoz tpust. A lehetsges tpusok az albbiak: "integer", "double", "string", "array", "object", "unknown type" void settype($var,$type) Belltja egy vltoz tpust. A lehetsges tpusok ($type) lehet: "integer", "double", "string", "array", "object" int intval($a,[$alap]) Visszaadja a vltoz rtkt egssz konvertlva a megadott alap szmrendszerben. Az alap default rtke 10. int is_array($a) Megadja, hogy a vltoz tmb vagy sem int is_bool($a) Megadja, hogy a vltoz logikai tpus vagy sem int is_float ($a) int is_double ($a) int is_real ($a) Megadja, hogy a vltoz lebeg'pontos-e, vagy sem.
int is_long ($a) int is_integer ($a) Megadja, hogy a vltoz egsz vagy sem. 14 int is_int ($a)
int is_numeric ($a) Megadja, hogy a vltoz numerikus, numerikus szveg vagy sem. int is_object ($a) Megadja, hogy a vltoz objektum vagy sem int is_resource ($a) Megadja, hogy a vltoz er'forrs azonost vagy sem (pl. file handler) int is_string ($a) Megadja, hogy a vltoz string vagy sem. int isset (vltoz) Megadja, hogy be van-e lltva a vltoz. A visszatrsi rtke hamis, ha nem s Igaz, ha van rtke a vltoznak void print_r(kifejezs) Ember szmra olvashat informcit ad egy vltozrl. <?php $a = array (1, 2, array ("a", "b", "c")); print_r ($a); ?> 7.4 El're definilt vltozk A vltozk kztt vannak olyanok, amelyek a rendszerben el 're definiltak. Ezeknek a vltozknak a nevt s pillanatnyi rtkt a phpinfo() fggvny segtsgvel lehet kiratni. A vltozkra hivatkozva termszetesen az rtkeket fel tudjuk hasznlni, s azt tudjuk manipullni. Ezen vltozknak az rtkt a PHP.INI file-ban lehet belltani, nhny rtk a hasznlt WEB szervert 'l fgg, tovbbi rtkek pedig a futtat opercis rendszert'l fggnek. A vltozk msik nagy csoportjai a rendszerben alkalmazott modulok rtkei. Nhny fontosabb vltoz csoport 7.4.1 Environment Az opercis rendszerr 'l, a krnyezeti belltsokrl, a WEB szerverr 'l, a bngsz'r'l, az aktulisan meghvott laprl s a kliensr'l minden lnyeges adatot felsorol, belertve az IP cmeket is. 7.4.2 PHP Variables - A PHP vltozk listja Tovbbi gyakran hasznlt vltozk tmbjei a szerver ltal szolgltatott tmb s a $_SERVER[PATH] A krnyezeti vltozk $_ENV[valtnev]
Formok kezelsnl hasznlhat vltozk listja a GET metdussal elkldtt vltozk listja s rtkei $_GET[valtnev]
POST metdussal elkldtt vltozk listja s rtkei $_POST[valtnev]
Sessionokben hasznlt vltozk listja s rtkei $_SESSION[valtnev]
A cookiek adatait tartalmaz vltozk. $_COOKIE[valtnev] 15
A HTTP protokollban definilt tovbbi vltozk. Ezek kzl a vltozk kzl nhny megtallhat a krnyezeti vltozk kztt is. A szerver IP cme $_SERVER[REMOTE_ADDR] a szerver neve $_SERVER[REMOTE_HOST] a lekrt oldal azonostja $_SERVER[HTTP_REFERER] a szerverhez kapcsold bngsz' fajtja, az opercis rendszer fajtja $_SERVER[HTTP_USER_AGENT] a WEB oldalnak tadott paramtersztring (a.php?A=proba) $_SERVER[QUERY_STRING] Az aktulisan futtatott PHP oldal azonostja: $_SERVER["PATH_TRANSLATED"] A szerveren lv' WEB szerver gykrknyvtra $_SERVER["DOCUMENT_ROOT"] Az albbiakban egy pldt mutatok be a fenti vltozk hasznlatbl: A pr sort beszrva egy script elejre el '%lltja konstans formban az aktulisan fut script elrsi tvonalt, tovbb a WEB szerver dokumentumainak elrsi tvonalt. $path=dirname($_SERVER["PATH_TRANSLATED"]); DEFINE("PATH",$path); DEFINE("DOCROOT", $_SERVER["DOCUMENT_ROOT"]); 7.5 Konstansok A PHP-ben vannak el're definilt konstansok, tovbb mi is definilhatunk a define(nev, rtk) parancs segtsgvel. Az el're definilt konstansok kzl nhny: __FILE__ az ppen futtatott file neve __LINE__ az ppen fut programsor PHP_VERSION a futtatott rendszer verziszma PHP_OS a futtat opercis rendszer TRUE, FALSE logikai rtkek 16 8 Alapvet utastsok Aki a Pascal nyelven nevelkedett megszokta, hogy a definicis s a vgrehajthat utastsoknak kttt sorrendje van. A C nyelv s tbbek kztt a PHP tartalmaz el 'rsokat az utastsok sorrendjre, de azok nem annyira ktttek, ezrt aztn nagyon knny % ttekinthetetlen s rosszul m %kd' programot rni bennk. Ahhoz, hogy gyorsan tudjunk egy programot rni, ismertetnk nhny utastst. 8.1 Echo A PHP egyik leggyakrabban hasznlt utastsa az echo. Segtsgvel a bngsz 'be ki lehet rni a program futsnak eredmnyt. A kirats sorn gondolnunk kell arra, hogy az eredmny egy HTML kd mindig, amit majd a bngsz' tovbb rtelmez. Az egyms utn r echo parancsok az eredmnyt egyms utn rjk ki a kimenetre, pozicionls, visszalps a szvegben nem lehetsges. Ha a kirs utn j sorban szeretnnk kezdeni a kirst, akkor a HTML szerint egy <BR> tag-et (soremels) vagy kell kirni. Az albbiakban tbb soros kirst alkalmazunk: <?PHP echo Szevasz tavasz<BR>; echo Mit stsz kis szcs?<BR>; ?> A numerikus eredmnyek kirsra is hasznlhatjuk ezt az utastst, azonban formtumozni nem tudjuk a kimenetet gy. <?PHP $a = 5; $b = 6; echo $a + $b; echo Mit stsz kis szcs?<BR>; ?> Tovbbi problma, hogy mi van akkor, ha numerikus informcit s string-et akarunk egy szvegben kirni. A feladat megoldshoz ugyanazt kell hasznlnunk, mint amikor kt string-et akarunk sszef%zve kirni. <?PHP $a = 5; $b = 6; echo Az eredmny: .$a + $b; $sz = Tn ss hst stsz kis sz cs?; echo Mit stsz kis szcs?.$sz.<BR>; ?> A fenti pldban az echo parancs az sszeads m %velett string-g konvertlta s gy ratta ki. A konverzi teljesen automatikus. Tovbbi rdekes lehet'sg, amikor egy string-ben szeretnnk kiratni egy vltoz rtkt: <?php $o = 5 + 6; Echo Az eredmny: $o<BR>; ?> Amint ltjuk, a korbbi megfontolsok alapjn a soremelst a HTML szerint kell hasznlnunk. Az albbiakban nhny gyakran hasznlt tag-et runk le. A hasznlhat tag-ek trt egy HTML kdolssal foglalkoz knyvb 'l, jegyzetb'l vagy Internet helyr'l meg lehet tudni. A kperny'n val soremelsre a <BR> tag szolgl. Vzszintes vonal rsra <HR> Paragrafus eleje, vge: <P> ....</P> Vastag bet% <B> ....</B> D'lt bet% <I> ....</I> 17 Tblzat ltrehozsra az albbi plda egy soros, kt oszlopos tblzatot hoz ltre) <table> <tr> <td> <P> els# oszlop</p> </td> <td> <P> masodik oszlop</p> </td> </tr> </table>
Mivel a fenti TAG-ek sztringek, ezrt clszer%en az echo paranccsal kell kiiratnunk 'ket. Az echo egy nyelvi elem s nem fggvny, azaz valami olyasmi, mintha C-ben egy fggvnymakrt hoznnk ltre. ppen ezrt bonyolultabb kifejezsek kiiratshoz alkalmatlan! Ha az adatokat formzottan szeretnnk kirni, akkor a printf() fggvnyt kell hasznlni 8.2 Formzott kirs print() Ugyanaz, mint az Echo, csak a szintaktika kiss ms. printf() kiirats formzottan sprintf() formzott sztringet ad vissza az albbi szintaktika szerint: string sprintf (string formtum [, mixed paramterek...]) A formtum szerint megadott karaktersorozattal tr vissza. A formtumkarakterek lnyegben a C-ben megszokott formtumkarakterek. A formtumstring tbb direktvt tartalmazhat. A % string vezeti be a direktvkat, majd utna kvetkeznek a formz karakterek. Ezeken kvl minden karakter megjelenik a kimeneten. A kimenet konverzis parancsait a printf() s az sprintf() parancsban ugyangy lehet hasznlni. A konverzis parancssorozat az albbi parancsokat tartalmazza: Opcionlis kitlt' karakter. Ezzel lehet a stringet megfelel ' mretre kitlteni. Default rtke a szkz. Ezen kvl lehet a 0, vagy egyb karakter. Igazts karakter. Az eredmny balra vagy jobbra igaztott lesz. default jobbraigazts; a karakter igaztja balra. Szlessg meghatroz. Megmondja, hogy minimum hny karakter legyen az eredmnyben. A tizedes jegyek szma. Csak a double formtum esetn hatsos. (A szmformtumokat number_format() fggvnnyel tudjuk mg jl kezelni.) A tpusmeghatroz megmondja, hogy milyen tpus adatokat kell kezelnie. Lehet'sgek: % - a % jel. b az argmentum integer, s binris szmknt jelentjk meg c az argumentum integer, ASCII kdknt jelentjk meg. d az argumentum integer, decimlis szmknt jelentjk meg. f - the argumentum double s lebeg'pontos szmknt jelentjk meg. o - az argumentum integer, s oktlis szmknt jelentjk meg. s az argumentum string s gy is jelentjk meg. x - az argumentum integer s hexadecimlis szmknt jelentjk meg (kisbet%vel) X - az argumentum integer s hexadecimlis szmknt jelentjk meg (nagybet%vel)
$isodate = sprintf ("%04d-%02d-%02d", $ev, $ho, $nap); $money1 = 68.75; 18 $money2 = 54.35; $money = $money1 + $money2; // Az echo $money kimenete "123.1" lesz $formatted = sprintf ("%01.2f", $money); // Az echo $formatted kimenete "123.10" echo $money; echo $formatted; 19 9 Opertorok (m #veletek) A kvetkez'kben megismerjk, hogy milyen m%veleteket vgezhetnk a klnbz' adattpusokkal. 9.1 Stringek kztti m%veletek Stringek sszef%zse: . $a = alma.krte ; echo $a; //eredmnye almakrte lesz
Stringek hozzadsa meglv' sztringhez: .= $a = meleg; $a .= vz; $echo $a; // eredmny: melegvz 9.2 Aritmetikai m%veletek A numerikus rtkek sszeadsra ugyanolyan opertorokat hasznlunk, mint ms nyelvekben. echo $a + $b; //$a s $b sszege echo $a - $b; //$a s $b klnbsge echo $a * $b; //$a s $b szorzata echo $a / $b; //$a s $b hnyadosa (egsz, ha $a s $b egszek s a hnyados egsz) echo $a % $b; //Modulus $a / $b maradka 9.3 Hozzrendels, rtkads Az opertor az "=". Ez ugyanazt jelenti, mint Pascalban a := vagy C-ben az =. A bal oldal rtke legyen az, ami a jobb oldal. A hozzrendel' kifejezsnek az rtke a bal oldalhoz rendelt rtk. $a = ($b = 4) + 5; // $a most 9, s $b 4 9.4 Nvel'/cskkent' opertorok A PHP tmogatja a C-ben megismert inkrementl s dekrementl opertorokat. Az albbiakban megismerjk azokat, majd pldt ltunk rjuk: Amikor az opertor a vltoz el 'tt van, akkor a kirtkels sorn el 'szr nvekszik a vltoz rtke, majd rtkeli ki a rendszer, mg a vltoz mgtti opertor esetn el 'szr kirtkeli a vltozt a rendszer, majd nveli vagy cskkenti az rtkt! <?php $a = 33; echo ++$a; // Nveli $a-t eggyel, majd visszaadja $a rtkt echo $a++; // Visszaadja $a rtkt, majd nveli $a-t eggyel echo --$a; // Cskkenti $a-t eggyel, majd visszaadja $a rtkt echo $a--; // Visszaadja $a rtkt, majd cskkenti $a-t eggyel ?> Itt egy msik pldaprogram: <?php echo "<h3>Postinkrementls</h3>"; $a = 5; echo "5-nek kell lennie: " . $a++ . "<br>\n"; echo "6-nak kell lennie: " . $a . "<br>\n";
20 echo "<h3>Predekrementls</h3>"; $a = 5; echo "4-nek kell lennie: " . --$a . "<br>\n"; echo "4-nek kell lennie: " . $a . "<br>\n"; ?> 9.5 Logikai opertorok A logikai m%veletek minden programozsi nyelvben hasonlan nznek ki. Az albbi lehet'sgek vannak. A PHP- ben az igaz rtket mindig az 1 s a hamis rtket a 0 hordozza. Ennek a tudsnak a birtokban ugyanakkor nem clszer% a 0 s 1 rtkeket numerikusan hasznlni. <?php $a = TRUE; $b = FALSE; echo $a and $b; //s Csak akkor igaz, ha mind $a mind $b igazak echo $a or $b; //Vagy Akkor igaz, ha $a s $b kztt van igaz echo $a xor $b; //Kizr vagy Akkor igaz, ha $a s $b kzl pontosan egy igaz echo ! $a; //Tagads Igaz, ha $a nem igaz echo $a && $b; //s Csak akkor igaz, ha mind $a mind $b igazak echo $a || $b; //Vagy Akkor igaz, ha $a s $b kztt van igaz ?> 9.6 sszehasonlt opertorok Az sszehasonlt opertorok, mint nevk is sugallja, kt rtk sszehasonltsra szolglnak. Az eredmny igaz, vagy hamis lehet! Echo $a == $b; //Egyenl# Igaz, ha $a s $b rtke egyenl # <?php $a = alma; $b = krte; echo $a === $b; //Azonos Igaz, ha $a s $b rtke egyenl #, s azonos tpusak // (csak PHP 4) echo $a != $b; //Nem egyenl# Igaz, ha $a s $b rtkei klnbz #k echo $a !== $b; //Nem azonos Igaz, ha $a s $b rtkei vagy tpusai klnbz #k // (csak PHP 4) echo $a < $b; //Kisebb mint Igaz, ha $a szigoran kisebb, mint $b echo $a > $b; //Nagyobb mint Igaz, ha $a szigoran nagyobb, mint $b echo $a <= $b; //Kisebb, vagy egyenl# Igaz, ha $a kisebb, vagy egyenl #, mint $b echo $a >= $b; //Nagyobb, vagy egyenl# Igaz, ha $a nagyobb, vagy egyenl #, mint $b ?> Feltteles opertor a "?:", ami gy m%kdik, mint a C-ben s sok ms nyelvben. (kif1) ? (kif2) : (kif3); A kifejezs kif2-t rtkeli ki, ha kif1 igaznak bizonyul, s kif3-at, ha kif1 hamis. 9.7 Bitorientlt opertorok A bitorientlt opertorok teszik lehet'v, hogy egy egsz rtk bizonyos bitjeit belltsuk, vagy kimaszkoljuk. <?php $a = 126; $b = 3 ; echo $a & $b; //s Azon helyeken, ahol mind $a-ban, mind $b-ben '1' volt, az eredmnyben // '1' lesz, egybknt '0'. echo $a | $b; //Vagy Ott lesz '1' az eredmny, ahol vagy $a-ban, vagy $b-ben '1' llt. echo $a ^ $b; //Kizr vagy Ott lesz '1', ahol vagy $a-ban, vagy $b-ben '1' ll, de csak az // egyikben. echo ~ $a; //Nem $a sszes bitjt invertlja echo $a << $b; //Eltols balra $a bitjeit $b-vel balra tolja (minden tols 2-vel val szorzst // jelent [amg el nem fogynak a bitek. A legfels # helyirtk az // el #jelbit.) echo $a >> $b //Eltols jobbra $a bitjeit $b-vel jobbra tolja (minden tols 2-vel val // [egsz!]osztst jelent. Mivel a legfels # bit az el#jelbit, negatv szm // jobbra tolsa fura eredmnyre vezet!) ?> 21 9.8 Hibakezel' opertorok A PHP egy hibakezel' opertort tmogat, az at (kukac) jelet (@). Ha egy PHP kifejezs el rod, a kifejezs ltal esetlegesen generlt hibazenete(ke)t figyelmen kvl hagyja a rendszer. Ha a track_errors szolgltats be van kapcsolva, brmilyen a kifejezs ltal generlt hibazenet a $php_errormsg globlis vltozba kerl trolsra. Ez a vltoz minden hiba esetn fellrdik, ezrt ellen 'rizd minl hamarabb a kifejezst kvet'en ha hasznlhat informcit szeretnl kapni. <?php /* Szndkos SQL hiba (plusz idz #jel a tblanvnl): */ $res = @mysql_query ("select nev, kod from 'nevlista") or die ("A lekrs sikertelen volt. A hiba: $php_errormsg"); ?> 9.9 Vgrehajt opertorok A PHP-segtsgvel utastsokat hajthatok vgre az opercis rendszeren. A jel a visszaidz 'jel ``. Ha kzjk rok egy parancsot az opercis rendszer rszre, akkor az megprblja vgrehajtani s egy vltoznak tadni az eredmnyt. [Az albbi kis plda az aktulis knyvtr tartalmt (hossz lista, rejtett fjlok is) formzva rja ki (illetve fix szlessg% bet%ket hasznlva, entereket tiszteletben tartva)] <?php $output = `dir C:\`; echo "<pre>$output</pre>"; ?> Ebben a tmban az albbi fggvnyeket rdemes mg megtekinteni a doksibl: system(), passthru(), exec(), popen(), s escapeshellcmd(). 22 10 Vezrlsi szerkezetek A PHP-ben ugyangy, mint ms programozsi nyelvekben az utastsok vgrehajtsnak sorrendje alapvet 'en fentr'l lefel. Ily mdon csak szekvencilis programokat lehet rni, azonban rvid tanuks utn szksgess vlik elgazsokat s ciklusokat tartalmaz programok rsa is. A vezrlsi szerkezetek, mint mindig itt is a C-hez hasonlak. A program a klnbz ' irnyokba val tovbbhaladst ltalban egy kifejezs hatrozza meg. Ennek a kifejezsnek az rtke logikai alapvet 'en, azonban a PHP hasonlkppen, mint a C nem klnbztet meg kln logikai rtkeket, hanem a 0 s a nem 0 rtkek jelentik azt. Ily mdon, ha egy numerikus kifejezs 0, akkor hamis, s ha nem 0, akkor igaznak tekinthet'. Ha egy string kifejezs res, akkor hamis, ha van rtke, akkor igaz. Az olyan vltozk, amelyeket mg azel 'tt rtkelnk ki, hogy rtket kaptak volna (ez nem helyes), a NULL rtkkel brnak. 10.1 Elgazsok Az els' fontos lehet'sg a felttelhez kttt vgrehajts. Ha brmelyik gon tbb utastst akarunk vgrehajtatni, akkor szintn a C szintaktika szerint { ...} jelprost kell hasznlnunk If( utasts) ... if(kifejezs) utasts;
if(kifejezs) { utasts1; utasitas2; ..... }
If .... else....
Ha a kifejezs igaz, akkor az utasts1 klnben az utsts2 hajtdik vgre. if( kifejezs ) utasts1; else utasts2;
Ha a kifejezs igaz, akkor az utasts1 g hajtdik vgre, klnben a msik if( kifejezs ) { utasts1; utasitas2; ..... }else{ utasts3; utasitas4; ..... } If ... elseif ... else ... Ha kett'nl tbb elgazst szeretnnk, akkor az albbi szintaktikval tudjuk a krdst megoldani: if( kifejezs1 ) utasts1; elseif(kifejezs2) utasts2; else utasts3; vagy if( kifejezs1 ) { utasts1; utasitas2; ..... }elseif( kifejezs2 ){ utasts3; 23 utasitas4; ..... }else { utasts5; utasts6; ...... } Switch(kifejezs) A fenti esetben az if s az elseif utastsnl lv ' kifejezsek tetsz 'legesek lehetnek, s az gy felrt vezrlsi szerkezettel meglehet'sen bonyolult elgazsokat lehet ltrehozni. Ezzel szemben ltalnosabb eset, amikor egy vltoz rtkt 'l fgg'en akarunk tbb fle m %veletet is vgrehajtani. Erre a clra alkalmas a C-b 'l jl ismert switch() fggvny, amely tbb irny elgazst hajt vgre. Az gak meghatrozsakor csak konstansokat hasznlhatunk, s az gra akkor addik t a vezrls, ha a switch fggvnyben lv ' vltoz rtke pontosan a konstans rtkvel egyezik meg. Amennyiben egy gra radtuk vezrlst, majd vgrehajtottuk az ott definilt utastsokat, a switch szerkezet vgre kell ugranunk a break utasts segtsgvel, mivel klnben rcsorognnk a kvetkez' case felttelvizsglatokra. Nzzk a szintaktikjt: switch ($i) { case 0: print "i most 0"; break; case 1: print "i most 1"; break; case 2: print "i most 2"; break; default: print "i se nem 0, se nem 1, se nem 2";
} A fenti pldban az $i vltoz rtkt 'l fgg'en lptnk valamelyik irnyba. Ha a vltoz rtke nem vette fel sem a 0, 1 vagy 2 rtkeket, akkor a default utni parancs hajtdik vgre. Gyakori eset, hogy amikor tbb klnbz ' esemnyt egyetlen vltoz klnbz ' rtkei alapjn akarsz vgrehajtatni, akkor hasznlod a switch utastst. El 'fordulhat, hogy ugyanazt az esemnyt tbb rtk is jellheti, illetve tbb klnbz' esemny van. Az albbi pldban a $jelz ' vltoz 0, 1, 2 rtke esetn az fv1() fggvny fut le, a 3-as rtkre az fv2() fggvny, egyb esetekben az fv3(). switch ($i) { case 0: case 1: case 2: fv1($jelzo); break; case 3: fv2($jelzo); break; default: fv3($jelzo); } A fenti pldban az fv1, fv2, fv3 fggvnyek lehetnek akrmik! 24 10.2 Ciklusok Mint a C-ben, itt is hasonl ciklusszerkezetek lteznek. While (kifejezs) Itt a kifejezs a ciklus el'tt rtkel'dik ki, azaz a ciklus magja nem biztos, hogy vgrehajtdik. While (kifejezs) utasts; While (kifejezs) { Utasts1; Utasts2; ... } Plda: <?php $i = 1; while ($i <= 10) { print $i++; // a kirt rtk $i, a kirs utn n # $i rtke } $i = 1; // Az el #z# ciklus mskppen, de ugyanazzal az eremdnnyel while ($i <= 10) { print $i; // a kirt rtk $i, a kirs utn n # $i rtke $i++; } ?> Do ..... While(kifejezs) A kifejezs a ciklus vgn rtkel'dik ki, azaz a ciklus magja egyszer mindenkppen lefut. Do utasts while(kifejezs); Do{ Utasts1; Utasts2; ... }while(kifejezs); Plda: <?php $i = 0; do { print $i; } while ($i>0); ?> For(inicializl kifejezs; Benntmarads kifejezse; iterl kifejezs) A ciklus elejn egyszer fut le az inicializl kifejezs. ltalban ez egy vltoznak ad egy kezd'rtket. Az ilyen vltozt ciklusvltoznak hvjuk. A Benntmarads kifejezse mindannyiszor a ciklus magjnak lefutsa el 'tt rtkeli ki a rendszer. Ha a kifejezs igaz rtket ad vissza, akkor lefut a ciklus magja, ha hamis rtket, akkor a ciklus utni els ' utastson folytatdik a futs. Ha a kifejezs helyre res rtket runk, akkor vgtelen ciklusba kerlhetnk, hacsak a ciklus belsejb'l nem ugrunk ki a break utastssal. Az Iterl kifejezs felel's azrt, hogy a ciklus valamikor befejez 'djn. ltalban a ciklusvltoz rtkt nveljk vagy cskkentjk eggyel. For (init;bentmarads;itercio) utasts; For (init;bentmarads;itercio){ Utasts1; Utasts2 ...... } Plda: <?php // rassuk ki az egsz szmokat visszafel 100-tl 1-ig 25 for ($i = 100; $i >0; $i--) { print $i; }
//rassuk ki egy kt dimenzis tmb elemit soronknt $a= array( array(3,5,4,6),array(12,234,12,12),array(3,6,5,77)); for ($i =1; $i<= 0; $i--) { for (j=1;j<=4;j++){ print $a[$i][$j]. ; } print <BR>; } ?> Foreach ( tmb_kifejezs as $rtk) vagy Foreach ( tmb_kifejezs as $kulcs => $rtk) Ez a fajta ciklus a Perl nyelvb'l kerlt t a PHP-be. Ezt a ciklust arra hasznlhatjuk, hogy egy ciklussal vgigmenjnk egy tmb minden egyes elemn. Rendkvl jl hasznlhat adatbzis lekrdezsek vagy egyb tmbben visszaadott adatok feldolgozsa sorn. Ktfle Foreach ($tmbvltoz as $ertek) utasts; Foreach ($tmbvltoz as $ertek){ Utasts1; Utasts2 ... } Plda: $tomb = array (1, 2, 3, 17);
foreach ($tomb as $ertek) { print "Az aktulis rtke \$tomb-nek: $ertek.\n"; } A msodik formban a $kulcs vltoz megkapja a tmb ppen aktulis indext, ezltal egyes esetekben knnyebb a feldolgozsa Foreach($tmbvltoz as $kulcs => $ertek) utasts; Foreach ($tmbvltoz as $kulcs => $ertek){ Utasts1; Utasts2 } Plda: * harmadik foreach plda: kulcs s rtk */
foreach ($tomb as $kulcs => $ertek) { print "\$tomb[$kulcs] => $ertek.\n"; } break vagy break n A break utasts arra szolgl, hogy segtsgvel egy struktrbl az adott helyen ki tudjunk ugrani. Ha utna runk egy szmot, akkor annak alapjn tbb egymsba gyazott struktrbl is ki tud ugrani: Pldnak okrt korbban a switch utastsnl mutattunk egy pldt a break hasznlatra, az opcionlis mdra pedig itt van egy plda: $i = 0; while ($i++) { switch ($i) { case 5: echo "5 esetn<br>\n"; break 1; /* csak a switch-b#l lp ki */ case 10: echo "10 esetn kilps<br>\n"; break 2; /* a switch s a while befejezse */ default: break; 26 } } continue vagy continue n Br programozsi mdszertanok kerlik a ciklusokbl val kiugrlst s a ciklusmagon belli itercit, azrt minden ltalnos nyelvben benne van a lehet'sg, belertve a Pascalt s a C-t is. Ez az utasts akkor hasznlhat, ha a ciklus belsejben mr eld 'lnek a tovbbi itercira vonatkoz felttelek s nem akarjuk, hogy a ciklus magjnak tbbi rszt feleslegesen futtassuk. Ha a continue n formt hasznljuk, akkor tbb egymsba gyazott struktrt tudunk folytatni. Az albbi pldban 100 db vletlenszmot hozunk ltre a 0..4 egsz tartomnybl s az eloszlsukat vizsgljuk. A continue utastsok hatsra ha megvan az rtk, tovbbi feltteleket nem rtkel ki a program, hanem rgtn iterlja a for ciklust. <?php $n = 100; srand (double) microtime() * 1000000); $a1=$a2=$a3=$a4=$a5=0; for($i=1;$i < $n;$i++){ $veletlen= rand(0,4); switch($veletlen){ case 0: $a1++; continue; case 1: $a2++; continue; case 2: $a3++; continue; case 3: $a4++; continue; default: $a5++; } } ?> 10.3 Elgazsok s ciklusok hasznlata HTML kddal keverve Gyakori, hogy a HTML oldalon kt klnbz' kdot szeretnnk megjelenteni, attl fgg'en, hogy ppen melyik felttel igaz, ugyanakkor a kirand HTML rszt tl bonyolultan llthatjuk csak el ' PHP-ben. Ebben az esetben alkalmazni lehet az albbi pldhoz hasonlt: <?php if ( kifejezs) { echo elso g; ?> <table> <tr> <td> <P> Szevasz tavasz, a kifejezs igaz</p> </td> <td> <P> valamit visz a vz</p> </td> </tr> ....... </table> <?php } else { echo Msik oldal; ?> <p> Ez a rsz itt egyszer bb lett!</p> <?php } ?> Az igaz kifejezs esetn az igaz gban ltrejv' egy soros tblnak kt oszlopa lesz, mg a hamis rtk esetn csak a msodik szakaszban lv ' kirs jelenik meg, mivel a PHP amikor megszakad a PHP kd itt tbbszr is megszakad -, akkor a szervernek vltozatlanul adja vissza a HTML kdot. Sajnos az gy megrt program kiss ttekinthetetlen. 10.4 PHP lapok beszrsa, makro-k hasznlata. Gyakran megfogalmazott feladat, hogy egy tbb lapbl ll PHP programban minden PHP oldal elejn fussanak le ugyanazok a belltsok, ugyanazok az inicializl paramterek, illetve ugyanazokat a fggvnyeket s lehet'sgeket hasznljuk minden PHP scriptben. Valami olyasmire gondolok itt, mint Pascal-ban a unit fogalma vagy C-ben a header file-ok fogalma. 27 Erre a clra kt parancs ll rendelkezsre, amelyeknek a m %kdse nem pontosan ugyanaz, de nagyon hasonl. Mind a kt esetben arrl van sz, hogy a PHP script egy adott pontjn behvunk egy file-t, amelynek a kdja futsid'ben bekerl a PHP scriptbe, a szerver kirtkeli, s annak megfelel 'en jr el. A file tartalma teht a futs idejre gy vlik a PHP script rszv, mintha eleve abba bertuk volna. Mivel a Webszerver kezdi a krdses include file-t feldolgozni, ezrt ilyenkor HTML mdba kerl a szerver, gy a PHP kd feldolgozshoz az include file elejn PHP nyit tag-et kell elhelyezni s a vgn zrtag-et. (<?php .............?>) Include () Az include hasznlata esetn a megadott file mindannyiszor kirtkel 'dik, ahnyszor a vezrls az include-ra kerl. Ennek eredmnyeknt, ha egy ciklus belsejben megfelel 'en helyezzk el a file-t, akkor a ciklus rtkt 'l fgg'en mindig ms s ms file-t szerkesztnk be, mint az albbi pldban lthatjuk: $fileok = array ('elso.php', 'masodik.php', 'harmadik.php'); for ($i = 0; $i < count($fileok); $i++) { include ($files[$i]); } require() A require parancs akkor is beolvassa a clfile-t, ha soha nem hajtdik vgre, s ha hinyzik a file, akkor a program futsa megszakad. A fentiek miatt require parancsot csak konstans file-nevekkel szabad hasznlni. <?php require ("file.php"); ?> include_once() Az utasts hasonlt az include() utastsra, azzal a klnbsggel, hogy csak egyszer kerl bele a futskor a krdses file. Ez azrt fontos, mert ha az include() utastssal tbbszr is meghvjuk futs kzben ugyanazt a file- t, akkor a benne lv' globlis vltozk s fggvnyek tbbszr kerlnek a kdba, ami miatt a futs hibazenettel lell, hiszen ugyanaz az azonost ms s mst jell. Az include_once() segtsgvel ezt a hibaforrst kikszblhetjk. require_once() Az utasts hasonlan az include_once() utastshoz csak egyszer hvja be a krdses file-t futs kzben, gy a fggvnyek s globlisvltozk jradefinilsa krli problmk kikszblhet 'k. Egybknt a require() utastssal megegyez' a szerepe s m%kdse. 10.5 Tvoli file-ok hvsa A fenti kt utasts include s require alkalmas arra, hogy a PHP megfelel ' konfigurlsa esetn, akr msik Web szerveren is elrjnk tvoli file-okat. Ehhez az "URL fopen wrapper"-eket kell bekapcsolni, a PHP4.0.3-tl kezd'd'en az allow_url_fopen php.ini belltsval. Ez a lehet'sg Windows rendszereken nem m%kdik. Ennek a tulajdonsgnak persze vannak veszlyei is. Ha egy ilyen tvoli hvs sorn olyan lapot hvunk meg, aminek a tartalmra nincsen hatsunk, akkor az include-olt file tartalma lehet olyan, hogy a mi rendszernkre veszlyeket hordoz. A tvoli helyen megfelel 'en elksztett lap email-ben elkldheti az azonostkat s egyb olyan adatokat, amelyeket nem szeretnnk nyilvnossgra hozni, ezrt ezzel a lehet'sggel vatosan kell bnni. 28 11 Sajt fggvnyek, vltozk lettartama s lthatsga Eddig sok sz esett a vltozkrl s esetenknt a fggvnyekr 'l is, azonban az eddigiek alapjn azt gondoln az ember, hogy csak ilyen egyszer% programok rhatk PHP-ben. Az igazsg az, hogy PHP-ben csak a futsi id' s a futtat rendszer memrija szab hatrt az alkalmazott program bonyolultsgnak. 11.1 Fggvnyek A PHP-ban is hasznlhatunk programstruktrkat, programszegmenseket. Mr Pascal-bl vagy C-b 'l is jl ismerhetjk az alapvet ' kt eljrstpust, amit Pascalban Procedure illetve Function nvvel illetnk, C-ben pedig tpus nlkli illetve tpusos function-nak mondunk. Mind a kt nyelven a klnbsg az, hogy ad-e vissza a krdses eljrstpus rtket, vagy nem. A PHP-ben csakgy, mint a C-ben ktfle eljrstpust hasznlhatunk. A szintaktika a kvetkez': Ez az eljrstpus nem ad vissza rtket. function fggvny_nv(paramterlista) { A fggvny trzse; } Ez az eljrstpus a definiltnak megfelel' tpus rtket ad vissza: function fggvny_nv(paramterlista) { A fggvny trzse; return rtk; } Lthat, hogy a visszatrsi rtk lte vagy nem lte a programoztl fgg, ezrt egyes esetekben clszer % a visszatrsi rtk tpust megllaptani ahhoz, hogy van-e egyltaln visszatrsi rtk. Rekurzi lehetsges a fggvnyhvsoknl, de termszetesen arra kell vigyzni, hogy a rekurzi vget rjen. Az albbi kis plda az N faktorilis kiszmtst vgzi rekurzv mdon. <?php function nfakt($n){ if ($n>1) $nf = $n*nfakt($n-1); else $nf = 1;
echo $n." => ".$nf."<BR>"; return $nf; } nfakt(200); ?> 11.2 Paramtertads Egy fggvny definilsakor meg kell hatrozni, hogy milyen paramtereket vegyen t. Ezt a formlis paramterlistval tudjuk megtenni, amelyben az tvev' vltozk neveit vessz'vel elvlasztva fel kell sorolni. A hvskor nem kell minden paramtert tadni. Ebben az esetben a krdses paramtereknek a fggvnyen bell nem lesz rtke. Az empty() fggvnnyel lehet megvizsglni, hogy egy paramter kapott-e rtket vagy sem vagy a fggvny formlis paramterlistjban default rtket kell adni a paramternek. A PHP-ben ktfle paramtertads, ltezik rtk szerinti A hv kifejezs rtke behelyettest 'dik a meghvott fggvny paramterlistjban szerepl ' vltozba s a fggvnyen bell a paramter hasznlhat. Ez az alaprtelmezs. Cm szerinti Ez azt jelenti, hogy a vltoz memriacmt adjuk t a fggvnynek, amely a cm ismeretben tudja azt mdostani s a fggvnyb'l val visszatrskor a vltozsok megmaradnak. Ez utbbi esetben, ha cm szerint akarunk tvenni rtket egy fggvnnyel, akkor hasznlnunk kell a & opertort. <?php function fgv(&$n) { $n *= 2; 29 }
$n=100; echo $n<BR>; fgv($n); echo $n<BR>; ?> A fggvnyek paramtereinek tvtele mg egy mdon megtrtnhet. A PHP tmogatja a paramterek kezd'rtkadst. Ennek akkor van rtelme, ha a fggvny hvsakor nem adtunk t rtket a fggvnynek. Ilyenkor alaprtelmezett rtket kap az a paramter, amelyet a hv nem adott t. Termszetesen az t nem adott paramtereknek a helye az tadottak utn helyezkedjen el! <?php function joghurtot_keszit ($flavour, $type = "acidophilus") { return "Ksztek egy kcsg $flavour z $type-ot.\n"; }
echo joghurtot_keszit ("eper"); ?> Ha azt szeretnnk, hogy egy fggvny vltoz szm paramtert vegyen t s a fggvnyben meg akarjuk llaptani, hogy ppen most hny paramter van, akkor a kvetkez' fggvnyeket hasznlni: func_get_args() - Egy tmbben visszaadja az tadott paramterek listjt. func_num_arg() - Megadja a kapott fggvnyek szmt func_get_arg(sorszm) - Visszaadja a sorszm paramterrel megadott paramtert. Ha a sorszm nagyobb, mint a paramterlista utols elemnek indexe, akkor hibazenet jn (warning). A paramterlista indexe 0-val kezd'dik. Az albbi plda ezeket pldzza. <?php function foo() { $numargs = func_num_args(); echo "paramterek szma: $numargs<br>\n"; if ($numargs >= 2) { echo "A msodik paramter: " . func_get_arg (1) . "<br>\n"; } $arg_list = func_get_args(); for ($i = 0; $i < $numargs; $i++) { echo "$i-ik paramter: " . $arg_list[$i] . "<br>\n"; } } foo (1, 2, 3); ?> 11.3 Fggvnyek visszatrsi rtke Egy fggvny tetsz 'leges tpust, mg tmbt, vagy vltozreferencit is vissza tud adni. Tbb rtk visszaadsra a tmbt hasznlhatjuk. 11.4 Vltozk lettartalma s lthatsga A PHP-ban nagyon egyszer% szablyok vannak a vltozk lthatsgra s lettartamra vonatkozlag. lettartam A vltoz akkor jn ltre, amikor ltrehozzuk, rtket adunk neki. Egy vltoz megsemmisl, ha az unset(vltoznv) paranccsal felszabadtjuk a vltoz nevt (memriaterlett is), vagy vget r az adott PHP script oldal. Ez all kivtel, ha a vltozkat tadjuk egy msik PHP oldalnak a POST, GET metdussal, a cookie-k vagy sessionok hasznlatval. Egy PHP minden rszn hasznlhatk a $_POST, $_GET, $_SESSION, $_COOKIE, $_ENV, $_SERVER, $GLOBALS tmb elemei. Ezek a szupergloblis vltozk. Ltezik-e a vltoz 30 Azt, hogy egy vltoz ltezik-e az isset() fggvnnyel krdezhetjk le. Igazat ad vissza, ha a vltoz ltezik, az empty() fggvny pedig igazat ad vissza, ha a vltoz rtke 0, res, vagy nem ltezik! <?PHP if (!isset($_SESSION[logged_in])) die(Jelentkezz be!); print(Belptl!); ?> Lthatsg A PHP oldalon ltrejtt s a klnbz ' mdokon tvett vltozk globlisak, azaz attl a helyt 'l kezdve lthatk mindenhonnan, azonban ha meghvunk egy fggvnyt, akkor abban a fggvnyben csak azok a vltozk lthatk, amelyeket a fggvnyben hoztunk ltre, vagy paramterknt adtunk t. Ha a fggvnyb 'l kilpnk, akkor ezek a vltozk megsemmislnek kivve, ha nem cm szerinti paramtertads sorn jttek ltre. Azaz ezek a vltozk loklisak lesznek a fggvnyre nzve. Ha egy fggvnyb'l j fggvnyt hvunk, akkor abban nem lehet ltni a hv fggvny vltozit. A fentiek all az egyetlen kivtel, ha a fggvnyben hasznljuk a global parancsot, aminek segtsgvel importlhatjuk a script globlis vltozit a fggvnybe. <?php $a = 1; $b = 2;
Function Osszead () { global $a, $b; $b = $a + $b; } Ossszead (); echo $b; ?>
A msik lehet 'sg az, hogy hasznljuk a $GLOBALS[] asszociatv tmb rtkeit, amelyben minden bejegyzett globlis vltoz megtallhat. <?php $b = 1; $a = 10; $GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"]; echo $b; ?>
Ltrehozhatunk statikus vltozkat is. Statikus vltoz egy fggvnyben jhet ltre. Amikor kilpnk a fggvnyb 'l mr nem hasznlhatjuk ennek a vltoznak az rtkt, de ha jra meghvjuk a fggvnyt, nini mg megvan az el 'z' rtke. J ott folytathatjuk, ahol abbahagytuk. Ennek nha van rtelme. Mindenesetre a hasznlathoz a fggvnyben a static kulcsszt kell hasznlni. Az albbi kis szsszenet egy ciklusbl meghvja jra meg jra a Test() fggvnyt s ennek sorn az $a vltoz tartalma folyamatosan n', noha mindig kilpnk a fggvnyb'l. Na ja, statikusnak deklarltuk! A statikus vltoznak kezd'rtket adva, az csak egyszer fut le, amikor el'szr meghvjuk a fggvnyt. Function Test () { static $a = 0; echo $a; $a++; } for ($i =0; $i< 10;$i++) { Test(); Echo blablabla } 11.5 Vltozk tadsa lapok kztt Gyakori krds a PHP-ben programozk kztt, hogyan tudnak rtkeket tadni a PHP lapok kztt, hiszen ha egy lap lefut, akkor eddig gy tudtuk, hogy a lapon keletkezet vltozk is megsz %nnek. Amikor el 'szr 31 szembekerltem a problmval, akkor azt hittem, hogy a globlis vltozk oldjk meg a problmt. Sajnos a dolog nem ennyire egyszer %, de nem is tlsgosan bonyolult. tadhatunk egyedi vltozkat s egy dimenzis tmbket is. Ngy lehet'sgnk van erre. 11.5.1 Header utasts A Header utastst csak akkor hasznlhatjuk, ha az adott oldalon mg semmifle kperny're rs nem volt, azaz a keletkez' HTML oldal tartalmi rszt mg nem kezdtk rni. A header segtsgvel brmilyen header-t elkldhetnk. Az albbi pldban egy teljes header sorozatot runk ki a HTML oldalra header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Date in the past header ("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); // always modified header ("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1 header ("Pragma: no-cache"); // HTTP/1.0
header ("HTTP/1.0 404 Not Found");
Itt egy hibakezelst runk ki, az URL nem tallhat. Akkor lehet ilyet tenni, ha pldul az Apache szervernk hibazeneteit tirnytjuk a sajt oldalainkra. header ("HTTP/1.0 404 Not Found"); Bngsz' tirnytsa. Itt adhatjuk meg az j oldalt. Ez a parancs nem csak a bngsz 't vgja t az j oldalra, hanem a szervernek is visszakld egy tirnyts sttusz zenetet is. header ("Location: http://www.php.net"); /* tirnytja a bngsz#t a PHP web oldalra */ exit; /* Ha nem megy az tirnyts, akkor az exit parancs biztosan kilp */
11.5.2 GET metdus A GET metdust gy hasznlhatjuk, hogy meghvunk egy lapot az oldalunkrl egy msik lapot s az URL vgre paramterknt tadjuk a vltozkat, valahogy gy, ahogy a kvetkez' pldkban ltjuk: Az els' pldban igazbl nem is PHP a megolds, egyszer %en a <BODY> TAG-ben megadjuk, hogy melyik oldalt s menyi id ' mlva hvja meg az oldal. Ennek a megoldsnak hibja, hogy tulajdonkppen itt egy Javascriptet hasznlunk. A pldban 3 msodpercig vr a betlt'ds utn a bngsz', majd a szerver tdobja az j oldallal s meghvja a lapot a user, pwd s a level vltozkkal. <BODY OnLoad=timerID=setTimeout('location="index.php?user=anonym&pwd=anonymous&level=1"',30000)>
A kvetkez' pldban hasonlt tesznk, de itt a HTML oldal fejlcben dolgozunk. Felhasznljuk a HTML meta tag-jt. Itt is 3 msodperc mlve hvja be a kvetkez' oldalt s az el'z' oldalrl tadjuk az el'z' pldban ltott 3 vltoz pillanatnyi rtkt. <meta http-equiv="refresh" content="3; URL=<index.php?<?php echo user=$user&pwd=$pwd&level=$level ?>">
A harmadik pldban a PHP header utastst hasznljuk. A pldban egy POST metdussal egy %rlapon bevitt adatokat vizsglunk meg, s amennyiben hinyzik az adat, akkor egy hibakezel ' fggvnybe irnytom t, ahol a header segtsgvel tirnytom egy msik oldalra, tadva neki a megfelel' vltozkat. function sorry($msg,$from=1,$glob="") { header("Location: sorryuser.php?from=$from&msg=$msg&glob=$glob"); }
if(empty($name)) sorry("Hinyzik a nv adat! Ktelez # kitlteni",1); if(empty($loginname)) sorry("Hinyz login nv! Ktelez # kitlteni",1); if(empty($email)) sorry("Hiny E-mail cm! Ktelez # kitlteni. Itt kapod meg a jelszt!",1);
A fenti hrom lehet'sg kzs hibja az, hogy az tirnytott lapok URL-je megjelenik a bngsz'ben, azaz titkos informcit nem tudunk tadni, tovbb azok a bngsz 'k, amelyek nem t %rik az tirnytst, nem fognak tovbbmenni. 32 11.5.3 POST metdus A POST adattviteli metdust az %rlapokkal kapcsolatban hasznlhatjuk legtermszetesebben. Itt egyel 're csak annyit mondunk, hogy az rlapok olyan HTML kdok, amelyen keresztl a bngsz' el'tt l' felhasznl berhat adatokat a HTML oldalon, az %rlap SUBMIT gombjnak megnyomsra pedig az %rlapon definilt mez 'k tartalmt, mint vltozneveket s vltoz tartalmakat elkldi a cl oldalnak a bngsz '. Az %rlap fejlcben meg kell adni a cl oldalt (kinek kldjk) s a megfdelel ' oldal, ha az olyan oldal, amit a szerver meg tud jelenteni betlt'dik a bngsz'be. A PHP esetn a mdszer az, hogy az %rlap kitltse utn a submit gomb megnyomsval elkldjk az eredmnyeket egy PHP oldalnak, amely betlt 'dskor megkapja az elkldtt vltozkat, esetleg elvgzi azokat a ferladatokat, amelyekre rendeltetett, majd megjelent valami vlaszt. Ennl a mdszernl, az elkldtt rtkek nem lthat mdon kerlnek el a meghvott oldalhoz, teht ezzel a mdszerrel viszonylag knny% vltozrtkeket tadni. Vigyzni kell azonban arra, hogy az adatbevitel alapvet 'en string s ha nem gy hasznljuk fel azokat a bevitt stringeket, hogy el'tte kisz%rjk a ../../etc/ ... stb jelleg % adatrokats nem figyelnk arra, hogy az eredmnyeket a lehet' legtbb szempont szerint ellen'rizzk, akkor a web site-unk feltrhet' lehet. Az albbi pldban egy olyan HTML oldalt mutatok be, amely egy %rlapot tartalmaz, a submit gomb megnyomsnak hatsra az oldal nmagnak (!) kldi el a vltozkat, majd a submit vltoz rtke alapjn egy elgazsra kerl a vgrehajts s az eredmnyt elkldi e-mailben egy megadott cmre. A lapon van egy kis Javascript bett is, amely az aktulis id'pont beszrsra szolgl. Az %rlapon tallhat olyan mez' is, amelynek a tartalma hidden, azaz az %rlapon nem jelenik meg. <html> <head> <meta http-equiv="Content-Language" content="hu"> <meta http-equiv="Content-Type" content="text/html; charset=windows-1250"> <title>Munkalap</title> <script language="JavaScript">
function Kitolt() { var x=0; for (x=0;x<document.munkalap.lista.length;x++) if (document.munkalap.lista.options[x].selected) document.munkalap.ceg.value = document.munkalap.lista.options[x].value; Alert (document.munkalap.lista.options[x].value); }
<script language="php"> $datum = date('Y.M.d H:i'); //aktulis dtum $mikor= date ('Y.M.d'); // if (!empty($pswd)) // egyszer (primitiv) password ellen#rzs $jls = "_".$pswd."_"; // Lehetne biztonsgosabban is, de itt most ez nem szempont else $jls = "__";
// A munkalap elkldshez ki kell tlteni a partnercg nevt is. if(!empty($ceg)) { $jel= (strpos($jls, "xxxx") == 0) | empty($munkavegzo); if(!$jel) { // Itt lltjuk ssze az Email-t az tkldtt vltozk rtkb #l. $uze =""; $uze= $uze ."Cg $ceg\n"; $uze= $uze ."Bejelent# $bejelento\n"; $uze= $uze ."Bejelents id#pontja $mikor\n"; $uze= $uze ."Hibajelensg $hibajelensg\n"; $uze= $uze ."A hiba oka $hibaok\n"; $uze= $uze ."Az elvgzett munka $elvegzett_munka\n"; $uze= $uze ."A munkavgzs alapja\n"; $uze= $uze ."- Garancilis $grancilis\n"; $uze= $uze ."- Rendszergazdai $rendszergazda\n"; $uze= $uze ."- Fizet#s $fizetos\n"; $uze= $uze ."- Kiszlls $kiszallas\n"; 33 $uze= $uze ."- Mhelyben $muhely\n"; $uze= $uze ."- Rendszergazdai $rendszergazda\n\n"; $uze= $uze ."A szksges munkaid# $munkaido\n"; if (!empty($munkadij)) { $uze= $uze ."Szmlzott munkadj $munkadij Ft + 25% FA\n\n"; } if (!empty($alkatreszek)) { $uze= $uze ."Beptett alkatrszek $alkatreszek\n"; $uze= $uze ."Alkatrszek ra $alkatreszar Ft + 25% FA\n\n"; } $uze= $uze ."\n"; $uze= $uze ."Munkavgz# $munkavegzo\n"; $uze= $uze ."Dtum $datum\n"; $uze= $uze ."Igazols $igazolas\n\n"; $uze= $uze ."A munkalapot kld# gp adatai\n"; $uze= $uze ."A gp IP cme ".$HTTP_ENV_VARS['HTTP_HOST']."\n"; $uze= $uze ."A gp neve ".$HTTP_ENV_VARS['REMOTE_HOST']."\n"; $uze= $uze ."A gpen fut bngsz# ".$HTTP_USER_AGENT."\n";
mail("europr@matavnet.hu","munkalap",$uze);
if( Die("Az munkalapot elkldtk!")); } if ($jel) </script> <script language="javascript"> Alert ("Hinyosan tlttte ki a munkalapot"); </script> <script language="php"> } </script>
<p><A HREF="index.html" onMouseOver="document.vissza.src='../visszaanim.gif';" onMouseOut="document.vissza.src='../vissza.gif'"> <IMG SRC="../vissza.gif" NAME="vissza" ALT="Vissza a f#oldalra" BORDER=0 height="25"> </A> </p> <p>Utols mdosts: 2011. mrcius 12.</p> </body> </html> 11.5.4 $_SESSION vltozk A session vltozk olyan vltozk, amelyek megtartjk rtkeiket mikzben a felhasznl egyik oldalrl tlp a msikra anlkl, hogy a korbban ismertetett mdszerek valamelyikvel direkt t kellene adnunk az rtkeket a lapok kztt. Ez a lehet 'sg igazi globlis vltozkat enged meg s sokkal sszetettebb WEB-es programok ksztst teszi lehet'v. Tbb lapbl ll site fejlesztse gyakorlatilag session vltozk nlkl nem megy. Amikor egy felhasznl belp egy WEB oldalra, akkor egy egyedi azonost keletkezik, az gynevezett session id (SID), amelyet vagy a bngsz'ben trolunk gynevezett cookie (sti) formjban, vagy a szerver oldalon tartunk nyilvn. A sessionok tmogatjk korltlan mennyisg% vltoz regisztrlst s a tartalmuk megtartst. Amikor a felhasznl elri a web oldalt, akkor a PHP automatikusan leellen 'rzi, hogy a megfelel ' session id vajon mr ltezik-e a szerveren. Ha ltezik a session id, akkor a session-hz tartoz elmentett rtkeket hozzrendeli a lekrt oldalhoz. Minden oldal elejn hasznljuk a session_start() fggvnyt, vagy implicit mdon a session_register() fggvnyt. Amikor a ltogat elindt egy PHP-s lekrst, a PHP motor megnzi, hogy a fenti esetekben van-e a krshez hozzrendelve egy session id. Ha van, akkor a korbban elmentett krnyezetet hozzrendeli ehhez a krshez, azaz visszalltja a megfelel ' vltozkat. Minden regisztrlt vltozt elment a rendszer a krs befejez 'dsekor. Azok a regisztrlt vltozk, amelyek nem kaptak rtket, azaz nem definiltuk 'ket, a nem definiltak kz kerlnek. Ezek a vltozk csak akkor kerlnek a definiltak kz ks'bb is, ha a user rtket ad neki. Ha a register_globals engedlyezett, akkor minden globlis vltozt session vltoznak tudunk elmenteni, s a session vltozk a kvetkez' krs sorn automatikusan globlis vltozkk vlnak. Hogyan kezelhetjk a session id-ket? Cookie - stikkel URL parameterekkel A session modul mind a kt vltozatot tmogatja. A cookie-k az optimlisak, viszont vannak olyan kliensek, akik nem tmogatjk a cookie-k elhelyezst a gpkn biztonsgi okokbl, radsul ilyenkor a bngsz ' s a szerver kztt vndorolnak adatok is. Ez biztonsgi problmkat vet fel. A msodik mdszer esetn a session id az URL rsze. A PHP kpes hajlkonyan kezelni a krdst, ha megfelel 'en fordtottuk. Ebben az esetben a relatv URI-k megvltoznak automatikusan s tartalmazni fogjk a session ID-t (=SID). Ms esetben hasznlhatjuk a SID konstanst, amely a session_name=session_ID vagy egy res stringet tartalmaz (pl. PHPSESSID=8e1f5ff69434aea7ecab51da33314b53&PHPSESSID=8e1f5ff69434aea7ecab51da33314b53 ) Az albbi pldban bemutatjuk, hogyan lehet regisztrlni egy vltozt s egy URI-hoz hozzrendelni a session ID-t, felhasznlva a SID-et. 36 Plda 3. Egy user bejelentkezseit szmolja le ez a plda <?php session_start(); $_SESSION[count]++; $count = $_SESSION[count]; ?>
Hello visitor, you have seen this page <? echo $count; ?> times.<p>
<php? # the <?=SID?> is necessary to preserve the session id # in the case that the user has disabled cookies ?>
To continue, <A HREF="nextpage.php?<?=SID?>">click here</A>
Ha a fenti kdot lefuttatjuk s megnzzk a PHP.INI-ben megadott knyvtrban lv' file-okat, akkor ltni fogjuk, hogy a session indulsa utn ltrejn egy file (pl. C:\temp-ben) valami hasonl nvvel, sess_8e1f5ff69434aea7ecab51da33314b53. Ez tartalmazza a session vltozk nevt s rtkt. Ez felveti azt a problmt, hogy az ilyen tpus file-ok a szerveren lv ' temp knyvtrban csak gy %lnek s korrekt lekezelsk id'vel nagyon nehzz vlik. Azt is figyelembe kell venni, hogy egyes sessionok elvlnek, msokat nem lehet mg trlni, mert ppen fut alkalmazs hasznlja. A PHP.INI session rszben vannak azok a belltsok, amelyek a session file-ok elvlst, a szemtszedst s egyebeket szablyoznak. A szerver automatikusan gondoskodik egy id' mlva a session file-ok trlsr'l. Msfel'l a fejleszt'ket gondoltak arra is, hogy a programozk a sajt kezkbe akarjk venni a session kezelsnek lehet'sgt. Mivel ez nem a kezd'k szintjn elrhet', ezrt itt nem foglalkozunk vele. A sess_ kezdet % filenevek session file-okat takarnak, azoknak megnzzk s a jelenlegi id 't s az utols hozzfrsnek idejt kivonva egymsbl megnzzk, hogy lejrt-e az lete. 11.5.5 COOKIE-k (stik) A cookiek hasznlata a PHP krnyezetben lehetsges, de nem igazn ajnlott. A PHP alkalmazsok a szerveren futnak s ltalban valamifle user azonostshoz ktttek. A cookike-k hasznlata esetn a cookie-ban trolt adatok tkerlnek a bngsz 't futtast szmtgpre s ott egy textfile-ban troldnak, aminek a visszafejtse csak id' krdse, ppen ezrt fontos vagy titkolni val adatot a cookie-kba sohas ne troljunk, inkbb hasznljunk sessionket. bool setcookie ( string nev, string ertek, int lejarat, string utvonal, sting domain, int titkos) A fenti fggvny minden paramtere az els 't kivve elhagyhat. A fggvnyt a html oldal headerben kell elkldeni, miel'tt az oldalra brmit kirnnk! Az albbi pldban elkldnk egy egyszer% rtket: Param Lers Plda Nev A sti neve 'teszt nev% vltozt hozzuk ltre $_COOKIE['teszt'] Ertek Ez az rtk troldik a kliens oldalon Ezt az rtket troljuk a 'teszt' nev % vltozban. $ertek =$_COOKIE['teszt'] Lejarat A sti lejrati ideje msod- percekben megadva . Belltsa time() + lejrati id'. time()+60*60*24*2 kt napot lltunk be lejratnak. Ha nincs belltva, akkor abngsz' bezrsig rvnyes a sti. Utvonal Hol troljuk a stiket. Minden bngdsz' rendelkezik egy alaprtelmezett sti trhellyel. Bellthatjuk, hogy ehhez kpest hol trolja a stiket. Pldul a /fz/ az fz alknyvtrba teszi a stiket. Domain Az a domain, amire rvnyes a sti Itt adhatjuk meg, hogy melyik aldomainre legyen rvnyes a sti. A www.fz.ini.hu esetn csak erre a domainre rvnyes. 37 Param Lers Plda Titkos Ha az rtk 1, akkor c sak HTTPS esetn kldi stit. 0 vagy 1 , alaprterlmezs 0 <?php $ertek = 'Ez itt a pldaszveg'; setcookie ("teszt", $ertek); setcookie ("teszt", $ertek,time()+3600); /* egy ra mlva jr le a sti */ setcookie ("teszt", $ertek,time()+3600, "/fz/", ".fz.ini.hu", 1); /* Az /fz alknyvtrban, a www.fz.ini.hu domain s https protokoll esetn */ ?> Tmbket is trolhatunk stikben. <?php // A stik belltsa setcookie ("cookie[three]", "cookiethree"); setcookie ("cookie[two]", "cookietwo"); setcookie ("cookie[one]", "cookieone");
// A kvetkez# oldalon betltve az albbi kddal irathatjuk ki az adatokat: if (isset($_COOKIE['cookie'])) { foreach ($_COOKIE['cookie'] as $name => $value) { echo "$name : $value <br />\n"; } }
/* Ez lesz az eredmny three : cookiethree two : cookietwo one : cookieone */ ?> A kvetkez' oldalt betltve a bngsz 'be a stik automatikusan megjelennek a $_COOKIE tmbben, s azokat az rtkeket lehet hasznlni. Ha a register_globals paramtert bekapcsoljuk a php.ini-ben, akkor automatikusan ltrejnnek a megfelel ' vltozk, de korbban emltettk, hogy ennek a paramternek a bekapcsolsa nem javallott. Ha a $_COOKIE tmb rtkeit debuggols cljbl ki akarjuk iratni, akkor hasznljuk a kvetkez' utastst: <?php Print_r($_COOKIE) ?> 38 12 Konverzi Adattpusok kztt A PHP automatikusan, s meglehet 'sen szabadon kezeli a tpusokat. Nha szksg lehet egy bizonyos adattpus alkalmazsra. Ekkor hasznlhatjuk az albbi mdszereket: El'rjuk a tpust, mint a C-ben: $a = (float) $b; $c = (int) $c; Hasznlhatjuk a bool settype ( $valtozo, tipus) fggvnyt. Ekkor a tetsz'leges tpus $vltoz-t tkonvertljuk az adott tpusra. A konverzi sikeressgr'l bool eredmnyt ad vissza a fggvny. Lehetsges tipus rtkek: "boolean" (vagy a PHP 4.2.0 ta "bool") "integer" (vagy a PHP 4.2.0 ta "int") "float" (csak a PHP 4.2.0 ta, korbban "double") "string" "array" "object" "null" (a PHP 4.0.8 ta) TRUE rtket ad siker esetn, FALSE rtket egybknt. $ize = "5valami"; // string $valami = true; // boolean
settype($ize, "integer"); // $ize most 5 (integer) settype($valami, "string"); // $valami most "1" (string)
39 13 Tmbk A tmbk, azok klnbz ' lehet 'sgei, s az azok kr felsorakoztatott fggvnyek a PHP programozs egyik leger'teljesebb eszkzrendszert alkotjk, ugyanakkor rendkvl egyszer %en s knnyedn hasznlhatk. A tmb vltozk halmaza, melyeket a tmbn bell sorban trolhatunk s a teljes adathalmazt egyszerre is kezelhetjk, ugyanakkor a tmb elemeihez kln-kln is hozzfrhetnk. Fontos tulajdonsga a tmbknek, hogy egy tmbn bell az elemek tpusa klnbz ' lehet. Egy tmb elemeit legegyszer %bben explicit mdon, elemenknt tlthetjk fel. $tomb[1] = "dBase"; $tomb[2] = "FoxPro"; $tomb[4] = "Clipper"; $tomb[5] = 42; Lthat, hogy a tmb elemeinek megadsakor nem szksges a sorrendisget szigoran betartani. Egy tmb elemeihez a fentieknl egyszer%bben is, a tmbindex hasznlata nlkl is lehet elemeket adni: $tomb[] = "Basic"; $tomb[] = "FoxPro"; Ily mdon a tmb vghez kapcsoldnak az j elemek, az index rtke pedig az legutols indexelemnl eggyel magasabb lesz. Hasonlan m%kdik az array_push() fggvny, azzal a klnbsggel, hogy egy utastson bell tbb rtket is hozzf%zhetnk a tmbhz: array_push($tomb, "Cobol", "Fortran"); Szp lassan dagad tmbnk a fenti utastsokat kvet'en mr gy nz ki: Array ( [1] => dBase [2] => FoxPro [4] => Clipper [5] => 42 [6] => Basic [7] => FoxPro [8] => Cobol [9] => Fortran ) Termszetesen a tmbk rtkeinek megadshoz hasonlan frhetnk hozz a tmbelemekhez, azonban a fent emltett array_push() fggvny prja, az array_pop() fggvny is rendelkezsnkre ll, mely azonban nemcsak egyszer%en a tmb utols elemt adja vissza rtkl, hanem a tmb elemeinek szmt is cskkenti az utols elemmel: $nyelv1 = $tomb[1]; // $nyelv1 rtke "dBase" $nyelv2 = $tomb[4]; // $nyelv2 rtke "FoxPro" $nyelv9 = array_pop($tomb);// $nyelv9 rtke "Fortran" s a tmb nyolc elem lesz Bonyoltsuk egy kicsit a dolgokat. Ezidig a tmbnk egy dimenzis volt, azonban a PHP nyelvben a tmbk kett' vagy akr tbb dimenzisak is lehetnek. Az rtkads legegyszer %bb mdja ilyen esetben is az explicit rtkads: $auto[1][1] = "Maserati"; $auto[1][2] = "olasz"; $auto[2][1] = "Renault"; $auto[2][2] = "francia"; $auto[3][1] = "Mercedes"; $auto[3][2] = "nmet"; a tmb valahogyan gy fog kinzni: Array ( [1] => Array ( [1] => Maserati [2] => olasz ) [2] => Array ( 40 [1] => Renault [2] => francia ) [3] => Array ( [1] => Mercedes [2] => nmet ) ) Ilyen s ehhez hasonl tmbk ltrehozsra, azonban sokkal tmrebb s olvashatbb mdszer az array() fggvny hasznlata. Ez a fggvny a paramterknt megadott rtkeket tmb formban adja vissza. gy a fenti rtkadssal pontosan megegyez' eredmnyt ad a kvetkez': $auto[1] = array( "Maserati" , "olasz" ); $auto[2] = array( "Renault" , "francia" ); $auto[3] = array( "Mercedes" , "nmet" ); Ahogyan azonban a tmbelemek tpusaira vonatkozan nincsenek tl szigor megktsei a PHP nyelvnek, ugyangy nem kezeli szigoran a tbbdimenzis tmbk elemszmait sem a PHP. Az albbi rtkads teljesen helyes eredmnyt ad: $auto[1] = array( "Maserati" , "olasz" ); $auto[2] = array( "Renault" , "francia" , "406", "206" ); $auto[3] = array( "Mercedes" , "nmet" , "E320", "Vito" , "Sprinter kisteheraut" ); Termszetesen az array_pop() s az array_push() fggvnyek az array() fggvnnyel tvzve tbb dimenzis tmbk esetn is hasznlhatk. array_push( $auto, array("Citroen" , "francia" , "ZX" , "Xsara");
A fenti esetekben a tmb elemei azok sorszmaival voltak azonostva. A PHP ismeri az asszociatv tmbk fogalmt is. Az asszociatv tmbk rendkvl hasznos s sokoldal elemei a PHP nyelvnek. A PERL nyelvben hasznlt hash tpus tmbkhz hasonlan m %kdnek. A tmbelemekre val hivatkozs ilyen esetben nem sorszmmal, hanem egy indexelem (kulcs) segtsgvel trtnik, egyszer %en gy, hogy a sorszm helyre, az indexelemet helyezzk. $tomb["els#"] = "Kis Gedeon"; $tomb["msodik"] = "Nagy Elemr";
Fggetlenl attl, hogy a tmb elemeinek milyen sorrendben adtunk rtket, az elemeket az indexkulcs segtsgvel rhetjk el, s ez nem fgg attl, ha a tmbhz hozzf %znk, vagy attl elvesznk egy elemet. j elem brmikor hozzf%zhet' a tmbhz: $tomb["harmadik"] = "Kukonya Berk";
Az asszociatv tmbk lehetnek egydimenzisak, mint a fenti pldban, de lehetnek tbb dimenzisak is. A fenti pldt kib'vthetjk tbb dimenziss: $tomb["els#"]["neve"] = "Kis Gedeon"; $tomb["els#"]["kora"] = 27; $tomb["msodik"]["neve"] = "Nagy Elemr"; $tomb["msodik"]["kora"] = 22;
Ha a "Nagy Elemr" rtk % elemet a $tomb["msodik"]["neve"] hivatkozssal tudjuk elrni, de ha $sorszam rtke "msodik" akkor akr $tomb[$sorszam]["neve"] hivatkozssal is elrhetjk a keresett elemet. A norml s az asszociatv tmbk ltrehozsra egyarnt hasznlhat az array() fggvny, amit leginkbb tmbk kezd ' rtkfeltltse sorn hasznlhatunk, egy rtkadssal kikszblve tbbet. A fenti pldkkal megegyez'ek az albbi rtkadsok: $tomb = array ( "els#" => "Kis Gedeon", "msodik" => "Nagy Elemr");
Mint az albbi plda is mutatja, az rtkads esetn az index rtkt nemcsak konkrtan, hanem vltozval is megadhatjuk, gy mr meglehet 'sen rugalmasan tthetjk fel tmbjeinket adatainkkal. A kvetkez ' plda megmutatja a print_r() fggvny hasznlatt is, amit tetsz'leges vltoz rtknek kiratshoz hasznlhatunk, de mivel tmbvltoz esetben a komplett tmbstruktrt is megjelenti leginkbb tesztelsi clokra hasznlhat nagyon jl. <?php
A program kimenete a kvetkez# lesz: Array ( [Tabbi] => Array ( [nev] => Tabi Imre [email] => tabbi@freemail.hu )
[Chris] => Array ( [nev] => Nagy Krisztin [email] => chris@nomail.hu ) ) Asszociatv tmbk esetben azonban figyelemmel kell lenni arra, hogy ilyen tmb elemeit kizrlag a meghatrozott indexrtkkel rhetjk el, a tmb sorszmval nem. Ennek rendkvl egyszer% az oka. Az egyszer% sorszmozott tmb is asszociatv tmb, ahol a tmbindex maga a sorszm. S 't egy tmbn bell keverhetjk is a sorszmozott s az indexelt elemeket, de azrt ezt kerljk, csak gondot okozunk magunknak. A norml s az asszociatv tpus tmbk a PHP programozs sorn rendkvl vltozatosan s hatkonyan hasznlhatk, f 'leg akkor, ha tudjuk azt, hogy a PHP a tmbk elemeire, az elemszmokra s a tmbelemek tpusaira vonatkozan rendkvl szabad kezet ad neknk: - tbbdimenzis tmbn bell az egyik index lehet asszociatv, a msik norml - tbbdimenzis tmb esetben a tmbelem tmbknek nem kell felttlenl azonos elemszmaknak lenni, vagyis $tomb[1] lehet t elem%, mg $tomb[2] lehet akr 8 elem% is. - egydimenzis tmbk esetben a tmbelemek lehetnek klnbz % tpus adatok, de mg tbbdimenzis tmbk esetben sem kell a tmbelem tmbk adatszerkezetnek megegyeznie. Vagyis elg nagy szabadsggal hasznlhatjuk a tmbvltozkat, mgis rdemes szem el 'tt tartani, hogy ha lehet, jrjunk el kvetkezetesen a vltozk rtkadsval s azok hasznlatval. A PHP nyelvben a tmbvltozkhoz is egy egsz sor fggvny s utasts kapcsoldik. Ezek a http://weblabor.hu/php/ref.array.php cmen tallhatk meg. Ezek a fggvnyek egy egsz sor feladatot lthatnak el kezdve a tmbk defincijtl az rtkfeltltsen s a tmbben val mozgson keresztl a tmbelemek legvltozatosabb md sorbarendezsig. Mivel a tmbk a PHP programozs sorn igen kiterjedten hasznlatosak, s a tmbkhz kapcsold fggvnyek fontossga kiemelked ', gy ezen fggvnyekb 'l a fontosabbakat a kvetkez' rszekben rszletesebben is trgyaljuk majd. 42 14 Sztringek, szvegek manipulcija A tovbbiakban nhny gyakran el 'fordul szvegmanipulcis feladat megoldst tekintjk meg PHP-ban. Termszetesen sok olyan feladat van, amit mshol, mshogy mr vagy mg rintnk, illetve sok egyb, itt nem megemltett fggvny tallhat a stringkezelsnl. A pldk a php manualbl valk! Gyakori, hogy egy string hosszt meg szeretnnk tudni: strlen() Ha egy string valahny karaktert ki akarjuk venni a szvegb'l, akkor a hasznland fggvny: substr() A 2. s harmadik paramter lehet negatv is. Ekkor a jelentsk a szveg vgr'l rtend'. <?php $l=strlen(szevasz tavasz!); $rest = substr("abcdef", 1); // returns "bcdef" $rest = substr("abcdef", 1, 3); // returns "bcd" $rest = substr("abcdef", 0, 4); // returns "abcd" $rest = substr("abcdef", 0, 8); // returns "abcdef $string = 'abcdef'; echo $string{0}; // returns a echo $string{3}; // returns d $rest = substr("abcdef", -1); // returns "f" $rest = substr("abcdef", -2); // returns "ef" $rest = substr("abcdef", -3, 1); // returns "d" $rest = substr("abcdef", 0, -1); // returns "abcde" $rest = substr("abcdef", 2, -1); // returns "cde" $rest = substr("abcdef", 4, -4); // returns "" $rest = substr("abcdef", -3, -1); // returns "de" ?> Ha ki akarom cserlni a szveg egy rszt ms rszre, akkor: substr_replace() . <?php $var = 'ABCDEFGH:/MNRPQR/'; echo "Eredeti: $var<hr>\n";
// Beszrjuk a 'bob' szt a $var elejre echo substr_replace($var, 'bob', 0, 0) . "<br>\n";
// Ha a msodik paramter negatv, akkor a szveg vgr#l indul a csere. echo substr_replace($var, 'bob', 10, -1) . "<br>\n"; echo substr_replace($var, 'bob', -7, -1) . "<br>\n";
// Eredmny: Hll Wrld f PHP $vowels = array("a", "e", "i", "o", "u", "A", "E", "I", "O", "U"); $onlyconstants = str_replace($vowels, "", "Hello World of PHP");
// Provides: You should eat pizza, beer, and ice cream every day $phrase = "You should eat fruits, vegetables, and fiber every day."; $healthy = array("fruits", "vegetables", "fiber"); $yummy = array("pizza", "beer", "ice cream");
if ($pos0 === false) { echo "A '$findme' stringet nem talltam a '$mystring1' stringben"; }else{ echo "Az 'x' karakter helye: $pos0"; } // 'a' nincsen 'xyz'-ben if ($pos1 === false) { echo "A '$findme' stringet nem talltam a '$mystring1' stringben"; }
if ($pos2 !== false) { echo "Megtalltuk a '$findme' stringet '$mystring2' stringben ezen a helyen: $pos2"; } ?>
Ha egy szveg elejr'l s vgr'l le akarom vgni a bevezet' s a zr szkzt, tab-ot, soremels karaktert, akkor a trim() fggvnyt hasznlhatom. Ha csak a szveg elejr 'l akarom levgni a fent emltett karaktereket, akkor ltrim(), ha a vgr 'l, akkor rtrim(). Alapesetben a levgand karakterekhez tovbbi kiegsztseket is rendelhetek. <?php $text = "\t\tThese are a few words :) ... "; $trimmed = trim($text); // $trimmed = "These are a few words :) ..." $trimmed = trim($text," \t."); // $trimmed = "These are a few words :)" $clean = trim($binary,"\0x00..\0x1F"); // trim the ASCII control characters at the beginning and end of $binary ?>
rdekes lehet 'sg bizonyos specilis karakterek, tag-ek kihagysa a stringekb 'l, illetve bizonyos specilis karakterek beszrsa: strip_tags(), htmlentities(), htmlspecialchars(),stripslashes(), <?php $str = "Is your name O\'reilly?";
// Kivettk az idz#jel karaktert. Eredmny: Is your name O'reilly? echo stripslashes($str); echo strip_tags($string, '<a><b><i><u><span><body>'); //Kivettk a TAG
$str = "A 'quote' is <b>bold</b>";
// Kimenet: A 'quote' is <b>bold</b> echo htmlentities($str);
44 Gyakori feladat, hogy szt kell vgni egy stringet valailyen karakter mentn darabokra, pldul szavakra, ahol a szavakat hatrol karakter tbbfle is lehet. Az eredmny egy stringekb'l ll tmb lesz: Explode() <?php // Example 1 $pizza = "piece1 piece2 piece3 piece4 piece5 piece6"; $pieces = explode(" ", $pizza); print $pieces[0]; // piece1 print $pieces[1]; // piece2
Az albbi plda egy PHP oldalrl keresztreferencit kszt s kirja a beinclude-olt file-okat. <?php /***************************************** * Crossreference v1.0 * It makes a crossreference list about the * variables of current script * with command line PHP interpreter. * * Copyright by Fabian Zoltan 2004 * *****************************************/ $lines = array(); $vars = array();
46 15 Formok /#rlapok Interaktv programok rsa A PHP s ltalban a WEB-es programozs egyik sarokkve volt az interaktivits megjelense. Ehhez arra volt szksg, hogy a bngsz'nkn bert adatokat vissza tudjuk kldeni a szervernek, amely azt feldolgozza. A HTML-ben lehet %rlapokat ltrehozni az albbi szintaktikval: <form name='Urlap' action='index.php' method='xxxx'> <INPUT ......> </form> A fenti xxxx= vagy GET vagy POST metdus lehet. Az %rlapok belsejben minden html elemet hasznlhatunk, s itt hasznlhatunk olyan beviteli mez 'ket, amelyek vltozknak adnak rtket. A POST s a GET metdus segtsgvel a vltozk neve s rtke eljut az action-nal megjellt laphoz, amely azt fel tudja dolgozni. Az %rlapon bell az albbi adatbeviteli lheet'sgek vannak: <INPUT TYPE=TEXT Name=text VALUE=Kezd#szveg WIDTH=60> Egy soros szveg bevitelre szolgl <INPUT TYPE=PASSWORD Name=text VALUE=Kezd#szveg WIDTH=60> - Egy soros password, bevitelhez kell. 15.1.1 nmagukat meghv 'rlapok Gyakori feladat, hogy egy #rlapot meghvunk, leellen'rizzk s a kvetkez' oldalon csak akkor kldjk tovbb a bngsz't, ha az oldal hibtlanul ki van tltve. Ehhez az albbi dolgoknak kell teljeslnie: Az %rlapot sajt magnak kldi el a PHP oldal Amikor berkezik a krs a szerver oldalon ellen'rizzk a megfelel' rtkek megltt. Ha az rtkek megvannak, akkor feldolgozzuk 'ket Ha nincsenek meg az rtkek, akkor jra meghvjuk a feldolgozand adatot: Az albbi pldban kt rrtket kldnk el egy feldolgozand oldalnak. Ha nincs kitltve mind a kt rtk, akkor jrahvjuk a feldolgozand oldalt. A feldolgozs rszen a feldolgozott rtkek valamifle lekrdezsbe torkollnak vagy akrmilyen egyb m %veletet vgezhetnk vele. Javasolt egyb m%veletek: Az tadott adatok tpus szerinti ellen'rzse. Erre hasznlhatk az albbi fggvnyek: is_bool() logikai-? is_int(), is_integer() egsz-e? is_float(), is_real(), lebeg'pontos-e? is_object() Objektum-e? is_array(). Tmb-e? Is_string() string-e? Az tadott adatokbl clszer% kivenni a HTML kdokat, mivel biztonsgi problmk merlhetnek fel <?php $string = strip_tags($string); ?> Az tadott rtkekb'l clszer% kiszedni a [{()}] jeleket. Ha az gy bevitt rtkek kzvetlenl SQL lekrdezsek sszelltsra hasznlatosak, akkor clszer % mg egyb specilis jelek kivtele is, pldul = <> OR, AND ! stb... $a =array([,{,(,),},],or,and,!); $str = str_ireplace($a, " ", $str);
<?php $OK=; 47 $nev =; $pwd=; $uz =;
if (isset($_POST[OK]) $OK =$_POST[OK]; if (isset($_POST[nev]) $nev =$_POST[nev]; if (isset($_POST[pwd]) $pwd =$_POST[pwd];
if ($OK =OK) { $nev =$_POST[nev]; $pwd =$_POST[pwd];
48 16 Formok adatainak feldolgozsa szerver- s kliens oldalon A PHP-ben a HTML %rlapok (FORM-ok) felhasznlsval trtnik meg az interakci a felhasznl s programja kztt. Az %rlapok hasznlatnak gyakori formja, hogy az %rlap a sajt magt tartalmaz oldalt hvja meg s az %rlap kitltttsgt olyan kddal ellen 'rizzk, amely ugyanazon az oldalon van. Ez clszer %en azrt lehet gy, mert a beviteli formtum s az ellen 'rzs is egy helyen tallhat. A pldban egy egysz tpus, 1000-nl nagyobb adatot s egy folyszmla nevet vr a beviteli oldalon a program. <?php $message = ; $adat =; $ok = True; if (isset($_POST(OK) && $_POST[OK] ==Elkld){ // Ellen #rizzk az adat lteznik-e s megfelel# formtumak? $adat = -1; if (isset($_POST[adat])){ $adat= $_POST[adat]; if (is_int($adat)){ if (!($adat>1000)){ $ok = $ok && False; //Ezernl nagyobb rtket ellen #rzk ppen $mess_adat = <FONT color=#FF0000>Tl kicsi rtk!</FONT><BR>; } }else{ $mess_adat = <FONT color=#FF0000>Hibs adattpus!</FONT><BR>; } }else{ $mess_adat = <FONT color=#FF0000>Hinyz adat!</FONT><BR>; } //Ellen #rizzk, hogy a folyszmla neve megfelel-e? $fszamla = -1; if (isset($_POST[fszamla])){
$fszamla= $_POST[fszamla]; if (is_string($fszamla)){ $fszamla = $urldecode($fszamla); //Esetleges URL kdols dekdolja $fszamla = strip_tags ( $fszamla); //kiveszi a HTML s PHP tageket $fszamla = stripcslashes ( $fszamla); // kiveszi a \ jeleket
.... itt ellen #rizzk a tbbi szksges mez# rtkt s ltezst ... }
if(!$ok){ print(<FORM name=pelda action=urlap.php method=POST>); print($mess_adat); print(<INPUT type=text name=adat value=<% = $adat %> > ); ... tovbbi beviteli mez #k ... print(<INPUT type=submit name =OK value=Elkld>); print(</FORM>); }else{ .... adatok feldolgozsa ... header("Location: http://www.example.com/"); //A bngsz #t tdobom a kvetkez# oldalra exit; // a kd tbbi rsze ne fusson le } ?>
49 A prbeszdek alkalmazsnl fontos, hogy ellen 'rizzk a bevitt adatokat, mivel vletlenl, akarva vagy akaratlanul olyan adatok kerlhetnek a meghvott oldalra, aminek tpusa, formtuma nem felel meg az elvrsoknak ennek rdekben az albbi ellen'rzseket clszer% megtenni: Egy oldalon minden mez' ki van-e tltve A megfelel' tpus, formtum adat kerlt-e bele Nincs-e benne HTML vagy PHP, vagy SQL utasts kd (ezek sanda szndkok esetn szoktak bekerlni) Az ellen 'rzst kt lpcs 'ben clszer % megtenni. A kliens oldalon megfelel ' Javascript kd segtsgvel s a szerveroldalon a PHP kd segtsgvel, mint fent is ltszik. Br a Javascript ennek a jegyzetnek nem tmja, azrt az ellen 'rzsre adunk pldt itt. A megolds alapja, hogy minden beviteli mez' vagy a Formon lv' Elkld gomb megnyomsra lefut egy ellen 'rz' script a bngsz'n, ami ellen'rzi, hogy ki vannak-e tltve a megfelel' mez'k. A Javascript ellen'rzs ugyanakkor nem helyettesti a PHP oldali ellen 'rzst, mert a bngsz' oldalon megfelel' technikkkal el lehet kerlni az ellen'rzst. 50 17 Levlklds, plain text, html levl, attachement A PHP-ban van lehet 'sg arra, hogy leveleket kldjnk el megadott cmre, megadott tartalomal. Az zenetkldshez el'szr a PHP.INI-ben be kell lenni lltani az albbi szakasz rtkeit. Az albbi sorok a Win32- es rendszeren belltandkat tartalmazza. Be kell lltani annak az SMTP szervernek a cmt kell rni, amelyik elkldi a levelnket s annak a usernek a nevt, akivel defaultban kldnk levelet. [mail function] SMTP = mail.szily.sulinet.hu ;for win32 only sendmail_from = fz@mail.szily.sulinet.hu ;for win32 only
A levl elkldse a mail paranccsal trtnik, de miel 'tt elkldennk, ltre kell hozni azokat a stringeket, amelyek segtsgvel a levl klnbz' szakaszai ltrejnnek. $cimzett = fz@mail.szily.sulinet.hu; $tema = drgm; $uzenet = A klykk sszementek. Mind a kett#t hiba keresem. Gza $fejlecek .= "From: T#lem <geza@kekazeg.to>\n"; $fejlecek .= "X-Sender: <birthday@php.net>\n"; $fejlecek .= "X-Mailer: PHP\n"; // Levelez #program $fejlecek .= "X-Priority: 1\n"; // Srg #s zenet! $fejlecek .= "Return-Path: <geza@kekazeg.to>\n"; //Hiba esetn ide jn levl
mail($cimzett, $tema, $uzenet, $fejlecek);
A levl szvegt s a fejlcet tovbb cifrzhatjuk. A fenti mez 'kn kvl hasznlhatjuk pldul a cc: bc: Reply- To: s a hasonl fejlc mez'ket is. Hogy milyen mez'ket lehet hasznlni, bmelyik leveled fejlcb'l kinzheted. Sajnos az attachmentek kezelse nem tartozik ele a php ltal tmogatott dolgok krbe, ezrt kls ' alkalmazs nlkl nem tudunk attachmentet kldeni php-ben. Egy lehet 'sg addik komolyabb levelezsi funkcik hasznlatra. Meg kell hvni egy kls ', parancssori levelez'szoftvert, amelynek a megfelel ' paramterezsvel tetsz 'leges levelezsi funkckat el lehet rni. Ilyen szoftver pldul a POSTIE.EXE Windows alatt. Ez a program s ms hasonl programok az Internetr 'l letlthet'k. A levelezs krdskrben fontos, hogy formzott leveleket is tudjunk kldeni. Erre alkalmasak a HTML levelek. A HTML levelek kldshez elg sokmindent el kell vgezni, alapesetben a PHP nem tmogatja a HTML levelek kldst, de a NET-en tallhatk egyszer % objektumcsomagok, amelyek ebben az esetben segtenek (http://phpmailer.sourceforge.net) Ennek a csomagnak a hasznlatra lljon itt egy plda: <?php require("class.phpmailer.php");
$mail = new phpmailer();
$mail->IsSMTP(); // set mailer to use SMTP $mail->Host = "smtp.mydomain.com"; // specify main and backup server $mail->SMTPAuth = true // turn on SMTP authentication $mail->Username = "fz" // SMTP username $mail->Password = "titok" // SMTP password
$mail->WordWrap = 50; // set word wrap to 50 characters $mail->AddAttachment("C:\temp\text.zip"); // add attachments $mail->IsHTML(true); // set email format to HTML
$mail->Subject = "Ez itt a targy"; $mail->Body = "Ez a HTML szveg rsz <b>vastagon!</b>"; $mail->AltBody = "Ez a rsz a nem HTMl szveg";
if(!$mail->Send()) { 51 echo "A szveg nem ment el. <p>"; echo "Levelez# hiba " . $mail->ErrorInfo; exit; }
echo "A levl elment"; ?>
A fenti csomag teleptsekor gondoskodni kell arrl, hogy a PHP.INI-ben be legyen lltva az include_path a class.phpmailer.php file-ra, amit az albbi mdon tehetnk meg futs kzben: $incl_path = ini_get("include_path"); $incl_path .= ;./phpmailer; ini_set("include_path", $incl_path);
52 18 Adatbzisok A PHP programozsi nyelv gy kezeli az adatbzisokat, hogy a nyelvbe beptettk az elterjedt s tmogatott adatbzis-kezel'k tmogatst. Az adatbziskezel 'k ltalban SQL rendszerek, s kliens-szerver minta szerint m%kdnek egytt a PHP-val. Egy PHP-val meghajtott adatbzis-kezel' rendszernek az albbiakban lehet felrajzolni a m%kdsi smjt: Szerver szmtgp /szerver oldal Kliens szmtgp HDD/ adat- bzis Adatbzis- kezel' program Adatbzis- kezel' driver PHP WEB szerver Internet felh'
WEB bngsz' Egyes adatbzis-kezel 'ket a PHP alapbl tmogatja, mg msokhoz be kell tlteni a PHP.INI-ben a megfelel ' sorok segtsgvel a tmogatst. Termszetesen minden esetben kell telepteni egy adatbzis-szerver szoftvert, amely nem mindig ingyenes! Magyarorszgon elterjedt legfontosabb adatbziskezel'k az albbiak Adatbzis- kezel Tmogats mdja Az adatbzis-kezel web cme Tulajdonsgai MySQL Beptve www.mysql.com Free, gyors, Win s LINUX verzi ltezik Interbase php_interbase.dll www.interbase.com Teljes kr %, j adatbzis-kezel ', ajnlhat, az InterBase 6.01 free! Microsoft SQL7.0/ 2000 php_mssql70.dll php_mssql.dll www.microsoft.com Rgebbi verzi, ltezik un. Personal s Evaulation Edition. Minden MS fejleszt'termk rsze a Personal Edition vltozat. Oracle8 php_oci8.dll www.oracle.com Nem free, teljes kr%, nagy tuds SQL szerver PostGres SQL php_pgsql.dll www.postgresql.org. LINUX s Windows verzi is van, free, teljes SQL rendszer ODBC Beptve Az ODBC = Open DataBaseConnectivity A Microsoft ltal ltrehozott, elvileg platform s adatbzis-kezel ' fggetlen fellet, minden elterjedt adatforrsnak van ODBC drivere. Win s Linux alatt is lteznek ODBC driverek 18.1 MySQL A fenti adatbzis-kezel 'kr'l annyit, hogy jelenleg a legelterjedtebb ilyen alkalmazs a Linuxon, Netware-en s Windows rendszereken is fut MySQL. Ez a rendszer taln a leggyorsabb az sszes elterjedt adatbzis-kezel ' kztt, de nem valstja meg az SQL sszes lehet 'sgt. A MySQL nagyon el 'nys tulajdonsga, hogy GNU liszensszel lehet hasznlni, azaz akkor is free, ha eladsi cllal hasznljuk, de magt a MySQL adatbzis-kezel ' programot nem adjuk el ( J ). A MySQL letlthet' az albbi cmr'l: http://www.mysql.com/downloads/ Teleptse egyszer% Windowson el kell indtani a ZIP-b 'l val kicsomagols utn a SETUP.EXE programot, a tbbit elkszti '. Ha firewall van a gpnkn, akkor a TCP/IP 3306-os portjt kell szabadd tennnk. Ha a szerver ugyanazon a gpen fut, mint amelyiken a WEB szervert s a PHP-t futtatjuk, akkor a Firewallon nem szabad (!) engedlyezni ms gpr'l ehhez a porhoz val hozzfrst. Ha fejleszts kzben az adatbzisunkat mdostani akarjuk, klnbz ' dolgokat akarunk elvgezni, akkor ajnlhatjuk a free phpMyAdmin nev % csomagot, illetve a professzonlis, de pnzes EMS MySQL Manager programcsomagot. Ha feltesszk a MySQL ODBC drivert, akkor viszont tetsz 'leges ODBC kompatibilis alkalmazsbl el tudjuk vgezni az adatok mdostst, feltltst stb... Akr ez lehet egy Microsoft Access is. A MySQL hasznlathoz dokumentcit innen lehet letlteni: http://www.mysql.com/get/Downloads/Manual/manual.chm-2002-10-07.zip/from/pick 18.2 PostGres SQL A PostGres SQL egy kicsit komolyabb alkalmazs, mint a fent emltett adatbzis-kezel '. A teleptse egyszer %, mert 2005-ben megjelent a Windowsos verzi is. 53 A PostgresSQL hasznlathoz dokumentcit az albbi helyen lehet elrni: http://www.postgres.org/docs/ Itt HTML s PDF formtumban vannak meg a megfelel' dokumentumok. 18.3 Adatbzis-kezels natv mdon Az adatbzis-kezel 'k hasznlathoz a PHP.INI-ben meg kell adni a megfelel ' belltst (vagy, mint pldul a MySQL-nl, eleve a tmogats a rendszer rsze), s programunkban hasznlhatjuk az adatbzisra vonatkoz utastsokat. A PHP az adatbziskezelsre ltalban az albbi utastsfajtkat tartalmazza. - Az adatbzis-kezel' szerverrel kapcsolatot teremt', a kapcsolatot lezr parancsok - Az adatbzisokra vonatkoz lekrdez' s adminisztrcis parancsok - Egy megnyitott adatbzisra vonatkoz adminisztrcis s lekrdez' parancsok - Az SQL lekrdezseket tkld' parancs - A lekrdezs eredmnyt feldolgoz parancsok. A tovbbiakban a MySQL utastsai alapjn mutatom be az adatbziskezelssel kapcsolatos utastsokat. Ms adatbziskezel' esetn a vltozs ltalban csak annyi, hogy a nvben az el'tag ms. Pldul: Mysql_connect() //MySQL adatbzis-kezel# esetn pg_connect() //PostgresSQL // a PHP5 esetn a mysql fggvnyek helyett mysqli fggvnyeket kell hasznlni.
Kapcsolds egy adatbziskezel 'hz, amely vagy loklis gpen helyezkedik el, vagy egy tvoli, IP cmmel meghatrozott gpen. A kapcsolat ltrehozsa meg kell adni a kapcsoldsi helyet (localhost, vagy IP cm), a kapcsold user-t, s a user jelszavt. $link = mysql_connect(localhost,$username,$password); vagy $link = mysql_pconnect(localhost,$username,$password);
A fentiekhez egy kis magyarzat. A connect s pconnect kztt az a klnbsg, hogy a connect-tel megnyitott kapcsolat lezrul a krdses php oldal lefutsa utn, mg a pconnect kapcsolat nyitva marad (Persistent connection), s jbli kapcsolds sorn csak akkor kell egy viszonylag sokig tart kapcsoldsi procedrn tmennie a rendszernek, ha a kapcsolat nincsen nyitva. Egybknt a kt fggvny hazsnlata ugyanaz A visszaadott rtk a kapcsolat sorszma. Ennek alapjn lehet a tovbbiakban azonostani tbb megnyitott kapcsolat esetn, hogy ppen melyik kapcsolatot hasznljuk. A kapcsolat bezrsa: mysql_close($kapcsolat)
<?php $link = mysql_connect ("kraemer", "marliesle", "secret") or die ("Could not connect"); print ("Connected successfully"); mysql_close ($link); ?>
Az adatbziskezel'n lv' adatbzisokra vonatkoz parancsok int mysql_list_dbs ([int link_identifier]) int mysql_create_db (string database name [, int link_identifier]) int mysql_drop_db (string database_name [, int link_identifier]) <?php $link = mysql_pconnect ("kron", "jutta", "geheim") or die ("Could not connect"); if (mysql_create_db ("my_db")) { 54 print ("Database created successfully\n"); } else { printf ("Error creating database: %s\n", mysql_error ()); } ?>
int mysql_select_db (string database_name [, int link_identifier]) Egy konkrt adatbzis tblinak kilistzsa Egy adatbzis (lekrdezs) oszlopneveinek listzsa. Ugyanez az utasts a lekrdezs eredmnynek tetsz 'leges adatait is kilistzza ... object mysql_fetch_field (int result [, int result_type]) Mez'nevek kirsa, s trolsa a mezonev tmbben <?php $result=mysql_db_query($querydb,$query); $m=mysql_num_rows($result); $n=mysql_num_fields($result); for($i=0;$i<$n;$i++) { //Oszlopnv/mez #nv bemsolsa tmbbe ks#bbi felhasznlsra $mezok=mysql_fetch_field($result); $meznev[]=$mezok->name; //Oszlop/Mez # adatainak kilistzsa. echo "<PRE> blob: $meta->blob max_length: $meta->max_length multiple_key: $meta->multiple_key name: $meta->name not_null: $meta->not_null numeric: $meta->numeric primary_key: $meta->primary_key table: $meta->table type: $meta->type unique_key: $meta->unique_key unsigned: $meta->unsigned zerofill: $meta->zerofill </PRE>"; } mysql_close(); ?>
Egy SQL parancs elkldse resource mysql_query ( string query [, resource link_identifier]) Az Adatbziskezel 'nek adott SQL, vagy egyb utasts eredmnynek tvtele a pufferb 'l. Az eredmny ltalban kt dimenzis tmbbe rkezik, amelyet vagy a tmbkezel ' fggvnyek segtsgvel lehet feldolgozni, vagy indexel s ciklussal vgig kell szaladni rajta. A visszaadott paramterr 'l mindig meg tudjuk mondani, hogy hny sorbl ll. Az albbi fggvny megadja az eredmny sorainak szmt. Ha nincs eredmny sor, akkor az rtke 0. int mysql_num_rows()
Ha Delete, Update utastsok eredmnyre vagyunk kivncsiak, akkor az albbi fggvnyt kell hasznlnunk. int mysql_affected_rows ( [resource link_identifier])
Egy sort ad vissza egy tmbbe az albbi fggvny. A tmb t sorszmokkal lehet indexelni, a sorszmozs 0-val kezd'dik. Akkor hasznlhatjuk, ha egy lekrdezsr'l nem tudjuk el're, hogy hny sort ad majd vissza. array mysql_fetch_row([resource link_identifier]) Ennl a fggvnynl szksgnk lehet a visszaadott oszlopok szmra is. Ezt az albbi fggvnnyel tudjuk meg: 55 int mysql_num_fields ( [resource result]) Ez a fggvny a sort szintn egy tmbben adja vissza, de a tmbelemek sorszmozva s a mez 'nvvel is, mint asszociatv tmbindexxel elrhet'k. array mysql_fetch_array([resource link_identifier) Az albbi plda elkld egy lekrdezst, az eredmny oszlopneveit lekrdezi, majd megjelenti tblzatos formban. int mysql_fetch_object([resource link_identifier]) Az albbi plda elkld egy lekrdezst, az eredmny oszlopneveit lekrdezi, majd megjelenti tblzatos formban. <?php ...... $qry = SELECT * FROM tabla; $result=mysql_db_query($qry,$query); $m=mysql_num_rows($result); $n=mysql_num_fields($result); echo <TABLE><TR>; for($i=0;$i<$n;$i++) { $mezok=mysql_fetch_field($result); echo "<TD>".$mezok->name."</TD>"; $meznev[]=$mezok->name; } echo"</TR>"; // mezok kiirasanak vege //
// mezokben levo adatok kiirasa // for($i=0;$i<$m;$i++) { echo"<TR>"; $adat=mysql_fetch_array($result); for($j=0;$j<$n;$j++) echo "<TD>".$adat[$meznev[$j]]."</TD>"; echo"</TR>"; } echo </TABLE>; ?> 18.4 Tipikus feladatok adatbzis-kezelsnl Egy adatbzis-kezel ' hasznlata sorn az albbi tipikusnak mondhat feladatokat kell megoldani PHP-ban, (de hasonlkppen ms programozsi nyelveken is). - Kapcsoldunk a szerveren lv' adatbzishoz.(lttunk mintt hozz) - Elkldnk egy SQL lekrdezst az adatbzis-kezel' programnak (Lttunk mintt) - Az elkldtt lekrdezsre kapott vlasz ltalban egy tblzattal, vagy kt-dimenzis tmbbel reprezentlhat. Ezt szoks rekordszet-nek hvni. Egy ilyen rekordszetet megjelentnk, clszer %en tblzatos formban. Ha a rekordszet tl sok sorbl ll, akkor vagy a lekrdezskor adunk olyan feltteleket, amely kevesebb sort ada eredmnyl, vagy megalkotjuk annak a lehet 'sgt, hogy a tblzat eredmnyt grgetni, vagy lapozni lehessen. (ks'bb ltalnos mintt lttunk, az el'z' fejezetben bizonyos specilis eseteket nztnk) - A rekordszet egyes sorait %rlap formjban meg akarjuk jelenteni (ks'bb ltunk mintt a fejezetben) - Az %rlap vagy a rekordset eredmnyt ki akarjuk nyomtatni - Az adatbzisba j adatot akarunk bevinni. o Egy rekordszethez illeszked' j sorral o Egy rekordszethez illszked' j sor-%rlap formjban bevitt adatokkal. o Minden adatbevitelnl valamilyen tipizlhat ellen 'rzsi feladatot illik elvgezni, vagy a bevitt adatokat szintaktikailag s/vagy szemantikailag ellen'rizni illik. 56 o Adatok bevitelekor vagy mdostskakor, amikor csak lehet az adatokat egy felknlt listbl kelljen kivlasztani a tvedsek elkerlse miatt. - Adatok mdostsa lehet'sg szerint az j adat bevitelvel azonos formtumban s mdon trtnjen. - Egyes adatok, adatsorok, rekordok trlse, ellen'rztt mdon. - Az adatok bevitele vagy mdostsa sorn, hibs adatfelvitel miatti ismtlskor a korbban bevitt vagy meglv' adat jelenjen meg a beviteli %rlapon. A fenti feladatokhoz az albbi nem igazn PHP-ben megvalstott fogalmakat trsthatunk: Az adatok tblzatos megjelenshez az albbi sma szerint rdemes eljrni abban az esetben, ha kt dimenzis tblzatban kapom meg az adatokat. Print( <table>); For($i=0;i<$maxsor;$i++){ Print(<tr>); For($j=0;$j<$maxoszlop; $j++);{ Print(<td>); Print(adat[$i][$j]); Print(</td>); } Print(</tr>); } print(</table>); Termszetesen a tblzat formzst, a szeglyeket, stb mindenki a sajt zlse szerint alkothatja meg. Ha az adatokat soronknt vezsem t az adatbzis-kezel 't'l, akkor a fenti algoritmus kicsit megvltozik. Azt is megmutatom a kvetkez ' pldban, ha nem az oszlopok szma adott a lekrdezett rekordszetben, br ezt is mindig meg lehet tudni egy adott esetben, hanem a mez'nevekkel, asszociatv mdon tudok hivatkozni egy sorra. Erre az el'z' fejezetben lttunk pldt. <?php //egyszer rekord megjelentse $result=mysql_db_query($querydb,$query); $sor=mysql_num_rows($result); $n=mysql_num_fields($result); print(<table>); for($i=0;$i<$n;$i++) { print(<tr>); //Oszlopnv/mez #nv bemsolsa tmbbe ks#bbi felhasznlsra $mezok=mysql_fetch_field($result); $meznev[]=$mezok->name;
A fenti megjelents mg elemi mdomn sem alkalmas j adatok bevitelre, hiszen j adatokat WEB bngsz ' esetn csakis FORM-okon keresztl vihetnk fel. Mindezek mellett meg kell oldanunk a mez 'k ellen'rzst is. Ennek megfelel 'en mdostanunk kell a fenti megoldst kiss. A pldrl annyit, hogy egy %rlap jelenik meg, amely a megjelenti a mez'ket egy INPUT HTML tag segtsgvel, amivel a z rtket rgtn mdostani is lehet. A bevitt adatokat minden mez ' esetn a bngsz ' javascript kdja rgtn ellen 'rzi is (Hogy egyltaln ki van-e tltve). Ha nincsen kitltve, akkor hibazenet rkezik. <HTML> <HEAD> </HEAD> 57 <SCRIPT LANGUAGE="JavaScript1.2" type="text/JavaScript1.2"> function elenoriz() { var k=document.form1.text.value; if (k.length<1){ alert("Nincs kitltve az adat!!"); return false; } else{ return true; } } </SCRIPT> <BODY>
mysql_close(); ?> </BODY> </HTML> 58 18.5 Adatbzis hibakezels A MySQL szerver a lekrdezsek sorn hibakdot s szveges zenetet is kld vissza a kliensnek. A hibk kezelsre az albbi fggvnyewk hasznlhatk: string mysql_error ([int link_identifier]) A MySQL szerver ltal visszaadott hiba szvegesen int mysql_errno ([int link_identifier]) A MySQL szerver ltal visszaadott hiba kdja. <?php mysql_connect("marliesle"); echo mysql_errno().": ".mysql_error()."<BR>";
$conn = mysql_query("SELECT * FROM nincsadattabla"); echo mysql_errno().": ".mysql_error()."<BR>"; ?> A fenti lehet'sgek csak a MySQL-re vonatkoznak, de hasonlan lehet hasznlni 'ket ms adatbzisok esetn is. 18.6 Adatbziskezels mskppen absztrakcis rtegek, ADODB, ODBC Fontos krds, hogy mit tegynk akkor, ha el 're nem tudjuk, hogy milyen adatbziskezel 't fogunk hasznlni az oldalunkon, vagy a fejleszts nem ugyanazon az adatbziskezel'n folyik, mint ahol a program fog futni? Az egyes adatbziskezel'k az SQL szintakszis szerint m%kdnek, teht ha ksztnk egy olyan programcsomagot, amely eltakarja el 'lnk az adatbziskezel 'k kzti klnbsgeket, akkor tudunk erre alapozva olyan alkalmazst rni, amelynek mindegy, hogy melyik adatbziskezel 't hasznlja. Ez az adatbzis absztrakcis rteg alkalmazsnak mdszere. 18.6.1 Az absztrakcis rteg A konkrt adatbziskezel 't'l fggetlen olyan utility csomag, amely eltakarja az adatbzis-kezel 'k kztti klnbsgeket, kiegszti azokat plusz funkcikkal knyelmesebb teszi az adatbziskezelssel kapcsolatos programozst. PHP program Adatbzis tpusa, kapcs.azonost, SQL ) * A lekrdezs eredmnye Absztrakcis rteg (pl. ADODB) )* )* )* )* MySQL driver PQ SQL driver MSSQL driver ODBC driver Felmerl a krds, hogy vajon nem, lasstja-e le nagyon a programjaink futst egy ilyen rteg alkalmazsa. Megnyugtathatjuk a kedves olvast, hogy brmifle absztrakcis rteg lasstja a rendszert, de csak olyan csekly mrtkben, hogy a lassuls szrevehetetlen, csak extrm nagy szerver terhels, mellett szrevehet', ugyanakkor az alkalmazsfejleszts nagysgrendekkel meggyorsul. Ilyen egyszer% absztrakcis rteget tbbet is lehet tallni az interneten: 18.6.2 ODBC programcsomag A Microsoft mr korbban megvalstott egy adatbziskezels esetn jl hasznlhat absztrakcis eljrst, ez pedig az ODBC driverek csoportja. Az ODBC driverek olyan meghajtk, amelyek a windows rendszerre teleptett (szinte) tetsz 'leges adatbziskezel't egysges mdon rnek el. Ennek megfelel'en az ilyen drivert hasznl alkalmazsok a Windows rendszeren az SQL szerver mdostsval is m%kdnek, ODBC-n keresztl rik el 'ket. Hasznlatuk: 59 1. Ltre kell hozni az adatbzist valamilyen adatbziskezel 'vel: Egy windows rendszeren lehet, Access, MSSQL, MySQL, PostgresSQL, stb, amelynek ltezik ODBC drivere. 2. Ltre kell hozni egy ODBC kapcsolatot. Ezt az ODBC kezel 'vel tehetjk meg. A klnbz ' Windows verzik esetn ez mshol van, de alapvet'en a Vezrl'pult krnykn kell keresni ODBC adatforrsok vagy hasonl nven. Az albbiakban a Windows XP magyar verzijbl vesszk a pldt:
A fenti belltsokkal most egy MySQL adatforrst adtunk meg. Ezek utn az ODBC adatbziskezel ' utastsokat kell hasznlni a PHP-ban. Az ODBC csomag rszletes lerst lsd az albbi helyen: http://www.php.net/manual/hu/ref.odbc.php 18.6.3 Az ADODB rteg Az ADODB eredetileg a Microsoft ltal kifejlesztett adatbziskezelsi programcsomag, amely egyesti az SQL adatkezels s a kliens oldali adatelrs el 'nyeit. A lnyege, hogy az adatbziskezel 't'l lekrdezsekkel kapott eredmnyeket rekordszeteket nem csak szekvencilisan dolgozhatunk fel, hanem vletlen elrssel brmelyik rszt elrhetjk. Segtsgvel knnyen tudunk grdthet ' menket, listboxokat s ehhez hasonl objektumokat kszteni grafikus rndszerben. Az php ADODB alkalmazscsomag ehhez hasonl funkcikat valst meg. Az ADOdb for PHP-hez legalbb PHP 4.0.2 kell. Hasznlatnak el'nyei: 60 - Knnyen hasznlhat a windowson programozknak, mivel szintaktikja hasonlt a Microsoft fle ADODB- hez. - A PHP natv adatbzis-kezelse fel egy rteget von, ami nem lasstja le lnyegesen az adatbzis elrst, viszont tetsz'leges adatbzison azonoss teszi az adatbziskok kezelst. - Nem csak lekrdezsekre, hanem Update s Insert utastsokra is jl hasznlhat. - Tmogatja a PHP4 sessionjt. - Sajt magban definilt adattpusokkal dolgozik ez is a klnbz' rendszerek kompatibilitst segti el'. Teleptse: Az ADODB library-t letlts utn be kell tenni az adodb alknyvtrba, vagy a PHP include library-jai kz. Ez utbbi esetben a PHP.ini file-t meg kell szerkeszteni egy kicsit: ; Windows: "\path1;\path2" include_path = ".;i:\phplibs;i:\phplibs\adodb;" Ekkor az albbi formt lehet hasznlnunk, mivel a PHP elri mindig az ADODB-t. <?php include('adodb.inc.php'); $db = ADONewConnection('mysql'); $db->debug = true; $db-> Connect($server, $user, $password, $database); $rs = $db-> Execute('select * from some_small_table'); print_r($rs-> GetRows()); ?>
Ha nem tudjuk library-be tenni, akkor egy alknyvtrba tesszk az ADODB programcsomagot. <?php include('adodb/adodb.inc.php'); $db = & ADONewConnection('mysql'); $db->debug = true; $db-> Connect($server, $user, $password, $database); $rs = $db-> Execute('select * from some_small_table'); print_r($rs-> GetRows()); ?> A scriptben az include(adodb/adodb.inc.php); utastssal mondjuk meg a scriptnek, hogy ADODB adatbzist fog kezelni a program. Az adatbzis tpust az $conn = ADONewConnection('mysql') vagy a $conn = &ADONewConnection(' mysql'); formt hasznlhatjuk a kapcsolat ltrehozsra. Ennek hatsra ltrejn a $conn nev % objektum, amely minden olyan paramtert s metdust tartalmaz, ami a ks'bbi kezelshez szksges. Amennyiben egy msik oldalon jra szksgnk van ennek az objektumnak az adataira, az objektumot clszer% lementeni sessionba, majd a kvetkez' oldal elejn jra betlteni. Feltve azt, hogy az objektum definici mr lefusson, amikor a session elindul, teht, ha van egy ltalnos session kezel' rutincsomagunk, akkor a helyes includolsi sorrend az albbi: include(adodb.inc.php); include(session.php); 61 A tovbbiakban nzznk egy egyszer % pldt, amely a Microsoft Acces-hez adott NorthWind adatbzisbl egy lekrdezst hajt vgre, vgigmegy a rekordokon s ha dtum vagy id ' tpus mez 't tall, akkor azt megfelel ' formtumban rja ki. <?php include('adodb.inc.php'); $conn = &ADONewConnection('access'); # Kapcsolat ltrehozsa
$conn->PConnect('northwind'); # MS ACCESS-hez kapcsoldunk, northwind dsn-nel $recordSet = &$conn->Execute('select CustomerID,OrderDate from Orders'); if (!$recordSet) print $conn->ErrorMsg(); # Hibazenet, ha nincsen eredmnye a lekrdezsnek else while (!$recordSet->EOF) { $fld = $recordSet->FetchField(1); # Az els # mez# beolvassa $type = $recordSet->MetaType($fld->type); if ( $type == 'D' || $type == 'T') print $recordSet->fields[0].' '. $recordSet->UserDate($recordSet->fields[1],'m/d/Y').'<BR>'; else print $recordSet->fields[0].' '.$recordSet->fields[1].'<BR>';
A $conn ADO objektumhoz a $conn->Pconnect(northwind) metdus kapcsolja hozz a Northwind adatbzist, ami termszetesen elrhet' a windowsos rendszerben. Az adatok lekrdezst az $recordSet = $conn->execute(select * from Orders) ; metdus hajtja vgre. Ez a $recordSet vltozba visszatr egy ADO rekordszet objektummal. Ha valamilyen ok miatt nem jn ltre a rekordszet, akkor azt le lehet krdezni, s hibakezelst lehet vgrehajtani. A rekordszetnek van kurzora. Ez a kurzor jelli meg az aktulis rekordot. A kurzort $recordSet->MoveNext() metdussal tudom tovbb mozgatni. A sorok kztti mozgst tovbbi parancsok is knnytik: $recordSet->Move($n) - az aktulis sorhoz kpest n sorral ugrik tovbb a kurzor $recordSet->MoveNext() kvetkez' sorra lp a kurzor $recordSet->MoveFirst() els' sorra ugrik a kurzor $recordSet->MoveLast() utols sorra ugrik a kurzor $recordSet->AbsolutePosition (n) Egy abszolt mdon megadott sorra ugrik $sorszm = $recordSet->CurrentRow () Az aktulis sor szmt adja vissza A FetchField fggvny teszteli le a mez'k tpust. 3 elem% objektumot ad vissza. - name: oszlop neve - type: az eredeti mez'tpus - max_length: a mez' max. hossza. Nha nem ad vissza semmit (pl. MySQL) A MetaType() lefordtja az eredeti tpust ltalnos ADODB tpusra. Az albbi generic tpusok lteznek: C: szveg, a <input type="text"> taggal jelenthet' meg X: TeXt, nagy szveg, a <textarea> taggal jelenthet' meg B: Blobs, Binary Large Objects. ltalban kpek. D: Dtum 62 T: Id'blyeg L: Logikai (boolean vagy bit mez') I: Egsz N: Numerikus, illetve autoinkrementlis. R: Sorozat tpus. Lehet sorozat vagy, autoinkrement egsz. Dtum vagy Id'blyeg esetn a UserDate() fggvny konvertlja s kirja a megfelel' formtum id't. 18.7 Tovbbi absztrakci Az adatbziskezels tovbbi egyszer %stseket ignyelhet, klnsen oktatsi krnyezetben vagy egyszer %bb alkalmazsok esetn. Valjban a legtbb adatbzis m%velet visszavezethet' az albbi adatbzis feladatokra: 1. Egy sszetett lekrdezs, aminek az eredmnye kt dimenzis tmb 2. j sor beszrsa egy meglv' tblba 3. Egy sor adatainak a mdostsa egy tblban 4. Egy sor adatainak a trlse egy tblban 5. Egyb SQL utastsok kiadsa
Az 1. feladatkrnek a jellemz' tulajdomnsga az, hogy kt dimenzis tomb az eredmnye. A 2., 3., 4. utastsok eredmnye egy szm. 0, ha nem sikerlt, 1 vagy tbb, ha sikerlt s a szm azt jelzi, hogy hny sorra hajtdott verge az utasts. A fenti feladatokat 2 fggvnnyel meg lehet oldani. Az albbiakra ltunk egy pldt azzal a kiegsztssel, hogy az 1-es feladatnak a specilis esete az, hogy csak egy sort kapunk vissza eredmnyl, tovbb definiltunk kt pldt arra, hogy hogyan kell egy tablet s egy tbla egy rekordjt megjelenteni. <?php /*************************** * ADODB interface s fggvnyek * Copyright by Fabian Zoltan ****************************/ require_once("adodb/adodb.inc.php"); //ADODB driver betltse
63 /** * @return Megadott mez#t vagy a teljes sort adja vissza * @param Lekrdezs szvege $qry * @param keresett mez# $sRet * @desc Vgrehajt egy lekrdezst s egy sort vagy a sor egy oszlopt adja vissza. */ function ExecuteRSRow(&$con,$sql,$sRet=""){ $row = array(); $con->SetFetchMode(ADODB_FETCH_BOTH); $rs = $con->Execute($sql); $row = $rs->FetchRow(); $rs->close(); if(empty($sRet)) return $row; else return $row[$sRet]; } /* * Egy tmbt megjelent tblzatos formban * @param $2D tmb */ Function 2dtable($t){ $n = count($t); //Sorok szma // print("<Table border='1'>\n"); //Tbla nyit tag if($n>0){ print("<tr>\n"); //egy sor nyit html tag foreach($t[0] AS $j => $r){ print("<td>".$j."</td>\n"); //Egy cella kiiratsa } print("</tr>\n"); //Egy sor zr tag }
for($i = 0; $i<$n;$i++){ //ciklus a sorokon vgig $row = $t[$i]; print("<tr>\n"); //egy sor nyit html tag foreach($row AS $j => $r){ print("<td>".$r."</td>\n"); //Egy cella kiiratsa } print("</tr>\n"); //Egy sor zr tag } print("</table>\n"); //tbla zr tag } /** * Egy rekord adatai oszlopos formban, rlap formjban * egy sor * @paramter 1 rekord tmb alakban */ Function egyrekord($r, $target=, $method=POST, $submit=Elkld){ print(<FROM method=.$method. Name=.$method. .isset($target?$ACTION=.$target.:).>); print(<TABLE>); foreach($r AS $i => $e){ print(<TR>); print(<td>.$i.</TD>); print(<td><input type=text name=.$i. value=.$i.></TD>); print(</TR>); } print(</TABLE>); } ?> - 18.8 Id' kezelse PHP-ben s MySQL-ben Az id'pontok kezelse a Unix hagyomnyokra pl. A Unix id 'szmts kezdete 1970. janur.01, 0 ra 0 perc. Az id't a Unix rendszerek innen szmtott msodpercekben mrik s troljk. Ennek megfelel 'en a PHP s a MySQL is innen indul ki. A UNIX id ' elnevezse TIMESTAMP. Az gy kapott id'pont azonban egy nagy egsz szm, amit az adatok bevitelnl s kiiratsnl nemigen lehet hasznlni, ezrt lteznek konverzis fggvnyek ilyen clokra. A PHP esetn az aktulis id'pontot a string Date(formtumstring [,timestamp]) fggvny lltja el' A fromtumstringben az albbi megjegyzsek lehetnek: v y kt karakter (01), Y 4 karakter hossz (2001) 64 Hnap - m kt karakter, sorszm 01, 02,, M a hnap angol neve (January, February, ) Nap d kt karakter, a hnapban a nap sorszma, D elnevezse angolul (Monday, Thuesday, ) ra h 12 rs ciklus 00-12, H 24 rs ciklus kt karakter 00 - 23 Perc i kt karakter 00-59 Az eredmny teht string! Az id'pont talaktsa TIMESTAMP formtumra az albbi fggvnnyel lehetsges: int mktime (int ra, int perc, int msodperc, int hnap, int nap, int v [, int is_dst]) Amennyiben nem akarunk kitlteni bizonyos rtkeket, akkor 0-val kell feltlteni 'ket. Az utols paramter a nappal rtkt tartalmazza, ltalban elhagyhat, s't gyakorlatilag elhagyand. A MySQL esetn az id 'pont trolsa s formtuma hasonlan kett 's. Lehet trolni id 'pontot TIMESTAMP formtumban. Ekkor a UNIX timestamp lesz a bels ' trolsi formtum, de a megjelentsnl mr karaktersorozatot kapunk vissza. Ahhoz, hogy a PHP-nek megfelel ' Timestamp legyen egy lekrdezs eredmnye, a MySQL TIMESTAMP()fggvnyt kell hasznlni. Az albbiakban egy ilyen megoldsra ltunk pldt. Function koncertlista($datum) { // A lekrdezs sszelltsa $qry ="SELECT UNIX_TIMESTAMP(Mikor) AS Ido,Mi,Hol FROM esemeny WHERE Mikor > '".$datum."'"; $result = @mysql_query($qry, $fc); $str ="<UL>"; while ($a = mysql_fetch_object($result)) { $str .= "<LI>".date("Y.M.d, D H:i",$a->Ido).", ".$a->Mi."<BR>"; $str .= $a->Hol."<BR>Belp #:".$a->Belepo." Ft</LI>"; } $str .="</UL>"; echo $str; return; }
// Itt hvom meg az aktulis dtummal a fggvnyt. A formtum azrt fontos, mert csak gy // hasonlthat ssze a MySQL Timestamp-jvel. koncertlista(date("YmdHis"));
Az eredmny az albbi lesz: 2002.Jan.12, Sat 09:12, Koncert Uj vrklub Belp%:500 Ft
Az alkalmazott adattpus az SQL tblban a TIMESTAMP(14) 18.9 Sokig fut programok A PHP scriptek futsnak a maximlis ideje korltozva van a PHP-ben, mert ha egy vgtelen ciklust r az ember, akkor lefagyaszthatja a szervert. A korlt default rtke 30 sec. Ha egy scriptnk mgis tovbb futna, mert valamilyen oknl fogva a feldolgozs lass, vagy esetleg egy adatbzisszervert 'l vr adatokat, akkor clszer % hasznlnunk az albbi fggvnyt a PHP oldalunk elejn, mivel ez a kvnt ideig engedi futni a scriptet Set_time_limit( msodperc) Clszer%en csak akkora rtket rjunk be, hogy a script biztonsgosan lefusson, ugyanakkor idejben ki is lpjen, ha kell. Ha id'nek 0-t runk, akkor soha nem jr le a script, s ha vgtelen ciklust tesznk bele, akkor rkhajts lesz a scriptnk.
65 19 File-ok, knyvtrak kezelse a szerveren s tvoli URL-eken Az albbi fejezetben megnzzk, hogy melyek a leggyakrabban hasznlt fggvnyek s mdszerek a PHP programokban. Amennyiben valaki gy vln, hogy ms fggvnyek gyakrabban hasznlatosak az ' programjaiban, nagyon sajnlom, a help alapjn kell megnzni a m%kdsket sokszor n is ott nzem meg. Az albbi esetek fordulnak el' a filekezelsnl leggyakrabban a PHP programok esetn: - Tvoli szerverr'l szeretnnk olvasni, vagy tvoli szerverre rni - Helyi knyvtrszerkezetb 'l szeretnnk olvasni, vagy ide szeretnnk rni. Az rsnl el 'fordulhat, hogy a kimenetet a helyi standard outputra szeretnnk tenni. - A fenti esemnyeket binris vagy text file esetn is meg akarjuk valstani. - Helyi s tvoli gpen is szeretnnk knyvtrakat ltrehozni, vagy knyvtrakat trlni. - Alkalmanknt kell vizsglnunk, hogy a krdses file a helyi filestruktrban vagy tvoli szerveren ltezik-e? - Egy megadott elrsi tvonal file-ra, knyvtrra vagy link-re mutat-e? - A fileok kezelshez j, ha tudjuk az albbiakat: o Az ppen aktulisan fut alkalmazs loklis szerveren lv' elrsi tvonalt a $_SERVER[PATH_TRANSLATED] stringvltoz tartalmazza o A WEB szerver gykrknyvtrt a $_SERVER[SERVER_ROOT] vltoz tartalmazza o Az opercis rendszer temporary knyvtrt a $_ENV[TEMP] vagy hasonl nev% szupergloblis vltoz tartalmazza. A file kezelsnl tundnunk kell, hogy az otthoni krnyezetben futtatott program elri-e az les szerveren is ugyanazt a knyvtrat. Ha egy web struktrban lv ' file-t kell elrnnk, akkor clszer % kiindulnunk az ppen fut alkalmazs knyvtrbl. A fentiek alapjn, ha az index.php alkalmazsunk az albbi helyen fut: C:\wwwroot\valami s egy geza nev % alknyvtrban lv ' szoveg.txt file-ra szeretnnk hivatkozni, akkor az albbi elrst kell alkalmazni: $el = $_SERVER[PATH_TRANSLATED]./geza/szoveg.txt; Az elrsi tvonalak kezelse sorn gyakori, hogy szt kell vlasztanom az elrsi utat knyvtr, filenv illetve kiterjeszts rszre. Az albbi fggvnyek a fenti elrsi utat vlasztjk szt: $path = C:/wwwroot/valami/geza/szoveg.txt;
$file = basename ($path); // $file rtke "szoveg.txt" $file = basename ($path,".txt"); // $file rtke "szoveg", mivel a msodik paramter hatsra // a vgr #l levgja a megadott stringet. $dir = dirname ($path); // $d rtke C:\wwwroot\valami\geza" lesz. Alternatv megolds a fenti feladatra lehet a pathinfo fggvny: <?php $path_parts = pathinfo("/www/htdocs/index.html"); echo $path_parts["dirname"] . "\n"; echo $path_parts["basename"] . "\n"; echo $path_parts["extension"] . "\n"; ?>
Ha el akarjuk dnteni, hogy a filerendszer egy bejegyzse knyvtr, file, vagy egy link, akkor az albbi fggvnyeket hasznlhatjuk: boolean is_dir($path); boolean is_file($path); 66 boolean is_link($path); Egy file tovbbi tulajdonsgait attributumait az albbi fggvnyekkel kaphatjuk meg: int is_executable($path )- Megmondja, hogy a bejegyzs futtathat-e int is_readable($filename) Megmondja, hogy a file olvashat-e int is_writeable($filename) Megmondja, hogy a file rhat-e int fileatime ($filename)- A file utols elrsi ideje. A visszaadott id' UNIX id'blyeg formjban int filemtime($filename) A file utols mdostsnak ideje Unix id'blyeg formjban int Fileowner($filename) A file tulajdonosnak ID-je. Csak loklis filerendszerben hasznlhat. int fileperms($filename) A filera vonatkoz jogokat adja vissza. Csak loklis filerendszerben hasznlhat. int filesize($filename) - a file mrete $filename = C:/wwwroot/valami/geza/szoveg.txt; echo filesize($filename);
A filekezels meglehet'sen hasonlt a C-ben megszokottakra: Egy file olvassa el'tt meg kell nyitnunk azt. Erre a clra az $fp = fopen($filenev, md) fggvnyt hasznlhatjuk, ahol a $filenv egy loklis filerendszer egy file-ja vagy egy URL-lel megadott file lehet. Ha windows rendszert hasznlunk, akkor a filenvben az elrsi tban szerepl ' knyvtrneveket a \\ jellel kell elvlasztani. $fp=fopen (C:\\wwwroot\\index.htm,w); Ha a $filenv a http:// vagy az ftp:// jelekkel kezd'dik, akkor egy tvoli szerveren lv' file-rl van sz. $fp = fopen(http://www.szily.sulinet.hu/index.html,r);
A file megnyitsnak mdja az albbi lehet: md lers Plda r Olvassra nyitom meg a file-t. File pointer a file elejn ll $fp=fopen(C:\\autoexec.bat,r) w rsra nyitom meg a file-t. A file pointer a file elejre ll s ha volt ilyen file, akkor megsemmisl, zr hosszsgv vlik $fp=fopen(C:\\inetpub\\default.htm,w) 'r+' rsra s olvassra nyitom meg a file-t. A pointer a file elejre ll. $fp=fopen(C:\\inetpub\\adat.ini,r+) w+ rsra s olvassra nyitom meg a file-t. A pointer a file elejre ll. A file megnyitskor 0 hosszsgra csonkoldik $fp=fopen(C:\\inetpub\\adat.ini,w+) 'a' rsra nyitom meg a file-t. A pointer a file vgre ll. $fp=fopen(C:\\inetpub\\adat.ini,a) a+ rsra s olvassra nyitom meg a file-t. A pointer a file vgre ll. $fp=fopen(C:\\inetpub\\adat.ini,a+) b Ha biztosan binris file-t akarok olvasni vagy rni, akkor a megnyitskor a md stringbe be kell rni ezt is. $fp=fopen(C:\\autoexec.bat,rb) 67 A fenti utasts hibazenetet ad, ha nem ltezik az olvassra megnyitni akart file. Ezrt a hibakezelshez az albbiakat kell tenni: if (file_exists($File)) // Ltezik a file? { $fp = fopen($File,"r"); // Megnyitjuk olvassra .....
Miel'tt olvasni szeretnnk egy file-t, meg kell nzni, hogy ltezik-e. A ltezs ellen'rzsre a Boolean file_exists($filename) fggvnyt hasznlhatjuk. A visszatrsi rtke igaz, ha a file ltezik, hamis egybknt. Ha az fopen-nel megnyitottunk egy filet rsra s egy karaktert vagy byte informcit akarunk beolvasni, akkor az albbi fggvnyt hasznlhatjuk $c =fgetch($fp); Ha az fopen-nel megnyitottunk egy filet rsra, s egy text file egy sort akarjuk beolvasni, akkor az albbi fggvnyt hasznljuk: $sor = fgets($fp[,sorhossz]); A sorhossz paramter nem ktelez', ha nem tesszk ki, akkor alaprtke 1024 karaktert olvas a fggvny. Ha az fopen-nel megnyitottunk egy filet rsra s, ki akarom szedni a beolvasott filebl az esetlegesen benne lv ' html tag-okat, akkor ezt kell hasznlni. $sor=fgetss($fp[,sorhossz]); Ha nem adjuk meg a sorhosszat, akkor max 1024 hossz stringet olvas be. Ha egy text file sszes sort be akarjuk olvasni egy tmbbe, akkor az albbi fggvnyt kell hasznlni: $aline =file($Filename[,int include_path]) A fggvny beolvassa a megadottt $Filename elrsi tvonal text file sorait egy $aline nev % tmbbe. A fggvnnyel nemcsak a loklis filerendszerb 'l, hanem URL-lel megadott file-bl is lehet olvasni! Ha a file nem ltezik, akkor hibazenet keletkezik, s a tmb elemszma 0 marad. A kezelsre nzzk az albbi pldt a Help alapjn: <?php // A beolvasand file egy URL-lel van megadva. $filename =http://www.szily.hu/szily/szily.css; $asor = @file($filename); if(count($asor==0)){ die(Nem ltez # file); }
// A beolvasott file feldolgozsa s a sorok kiiratsa. // A html sorokat kirja, mint html szveg, sor s sorszmot is kir. foreach ($asor as $line_num => $sor) { echo "#<b>{$line_num}</b> sor : " . htmlspecialchars($sor) . "<br>\n"; }
// Ez a plda egy file-t beolvas, majd a sorokat egy stringg sszevonja. $html = implode ('', file ('http://www.szily.hu/szily/')); ?>
Ha egy teljes file-t akarunk beolvasni, akkor az albbi fggvnyt kell hasznlnunk: $t=fread($fp,$filesize( $filenev)); 68 A filesize($filenev) fggvny megadja az adott file mrett byte-okban s a paramter hatsra a filemretnek megfelel' puffert foglal le a memriban a PHP. A visszatrsi rtk vltozja tartalmazza majd a file sszes byte-jt, mint string. Ez a fggvny binris olvasskor hasznlhat igazn, mert a beolvasott tartalommal semmifle konverzi nem trtnik. Egy rsra vagy rsra/olvassra megnyitott fileokba val rsnl alapvet' fggvny az int fwrite($fp,$c); Ha a kiirand rtk egy karakter, akkor karakterenknt runk, ha egy textfile egy sora, akkor a sorvge jelet hozz kell tennnk a kiirand tartalomhoz az albbi mdon: $c=$sor,\r\n; Ha egy file tartalmt akarjuk kiiratni, akkor a vltoz tartalmazza a teljes tartalmat. lljon itt filekezelsre egy komplexebb plda. Egy file-bl olvasnom kell, de ehhez el'szr meg kell nyitnom. <!-
Ez a program megvalst egy egyszer karakter alap szmllt. A szmll pillanatnyi rtke a counter.txt llomnyban van, amit a szkript beolvas rtkt minden egyes beolvass sorn megnveli, a megnvelt rtket ugyan- abba a fileb visszarja, majd a szmll llst megjelenti. Ahhoz, hogy program megfelel#en mkdjn a counter.txt llomnyt ltre kell hoznunk, melynek tartalma csak '1' legyen, ezt a filet fel kell tltennk ugyanabba a knyvtrba, ahol a program van, s rsi jogosultsgot kell adnunk r.
--> <hr>
Ltogatk szma:<BR> <?php $File = 'counter.txt'; // A szmll file neve if (file_exists($File)) // Ltezik a file? { $fp = fopen($File,"r"); // Megnyitjuk olvassra $num = fread($fp, filesize($File)); // Beolvassuk a tartalmt a $num vltozba. fclose($fp); // Zrjuk a filet. $num=$num+1; // A vltoz rtkt megnveljk $fp = fopen($File,"w"); // Megnyitjuk ugyanazt a filet, de most rsra fwrite($fp, $num, 10); // Kirjuk a vltoz rtkt. fclose($fp); // Zrjuk a filet echo('<b>'.chop($num).'</b>'); // Kirjuk a HTML-kdba a vltoz rtkt. } ?> <hr>
69 20 Grafika A PHP-ban a grafikai modult nem a kpek egyszer % kittelre hasznlhatjuk, hanem a szerver oldalon kpekkel vgzett manipulcikra. A PHP grafikhoz szksges, hogy a szerver oldalon be legyen tltve a GD.DLL vagy a GD_2.DLL (Windows szerver esetn). A GD_2.DLL tmogatja a BMP, JPEG, GIF, s PNG kpekkel vgzett manipulcikat. Az albbi mintban egy fotoalbum kszt ' s hasznl programot mutatunk be. A program az els' meghvsakor az aktulis knyvtrban lv' kpekr'l kiskpeket kszt, majd tblzatos formban megjelenti azokat. A programot objektum-orientlt formban rtam meg. <?php /* Simple PhotoAlbum 2.2.1.2004.06.02 (c) by Zoltn Fbin, 1999-2004
Use the program free. email: fz@szily.hu
This script works on this site: http://fz.szily.hu, http://www.alarmsystem.hu/fotoalbum
Hasznlata
include("../photoalbum.php"); */
if(stristr($_SERVER["PHP_SELF"], __FILE__)) die("Nem hvhatod meg a file-t kzvetlenl!...");
define("SERVERTARGET",str_replace(".","_",$_SERVER["SERVER_NAME"])); define("DOCUMENT_ROOT",$_SERVER["DOCUMENT_ROOT"].(( substr($_SERVER["DOCUMENT_ROOT"],-1)!="/") ? "/" :"")); //The DOCUMENT_ROOT path define("PHOTOSCRIPT",relpath(__FILE__)); //The path of this script define("PHOTOALBUM","__photoalbum.txt"); define("DELIMITER","#"); define("CSV_OK",True);
if(!isset($col)) $col = 4; // Number of columns define("COLUMNS", $col);
if(!isset($slide)) $slide = 5; // timeout of the sliding define("SLIDE", $slide);
//Needed gd extension DEFINE("GD",True); if(!extension_loaded ("gd")) { if(ini_get("enable_dl")) { DEFINE("GD",dl("gd.dll")); }else{ DEFINE("GD",False); } } // ---------- Image osztly ----------- class image { var $Name; // Picture picture var $Thumb; // Thumbnail name var $dx; // size of picture var $dy; var $Text; // text under the picture
function image($Entry="",$Txt="") { global $aktdir,$newThumbnails; if(strlen($Entry)>0) { 70 $this->Name = $Entry; //get size of picture if(GD) { $size = GetImageSize($aktdir.$this->Name); }else{ $size=array(800,600); } $this->dx = $size[0]; $this->dy = $size[1];
//Make new thumbnails from GIF, PNG or JPG | JPEG |bmp! function NewThumbnail () { global $gd, $aktdir; //size of original big picture $size = GetImageSize($aktdir.$this->Name); $dx = $size[0]; $dy = $size[1];
} //Write out a thumbnail into the table function ShowThumbnail() { $str=$this->GetString(); print($str); } //get the string of a thumbnail function GetString() { global $css_td,$css_link,$pics; $str = "<TD ".$css_td." ALIGN=\"CENTER\" VALIGN=\"top\">"; $str .= "<a href='javascript:picturepopup(\"". PHOTOSCRIPT."?getimg=".$this->Name."&picpath=". $pics->ImageWebPath."\",\"".SERVERTARGET."\")' ". $css_link.">\n"; $str .= "<IMG SRC=\"".$this->Thumb."\" ALT=\"".$this->Name. "\" border=\"0\" width=\"".THUMBNAIL_WIDTH."\" ><BR>". $this->Text."</a>\n"; $str .= "</TD>"; return $str; } }
//-------- Image list class ----------- class ImageList { var $aPictures = array(); //Array of images var $ImageNumber; var $RowNumber; //number of rows var $ImagePath; //The directory of list var $ImageWebPath; //The Path in the website var $CSV_OK;
var $css_file; //styles var $css_link; var $css_body; var $css_table; 72 var $css_tr; var $css_td; var $css_tag;
//It makes a list from the actual directory function ImageList($path) { $this->newThumbnails = 0; $this->ImageNumber = 0; $this->ImagePath = $path; $this->ImageWebPath = substr(relpath($path),0,-1);
function GetString() { global $css_table,$css_tr,$css_td,$newThumbnails; $str = picturepopup(); $str .= "<TABLE ".$css_table.">";// Border=\"0\">\n\r"; $str .= "<TR ".$css_tr.">\n\r"; $j=0; while (list ($key, $ertek) = each ($this->aPictures)) { $str .=$this->aPictures[$key]->GetString(); $j++; if ($j == COLUMNS){ $str .="</TR>\n\r<TR>"; $j =0; } }
while(0<$j && $j<COLUMNS){ $str .= "<TD ".$css_td."> </TD>"; $j++; } $str .="</TR>\n\r"; $str .="</TABLE>\n\r"; if ($newThumbnails>0){ $str .="<p align='center' style='color: #ff0000'> Found ". $newThumbnails." new pictures and made thumbnails!</p>"; $newThumbnails=0; } Return $str; }
//Searches an image in array function Search($image) { $i =0; while( ($i<sizeof($this->aPictures) ) && ($this->aPictures[$i]->Name != $image) ) { $i++; 74 } return $i; }
function PreviousImage($idx){ if($idx==0) $idx = sizeof($this->aPictures); $idx--; Return $idx; }
function NextImage($idx) { if($idx==sizeof($this->aPictures)-1) $idx=-1; $idx++; Return $idx; } }
class popup { var $Image; var $PrevImage; var $NextImage; var $dx; //width of popup var $dy; //height of popup var $dxx; //width of picture var $dyy; //height of picture
function popup($getimg){ global $pics; $idx= $pics->Search($getimg); $this->Image = new Image(); $this->PrevImage = new Image(); $this->NextImage = new Image(); $this->Image = $pics->aPictures[$idx]; $this->PrevImage = $pics->aPictures[$pics->PreviousImage($idx)]; $this->NextImage = $pics->aPictures[$pics->NextImage($idx)]; $this->dxx = ($this->Image->dx<600) ? (600) :($this->Image->dx);
//The path of actual pictures if (!isset($aktdir)){ //from calling script first if (isset($_GET["picpath"])){ //From somewhere $aktdir =substr(DOCUMENT_ROOT,0,-1).$_GET["picpath"]; } else { //Slide $aktdir = dirname($_SERVER["PATH_TRANSLATED"])."/"; } } $aktdir=pathcomp($aktdir); $pics = new ImageList($aktdir);
//******************* searching for css style settings ***************** 77 if(!isset($pics->css_file)) $pics->css_file = CSS_File_search(); if(!isset($pics->css_link)) $pics->css_body = CSS_Body_Search(); //****************** main things *****************
if( !$getimg){ $pics->Showlist(); }else{ // ************* show one Image ****************** $p = new popup($getimg); $p->show(); } ?> 78 21 Belptets, jelszavak alkalmazsa, titkosts Az albbi forrst hasznltam fel a kvetkez' oldalak lershoz: http://hotwired.lycos.com/webmonkey/00/05/index2a_page2.html?tw=programming Amikor egy knyvtrat vagy html oldalt le akarunk vdeni azonost nvvel s jelszval, akkor el 'szr is meg kell szerveznnk a WEB szerver oldali vdelmet. Ez a klnbz ' WEB szerverek esetn mindig egy kicsit mskppen megy. Az Apache WEB szerver esetn is tbb lehet 'sg knlkozik, de taln a kvetkez ' a legegyszer%bb: Tegyk fel, hogy a /wwwroot/ceg nev% knyvtrat szeretnnk levdeni: A vdett knyvtrban ltre kell hozni a .htaccess nev% file-t. Ennek a tartalma: AuthType Basic AuthName "Vedett terlet" AuthUserFile /wwwroot/ceg/.htpasswd AuthGroupFile /dev/null
<Limit GET POST PUT> require valid-user </Limit>
A szerveren be kell lltani a megfelel' knyvtrra az albbi sorokat: httpd.conf
<Directory "/wwwroot"> //itt a www gykrknyvtrrl van sz ... AllowOverride AuthConfig ... </Directory>
// a ks#bbiek sorn be kell tltve lennik az albbi soroknak
LoadModule anon_auth_module modules/mod_auth_anon.so LoadModule dbm_auth_module modules/mod_auth_dbm.so LoadModule digest_auth_module modules/mod_auth_digest.so LoadModule digest_module modules/mod_digest.so LoadModule expires_module modules/mod_expires.so LoadModule headers_module modules/mod_headers.so LoadModule info_module modules/mod_info.so LoadModule status_module modules/mod_status.so LoadModule php4_module x:/php/sapi/php4apache.dll #Ez itt a PHP4 miatt kell
Az albbi knyvtrban /apache/bin le kell futtatni az albbi parancsot: htpasswd /wwwroot/ceg/.htpasswd usernv Ennek hatsra ltrejn egy text file, amiben a usernv s a hozz tartoz jelsz tallhat. Ha tbb usert akarunk azonosttatni, akkor ltre kell hozni egy user groupot s abban a usereket definilni. Pldul ltrehozzuk a .htgroup nev% file-t, amiben definiljuk a csoportot: userek: bela geza user1 user2
Lefuttatjuk a jelszgenerlst tbbszr htpasswd /wwwroot/ceg/.htpasswd bela htpasswd /wwwroot/ceg/.htpasswd geza htpasswd /wwwroot/ceg/.htpasswd user1 htpasswd /wwwroot/ceg/.htpasswd user2
Az adott knyvtr oldalnak lekrsekor a szerver elkldi a bngsz 'nek a 401-es hibakdot, amely utastja a bngsz't, hogy jelentse meg az adatok bevitelre alkalmas oldalt prbeszdablakot.
Itt beviszi a felhasznl az adatokat, amit a szerver ellen'riz. A fenti mdszer hasznlathoz nincsen szksg PHP kzrem %kdsre, ugyanakkor nagy szm felhasznl esetn nem tl gyors a mdszer, csak a szerveren lehet mdostani a userlistt s a jelszavakat. A belptetsre tbb megfelel' mdszer knlkozik a PHP esetn. Ha modulknt futtatjuk a PHP-t, akkor viszonylag egyszer %en biztosthatjuk, hogy egy HTTP bekrst szimullhassunk, csak az albbi sorokat kell elkldeni a bngsz'nek: header('WWW-Authenticate: Basic realm="Magnterlet!"'); header('HTTP/1.0 401 Unauthorized'); echo 'Authorization Required.'; exit;
Ennek hatsra a $PHP_AUTH_USER s $PHP_AUTH_PWD vltozk fogjk tartalmazni a bevitelnl adott vlaszt. Ekkor sessionok segtsgvel minden oldalon felhasznlhatjuk a vltozk rtkeit. Ha CGI mdszerrel futtatjuk a PHP-t, akkor sajnos nem egyszer % a fenti vltozk hasznlata, ekkor gondoskodni kell arrl, hogy minden oldal hvsakor a vltoz tartalma taddjon. A tovbbiakban bemutatjuk kt pldn, hogy mi trtnik akkor, ha egy prbeszdablakban bekrtk a kt vltoz rtkt. Egy lehet 'sg, hogy ltrehozzunk egy beviteli ablakot egy HTML form segtsgvel, majd POST metdussal elkldjk az eredmnyt a kvetkez' oldalnak. <Form method=POST ACTION=login.php> <p>Krem a usernevet: <INPUT Type=text NAME=PHP_AUTH_USER SIZE=60><BR> Krem a jelszt: <INPUT TYPE =PASSWORD NAME=PHP_AUTH_PWD><BR> <INPUT TYPE=SUBMIT NAME=OK> <INPUT TYPE=RESET NAME=RESET> </Form>
A login.php oldal leellen 'rzi, hogy a megfelel ' usernv jelsz pros szerepel-e benne. Az ellen 'rzs trtnhet adatbzisbl vagy sima text file-bl is. <?php // Megvizsgljuk, hogy az el #z# form-bl kapott adatok kztt ltezik-e //a $PHP_AUTH_USER vltoz s tartalmaz-e adatokat.
80 if (!isset($PHP_AUTH_USER)) {
// Ha nem ltezik, a vltoz, akkor elkldnk egy fejlcet a bngsz #nek. header('WWW-Authenticate: Basic realm="Magnterlet!"'); header('HTTP/1.0 401 Unauthorized'); exit;
} else if (isset($PHP_AUTH_USER)) {
// Ha nem res a vltoz, akkor megnzzk, hogy az adatbzisban megvan-e // a megfelel # usernv jesz pros // MySQL kapcsolatot hozunk ltre. Az itteni usernv nem azonos a belptet # userrel! mysql_connect("hostname", "username", "password") or die ("Unable to connect to database.");
// Megnyitjuk a jelszadatbzist mysql_select_db("Userlista") or die ("Unable to select database.");
// Elkldjk a lekrdezst a users tblra
$sql = "SELECT * FROM users WHERE username='$PHP_AUTH_USER' and password='$PHP_AUTH_PW'";
// Vgrehajtjuk, majd az eredmny a $result vltozba kerl
$result = mysql_query($sql);
// Ha az eredmnynek 0 sora van, akkor nincs ilyen user s jelsz pros, // ha 1, akkor van
Hasonl megolds, amikor egy text file-t hasznlunk az authentikcihoz: <?php
// Megvizsgljuk, hogy az el #z# form-bl kapott adatok kztt ltezik-e //a $PHP_AUTH_USER vltoz s tartalmaz-e adatokat.
if (!isset($PHP_AUTH_USER)) {
// Ha nem ltezik, a vltoz, akkor elkldnk egy fejlcet a bngsz #nek. header('WWW-Authenticate: Basic realm="Magnterlet!"'); header('HTTP/1.0 401 Unauthorized'); exit;
} else if (isset($PHP_AUTH_USER)) {
// Ha nem res a vltoz, akkor megnzzk, hogy egy text file-ban megvan-e // a megfelel # usernv jesz pros. Beolvassuk a file-t a $file_tartalom nev // vltozba
// A text file sorait egy $sor nev tmbbe visszk be. //A sorok vgt a \n karakter jelzi.
$sor = explode("\n", $file_tartalom); 81
// Vgignzzk a $sor tombot, hogy a megfelel # rtket megtalljuk-e benne // A sor minden elemt kt rszre bontjuk, usernv s jelsz prra. // Az elvlaszt jel a : // A kvetkez #ben a keress programozsi ttelt alkalmazzuk.
A fenti rutinokat kiss mdostva berhatjuk 'ket egy include file-ba. Ha minden php oldalon beszrjuk a file-t, akkor automatikusan az oldal bekrsekor lefut s ellen 'rzi a jogosultsgot. Mindenesetre ekkor biztostani kell, hogy tlpve a kvetkez' oldalra a $PHP_AUTH_USER s $PHP_AUTH_PWD vltozk tartalma megmaradjon s elrhet' legyen. 82 Egy harmadik s taln elg jl hasznlhat megolds. Alapja, hogy egy scriptet minden vdett oldal elejre beszrunk, ami az oldal hvsakor lefut s SESSION vltozban troljuk a belptets eredmnyt, illetve a belptetett user-t. $name =""; $pwd =""; Session_start(); if(!isset($_SESSION["logged_in"])) $_SESSION["logged_in"] = False;
//A jelsz s usernv ellen #rzse adatbzisbl mysql_connect("hostname", "username", "password") or die ("Unable to connect to database.");
// Megnyitjuk a jelszadatbzist mysql_select_db("Userlista") or die ("Unable to select database.");
// Elkldjk a lekrdezst a users tblra $sql = "SELECT * FROM users WHERE username='$name' and password='$pwd'";
// Vgrehajtjuk, majd az eredmny a $result vltozba kerl $result = mysql_query($sql);
// Ha az eredmnynek 0 sora van, akkor nincs ilyen user s jelsz pros, // ha 1, akkor van
$num = mysql_numrows($result);
if($num>0){ //Ide kell betenni a jelszellen #rzst $_SESSION["logged_in"] = True; //vagy sima text vagy mysql lekrdezs stb... } } }
If (!($_SESSION["logged_in"])){ //Vagy egy login formot hasznlunk, ekkor POST-tal kldjk el a megfelel # rtkeket include ("login.html");
// vagy szimulljuk a WEBbngsz # belptet# oldalt. //header('WWW-Authenticate: Basic realm="Belptets!"'); //header('HTTP/1.0 401 Unauthorized'); exit; }
21.1 Titkostott tvitele a kliens s a szerver kztt: MD5() A PHP-ban van egy jl hasznlhat fggvny, amellyel adatok mdostatlanst tudjuk vizsglnialapvet ' titkostst tudjuk elvgezni, illetve a titkostott adatokat tudjuk visszakdolni plain text-. Az adatoknak karakter formtumaknak kell lenni. A fggvny az String md5( string)
/* * md5.jvs 1.0b 27/06/96 * * Javascript implementation of the RSA Data Security, Inc. MD5 * Message-Digest Algorithm. 83 * * Copyright (c) 1996 Henri Torgemane. All Rights Reserved. * * Permission to use, copy, modify, and distribute this software * and its documentation for any purposes and without * fee is hereby granted provided that this copyright notice * appears in all copies. * * Of course, this soft is provided "as is" without express or implied * warranty of any kind. * * $Id: md5.js,v 1.2 1998/11/22 14:27:42 sas Exp $ * */
function array(n) { for(i=0;i<n;i++) this[i]=0; this.length=n; }
/* Some basic logical functions had to be rewritten because of a bug in * Javascript.. Just try to compute 0xffffffff >> 4 with it.. * Of course, these functions are slower than the original would be, but * at least, they work! */
function integer(n) { return n%(0xffffffff+1); }
function shr(a,b) { a=integer(a); b=integer(b); if (a-0x80000000>=0) { a=a%0x80000000; a>>=b; a+=0x40000000>>(b-1); } else a>>=b; return a; }
function shl1(a) { a=a%0x80000000; if (a&0x40000000==0x40000000) { a-=0x40000000; a*=2; a+=0x80000000; } else a*=2; return a; }
function shl(a,b) { a=integer(a); b=integer(b); for (var i=0;i<b;i++) a=shl1(a); return a; }
function and(a,b) { a=integer(a); b=integer(b); var t1=(a-0x80000000); var t2=(b-0x80000000); if (t1>=0) if (t2>=0) return ((t1&t2)+0x80000000); else return (t1&b); else if (t2>=0) return (a&t2); else return (a&b); 84 }
function or(a,b) { a=integer(a); b=integer(b); var t1=(a-0x80000000); var t2=(b-0x80000000); if (t1>=0) if (t2>=0) return ((t1|t2)+0x80000000); else return ((t1|b)+0x80000000); else if (t2>=0) return ((a|t2)+0x80000000); else return (a|b); }
function xor(a,b) { a=integer(a); b=integer(b); var t1=(a-0x80000000); var t2=(b-0x80000000); if (t1>=0) if (t2>=0) return (t1^t2); else return ((t1^b)+0x80000000); else if (t2>=0) return ((a^t2)+0x80000000); else return (a^b); }
function not(a) { a=integer(a); return (0xffffffff-a); }
/* Here begin the real algorithm */
var state = new array(4); var count = new array(2); count[0] = 0; count[1] = 0; var buffer = new array(64); var transformBuffer = new array(16); var digestBits = new array(16);
var S11 = 7; var S12 = 12; var S13 = 17; var S14 = 22; var S21 = 5; var S22 = 9; var S23 = 14; var S24 = 20; var S31 = 4; var S32 = 11; var S33 = 16; var S34 = 23; var S41 = 6; var S42 = 10; var S43 = 15; var S44 = 21;
function F(x,y,z) { return or(and(x,y),and(not(x),z)); }
function G(x,y,z) { return or(and(x,z),and(y,not(z))); } 85
function H(x,y,z) { return xor(xor(x,y),z); }
function I(x,y,z) { return xor(y ,or(x , not(z))); }
function rotateLeft(a,n) { return or(shl(a, n),(shr(a,(32 - n)))); }
function FF(a,b,c,d,x,s,ac) { a = a+F(b, c, d) + x + ac; a = rotateLeft(a, s); a = a+b; return a; }
function GG(a,b,c,d,x,s,ac) { a = a+G(b, c, d) +x + ac; a = rotateLeft(a, s); a = a+b; return a; }
function HH(a,b,c,d,x,s,ac) { a = a+H(b, c, d) + x + ac; a = rotateLeft(a, s); a = a+b; return a; }
function II(a,b,c,d,x,s,ac) { a = a+I(b, c, d) + x + ac; a = rotateLeft(a, s); a = a+b; return a; }
function transform(buf,offset) { var a=0, b=0, c=0, d=0; var x = transformBuffer;
a = state[0]; b = state[1]; c = state[2]; d = state[3];
for (i = 0; i < 16; i++) { x[i] = and(buf[i*4+offset],0xff); for (j = 1; j < 4; j++) { x[i]+=shl(and(buf[i*4+j+offset] ,0xff), j * 8); } }
/* Round 1 */ a = FF ( a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */ d = FF ( d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */ c = FF ( c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */ b = FF ( b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */ a = FF ( a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */ d = FF ( d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */ c = FF ( c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */ b = FF ( b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */ a = FF ( a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */ d = FF ( d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */ c = FF ( c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */ b = FF ( b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */ a = FF ( a, b, c, d, x[12], S11, 0x6b901122); /* 13 */ d = FF ( d, a, b, c, x[13], S12, 0xfd987193); /* 14 */ c = FF ( c, d, a, b, x[14], S13, 0xa679438e); /* 15 */ b = FF ( b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
86 /* Round 2 */ a = GG ( a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */ d = GG ( d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */ c = GG ( c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */ b = GG ( b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */ a = GG ( a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */ d = GG ( d, a, b, c, x[10], S22, 0x2441453); /* 22 */ c = GG ( c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */ b = GG ( b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */ a = GG ( a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */ d = GG ( d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */ c = GG ( c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */ b = GG ( b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */ a = GG ( a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */ d = GG ( d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */ c = GG ( c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */ b = GG ( b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
/* Round 3 */ a = HH ( a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */ d = HH ( d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */ c = HH ( c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */ b = HH ( b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */ a = HH ( a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */ d = HH ( d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */ c = HH ( c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */ b = HH ( b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */ a = HH ( a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */ d = HH ( d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */ c = HH ( c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */ b = HH ( b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */ a = HH ( a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */ d = HH ( d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */ c = HH ( c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */ b = HH ( b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */
/* Round 4 */ a = II ( a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */ d = II ( d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */ c = II ( c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */ b = II ( b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */ a = II ( a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */ d = II ( d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */ c = II ( c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */ b = II ( b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */ a = II ( a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */ d = II ( d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */ c = II ( c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */ b = II ( b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */ a = II ( a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */ d = II ( d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */ c = II ( c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */ b = II ( b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */
function init() { count[0]=count[1] = 0; state[0] = 0x67452301; state[1] = 0xefcdab89; state[2] = 0x98badcfe; state[3] = 0x10325476; for (i = 0; i < digestBits.length; i++) digestBits[i] = 0; }
function update(b) { var index,i;
index = and(shr(count[0],3) , 0x3f); 87 if (count[0]<0xffffffff-7) count[0] += 8; else { count[1]++; count[0]-=0xffffffff+1; count[0]+=8; } buffer[index] = and(b,0xff); if (index >= 63) { transform(buffer, 0); } }
function finish() { var bits = new array(8); var padding; var i=0, index=0, padLen=0;
for (i = 0; i < 4; i++) { bits[i] = and(shr(count[0],(i * 8)), 0xff); } for (i = 0; i < 4; i++) { bits[i+4]=and(shr(count[1],(i * 8)), 0xff); } index = and(shr(count[0], 3) ,0x3f); padLen = (index < 56) ? (56 - index) : (120 - index); padding = new array(64); padding[0] = 0x80; for (i=0;i<padLen;i++) update(padding[i]); for (i=0;i<8;i++) update(bits[i]);
for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { digestBits[i*4+j] = and(shr(state[i], (j * 8)) , 0xff); } } }
/* End of the MD5 algorithm */
function hexa(n) { var hexa_h = "0123456789abcdef"; var hexa_c=""; var hexa_m=n; for (hexa_i=0;hexa_i<8;hexa_i++) { hexa_c=hexa_h.charAt(Math.abs(hexa_m)%16)+hexa_c; hexa_m=Math.floor(hexa_m/16); } return hexa_c; }
var ascii="01234567890123456789012345678901" + " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ"+ "[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";
function MD5(entree) { var l,s,k,ka,kb,kc,kd;
init(); for (k=0;k<entree.length;k++) { l=entree.charAt(k); update(ascii.lastIndexOf(l)); } finish(); ka=kb=kc=kd=0; for (i=0;i<4;i++) ka+=shl(digestBits[15-i], (i*8)); for (i=4;i<8;i++) kb+=shl(digestBits[15-i], ((i-4)*8)); for (i=8;i<12;i++) kc+=shl(digestBits[15-i], ((i-8)*8)); for (i=12;i<16;i++) kd+=shl(digestBits[15-i], ((i-12)*8)); s=hexa(kd)+hexa(kc)+hexa(kb)+hexa(ka); return s; 88 }
89 22 Biztonsg, tippek s trkkk Egy nyilvnos szerveren fut PHP program futtatsnak a biztonsgoss ttele rendkvl fontos dolog, s kt tnyez'n, a szerver belltsain s a programoz gondossgn is mlik. Bemen' adatok ellen'rzse s sz%rse A bemen' adatokat kt oldalon lehet vagy kell ellen'rizni. - A user oldalon a formok adatbevitelnek felprogramozsval - A szerver oldalon a mr elkldtt adatok rvnyessgnek vizsglatval Az els' vltozat arra val csakis s kizrlag, hogy a felhasznl user hibit kikszbljk illetve minimalizljuk. Az adatbevitel ltalban egy ormon keresztl zajlik, teht a formon val adatbevitelt clsze % ellen'rizni. Erre a clra ltalban Javascript kdot hasznlhatunk, amely pldul akkor fut le, - ha a Form submit gombjt megnyomjuk ekkor a Form onSubmit esemnyre indulhat el a Javascript kd, - vagy minden egyes mez ' rtknek vltozsakor lefuttatunk egy ellen 'rz' rutint ekkor a mez ' onChange esemnyre indulhat a javascript kd. Mely mez'ket kell ellen'rizni? Gondos programozssal csak nhnyat. A HTML Formoknl az albbi beviteli mez'k vannak: - Input mez' Text ellen'rizni kell TEXTarea ellen'rizni kell Checkbox ellen'rizni lehet RadioButton clszer% ellen'rizni Select men a kivlasztottsgot clszer% ellen'rizni File mez' Igazbl a file ltezst ellene ellen 'rizni, de nem illik. Csak annyit leet, hogy a file mez 'ben van-e valamifle bejegyzs. A fentiek alapjn lltszik, hogy egyszer % esetben csak a text s a textarea ellen 'rzse igazn fontos. Ott ellen'rizhetjk a string hosszt, azt hogy bizonyos karakterek benne vannak-e vagy nincsenek. Mevizsglhatjuk, hogy a bevitt adat numerikus-e, s ha igen, akkor milyen tartomnyba esik. A szerver oldalon mr ellen'rztt adatot kapunk, mirt kell a szerver oldalon ismtelten ellen'rizni? A a kliens oldali ellen 'rzs sokkal gyorsabb, tovbb a userek sanda szndkait a szerver oldalon lehet csak elkapni. Itt is minden fenti dolgot ellenrizhetnk, azaz: - Egy vltoz rtkt - Egy vltoz formjt (milyen hossz, milyen karakterek vannak bene vagy hinyoznak). Itt kell kisz %rni az esetlegesen bevitt HTML tag-eket, a s a jeleket, az esetlegesen bevitt SQL utastsneveket (SQL injection). - Az adat numerikus-e, s ha igen, akkor megfelel'-e az rtke. - Ez azt jelenti, hogy itt mr a vltozk ltt, a formtumt, s rtkt kell csak ellen 'rizni. Itt kell felkszlni esetleges sanda szndk userek datbevitelre is. File-k elrsnek a kezelse A PHP.INI megfelel' (biztonsgos) belltsa Biztonsgos kapcsolatok, kapcsolati mdok hasznlata 90 23 Sablonok Template-ek, LIB-ek Template vagy ms el'regyrtott library-t akkor hasznlunk, ha 1. Gyorstani akarjuk a PHP alkalmazs futtatst 2. Gyorstani akarjuk a programfejlesztst 3. El akarjuk vlasztani a fejleszts design s a logikai rszt 4. Nem akarjuk feltallni a spanyolviaszt, azaz a ms ltal jl megrt kdot hasznlni akarjuk. 23.1 Template-ek, Smarty A template rendszerek olyan PHP-ban vagy egyb mdon kifejlesztett alkalmazsok, amelyek segtsgvel el tudjuk vlasztani egymstl az zleti logika s a design elemeket. Ezek a gyakorlatban azt jelentik, hogy a design elemek egy HTML-hez hasonl kdolsi rendszerben jnnek ltre, z adatbzis, s egyb prorgramozsi rszek a kifejleszett PHP kd alapjn, s a futs kzben amTemplate rendszer sszeszerkeszti a design template-eket s a PHPkdot, majd az gy ltrejtt kdot futtatja. Felvet'dik a krds, hogy mennyire lasstja le az alkalmazst az gy kifejlesztett kd? A tapasztalatok azt mutatjk, hogy egyes template rendszerek hasznlata esetn a kd futsi sebessge n ', mivel nem a PHP-nak kell el'lltania a teljes HTML tartalmat, hanem azt HTML kdban tartjuk. A PHP programoznak s a Designernek knny% elvlasztania a munkjt, hiszen a programoz s a designer egy jl definilt felhasznli interface-en keresztl kapcsoldik egymshoz. A programnak az a feladata, hogy az ltala el 'lltott PHP kd eredmnyt helyezze el egy tipikusan string tpus vltozba, amit aztn a sablon feldolgoz modulja beszerkeszt a Sablon tartalmba s elkldi a WEB szerveren keresztl a kliensnek. Tekintettel arra, hogy a Web oldalak jelent 's rsze mg akkor is statikusnak tekinthet ', ha PHP-val lltkjuk el ', egyes sablon rendszerek arra is kpeske, hogy az sszeszerkesztett oldalakat cache-eljk, azaz az sszeszerkesztett oldallal szolgljanak ki bizonyos krseket. Az albbiakban a Smarty nev% npszer% alkalmazscsomaggal ismerkednk meg egy kicsit. A teleptse sorn a smarty.inc.php oldalt kell beszerkesztennk az oldalaink elejre, ami egyttal inicializlja a rendszert. <?php /********************** * index.php az alkalmazs f#oldala * HTML neve: main **********************/ Include(config.php); //sznek s egyb paramterek belltsa
session_write_close(); // ------------- Kimenet tmrtve menjen ki -----------
$smarty->Assign("SID",session_id()); $smarty->display(PATH."templates/index.tpl"); //A megjelents sablonja alapjn a //megjelentst vgz # modul ?>
A pldban egy program el 'lltja a men kdjt, a Config.php-ben belltjuk a zsnekkel kapcsolatos informcikat. Az albbi utastsokban tadjuk a sablonrendszernek egy-egy vltoz tartalmt: $smarty->Assign(azonost,$tartalom); Az azonost a sablonokon szintn vltozknt jelentkezik. A sablonok HTML tartalmba a smarty motor behelyettesti az tadott akutlis rtkeket s az gy kicserlt tartalommal jelennek meg a html oldalak. A Sablon egyszer% esetben az albbi lehet. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head>
<td valign="top" > <iframe src="{$editlink}" scrolling="no" name="EditFrame" style="width:540px;height:{$editheight}px;border-width:1px;border-color: #e6e6e6;padding:0px;margin:0px"> </iframe> </td> </tr> </table> </body> </html> A fenti pldban a {$azonost} alak rszek helyre kerl be a sablonrendszernek tadott aktulis rtk. Lehetsges az is, hogy felttelekt'l fgg'en helyezznk el rtkeket a sablonon: {if $valtozo} Egyik tartalom {else} Msik tartalom {/if} Lehetsges ciklusokat szervezni s egyb lehet'sgek is rendelkezsre llnak. Tovbbi informcikat a http://smarty.php.net-en tallhatunk. 23.2 El're gyrtott osztlyok, LIB-ek Amikor egy viszonylag sszetett feladatot kell elvgezni, gyakori, hogy azt mr elvgezte ms, s igazbl neknk csak az ' munkjt kellene hazsnostanunk. Hla a j gnek a vilgon rendkvl sok olyan programozvan, aki szabadd teszi a forrskdjait, gy azt msok is hasznlhatjk. A PHP radsul az a vilg, ahol a programozk el 'szeretettel osztjk meg egyms kztt az informcit. Taln kt ilyen fontos gy %jtemny ltezik a PHP vilgban, ahol nagyon sok feladatra tallunk megoldst: PEAR Csomag A pear a http://pear.php.neten megtallhat programcsomag. Segtsgvel sokfle feladatot elvgeztethetnk ingyenesen hasznlhat modulok segtsgvel. A rendszer jellegzetessge, hogy azoknak a programozknak, akik a sajt megoldsaikat el akarjk helyezni a gy%jtemnyben, el'szr min'sttetni kell a kdjukat formai s tartalmi szempontbl is. Amennyiben megfelel a kd, azutn mr a gy %jtemny rszv vlik. A kifejlesztett modulok szabvnyosan kapcsoldhatnak egymshoz, hasznlhatjk egyms tulajdonsgait. A PEAR hasznlathoz a szervert futtat gpen telepteni kell a PEAR csomagot s minden olyan modult, amelyre a hazsnlni kvnt modul hivatkozik. Ez kicsit hasonlt a LINUX filozfijhoz, ugyanis a csomagokat nevkke s verziszmukkal azonostjk s csak azok teleplnek a gpre, amelyekre szksg van. Minden modulhoz tartozik szabvnyos formtum Dokumentci is, amit a programoz kiegszthet mg sajt egyb doksival is. PHPClasses Szintn nagyon sok feladatra tallunk megoldst. Ennek a gy%jtemnynek a klnlegessge, hogy csakis kizrlag Objektum Orientlt megoldsokat helyezhetnek el a programozk az oldalakon. A megodlsok ltalban fggetlenek egymstl. Minden modulhoz tartozik, tartozhat dokumentci, pldaalkalmazs is. Az egyes modulokra szavazni lehet. A site-nak van hrlevele, amire feliratkozva naponta 1 levelet kapun k, az j vagy vltozott csomagok rvid lersval. 93 24 Objektum Orientlt programozs PHP-ben El'szr az ignyekr'l. Amikor elkezd valaki programozst tanulni, hazsnlja az egyszer% utastsokat s egyszer% vezrlsi szerkezeteket, majd egyre bonyolultabb alkalmazsokat kezd el rni. Van, aki megmarad az egyszer % szinten. Neki soha, vagy csak nagyon ritkn lesz szksge az OOP hasznlatra. Abban az esetben, amikor adatbzis is kerl az alkalmazsba, sok felttelnek megfelel ' sszetett programot runk, el 'bb-utbb nem elkerlhet' az OOP hasznlata. A mai ablakozs rendszerek mindegyike OOP technikval kszlt. Egyszer' adatszerkezetek Az albbiakban egy kis programozselmlet kvetkezik. Az egyszer % adatok, mint pldul az integer, real, karakter vagy hasonl adattpusok felhazsnla gy trtnik, hogy egy vltoz ltrehozsakor megmondjuk a vltoz nevt s tpust, esetleg az rtkt. Az gy generlt vltozk egymstl fggetlenl jhenek ltre, s kezelsk is nmileg fggetlen egymstl. A tipikus programszerkezet az ilyen vltozk feldolgozsra a szekvencia, azaz utastsok egymsutnja. Az ilyen adatszerkezetet egyszer' adatszerkezetnek hvjuk. sszetett adatszerkezetek A programozs sorn szksges, hogy tbb adatot sszekssnk egymssal s azokat egyt kezeljk. A hagyomnyos programozsban kt lehet'sgnk van erre. Tmbk Ha azonos tpus s mret% adatokat akarunk egytt kezelni, akkor tmbket hozunk ltre. A tmb teht olyan adatszerkezet, amelyben az adatok egyforma mret %ek. A tmbt alkot adatok a tmb elemei. A tmb elemeinek az elrshez pedig indexeket hasznlunk. Az index a programozsi nyelvt 'l fgg'en pozitv egsz szm, amely nulltl (C-ben) vagy, mint a Pascalban a megadott kezd'indext'l kezd'dik. Asszociatv tmbnek hvjuk azt a tmbt, amelyben a tmb indexeket nem eglsz szmmal, hanem stringekkel azonostjuk. A tmbk feldolgozsa ltalban ciklus vezrlsi szerkezetet ignyel, ugyanis a tmb elemeit ltalban egyms utn rjk el sorban, s a tmb elemeken ltalban ugyanazt vagy hasonl, esetleg felttelekt 'l fgg ' tevkenysget vgznk el. Abban az esetben ha kt indexxel hivatkozhatunk a tmb elemeire, akkor kt dimenzisnak hvjuk a tmbt, ha n db indexxel hivatkozhatunk egy elemre, akkor n dimenzis tmbr'l beszlnk. Az n dimenzis tmbk feldolgozsa ltalban n db egymsba gyazott ciklussal zajlik. Tipikusan a for vagy while ciklust hazsnlhatjuk ilynekor. Assziociatv tmbk esetn azonban nem minden nyelvnek van j megoldsa. Pascalban a tmb kvetkez ', illetve el 'z', els ' s utols elemre hivatkozhatunk. PHP-ban specilis ciklus a foreach(), amivel vgig lehet menni a tmb elemein. Rekordok Ha nem azonos tpus adatokbl akarunk sszetett adatszerkezetet ltrehozni, akkor az ilyen adatszerkezetet rekordnak (Pascalban), struktrnak (C-ben) hvjuk, illetve PHP-ban minden tmb lehet klnbz ' tpus, teht ebben a nyelvben a tmb s a rekord szinte azonos. ltalban a rekord tpus lehet ennek a kzs neve. A rekord adattpus feldolgozsa szelekcit ignyel, azaz a klnbz ' tpus adatokat klnbz ' kdok, programrszek dolgozzk fel. Erre a feltteles elgazs (ifthenelse) vagy a tbbirny elgazs (switch) alkalmas. Sturktrlt programozs A nem tlsgosan sszetett feladatok megoldsa sorn hasznlhat az a mdszer, hogy a programban az adatszerkezeteket definiljuk s az adatszerkezetek alapjn hozzuk ltre a programszerkezetet. Ez egy eljrshvsi rendszert hoz ltre, amelyben az egyes eljrsoknak, fggvnyeknek tadjuk a paramtereket, majd a visszakapott eredmnyeket ms eljrsokkal, fggvnyekkel tovbb feldolgozzuk. 94 A struktrlt programozs akkor kezd nehzkess vlni, amikor a programokkal klnbz ' adattpusokkal kell ugyanazt a fajta m %veletet elvgezni, mint pldul a grafiklus felhasznli interface ltrehozsa. A grafikus elemek klnbznek egymstl, ugyanakkor a feladatok ugyanazok. Ilyen esetben clszer % lenne olyan programot rni, amely tudja, hogy milyen paramtereket adunk t neki, s ennek alapjn ki tudja vlasztani a megfelel' kezel' alkalmazst. Az is clszer%, hogy amennyire lehet jrafelhasznlhat kdot rjunk. Clszer% az is, hogy az egyes kdrszek csak szabvnyos paramterlistn s fggvnyeken keresztl tartsanak egymssal kapcsolatot (ezt mr a struktrlt programozs is tudja). j gondolat az, hogy legynk kpesek nagy bonyolultsg adatstruktrk egyben trtn' kezelsre, mint pldul egy tmb vagy egy rekord egyszerre trtn ' kezelse, ugyanakkor tetsz 'leges bonyolults adatokat tudjunk ily mdon kezelni. A fenti problmkra a megolds a kvetkez'. Ltestsnk olyan adatszerkezetet, amelyben az adatszerkezetben trolt adatok rjuk le, hanem azt is, hogy annak az adatszerkezetnek az adatait melyik kd rja le. Az adat s a kd elvlaszthatalanul tartozzon ssze . (Struktrlt programozsnl lehetsges az, hogy egy fggvnynek olyan paramtert adunk t, amelyet nem tud feldolgozni, ekkor fatlis hiba vagy fodtsi hiba keletkezik). Ha az sszetartozst lerjuk, akkor a kd sajt maga tudja, hogy melyik adatokon kell dolgoznia. Az gy definilt adattpust osztlynak hvjuk (Class). Ez teht egy adattpus lesz, ami a korbban lert adattpusokhoz, adatszerkezetekhez hasonlan akkor hasznlhat, ha ltrehozunk egy vltozt, amelynek a tpusa ez az adattpus lesz. Ezt hvjk pldnyostsnak. Ebben az esetben a ltrejtt adatszerkezetet objektumnak hvjuk. Az osztlyban vagy objektumban tallhat adatokat az osztly tulajdonsgainak (property) hvjuk. Az osztlyban vagy objektumban tallhat fggvnyeket s eljrsokat az osztly metdusainak hvjuk. <Kitr'> Amikor egy programot runk s lefordtjuk, akkor nyilvnvalan az osztlyban tallhat eljrsoknak memrit kell foglalni. Ezt a fordt rendszer termszetesen elvgzi helyettnk. Amikor a kdunk ltrehoz egy objektumot, akkor ltre kell hozni a memriban az osztly tulajdonsgainak megfelel ' memriaterletet, tovbb az gy lefoglalt memriaterletet ssze kell ktni az osztly kdjval is. Egyszer % megolds lenne, ha minden objektum egy az egyben lemsoldna az eredeti oszttlyrl, mint egy sablonrl, de ebben az esetben nqagyon sok memrira lenne szksgnk, ezrt a programok ilynekor a kdot csak egy pldnyban trolja a program s az objektum csak hivatkozsokat trol az eredeti osztlyban definilt eljrsokra. A memriafoglals ugyanakkor meglehet 'sen bonyolultt is vlhat, ugyanis szksg lehet a pdlnyosts sorn kezd'rtkek adsra is, ezt pedig nem lehet mindenre ltlanosan megfogalmazni. Az osztly pldnyostsa teht sszetett folyamat. </Kitr'> Az osztlyok mindig tartalmaznak egy (vagy tbb) olyan metdust, amely az osztly pldnyostsa vagy mskppen az objektum ltrehozsakor lefut. Ezt hvjk konstruktornak. A konstruktor feladata lefoglalni a megfelel' memriaterletet az objektum rsre, illetve minden olyan belltst megvalstani, amely az objektum ltrehozsa sorn szksges lehet. Ha egy osztlyban nem definilunk konstruktort, akkor a rendszer ltrehoz egy default konstruktort. Hasonl problma az, hogyha egy objektumot megszntetn, akkor illik felszabadtani a memriaterlett, s lezrni, illetve elengedni a menet kzben lefoglalt er 'forrsokat. Azt a metdust, amely ezt megteszi destruktornak hvjk. Minden objektumnak van default destruktora. A PHP-ban az osztlyok definicija az albbiakban trtnik. Class osztalynev { Var $tul1; Var $tul2; Var $tul3; Function osztalynev(){ //Sajt konstruktor } Function Method1(){ } 95 Function Method2(){ $a = $this->tul2; Print($a); } }
Az osztly pldnyostsa az albbiakban zajlik. $a = new osztalynev(); Az OOP szablyai szerint vannak olyan tulajdonsgok s metdusok, amelyek publikusak s vannak olyanok, amelyeket csak az osztlybl magbl lehet elrni. Ezek a private metdusok s tulajdonsgok. A PHP4 egyltaln nem, a PHP5 mr rszben tmogatja ezeket az OOP tulajdonsgokat, ezrt az albbiakban. A PHP-ban minden metdus s property publikus. Az osztlyon kvlr'l az albbi mdon tudjunk rtket adni egy osztly egy tulajdonsgnak: $a->tul2 = hell; Az objektumon belli kd azonban nem tudja, hogy sajt magnak mi a neve, ezrt egysgesen az objektumon belli tulajdonsgok elrsnl az albbi mdot hasznljuk: $this->tul1 = $this->tul2 . tetszik?; Minden osztly ugynais sajt magrl azrt tud, csak a sjat nevt nem tudja. Az OOP-nak olyan tovbbi tulajdonsga az rkl'ds. Ha definiltunk egy olyan osztlyt, amely csak bizonyos tulakjdonsgaiban b 'vebb egy korbban definiltnl, akkor a korbbi definicit kiterjeszthetjk s a rgi osztlyra alapozva egy j osztlyt hozhatunk ltre. Ezt egy osztly kiterjesztsnek hvjuk. Ilyenkor a kiterjesztett osztly rkli az s-osztly tulajdonsgait s metduait. Az s-osztlyt szlnek hvjuk, a kiterjesztettet gyerek osztlynak. Class Osztalykit extends Osztalynev{ Var $tul3; Function Osztalykit(){ $Parent::osztalynev(); } Function MehodKit(){ $this->Method2() $this->tul3 = $this->tul2; Print($this->tul3); } } $b = new Osztalykit(); A fenti pldban a korbban definilt osztalynev() class-t kiterjesztettk. A konstruktorban knytelenek voltunk meghvni a szl' osztly konstruktort $parent:: osztalynev(). A gyerek osztly elri a szl' osztly metdusait s tulajdonsgait is. A szl' osztly azonban nem ri el a gyerek osztlyt. A PHP-ban egy gyerek osztlynak csak egy szl'je lehet. Ez ms nyelveken nem felttlenl van gy. Az egyes osztlyokban lehetnek ugyanolyan nev % metdusok, s 't a szl '-gyermek kapcsolatban lv ' osztlystruktrkban is lehet azonos nev % metdus vagy vltoz. Az OOP esetn ha egy osztlyban meghvunk egy metdust vagy egy tulajdnosgra hivatkozunk, a rendszer tudni fogja, hogy az esetlegesen azonos nev % pldnyok kzl mikor melyiket kell meghvni. Mindig az ppen aktulis osztly megfelel' pldnyt.