You are on page 1of 95

1

Tanuljunk PHP-l kezdknek



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";

echo "<h3>Preinkrementls</h3>";
$a = 5;
echo "6-nak kell lennie: " . ++$a . "<br>\n";
echo "6-nak kell lennie: " . $a . "<br>\n";

echo "<h3>Postdekrementls</h3>";
$a = 5;
echo "5-nek kell lennie: " . $a-- . "<br>\n";
echo "4-nek 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 */

$tomb = array ( "egy" => 1, "kett#" => 2, "hrom" => 3, "tizenht" => 17 );

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>
</head>
<body bgcolor="#efefef" text="#00000000" link="#6666CC" vlink="#FF9900">

<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>

<table width="77%" border="0">
<tr>
<td><font size="6" color="#6666CC"><b><img src="../jozsi_logo.png" width="100"
height="93"></b></font></td>
<td><font size="6" color="#6666CC"><b>Jzsi Cgnek munkalapja</b></font></td>
</tr>
</table>
<form name="munkalap" method="post" enctype="multipart/form-data" action="index.php">
<table width="76%" border="0">
<tr>
<td width="21%" valign="top">A partnercg:</td>
<td width="79%" valign="top">
<input type="text" name="ceg" size="60">
<select name="lista" onclick="Kitolt()">
<option value="Nincs a listban"> </option>
<option value="Emultor KFT ">EKFT</option>
<option value="Gza KFT">GKFT</option>
<option value="Magyar-Urnusz Ujsgrk Barti Trsasga">MUBNT</option>
<option value="Magyar Tudomnyos Akadmia rdgz# Intzete">MTAI</option>
<option value="Alladin BT">ABT</option>
<option value="Balogh Aladr SZKI">BA..KI</option>
<option value="Kiss Piroska Irodalmi Mzeum">KPIM</option>
</select>
</td>
</tr>
<tr>
<td width="21%" valign="top">A bejelent# neve:</td>
<td width="79%" valign="top">
<table border="0">
<tr>
<td width="131">
<input type="text" name="bejelento" cols ="60% ">
</td>
<td width="310">
A bejelents id #pontja:
<input type="text" name="mikor" value="<?php echo $mikor; ?>" >
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td width="21%" valign="top">A hibajelensg:</td>
<td width="79%" valign="top">
<textarea name="hibajelenseg" rows=4 cols =60 ></textarea>
34
</td>
</tr>
<tr>
<td width="21%" valign="top">A megllaptott
hiba</td>
<td width="79%" valign="top">
<textarea name="hibaok" rows=5 cols =60 ></textarea>
</td>
</tr>
<tr>
<td width="21%" valign="top">Az elvgzett
munka lersa</td>
<td width="79%" valign="top">
<textarea name="elvegzett_munka" rows="6" cols =60 >
</textarea>
</td>
</tr>
<tr>
<td width="21%" valign="top">
<table width="75%" border="0">
<tr>
<td>Garancilis?</td>
<td>
<input type="checkbox" name="garancialis" >
</td>
</tr>
<tr>
<td>Rendszergazdai?</td>
<td>
<input type="checkbox" name="rendszergazda" >
</td>
</tr>
<tr>
<td>Fizet#s?</td>
<td>
<input type="checkbox" name="fizetos" >
</td>
</tr>
<tr>
<td>Kiszlls</td>
<td> <b>
<input type="checkbox" name="kiszallas" >
</b></td>
</tr>
<tr>
<td>Mhely</td>
<td>
<input type="checkbox" name="muhely" >
</td>
</tr>
</table>
</td>
<td width="79%">
<p align="left">Beptett alkatrszek<br>
<textarea name="alkatreszek" rows=2 cols =60 ></textarea>
</p>
<p align="left">Alkatrszek ra (nett)
<input type="text" name="alkatreszar" size="40">
+25% FA</p>
</td>
</tr>
<tr>
<td width="21%" valign="top"><br>
A munkt vgz#(k): <input type="text" name="munkavegzo" size="30">
</td>
<td width="79%">Munkark <input type="text" name="munkaido" >
<br>Munkadj (netto) <input type="text" name="munkadij">+25% FA
</td>
</tr>
<tr>
<td width="21%" valign="top">
<p>Dtum:
<?php echo "$datum"; ?>
</p>
</td>
35
<td width="79%"> Digitlis alrs:
<input type="password" name="pswd" value="titok" size=20>
</td>
</tr>
<tr>
<td width="21%">
<p>
<input type="submit" name="Submit" value="Elklds">
<input type="submit" name="Reset" value="Mgsem">
</p>
</td>
<td width="79%"> <font face="Times New Roman, Times, serif">Igazols:<br>
<textarea name="Igazolas" rows=2 cols =60 ></textarea>
</font></td>
</tr>
</table>
</form>

<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");

$tomb = array ("els#" => array ("neve" => "Kis Gedeon",
"kora" => 27),
41
"msodik" => array ("neve" => "Nagy Elemr",
"kora" => 22) );

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

$nick1 = "Tabbi";
$nick2 = "Chris";
$tomb = array (
$nick1 => array("nev" => "Tabi Imre",
"email" => "tabbi@freemail.hu"),
$nick2 => array("nev" => "Nagy Krisztin",
"email" => "chris@nomail.hu")
);
echo("<PRE><b>");
print_r($tomb);
echo("<HR>");
print_r($tomb["Tabbi"]["nev"]);

echo("</b></PRE>");
?>

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";

// Trljk a szveg elejr#l
echo substr_replace($var, '', 10, -1) . "<br>\n";
?>
A szvegben egyes karakterek, stringek el'fordulsait kicserljk msik stringekre. Str_replace()
<?php
// Eredmny: <body text='black'>
$bodytag = str_replace("%body%", "black", "<body text='%body%'>");

// 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");

$newphrase = str_replace($healthy, $yummy, $phrase);
?>

Ha egy string helyt akarom megtudni egy msik stringben, akkor: strpos();
Ugyanez a vgr'l: strrpos()
Ugyanezek kis/nagybet% rzketlen mdon: stripos(), strripos()
43
<?php
$findme = 'a';
$mystring1 = 'xyz';
$mystring2 = 'ABC';
$pos0 = strpos ($mystring1, x);
$pos1 = stripos($mystring1, $findme);
$pos2 = stripos($mystring2, $findme);

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";
}
?>

Egy string kiegsztse karakterekkel: str_pad()
<?php
$input = "Alien";
print str_pad($input, 10); // produces "Alien "
print str_pad($input, 10, "-=", STR_PAD_LEFT); // produces "-=-=-Alien"
print str_pad($input, 10, "_", STR_PAD_BOTH); // produces "__Alien___"
print str_pad($input, 6 , "___"); // produces "Alien_"
?>


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 &lt;b&gt;bold&lt;/b&gt;
echo htmlentities($str);

$new = htmlspecialchars("<a href='test'>Test</a>", ENT_QUOTES);
echo $new; // &lt;a href=&#039;test&#039;&gt;Test&lt;/a&gt;
?>

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

// Example 2
$data = "foo:*:1023:1000::/home/foo:/bin/sh";
list($user,$pass,$uid,$gid,$gecos,$home,$shell) = explode(":",$data);
print $user; // foo
print $pass; // *

?>

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();

$terminal = array(" ","<",">","=",";",")","(",")","\"","\'","!","+","-
","\t","*","/","?","&",":",".","#","@","{","}","[","]","|","%",",");
$ar=str_replace("\\","/",$argv); //Az sszes \\ jelet /-re cserlem

$text=file($ar[1]); //Megnyitom a file-t

function includes($f) {
$terminal = array(" ",";","!","+","-","*","/","=","\n"); //A szveghatrol jelek listja
$fileterm = array("\"","'");
$inc =array(); //includes calling
$lines = array();
$out = "";
$v = "";

$token = array("include","include_once","require"," require_once");
$text=file($f);
while (list ($key, $val) = each ($text)) {
$lin = str_replace($terminal," ",$val);
if( (strpos($lin,$token[0])>0) or
(strpos($lin,$token[1])>0) or
(strpos($lin,$token[2])>0) or
(strpos($lin,$token[3])>0)
) {
$lines[]=str_replace($terminal," ",$val);
}
}
$i=0;
/*while ($i<$sizeof($lines)){
if( ) {
$out .= includes($f);
}
$i++;
} */
print_r($lines);
Return $out;
}

45
// Variables crossreference
function variables($text) {
global $terminal,$lines,$vars;
//change Terminator characters
while (list ($key, $val) = each ($text)) {
$lines[]=str_replace($terminal," ",$val);
}

$splitted =array();
$line=0;
while(list($key,$row)= each($lines)) {
$splitted = explode(" ",$row); //Sztvgom szavakra a sort. Az eredmny egy tmb
for($i=0; $i<sizeof($splitted); $i++) {
$st = $splitted[$i];
if(substr($st,0,1)== "$"){
if(!isset($vars[$st])) $vars[$st] = "->".sprintf("%4d",$line).", ";
else $vars[$st].= sprintf("%6d",$line).", ";
}
}
$line++;
}
ksort($vars);
$out = "--------- Variables ---------\n";
while (list ($key, $val) = each ($vars)) {
$out .=str_pad($key,10).$val."\n";
}
Return $out;
}

printf(variables($text));
printf(includes($ar[1]));
?>

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];

//HTML tag-ek kiszedse
$nev = strip_tags($nev);
$pwd = strip_tags($pwd);

//specilis jelek kivtele
$a =array([,{,(,),},],or,and,!);
$str = str_ireplace($a, " ", $str);

if (!isset($nev) or empty($nev)) $uz =Tltsd ki a nv beviteli mez #t;
if (!isset($pwd) or empty($pwd)) $uz .=Tltsd ki a jelsz beviteli mez #t;
}

if (!empty($uz)){
//Form kiiratsa
print(<P>.$uz.</P>);
print(<FORM METHOD=POST>);
print(<Table>);
print(<TR><TD>Nv:</TD><TD>
print(<input type=textname=nev value=.$nev.>);
print(</TD></TR>);

print(<TR><TD>Jelsz:</TD><TD>);
print(<input type=passwordname=pwd value=.$pwd.></TD></TR>);
print(<TR><TD> </TD><TD>);
print(<input type=submit name=OK value=OK>);
print(</TD></TR></TABLE>);
print(</FORM>);
}else{
/* Feldolgozs*/
}
?>

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

//SQL injekci kisz rse!!!
$keres = array (WHERE,LIKE,(,));
$csere = array ( , , , );
$fszamla = str_replace($keres,$csere,$fszamla);

if (van_e_szamla($fszamla)){
$ok = $ok && False; //Ezernl nagyobb rtket ellen #rzk ppen
$mess_fszamla = <FONT color=#FF0000>Nincs ilyenfolyszmla!</FONT><BR>;
}
}else{
$mess_fszamla = <FONT color=#FF0000>Hibs adattpus!</FONT><BR>;
}
}else{
$mess_fszamla = <FONT color=#FF0000>Hinyz adat!</FONT><BR>;
}

.... 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->From = "fz@mail.szily.sulinet.hu;
$mail->FromName = "Levelez#";
$mail->AddAddress("XY@mail.com", "X Y");
$mail->AddReplyTo("info@mail.com", "Information");

$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;

//Oszlop/Mez # adatainak kilistzsa.
print(<td align=right>);
print($meznev[$i]); //A mez # neve
print(</td>)
print(<td>);
print($sor[$meznev]); //A mez # rtke
print(</td>)
print(</tr>);
}
print(</table>);
mysql_close();
?>

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>

<?php
//egyszer rekord megjelentse
$result=mysql_db_query($querydb,$query);
$sor=mysql_num_rows($result);
$n=mysql_num_fields($result);
print(<FORM name=form1 ACTION=urlap.php method="get" ">
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;

//Oszlop/Mez # adatainak kilistzsa.
print(<td align=right>);
print($meznev[$i]); //A mez # neve
print(</td>);
print(<td>);
print(<INPUT name=\".$meznev[$i]."\ type=\"text\" value=\.$sor[$meznev].\
onchange=\javascript:ellenoriz(.$meznev[$i].)\>);

print($sor[$meznev]); //A mez # rtke
print(</td>)
print(</tr>);
}
print(<tr>);
print(<td>);
print(<INPUT name=\"OK\" type=\"submit\" value=\"Ok\">);
print(<INPUT name=\"Trls\" type=\"reset\" value=\"Mgse\">);
print(</td>)
print(<td>);

print(</td>);
print(</tr>);
print(</table>);

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>";

mysql_select_db("nincsadatbazis");
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>';

$recordSet->MoveNext();
}
$recordSet->Close(); # optional
$conn->Close(); # optional
?>

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

$ADO_CON =&ADONewConnection('access');
$dsn = "Driver={Microsoft Access
Driver(*.mdb)};Dbq=D:/wwwroot/_tanitas/_lib/2002c.mdb;Uid=Admin;Pwd=;";
$ADO_CON->PConnect($dsn); //Adatbzishoz kapcsolds
$ADO_CON->debug = false; //Az adatbzis lekrdezsek debuggolsa kikapcsolva

/**
* @return Recordset
* @param string $qrystr
* @desc INSERT, UPDATE, DELETE kiadsakor rdemes hasznlni
*/
function OpenRs(&$con,$qrystr){
$rs = $con->Execute($qrystr);
return $rs;
}

/**
* @return unknown
* @param ADOConnection $con
* @param string $sql
* @desc Egy lekrdezs teljes 2 dimenzis eredmnytmbjt adja vissza
*/
Function ExecuteRSGetAll(&$con,$sql){
$con->SetFetchMode(ADODB_FETCH_BOTH);

$rs = $con->Execute($sql);
$rsall = $rs->GetAll();
if(!isset($rsall)){
$rsall = array();
}
return $rsall;
}

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!...");

if(!defined("THUMBNAIL_WIDTH")) define("THUMBNAIL_WIDTH",150);

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];

//Text under the pictures
if (strlen($Txt)>0){
$this->Text = $Txt;
}else{
$pos = explode(".",$Entry);
$this->Text = str_replace("_"," ",$pos[0]);
}
//Is there thumbnail of image?
$thn = $aktdir."tn_".$this->Name;
$origDate = filemtime ( $aktdir.$this->Name);
$isthn = is_file($thn);
$thDate = $isthn ? filemtime ( $thn): 0;
//print($origDate ." ".$thDate."<BR>");
if((!$isthn || ($origDate > $thDate ))&& GD ) {
$this->NewThumbnail();
$newThumbnails++;
}else{
$this->ReadThumbnail();
}
}else{
$this->Name = "";
$this->dx = 0;
$this->dy = 0;
$this->Text = "";
}
}

//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];

$a = eregi("\.gif",$aktdir.$this->Name);
if((!eregi("\.gif",$aktdir.$this->Name)) &&
(($dx> THUMBNAIL_WIDTH) |($dy>THUMBNAIL_WIDTH)))
{
if (eregi("\.jpg|\.jpeg",$aktdir.$this->Name))
{
$im = ImageCreateFromJPEG ($aktdir.$this->Name);
//Empty destination image
$dst_im = @ImageCreateTrueColor( THUMBNAIL_WIDTH,
THUMBNAIL_WIDTH*$dy /$dx);
}
if (eregi("\.png",$aktdir.$this->Name)){
$im = @ImageCreateFromPNG ($pics->ImagePath.$this->Name);
$dst_im = @ImageCreateTrueColor(THUMBNAIL_WIDTH,
THUMBNAIL_WIDTH*$dy /$dx);
}
if (eregi("\.wbmp",$aktdir.$this->Name)){
$im = @ImageCreateFromwbmp ($pics->ImagePath.$this->Name);
$dst_im = @ImageCreateTrueColor(THUMBNAIL_WIDTH,
71
THUMBNAIL_WIDTH*$dy /$dx);
}
if (eregi("\.bmp",$aktdir.$this->Name)){
$im = @ImageCreateFromwbmp ($aktdir.$this->Name);
$dst_im = @ImageCreateTrueColor(THUMBNAIL_WIDTH,
THUMBNAIL_WIDTH*$dy /$dx);
}

// Image resize and copy from source to destination
$a = imagecopyresized ($dst_im, $im, 0, 0, 0, 0, THUMBNAIL_WIDTH,
THUMBNAIL_WIDTH*$dy/$dx, $dx, $dy);

$this->Thumb = $aktdir."tn_".$this->Name;
//New image on disk
Imagejpeg ($dst_im, $this->Thumb);
}else{
$this->Thumb = $aktdir."tn_".$this->Name;
copy($aktdir.$this->Name,$aktdir."tn_".$this->Name);
}
}

//Thumbnail reading
function ReadThumbnail(){
if(GD) {
$this->Thumb = "tn_".$this->Name;
}else{
$this->Thumb = $this->Name;
}

}
//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);

if(CSV_OK){
$aCSV = array();
if (file_exists(PHOTOALBUM)){
$row = 1;
$handle = fopen (PHOTOALBUM,"r");
while ($row = fgetcsv ($handle, 1000, DELIMITER)) {
$aCSV[$row[0]] = $row[1];
}
fclose ($handle);
}else{
$handle=fopen(PHOTOALBUM,"w");
fclose($handle);
}
}

//Make an Image object
$d=opendir($path);
while($entry=readdir($d)){
if ($this->is_image($entry)) {

$text=$entry; //Handling CSS text
if(CSV_OK){
if(isset($aCSV)){
if(isset($aCSV[$entry])){
$text=$aCSV[$entry];
}else{
$handle = fopen(PHOTOALBUM,"a");
fwrite($handle,$entry.DELIMITER.$entry."\n");
fclose($handle);
}
}else{
$handle = fopen(PHOTOALBUM,"a");
fwrite($handle,$entry.DELIMITER.$entry."\n");
fclose($handle);
}
}
$this->aPictures[] = new Image($entry,$text);
$this->ImageNumber++;
}
}
closedir($d);
sort($this->aPictures);
$this->RowNumber = (int) ($this->ImageNumber / COLUMNS );
}
//Is Image this filename
function is_image($str){
//This is the right soluton.
$str="_".strtolower($str);
//exclude thumbnails
$pos = strpos ($str, "tn_");
if ($pos ==1){
return FALSE;
}else{
73
return eregi("\.gif|\.jpg|\.jpeg|\.bmp|\.png",$str);
}
}
function css(){
global $css_file,$css_link,$css_body,$css_table,$css_tr,$css_td,$css_tr;
$this->css_file = ( isset($_GET["css_file"]) )? $_GET["css_file"] :
(isset($css_file) ? $css_link : False);
$this->css_link = ( isset($_GET["css_link"]) )? $_GET["css_link"] :
(isset($css_link) ? $css_link : "style=\"font-family: Verdana,Arial, Helvetica,
sans-serif; font-size: x-small; color: #000000\"");
$this->css_body = ( isset($_GET["css_body"]) )? $_GET["css_body"] :
(isset($css_body) ? $css_body : "style=\"background-color: #666666;\"");
$this->css_table = ( isset($_GET["css_table"]))? $_GET["css_table"]:
(isset($css_table)? $css_table: "style=\"border:0;\"");
$this->css_tr = ( isset($_GET["css_tr"] ))? $_GET["css_tr"] :
(isset($css_tr) ? $css_tr : "style=\"vertical-align:top;\"");
$this->css_td = ( isset($_GET["css_td"] ))? $_GET["css_td"] :
(isset($css_td) ? $css_td : "align=\"center\"");
$this->css_tag = ( isset($_GET["css_tag"] ))? $_GET["css_tag"] :
(isset($css_tag) ? $css_tag : "class=\"kapcsolat\"");
}
//It makes a table from the pictures
function ShowList() {
$str=$this->GetString();
print($str);
}


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.">&nbsp;</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);

if ($this->dxx>1024) $this->dxx = 1024;
$this->dyy = ($this->Image->dy) *$this->dxx/$this->Image->dx;
$this->dx = $this->dxx + 28;
$this->dy = $this->dyy + 40;
}

function GetString(){
global $pics,$isslide;
//Javascript for show the picture
$str ="<HTML>\n";
$str .="<HEAD>\n";
$str .="<TITLE>Kep:".$this->Image->Name."</TITLE>\n";
if($isslide) {
$str .="<META HTTP-EQUIV=REFRESH
CONTENT=\"".SLIDE.";URL=".basename($_SERVER["PATH_TRANSLATED"])."?getimg=".urlenco
de($this->NextImage->Name)."&isslide=1\">";
}
$str .="</HEAD>\n";
$str .= picturepopup();
$str .="<BODY style=\"background-color: #666666;\" style=\"margin:0\">\n";

$str .="<DIV ALIGN=CENTER>\n";
$str .="<A HREF='javascript:picturepopup(\"".PHOTOSCRIPT."?getimg=".$this-
>PrevImage->Name."&picpath=".$pics->ImageWebPath."\",\"".SERVERTARGET."\")'
style=\"font-family: Verdana,Arial, Helvetica, sans-serif; font-size: x-small;
color: #000000\" ".$pics->css_tag.">[::Prev::</A>\n";
75
$str .="<A HREF='javascript:picturepopup(\"".PHOTOSCRIPT."?getimg=".$this-
>NextImage->Name."&picpath=".$pics->ImageWebPath."\",\"".SERVERTARGET."\")'
style=\"font-family: Verdana,Arial, Helvetica, sans-serif; font-size: x-small;
color: #000000\" ".$pics->css_tag.">::Next::</A>\n";
$str .="<A HREF='javascript:picturepopup(\"".PHOTOSCRIPT."?getimg=".$this-
>NextImage->Name."&picpath=".$pics-
>ImageWebPath."&isslide=1\",\"".SERVERTARGET."\")' style=\"font-family:
Verdana,Arial, Helvetica, sans-serif; font-size: x-small; color: #000000\"
".$pics->css_tag.">::Slide::</A>\n";
$str .="<A HREF='javascript:picturepopup(\"".PHOTOSCRIPT."?getimg=".$this-
>Image->Name."&picpath=".$pics->ImageWebPath."\",\"".SERVERTARGET."\")',
style=\"font-family: Verdana,Arial, Helvetica, sans-serif; font-size: x-small;
color: #000000\" ".$pics->css_tag.">::Stop::</A>\n";
$str .="<A HREF=\"Javascript:void()\" onClick=\"self.close()\" ".$pics-
>css_tag.">::Close::]</A>\n";
$str .="<BR>\n";
$str .="<IMG SRC=\"".$pics->ImageWebPath."/".$this->Image->Name."\"
width=\"".$this->dxx."\">\n";
$str .="</DIV>\n";

$str .="<SCRIPT language=\"JAVASCRIPT1.4\">\n";
$str .=" dx = ".$this->dx.";\n";
$str .=" dy = ".$this->dy.";\n";
$str .=" if(self.OuterWidth < dx) {\n";
$str .=" dy = (int)(dy * self.OuterWidth /dx);\n";
$str .=" dx = self.innerWidth;\n";
$str .=" }\n";
$str .=" if(self.OuterHeight < dy) {\n";
$str .=" dx = (int)(dx * self.OuterHeight /dy);\n";
$str .=" dy = self.OuterHeight;\n";
$str .=" }\n";
$str .=" self.resizeTo(dx, dy)\n";
$str .="</SCRIPT>\n";
$str .="</BODY>\n";
$str .="</HTML>\n";
return $str;
}

function Show()
{
print($this->GetString());
}

}
// ************ Some functions ************
function picturepopup(){
$str = "<SCRIPT LANGUAGE=\"JAVASCRIPT1.2\">\n";
$str .= " function picturepopup(url,target){\n";
$str .= "
winpops=window.open(url,target,\"status=0,resizable=1,location=0,menubar=0,scr
ollbars=0,toolbar=0\");\n";
$str .= " }\n";
$str .= "</SCRIPT>\n";
return $str;
}

function CSS_File_search() {
$lines = file ($_SERVER["PATH_TRANSLATED"]);
$keresendo = "text/css";
$csere = array("<",">","\"");
$lnk = " ";
$ok = False;
while ((list ($kulcs, $ertek) = each ($lines)) && !$ok){
$e = strtolower($ertek);
76
$p = strpos($e,$keresendo);
if($p>0) {
$ok = True;
$p1 = strpos($e,"href");
$e1 = substr($e,$p1+6);
$e2 = explode(" ",$e1);
$lnk= substr($e2[0],0,-1);
}
}
Return $lnk;
}

//Searching for the css style after the body tag
function CSS_Body_search() {
$fname =$_SERVER["PATH_TRANSLATED"];
$handle = fopen ($fname, "r");
$contents = fread ($handle, filesize ($fname));
fclose ($handle);
$text = strtolower($contents);
$text = str_replace(" ", "", $text);
$atags = array();
$atags = explode("<body",$text);
if (sizeof($atags) >1 ){
$lnk ="";
$p = explode("\"",$atags[1]);
$lnk = $p[0];
}else {
$lnk ="style=\"background-color: #666666\"";
}
Return $lnk;
}

function relpath($dir){
$dir=str_replace("\\","/",$dir);
$len = strlen(DOCUMENT_ROOT);
return substr($dir,$len-1);
}

function pathcomp($p){ return (( substr($p,-1)!= "/") ? ($p."/") : ($p) ); }
/************* end of functions ***********/

/******************
* The main program
****************/
$newThumbnail =0;

//*********************** Calling parameters **************
$isslide = ( isset($_GET["isslide"] ) )? $_GET["isslide"] : (isset($isslide) ?
$isslide :False);
$getimg = ( isset($_GET["getimg"] ) )? $_GET["getimg"] : (isset($getimg)
? $getimg : ""); //The name of viewing picture

//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

Mdostjuk a htaccess file tartalmt:
79
AuthUserFile /wwwroot/ceg/.htpasswd
AuthGroupFile /wwwroot/ceg/.htgroup
AuthName userek
AuthType Basic

<Limit GET>
require group dorks
</Limit>

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

$num = mysql_numrows($result);
if ($num != "0") {
echo "<P>Isten hozott!</p>";
exit;
} else {
header('WWW-Authenticate: Basic realm="Magnterlet!"');
header('HTTP/1.0 401 Unauthorized');
echo 'Authorization Required.';
exit;
}
}
?>

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

$filename = "/wwwroot/ceg/file.txt";
$fp = fopen($filename, "r");
$file_tartalom = fread($fp, filesize($filename));
fclose($fp);

// 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.

$i = 0;
$adatok = explode(":", $sor[$i]);

while($i<=sizeof($sor))&&
!(($adatok[0]=="$PHP_AUTH_USER")
&&($adatok[1]== "$PHP_AUTH_PW"))
{
$data_pair = explode(":", $sor[$i]);
i++;
}
if ($i<=sizeof($sor)) $auth = 1;
else $auth = 0;


if ($auth == "1") {
echo "<P>Isten hozott!</p>";
exit;

} else {
header('WWW-Authenticate: Basic realm="Magnterlet!"');
header('HTTP/1.0 401 Unauthorized');
echo 'Authorization Required.';
exit;
}
?>

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;

If (!$_SESSION["logged_in"]){

if( isset($_POST["name"]) && isset($_POST["pwd"])){
//Ha ks #bb login formot hasznlunk POST-tal
$name = $_POST["name"];
$pwd = $_POST["pwd"];

//Ha a Bngsz # authhentikcis ablakt hasznljuk
// if (isset($PHP_AUTH_USER) && isset ($PHP_AUTH_PW)){
// $name = $PHP_AUTH_USER;
// $pwd = $PHP_AUTH_PW;
//

//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 */

state[0] +=a;
state[1] +=b;
state[2] +=c;
state[3] +=d;

}

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_start();

// SESSION Utn megnyitand modulok
if(file_exists("libs/Smarty.class.php"))
define("SMARTY_DIR","libs/");
else
define("SMARTY_DIR",SMARTY_ROOT);

require_once("Smarty.class.php"); //Smarty beszerkesztse

$smarty = new Smarty;
$smarty->template_dir = SMARTY_ROOT."templates/"; //Smarty szksges knyvtrai
$smarty->compile_dir = SMARTY_ROOT."templates_c/";
$smarty->config_dir = SMARTY_ROOT."configs/";
$smarty->cache_dir = SMARTY_ROOT."cache/";

$smarty->register_modifier("numberformat","numberformat");

//Menrendszer el#lltsa
$Menu = Menu();

//------------- Interface --------------------
//Aktulis ID meghatrozsa

91
// ---------- Smarty megjelentsi rsz -------------------
$smarty->Assign("Menu",$Menu);
//
$smarty->Assign("mnutxtcolor",MNUTXTCOLOR);
$smarty->Assign("mnubgcolor",MNUBGCOLOR);
$smarty->Assign("mnuhightxtcolor",MNUHIGHTXTCOLOR);
$smarty->Assign("mnuhighcolor",MNUHIGHCOLOR);
$smarty->Assign("css",dirname($_SERVER["REQUEST_URI"]));

$editlink = "edit.php?ID=".$ID."&LASTID=".$ID."&cmd=LOAD&tblname=Muszer#".$tab;
$smarty->Assign("editlink",$editlink);

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>

<title>{$Title}</title>
<meta http-equiv="Content-Type" content="text/html; charset={$langheader}">
<link href="{$css}/muszer.css" rel="stylesheet" type="text/css">
</head>

{literal}
<script language="javascript1.3" src="js/fz_scripts.js" type="text/javascript"></script>
{/literal}
{$htmlheader}
<body {$firstpopup}>
<table style="width:980px;padding:0px;margin:0px;border:0px">
<tr>
<td>
<table style="padding:0px;margin:0px;border:0px">
<tr>
<td>
<table style="padding:0px;margin:0px;border:0px">
<tr>
<td>
<applet code="apPopupMenu" Archive="menu/apPopupMenu.jar" Width="450" Height="24"
mayscript>
<param name="key" value="g|1iqpfks/phu">
<param name="Copyright" value="Apycom Software - www.apycom.com">
<param name="isHorizontal" value="true">
<param name="3DBorder" value="true">
<param name="solidArrows" value="false">
<param name="buttonType" value="3">
<param name="status" value="link">
<param name="alignText" value="left">
<param name="backColor" value="{$mnubgcolor}">
<param name="backHighColor" value="{$mnuhighcolor}">
<param name="fontColor" value="{$mnutxtcolor}">
<param name="fontHighColor" value="{$mnuhightxtcolor}">
<param name="font" value="Arial,10,0">
<param name="menuItems" value="
{$Menu}">
</applet>
</td>
</tr>
92
<tr>
<td>
{$List}
</td>
</tr>
</table>
</td>

<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.

You might also like