Teljes példa (második rész)

Az elõzõ órában felépítettük a klubok számára a bejegyzõ és karbantartó felületet,
amivel új klubok és rendezvények kerülhetnek a rendszerbe. Most az átlagos
felhasználók számára elérhetõ programokat kell elkészítenünk, melyek lehetõvé
teszik a listák böngészését.
Ebben az órában a következõket tanuljuk meg:
• Hogyan készítsünk olyan függvényeket, amelyek egyetlen lekérdezéssel
több táblából hívnak le adatokat?
• Hogyan készíthetünk a paramétereiktõl függõ SQL parancsokat végrehajtó
függvényeket?
• Hogyan menthetjük a felhasználó régebbi beállításait munkamenetf
üggvényekkel?
• Hogyan kell átalakítanunk az egyszerû szöveges adatokat, hogy
a HTML kódba írhassuk azokat?
Az eseménynaptár nyilvános oldalai
Miután a tagok bejegyeztethetik klubjaikat és az eseményeket, itt az ideje, hogy
az átlagos felhasználó számára is elérhetõ oldalak készítésébe fogjunk.
Ezek az oldalak a listák böngészésére és nem a bennük való keresésre szolgálnak
majd, bár nem lenne túl bonyolult ez utóbbit sem megvalósítani.
Ebben az órában négy oldalt készítünk el, amelyek lehetõséget adnak a felhaszná-
lónak, hogy kiírassa egy adott terület vagy téma rendezvényeit, bármilyen idõpont
szerinti szûréssel párosítva.
esemenyekinfo.php
Az esemenyekinfo.php oldal lehetõséget ad a rendszerben lévõ rendezvények
böngészésére. Bizonyos szempontból hasonlít az esemenylista.php oldalra,
amit az elõzõ órában tárgyaltunk, de nagyobb rugalmasságot és több információt
nyújt a felhasználónak.
24.1. program esemenyekinfo.php
1: 2: include("adatbazis.inc");
3: include("datum.inc");
4: include("kozosfv.inc");
5:
6: if ( isset($mitkelltenni) && $mitkelltenni ==
"esemenyLista" )
7: $munkamenet["esemenyek"] = $urlap;
8: elseif ( $munkamenet["esemenyek"] )
9: $urlap = $munkamenet["esemenyek"];
10: else
11: {
12: $datum_tomb = getDate( time() );
13: $munkamenet["esemenyek"]["terulet"] = "BÁRMELY";
14: $munkamenet["esemenyek"]["tipus"] = "BÁRMELY";
15: $munkamenet["esemenyek"]["honap"] = $datum_tomb["mon"];
16: $munkamenet["esemenyek"]["ev"] = $datum_tomb["year"];
17: }
18:
19: $idoszak = datumIdoszak(
$munkamenet["esemenyek"]["honap"],
20: $munkamenet["esemenyek"]["ev"] );
470 24. óra
24.1. program (folytatás)
21: function esemenyLista( )
22: {
23: global $idoszak, $munkamenet;
24:
25: $esemenyek = esemenyekLekeres( 0, $idoszak,
$munkamenet["esemenyek"]["terulet"],
26: $munkamenet["esemenyek"]["tipus"] );
27: if ( ! $esemenyek )
28: {
29: print "Nincs megjeleníthetõ esemény

";
30: return;
31: }
32: print "

\n";
33: print "\n";
34: print "\n";
35: print "\n";
36: print "\n";
37: print "\n";
38: foreach ( $esemenyek as $sor )
39: {
40: print "\n";
41: print "\n";
42: print "\n";
44: print "\n";
46: print "\n";
47: print "\n";
48: print "\n";
49: }
50: print "
DátumEseményKlubTerületTípus
".date("j M Y H.i",
$sor["edatum"])."
href=\"esemenyinfo.php?eazonosito=".
$sor["eazonosito"]."&".SID."\">".
43: html($sor["enev"])."
$sor["eklub"]."&".SID."\">".
45: html($sor["klubnev"])."
".$sor["teruletnev"]."".$sor["tipusnev"]."
\n";
51: }
52: ?>
53:
54:
55:
56: Esemény információk
Teljes példa (második rész) 471
24
24.1. program (folytatás)
57:
58:
59: 60: include("kozosnav.inc");
61: ?>
62:

Esemény információk


63:


64:


65: value="esemenyLista">
66: name=""
67: value="">
68:
71:
72:
75:
76:
80:
81:
85:
86:
87:

88:


89:
90: 91: esemenyLista( );
92: ?>
93:
94:
95:
472 24. óra
Szokás szerint az adatbazis.inc és a kozosfv.inc külsõ állományok beilleszt
ésével kezdjük. Amellett, hogy elérhetjük majd az ezekben tárolt függvé-
nyeket, biztosak lehetünk abban, hogy élõ adatbáziskapcsolattal rendelkezünk és
aktív munkamenettel dolgozhatunk.
Ezután ellenõrizzük, hogy érkezett-e ûrlapadat. Ezt a már ismert mitkelltenni
ûrlapelembõl származó $mitkelltenni változó vizsgálatával tehetjük meg.
Ha kitöltött ûrlap adatai érkeztek, azok elõnyt élveznek minden korábban elraktá-
rozott adattal szemben. Az elõzõ órában láthattuk, hogyan rendeltünk egy asszociat
ív tömböt a munkamenethez, hogy a belépett tag adatait nyilvántartsuk.
Ebben az órában új elemeket adunk ehhez, amelyek a felhasználó beállításait
tartalmazzák majd.
A $munkamenet változót a kozosfv.inc állományban rendeltük a munkamenethez
(mint azt már az elõzõ órában láttuk):
session_start();
session_register( "munkamenet" );
Most ezt a $munkamenet tömböt többdimenziós tömbbé alakítjuk, mivel
a $munkamenet["esemenyek"] tömbelemnek egy asszociatív tömböt adunk
értékül. Ebben a tömbben fogjuk tárolni a csak ehhez az oldalhoz tartozó beállítá-
sokat. Ezek a terület, típus, hónap és év értékek. Ha ûrlap adat érkezett, a korábbi
beállításokat ezzel írjuk felül.
Lehetséges, hogy a program futásakor éppen nem érkezett ûrlapinformáció, de
korábban már tároltuk a felhasználó által elõnyben részesített beállításokat.
Ebben az esetben a $mitkelltenni változó nincs beállítva, viszont
a $munkamenet["esemenyek"] tömb már tartalmaz elemeket. Ebben az esetben
az $urlap tömböt írjuk felül a korábban tárolt értékekkel. Ez biztosítja, hogy
az ûrlapban a megfelelõ beállítások látsszanak.
Ha a felhasználó nem küldött be ûrlap adatokat és korábban sem tároltuk a beállí-
tásait, nekünk kell alapértékekkel feltöltenünk a $munkamenet["esemenyek"]
tömböt. A getDate() beépített PHP függvényt használjuk arra, hogy elemeire
bontsuk a dátumot. A visszaadott tömb alapján állítjuk be
a $munkamenet["esemenyek"]["honap"] és
$munkamenet["esemenyek"]["ev"] elemeket az aktuális hónap
és év értékekre. Már tudjuk, hogy az év és hónap értékek érvényes adatot tartalmaznak,
akár ûrlapértékekbõl, akár korábbi beállításból, akár az aktuális dátumb
ól származnak. Ezeket az értékeket a datum.inc egy új függvényének,
a datumIdoszak() függvénynek adjuk át. Ez a függvény hónap és év paramétereket
vár és két idõbélyeggel tér vissza, megjelölve a hónap kezdetét és végét.
Teljes példa (második rész) 473
24
24.2. program Részlet a datum.inc fájlból
1: function datumIdoszak( $honap, $ev )
2: {
3: $eleje = mktime( 0, 0, 0, $honap, 1, $ev );
4: $vege = mktime( 0, 0, 0, $honap+1, 1, $ev );
5: $vege--;
6: return array( $eleje, $vege );
7: }
A függvény által visszaadott tömböt az $idoszak globális változónak adjuk
értékül.
Létrehozunk egy új esemenyLista() függvényt, amely a megfelelõ esemé-
nyekrõl ír majd információkat a böngészõbe. Ezt késõbb a HTML törzsrészében
hívjuk meg.
Ahhoz, hogy az események listáját megkapjuk, az esemenyekLekeres()
függvényt használjuk, amely az adatbazis.inc állományban található. Ezzel
a függvénnyel érintõlegesen már az elõzõ órában is találkoztunk, de kevés jó tulajdons
ágát ismerhettük meg.
24.3 program Részlet az adatbazis.inc fájlból
1: function esemenyekLekeres( $kazonosito=0, $idoszak=0,
$terulet=0, $tipus=0 )
2: {
3: global $kapcsolat;
4: $lekeres = "SELECT klubok.klubnev, esemenyek.*,
teruletek.terulet as teruletnev,
tipusok.tipus as tipusnev ";
5: $lekeres .= "FROM klubok, esemenyek, teruletek,
tipusok WHERE ";
6: $lekeres .= "klubok.azonosito=esemenyek.eklub
7: AND esemenyek.eterulet=teruletek.azonosito
8: AND esemenyek.etipus=tipusok.azonosito ";
9: if ( ! empty( $kazonosito ) && $kazonosito
!="BÁRMELY" )
10: $lekeres .= "AND esemenyek.eklub=
'$kazonosito' ";
11: if ( ! empty($idoszak) )
474 24. óra
24.3 program (folytatás)
12: $lekeres .= "AND esemenyek.edatum
>= '$idoszak[0]' AND
esemenyek.edatum
<='$idoszak[1]' ";
13: if ( ! empty($terulet) && $terulet != "BÁRMELY" )
14: $lekeres .= "AND
esemenyek.eterulet='$terulet' ";
15: if ( ! empty($tipus) && $tipus != "BÁRMELY" )
16: $lekeres .= "AND esemenyek.etipus='$tipus' ";
17: $lekeres .= "ORDER BY esemenyek.edatum";
18: $eredmeny = mysql_query( $lekeres, $kapcsolat );
19: if ( ! $eredmeny )
20: die ( "esemenyLekeres hiba: ".mysql_error() );
21: $vissza = array();
22: while ( $sor = mysql_fetch_array( $eredmeny ) )
23: array_push( $vissza, $sor );
24: return $vissza;
25: }
A függvény neve nem igazán fejezi ki sokoldalúságát. Négy paramétert vár:
egy klubazonosítót, egy két idõbélyeget tartalmazó tömbbõl álló idõszakot,
egy terület- és egy típuskódot. Minden paramétere elhagyható vagy hamis, illetve
üres értékkel helyettesíthetõ.
A függvény lényegében egy SQL kérést állít össze a paraméterek alapján. A lekérés
alapvetõen összekapcsolja az adatbázisban lévõ táblákat, ezzel biztosítva, hogy
a klubnév, területnév és típusnév mezõk is elérhetõk legyenek az eredménytábl
ában.
$lekeres = "SELECT klubok.klubnev, esemenyek.*,
teruletek.terulet as teruletnev,
tipusok.tipus as tipusnev ";
$lekeres .= "FROM klubok, esemenyek, teruletek,
tipusok WHERE ";
$lekeres .= "klubok.azonosito=esemenyek.eklub
AND esemenyek.eterulet=teruletek.azonosito
AND esemenyek.etipus=tipusok.azonosito ";
Ezután a függvény további feltételeket ad ehhez, attól függõen, hogy a megfelelõ
függvényparaméter be van-e állítva. A $tipus és $terulet paraméterek akkor is
figyelmen kívül maradnak, ha a "BÁRMELY" karakterláncot tartalmazzák.
Teljes példa (második rész) 475
24
A gyakorlatban ez azt jelenti, hogy minél több paramétert kap a függvény,
annál szûkebb eredménytáblát fogunk kapni. Ha nem adunk át semmilyen param
étert, az összes esemény információit megkapjuk. Ha csupán
egy $kazonosito paramétert adunk meg, csak az adott klubhoz tartozó esemé-
nyeket kapjuk vissza. Ha csak a második $idoszak paramétert adjuk meg,
csak az adott idõszakba esõ rendezvényeket láthatjuk és így tovább.
Végül a függvény az SQL parancsot végrehajtja és egy kétdimenziós tömbbel
tér vissza, amely a kiválasztott események részleteit tartalmazza.
Miután a függvény által visszaadott kétdimenziós tömböt az $esemenyek változó-
ba helyeztük, végig kell lépkednünk annak elemein. Az edatum elemeket felhaszn
álva kiírjuk a formázott dátumokat a date() beépített függvény segítségével.
Ezután egy hivatkozást készítünk az esemenyinfo.php oldalra, ahol több inform
áció érhetõ el egy rendezvényrõl. Ehhez az esemény azonosítóját és a SID álland
ót kell átadnunk. Ebben a ciklusban egy újabb HTML hivatkozást is készítünk
a klubinfo.php oldalra, a klub azonosítójával és a SID állandóval, végül kiírjuk
a terület- és típusneveket a böngészõbe.
Talán feltûnt az elõzõ órában, hogy egy html() nevû függvényt használtunk arra,
hogy szöveges adatokat írjunk ki a böngészõbe. Az esemenyLista() függvényben,
ahogy az események információin végiglépkedünk, ismét a html() függv
ényt hívjuk meg. Ez az általunk írt függvény a kozosfv.inc állományban találhat
ó. Egy karakterláncot vár és annak böngészõbe íráshoz alkalmassá tett,
átalakított változatával tér vissza. A különleges karakterek HTML elemekké alakulnak,
az újsor karakterek például
-é.
24.4. program Részlet a kozosfv.inc fájlból
1: function html( $szoveg )
2: {
3: if ( is_array( $szoveg ) )
4: {
5: foreach ( $szoveg as $kulcs=>$ertek )
6: $szoveg[$kulcs] = htmlszoveg( $ertek );
7: return $szoveg;
8: }
9: return htmlszoveg( $szoveg );
10: }
11:
476 24. óra
24.4. program (folytatás)
12: function htmlszoveg( $szoveg )
13: {
14: $szoveg = htmlspecialchars( $szoveg );
15: $szoveg = nl2br( $szoveg );
16: return $szoveg;
17: }
Látható, hogy ez valójában nem egy, hanem két függvény. A html() egy karakterl
áncot vagy egy tömböt vár paraméterül. Ha tömböt kap, végiglépked rajta,
átalakítva minden elemet, egyéb esetben magát a kapott karakterláncot alakítja át.
A tényleges átalakítás egy másik függvényben, a htmlszoveg()-ben valósul
meg, amely két beépített függvényt alkalmaz a kapott karakterláncra.
A htmlspecialchars() minden karaktert, ami nem jelenne meg helyesen
a HTML kódban, a hozzá tartozó HTML elemre cserél. Az nl2br() minden újsor
karaktert
sortöréssel helyettesít.
Visszatérve az esemenyekinfo.php oldalra, miután beállítottuk az alapadatokat és
létrehoztuk az események kiírására szolgáló függvényt, már csak annyi van hátra,
hogy egy ûrlapot biztosítsunk a felhasználónak, amely lehetõséget ad a lista szûkíté-
sére, illetve bõvítésére.
A felhasználónak választási lehetõséget adó ûrlap egyszerûen elkészíthetõ
az elõzõ órában megismert függvényekkel, melyek közvetlenül OPTION HTML
elemeket írnak ki a böngészõbe.
Az esemenyekinfo.php egy lehetséges kimenetét a 24.1. ábra mutatja.
Teljes példa (második rész) 477
24
24.1. ábra
Az esemenyekinfo.php
kimenete
klubokinfo.php
A felhasználó jogos igénnyel nem csak rendezvények, hanem klubok szerint is
ki szeretné íratni az adatbázis adatait, típus vagy terület szerint szûkítve azokat.
A klubokinfo.php oldal ezt az igényt elégíti ki.
24.5. program klubokinfo.php
1: 2: include("adatbazis.inc");
3: include("datum.inc");
4: include("kozosfv.inc");
5: if ( isset($mitkelltenni) &&
$mitkelltenni == "klubLista" )
6: $munkamenet["klubok"] = $urlap;
7: elseif ( $munkamenet["klubok"] )
8: $urlap = $munkamenet["klubok"];
9: else
10: {
11: $munkamenet["klubok"]["terulet"] = "BÁRMELY";
12: $munkamenet["klubok"]["tipus"] = "BÁRMELY";
13: }
14: function klubLista( )
15: {
16: global $munkamenet;
17: $klubok = klubokLekeres
( $munkamenet["klubok"]["terulet"],
18: $munkamenet["klubok"]["tipus"] );
19: if ( ! $klubok )
20: {
21: print "Nincs megjeleníthetõ klub

\n";
22: return;
23: }
24: print "

\n";
25: print "\n";
26: print "\n";
27: print "\n";
28: foreach ( $klubok as $sor )
29: {
30: print "\n";
478 24. óra
24.5. program (folytatás)
31: print "\n";
33: print "\n";
34: print "\n";
35: print "\n";
36: }
37: print "
KlubTerületTípus
href=\"klubinfo.php?[kazonosito]=".
$sor["azonosito"]."&".SID."\">".
32: html($sor["klubnev"])."
$sor["teruletnev"]$sor["tipusnev"]
\n";
38: }
39: ?>
40:
41:
42: Klub információk
43:
44:
45: 46: include("kozosnav.inc");
47: ?>
48:


49:

Klub információk


50:


51:


52: value="klubLista">
53: 54: value="">
55:
59:
63:
64:

Teljes példa (második rész) 479
24
24.5. program (folytatás)
65:


66: 67: klubLista( );
68: ?>
69:
70:
Láthatjuk, hogy ez a program szerkezetében és logikájában igencsak hasonlít
az elõzõ példában szereplõre. Az ehhez az oldalhoz tartozó „memória” azonban
a $munkamenet["klubok"] tömbbe kerül. Ha ûrlapadatok érkeznek, azokkal
írjuk felül a korábbi tartalmát, ha nem érkezett ûrlap és már be van állítva, akkor
az $urlap tömböt írjuk felül a $munkamenet["klubok"] változóval. Ha egyik
feltétel sem teljesül, alapértékekkel töltjük fel.
Egy klubLista() függvényt hozunk létre, amelyben az adatbazis.inc
egy új függvényét, a klubokLekeres()-t hívjuk meg. Ez a függvény a klub
területére, illetve típusára vonatkozó elhagyható paramétereket vár.
24.6. program Részlet az adatbazis.inc fájlból
1: function klubokLekeres( $terulet="", $tipus="" )
2: {
3: global $kapcsolat;
4: $lekeres = "SELECT klubok.*, teruletek.terulet
as teruletnev, tipusok.tipus
as tipusnev ";
5: $lekeres .= "FROM klubok, teruletek,
tipusok WHERE ";
6: $lekeres .= "klubok.terulet=teruletek.azonosito
AND klubok.tipus=tipusok.azonosito ";
7: if ( $terulet != "BÁRMELY" &&
! empty( $terulet ) )
8: $lekeres .= "AND klubok.terulet=’$terulet’ ";
9: if ( $tipus != "BÁRMELY" && ! empty( $tipus ) )
10: $lekeres .= "AND klubok.tipus='$tipus' ";
11: $lekeres .= "ORDER BY klubok.terulet,
klubok.tipus, klubok.klubnev";
12: $eredmeny = mysql_query( $lekeres, $kapcsolat );
13: if ( ! $eredmeny )
14: die ( "klubokLekeres hiba: ".mysql_error() );
480 24. óra
24.6. program (folytatás)
15: $vissza = array();
16: while ( $sor = mysql_fetch_array( $eredmeny ) )
17: array_push( $vissza, $sor );
18: return $vissza;
19: }
A klubokLekeres() függvény paraméterei függvényében dinamikusan állít elõ
egy SQL utasítást. Alapesetben csupán összekapcsolja a klubok, teruletek és
tipusok táblákat. Ha üres karakterláncon és a "BÁRMELY" karaktersorozaton kí-
vül bármi mást kap a $terulet vagy $tipus paraméterekben, tovább szûkíti
az eredménytáblát a WHERE feltételhez adott újabb elemekkel. Végül egy kétdimenzi
ós tömbbel tér vissza.
A klubokinfo.php oldalon végiglépkedünk ezen a tömbön, kiírva
a teruletnev és tipusnev értékeket is a böngészõ számára. Mint eddig,
a klub neve most is egy hivatkozásban szerepel, amely a klubinfo.php
oldalra mutat.
klubinfo.php
A klubinfo.php oldal lehetõséget ad egyetlen klub minden adatának megtekint
ésére. Hivatkozások segítségével juthat ide a felhasználó, akár
az esemenyekinfo.php, az esemenyinfo.php vagy a klubokinfo.php
oldalakról is. Az oldalt az eddig megismert megoldások és függvények segítsé-
gével építhetjük fel, amint az alábbi kód mutatja.
24.7. program klubinfo.php
1: 2: include("adatbazis.inc");
3: include("kozosfv.inc");
4: if ( ! isset($kazonosito) )
5: header( "Location: klubokinfo.php?".SID );
6: $klub = klubLekeres( $kazonosito );
7:
8: $klub = html( $klub );
9: if ( $klub["email"] != "" )
10: $klub["email"] = "">".$klub["email"]."";
Teljes példa (második rész) 481
24
24.7. program (folytatás)
11: function klubEsemenyei ()
12: {
13: global $kazonosito;
14: $esemenyek = esemenyekLekeres( $kazonosito );
15: if ( ! $esemenyek )
16: {
17: print "Nincs megjeleníthetõ esemény

";
18: return;
19: }
20: print "

\n";
21: print "\n";
22: print "\n";
23: print "\n";
24: print "\n";
25: foreach ( $esemenyek as $sor )
26: {
27: print "\n";
28: print "\n";
29: print "\n";
30: print "\n";
31: print "\n";
32: print "\n";
33: }
34: print "
DátumEseményTerületTípus
".date("j M Y H.i",
$sor["edatum"])."
href=\"esemenyinfo.php?eazonosito=".
$sor["eazonosito"]."&".SID."\">".htm
l($sor["enev"])."
".$sor["teruletnev"]."".$sor["tipusnev"]."
\n";
35: }
36: ?>
37:
38:
39: Klub részletek
40:
41:
42: 43: include("kozosnav.inc");
44: ?>
45:


46:

Klub részletek


47:


482 24. óra
24.7. program (folytatás)
48:


49: Terület:
50:

51: Típus:
52:

53: Email:
54:


55: Ismertetõ:

56:
57:

58: 59: klubEsemenyei();
60: ?>
61:
62:
A program egy $azonosito paramétert vár, amely egy klub azonosítószámát kell,
hogy tartalmazza. Ha az oldal nem kapott ilyen paramétert, a felhasználót
a klubokinfo.php oldalra küldjük. A klub adatainak kiderítésére egy új
adatbazis.inc függvényt, a klubLekeres()-t alkalmazzuk. Ez a függvény
egy klubazonosítót vár és egy tömböt ad vissza:
24.8. program Részlet az adatbazis.inc fájlból
1: function klubLekeres( $kazonosito )
2: {
3: global $kapcsolat;
4: $lekeres = "SELECT klubok.*, teruletek.terulet
as teruletnev, tipusok.tipus
as tipusnev ";
5: $lekeres .= "FROM klubok, esemenyek, teruletek,
tipusok WHERE ";
6: $lekeres .= "klubok.terulet=teruletek.azonosito
7: AND klubok.tipus=tipusok.azonosito
8: AND klubok.azonosito='$kazonosito'";
9: $eredmeny = mysql_query( $lekeres, $kapcsolat );
10: if ( ! $eredmeny )
11: die ( "klubLekeres hiba: ".mysql_error() );
12: return mysql_fetch_array( $eredmeny );
13: }
Teljes példa (második rész) 483
24
A klub adatainak megszerzésére a sorLekeres() függvényt is használhattuk
volna. Azért készítettünk mégis egy célfüggvényt erre a feladatra, mivel így
az eredménytábla a teruletnev és tipusnev elemeket is tartalmazza majd.
Ezt a klubok, teruletek és tipusok táblák összekapcsolásával érhetjük el.
A klubLekeres()által visszaadott tömböt a $klub változóban tároljuk,
tartalmát pedig a HTML törzsrészében írjuk ki a böngészõ számára. Az oldalon
létrehozunk még egy klubEsemenyei() nevû függvényt is, amely a klubhoz
tartozó események kiírását végzi, felhasználva az esemenyekLekeres() néven
korábban létrehozott függvényünket. A klubinfo.php egy lehetséges kimenetét
a 24.2. ábra mutatja.
esemenyinfo.php
Az esemenyinfo.php az utolsó oldal, amit az alkalmazáshoz el kell készíten
ünk. Erre az oldalra bármely eseményinformációkat adó lapról el lehet jutni
egy hivatkozás segítségével. Az oldal minden információt megad
az $eazonosito segítségével kiválasztott eseményrõl.
484 24. óra
24.2. ábra
A klubinfo.php kimenete
24.9. program esemenyinfo.php
1: 2: include("adatbazis.inc");
3: include("kozosfv.inc");
4: if ( ! isset($eazonosito) )
5: header( "Location: esemenyeklista.php?".SID );
6: $esemeny = esemenyLekeres( $eazonosito );
7: html( $esemeny );
8: ?>
9:
10:
11: Esemény részletei
12:
13:
14: 15: include("kozosnav.inc");
16: ?>
17:


18:

Esemény részletei


19:


20:


21: Klub:
22:
23: $esemeny["eklub"]."&".SID."\">
24: $esemeny["klubnev"]"
25: ?>
26:

27:

28: Terület:
29:

30: Típus:
31:


32: Ismertetõ:

33:
34:
35:
Az eddigiek után ez az oldal már elég egyszerûnek látszik. Egyetlen új függvénnyel
találkozhatunk, az adatbazis.inc állomány esemenyLekeres() függvényével.
Ennek segítségével kapjuk meg az adott $eazonosito-hoz tartozó esemény részleteit.
Miután ezek egy tömbben rendelkezésre állnak, már csak ki kell írnunk azokat
a böngészõbe.
Teljes példa (második rész) 485
24
Az esemenyLekeres() függvényt a 24.10. példában láthatjuk. Tulajdonképpen
csupán egy egyszerû SQL lekérésbõl áll, amely a klubok és az esemenyek
táblákat kapcsolja össze.
24.10. program Részlet az adatbazis.inc fájlból
1: function esemenyLekeres( $eazonosito )
2: {
3: global $kapcsolat;
4: $lekeres = "SELECT klubok.klubnev as klubnev,
esemenyek.*, teruletek.terulet
as teruletnev, tipusok.tipus
as tipusnev ";
5: $lekeres .= "FROM klubok, esemenyek, teruletek,
tipusok WHERE ";
6: $lekeres .= "klubok.azonosito=esemenyek.eklub
7: AND esemenyek.eterulet=teruletek.azonosito
8: AND esemenyek.etipus=tipusok.azonosito
9: AND esemenyek.eazonosito='$eazonosito'";
10: $eredmeny = mysql_query( $lekeres, $kapcsolat );
11: if ( ! $eredmeny )
12: die ( "esemenyLekeres hiba: ".mysql_error() );
13: return mysql_fetch_array( $eredmeny );
14: }
A jövõ
Mostanra elkészültünk a teljes rendezvénynaptárral. Remélem sikerült érzékeltetni
ezzel a valós életbeli kisalkalmazások dinamikus kialakításának lehetõségeit és
a PHP szerteágazó képességeit.
Különösen érdemes megfigyelni, mennyire megkönnyítik munkánkat a PHP 4
munkameneteket kezelõ függvényei, mivel ezek használatával igen egyszerû
az adatok megõrzése kérésrõl kérésre .Ha a felhasználónk a munkamenet során
késõbb visszatér mondjuk az esemenyekinfo.php oldalra, pontosan azokat
a beállításokat fogja találni, mint amelyeket legutóbb otthagyott. A munkamenetf
üggvények nélkül feltehetõen sokkal több információt kellett volna kérésrõlk
érésre átadnunk oldalainknak az URL-ekben.
486 24. óra
Bár az eseménynaptár bizonyos megközelítésbõl teljesnek tekinthetõ, mindazon
által csak egy jó prototípus, amit meg tudunk mutatni a megrendelõnek, ahogy
haladunk a munkával. Az alkalmazás hasznára válna néhány további szolgáltatás,
különösképpen egy kulcsszavas keresés. Kellemes lenne lehetõséget adni a látogat
óknak, hogy megjegyzéseket fûzhessenek a rendezvényekhez. Ez új dimenziót
nyitna az alkalmazás számára, igazán érdekes környezetté alakítva azt.
Lehetõséget adhatnánk a tagok számára, hogy képekre mutató hivatkozásokat
helyezzenek el a klubok ismertetõiben. Akár azt is megoldhatnánk, hogy képeket
tölthessenek fel böngészõjük segítségével.
A tagok feltehetõen örülnének, ha az eseményeket lemásolhatnák vagy a rendezv
ények ismétlõdõ jellegét is kezelhetnék.
Mielõtt az alkalmazást átnyújtanánk a megbízónak, szükségünk lesz egy karbantart
ó felületre, amely alkalmas arra, hogy egy technikailag képzetlen adminisztr
átor is módosíthasson vagy törölhessen tagokat, illetve az eseményeket, valamint
a terület- és típuskategóriákat megváltoztathassa.
Valószínûleg feltûnt már, hogy programjaink kimenete eléggé spártai. Végül át kell
adnunk a munkát egy grafikus tervezõnek, aki ügyes vezérlõsávot, komoly grafik
át és más elemeket ad az oldalhoz. Szerencsére a legtöbb PHP kód külsõ állomá-
nyokban található, a HTML-tõl függetlenül, de elképzelhetõ, hogy szükség lesz
ránk is a ciklusok újraírásánál.
Összefoglalás
Ebben és az elõzõ órában elkészítettünk egy teljesen mûködõ többoldalas PHP
alkalmazást. Gyakoroltuk az állapot mentésének, a felhasználói azonosításnak,
az adatbázis-adatok módosításának és megjelenítésének módjait és sok más
kérdést is érintettünk.
Egy többoldalas alkalmazás végigvitele egy könyvben nem könnyû dolog, de
megéri a kitartást. Olyan kérdésekre adtunk válaszokat, olyan problémákat oldottunk
meg, amelyekkel munkánk során idõrõl idõre találkozni fogunk. Majdnem
minden programnak, amit írunk, egynél több felhasználó kéréseit kell majd
egyidõben kiszolgálnia, tehát ügyes megoldásokra van szükség az állapotok
mentésére.
Teljes példa (második rész) 487
24
Kérdések és válaszok
Ennyi volt. Hogyan tovább?
Ez már nem a könyvön múlik. Elég információt találhatunk ebben a könyvben
ahhoz, hogy saját kifinomult alkalmazásainkat el tudjuk készíteni. Ezzel és
a Világhálón elérhetõ rengeteg információval nincs, ami megállíthatna bárkit is
a fejlõdésben!
Mûhely
A mûhelyben kvízkérdések találhatók, melyek segítenek megszilárdítani az órában
szerzett tudást. A válaszokat az A függelékben helyeztük el.
Kvíz
1. Melyik függvény használható új elem tömb végére való beszúrásához?
2. Lehetséges egy új elem felvétele a tömb végére függvény használata nélkül is?
3. Melyik függvény alkalmazható a különleges karakterek átalakítására HTMLki
írás céljából?
4. Melyik függvény alakítja át az újsor karaktereket
elemekké?
5. A SID állandó a munkamenet-azonosító oldalról-oldalra küldéséhez hivatkoz
ások készítésénél használható. Hogyan érhetõ el ugyanez a hatás ûrlap
készítésekor?
Feladatok
1. Tekintsünk végig az órában tárgyalt forráskódokon. Találunk olyan megoldá-
sokat, amiket fel tudunk használni saját programjainkban?
2. Lapozzuk át a könyvet és jegyzeteinket, ha írtunk ilyeneket. Jusson késõbb
eszünkbe, hogy érdemes kis idõ elteltével újra átnézni a jegyzeteket, hogy
minél több hasznunk legyen a befektetett munkából.