Gyakorlati jegyzet
Készítette:
Michnay Balázs
michnay@inf.u-szeged.hu
http://www.inf.u-szeged.hu/~michnay
2004
Előszó
E jegyzet a Szegedi Tudományegyetem Web Tartalomfejlesztés c. kurzus gyakorlati anyagát fogalja
össze. Annak ellenére, hogy a jegyzet gyakorlati jellegű, a példák könnyebb megértése érdekében
találhatunk benne némi elméleti anyagot is. Az egyes példaprogramok/példadokumentumok többsége
hozzáférhető és letölthető a következő oldalról: http://www.inf.u-szeged.hu/~michnay/webfejl.php. A
hivatkozott, letölthető programok/dokumentumok azonosítóit mindenhol []-jelek között találjuk. Ha a
példák szerint szeretnénk keresni, akkor használjuk a jegyzet végén található tartalomjegyzéket, mely
a példákra való hivatkozások helyét sorolja fel.
Tartalomjegyzék
ELŐSZÓ .................................................................................................................................................. 1
A HTML ALAPJAI................................................................................................................................... 4
1
<TABLE>........................................................................................................................................ 12
Néhány fontosabb <TABLE> attribútum: ................................................................................................... 12
Számozott, nem számozott, illetve definíciós felsorolás (<UL>, <OL>, <DL>).............................. 13
<FORM>......................................................................................................................................... 14
Űrlapvezérlők............................................................................................................................................. 14
FRAME-EK HASZNÁLATA ........................................................................................................................ 16
Egyszerű frame-ek létrehozása ..................................................................................................... 16
Frame-ek egymásba ágyazása...................................................................................................... 17
WEBLAPSZERKESZTÉS A FRONTPAGE SZERKESZTŐVEL ......................................................................... 19
PHP ALAPOK ....................................................................................................................................... 21
2
MÁSIK PÉLDA – SZÁMKITALÁLÓS JÁTÉK .................................................................................................. 40
SZÁMKITALÁLÓS JÁTÉK HA A REGISTER_GLOBALS ENGEDÉLYEZETT......................................................... 41
SZÁMKITALÁLÓS JÁTÉK ÁTIRÁNYÍTÁSSAL ................................................................................................ 41
ŰRLAP FELDOLGOZÁSA KÜLSŐ PHP PROGRAMMAL ................................................................................ 42
Vendégkönyv program megvalósítása........................................................................................... 42
ŰRLAP GENERÁLÁSA PHP PROGRAMMAL ............................................................................................... 43
ÁLLAPOTOK TÁROLÁSA PHP SEGÍTSÉGÉVEL .......................................................................................... 44
Sütik................................................................................................................................................ 44
A sütik felépítése ....................................................................................................................................... 44
Sütik létrehozása PHP-vel ......................................................................................................................... 44
Sütik törlése............................................................................................................................................... 45
Munkamenet sütik .......................................................................................................................... 45
Lekérdező karakterláncok használata............................................................................................ 46
Lekérdező karakterláncok készítése.......................................................................................................... 46
Adat továbbítása lekérdező karakterláncok segítéségével – példa ........................................................... 46
A lekérdező karakterláncok feldolgozása – példa folytatása ..................................................................... 47
Lekérdező karakterláncok létrehozása függvénnyel .................................................................................. 47
A függvény megvalósítása:........................................................................................................................ 48
IRODALOM ........................................................................................................................................... 49
3
A HTML alapjai
A HTML-ről általában
Mi az a HTML?
Ahhoz, hogy az Interneten közzétett információk világszerte mindenhol megtekinthetők legyenek
szükség van egy egységes nyelvre. A World Wide Web által használt ilyen nyelv a HTML (HyperText
Markup Language), mely egy leíró nyelv. Definiálja a megjelenítendő információk megjelenítési
módját, hiperhivatkozások által interaktivitást tesz lehetővé (dokumentumok közötti kapcsolat), mely
lehet helyi vagy távoli dokumentum is vagy akár egy más Internetes szolgáltatás (pl. FTP).
4
Az első HTML dokumentum
[elso.htm]
<HTML>
<HEAD>
<TITLE>Elso HTML dokumentum</TITLE>
</HEAD>
<BODY>
<H2>Elso HTML dokumentum</H2>
Hello, </I>World Wide Web</I>
<!-- a "Hello Vilag" mar unalmas -->
</HTML>
Tag-ek HTML-ben
Bizonyára feltűnt, hogy a forrásban található szöveg nagy részét a böngésző nem jelenítette meg. Ha
jobban megnézzük, akkor láthatjuk, hogy mindössze a „<” és „>” jelek közötti szöveg nem került
megjelenítésre, minden más igen. A HTML a tag [teg]-eket állítja rendelkezésünkre annak
definiálására, hogy a tartalmat hogyan kezelje, vagy jelenítse meg a böngésző program.
Például a forrásban található <I> tag arra utasítja a böngészőprogramot, hogy az azt következő
szöveget dőlt stílusban jelenítse meg. A tag kis- és nagybetűkkel is írható.
A tag első része egy szó, ami általában utal annak funkciójára. Minden ezt követő (de a > jelet
megelőző) szöveg a tag speciális attribútumai, melyek egy kulcsszóból egy = jelből és egy „” jelek
között megadott értékből állnak. Ilyen a példadokumentumban is található:
<A HREF="http://www.google.com">
Megjegyzések
A forrásdokumentumban elhelyezhetünk megjegyzéseket is, ezt egyáltalán nem veszi figyelembe a
böngészőprogram.
<!-- ez itt egy megjegyzes -->
Megjegyzés Megjegyzés
kezdődik vége
5
Egy HTML dokumentum felépítése, elemei
A <HTML> tag
Egy HTML dokumentum a <HTML> kulcsszóval kezdődik. Ez jelzi a böngészőnek, hogy a jelen
dokumentum a HTML leíró nyelv szabályaihoz igazodik. A szabvány HTML megköveteli ezt a
kulcsszót a dokumentumban, de a böngészők nagy része e nélkül is képes azt megjeleníteni.
A HTML kulcsszó lehetséges attribútumai: DIR LANG VERSION
A <HEAD> tag
Mint ahogy a példánkban is látszik, egy HTML dokumentum 2 fő részre oszlik: HEAD-re és BODY-ra. A
HEAD a „fejrész információkat” tartalmazza. A HTML és a BODY (illetve FRAMESET kulcsszavak között
helyezzük el. Mind a kezdő, mind pedig a záró kulcsszavak elhagyhatók, mert a böngészők számára
egyértelmű, hogy az ezek között megadott kulcsszavak a HEAD elemei, de megadása a könnyebb
olvashatóság és a szabványhoz való legjobb egyezés miatt erősen ajánlott.
A HEAD kulcsszó lehetséges attribútumai: DIR LANG PROFILE
A <TITLE> tag
A TITLE a dokumentum címét határozza meg. Ez a cím a böngészőablak címsorában (vagy néhány
böngésző esetében a státussorban) fog megjelenni. A TITLE záró részét sosem hagyhatjuk el és
közöttük csak szöveg adható meg. Bármi, a szövegtől eltérő tartalmat (hivatkozás, kép, stb…) a
böngésző ignorálja.
A TITLE kulcsszó lehetséges attribútumai: DIR LANG
6
A <BODY> tag
Magát a tartalmat BODY tag-en belül helyezzük el. Számos attribútuma segítségével könnyedén
alakíthatjuk dokumentumunk alapvető megjelenítési tulajdonságait. Néhány böngészőprogram
kibővített tag-készlettel rendelkezik, mely további segítséget nyújt a megjelenés pontosításában. Egy
nagyon egyszerű HTML dokumentum tartalmazhat csak szöveget a BODY tag-en belül, de egy
összetettebb dokumentum tartalmazhat bonyolult formázást, grafikát, táblázatokat, stb…
Mivel a böngésző számára egyértelmű a BODY tag dokumentumon belüli helye, ezért mind a kezdő,
mind pedig a záró tag következmény nélkül elhagyható, de mindig érdemes megadni.
A BODY attribútumait három csoportba sorolhatjuk:
- Egyes attribútumok a dokumentum megjelenéséért felelősek. Ilyenek például a következők:
ALINK, BACKGROUND, BGCOLOR, LINK, VLINK, TEXT, stb…
- A második kategóriába a programozható komponenseket sorolhatjuk, ezek gyakorlatilag
eseménykezelők. Néhány ezek közül:
ONKEYPRESS, ONKEYUP, ONMOUSEMOVE, ONMOUSEOVER, stb…
Eseménykezelőkre későbbi gyakorlatokon fogunk példát nézni!
- A harmadik kategória a BODY azonosításáért felelős későbbi hivatkozások esetére. Ezekből
kettő létezik:
ID, TITLE
Ezek többségére később példát is nézünk!
Szövegformázási lehetőségek
Elválasztók és bekezdések, avagy „bekezdésszintű” formázások
A böngészőprogram a megjelenítendő szöveg szélességét az ablak szélességéhez igazítja. Az ablak
szélességének változtatása a szöveg egyes sorainak változtatását vonja maga után. A folyó szöveg
elhelyezkedését, igazítását a HTML a
- <DIV> (a dokumentum egyértelmű részekre tagolása),
- a <P> (bekezdés definiálása)
- és a <BR> (sortörés) segítségével szabályozza.
<DIV>
A DIV a HTML 3.2 során vált elérhetővé. Különálló egységekbe szervezés céljából került a leíró
nyelvbe, ugyanis segítségével önálló részekre tagolhatjuk a dokumentumot. Attribútumai
segítségével az egységbe zárt szöveg megjelenését, azonosítását, különböző eseményekre való
reagálását vezérelhetjük. Néhány az attribútumok közül:
ALIGN
Az attribútum értéke a szövegblokk igazítását határozza meg. Lehetséges értékei:
LEFT (balra igazítás, ez az alapértelmezett)
CENTER (középre igazítás)
RIGHT (jobbra igazítás)
JUSTIFY (sorkizárt)
Erre példát lentebb láthatunk.
ONCLICK, ONKEYDOWN, ONKEYPRESS,stb… (avagy eseménykezelő attribútumok)
Szerepe megegyezik a már ismertetett eseménykezelőkkel. Egy DIV-en belüli eseménykezelő
természetesen csak az érintett szövegrészre vonatkozik.
7
<P>
A <P> egy bekezdés elejét jelöli. A kezdő TAG az első bekezdés előtt, a bezáró (</P>) pedig akár
mindenhol elhagyható. Két bekezdést egy üres sorral és még valamennyi üres területtel választja
el a böngészőprogram. Bekezdésen belüli új sort pedig a <BR> segítségével tudunk kezdeni.
Akárcsak a DIV-nek, a P-nek is vannak ALIGN és eseménykezelő attribútumai (és még persze sok
más is) ugyanazokkal az értékekkel.
<BR>
A <BR> (break) sortörésre kényszeríti a böngészőprogramot.
Címsorok
A címsorok folyó szöveg hierarchikus felépítését teszik lehetővé. A HTML hat szintű hierarchiával (hat
különböző TAG-el) segíti a címsorok létrehozását:
<H1> Címsor 1 </H1>
<H2> Címsor 2 </H2>
...
- Karakteralapú formázás
Itt nem fektetünk hangsúlyt arra, hogy az adott szöveg milyen mondanivalóval rendelkezik. Az
egyetlen lényeg, hogy a szöveg milyen formában fog megjelenni. Az összes ilyen formázó
TAG-hez záró TAG-et is kötelező megadni! Fontos megjegyezni, hogy ezen formázások csak
a megadott szövegrészt formázzák, ha dokumentum szintű lehetőséget keresünk formázásra,
alkalmazzunk Style Sheet-eket.
8
A következő táblázat néhány karakteralapú formázást és azok jelentését foglalja össze:
Speciális karakterek
Gyakran előfordulnak olyan szituációk, hogy olyan karaktereket kéne beszúrni a dokumentumba,
melyek valamilyen más jelentéssel bírnak a HTML számára. Ilyen lehet például a következő
matematikai kifejezés:
A+B>C<D–E
Ha a relációs jeleket önmagunkban írnánk bele a forrásba, akkor az megzavarná a böngészőt, ezért
speciális módon kell megadjuk ezeket – és még számos más – karaktert.
Az alábbi táblázat néhány speciális karaktert (beleértve a magyar ékezetes betűket) és annak
forrásban való megadási módját foglalja össze:
9
Így a fenti kifejezés HTML forrásba írható változata a következő:
A + B > C < D – E
Miért lehet szükség az ékezetes betűk ilyen formában való megadására, ahelyett, hogy egyszerűen
begépelnénk őket? Mert azokon a gépeken, melyek nem rendelkeznek a megfelelő kódlappal,
képtelenek megjeleníteni a mi ékezetes betűinket. A kódolt forma segít kiküszöbölni ezt a problémát.
Számos weblapszerkesztő ékezetes betű bevitelekor automatikusan átalakítja azt a megfelelő kódra.
Ilyen például a Macromedia Dreamweaver.
Néhány példadokumentum
Az első dokumentumnak adjunk meg háttérszínt, majd a szöveg egy részét tegyük félkövérré:
<HTML>
<HEAD>
<TITLE>
Hatterszin
</TITLE>
</HEAD>
<BODY BGCOLOR="#AABBEE">
Ez a dokumentum <STRONG>kék</STRONG> háttérrel rendelkezik.<BR>
</BODY>
</HTML>
A második dokumentum tartalmazzon három bekezdést, melyek legyenek rendre balra, középre és
jobbra igazítottak:
<HTML>
<HEAD>
<TITLE>
Bekezdesek
</TITLE>
</HEAD>
<BODY BGCOLOR="#AABBEE">
Ebben a dokumentumban <I>három</I> bekezdés található!<BR>
Ez egy balra igazított bekezdés,
<P ALIGN=CENTER> Ez egy középre igazított,</P>
<P ALIGN=RIGHT> Ez pedig egy jobbra igazított bekezdés.</P>
</BODY>
</HTML>
A fenti forrásokat a helyi gép böngészőprogramjával vagy a következő weboldal segítségével
egyaránt megnézheted: http://htmlspec.web.elte.hu/gyakorlas/index.html
10
URL
Az Interneten található dokumentumok mindegyikének az egyértelmű azonosíthatóság érdekében
teljesen egyedi azonosító címmel kell rendelkezzen. Ez az URL (Uniform Resource Locator). Az URL
három részből álló:
• Protokoll
• Kiszolgáló domain neve
• Dokumentum teljes elérési útja.
Pl:
http://www.inf.u-szeged.hu/~michnay/images/kep.jpg
ftp://ftp.software.com/pub
A böngészőben a kulcsszavak közti rész kiemelten jelenik meg és a rajta való kattintás során az
attribútum értékében megadott URL-re ugrik a böngészőprogram.
<IMG> (Image)
[img-ol-ul-dd.htm]
Képek beágyazásához az <IMG>-t használjuk, melynek SRC attribútuma határozza meg a kép URL-
jét (amely természetesen egy helyi file elérési útja is lehet). Ezek a képek a folyó szöveg részévé
válnak, olyanok, mintha egy nagy karaktert képeznének. Lényeges attribútum az ALIGN, mely a
szöveg, képhez képesti pozícióját határozza meg. A tag-nek nincs tartalma, így záró-fele sincsen.
Lehetőségünk van arra, hogy egy kép különböző részeihez különböző linkeket társítsunk. Ezt
nevezzük a képek MAP-elésének, melyre példát későbbi gyakorlatokon fogunk látni.
Néhány hasznos <IMG> attribútum:
ALT
Egy magyarázó szöveg, mely az egérkurzor kép fölé való mozgatása során jelenik meg.
WIDTH
HEIGHT
BORDER
11
<P ALIGN=RIGHT>
Ez a szöveg a kép <IMG SRC="kep.jpg" ALIGN=BOTTOM>
aljához igazodik.
Ennek eredménye:
<TABLE>
[table.htm]
Táblázatok létrehozására öt tag áll rendelkezésünkre:
• <TABLE> – Minden táblázat ezzel kell kezdődjön. A táblázat végét a </TABLE> jelzi.
• <CAPTION> – Táblázat leírása.
• <TR> (Table Row) – a táblázat egyetlen sorát definiálja.
• <TH> (Table Header) – a táblázat fejléc sorát adja meg.
• <TD> (Table Data) – a táblázat egyetlen cellájának értéke, amely szöveg, kép vagy akár egy
másik táblázat is lehet.
Néhány fontosabb <TABLE> attribútum:
BORDER
BORDERCOLOR
A Táblázat keretszínét határozza meg, mely megadása ugyanolyan módon történik, mint azt
már korábban láttuk. (#RRGGBB színkóddal)
BGCOLOR
VALIGN
ALIGN
12
<TH>Center</TH>
<TH>Bottom</TH>
</TR>
<TR ALIGN=CENTER>
<TH><H1>Ez is <TH><BR>Két sorban</H1></TH>
<TD VALIGN=TOP>Alma</TD>
<TD VALIGN=BASELINE>Körte</TD>
<TD VALIGN=MIDDLE>Szilva</TD>
<TD VALIGN=BOTTOM>Barack</TD>
</TR>
</TABLE>
Ennek eredménye:
<UL>
<LI>Egy
<LI>kettô
<LI>Három
</UL>
<OL>
<LI>Egy
<LI>kettô
<LI>Három
</OL>
Ennek eredménye:
A definíció felsorolás egy kicsit komplikáltabb. Segítségével olyan felsorolást hozhatunk létre, mely
egy „címsorból” (Definition Title - <DT>) és annak kifejtéséből áll (Definition Definition - <DD>).
Pl:
<DL>
<DT>Kör
13
<DD>A kör azon pontok halmaza a síkban, mely egy adott
ponttól azonos távolságra vannak.
<DT>Gömb
<DD>A gömb azon pontok halmaza a térben, mely egy adott
ponttól azonos távolságra vannak.
</DL>
Ennek eredménye:
<DT> <DD>
<FORM>
[form.htm]
Adatok bekérésére felhasználótól alapvető szükség lehet. A <FORM> elemei többféle módon
történő adatbevitelt tesznek lehetővé. Az ezen elemekből felépített, a felhasználó által kitöltött
űrlapot egy gomb lenyomása után a böngészőprogram a szervernek küldi, mely feldolgozza azt.
(űrlapok feldolgozására is fogunk majd példát nézni). Mi a helyzet azon szerverek esetében,
melyeknél a script nyelv feldolgozást (például biztonsági okok miatt) letiltották? A
böngészőprogramok túlnyomó része képes az űrlap adatait közvetlenül egy megadott email címre
elküldeni. Ilyenkor az ACTION attribútum nem a feldolgozó program URL-je, hanem egy „mailto:”
utáni email cím.
A <FORM> tag attribútumai közül kettőt kötelező megadni. Az egyik (ACTION) az űrlapot feldolgozó
program URL-je (nálunk ez egy PHP program lesz), a másik (METHOD) pedig az űrlap adatainak
elküldési módját határozzák meg (GET vagy POST). A GET és POST közti különbségekkel a PHP
kapcsán fogunk foglalkozni.
Űrlapvezérlők
<INPUT>
Segítségével számos adatbevitelre alkalmas vezérlőt hozhatunk létre. Habár nagyon sok
attribútummal rendelkezik az <INPUT>, ezek közül csak kettőt kötelező megadni: TYPE, NAME
A TYPE attribútum értékével határozhatjuk meg milyen típusú vezérlőt szeretnénk létrehozni. Ezen
értékeket és a HTML forrás eredményét a következő példa szemlélteti. Természetesen a példában
szereplő attribútumok mellett még sok más attribútum is szerepelhetne. Csak a kötelezőeket
tüntettem fel.
14
<FORM ACTION="mailto:michnay@inf.u-szeged.hu" METHOD="POST">
INPUT TYPE=BUTTON<BR>
<INPUT TYPE=BUTTON NAME=gomb VALUE="Gomb">
<BR><BR>
INPUT TYPE=CHECKBOX<BR>
1: <INPUT TYPE=CHECKBOX CHECKED NAME=valaszto1
VALUE="Valaszto1"><BR>
2: <INPUT TYPE=CHECKBOX NAME=valaszto2
VALUE="Valaszto2">
<BR><BR>
INPUT TYPE=FILE<BR>
<INPUT TYPE=FILE NAME=file VALUE="file">
<BR><BR> Az erre való
kattintás
INPUT TYPE=IMAGE<BR>
<INPUT TYPE=IMAGE SRC="kep.jpg"> megegyezik a
<BR><BR> SUBMIT-ra való
kattintással, azaz
INPUT TYPE=PASSWORD<BR> elküldi az űrlapot.
<INPUT TYPE=PASSWORD NAME=passwd VALUE="passwd">
<BR><BR>
INPUT TYPE=RADIO<BR>
1: <INPUT TYPE=RADIO CHECKED NAME=radio
VALUE="radio1"><BR>
2: <INPUT TYPE=RADIO NAME=radio
VALUE="radio2">
<BR><BR>
INPUT TYPE=TEXT<BR>
<INPUT TYPE=TEXT NAME=text>
<BR><BR>
INPUT TYPE=SUBMIT<BR>
<INPUT TYPE=SUBMIT>
<BR><BR>
</FORM>
Természetesen nincs idő minden HTML tag tárgyalására. A szintén letölthető [html.hlp] egy HTML
referencia (angol nyelven), további leírások abban találhatók.
15
Frame-ek használata
A frame-ek használatával lehetőségünk van olyan oldalak létrehozására, mely a böngészőablakunkat
több, egymástól független részekre osztja. Ezek mindegyikében más-más dokumentumot
jeleníthetünk meg.
Fontos dolog a frame-ekkel kapcsolatban, hogy ezek létrehozását egy, a bennük megjelenő
dokumentumoktól független HTML dokumentum végzi. Az ilyen dokumentum mást nem is tartalmaz.
Frame-ek létrehozásához kettő HTML tag-et fogunk felhasználni: <FRAMESET> és <FRAME>.
A <FRAMESET> kulcsszó a megfelelő attribútumokkal és azok értékeivel magát az elválasztás módját,
a <FRAME> pedig az elválasztott részek további tulajdonságait határozza meg (a <FRAMESET>
kulcsszó rendelkezik bezáró résszel is, a <FRAME> nem). Ezek együttesen bármilyen struktúrájú
részekre bontást képesek megvalósítani. A frame „definícióját” a </HEAD> és a <BODY> között
végezzük el.
Hello
Hello
Hello
16
Hello Hello Hello
Ha azt szeretnénk, hogy egy adott rész mérete pontos érték legyen, akkor a COLS (vagy ROWS)
attribútum értéke legyen egy konkrét érték. A ROWS=”50,100,*” azt jelenti, hogy a vízszintes
felosztás legfelső része legyen 50 pont magas, a középső legyen 100 pont magas, a legalsó pedig a
fennmaradó rész. A felosztás mértékét %-os arányokban is kifejezhetjük: ROWS=”10%,70%,20%”.
110 pt 100 pt
Maradék Maradék
(*)
(*)
Az ilyen felosztások létrehozása előtt azok létrehozásának sorrendjét érdemes átgondolni. Az első
esetben először vízszintesen osztjuk két részre az ablakot, majd a lenti részt 2 oszlopra, a második
esetben pont fordítva: először létrehozunk két függőleges részt, majd a második oszlopot két
vízszintes részre osztjuk. Ezek ismeretében a létrehozás egyszerű, a megfelelő helyen újabb frame
létrehozását kérjük.
Az első ábra megvalósítása:
<HTML>
<HEAD>
<TITLE>Első példa</TITLE>
</HEAD>
<FRAMESET ROWS="110,*">
<FRAME NAME="fent" SRC="fent.htm"> Vízszintes felosztás felső része
<FRAMESET COLS="100,*" >
<FRAME NAME="bal" SRC="bal.htm"> A vízszintes felosztás alsó része egy
<FRAME NAME="jobb" SRC="jobb.htm"> újabb, most oszlopokra osztást tartalmaz
</FRAMESET>
</FRAMESET>
<BODY>
</BODY>
</HTML>
17
A második ábra megvalósítása:
<HTML>
<HEAD>
<TITLE>Második példa</TITLE>
</HEAD>
<FRAMESET COLS="110,*">
<FRAME NAME="bal" SRC="bal.htm"> Függőleges felosztás bal oldali része
<FRAMESET ROWS="100,*">
<FRAME NAME="fent" SRC="fent.htm"> A függőleges felosztás jobb része egy
<FRAME NAME="lent" SRC="lent.htm"> újabb, most vízszintes osztást tartalmaz
</FRAMESET>
</FRAMESET>
<BODY>
</BODY>
</HTML>
18
Weblapszerkesztés a FrontPage szerkesztővel
A FrontPage weblapszerkesztő „ereje” a könnyű, gyorsan tanulható kezelésben rejlik. Segítségével
összetett dokumentumokat is gyorsan el tudunk készíteni. Ennek viszont ára van: a piacon
hozzáférhető professzionális weblapszerkesztő programok (pl. Macromedia Dreamweaver, Xara
Webstyle, stb…) által nyújtott szolgáltatások több lehetőséget tartogatnak.
A FrontPage elindítása után a következő képernyőt kapjuk: (az ábrák a FrontPage 2002-es verziójából
származnak)
Új dokumentum létrehozásakor egy üres oldal jelenik meg. A programablak alján három gomb jelenik
meg, mely segítségével a weblapszerkesztés nagyon könnyűvé válik:
A szerkesztő – lévén, hogy Office tag – sokban hasonlít a Word-höz (Formátum menüben itt is
megvannak a betűtípus, bekezdés és felsorolás, számozás menüpontok).
Második feladatként egy űrlapot tartalmazó weboldalt hozunk létre:
[frontpage02.htm]
20
PHP alapok
A PHP egy kiszolgálóoldali szkriptnyelv. Kiszolgálóoldali, mert a PHP interpreter a szerveren fut,
amely csak a program által szolgáltatott kimenetet továbbítja a kliens gép(ek)nek. Egy PHP program
HTML oldalba ágyazható.
Tekintsük a következő egyszerű példát:
[elso.php]
<HTML>
<HEAD>
<TITLE>PHP példa</TITLE>
</HEAD>
<BODY>
<?php print(’En egy PHP szkript kimenete vagyok!’); ?>
</BODY>
</HTML>
Mentéskor fontos, hogy a fájl kiterjesztésének mit adunk meg, ugyanis a szerver nem minden fájlban
keres PHP szkriptet. Alapértelmezésben a HTML-ben nem keres, így érdemes a fájlt .php
kiterjesztéssel elmenteni.
A BODY-ban található egysoros PHP program kimenete egy egyszerű szöveg. A szerver a neki
megadott kiterjesztésű állományokban keresi a PHP kódot tartalmazó blokkot, mely többféle lehet.
PHP blokkok
Blokk kezdetének jelölése Blokk végének jelölése
<?php ?>
<? ?>
<% %>
<SCRIPT LANGUAGE=”PHP”> </SCRIPT>
Jelen példánkban a PHP blokkban található utasítás egy print(); parancs, mely kimenete a
paraméterben megadott karakterlánc. Mivel az interpreter a szerveren működik, ezért a kliens
gépeken futó böngészőprogramok nem tudnak arról, hogy az érintett weboldal tartalma statikus vagy
például egy PHP szkript lefutásának eredménye. Ha a fenti példát megnyitjuk egy
böngészőprogrammal (melyet egy webszerveren keresztül érünk el), akkor a böngésző már csak a
következő egyszerű HTML forrást kapja meg, mivel a PHP blokkot a szerver már feldolgozta:
<HTML>
<HEAD>
<TITLE>PHP példa</TITLE>
</HEAD>
<BODY>
En egy PHP szkript kimenete vagyok!
</BODY>
</HTML>
Így gyakran mi sem tudjuk, hogy egy valószínűleg dinamikusan generált oldalt milyen program
generálta, hiszen a program forrása a kliens oldalon már nem látszik.
21
Többsoros megjegyzés:
/* Ez egy megjegyzés,
mely akár több
soros is lehet! */
Vegyük észre, hogy a változóra való hivatkozás a print() paraméterében megadott karakterláncon
belül van. Más nyelveken kénytelenek vagyunk konkatenációt alkalmazni, de erre itt nincs szükség.
A konkatenációra később még visszatérünk, addig is egy példa:
$x="Hello"; Ennek eredménye:
$y=" Világ"; Hello Világ
print $x.$y;
Konstansok
Konstanst PHP programban a define segítségével hozhatunk létre. Például:
define("KONSTANS", "hello");
Értéke természetesen nem változtatható meg és nem is kötelező nagy betűkkel írni, de ne térjünk el a
szokásos írásmódtól. További eltérés a változóhoz képest, hogy nem kezdődik $-jellel. A konstansra
hivatkozni a nevének megadásával tudunk:
print KONSTANS; hello
A PHP rendelkezik néhány beépített konstanssal is:
PHP_VERSION A PHP verziószámát tartalmazza
__FILE__ A feldolgozás alatt levő fájl neve
__LINE__ A feldolgozás alatt álló sor számát tartalmazza
22
A PHP4 adattípusai
[gettype.php]
A következő táblázat a PHP 4-es verziója által támogatott adattípusokat foglalja össze:
Típus Leírás
Integer Egész szám, pl: 10
Double Lebegőpontos szám, pl: 3,205
String Karakterlánc, pl: ”Hello”
Boolean Logikai érték, kétféle lehet: true, false
Array Tömb
Object Objektum
Mivel a PHP nyelv nem típusos nyelv, ezért előfordulhat, hogy nem vagyunk biztosak abban, hogy egy
változó milyen típusú értéket tárol. Ennek lekérdezésére való a gettype() függvény, melynek
visszatérési értéke a paraméterben megadott változó típusa. Például:
$szam=10;
$szoveg="Hello";
$lebegopontos=2.5;
print gettype($szam) . "<br>\n"; integer
print gettype($szoveg) . "<br>\n"; string
print gettype($lebegopontos); double
= $x=5; Értékadás
+= $x += 10; $x = $x + 10;
-= $x -= 10; $x = $x - 10;
*= $x *= 10; $x = $x * 10;
/= $x /= 10; $x = $x / 10;
.= $x .= "szoveg"; $x = $x . "szoveg";
23
Összehasonlító operátorok
A következő táblázat a logikai operátorokat foglalja össze:
Operátor Jelentés
>= Igaz, ha a bal oldali kifejezés nagyobb vagy egyenlő, mint a jobb oldali
<= Igaz, ha a bal oldali kifejezés kisebb vagy egyenlő, mint a jobb oldali
Logikai operátorok
Operátor Jelentés
|| vagy or Logikai „vagy” művelet
&& vagy and Logikai „és” művelet
xor Kizáró vagy művelet
! Tagadás
Tömbök
Tömbök létrehozására többféle lehetőségünk is adódik.
Az array() függvény
[szamindex_tomb.php]
Számmal indexelt tömbök létrehozására alkalmas függvény, működését egyszerűbb egy példán
megvizsgálni. Hozzunk létre egy hetnapjai nevű tömböt, mely elemei a hét napjait
tartalmazza:
$hetnapjai =
array("Hétfő","Kedd","Szerda","Csütörtök","Péntek","Szombat","Vasárnap");
24
Array
(
[0] => "Hétfő"
[1] => "Kedd"
[2] => "Szerda"
[3] => "Csütörtök"
[4] => "Péntek"
[5] => "Szombat"
[6] => "Vasárnap"
)
Asszociatív tömbök
[asszoc_tomb.php]
Az asszociatív tömböket nem számmal, hanem karaktersorozatokkal indexeljük, ezért szokás
szótáraknak is nevezni őket. Ilyen tömbök létrehozásához is használhatjuk az array()
függvényt:
$alkalmazott = array
(
"nev" => "István",
"eletkor" => 25,
"szulhely" => "Szeged"
);
Ezen tömb elemeire az $alkalmazott[nev], $alkalmazott[eletkor] és az
$alkalmazott[szulhely] segítségével hivatkozhatunk.
Többdimenziós tömbök
[tobbdim_tomb.php]
25
Az egyes dimenziók számát a []-párok száma, és azok méretét a bennük levő számok
határozzák meg. Egy 4x4-es mátrixot a következőképpen hozhatnánk létre:
$matrix = array(array(1,2,3,4),
array(5,6,7,8),
array(9,10,11,12),
array(13,14,15,16)
);
Hivatkozni egy elemre a már más nyelvekből jól megszokott módon tudunk:
$matrix[2][3]; 12
Tömbök bejárása
[foreach.php]
[foreach_asszoc.php]
Tömbök bejárására a PHP nyelv a foreach() szerkezetet biztosítja, mely számokkal indexelt
tömbök esetén általánosan a következőképpen néz ki:
foreach($tombnev as $ideiglenes){
/* minden iterációs lépésben ez a kódrészlet fut le, az
aktuális tömbelemre az $ideiglenes változóval hivatkozhatunk.
*/
}
A fenti példatömbünket a következőképpen járhatjuk be a foreach() segítségével:
$hetnapjai =
array(”Hétfő”,”Kedd”,”Szerda”,”Csütörtök”,”Péntek”,”Szombat”,”Vasárnap”);
foreach ($hetnapjai as $ideiglenes){
print $ideiglenes;
print "<br>\n";
}
Ennek eredménye:
”Hétfő”<br>
”Kedd”<br>
”Szerda”<br>
”Csütörtök”<br>
”Péntek”<br>
”Szombat”<br>
”Vasárnap”<br>
Asszociatív tömbök bejárása is lehetséges a foreach() segítségével. Ekkor a szerkezet
általánosan a következőképpen néz ki:
foreach( $tomb as $kulcs => $ertek ){
// a tömbelem feldolgozása
}
Az asszociatív példatömbünk bejárása a foreach() segítségével:
$alkalmazott = array
(
"nev" => "István",
"eletkor" => 25,
"szulhely" => "Szeged"
);
foreach ($alkalmazott as $kulcs => $ertek){
print $kulcs;
print " = ";
print $ertek;
print "<br>\n";
}
26
Ennek eredménye:
nev = István<br>
eletkor = 25<br>
szulhely = Szeged<br>
Többdimenziós tömböket egymásba ágyazott foreach() szerkezetekkel tudunk bejárni.
Az if vezérlés else ága további elágazásokat tartalmazhat, ilyenkor else helyett elseif-et
használunk.
Esetkiválasztásos szelekciós vezérlés
[switch.php]
switch (kifejezés) {
case érték_1:
//ha a kifejezés értéke érték_1, akkor a vezérlés ide kerül
break;
case érték_2:
//ha a kifejezés értéke érték_2, akkor a vezérlés ide kerül
break;
…
case érték_n:
//ha a kifejezés értéke érték_n, akkor a vezérlés ide kerül
break;
}
27
Pl:
<?php
$honap="Julius";
switch ($honap){
case "Januar": print "Születésnapom van ebben a hónapban"; break;
case "Februar":
case "Marcius": print "Ezekben a hónapokban nagyon hideg van!"; break;
case "Junius":
case "Julius":
case "Augusztus": print "Nyár van, nyaralni megyek!"; break;
case "December": print "Közeleg a karácsony és a szilveszter"; break;
default: print "A $honap hónap nem szerepel a fenti listában...";
}
?>
A $honap változó határozza meg, hogy melyik utasítás(ok)ra kerül a vezérlés. Ha a változó olyan
értéket tartalmaz, mely nem szerepel a switch értékei között, akkor a default utáni kód fut le.
A fenti példa eredménye $honap="Februar" esetén:
Ezekben a hónapokban nagyon hideg van!
A fenti példa eredménye $honap="Majus" esetén:
A Majus hónap nem szerepel a fenti listában...
Elöltesztelő ismétléses vezérlés
[while.php]
while (feltétel){
//ciklusmag
}
Pl:
<?php
$szamlalo=1;
while ($szamlalo <= 10){
print "A számláló változó értéke: $szamlalo<br>";
$szamlalo++;
}
?>
A feltétel minden egyes ellenőrzésekor ha a feltétel teljesül, a vezérlés a ciklusmagra kerül. A fenti
példában szereplő számlálót a ciklus természetesen nem növeli automatikusan, így azt magunk kell
növeljük a ciklusmagon belül. Konkrétan ebben a példában a növelés elhagyása végtelen ciklushoz
vezetne.
Hátultesztelő ismétléses vezérlés
[dowhile.php]
do{
//ciklusmag
} while (feltétel);
28
Pl:
<?php
$ertek = 1;
do{
print "A ciklus ennyiszer lefutott: $ertek";
$ertek++;
} while ( $ertek > 10 );
?>
A hátultesztelő ciklus sajátossága, hogy a feltételt először csak a ciklusmag egyszeri lefutása után
ellenőrzi. Ez a példából is kiderül, mert az $ertek változó értéke 1, ami nem nagyobb 10-nél, így egy
elöltesztelő ciklus esetében a ciklusmag egyszer sem futna le. A ciklusmag további lefutására akkor
kerül sor, ha a feltétel teljesül.
Számlálásos ismétléses vezérlés
[for.php]
for ( ciklusváltozó=kezdőérték; feltétel; ciklusváltozó értékmódosítása){
//ciklusmag
}
Pl:
<?php
for ($szamlalo=1; $szamlalo<=10; $szamlalo++){
print "A számláló változó értéke: $szamlalo<br>\nÉs annak duplája:
".($szamlalo*2)."<br><br>\n\n";
}
?>
A példában egy növekvő számlálásos ismétléses vezérlésre látunk példát, de a feltétel és a harmadik
paraméter megfelelő változtatásával könnyen szervezhetünk csökkenő számlálásos vezérlést is.
Függvények, eljárások
A függvények osztályát két részre oszthatjuk. Az egyik csoportba tartoznak azok a függvények,
melyeket már többször is használtunk ezek az előre definiált, a PHP nyelvbe beépített függvények.
Ilyen volt például a print() függvény. A másik csoportba az általunk létrehozott függvények
tartoznak. Egy függvény definíciója általánosan a következőképpen néz ki:
funcion fuggvenyazonosító ( $param_1, $param_2, ..., $param_n ){
// függvénytörzs
}
Függően attól, hogy ezt függvényként vagy eljárásként definiáljuk, a törzs tartalmazhat egy
return <visszatérési érték>;
kifejezést is. Amennyiben ez egy eljárás, nincs return, mivel visszatérési érték sincsen.
Hozzunk létre egy olyan függvényt, mely visszatér a paraméterekben érkező két szám szorzatával.
Ekkor a függvény definíciója a következőképpen néz ki:
function szoroz( $szam1, $szam2 ){
$szorzat = $szam1 * $szam2;
return $szorzat;
}
A függvényt az azonosítójával és a megfelelő paraméterezéssel hívhatjuk meg:
print szoroz(5, 6); //Kiírja, hogy 30
Dinamikus függvényhívások
Egy függvény azonosítóját egy karakterláncba is tehetjük és a függvényt ezen karakterlánc
segítségével hívhatjuk meg. Pl:
29
function hello(){
print "Hello";
}
$fuggveny = "hello";
$fuggveny(); //Meghívja a hello() eljárást
Miért jó ez? Hiszen ezt kevesebb munkából is elérhettünk volna egy egyszerű hello(); hívással.
Sokszor szeretnénk azt, hogy bizonyos feltételektől függően más és más függvények kerüljenek
meghívásra. Vagy hasznos lehet számos előre beépített függvény használatakor is. Tömbök
bejárására létezik egy array_walk() függvény, mely a paraméterében megadott tömböt bejárja és a
tömbelemekre egy adott eljárást hajt végre, melyet szintén paraméterként kap meg. Ez a paraméter
egy karakterlánc típusú paraméter, tehát a dinamikus függvényhívás szintén hasznos lehet.
Változók hatóköre
Egy adott (nem globális) változó láthatósága korlátozódik annak blokkjára és ezen blokkon belül
definiált további blokkokra. Tehát egy függvényen belül definiált változó a függvényen kívülről nem
látható. De ez általában fordítva is igaz. Függvényen kívül definiált változót alapértelmezésben nem
érhetjük el. Ahhoz, hogy egy függvényen kívül definiált változót mégis elérjünk a függvényen belül
használnunk kell a global kulcsszót. Erre mutat példát a következő program:
$kedv = "Jó kedvem van! ";
function hangulat(){
global $kedv; //a $kedv változó mostantól itt is látható
print "A mai hangulatom: $kedv";
}
Sokszor hasznos lehet, hogy az egyes függvényhívások között elérjünk egy „állapotváltozót”, mely
valamilyen mértékben befolyásolják a függvény által szolgáltatott kimenetet. A következő példában
egy globális változó segítségével nyomon követjük, hogy az adott függvényt hányszor hívtuk meg:
$allapotvaltozo = 0;
function felsorolas( $cimsor ){
global $allapotvaltozo;
$allapotvaltozo++;
print "<H1>$allapotvaltozo. $cimsor</H1>";
}
felsorolas("Programozzunk PHP-ben");
print "Ez a könyv nagyon hasznos!<br><br>";
felsorolas("A HTML alapjai");
print "Ezt sem árt jól ismerni! <br><br>";
felsorolas("Dreamweaver 4");
print "Ez egy kiváló weboldal szerkesztő program! <br><br>";
30
Ez a megoldás lehetővé teszi, hogy több függvény hozzáférjen ugyanahhoz a globális változóhoz,
hiszen csak annyi a dolgunk, hogy az érintett függvények törzsében globálissá tesszük az adott
változót.
Megjegyzés: A globális változókat – a programon belül bárhol – a $GLOBALS változó segítségével is elérhetjük, mely
egy asszociatív tömb. Például az $allapotvaltozo globális változó értékéhez a $GLOBALS["allapotvaltozo"]
által is hozzáférhetünk.
Mi a helyzet olyankor, ha azt szeretnénk, hogy a függvény „emlékezzen” a változó korábbi értékére,
de nem szeretnénk azt, hogy ez a változó más függvények számára, kívülről is látható legyen? Ekkor
a static módosítót kell alkalmazzuk. Írjuk meg a fenti függvény úgy, hogy az állapotváltozót
static-ként, a függvényen belül hozzuk létre:
function felsorolas( $cimsor ){
static $allapotvaltozo = 0;
$allapotvaltozo++;
print "<H1>$allapotvaltozo. $cimsor</H1>";
}
Ilyenkor minden egyes függvényhíváskor a függvény „emlékszik” az $allpotvaltozo értékére.
Az include() függvény
Az include() függvény segítésével külső fájlokat szúrhatunk be a programunkba. Hasznos lehet, ha
egy program által használt eljárásokat/függvényeket egy külső fájlban tároljuk, mert így ezeket más
programok is fel tudják használni. Az include() futási időben ágyazza be a paraméterében
megadott fájlt:
include("fuggvenykonyvtar.php");
Mivel az include() az adott fájl tartalmát szövegszerűen helyettesíti be a megadott helyre, ezért ha
a beillesztésre került fájl tartalmaz például egy print "hello"; kifejezést, akkor a „hello”
karakterlánc kiírásra kerül.
Fájlok kezelése
Fájlok létrehozása
Fájlokat a touch() függvény segítségével hozhatunk létre. Ha a fájl már létezik, nem törli
annak tartalmát, de az utolsó módosítás dátumát megváltoztatja. Pl:
touch("uj_file.txt");
Fájlok törlése
Fájlokat az unlink() függvénnyel törölhetünk. Egyetlen paramétere a törlendő fájl elérési
útja:
unlink("torlendo.txt");
31
Fájlok megnyitása
Fájlok megnyitására az fopen() függvényt használjuk. Paramétereként át kell adni a
megnyitandó fájl elérési útját/azonosítóját, illetve a megnyitás módját. A leggyakoribb
megnyitási módok:
Megnyitás olvasásra: "r" //read
Megnyitás írásra: "w" //write
Megnyitás hozzáfűzésre: "a" //append
A függvény visszatérési értéke sikeres megnyitás esetén egy egész szám, mely a megnyitott
fájlt azonosítja. Ezt az azonosítót fájlműveletek végrehajtásakor kell majd használjuk.
Sikertelen megnyitás esetén a visszatérési érték: false. Ez lehetővé teszi, hogy a fájl
megnyitását egy feltételes vezérlés feltételében hajtsuk végre, megelőzve az esetleges
fájlműveletek által szolgáltatott hibákat sikertelen megnyitás esetén. Példa fájl megnyitására:
if ($f_id = fopen("beolvas.txt", "r")){
//fájlműveletek
}
Egy másik gyakran használt megnyitási séma, amikor sikertelen megnyitás esetén
megszakítjuk a program további futását. Erre a die() függvényt használjuk:
( $f_id = fopen( "ir.txt", "w" ) )
or die ("A fájl megnyitása sikertelen!");
Amennyiben a fájl írásra való megnyitása sikertelen, akkor a die() függvény kiírja a
paraméterében megadott karakterláncot, majd megszakítja a program további futását.
Miután befejeztük a fájllal való műveletvégzést, le kell zárjuk azt. Erre való az fclose()
függvény, melynek egyetlen paramétere a bezárandó fájl azonosítója. Pl:
fclose($f_id);
Olvasás fájlból
Fájlból való olvasást többféleképpen is elvégezhetjük. Háromféle megközelítést vizsgálunk
meg:
• Olvasás soronként
• Olvasás byte-onként
• Olvasás karakterenként
Olvasás soronként
Soronként beolvasáshoz két függvényt fogunk felhasználni: fgets() és feof(). Az
fgets() függvény első paramétere azon fájl azonosítója, melyből ki szeretnénk olvasni egy
sort. A második paramétert elhagyhatjuk, ekkor az fgets() a sor vége jelig olvas. Az egész
fájl soronkénti beolvasásához a feof() függvényt is használjuk, mely akkor ad igaz értéket,
ha a fájl végéhez értünk. Feltételezve, hogy egy szöveges fájlt megnyitottunk olvasásra és a
fájlazonosítót az $f_id változóba kaptuk, akkor a teljes tartalom soronként beolvasása a
következőképpen néz ki:
while (!feof($f_id) ){
//A $sor változó a szöveges file egy sorát tartalmazza
$sor = fgets($f_id);
//a $sor változó feldolgozása
}
Olvasás byte-onként
Byte-onkénti olvasáshoz az fread() függvényt használjuk. Első paramétere azon fájl
azonosítója, melyből olvasni szeretnénk, második paramétere a kiolvasandó mennyiség byte-
ban. Olvassunk ki 8 byte-ot az $f_id által azonosított, olvasásra már korábban megnyitott
fájlból:
32
$adat = fread($f_id,8);
Az $adat változó tartalmazza a megadott adatmennyisséget (ha közben nem értünk el a fájl
végére).
Ennél a megközelítésnél alapvető szükséglet lehet megadni azt, hogy hányadik byte-tól
kezdődően olvassunk. Ennek megadására való az fseek() függvény, mely első paramétere
szintén egy fájlazonosító, a második pedig meghatározza, hogy a fájlmutató hányadik byte-ra
mutasson. A következő kifejezés a fájlmutatót a 32. byte-ra állítja:
fseek($f_id, 32);
Az ezután meghívott fread() függvény a paraméterében megadott byte mennyiséget a 32.
byte-tól kezdődően olvasná.
Olvasás karakterenként
Egyetlen karakter olvasásához az fgetc() függvényt használjuk. Mivel egy karakter egy byte-
os, ezért csak egyetlen paramétere van, a fájl azonosítója. A következő példa karakterenként
olvassa be az $f_id által azonosított szöveges fájlt:
while (!feof($f_id) ){
//A $sor változó a szöveges file egy sorát tartalmazza
$karakter = fgetc($f_id);
//a $karakter változó feldolgozása
}
Írás fájlba, hozzáfűzés fájlhoz
Az, hogy egy fájl elejére (írás fájlba) vagy végére írunk (hozzáfűzés fájlhoz) az attól függ, hogy
a fájlt milyen módon nyitjuk meg. Az fopen() második paramétere meghatározza a fájl
megnyitásának módját. Amennyiben a második paraméter "w", akkor ha már létezett ilyen
fájl, törli annak tartalmát, egyébként létrehozza azt. Mindkét esetben a fájl megnyitásra kerül –
írásra.
Ha megnyitáskor a második paraméter az "a" értéket kapja, írásra nyílik meg a fájl, a kiírt
adatok a fájl végéhez fűződnek hozzá – feltéve, hogy más létezett ilyen fájl korábban. Ha nem
létezett, akkor a PHP létrehozza azt.
Fájlba írás az fputs() és fwrite() függvényekkel
Mindkét függvény két megegyező paraméterrel rendelkezik. Az első paraméter egy írásra
megnyitott fájl azonosítója, a második egy karakterlánc, melyet a fájlba szeretnénk írni:
fwrite( $f_id, "Ezt írjuk ki." );
fputs( $f_id, "Ezt írjuk ki." );
Kölcsönös kizárás
Mivel közzétett weboldalunk bárki számára hozzáférhető, ezért ezt a problémát szem elől
tévesztve számolnunk kell annak veszélyével, hogy egy írási művelet után a fájlunk
használhatatlanná válik. Tegyük fel ugyanis, hogy egy fájlba egyszerre többen is szeretnének
írni. Ez természetesen nem lehetséges. Az egyes írási folyamatok kölcsönös kizárását az
flock() függvénnyel valósíthatjuk meg. Az flock() két paraméterrel rendelkezik. Az első a
zárolandó fájl azonosítóját, a második a zárolás módját adja meg. Egy zárolt fájlhoz egyszerre
csak egy folyamat férhet hozzá. A második paraméter háromféle értéket vehet fel:
33
A következő példában zároljuk az adott fájlt, írunk bele, majd feloldjuk a zárolást:
flock( $f_id, 2 ); // kölcsönös kizárás
fwrite( $f_id, "hello");
flock( $f_id, 3 ); // zárolás feloldása
34
Egy konkrét példa – weboldal generálása
[megjelenit.php]
[procedures.php]
[tartalom.txt]
A következő példában olyan PHP programo(ka)t fogunk írni, mely egy szöveges fájl tartalmától
függően fog HTML oldalt készíteni.
Legyen adott egy tartalom.txt fájl, mely két „típusú” értéket tartalmazhat külön-külön sorokban. Az
egyik típus link létrehozását, a másik táblázat létrehozását írja elő. Mind a link, mind pedig a táblázat
legyen valamilyen mértékben testreszabható. Az egyes tulajdonságokat egy „*” karakter válassza el.
Például egy olyan link, mely HREF attribútumának értéke a <http://www.google.hu> URL és az
<A> tag tartalma <A Google kereső> karakterlánc, a tartalom.txt fájl következő sorával legyen
ekvivalens:
link*http://www.google.hu*A Google kereso
Link létrehozását jelzi A link erre a címre mutat Az <A> tag tartalma (melyen a link szerepel)
35
A megjelenit.php
<HTML>
<HEAD> Be-include-oljuk az eljárásokat
</HEAD> tartalmazó PHP fájl-t:
<BODY BGCOLOR="#AAAADD">
36
A procedures.php
<?php
Link kiírásakor az <A> HTML tag-et írjuk
ki a fájlba a megfelelő attribútummal és
tartalommal. A függvény átveszi a két
function keszit_link($url,$szoveg){ paramétert, az URL-t és az <A> tag
tartalmát.
print "<A HREF='$url' TARGET='_BLANK'>$szoveg</A><BR><BR>\n\n";
}
function keszit_tablazat($sorszam,$oszlopszam){ A paraméterben string érkezik,
settype($sorszam,"integer"); ezért a for ciklusok miatt integer-
settype($oszlopszam,"integer"); re kell átalakítsuk mindkét változó
típusát
A fenti példában található settype() függvény segítségével egy változó típusát átalakíthatjuk egy
másik típusra. Első paramétere az átalakítandó változó (jelen esetben a $sorszam és
$oszlopszam), második paramétere pedig egy karakterlánc, mely a céltípus nevét tartalmazza (jelen
esetben az integer).
37
Űrlapok használata
[urlap.htm]
Az űrlapok felhasználótól való adatbekérése szolgálnak. Mint ahogy már korábban láttuk, az űrlapok
létrehozása független a PHP-tól, hiszen ez a HTML segítségével megoldható. Amire a PHP-t
használni fogjuk az az űrlapok feldolgozása lesz. Űrlapok létrehozását már korábban tárgyaltuk, de
ismétlés gyanánt tekintsük a következő egyszerű űrlapot tartalmazó HTML kódot:
<HTML>
<HEAD>
<TITLE>ŰRLAP PÉLDA</TITLE>
</HEAD>
<BODY>
<FORM ACTION="feldolgoz.php" METHOD="POST">
Neve: <INPUT TYPE="TEXT" NAME="NEV"><BR>
Címe: <INPUT TYPE="TEXT" NAME="CIM"><BR>
<INPUT TYPE="SUBMIT" VALUE=”ELKÜLD”>
</FORM>
</BODY>
</HTML>
Ez az űrlap két szövegmezőt és egy, az elküldésre szolgáló gombot tartalmaz, eredménye:
Az űrlap kezdetét definiáló FORM HTML tag rendelkezik két kötelezően megadandó attribútummal. Az
egyik a feldolgozásért felelős PHP kód elérési útját (ACTION), a másik az űrlap elküldésének módját
(METHOD) adja meg. A fenti példában az űrlapot a „feldolgoz.php” fájl végzi el, az elküldés módja
pedig POST. A METHOD attribútum a POST mellett még felveheti a GET értéket is. GET esetén az
adatok a böngésző címsorán keresztül kerülnek elküldésre, a POST esetén nem. Mi az űrlapjaink a
POST elküldési módot fogják használni.
Az űrlapfeldolgozás tárgyalását két részre fogjuk osztani. Az egyik esetben az űrlapot létrehozó HTML
kód és az azt feldolgozó PHP kód egyetlen fájlban található (önmeghívó HTML kód), a másik esetben
ezeket külön tároljuk.
Ha a feldolgozást végző PHP kód szemszögéből tekintünk az űrlapokra, akkor szintén két irányba
haladhatunk tovább. A webszerveren működő PHP beállításait a php.ini fájl tartalmazza, mely
rendelkezik egy register_globals beállítással is, mely egy logikai értéket tárol. Ha az értéke igaz,
akkor az űrlapadatok globális változókon keresztül érhetők el a feldolgozó PHP programban. Hamis
érték esetén egy asszociatív tömb áll rendelkezésünkre, mely POST küldés esetében a
$HTTP_POST_VARS, GET küldés esetében a $HTTP_GET_VARS tömb. Mivel biztonsági okokból ezt a
szolgáltatást általában kikapcsolják (mint ahogy az SZTE-s szervereken is), ezért a tömbalapú
űrlapfeldolgozásra is (és többnyire erre) fogunk példát nézni. A tömbön keresztüli űrlapfeldolgozás
másik hatalmas előnye, hogy nem kell ismerje az űrlapvezérlők azonosítóit, így például egy program
képes lehet több, más-más azonosítóval ellátott különböző vezérlőket tartalmazó űrlap feldolgozására
is.
Önmeghívó HTML kód
Jogosan merül fel a kérdés, hogy miért hasznos, ha egy fájlban tárolom az űrlapot és a feldolgozást
végző PHP kódot, hiszen az olvasgatóság nagyon romlik és ezáltal a módosíthatóság is. De abban az
esetben, ha ugyanazt az űrlapot többször is át szeretnénk adni a felhasználónak, ezt a megoldást
érdemes használni.
38
Milyen értéket adjunk az ACTION attribútumnak, ha az űrlapot feldolgozó fájl megegyezik a
megjelenítést végző fájllal? Globális változókkal már korábban foglalkoztunk. A globális változókat a
$GLOBALS asszociatív tömbön keresztül érjük el. A $GLOBALS[”PHP_SELF”] az éppen futó program
elérési útját tartalmazza, mely értéket a $PHP_SELF változóból is megtudhatjuk. Mivel az éppen futó
program az űrlap megjelenítését és feldolgozását egyaránt tartalmazza, ezért ezt a változót fogjuk
használni az ACTION attribútum megadásakor. Egy ilyen űrlap FORM tag-je tehát a következőképpen
néz ki:
<FORM ACTION=”<?php print $PHP_SELF ?>” METHOD=”POST”>
39
</p>
<p><strong>Előadás címe:</strong><br>
<input name="ea_cim" type="text" id="text1" value="Cím">
</p>
<p><strong>Foglalkozás:</strong><br>
Infomatikus
<input name="foglalkozas" type="radio" value="1" checked>
<br>
Biológus
<input name="foglalkozas" type="radio" value="2">
<br>
Fizikus
<input name="foglalkozas" type="radio" value="3">
</p>
<p> <strong>Előadás rövid ismertetése:</strong><br>
<textarea name="ea_leiras" cols="30" rows="5"
id="ea_leiras">Ismertető</textarea>
</p>
<p>
<input name="submit" type="submit" id="submit" value="Elküld">
</p>
</form>
</body>
</html>
if ($HTTP_POST_VARS[tipp]>$kitalalando) {
$uzenet = "Ez túl nagy!\n";
} elseif ($HTTP_POST_VARS[tipp]<$kitalalando){
$uzenet = "Ez túl kicsi!\n";
} else {
$uzenet = "Eltaláltad! Próbálkozásaid száma: $probalkozasok";
}
} else {
40
$uzenet = "Ez itt a számkitalálós játék! Tippelj melyik számra gondoltam!<BR>\n";
}
?>
<form method="post" action="<?php print $PHP_SELF ?>">
<H2><?php print $uzenet?></H2>
<p>Tipp:<br>
<input name="tipp" type="text" id="tipp" value="<?php print $tipp ?>"></p>
<p>
<input name="probalkozasok" type="hidden" id="probalkozasok"
value="<?php print $probalkozasok ?>">
</p>
Rejtett űrlapmező. Ezt a felhasználó
</form>
csak akkor látja, ha megnézi az oldal
</body>
forrását.
</html>
41
kiírása) előtt elküld egy alapértelmezett fejlécet. Átirányítás a „Location” fejléc segítségével történhet.
Például a
header(”http://www.inf.u-szeged.hu”);
kifejezés a böngésző, a paraméterben megadott URL-re való átirányítását írja elő.
Mivel a fejléc információk elküldése szintén függ az aktuális PHP beállításoktól, ezért elképzelhető,
hogy néhány webszerveren a következő megoldás nem működik. Ahhoz, hogy működhessen, az
output_buffering PHP logikai környezeti változót TRUE értékre kell állítsuk. A továbbiakban
feltételezzük, hogy ez a változó TRUE.
Az átirányítást végző header() kifejezést a forráskód melyik részében fogjuk használni? Változást
csak a tipp és a gondolt szám egyenlősége esetén levő forráskódnál találunk. Ha egyenlők, nem az
$uzenet változónak adunk értéket, hanem elvégezzük az átirányítást.
Így most csak a kód egy részét írjuk ide. Az if (count($HTTP_POST_VARS)) feltétel igaz ága:
if ($HTTP_POST_VARS[tipp]>$kitalalando) {
$uzenet = "Ez túl nagy!\n";
} elseif ($HTTP_POST_VARS[tipp]<$kitalalando){
$uzenet = "Ez túl kicsi!\n";
} else { Átirányítás a grat.html oldalra. A
header( "Location: grat.html" ); header() függvényt az exit
exit; kifejezés kell kövesse, hogy az oldal
} befejezze az űrlap vizsgálatát.
} else {
$uzenet = "Ez itt a számkitalálós játék! Tippelj melyik számra gondoltam!<BR>\n";
}
?>
42
Űrlap generálása PHP programmal
[form_keszit.php]
[options.txt]
Egy olyan PHP programot fogunk írni, amely egy legördülő menüt egy adott text fájl soraival tölt fel. Új
ismeretet e feladat megoldása sem igényel, ismerni kell a legördülő menüt létrehozó HTML tag-et
(<SELECT>), annak felépítését és tudnunk kell szöveges fájlt kezelni PHP-ben.
A <SELECT> és </SELECT> kulcsszavak között megadott <OPTION> </OPTION> párok
segítségével adhatjuk meg a menü elemeit. Ahány <OPTION> </OPTION> pár szerepel, annyi eleme
lesz a menünek. Egy olyan legördülő menüt, amely az „egy”, „kettő” és „három” elemeket tartalmazza
a következőképpen tudjuk létrehozni:
<FORM>
<SELECT>
<OPTION> egy </OPTION>
<OPTION> kettő </OPTION>
<OPTION> három </OPTION>
</SELECT>
</FORM>
A programunk tehát nem kell mást csináljon, mint soronként beolvasnia a szöveges fájlt (options.txt),
majd minden egyes sor kiolvasása után a sor tartalmát a megfelelő helyre, <OPTION> </OPTION>
párok között a kimenetre írnia.
Az oldal forráskódja:
<html>
<head>
<title>Form generálása</title>
</head>
<body>
<form name="form1" method="post" action="feldolgoz.php">
<select name="select">
A PHP rész itt kezdődik. Megnyitjuk az „options.txt” fájlt, majd soronként beolvassa azt.
<?php
if ($f_id = fopen("options.txt", "r")){
while (!feof($f_id) ){
$sor = fgets($f_id);
print "<OPTION>$sor</OPTION>";
}
}
?>
</select>
</form>
</body>
</html>
43
Állapotok tárolása PHP segítségével
Az állapotok tárolását két részre osztva fogjuk tárgyalni:
1. Állapotokat tárolhatunk sütikkel (cookie),
2. Vagy munkamenet változókkal (session)
Sütik
Mi az a süti?! A süti egy maximálisan 4Kb méretű adat, melyet a böngésző tárol, melyet például egy
PHP program vagy maga a kiszolgáló is egyaránt kérhet. Egy gép maximálisan 20 sütit tárolhat a
böngészőben. A felhasználó „biztonságát” (nem komoly védelem) elősegítve egy sütit csak az a gép
olvashatja, amely létrehozta azt.
A sütik használatával óvatosan kell bánjunk, mivel egyáltalán nem biztos, hogy ez a funkció
engedélyezve van a felhasználó böngészőjében vagy hogy egyáltalán létezik ilyen funkció. A
felhasználó úgy is beállíthatja böngészőjét, hogy csak az ő engedélyével lehessen egy süti tárolását
végrehajtani.
De mindezekkel együtt a sütik alkalmasak lehetnek kis mennyiségű információ tárolására, melyet
felhasználhatunk az oldalaink lépkedése közben azok közti adatcsere céljából.
A sütik felépítése
A sütik név-érték párokat, egy lejárati időpontot, egy elérési utat és egy tartományt tartalmaz. Pl:
szin; kék; expires-Monday, 29-Nov-04 20:00:00 GMT; path-/; domain=www.u-szeged.hu
• A név-érték pár URL felépítésű kell, hogy legyen (a példán keresztül ez világosabb lesz)
• A lejárat (expires) előírja a böngészőnek, hogy az adott süti mikor veszti érvényét.
• Az elérési út (path) jelöli a weboldalunk azon részét, ahol a sütit vissza kell küldeni a
kiszolgálónak
• A tartomány mező azokaz az internetes tartományokat jelölik, ahová a sütik elküldésre kerülnek.
Mivel ez a cím nem különbözhet azon címtől ahonnan a sütit küldték, ezért ez csak minimális
rugalmasságot jelent. (a fenti példában definiált sütit a böngésző elküldi mind a www.inf.u-
szeged.hu és www.math.u-szeged.hu kiszolgálónak)
A név-érték páron kívül egyik paraméter megadása sem kötelező (de ajánlott).
Ha a böngésző egy olyan oldalra jut, mellyel egy sütit tároltunk le, és az elérési út, tartomány, illetve a
lejárati idő is stimmel, akkor a böngésző a sütit a kiszolgálónak küldi (egy fejléc létrehozásával).
Nyilvánvalóan ehhez az adathoz kiszolgáló oldalon hozzáférhetünk a PHP segítségével, melyhez a
beépített $HTTP_COOKIE_VARS globális asszociatív tömböt használhatjuk.
Megjegyzés: használhatnánk a süti nevével azonosított változóazonosítót, de a mivel a PHP környezet
register_globals értéke általában FALSE, ezért ez a megoldás nem mindig, sőt általában nem működik.
44
A következő példa létrehoz egy sütit a setcookie() függvény segítségével, majd megnézi, hogy
létezik-e süti ilyen néven. Ha létezik kiírja azt, ha nem üdvözöl, mivel ez volt a legelső látogatásunk,
így a PHP-nek még lehetőség sem volt azt létrehozni.
<?php
setcookie( "szin", "kék", time()+3600, "/", "www.u-szeged.hu");
?>
<html>
<head>
<title>Süti tesztelése</title>
</head>
<body>
<?php
A feltétel helyett azért nem az if(isset($szin)) feltételt írtuk, mert az csak akkor működne, ha a
register_globals PHP környezeti változó értéke "true" lenne.
if ( isset( $HTTP_COOKIE_VARS[szin] ) )
print "<p>A Te színed a $HTTP_COOKIE_VARS[szin]</p>";
else
Ha nem létezett ez a süti, akkor a következő rész fut le, de a legközelebbi lefutáskor már a feltétel igaz
ágára kerül a vezérlés.
print "<p>Üdvözöllek az oldalon, ez az első látogatásod!</p>";
?>
</body>
</html>
A süti létrehozásakor a szin és kék rendre a név-érték párokat adják meg, a lejárati idő a jelen
időponttól számított 1 órát (3600 másodpercet) jelenti, az elérési út (/) itt azt jelenti, hogy a süti a
webhely összes oldaláról elérhető lesz, a tartomány pedig a www.u-szeged.hu, melynek minden
kiszolgálja fogadhatja a sütit.
Előfordulhat az is, hogy a sütihez hozzáférő kiszolgálót szeretnénk korlátozni arra a kiszolgálóra,
melyet az azt létrehozó programot futtatta. Ilyenkor a tartomány helyett használhatunk konkrét címet
vagy a nagyobb hordozhatóság érdekében a $SERVER_NAME beépített környezeti változót.
Mint említettük a név-érték párokon kívül más értékek megadása nem kötelező, de vannak
böngészők, melyek csak teljesen definiált sütiket képesek helyesen kezelni.
Sütik törlése
Ismét többféle megoldás adódik, de csak a legbiztosabb megoldást említjük. A legbiztosabb
megoldás, ha a törlendő sütit ismét beállítjuk ugyanazokkal a paraméterekkel mint amivel azt
létrehoztuk, de a lejárati időt állítsuk egy már elmúlt időpontra. Például:
Ügyelnünk kell arra, hogy a két setcookie() kifejezés paraméterezése a lejárati időn kívül teljesen
meg kell egyezzen!
Munkamenet sütik
[munkamenet_suti.php]
Fontos igény lehet az, hogy a süti csak addig létezzen, ameddig a böngészőprogramot a felhasználó
be nem zárja. Ezt úgy érhetjük el, hogy a süti élettartamát 0-ra állítjuk. Ezen fajta süti egyik legfőbb
alkalmazása felhasználók azonosítása. Belépéskor létrehozzuk a sütit és minden „védett” oldalon
visszaküldjük azt a kiszolgálónak és elvégezzük az azonosítást. A böngésző bezárásakor a süti
(munkamenet sütik esetén) automatikusan törlődnek, de kilépéskor „manuálisan” is törölhetjük a
lejárati időpont megfelelő beállításával. Példa munkamenet süti létrehozására:
45
Lekérdező karakterláncok használata
A sütik sok hátránnyal rendelkeznek:
• Nem minden böngésző támogatja
• Az ezt támogató böngészők sem egységesen valósítják meg őket
• A felhasználó letilthatja használatukat
Így tekintsünk egy hagyományosabb megoldást. Ezen megoldás hátránya viszont, hogy csak egyetlen
látogatás „állapotát (állapotait)” képes tárolni.
Ezt a megoldást kapcsolatba hozhatjuk az űrlapfeldolgozás kapcsán említett GET típusú űrlapküldési
móddal. Ha van egy egyszerű űrlapunk, mely két szövegmezőt tartalmaz, akkor ezek elküldésekor
(method="GET" esetben) a feldolgozást végző PHP program az URL-ben kapja meg a
szövegmezőkbe beírt értékeket. Tegyük fel, hogy az egyik szövegmező azonosítója „nev” („Pista”
értékkel), a másik szövegmező azonosítója „cím” („Szeged” értékkel). Ekkor a feldolgozást végző PHP
program (legyen feldolgoz.php) az URL-ből kapja a megfelelő értékeket:
http://localhost/feldolgoz.php?nev=Pista&cím=Szeged
Az egyes azonosító = érték alakú párokat &-jel választja el egymástól. A PHP ezeket az
értékeket a $HTTP_GET_VARS asszociatív tömbben teszi számunkra elérhetővé:
print $HTTP_GET_VARS[nev]; Kiírja, hogy Pista
Ezen analógia alapján mi magunk is készíthetünk ilyen, az URL-hez fűzhető karakterláncokat, melyek
alkalmasak egyetlen látogatás állapotainak tárolására.
Lekérdező karakterláncok készítése
Az alapprobléma annak megoldása, hogy a szükséges karakterláncot olyan formára alakítsuk, hogy
az hozzáfűzhető legyen az URL-hez. Ehhez a beépített urlencode() függvény használhatjuk, mely
egy karakterláncot vár paraméterként és visszatérési értéke az átalakított karakterlánc. Ha például egy
weboldal címét szeretnénk átadni egy másik oldalnak (ezzel a megoldással), akkor a
urlencode("http://www.inf.u-szeged.hu");
visszatérési értéke:
http%3A%2F%2Fwww.inf.u-szeged.hu
amely már használható URL-hez fűzéshez.
Adat továbbítása lekérdező karakterláncok segítéségével – példa
[lekerkezo_karakterlancok.php]
Példaként tekintsük a következő programot, mely két változóból előállít egy lekérdező karakterláncot,
majd egy linken keresztül átadja egy másik oldalnak (egy másik PHP programnak), mely a
$HTTP_GET_VARS tömb segítéségével kiolvassa a megfelelő értékeket.
<html>
<head>
<title>Lekérdező karakterláncok tesztelése</title>
</head>
<body>
<?php
Itt létrehozzuk a két változót, amikből a lekérdező karakterláncokat fogjuk előállítani:
$weboldal = "http://www.inf.u-szeged.hu";
$id = "SZTE Informatikai Tanszékcsoport";
A következő kifejezés a „weboldal=” karakterlánchoz konkatenálja a $weboldal változóval
paraméterezett urlencode() függvény visszatérési értékét:
$lekerdez = "weboldal=".urlencode("$weboldal");
46
A következő kifejezés hozzáfűz egy „&” karaktert a lekérdező karakterlánchoz (jelezvén, hogy egy
újabb név-érték pár következik) és az $id változón ez előzővel megegyező lépéseket is végrehajtja,
azaz hozzáfűzi az „id=” karakterláncot és annak értékét, melyet most is az urlencode() függvény
kimenete szolgáltat.
$lekerdez .= "&id=".urldecode("$id");
47
A függvény megvalósítása:
function lekerdezo_gyart($tomb){
Az általánosságra törekszünk, melyet a következő két sor biztosít. Amennyiben a paraméterben kapott
tömb üres, akkor a jelenlegi lekérdező karakterlánccal térünk vissza (ezt a $QUERY_STRING változó
tartalmazza). Ezzel érhetjük el azt, hogy a függvényt bárhol a programon belül használva „sosem
rontjuk el” a lekérdező karakterláncot, mert ha valami miatt is üres lenne a paraméterben szereplő
tömb, akkor a függvény visszatérési értéke a jelenlegi lekérdező karakterlánccal teljesen megegyező,
attól változatlan lesz.
global $QUERY_STRING;
if ( ! $tomb ) return $QUERY_STRING;
Ha nem üres a tömb tartalma, elkezdjük annak feldolgozását.
$lek_string = "";
A foreach() a már megszokott módon bejárja a tömböt és az urlencode() függvénnyel
létrehozza a lekérdező karakterláncot:
foreach( $tomb as $kulcs => $ertek ){
if ( strlen( $lek_string ) ) $lek_string .= "&";
$lek_string .= urlencode( $kulcs ) . "=" . urlencode( $ertek );
}
return $lek_string;
}
Tesztelésként hozzunk létre egy asszociatív tömböt:
$EbbolGyartokLekerdezest =
array (
"nev" => "Balázs",
"web" => "http://www.inf.u-szeged.hu/~michnay",
"erdeklodes" => "Zene, Informatika, Filmek, stb..."
);
Az oldalon belül „bárhol” létrehozhatok egy linket, mely a fent létrehozott tömb átalakított változatát
kapja, mint lekérdező karakterláncot:
<A HREF="ertelmez.php?
<?php print
lekerdezo_gyart($EbbolGyartokLekerdezest)
?>">
Következő oldal
</A>
Az ertelmez.php persze most is a $HTTP_GET_VARS tömb segítségével jut hozzá a továbbított
adatokhoz.
48
Irodalom
Tartalomjegyzék a példákhoz
HTML PHP
Michnay Balázs
michnay@inf.u-szeged.hu
http://www.inf.u-szeged.hu/~michnay
2004
49