Eszterházy Károly F®iskola Matematikai és Informatikai Intézet
Dinamikus weboldalak fejlesztése Király Roland
Eger, 2010
Tartalomjegyzék 1. Bevezetés
4
1.1.
Tartalom kezel® rendszerek
. . . . . . . . . . . . . . . . . . .
4
1.2.
CMS telepítése
. . . . . . . . . . . . . . . . . . . . . . . . . .
5
1.3.
Ellen®rz® kérdések
. . . . . . . . . . . . . . . . . . . . . . . .
2. HTML és PHP használata
8
9
2.1.
Weboldalak programjának elkészítése . . . . . . . . . . . . . .
2.2.
Futtató környezet tesztelése
2.3.
Kezdeti lépések a programozáshoz
2.4.
Ellen®rz® kérdések
. . . . . . . . . . . . . . . . . . .
9 12
. . . . . . . . . . . . . . .
14
. . . . . . . . . . . . . . . . . . . . . . . .
18
3. A PHP nyelv alapjai
20
3.1.
Az output kezelése
. . . . . . . . . . . . . . . . . . . . . . . .
20
3.2.
Változók és adatok . . . . . . . . . . . . . . . . . . . . . . . .
24
3.3.
Összetett adatok
. . . . . . . . . . . . . . . . . . . . . . . . .
26
3.4.
Vezérl® szerkezetek . . . . . . . . . . . . . . . . . . . . . . . .
29
3.5.
Alprogramok
33
3.6.
Ellen®rz® kérdések
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4. Adatbázisok elérése PHP programokban
37
39
4.1.
DBMS rendszerek . . . . . . . . . . . . . . . . . . . . . . . . .
39
4.2.
Hozzáférés adatbázis kezel®khöz . . . . . . . . . . . . . . . . .
40
4.3.
Az els® kapcsolat . . . . . . . . . . . . . . . . . . . . . . . . .
40
4.4.
Saját függvények kapcsolódáshoz
. . . . . . . . . . . . . . . .
46
4.5.
Adatbázis kezel® modul készítése
. . . . . . . . . . . . . . . .
47
4.6.
Ellen®rz® kérdések
. . . . . . . . . . . . . . . . . . . . . . . .
54
5. Modulszerkezet
55
5.1.
Moduláris felépítés
. . . . . . . . . . . . . . . . . . . . . . . .
55
5.2.
Menükezelés . . . . . . . . . . . . . . . . . . . . . . . . . . . .
59
5.3.
A menükezel® rutinjai
. . . . . . . . . . . . . . . . . . . . . .
61
5.4.
Ellen®rz® kérdések
. . . . . . . . . . . . . . . . . . . . . . . .
64
1
6. Adatkezel® alkalmazások készítése
65
6.1.
Adatbevitel
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
65
6.2.
Adatfeldolgozás . . . . . . . . . . . . . . . . . . . . . . . . . .
69
6.3.
Adatok küldése és beszúrása adatbázisba . . . . . . . . . . . .
73
6.4.
Ellen®rz® kérdések
79
. . . . . . . . . . . . . . . . . . . . . . . .
7. Listák generálása
80
7.1.
Adatok megjelenítése listákban
. . . . . . . . . . . . . . . . .
80
7.2.
Ellen®rz® kérdések
. . . . . . . . . . . . . . . . . . . . . . . .
84
8. Fájlkezelés
86
8.1.
Fájlok feltöltése a szerverre
. . . . . . . . . . . . . . . . . . .
86
8.2.
Képek kezelése és méretezése
. . . . . . . . . . . . . . . . . .
89
8.3.
Ellen®rz® kérdések
. . . . . . . . . . . . . . . . . . . . . . . .
93
9. Weboldalak adminisztrációja
94
9.1.
Listák lapozása . . . . . . . . . . . . . . . . . . . . . . . . . .
94
9.2.
Rekordok törlése listából . . . . . . . . . . . . . . . . . . . . .
96
9.3.
Egyszer¶ jelszavas védelem . . . . . . . . . . . . . . . . . . . . 100
9.4.
Ellen®rz® kérdések
. . . . . . . . . . . . . . . . . . . . . . . . 103
10.Regisztráció és munkamenet indítás
10.1. Felhasználók nyomkövetése 10.2. Felhasználói regisztráció
103
. . . . . . . . . . . . . . . . . . . 103
. . . . . . . . . . . . . . . . . . . . . 107
10.3. Egyszer¶ capcha készítése
. . . . . . . . . . . . . . . . . . . . 109
10.4. Munkamenetek használata . . . . . . . . . . . . . . . . . . . . 116 10.5. Ellen®rz® kérdések
. . . . . . . . . . . . . . . . . . . . . . . . 120
11.Sz¶rés és keresés
121
11.1. Listák sz¶rése . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 11.2. Keresés az adatbázisban . . . . . . . . . . . . . . . . . . . . . 124 11.3. Ellen®rz® kérdések
. . . . . . . . . . . . . . . . . . . . . . . . 128
2
12.Kód újrahasznosítás
12.1. Alapelvek
129
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
12.2. Objektum alapú weboldal készítése . . . . . . . . . . . . . . . 131 12.3. Ellen®rz® kérdések
. . . . . . . . . . . . . . . . . . . . . . . . 137
Irodalomjegyzék
138
3
1. Bevezetés 1.1. Tartalom kezel® rendszerek Telepíthet® tartalomkezel® rendszerek. A tartalomkezel® rendszerek
terjedésével egyre inkább általánossá válik az a nézet, hogy weboldalak készítéséhez elegend® letölteni egy mások által erre a célra kifejlesztett CMS rendszert, majd, a szolgáltatónk által rendelkezésre bocsájtott tárhelyre másolni. Némi kongurálás után elindítható a weboldal és a felhasználók nyugodtan használhatják. Amennyiben nem akarjuk hosszú napokra a gépe elé szegezni magunkat, és programkódok gépelésével tölteni az id®t azért, hogy egy-két oldalnyi szöveget megjelenítsünk, vagy éppen blogot írjunk a nagyvilág számára, az el®re gyártott, Instant weboldalak kényelmes megoldást nyújtanak. Így van ez akkor, ha a CMS rendelkezik azzal a szolgáltatással, amire éppen használni szeretnénk. Mert ha nem, akkor talán jobb, ha mi írjuk meg azt a weboldalt, vagy modult, amire szükségünk van. És, ha ez nem elég, akkor is van még egy fontos szempont, ami miatt meg kell tanulnunk dinamikus weboldalakat készíteni. Tegyük fel magunknak azt a kérdést, hogy hogyan születnek a CMS rendszerek. Hogyan jönnek létre az Instant weboldalak. Bizonyosan nem úgy készülnek, hogy letöltünk az Internetr®l egy el®re legyártott CMS készít® CMS-t. Ha így lenne, akkor is fennállna az a dilemma, hogy ez a letölthet® CMS készít® hogyan jön létre. Akárhogyan is ragozzuk a dolgot, értenünk kell a programozáshoz, és számos esetben, mikor a CMS már nem elegend®, meg kell alkotnunk azokat a programokat, melyek kielégítik a felhasználók igényeit, mert akárhogy is tiltakozik ez ellen a programozók nagy családja, igenis a felhasználók támasztotta igények tartják életben és hajtják el®re ezt a tudományágat. Mi is az a Tartalom Kezel® Rendszer, vagy az angol rövidítés után CMS? Egy olyan félig elkészített weboldal, melyet némi konguráció, jelszó beállítás és egyéb kisebb trükkök segítségével néhány perc alatt be tudunk üzemelni. Egy általános CMS az alábbi elemeket tartalmazza:
4
Beléptet® rendszer Adminisztrációs felület a tartalom kezeléséhez Hírek menü és blog Képgaléria Kedvencek és RSS hírszolgáltatás Fórum (ez általában egy integrált küls® modul) Naptár és a hozzá tartozó szolgáltatások Eseménykezel® rendszer Az oldal küls® megjelenésének beállításai Egyéb, csak az adott CMS-re jellemz® speciális funkciók
Weboldalak készítésénél a fenti funkciók mindegyikének a m¶ködésével tisztában kell lennünk. Fontos, hogy ezeket a gyakorlatban is lássuk m¶ködni, mivel csak így tudunk hasonló modulokat készíteni. Ebben a jegyzetben a WordPress rendszerét fogjuk telepíteni. A választás azért erre a rendszerre esett, mert igen elterjed, másrészt pedig híres az öt perces telepít®jér®l.
1.2. CMS telepítése Els® lépésként le kell töltenünk a Word Press aktuális verzióját. Nem kell feltétlenül ezt a CMS-t választani. Amennyiben a kedves olvasó ragaszkodik egy másik rendszerhez, próbálkozzon azzal, vagy akár egyszerre többet is kipróbálhat. A Word Press esetén a letöltést a
http://wordPress.com weboldalon, a
letöltés pontra kattintva indíthatjuk el.
5
Telepít® használata. A telepítéshez szükségünk lesz egy szolgáltató által
a rendelkezésünkre bocsájtott tárhelyre, vagy telepítenünk kell egy olyan CMS rendszert, ami Webszerver, PHP futtató környezet és adatbázis tárhely szolgáltatásokat nyújt. Adatbázis kezel® rendszernek válasszunk SQL alapút, lehet®ség szerint MySQL alapokon m¶köd® rendszert. Ez azért fontos, mivel ebben a jegyzetben MySQL nyelv¶ lekérdezéseket használunk. Jelenleg az XAMP és a WAMP szerverek elterjedtek a programozók körében, így hát mi az XAMP egy verzióját alkalmazzuk. Vegyük észre, hogy a szerver oldali környezet kialakítását is egy Instant programmal oldjuk meg kockáztatva ezzel azt, hogy egy valódi szerver telepítését soha nem tanuljuk meg. Tehát, ha nem találtunk ingyenes szolgáltatót - aminek egyébként nagyon kicsi az esélye -, akkor töltsük le a
http://xamp.org
weboldalról az XAMP
egy változatát, majd telepítsük. (Windows esetén a telepít®ben való némi kattingatás után rendelkezésre is áll a webszolgáltatás. Linux operációs rendszer esetén mindképpen olvassuk el a telepítésr®l szóló fájlt miel®tt hozzálátunk a munkához. Egyébként a Linux változat beüzemelése sem tart tovább néhány percnél. Miután elindítottuk a webszervert, csak annyi dolgunk marad, hogy a Word Press fájljait bemásoljuk a
htdocs könyvtárba. Ez az alapértelmezett
könyvtár, mely a weboldalainkat tárolja az XAMP rendszerben, de változhat a konguráció során. Indítsuk el a program telepít®jét a kedvenc böngész®nkben. A program elkéri az adatbázishoz tartozó felhasználó nevet és jelszót, Meg kell még adnunk az oldal adminisztrátorának a nevét és jelszavát, valamint néhány olyan információt, amit a program nem tud kitalálni. (ha ezeket is ki tudná találni, talán nem is kellene hozzá felhasználó.. ). Ahogy elkészültünk a telepítéssel, a program tájékoztat minket err®l és mindjárt el is kezdhetjük az oldalunk nomhangolását. Beállíthatjuk a küls® megjelenésre vonatkozó paramétereket, és a nyelvet. Felvehetjük a felhasználóinkat, akik a leend® oldalunkat használhatják, átszervezhetjük a modulokat, és mindent olyat megtehetnünk, amit az oldal
6
megenged a számunkra - komolyabb rendszerek esetén már a fogd és vidd technika segítségével is. Ennyi az egész. Ha a program
README fájljában leírtak szerint jártunk el,
programozás nélkül készítettünk el egy m¶köd®képes weboldalt, mely fel van vértezve az Interneten elterjedt modulok mindegyikével. Sajnos ez az oldal nem igazán alkalmas speciális feladatok ellátására, vagyis csak azt tudja, amit a programozói beépítettek a rendszerbe.
A rendszer továbbfejlesztése. A frissen telepített weboldal használata,
kongurálása nagyon kényelmes és egyszer¶, de problémáink támadhatnak, ha szeretnénk valami különlegeset. Amennyiben az oldalt egy felhasználónknak készítettük - zetett is a programért - akinek eszébe jut, hogy szüksége volna saját funkciókra a programjában, melyet az általunk telepített CMS nem tartalmaz, nehéz helyzetbe kerülhetünk. A gyakorlott programozó ilyenkor átnézi a forráskódot és ha szerencséje van, sikerül átalakítania a programot úgy, hogy a kért funkció integrálására lehet®vé váljon. Számos CMS tartalmazza a lehet®séget a továbbfejlesztésre, de ez soha nem olyan egyszer¶, mintha saját programjainkat alakítanánk át. Meg kell értenünk más programozók forráskódjait és át kell alakítanunk úgy, hogy ne rontsuk el az eredeti funkciókat, de az újakat integrálni tudjuk. Ez nehéz feladat gyakorlott programozók számára is. Természetesen ett®l még a CMS rendszerek nem rosszak, és nyugodtan használhatjuk ®ket. Nagyon jók ezek a szoftverek, de mindig csak arra a meghatározott célra, amire készítették ®ket. Ezt szem el®tt tartva gondoljuk át, hogy az adott rendszer megfelel-e a számunkra hosszabb távon is. Ha igen, akkor bátran alkalmazzuk, ha viszont nem vagyunk ebben biztosak, inkább fogjunk bele a fejlesztésbe. Ez a jegyzet ebben nyújt segítséget, mivel bevezeti az olvasót a dinamikus weboldalak programozásának tudományába, és lépésr®l lépésre bemutatja a CMS rendszerek csak a fejleszt®k által ismert világát.
7
1.3. Ellen®rz® kérdések 1. Mit jelent a dinamikus jelz® a weboldalak világában? 2. Milyen komponenseket tartalmaz a webszerver, ha adatbázis alapú, PHP kódú weboldalakat futtatunk rajta? 3. Milyen feladatokat lát el a webszerver? 4. Lehet-e módosítani a webszerverek kongurációját? 5. Mit jelent a CMS szó? 6. Mi az el®nye a modulokra bontás technikájának? 7. Mit jelent a moduláris felépítés weboldalak esetén? 8. Milyen protokoll segítségével futnak a weboldalak? 9. Mi a webszerver feladata a PHP programok futtatása esetén? 10. Hogyan lehet publikus domain címhez jutni? 11. Milyen f®bb funkciói vannak egy CMS alapú rendszernek?
animaciok/TAMOPweb0006.avi animaciok/TAMOPweb0007.avi
8
2. HTML és PHP használata 2.1. Weboldalak programjának elkészítése Ahhoz, hogy weboldalakat tudjunk szerkeszteni, ismernünk kell a HTML nyelv alapjait. Tudnunk kell formázni a programok kimenetét, vagyis a webböngész®ben megjelen® tartalmat. A HTML nyelv használható szövegek, táblázatok, és képek esztétikus megjelenítésére. Segítségével képesek vagyunk deniálni a karakter kódolást, a különleges karaktereket, valamint utasítani tudjuk a kliens oldali böngész® programot, hogy ne az alapértelmezett formázási beállításokat használja. Lehet®ségünk nyílik egyedi megjelenés¶ oldalak készítésére. A weboldal tulajdonosára jellemz® színvilág és tartalom megjelenítésére. Sajnos a HTML nyelv nem alkalmas arra, hogy az interakciókat kezelni tudja. HTML forrásszövegekben nem tudunk szelekciót, iterációt szervezni. Nem tudunk adatbázisokhoz kapcsolódni, vagy függvényeket, eljárásokat készíteni. A pusztán HTML nyelven elkészített weboldalak hátránya, hogy statikus m¶ködés¶ek, ami azt jelenti, hogy a weboldalon megjelen® szöveg, kép és egyéb információ nem változik meg csak akkor, ha az oldal készít®je átírja a HTML fájlokat szövegszerkeszt® segítségével. Gondoljunk bele abba, hogy ez mit jelentene egy valuta árfolyamokat és azok változásait leíró grakonokat tartalmazó weboldal esetén. A feladat megoldása szinte lehetetlen. Változó tartalom kezeléséhez, vagy interakció kezeléséhez mindenképpen szükség van programozási nyelvre és programra. Szükség van továbbá adatbázisokra - az adatok tárolásához - és elágazásokra, ciklusokra, függvényekre, valamint eljárásokra. A programok futtatásához futtató rendszert kell telepíteni, mely képes a szövegszerkeszt®ben megírt forrásszöveg helyességét ellen®rzi, fordítani és futtatni. A programok, forráskódok védelme is fontos feladat, mivel a weboldalak tartalmát a felhasználók letöltik a számítógépükre. A letöltött szöveget az operációs rendszerre telepített böngész® program értelmezi és futtatja, vagyis
9
megjeleníti a bennük tárolt és leírt információt. A böngész® program b®vítmények segítségével kezeli a kép és hangfájlokat, képes a
Flash és a JavaScript alapú programok futtatására. PHP,
vagy más programozási nyelveken írt forráskódok futtatására viszont nem képes, de erre nincs is szüksége. Senki nem várja el a felhasználótól, hogy
PHP alapú oldalak futtatásához
letöltse a számítógépére a nyelv fordítóprogramját, kongurálja a futtató környezetet, tesztelje azt, majd javítsa a felmerül® hibákat. A PHP nyelv használata esetén a weboldalak programja szervereken fut. A szerver üzemeltet®je kongurálja a futtatási környezetet és az adatbázis kezel® rendszert. Ez több szempontból is jobb így, mint a kliens oldali programok használata esetén. A forrásszövegek szerver oldali fordítása és futtatása komoly er®forrás megtakarítást eredményez a kliens számítógépeken. Az adatok tárolása is a szerveren történik, ami az er®forrásokkal való gazdálkodást tekintve szintén nem elhanyagolható, nem beszélve a biztonságról. A programok forráskódja nem látható a kliens számítógépeken, mivel oda csak a programok eredménye, vagyis az el®állított HTML tartalom kerül letöltésre. A programok biztonságos futtatása egyszer¶bb feladat, mivel a forráskód és a forráskód logikája nem látható az ártó szándékú felhasználók számára. Az 2.1 ábra bemutatja a kliens és a szerver oldal m¶ködését.
PHP programok beágyazása. A PHP programok szervereken futnak, a
HTML szöveget viszont a kliens számítógép értelmezi. Az adatok a szerveren tárolódnak, de a kliens számítógépeken jelennek meg. Ez els® látásra ellentmondásosnak t¶nik. A forráskód különböz® részei különböz® helyeken, más-más alkalmazások segítségével futnak, viszont a forráskódot egy fájlban is tárolhatjuk. A legtöbb fordítóprogram, valamint a futtató környezet egyaránt képes detektálni a számára értelmezhet® forrásszöveget, így a PHP programokat is tetszés szerint be lehet ágyazni HTML forrásba.
10
2.1. ábra.
Kliens szerver kapcsolat
echo
" Jelenlegi
regisztrált
felhasználó
:
".
$regUser ;
?>
2.1. program.
PHP beágyazása HTML forrásszövegbe
Történhet ez pontosan fordítva is. PHP programokban is generálhatunk HTML kimenetet a számítógépek böngész®je számára.
11
for
( $ i =0;
$ i <10;
$ i ++)
{ echo
"
" ; }
2.2. program.
PHP programból generált HTML kód
Vagy teljesen külön is választhatjuk a programokat és a HTML kódot. Mindegy hogyan járunk el, a lényeg, hogy a programjainkat a megfelel® módon és megfelel® méret¶ modulokba szervezzük, mert a jó tagolású és felépítés¶ programot könnyebb átalakítani, vagy javítani. A programszöveget vagy funkció, vagy típus alapján részekre szokták bontani a forráskód kezelhet®ségének megtartása érdekében. A kliens számítógépek böngész®jében megjelen® oldalakat is érdemes külön modulokban (ez legtöbbször egy önálló fájlt jelent) elhelyezni. Fontos továbbá a jó kezelhet®ség szempontjából az is, hogy az adatbáziskezelést implementáló, a bejelentkezést, vagy a különböz® listákat generáló kódrészleteket, és minden összetartozó programegységet függvényekbe, a függvényeket modulokba, vagy osztályokba szervezzük.
2.2. Futtató környezet tesztelése Miel®tt elkészítenénk az els® PHP alapú webprogramot, gy®z®djünk meg arról, hogy a szerverre telepített futtató környezet m¶köd®képes-e. A teszteléshez be kell jelentkezni a szerverre. Ez a m¶velet kétféleképpen történhet. Feltehet®leg az a számítógép, amin a fejlesztést végezzük, és az, ami webszerverként funkcionál nem ugyanaz a számítógép, ezért els®ként kapcsolatot kell létesítenünk. Fájlok mozgatásához használjunk olyan fájlkezel® programot, ami ismeri
FTP protokollt, terminál kapcsolat kialakításához viszont telepítsünk SSH, vagy Telnet kliensprogramot. Utóbbi nem javasolt, mivel Telnet protokoll az
futtatása esetén az adataink titkosítás nélkül közlekednek a hálózaton.
12
A szerver számítógép webkönyvtárában készítsünk egy fájlt
index.php
néven. Ügyeljünk arra, hogy a webszerver a különböz® kiterjesztés¶ fájlokat más-más sorrendben veszi gyelembe. Amennyiben van a könyvtárban egy
index.html
nev¶ fájl, az fog futni és nem a
php
kiterjesztéssel rendelkez®.
A futtatás sorrendje egyébként nagyban függ a webszerver beállításaitól.
A szerver web-könyvtárai. A könyvtár, amiben a fájlt el kell helyeznünk
Linux operációs rendszer esetén a
var/www
könyvtár valamely alkönyvtára.
A Linux rendszerre felvett felhasználói könyvtárak esetén ez a felhasználó
home
public_html
könyvtárának a gyökeréb®l nyíló
könyvtár, vagy annak
valamely alkönyvtára. Ahány alkönyvtár készül a
public_html
könyvtárba, annyi különböz®
weboldalt képes az adott felhasználó m¶ködtetni. A m¶ködési elv a következ®: A kliens számítógép böngész® programja kapcsolatot létesít a szerverrel. A kapcsolat alapértelmezés szerint a szerver számítógép 80-as virtuális portján keresztül jön létre [1]. A szerver a bejöv® kérés hatására megkeresi a böngész® által hivatkozott könyvtárat, majd a könyvtárban lév®
index.php
fájlt. A fájlban található
forráskódot értelmezi és végrehajtja. Amennyiben az
PHP
index
fájlban
PHP
programszöveget talál, lefuttatja a
program értelmez®-fordító programja segítségével. A kész HTML kódot - amit a fájlban talált, vagy a
PHP program generált
- elküldi a kliens számítógépnek, ami értelmezi és megjeleníti a kliens oldal böngész®jében.
2.2. ábra.
Webböngész® URL sávja
Ahhoz, hogy mindez megtörténjen, a kliens böngész®jébe (2.2 ábra) az alábbi
URL-t,
vagyis webcímet kell begépelni:
13
http:\www.weboldalneve.hu
2.1.
megjegyzés.
A cím regisztrált domain név esetén, a
.hu
tartományban
lehetne érvényes . . . Felhasználók webkönyvtárai esetén az oldalt a szerver neve, a felhasználó
index fájl található. http:\\szerverneve.hu\~felhasználóneve\alkonyvtar Ebben az esetben a www el®tag elhagyása kötelez®. A címben a ~ karakter
neve, és annak az alkönyvtárnak az elérési útja azonosítja, ahol az
a felhasználó neve elé kerül és arra utal, hogy egy felhasználói könyvtárban kell keresni az
index
fájlt.
Miután elkészítettük az
index
fájlt, nyissuk meg a kedvenc szerkeszt®
programunkkal, majd írjuk bele a következ® néhány sort: phpinfo ( ) ;
?>
2.3. program.
A
phpinfo
Webszerver ellen®rzése
a nyelv egy beépített függvénye, ami táblázatos formában
megjeleníti a szerver beállításait, a változókat, melyek jellemzik a futtató környezetet, és minden olyan információt, ami a programozás és üzemeltetés szempontjából szükséges lehet. A táblázat amellett, hogy információkat szolgáltat, megmutatja azt is, hogy a szerver megfelel®en m¶ködik-e. A 2.3 ábrán látható kimenethez hasonlót kell látnunk a böngész®ben.
2.3. Kezdeti lépések a programozáshoz Miel®tt elmélyednénk a
PHP
nyelv szabályaiban, készítsünk el egy egyszer¶
programot, amely amellett, hogy motivál bennünket, példaként szolgál a komolyabb programok kivitelezésénél. Igaz, hogy a PHP OOP [2] nyelv. Az is igaz, hogy, teljesen külön lehet választani a
HTML
CMS-ek készít®i HTML kódba.
szöveget a forráskódtól és a
el, mi mégis ágyazzuk be a forrásszöveget a
14
is így járnak
2.3. ábra.
Webszerver információs panel
Ez a megoldás hosszú távon is használható, ha nem akarunk
OOP
alapú
programokat írni, vagy kisebb fejlesztéseket végzünk, de ne feledjük, az
OOP
programok kódját újra lehet hasznosítani, valamint könnyebb ®ket tovább fejleszteni és karbantartani. Els® lépésként készítsünk egy programot, mely rövid szöveges üzenetet jelenít meg a böngész®ben. A kiírt szövegünk legyen a klasszikussá vált
Hello Világ. A forráskód kizárólag HTML nyelv használatával a következ®:
15
<TITLE>t e s z t p r o g r a m <meta
h t t p −e q u i v=" c o n t e n t −t y p e "
c o n t e n t=" t e x t /HTML; <meta
c h a r s e t=UTF−8">
h t t p −e q u i v=" c o n t e n t −t y p e "
c o n t e n t=" a p p l i c a t i o n / x h t m l+xml ; <meta
c h a r s e t=UTF−8">
h t t p −e q u i v=" c o n t e n t − s t y l e −t y p e " c o n t e n t=" t e x t / c s s ">
Hello
Világ
2.4. program.
Mivel a programszöveg kizárólag
HTML fejléc
HTML tag-eket, valamint a kiírásra szánt
szöveget tartalmazza, fejlesszük tovább. Hogyan tudnánk a szöveget többször, egymás alá kiírni úgy, hogy a sorokat megszámozzuk? Kis számú sor esetén a másolás-beillesztés technológia segíthet rajtunk, de mit tehetünk mondjuk 1000 sor esetén, vagy ha nem egy konstans szöveget kell kiírni a kliens oldal képerny®jére. Írhatunk programot, használhatunk ciklus utasítást, és kiolvashatjuk az adatokat adatbázisokból. A dinamikus weboldalak er®ssége pontosan ebben a technikában rejlik. Készítünk egy rövid, de kifejez® PHP programot, az adatainkat adatbázisban tárolhatjuk és szöveget a
HTML
alapokon jeleníthetjük meg. Így a böngész®nek szánt
PHP program generálhatja az adatbázisból érkez® adatok alapján.
Mivel adatbázisokat még nem tudunk használni, helyezzük el a kiírandó
16
szövegrészeket egy tömbben (tömbökr®l kés®bb). Ezután egy egyszer¶ ciklus segítségével generáljuk le a megfelel®
HTML
for-
tegeket.
< t i t l e >t e s z t p r o g r a m t i t l e > <meta
h t t p −e q u i v=" c o n t e n t −t y p e " c o n t e n t=" t e x t /HTML;
<meta
c h a r s e t=UTF−8">
h t t p −e q u i v=" c o n t e n t −t y p e " c o n t e n t=" a p p l i c a t i o n / x h t m l+xml ; c h a r s e t=UTF−8">
<meta
h t t p −e q u i v=" c o n t e n t − s t y l e −t y p e " c o n t e n t=" t e x t / c s s ">
$ s z o v e g = array ( " Európa " , " A f r i k a " , " A u s z t r á l i a " , " Amerika " , " Á z s i a " ) ;
$db = count ( $ s z o v e g ) ; for
( $ i =0;
$ i <$DB ;
$ i ++)
{ echo
" Hello
$szoveg [ $i ] !
" ;
} ?>
2.5. program.
HTML generálása
A fenti forráskód sokkal általánosabb, mint a statikus
HTML
változat,
mivel az adatokat egy tömbb®l veszi, a kimenetet (2.4 ábra) pedig intelligens módon a rendelkezésre álló adatokból és a kiírandó mondat prexéb®l állítja
17
össze.
2.4. ábra.
A földrészes program kimenete
Ne rettenjünk meg a forráskódban található speciális elemekt®l. A kód els® ránézésre bonyolultnak t¶nik, de nagyon hasonlít a
Linux shell programjainak nyelvezetére. $ jelek a változókat jelölik, a kiíró utasításban
C, C++
nyelvekre,
vagy a A
található
HTML
tegek
pedig már ismer®sek lehetnek számunkra. Azt viszont meg kell szoknunk, hogy a PHP programok készítésekor felváltva kell használnunk különböz® programozási, vagy formátum leíró nyelveket, ráadásul egymásba kell tudnunk ágyazni ezeket. A programunk kimenete a 2.4 ábrán látható.
2.4. Ellen®rz® kérdések 1. Hova kerül a PHP program kimenete? 2. Milyen lépések hajtódnak végre a PHP alapú weboldalak böngész®ben való futtatása esetén? 3. Mit jelent az URL rövidítés?
18
4. Milyen ismert programozási nyelveken tudjuk megszólítani a MYSQL adatbázis kezel® rendszert? 5. Hogyan kell a PHP forrásszövegeket a HTML kódba ágyazni? 6. Mi a weboldalak f® fájljának a neve (alapbeállítás esetén)? 7. Milyen kiterjesztéssel rendelkeznek a PHP programokat tároló fájlok? 8. Milyen sorrendben veszi a következ® kiterjesztéseket a webszerver? .htm, .html, .php 9. Fordít-e a PHP tárgykódot? 10. Alapértelmezés szerint hol tárolódik a weboldalak programja?
animaciok/TAMOPweb0001.avi animaciok/TAMOPweb0002.avi animaciok/TAMOPweb0008.avi animaciok/TAMOPweb0009.avi animaciok/TAMOPweb0010.avi
19
3. A PHP nyelv alapjai 3.1. Az output kezelése Mivel a
PHP
programok írása, és a különböz® szerver oldali alkalmazások
használata a programozás során nem a megszokott egy fejleszt®eszköz-egyprogram stílusban történik, a nyelv megismerését is kezdjük rendhagyó módon. Nem a vezérl®szerkezeteket és az alap utasításkészletet vesszük sorra. Helyette megvizsgáljuk azt, hogy a programjaink kimenete hogyan állítható el® a kliens számítógépek böngész®je számára. Hogyan tudjuk a változók, vagy a kifejezések értékét kiírni HTML szövegekbe ágyazva. A PHP programrészeket a
?> vagy a jelek közé kell gépelni,
ugyanis ez alapján tudja a webszerver kikövetkeztetni, hogy PHP nyelv¶ forrásszöveg következik, és azt, hogy az meddig tart. A PHP nyelvben a szövegek kiírásához használhatjuk az
echo,
vagy a
print függvényt. Az echo jobban átláthatóvá teszi a programok forráskódját (a kevesebb zárójel miatt) és egy kicsit gyorsabbá is. echo
" Hello " ;
echo
" $i .
echo
$i . " .
sor " ; sor " ;
?>
3.1. program.
A kiírandó tartalmat
Szöveg kiírása
" " és ' ' jelek közé kell zárni. mindkét formának
más a jelentése és más-más hatást gyakorolnak a szöveg típusú adatokra, a változókra ($a) és a kifejezésekre ($a A
' '
+ 2).
jelek közé írt változók nem helyettesít®dnek be, értékük helyett a
kódban szerepl® azonosítójuk íródik ki.
20
$a = 2 ; ' $a ' ;
echo
?>
3.2. program.
A forráskód eredménye nem a mert a
' '
Idéz®jelek használata
2,
hanem a
$a
szöveg. Ez azért van így,
közé írt karakterek úgy jelennek meg a képerny®n, vagyis a
kliens számítógép böngész® programjának a felületén, ahogy azokat leírta a programozó, tehát minden leírt jelet karakterré kényszerítve. Amennyiben a változó tartalmát szeretnénk kiíratni, a
" " aposztrófokat
kell használnunk. Igazság szerint, ha nem kívánunk a változó tartalmán kívül más szöveget kiírni, a dupla
"
el is hagyható.
$a = 2 ; echo
" $a
" ;
echo
$b ;
?>
3.3. program.
Idéz®jelek használata
Ahogy a forráskódban látható, minden utasítást
;
zár le. Az elhagyása
szintaktikai hibát eredményez, ami nem túl szerencsés weboldalak esetén, ahol a programot a szerver minden futtatáskor újra lefordítja és a hiba minden futáskor láthatóvá válik a képerny®n. Ez a m¶ködési elv, ahogy a kés®bbiek során láthatjuk, számos lehet®séget hordoz magában, de a lehet®ségek mellett komoly hibákat is eredményezhet, mely hibákat a rendszer azonnal meg is mutat a felhasználónak.
Összetett adatok és kifejezések megjelenítése. Sokkal bonyolultabb a
kiírás és a megfelel® formátum el®állítása összetett adatok, tömbök, vagy a
21
kifejezések használata mellett. $ t = array ( 1 , 2 , 3 , 4 ) ; $db = count ( $ t ) ; for
( $i = 0;
// a $ t tömb elemszáma
$ i < $db ;
$ i ++)
{ echo
" $ i + 1
" ;
} ?>
3.4. program.
Adatok megjelenítése
$i + 1 kifejezés értékét írja minden érték után a +1 szöveget.
A fenti (3.4) forrásszövegben a ciklus nem a ki, hanem a
$i
változó értékét, valamint
0 + 1 1 + 1 2 + 1 3 + 1
3.5. program.
A kiírás eredménye
Ez azért van így, mert a kiíró utasításban a
$i + i
nem értékel®dik ki.
A kifejezés értékét el®ször ki kell számítani, és csak ezután lehet kiírni. A jó megoldás az, ha a kifejezést a szövegt®l elkülönítve, egy másik
echo
használatával írjuk ki. Ebben az esetben a kiíró utasítás már az értéket, vagyis az eredményt jeleníti meg.
22
for
( $i = 0;
$ i < $db ;
$ i ++)
{ echo
$i + 1;
echo
"
" ;
} ?>
3.6. program.
Szövegrészek kiírása
Lehet®ségünk van arra is, hogy a kiírásra szánt szöveget darabokból illesszük össze. Erre a feladatra a megszokott
PHP
nyelvben nem a
C, C++,
vagy
C#
+ jelet használjuk, hanem a "."-ot. Sajnos a . operátor nehezen
olvashatóvá teszi a forráskódot, de némi gyakorlással, gyorsan meg lehet barátkozni ezzel a szintaxissal. ?> $ t = array ( 1 , 2 , 3 , 4 ) ; $db = count ( $ t ) ; $e = " . for
tömbelem = " ;
( $i = 0;
$ i < $db ;
$ i ++)
{ echo
$ i . $ e . $ t [ $ i ] . "
" ;
} ?>
3.7. program.
Szöveg darabjainak összeillesztése
A program futásának az eredménye:
23
1.
tömbelem
:
1
2.
tömbelem
:
2
3.
tömbelem
:
3
4.
tömbelem
:
4
3.8. program.
Tömb elemeinek listája
Ahogy láthatjuk a forráskódban, kissé körülményes az adatok kiírása, de ne csodálkozzunk ezen. Több nyelvet ágyazunk egymásba, és több rendszert használunk egyszerre. Miután elsajátítottuk a
PHP programok használatát, ezt a tulajdonságot
ki is használhatjuk olyan feladatok megoldására, mint a forráskód generálás, vagy a dinamikus adatbázis lekérdezések készítése.
3.2. Változók és adatok
PHP
A
a gyengén típusos nyelvek közé tartozik. A programokban használt
egyszer¶ skalár változókat (egészek, szövegek, törtek, vagy a karakterek) nem kell deklarálni. A deklaráció elhagyása mellet azért vannak kikötések a változók használatára vonatkozóan, de ezek nem túl bonyolultak. Miel®tt használunk egy változót, értéket kell adnunk neki. Ha ezt nem tesszük meg, a futtatórendszer leállítja a program futását, és hibaüzenetet ír a képerny®re (vagy a szerver kongurációjában megadott helyre). $prefix = " . for
(
$i = 0
tömbelem ;
$i <
értéke
10;
:
";
$ i ++)
{ echo
$a + $ i ;
$a++; } ?>
3.9. program.
24
Értékadás
Az összetett adatszerkezetek esetén viszont, mint a tömbök, rekordok, osztályok, vagy fájlok, a típust be kell vezetni. $ t = array ( 1 , 2 , 3 , 4 , 5 , 6 ) ; $ s z o v e g = array ( " Á z s i a " , class
" Afrika " ) ;
tesztosztály
{ ...
az
osztály
bels®
világa
...
}
?>
3.10. program.
Osztályok deniálása
A gyenge típusosság nem jelenti azt, hogy a rendszer a típusokkal nem tör®dik, vagy nem kezeli ®ket. Inkább csak rugalmasabb a változó kezelés, ami rengeteg lehet®séget rejt magában a dinamikusan m¶köd® weboldalak programozása során. Ne feledjük el azt sem, hogy a szám típusú, valamint a különböz® szöveges adatok megjelenítése is szöveges formátumban történik, mivel a böngész® egyszer¶
HTML
kódot kap a szerver oldali programtól.
Az adatok és a kifejezések minden esetben szöveggé konvertálódnak, ha kiírásban szerepeltetjük ®ket, így a formázás és a darabok összeillesztése a direkt adatkonverziók elhagyása mellett sem okoz különösebb problémát. Ez a lehet®ség is a gyenge típusosság eredménye. Egy változót akár több céllal, többféle típusú adat tárolására is alkalmas. A
$a = 1
értékadást követheti a
értékcsere után az
$a
$a = "szöveg",
majd a
$a = 5
újbóli
változó szerepelhet akár egy kifejezésben is.
A nyelv típusrendszere megenged®, de vigyázzunk, a sok lehet®ség sok hibalehet®séget is magában hordoz. Elkövethetünk olyan hibákat, melyeket a program tesztelése során észre sem veszünk, de a felhasználó bizonyosan az els® alkalommal el® fogja állítani
25
ezeket. A teljes kör¶ tesztelés egyszer¶ programok esetén is nagyon körülményes. Néhány elágazást tartalmazó forrásszöveg több millió különböz® végrehajtási ágat eredményezhet. Nem beszélve arról, hogy a tesztelés nagyon költséges dolog. Átgondoltan és körültekint®en bánjunk a típusokkal és a változókkal, hogy ne kelljen hosszú órákat forráskódjavítással töltenünk.
3.3. Összetett adatok Ahhoz, hogy az összetett adatszerkezetek használatát jobban megérthessük, csoportosítsuk a a
skalár,
PHP nyelv típusait. Háromféle típus létezik. A legegyszer¶bb
vagyis a számok, karakterek és minden egyszer¶ típus.
A másik nagy csoport az összetett adatok csoportja. Ide tartoznak a tömbök, listák,
string-ek
és az osztályok.
A tömböket a nyelv kétféleképpen is képes kezelni. Hivatkozhatunk a tömbökre indexelhet® vektorokként, vagyis hash táblaként. Ezt a típust asszociatív tömbnek is nevezzük. Asszociatív tömb esetén az egyes elemeket kulcsokkal érhetjük el. Ez a gyakorlatban azt jelenti, hogy nem a a
$tomb["kulcs"]
$tomb[$index], vagy $tomb[1], hanem
formulával érhetjük el az adott elemet.
Mikor vektorként kezeljük a tömböket, egyszer¶en indexek segítségével hivatkozunk az elemeikre. Minden elem eléréséhez az indexén keresztül vezet az út, vagyis, ha ismerjük az adott elemnek a tömbben elfoglalt helyét
$tombvaltozo[$index] formulával hivatkozhatunk rá. Természetesen a PHP nyelv is ismeri a több dimenziós tömb fogalmát.
(sorszámát), a
$t [ 0 ] [ 0 ]
= " 0.0 " ;
$t [ 0 ] [ 1 ]
= " 0.1 " ;
3.11. program.
Több dimenziós tömb
Az elemekre minden dimenzióban tetsz®leges módon hivatkozhatunk, vagyis az egyik dimenzióban indexekkel, a másikban asszociatív módon.
26
$t [ 1 ] [ " e l s o " ] echo
= 1;
$t [ 1 ] [ " e l s o " ] ;
3.12. program.
Tömbelemek felhasználása
Létrehozhatunk tömb típusú változót az
array,
vagy a
list
függvények
segítségével, esetleg direkt módon, az elemek megadásával. $ t 1 = array ( 1 , 2 , 3 ) ;
$t2 [ 0 ]
= 1;
$t2 [ 1 ]
= 2;
$t2 [ 2 ]
= 3;
3.13. program.
Elemek megadása
Asszociatív tömböket is könnyen készíthetünk az elem index párosok deniálásával, vagy az $a1 [ " e l s o " ]
array
függvénnyel.
= 1;
$a1 [ " masodik " ]
= 2;
$ a 2 = array ( " e l s o " => 1 ,
3.14. program.
Az
a1
és a
a2
" m a s o d i k " =>
2);
Az array kulcsszó
tömbök ugyanazokat az elemeket tartalmazzák, csak más
az elemek neve. Nézzünk meg egy bonyolultabb példát, ami szemléletes módon mutatja be a tömbök használatát. A példaprogramban feltöltünk egy
n x m
méret¶
mátrixot véletlen számokkal. A mártix elemeit két egymásba ágyazott ciklus segítségével hozzuk létre. A tárolt értékeket direkt módon adjuk meg és egy véletlen szám generátorral hozzuk létre.
27
$M = array ( ) ; $n = 1 0 ; for
( $i = 0;
$ i < $n ;
$ i ++)
{ for
( $j = 0;
$ j < $n ;
$ j ++)
{ $M [ $ i ] [ $ j ]
= rand ( 1 , 9 ) ;
} }
for
( $i = 0;
$ i < $n ;
$ i ++)
{ for
( $j = 0;
$ j < $n ;
$ j ++)
{ echo $M [ $ i ] [ $ j ] . "
";
} echo
"
" ;
} ?>
3.15. program.
Tömb feltöltése
A tömbök kiíratását a vezérl® szerkezetek ciklusokról szóló részébében vizsgáljuk meg részletesebben, de a 3.15 program eredményét megmutatjuk.
28
8
2
4
6
4
5
8
3
4
7
8
1
2
6
3
1
7
4
8
4
3
5
7
8
4
6
4
7
6
7
5
5
9
8
1
3
3
9
6
7
6
4
7
8
9
1
8
7
4
7
2
6
2
8
5
6
4
8
4
1
6
8
5
5
6
6
7
9
5
4
6
2
7
3
9
7
3
8
5
7
5
7
3
7
5
8
4
9
6
7
1
3
6
5
7
3
2
5
2
6
3.16. program.
Mátrix kiírása
A mátrix feltöltését, és kiírását külön ismétlésekben valósítottuk meg, mert alapvet® programozási hiba ugyanabban ciklusban kiíratni a tömbök és listák elemeit, amelyben feltöltjük ®ket. A listák feldolgozásához sokkal jobb, ha a
foreach
vezérl® szerkezetet
használjuk.
3.4. Vezérl® szerkezetek A PHP nyel tartalmazza a
C, C++
és a
C#
programoknál megszokott vezérl®
foreach listakezel®t. szerkezeteknek a PHP nyelv¶ változatait.
szerkezeteket, elágazásokat, ciklusokat és a Vizsgáljuk meg a vezérl®
Elágazások. A nyelv tartalmazza a feltételes elágazás egyszer¶ és összetett
formáját. Írhatunk
if {} else {},
vagy
29
switch
típusú elágazásokat.
$a = 2 ; if
( $a % 2 == 0 )
{ echo
" $a
páros " ;
" $a
páratlan " ;
} else
{ echo
} ?>
3.17. program.
Feltételes elágazás
Természetesen egy utasítás esetén a
{ }
jelek el is hagyhatóak, de az
elhagyásuk nem javasolt, mivel a program újabb utasításokkal való b®vítése setén nagyon körülményes utólag kitenni ®ket.
elif ágak bevezetésével, vagy a switch feltételes utasítás használatával. Az elif ágak használata nehézkes, ezért lehet®ség szerint válasszuk a switch típusú Természetesen írhatunk több ággal rendelkez® elágazásokat is az
elágazást, amit a következ® példa be is mutat számunkra:
30
$a = 2 ; switch
( $a )
{ case
1:
echo
" h é t f ® " ; break ;
case
2:
echo
" kedd " ; break ;
case
3:
echo
" s z e r d a " ; break ;
case
4:
echo
" c s ü t r ö t ö k " ; break ;
case
5:
echo
" p é n t e k " ; break ;
case
6:
echo
" s z o m b a t " ; break ;
case
7:
echo
" v a s á r n a p " ; break ;
default :
echo
" hibás
s o r s z á m " ; break ;
} ?>
3.18. program.
switch vezérl® szerkezet
switch feltételes utasításban az egyes ágakat a case kulcsszó vezeti be. Az ágak végén a break szónak és egy ;-nek kell szerepelnie. Ha ezt elhagyjuk, az adott ág után következ® minden egyes ág le fog futni a következ® break; A
kulcsszóig. A
default
szó az egyéb ágat vezeti be, mely el is hagyható. (A napok
neveit kiíró programrészlet természetesen egy tömb és egy ciklus utasítás segítségével hatékonyabban megvalósítható.) A
switch
utasítás kit¶n®en használható weboldalak menükezelésének a
megszervezésére. Erre a lehet®ségre kés®bb még visszatérünk.
Ciklus utasítások. Ciklusokból a
kiegészítve a
foreach
PHP
nyelveben háromféle típus létezik,
utasítással, amit listák, valamint tömbök bejárására
használhatunk.
31
( $i = 0;
for
$i <
10;
$ i ++)
{ " $ i
" ;
echo
} echo
"
" ;
$i = 0; ( $ i < 10)
while
{ " $ i
" ;
echo
$ i ++; } echo
"
" ;
$i = 0; do
{ " $ i
" ;
echo
$ i ++; }
while ( $ i <
10)
?>
3.19. program.
Ismétlések
A fenti három ciklus utasítás ugyanazt a feladatot végzi el, vagyis kiírják
0-9 számokat, mindegyiket új sorba. A while és a do-while ciklusok esetén gondoskodnunk kell a ciklusból való kilépésr®l. A do-while a C, C++ és a C# programok mintájára a ciklusban maradás és nem a ciklusból a képerny®re a
való kilépés feltételét tartalmazza. A
foreach
foreach
kissé eltér a megszokott
( skalár
változó
in
C
formától. A PHP nyelvben nem a
lista
, hanem a
32
kifejezés )
foreach
( lista
kifejezés
as
lista
kifejezés )
...
formát használjuk. $ t = array ( 1 , 2 , 3 , 4 , 5 , 6 ) ; ( $t
foreach
a s &$ i )
{ echo
$i ;
}
3.20. program.
A
&$t
Foreach listák feldolgozására
azért szükséges, mert a
foreach
utasításban nem a tömb, vagy
a lista elemeire hivatkozunk, hanem magára a tömbre, így azt nem skalár típusú változóként kell kezelnünk, hanem tömb típusként.
3.5. Alprogramok A nyelv alapjai nem bonyolultak, különösen nem azok számára, akik már megtanultak más nyelveken programozni. Adatbázisból származó adatokkal m¶köd® oldalak készítéséhez viszont mindenképpen el kell sajátítanunk a függvények és eljárások használatát. 3.1.
megjegyzés.
Az alprogramokat a továbbiakban egységesen függvénynek
fogjuk nevezni. Ahol szükséges, kitérünk a típusokra és a visszatérési érték kezelésére is. . . Ahhoz, hogy függvényeket tudjunk készíteni, tisztában kell lennünk a formális, és aktuális paraméterek fogalmával, valamint a függvényhívások módjával.
Függvények használata. Az alprogramokat a
be. Ezután következik a paraméterlista melyet
{}
zárójelek közé zárunk.
33
function
kulcsszó vezeti
() között, majd a függvény blokkja,
A
()
zárójelek a paraméterekkel nem rendelkez® függvények esetén sem
hagyhatók el. A függvény blokk tartalmazza az utasításokat és a
return kulcsszó után
függvény a visszatérési értékét megadó kifejezést. A
return
kulcsszó és az utána álló kifejezés elhagyható, ha típussal és
visszatérési értékkel nem rendelkez® függvényt szeretnénk el®állítani. Vizsgáljuk meg a következ® programlistát, aminek a függvényei nagyon szemléletesek, és a kés®bbi munkánk során hasznosak lehetnek. Figyeljük meg, hogy a függvények paramétereinek nem kell típust adni. A paraméterátadás a függvények esetén nagyon fontos és elhagyása komoly hibákhoz vezethet, mivel a globális változók közül csak azok láthatóak a függvények törzsében, amelyeket regisztráltunk globális változónak
34
function {
echo
" Hello " ;
function {
echo
hello () }
h i ($BODY)
" Hi
" . $BODY . " ! " ;
function
amount ( $A , $B )
{
$A + $B ;
return
function
}
}
sum ( $LIST )
{ $SUM = 0 ; for
( $i = 0;
$ i < $db ;
$ i ++)
{ $SUM += $LIST [ $ i ] ; } r e t u r n $SUM ; }
function
trim ($TEXT,
{
s t r _ r e p l a c e ( $LIST , " " ,$TEXT ) ;
return
function
$LIST ) }
c r e a t e I D ($NAME, $BADList , $GOODList )
{ $NAME = s t r _ r e p l a c e ( $BADList , $GOODList , $NAME ) ; return
rand ( ) . $NAME;
}
?>
3.21. program.
Függvények használata
35
Az els® függvény nagyon egyszer¶, és a hasznossága is vitatható (Hasonló a helyzet a másodikkal is.). Paramétere nincs, és ha meghívjuk, akkor kiírja a
Hello
szócskát, vagyis ránk köszön.
A második függvény már némiképp nagyobb tudású. Ennek a bemenete egy név (vagy egy tetsz®leges szöveg). Ahogy meghívjuk, a kapott paraméter
Hi szót, majd a végére egy felkiáltó jelet ragaszt. Az amount függvény a paraméterként kapott két számot összeadja, majd visszatér az összeggel. A sum egy listát kap paraméterként, majd visszaadja
elé írja
a listában szerepl® elemek összegét. 3.2.
megjegyzés.
Szöveges adatok esetén a szövegrészek konkatenáltjával tér
vissza minkét függvény . . . A
trim már valamivel hasznosabb, mivel ez a függvény a paraméterként
kapott szövegb®l törli, vagyis üres szövegre cseréli a második paraméterben megkapott részszó összes el®fordulását. A függvényben leírt m¶veletsor webprogramok írásakor rutin feladatnak számít, ha beviteli mez®k, vagy ¶rlapok adatait dolgozzuk fel. A
createID
a
trim-hez
hasonlóan m¶ködik, de ennek a paramétere egy
azonosító, vagy név. A nemkívánatosnak vélt elemeket ($BADList) lecseréli a jó elemeket tartalmazó listában ($GOODList) szerepl® párjukra, majd az eredmény elé ragaszt egy viszonylag nagy egész számot, így biztosítva annak egyediségét. Ez a függvény egyedi azonosítók, vagy fájlnevek generálásánál szinte elengedhetetlen, de nagyon hasznos képek, vagy szöveges fájlok kezeléséhez. 3.3.
megjegyzés.
A digitális fényképez®gépek generált neveket használnak
a fényképek tárolásához. A névadási konvenció legtöbbször igen egyszer¶ algoritmussal történik. A kép neve az
Image szóval kezd®dik, majd a készítés
sorrendjében egy sorszám követi. A sorszámot sokszor szóköz el®zi meg és
()
zárójelek közt szerepel.
Végül a kiterjesztés következik, amit a felhasználók számítógépe, vagy már a fényképez® is nagybet¶sre alakít. Ez egy
Unix-Linux
operációs rendszeren futó webszerver számára kész
rémálom. A névben szerepl® szóköz, a zárójelek és a nagybet¶s kiterjesztés
36
(.JPG,
.PNG)
lehetetlenné teszi a képek szerverre történ® másolását és a
névre való hivatkozást. . . Ahogy a lista végére érünk, láthatjuk, hogy
PHP
nyelven függvényt írni
könnyed és hasznos elfoglaltság. Mindezek mellet az osztályok készítése (OOP), a kód újrahasznosítás, a könyvtári modulok írása, és ezáltal hatékony programok el®állítása szinte elképzelhetetlen alprogramok használata nélkül.
3.6. Ellen®rz® kérdések 1. Hogyan kell változót deklarálni PHP programban? 2. Milyen típusú tömbök léteznek a PHP nyelvben? 3. Hogyan lehet tömböket hatékonyan feldolgozni a PHP programokban? 4. Hogyan tudunk PHP forrásszövegb®l HTML kódot generálni? 5. Hogyan kell függvényeket deniálni PHP programokban? 6. Hogyan lehet egy PHP függvényben elérni a globális változókat? 7. Milyen összetett adatszerkezetek deniálhatóak a PHP nyelvben? 8. Hogyan hivatkozunk a skalár változókra PHP-ban? 9. Hogyan m¶ködik a foreach utasítás PHP-ban? 10. Milyen vezérl®szerkezeteket tartalmaz a PHP nyelv? 11. Milyen ciklusutasítások használhatóak PHP-ban? 12. Mivel jelöljük a PHP programokban a változókat? 13. Milyen lehet®ségeket kínál a PHP nyelv az adatok megjelenítésére, kiírására? 14. Mit jelent az asszociatív tömb fogalma? 15. Milyen típusokat deniálhatunk PHP-ban?
37
16. Hogyan hivatkozhatunk asszociatív tömbök elemeire?
38
4. Adatbázisok elérése PHP programokban 4.1. DBMS rendszerek A dinamikus webmotorok nagy részének adatai, menüpontjai és minden változó tartalom, mely az oldalakon el®fordul adatbázisokban tárolódik. Ez nagyon hasznos tulajdonság, mivel az adatbázis-kezel®k (DBMS Database Management System) segítségével az adatok bevitele, kiírása és az adatbiztonság kezelése lényegesen egyszer¶bb. Az adatbázis kezel® rendszerek a szokásos feladatok mellet az olyan jelleg¶ problémákat is megoldják, amelyekkel a hálózaton m¶köd® adatkezel® alkalmazásoknál feltétlenül számolni kell. Az adatokat egy id®ben több felhasználó is elérheti, ezért biztosítani kell a párhuzamos hozzáférést. Adatbevitel esetén biztosítani kell a kizárólagos hozzáférést, hogy ne forduljanak el® különféle anomáliák [4] Az adatok tárolása nem feltétlenül egy gépen történik, ezért biztosítani kell az elosztott adatelérést Az adatbázisok tábláinak indexeit karban kell tartani A hozzáférési szinteket szabályozni kell Biztosítani kell tárolt eljárások [3] írásának lehet®ségét, valamint az adathozzáférést különböz® hálózati eszközökön keresztül Számos feladat van tehát, amit®l egy jó adatbázis kezel® megkíméli a programozót. Sokféle adatbázis kezel® létezik. Köztük vannak jobbak, rosszabbak. A megfelel® kiválasztása sarokpontja lehet a jó webprogram elkészítésének. Ha a gyorsaság a cél és az adattárolás során kevés információt tárolunk elég valamely kisebb és kevésbé hatékony rendszert választanunk, mint a
MySQL.
Abban az esetben viszont, ha nagy mennyiség¶ adatot tárolunk, vagy mozgatunk válasszuk az er®teljesebb és nagyobb tudású
39
PSQL
vagy
MSSQL
rendszereket. Soha ne kövessük el azt a hibát, hogy mi magunk akarjuk az adatkezelést programját megoldani, hacsak nem ez a feladatunk.
4.2. Hozzáférés adatbázis kezel®khöz Bármilyen adatbázis kezel®t is választunk, az els® feladatunk az lesz, hogy megvizsgáljuk a programozásra használt nyelv adatbázis kezel® rutinjait, és azokat a könyvtári modulokkal, amelyek az adatbázis kezel®vel folytatott párbeszédek lebonyolításáért felel®sek. Emlékezzünk vissza, hogyan m¶ködnek a weboldalak. A kliens gépek kapcsolódnak a webszerver 80-as portjához. A szerver a hozzá intézett kérés, vagyis az az
index
URL alapján megkeresi a kéréshez tartozó könyvtárat és azon belül fájlt.
Abban az esetben, ha a fájlban található
PHP
PHP
forrásszöveg, a rendszer a
fordítóprogramját segítségül hívva lefordítja, és a programban szerepl®
utasításokat végrehajtja. Az adatbázis kezelést ezen a ponton lehet megvalósítani a programokban elhelyezett adatbázis kezel® rutinok segítségével. Ez a gyakorlatban azt jelenti, hogy a nyelv által biztosított függvényeket a megfelel® paraméterekkel ellátva a forrásszövegbe ágyazzuk. Mi az egyszer¶ség kedvéért a
MySQL
rendszert fogjuk használni, mert
nyitott forráskódú [5], ingyenesen hozzáférhet®, könnyedén kongurálható és nagyon elterjedt alkalmazás.
4.3. Az els® kapcsolat Adatbázis kapcsolat létesítéséhez rendelkeznünk kell saját adatbázis-kezel® rendszerrel, vagy hozzáférést kell szereznünk egy mások által üzemeltetett
DBMS
változathoz.
Mindegy, hogy az els® fejezet során bemutatott webszervert mi magunk készítettük el, és annak adatbázis kezel®jét használjuk, vagy a hozzáférés igénylését választottuk, mindkét esetben rendelkeznünk kell egy felhasználói névvel és egy jelszóval. Ezekre az adatokra szükségünk van a program megírása közben.
40
A legtöbb szolgáltató nagyon ügyel a felhasználók és a saját adataik védelmére, ezért a szerverhez való hozzáférést a lehet® legszigorúbb módon korlátozzák. Mindezek miatt el®fordulhat, hogy az adott szerverre kapcsolattal nem, kizárólag
FTP-vel
SSH,
vagy
Telnet
férhetünk hozzá.
Sajnos ebben az esetben kizárt, hogy a
MySQL
rendszert közvetlenül,
vagyis parancsosból használhassuk a táblák létrehozására. A megoldás a problémára az, hogy a táblák létrehozását is programok segítségével végezzük el, de miel®tt ezt megtennénk, tervezzük meg azt a táblát, melyben az adatainkat tárolni fogjuk. Gyakorlásnak készítsünk egy egyszer¶ alkalmazást, amely felhasználók adatait tárolja egy kezdetleges MiniFaceBook alkalmazás számára. A képen látható tábla megfelel® lesz a tárolásra:
4.1. ábra.
A MiniFaceBook táblája
SQL query-t, mely a táblánkat létrehozza. Az alábbi lista tartalmazza az SQL nyelv¶ utasítást, melyet a kés®bbiekben a PHP programunk segítségével elküldünk a DBMS számára. Készítsük el azt az
41
CREATE TABLE u s e r s ( id
int
name
key
auto_increment ,
varchar (255) ,
picture cv
primary
varchar (255) ,
text
)
4.1. program.
Felhasználók táblája
Kezdetnek ennyi is elég lesz. Ha szükségünk lesz további adatokra, a táblát kiegészíthetjük az
alter table
utasítás segítségével. Most inkább
vizsgáljuk meg, hogy mit jelent és milyen mez®ket tartalmaz az
Az
id
mez® a tábla els®dleges kulcsa (primary
key).
SQL utasítás. Erre minden
tábla esetén szükség van, mivel ez a mez® azonosítja a rekordokat. A mez® típusa Az
int,
vagyis egy el®jeles egész szám.
auto_increment
módosítás azt jelenti, hogy az adatbázis kezel®re
bízzuk ennek a mez®nek a karbantartását. A rendszer adja az értéket és a törlések, módosítások után is gondoskodik a megfelel® következ® érték megadásáról. A módosítót használva, a mez®t a beszúrások és törlések során sem kell kezelnünk. A második mez® a rekordokban szerepl® személyek neveit hivatott tárolni. A típusa egy 255 karakter hosszú lekérdez® nyelvben a A
picture
STRING
varchar,
mely a
MySQL
típus megfelel®je.
mez® a személyekhez tartozó képeket fogja kezelni.
A képeket nem az adatbázisban tároljuk majd, hanem a háttértáron a programjainkat tartalmazó fájlok mellett. A táblába csak a képek neveit és a hozzájuk tartozó elérési utakat szúrjuk be, ezért itt is elegend® a
varchar
típus.
Az utolsó mez®be a személyek önéletrajzát vihetjük be. Erre e célra
42
egy 255 karakter hosszú változó nem elegend®, ezért választottuk a
text
típust.
Ahhoz, hogy a táblát létre is hozzuk, kapcsolódnunk kell az adatbázis kezel®höz és el kell küldenünk feldolgozásra az elkészített
query-t.
A következ® programlista tartalmazza a forráskódot, ami ezt a feladatot el is végzi. A forrást egy fájlba kell leírnunk, majd el kell helyeznünk a weboldalunk gyökérkönyvtárában. Ahhoz, hogy le is fusson, a böngész®ben, a tanult módon hivatkozni kell rá.
43
$USERNAME =
' username ' ;
$PASSWD =
' password ' ;
$DBNAME =
' webbok ' ;
$ c o n I D = mysql_connect ( ' l o c a l h o s t ' , $USERNAME,
$PASSWD ) ;
( ! i s s e t ( $conID ) )
if
{ " Hiba
echo
a
kapcsolódás
során
h i b a ü z e n e t : " . mysql_error ( ) ; } mysql_select_db ($DBNAME ) ;
$querySTR = "CREATE TABLE u s e r s id
int
name
key
auto_increment ,
varchar (255) ,
picture cv
primary
(
varchar (255) ,
text )" ;
mysql_query ( $querySTR ) die
or
( " Hiba
a
létrehozás
s o r á n . . . < BR>" . $querySTR ) ; m y s q l _ c l o s e ( $conID ) ; echo
"A t á b l a
sikeresen
echo
$querySTR ;
l é t r e j ö t t . . . < br>" ;
?>
4.2. program.
Tábla létrehozása PHP programból
Semmi esetre ne frissítsük a böngész®ben a programot, mert a tábla létrehozása után az újra nem tud létrejönni, és csak újabb hibaüzeneteket kapnánk eredményül. Hibás program esetén sem fog a program a frissítések hatására megjavulni. A program futása után az A tábla sikeresen létrejött feliratnak kell megjelenni a böngész®ben. Hiba esetén viszont az adatbázis kezel®t®l érkez®
44
hibaüzenetnek, vagy az általunk kiírt hibának. Ha a Hiba a kapcsolódás során... kezdet¶ sort látjuk, a
mysql_connect
függvény környékén keressük a hibát. A Hiba a létrehozás során üzenet, akkor jelenik meg, ha a
query
szövegét rontottuk el.
Ha túl vagyunk a hibakeresésen, vizsgáljuk meg a forrásszöveget (ennél a programnál nem ügyeltünk sem a karakterek megfelel® kódolására, sem a
HTML
kimenet min®ségére. Ne csodálkozzunk hát, ha az ékezetes bet¶k
helyett furcsa karakterek jelennek meg a képerny®n.) A kód els® sora a
mysql_connect
függvény hívását tartalmazza. Ennek
a függvénynek többféle paraméterezése létezik. A mi programunkban a függvény els® paramétere a
localhost szó, mivel
az adatbázis kezel® és a webszerver egyazon gépen foglal helyet.
localhost jelentése az, hogy a helyi hurokra kell kapcsolódni, vagyis a 127.0.0.1 IP címre [1]. Ez a paraméter kiegészülhet az adatbázis eléréséhez használt virtuális port számával. A
A második, és a harmadik paraméter az adatbázisok eléréséhez szükséges felhasználó nevet, és jelszót tartalmazza. Ezeket az adatokat érdemes védeni és egy helyen tárolni. Egyrészt azért, hogy ne törhessék fel a rendszerünket, másrészt, ha megváltoznak, ne keljen ®ket a program több pontján átírni. A függvény visszatérési értékét tároljuk egy változóban
$conID
abból
a célból, hogy a következ® feltételes elágazásban a kapcsolódás sikerességét meg tudjuk állapítani. Sikertelenség esetén hibaüzenetet írunk ki a böngész® ablakába. A
mysql_select_db függvény paramétere az adatbázis nevét tartalmazó
változó. A név és a jelszó mellet ezzel az információval is rendelkeznünk kell. az adatbázis azonosítóját a szolgáltatónktól kapjuk, vagy mi hoztuk létre saját rendszerünkön. Ebben az adatbázisban tárolódnak a tábláink, így a jelenleg használt
users
tábla is.
$querySTR változóban helyeztük el a tábla létrehozását leíró parancsot. SQL utasításokat nem kell feltétlenül változóban tárolnunk, de érdemes, A
Az
mivel így hiba esetén ki tudjuk íratni ®ket a képerny®re hibajavítási, vagy ellen®rzési céllal.
45
A
mysql_query
függvény elküldi az
SQL
parancsot a
DBMS
számára. Ha
függvény valamilyen okból elbukik, a közvetlenül utána írt kivételkezel® átveszi az irányítást és kiírja a hiba lehetséges okát. A
mysql_close
függvénynek a kapcsolat megszüntetése a feladata. Erre
minden esetben szükség van, mert igaz, hogy a nyitva maradt kapcsolatok el®bb utóbb bezáródnak, de a nyitott kapcsolat még sebezhet®bbé teszi a könnyen támadható webes alkalmazásokat. Az adatbázisokkal dolgozó alkalmazások írásakor mindig ügyeljünk arra, hogy a kapcsolatokat a lehet® legrövidebb id®n belül zárjuk le. Másrészt ne számítsunk arra sem, hogy a kapcsolat a következ® percben még nyitva van. Gondoljuk végig, hogy a weben tevékenyked® felhasználók miként használják a programokat. Néha kattintanak, el®szednek egy régebbi címet, majd frissítik a böngész® ablakát. Akár hosszasan is várhatnak a monitor el®tt, mire újra kattintanak valamire. Azt feltételezni, hogy a kapcsolat a két kattintás között eltelt id® alatt is fenn áll, butaság. Ha rosszul írjuk meg a programot és nem gondolunk erre a körülményre, könnyen el®fordulhat, hogy a kapcsolat magától bezáródik mire a felhasználónk rákattint a következ® lekérdezésünkre. A programunk a legjobb esetben is egy hibaüzenetet biggyeszt a képerny®re. A mi programunk ennél sokkal okosabb. Ha befejezte a munkáját, lezárja a kapcsolatot, majd tájékoztat minket a sikerr®l.
4.4. Sa ját függvények kapcsolódáshoz Az adatbázisokkal való kommunikáció az alábbi, egymástól jól elkülöníthet® lépésekb®l áll: Kapcsolódás a rendszerhez Adatbázis kiválasztása
Query
el®állítása
Query
elküldése a szervernek
Eredmény feldolgozása
46
Kapcsolat bontása Hiba esetén a hiba kezelése
Ezek a rutinok ugyanabból a néhány lépésb®l, vagy utasítás sorozatból állnak, melyek szinte csak a paraméterekben térnek el (a felhasználó neve, a jelszó, vagy az
SQL
utasítás, amit a szervernek küldünk).
Kézenfekv® megoldás a különböz® rutinokat csoportokba foglalni, majd függvényeket írni, amely függvények bemen® paraméterei leírják a változó információt.
4.5. Adatbázis kezel® modul készítése Az adatbázis kezel® függvényeket érdemes önálló modulba helyezni, mert így a modult kés®bb bármely általunk készített weboldal programja mellé elhelyezhetjük, és a benne tárolt függvényeket tetszés szerint meghívhatjuk. Ez a kód újrahasznosítás elve, amit tovább javíthatunk azzal, hogy a függvényeket osztályokba helyezzük, és az osztály példányát használjuk fel a programjainkban. Ne felejtsük el, hogy a
PHP
objektum orientált nyelv.
Ez a megoldás akkor is nagyon hasznos, ha kés®bb a weboldalhoz tartozó adatbázis kezel® rendszert lecseréljük. Az adatbázis-kezel® függvények egy helyen vannak, ezáltal könnyebb megtaláljuk ®ket. Az alacsony szint¶ adatbázis kezel® m¶veleteket ki tudjuk cserélni úgy, hogy a függvényeink
interface
részét nem alakítjuk át, csak a függvények
blokkjában szerepl® utasításokat. Ha ezután az adott függvény nem egy
MySQL
rendszerhez kapcsolódik,
azt a program több része észre sem fogja venni. Az, hogy a programjainkat platform függetlenre készítjük el egy alapvet® programozási technológia. Ezt köztes
middleware-ek, vagy más néven layer-
ek elhelyezésével valósítják meg. A követhet®ség és az egyszer¶ség elvét követve mi a függvényes megoldást választjuk és az osztály készítését kés®bbre hagyjuk.
47
Már csak az a kérdés, hogy milyen csoportokba soroljuk az adatkezel® lépéseit. A csoportosítást érdemes a különböz® funkciók mentén elvégezni. Kell egy csoport a kapcsolat létrehozásához, egy a
query-k
elküldéséhez, és egy
a platform függetlenség megtartása érdekében a kapcsolat bontásához. (Ez egy igen rövid függvény lesz, de hasznos) Készítsük el az adatbázis kezel® modulunkat és ezt is helyezzük el a megfelel® könyvtárba, az
index.php
fájl mellett.
A korábban megírt tábla létrehozás rutint nem kell ebbe a modulba integrálni, mert annak minden funkcióját kiváltjuk a modul függvényeivel.
#====DB module==================================== # Author : Szerz® # Date : 2010.01.20 # TODO : ü g g v é n y e k PSQL r e n d s z e r h e z # Change l o g : # 1 . 2 0 1 0 . 0 1 . 2 0 : Mysql f ü g g v é n y e k kommentjei #================================================= #TYPE : : c o n n e c t ( ) : i n t function
connect ()
{ $ID = mysql_connect ($HOST , id
$USER , $PWD) ;
( ! i s s e t ( $ID ) )
{ return
" error
:
" . mysql_error ( ) ;
} return
$ID
}
4.3. program.
Adatbázis kezel® modul
48
#TYPE : : s e l e c t _ d b (DBNAME: s t r i n g ) : v o i d function
s e l e c t _ d b ($DBNAME)
{ mysql_select_db ($DBNAME ) ;
}
#TYPE : : q u e r y 1 ( querySTR : s t r i n g ) : v o i d function
q u e r y 1 ( $querySTR )
{ mysql_query ( $querySTR )
or
die
( " e r r o r " . mysql_error ( ) ) ;
}
#TYPE : : q u e r y 2 ( querySTR : s t r i n g ) : a r r a y function
q u e r y 2 ( $querySTR )
{ $result
= mysql_query ( $querySTR )
or
die
( " e r r o r " . mysql_error ( ) ) ; return
$result ;
}
#TYPE : : c l o s e ( ID : i n t ) : v o i d function
c l o s e ( $ID )
{ m y s q l _ c l o s e ( $ID ) ; } ?>
4.4. program.
Adatbázis kezel® modul
Vegyük sorra, hogy milyen elemeket tartalmaz a könyvtári modulunk. Rögtön az elején található a modulra vonatkozó minden fontos információ. Ez a rész komment, és nem tartalmaz semmi olyat, ami a program futását befolyásolná, de ennek ellenére mégis nagyon fontos szerepe van. A fejleszt®k az itt leírt információk segítségével tájékozódhatnak a forráskód életciklusát érint® minden fontosabb információról.
49
A függvények el®tti
TYPE
kezdet¶ részek a függvényék és a paramétereik
típusáról tájékoztatják a programozót. A program m¶ködését ez a rész sem befolyásolja (akár el is hagyható), de alkalmas dokumentáció generálására, és arra, hogy a függvény összes fontos tulajdonságát leírjuk, megkönnyítve ezzel a program továbbfejlesztését. Erre a célra használhatunk már létez® dokumentációs eszközöket, vagy kitalálhatunk sajátot. Az utóbbi sokkal hasznosabb, mivel a hozzá tartozó elemz® program megírásával nagyon sokat tanulhatunk. A
connect,
a
select_db
és a
close
függvények a korábban megismert
funkciókat látják el. A két különböz®
query
függvény feladata viszont eltér®, ezért is van
bel®lük kett®.
query1 a beszúrás, módosítás és törlés típus lekérdezéseket hajtja végre, míg a query2 azokat, melyek adatokat szolgáltatnak a programunk A
felé további feldolgozásra. 4.1.
megjegyzés.
Vegyük észre, hogy a függvények blokkjainak cseréje, vagy
átírása más adatbázis kezel® utasításaira egyáltalán nem változtatják meg a függvények felhasználásának a módját. . . Mivel a PHP nem készít tárgykódot, a kész modult elég az alkalmazás többi fájlja mellé másolni, majd minden olyan helyen láthatóvá tenni, ahol használni szeretnénk. Ez a gyakorlatban azt jelenti, hogy azokban a programokban, melyekben a modul függvényeit használni akarjuk, el kell helyezni egy egy
require
függvényt a modul nevével paraméterezve.
50
include,
vagy
#f e l h a s z n á l á s i h e l y e n require
" dbmodule . php " ;
#vagy require_once
" dbmodule . php " ;
#í g y nem d u p l i k á l h a t j u k a l i n k e l é s t , #ha e s e t l e g nem f i g y e l n é n k oda ?>
Modulok linkelése
4.5. program.
query2 függvény nem elegend®. A függvény hívási helyén sajnos szükség van mysql specikus függvényekre ahoz, hogy a DBMS fel®l érkez® adatokat feldolgozzuk. Platform-független adatbáziskezel® készítéséhez a fenti
... while ( l i s t ( $v1 ,
$v2 ,
... ,
$vn ) =
mysql_fetch_row ( $ r e s u l t ) )
{ ... } ... ?>
4.6. program.
A probléma a
Adatok feldolgozása
mysql_fetch_row
függvénnyel van, mivel a f®program
minden olyan részén meg kell hívnunk, ahol az adatokat fel szeretnénk dolgozni. Megoldásként átalakíthatjuk a
query2 függvényt úgy, hogy a fetch_row
funkcióit valósitsa meg, vagyis bontsa sorokra a rekordlistát, majd helyezze egy asszociatív tömbbe az eredményt.
51
#TYPE : : q u e r y 2 ( querySTR : s t r i n g ) : a r r a y function
q u e r y 2 ( $querySTR )
{ $lista
= array ( ) ;
$result
= mysql_query ( $querySTR )
or
die
( " e r r o r " . mysql_error ( ) ) ; while
( $line
= mysql_fetch_assoc ( $ r e s u l t ) )
{ $lista []
=
$line ;
} return
$lista ;
}
4.7. program.
Módosított query
query2 függvény els® sora deniál egy tömböt az array() függvény meghívásával. Az SQL lekérdezés eredményét egy while ciklusban soronként belerakja a $line tömbbe. A módosított
A kapott tömböt a f®program a következ®képp tudja feldolgozni: két
foreach
egymásba ágyazásával minden hasznos információ kinyerhet® a
az eredmény listából. A küls® ismétlés a sorokat adja, a bels® pedig egy mintaillesztés segítségével kiválasztja az adott sorból a mez®neveket, és a mez®k tartalmát.
52
... $lista
= query2 ( ' s e l e c t ( $lista
foreach
as
∗
from
tablename ' ) ;
$line )
{ ( $line
foreach
as
$k => $v )
{ echo
" $v
a
kulcs ,
$k
az
a d a t
" ;
} } ...
4.8. program.
Adatfeldolgozás mintaillesztéssel
Az adatfeldolgozásnak ez a módja elég általános ahhoz, hogy a f®program bármely részén, vagy akár más programokban is fel tudjuk használni az adatbázis kezel® modulját. A forrásszövegben már csak egy olyan rész van, melyr®l eddig nem beszéltünk, a mintaillesztés a bels® foreach
( $line
as
$k => $v ) . . .
4.9. program.
A
$line
foreach-ben.
Modulok linkelése
változó tartalma - ami egyébként egy asszociatív tömb egy
elemének felel meg - egy
key => value
formájú adat. Az els® része a tömb
adott elemének a kulcsa (neve), a második pedig a kulcshoz tartozó adat (érték). A mintaillesztés során a
$k
$v változóba a => szelektor
változóba bekerül a kulcs, a
pedig a kulcshoz tartozó, ezért van szükség a formulában használatára. 4.2.
megjegyzés.
Ha ezután sem értjük a kódot, olvassuk el gyelmesen a
tömbök kezelésér®l szóló fejezetet. . . A modult ezzel a kis módosítással általános felhasználásúvá alakítottuk, mivel ügyeltünk arra, hogy a függvények paraméterezést®l függ®en minél
53
több programban fel lehessen azokat használni. Az adatbázis kezelést átlátszóvá tettük a platformfüggetlen
interface
elkészítésével, így az adatbázis kezel® rendszer cseréje során a f®programot nem kell megváltoztatni. Minden olyan módosítás, ami az adatkezelést érinti elvégezhet® a modul függvényeinek átalakításával, vagy az
inteface megtartása mellett a modul
teljes cseréjével. A befektetett energia, és a rengeteg forrásszöveg haszontalannak t¶nhet, de hosszabb távon mindenképpen megéri.
4.6. Ellen®rz® kérdések 1. Milyen lépésekb®l áll az adatbázis kapcsolat felépítése? 2. Hogyan ellen®rizhet® le az adatbázis kapcsolat felépítésének sikere? 3. Hogyan készíthetünk SQL táblákat PHP programokban? 4. Hogyan kell feldolgozni a több rekorddal visszatér® SQL lekérdezés eredményét? 5. Milyen el®nyökkel jár az adatbázis függvények modulokba sorolása? 6. Hogyan hozhatunk létre SQL táblákat. 7. Hogyan adhatunk parancsokat a DBMS számára. 8. Milyen eszközöket biztosít a PHP nyelv az adatbázis kezeléshez? 9. Hogyan kell lezárni az adatbázis kapcsolatot: 10. Hogyan kerülhet® el a többszörös include, vagy require függvények használata esetén a többszörös fájl linkelés?
animaciok/TAMOPweb0003.avi animaciok/TAMOPweb0005.avi
54
5. Modulszerkezet 5.1. Moduláris felépítés Miután elkészítettük az adatok tárolásához szükséges táblát, megírtuk az adatbázis kezel® rutinokat tartalmazó könyvtári modult, ne feledkezzünk meg arról sem, hogy a hálózaton mindenki számára elérhet®, böngész®ben m¶köd® alkalmazást fogunk készíteni. A programot valószín¶leg fokozatosan tovább kell fejlesztenünk a felmerül® igények alapján. Ha mindezeket szem el®tt tartva újratervezzük a programunkat, hamar beláthatjuk, hogy szükségünk van egy keretrendszerre, amelyben leírhatjuk a menükezelést, a menüpontokat és a tartalmukat tároló fájlokat.
5.1. ábra.
Moduláris felépítés
A különböz® oldalak forrásszövegeit érdemes csoportosítanunk. Gondoljunk vissza az els® fejezetben megismert
CMS
moduljaira, vagy
menüszerkezetére. Miel®tt tehát hozzákezdenénk az adatkezel® megírásához, készítsük el a keretprogramot, melyet az
index.php
fájlban fogunk eltárolni.
Ebben a fájlban fogjuk leírni az oldal
HTML kódját, vagyis a megjelenését.
Ide linkeljük a menükezel® programrészeket, a menüpontok el®állításához
55
szükséges kódot, és a menük hatására megjelen® oldalak kódjának betöltése is ebben a részben kap helyet. Ha ez sikerül, akkor az
index.php
fájlt már csak arra használjuk, hogy
az újabb menük, vagy funkciók programjait integrálhassuk. Az oldalunk
CMS rendszerek szerkezetére. a CMS-ek programozói is logikusan
felépítése így némiképp hasonlítani fog a Ez bizonyára azért van így, mert
gondolkodva építik fel a programjaik szerkezetét. A 5.1 ábrán láthatjuk a moduláris szerkezet rajzát. Az ábra abban lesz a segítségünkre, hogy a modulszerkezetet jobban átlássuk és megérthessük.
56
< t i t l e >t e s z t p r o g r a m t i t l e > h t t p −e q u i v=" c o n t e n t −t y p e "
<meta
c o n t e n t=" t e x t /HTML;
c h a r s e t=UTF−8">
h t t p −e q u i v=" c o n t e n t −t y p e "
<meta
c o n t e n t=" a p p l i c a t i o n / x h t m l+xml ; c h a r s e t=UTF−8"> h t t p −e q u i v=" c o n t e n t − s t y l e −t y p e "
<meta
c o n t e n t=" t e x t / c s s ">
require
" dbmodule . php " ;
?>
c l a s s =header>
i n c l u d e
" h e a d e r . php " ;
?> |
t r >
c l a s s =menu> i n c l u d e
c l a s s =c o n t e n t > i n c l u d e
"menu . php " ;
?>
" c o n t e n t . php " ;
?>
t r > t a b l e >