SZAKDOLGOZAT
Négyesi Péter 2012
LIA Alapítványi Óvoda és Szakközépiskola Szolnoki Tagintézmény
Online könyvesbolt fejlesztése PHP és MySQL alapokon
Konzulens: Pankucsi Szilárd mérnök informatikus
Készítette: Négyesi Péter Web-programozó 2012
Nyilatkozat Alulírott Négyesi Péter kijelentem, hogy a szakdolgozat saját munkám eredménye. A dolgozat elkészítéséhez felhasznált valamennyi forrást az irodalomjegyzékben feltüntettem a hivatkozás szabályainak megfelelően. A dolgozat elkészítéséhez meg nem engedett segédanyagokat nem használtam fel. Szakdolgozatomat más intézményben nem adtam be. Kelt: Tiszagyenda, 2012.04.14. Négyesi Péter Web-programozó jelölt
Köszönetnyilvánítás Ezúton szeretném köszönetemet és tiszteletemet kifejezni mindenkinek, aki a szakdolgozatom elkészítéséhez nagyban hozzájárult. Rugalmasságáról, precízségéről és segítőkészségéről bizonyságot téve ezúton szeretném kinyilvánítani köszönetemet konzulensemnek, Pankucsi Szilárd tanár úrnak, akitől oly sokat tanultam a 2 év alatt. Külön szeretnék köszönetet mondani Nagy Kingának, aki szeretetével és odafigyelésével mindvégig támogatott. Végül, de nem utolsó sorban szeretném kifejezni megbecsülésemet, szívből jövő szeretetemet és köszönetemet családtagjaimnak, barátaimnak, akik szeretetükkel és segítségükkel mindvégig támaszt nyújtottak tanulmányaim során, és szakdolgozatom elkészítésének teljes ideje alatt türelmet, megértést tanúsítottak irántam. Hálásan köszönöm!
Online könyvesbolt fejlesztése PHP és MySQL alapokon
Négyesi Péter
Tartalomjegyzék 1.
Bevezetés........................................................................................................................3 1.1.
Témaválasztás indoklása ..........................................................................................4
2.
Alkalmazott technológiák ...............................................................................................5
3.
Az alkalmazás bemutatása ..............................................................................................7 3.1.
3.1.1.
Keresés..............................................................................................................9
3.1.2.
Regisztráció ......................................................................................................9
3.2.
Tag szemszögéből................................................................................................... 10
3.2.1.
Bejelentkezés .................................................................................................. 10
3.2.2.
Adatmódosítás ................................................................................................. 11
3.2.3.
Könyvek böngészése ....................................................................................... 11
3.2.4.
Értékelés ......................................................................................................... 12
3.2.5.
Kosár............................................................................................................... 12
3.2.6.
Rendelés ..........................................................................................................13
3.2.7.
Kijelentkezés ................................................................................................... 14
3.3.
4.
Vendég szemszögéből ...............................................................................................7
Rendszergazda szemszögéből ................................................................................. 14
3.3.1.
Tagok kezelése ................................................................................................ 15
3.3.2.
Rendelések kezelése ........................................................................................ 16
3.3.3.
Könyvek kezelése ............................................................................................ 17
3.3.4.
Kategóriák kezelése ......................................................................................... 18
3.3.5.
Vezércikkek kezelése ....................................................................................... 18
3.3.6.
Vezércikk kategóriák kezelése ......................................................................... 19
3.4.
Alkalmazás telepítése és működtetése..................................................................... 19
3.5.
Hardver és szoftver környezet................................................................................. 20
Fejlesztői dokumentáció ............................................................................................... 21 4.1.
Feladatspecifikáció ................................................................................................. 21
4.2.
Használati eset diagram .......................................................................................... 22
4.3.
Adatbázis terv ........................................................................................................ 23
4.3.1.
Táblák ismertetése ........................................................................................... 23
4.3.2.
Táblák kapcsolata ............................................................................................ 25
4.4.
Adatbiztonság......................................................................................................... 26
4.4.1.
Bemenet érvényességének ellenőrzése ............................................................. 26
4.4.2.
Jogosultság-ellenőrzés ..................................................................................... 28
4.4.3.
Jelszavak titkosítása ........................................................................................ 29
4.5.
Az egyes funkciók működése ................................................................................. 30
4.6.
Tesztelés ................................................................................................................. 39 1
Online könyvesbolt fejlesztése PHP és MySQL alapokon 4.7.
Négyesi Péter
Továbbfejlesztési lehetőségek ................................................................................. 40
5.
Összefoglalás ................................................................................................................ 41
6.
Irodalomjegyzék ...........................................................................................................42
7.
Ábrajegyzék.................................................................................................................. 43
8.
Mellékletek ................................................................................................................... 44
2
Online könyvesbolt fejlesztése PHP és MySQL alapokon
1.
Négyesi Péter
Bevezetés „Szeretnénk,
ha
egyszerűsítésével
a
működési
készülékeink
folyamatok
használata
olyan
egyértelművé és egyszerűvé válna, akár egy kávéfőző vagy egy kenyérpirító használata.” (Shiro Kondo) A szoftverfejlesztés világában a web alkalmazások (Web Application) népszerűségének oka, hogy az azokat használó web-böngésző kliensek szinte minden gépen rendelkezésre állnak, illetve ezen alkalmazások karbantarthatók a kliens gépek szoftverének változtatása nélkül. A web alkalmazások elérhetőek az Interneten, valamint intranet hálózaton, mai legelterjedtebb formái a webmail, fórum, blog, web-áruház, de ezeken kívül számtalan létezik belőlük. A korábbi kliens-szerver architektúráknál minden egyes alkalmazásnak saját kliens programja volt, ami felhasználói felületként szolgált, és amit minden számítógépre külön kellett feltelepíteni. Egy szerver-oldali frissítés általában a kliens-oldal szoftverének frissítésével járt, ami kevésbé hatékony megoldás. Ezzel ellentétben a web alkalmazások dinamikusan generálnak szabványos formátumú web dokumentumokat (HTML, XHTML), amit a web-böngészők támogatnak. A kliens-oldali szabványos nyelvű szkriptek, mint a JavaScript, a böngészők által már eleve értelmezhetők. Minden weboldal statikus dokumentumként érkezik a klienshez, viszont interaktív felhasználói élményt nyújt a beágyazott web-formokon keresztül. A kapcsolat közben a web-böngésző értelmezi és megjeleníti az oldalakat, és egy univerzális kliensként működik minden web alkalmazás számára. A Web alkalmazásokat általában három rétegre lehet bontani. Az első réteg maga a webböngésző, a második/középső réteg egy motor, mely dinamikus web tartalmat használ (pl. PHP, ASP, JSP, CGI), a harmadik réteg pedig az adatbázis. A web-böngészők kéréseket küldenek a középső rétegnek, ami kiszolgálja őket azáltal, hogy lekérdezéseket és módosításokat végez az adatbázisban, majd megjelenítik a felhasználói felületet. A mai web-orientált, rohanó világban a mindennapi élet számos területén találkozhatunk webes megoldásokkal, amelyek révén otthonunkból vehetjük igénybe a különféle web alkalmazások által nyújtott szolgáltatásokat, lehetőségeket mindössze egy böngésző segítségével.
3
Online könyvesbolt fejlesztése PHP és MySQL alapokon
Négyesi Péter
Ezzel sok időt és pénzt spórolhatunk meg, ugyanis például ha használt, ugyanakkor jó állapotban lévő könyveket szeretnénk vásárolni, mi sem kínál egyszerűbb megoldást, mint otthonunkból böngészni az ilyen jellegű honlapokat.1
1.1. Témaválasztás indoklása A mai világban egyre inkább jellemző a termékek elektronikus ismertetése és értékesítése. Egy termék megvásárlása előtt számtalan internetes katalógust bejárhatunk. Esetenként több információt és véleményt gyűjthetünk be vásárlás előtt, mint amennyit egy boltban vagy egy prospektust olvasgatva kapnánk. Szakdolgozatom témája egy olyan online, PHP és MySQL alapokon működő könyvesbolt fejlesztése, melynek ötletét egy gyerekkori ismerősömmel folytatott beszélgetés ihlette. A beszélgetés során elmondta nekem, hogy szeretne megválni használt, egyetemi tankönyveitől a lehető leggyorsabban és a legjobb áron. Ekkor javasoltam neki a „Használt Könyvek Áruháza” (HKA) elképzelésemet, mely révén bárki nagyon egyszerűen és gyorsan megrendelheti a kívánt könyveket, melyről ő e-mailben kap részletes tájékoztatást, ezáltal hozzájárulva a gyors ügyintézéshez. Egy ilyen internetes áruházon keresztül tökéletesen bemutathatóak a PHP és MySQL nyújtotta lehetőségek. A web alkalmazás a későbbiek során segítséget nyújthat azon személyek számára, akik meglévő, használt, avagy már megunt materiális illetve immateriális javaiktól szeretnének egyszerű, gyors és elegáns módon megválni, valamint nem járatosak a nyílt forráskódú Webshop CMS (Content Management System = Tartalomkezelő Rendszer) rendszerek használatában, melyek személyes véleményem alapján a web-áruházak mai legelegánsabb és legprofesszionálisabb megjelenési formái számos továbbfejlesztési lehetőséget hordozva önmagukban. Szakdolgozatom második fejezetében az alkalmazott technológiákat részletezem.
1
http://www.kreditvadasz.hu [2009]: Webalkalmazás készítése – PHP.
4
Online könyvesbolt fejlesztése PHP és MySQL alapokon
2.
Négyesi Péter
Alkalmazott technológiák Egy online könyvesbolt szolgáltatásait tipikusan sok felhasználó veszi igénybe, ezért
célszerű a felhasználói felületet webes alapon elkészíteni. A webes interfész korszerű, jól kézben tartható és kezelési módja széles körben ismert, ezért esett választásom a webes megvalósítási módra. A rendszer felépítését tekintve a web-alkalmazás szerves része egy adatbázis, amelyből a szükséges adatokat a rendszer valamely programozási nyelv segítségével lekérdezi, karbantartja, valamint a felhasználói felületet is ennek felhasználásával generálja. A webes felület nem más, mint (korszerűen) CSS-sel formázott XHTML dokumentumok összessége, melyek a szerveren állnak elő és melyeket a kliensen egy böngészőprogram dolgoz fel és jelenít meg. A rendszerben MySQL adatbázis használata mellett döntöttem annak egyszerűsége, gyorsasága, valamint ingyenes hozzáférhetősége miatt. Igaz ugyan, hogy a MySQL funkcionalitása erősen korlátozott az iparban elterjedt adatbázis-kezelőkhöz képest (pl. Oracle), jelen komplexitásban ez nem okozott jelentősebb problémákat. A szerver oldalon alkalmazásom az ingyenes PHP szkriptnyelvet használja, mely egyszerűen lehetővé teszi a MySQL adatbázishoz való rugalmas hozzáférést, az XHTML kimenet generálását, valamint számos web-szerverrel együttműködve képes a HTTP adatmozgás vezérlésére. Az otthoni számítógépen való teszteléshez a szintén ingyenes Apache webszerver alkalmazást használtam. Az általam választott technológiai „együttes”, az Apache, PHP és MySQL jelenleg a gyakorlati alkalmazásokban legelterjedtebb, és mindegyikre igaz, hogy (bizonyos korlátozásokkal) ingyenesen hozzáférhető, nagyon jól dokumentált és több platformon is rendelkezésre áll. Az alábbi ábra eme „együttes” tagjainak kapcsolatát szemlélteti. 2
1. ábra Az Apache, PHP és MySQL kapcsolata 2
http://www.peetsoft.hu [2005]: Adatbázisok elmélete, tervezése, és egy gyakorlati alkalmazás a B2C elektronikus kereskedelemből.
5
Online könyvesbolt fejlesztése PHP és MySQL alapokon
Négyesi Péter
Szakdolgozatom gyakorlati megvalósításához a legkényelmesebb megoldást az AppServ alkalmazás használata jelentette, mely bárki számára elérhető és letölthető az internetről, ezentúl tartalmazza az Apache webszervert, a PHP értelmezőt (Interpreter), a MySQL szervert, valamint a phpMyAdmin interaktív MySQL adatbázismenedzselő felületet. Régóta dolgozom ezzel az alkalmazással, és lévén soha nem volt vele problémám, előnyben részesítem a hasonló alkalmazásokkal szemben. Egyik legelőnyösebb tulajdonsága, hogy a telepítés után a rendszer azonnal használhatóvá válik (az alapbeállítások a megfelelő konfigurációs állományokban testre szabhatóak).
6
Online könyvesbolt fejlesztése PHP és MySQL alapokon
Négyesi Péter
Az alkalmazás bemutatása
3.
Szakdolgozatomnak ebben a fejezetében az új felhasználók részére szeretném bemutatni a rendszer által nyújtott szolgáltatásokat. Az alkalmazás (Használt Könyvek Áruháza) egy online könyvesboltot reprezentál, ahol lehetőség van:
a könyvek közötti keresésre (egyszerű és összetett keresés),
az oldalra történő regisztrációra,
a könyvesbolt termékeinek böngészésére és értékelésére,
a kiválasztott könyvek megrendelésére. A legtöbb online könyvesbolthoz hasonlóan itt is kategorizáltak a termékek, melyekből
regisztráció és belépés után kiválasztva egyet megtekinthetjük annak adatlapját, kosárba tehetjük, majd az adatok egyeztetésével és a rendelés jóváhagyásával történik meg az értékesítés. Az esetleges nagy termékkínálatban való tájékozódásban az egyszerű és összetett kereső nyújt segítséget, valamint a heti akciók és az újdonságok állandóan szem előtt vannak az erre elkülönített sávban. Az alkalmazás bárki részére elérhető, aki rendelkezik internet hozzáféréssel. A fenti szolgáltatások igénybevételéhez mindössze egy web-böngészőre van szükség (flash pluginnel). A könyvesbolt megtekintéséhez nyissuk meg a Mozilla Firefox, Opera vagy Google Chrome böngészők valamelyikét, és lépjünk a http://negyesipeter.tk címre. A főoldal elrendezését tekintve 3 részre osztható mind vízszintesen, mind függőlegesen. Vízszintes sávokat tekintve beszélünk fejlécről, tartalmi részről és láblécről. A függőleges tagolást tekintve szintén középen helyezkedik el az aktuális/rendelhető tartalom, míg azt balról-jobbról körbeveszik a kiemelt termékek, az akciós termékek, az újdonságok és a személyes kedvencek. A következőkben az alkalmazás használatát mutatom be az egyes aktorok (Vendég, Tag, Rendszergazda) szemszögéből nézve.
3.1. Vendég szemszögéből Az alábbi ábrán látható oldal fogadja az oldalra érkező látogatót (Vendég felhasználó), melyről a flash intro alatt elhelyezkedő Belépés gombra való kattintással navigálhatunk tovább az alkalmazás főoldalára.
7
Online könyvesbolt fejlesztése PHP és MySQL alapokon
Négyesi Péter
2. ábra Az üdvözlő oldal
Az alkalmazás főoldalára érve, melyet az alábbi ábra szemléltet, láthatjuk a már említett függőleges és vízszintes hármas elrendezést. A fejlécben helyezkednek el a láblécben felsorolt szöveges hivatkozások (navigációs elemek) ikonmegfelelői ugyanolyan sorrendben, vagyis:
Főoldal,
Regisztráció,
Kosár,
Be- és Kijelentkezés,
Admin Felület.
3. ábra A főoldal
8
Online könyvesbolt fejlesztése PHP és MySQL alapokon
Négyesi Péter
Vendégként mindösszesen 2 funkció elérhető, a Keresés valamint evidens módon a Regisztráció. A továbbiakban ezen funkciók részletes bemutatása következik.
3.1.1. Keresés A főoldalon elhelyezkedő egyszerű keresés funkció révén tájékozódhatunk az online könyvesboltban elérhető/rendelhető könyvekről, így eldönthetjük, hogy szeretnénk-e rendelni, ezáltal regisztrálunk-e az oldalra. Az egyszerű keresés használata után megjelenik a keresési és szűrési feltételeknek megfelelő találatok száma, valamint a könyvek (soronként három) ABC sorrendben. Lehetőség van összetett keresésre is, melynek hivatkozása a találatok száma alatt található meg. Az összetett keresés funkció révén három újabb szűrőfeltétellel (lásd az alábbi ábrán) szűkíthetjük a keresést: Szerző, Az ár legalább, Az ár legfeljebb.
4. ábra Összetett keresés
Az utóbbi 2 szűrőfeltétel által megadhatunk egy minimális és egy maximális összeget, amelyet könyvvásárlásra kívánunk fordítani. Csak a numerikus értékek megadására van szükség (Pl.: 3000).
3.1.2. Regisztráció Kattintsunk a fejlécben a Regisztráció ikonjára, avagy az annak megfelelő hivatkozásra a láblécben. Az alábbi ábrán látható regisztrációs űrlapot kell kitöltenünk:
5. ábra Regisztráció
9
Online könyvesbolt fejlesztése PHP és MySQL alapokon
Négyesi Péter
Kötelezően kitöltendő mezők:
Felhasználónév (csak kisbetűket, számokat, kötőjelet és alsó vonalat tartalmazhat)
Jelszó (csak kisbetűket, nagybetűket, számokat, kötőjelet, alsó vonalat és felkiáltójelet tartalmazhat)
Jelszó megismétlése
Vezetéknév (csak a magyar ABC betűit és kötőjelet tartalmazhat)
Keresztnév
E-mail cím
Ajánlottan kitöltendő mezők:
Cím (csak a magyar ABC betűit, számokat, kötőjelet, pontot, vesszőt és perjelet tartalmazhat)
Telefonszám (pl.: 06-30-1234567)
Regisztrációs szándékunk megerősítéséhez a Regisztrál gombra kell kattintani.
3.2. Tag szemszögéből Regisztrált felhasználóként a közösség tagjává válhatunk, így Tag felhasználóként végre igénybe vehetjük az online könyvesbolt nyújtotta szolgáltatásokat. A következőkben a rendelés menetét fogom ismertetni.
3.2.1. Bejelentkezés Sikeres regisztráció esetén automatikusan átirányítódunk a bejelentkezési oldalra, ahol is az általunk választott felhasználónévvel és jelszóval beléphetünk (lásd az alábbi ábrán) az oldalra immáron Tagként.
6. ábra Be- és Kijelentkezés
A sikeres bejelentkezés után megtekinthető a felhasználói adatlap (lásd az alábbi ábrákon), valamint látható, hogy a kosár még üres („Az Ön kosara jelenleg üres!”). 10
Online könyvesbolt fejlesztése PHP és MySQL alapokon
Négyesi Péter
7. ábra Felhasználói adatok
3.2.2. Adatmódosítás Amennyiben felhasználói adatainkat módosítani szeretnénk, úgy kattintsunk a felhasználónevünkre, mely hivatkozás révén eljutunk a Személyes információk (oldalra, ahol egy grafikus felület áll rendelkezésünkre az Adatmódosítás elvégzésére. Ahogy az alábbi ábrán is jól látható, a felhasználónevünk kivételével bármelyik személyes adatunkat megváltoztathatjuk, amennyiben a módosítás(ok) bevitele után a Frissítés gombra kattintunk. A jelszavunk biztonsági okokból nem látható a Jelszó mezőben, ugyanakkor a kívánt új jelszó begépelésével és a Frissítés gomb megnyomásával ez a módosítás is elvégezhető.
8. ábra Adatmódosítás
3.2.3. Könyvek böngészése Most menjünk vissza a Főoldalra (kattintsunk a fejléc megfelelő ikonjára, avagy a láblécben a megfelelő hivatkozásnévre), majd a Sikerlista részből válasszunk ki egy tételt a könyv címére vagy képére való kattintással. 11
Online könyvesbolt fejlesztése PHP és MySQL alapokon
Négyesi Péter
Ezen az oldalon megtekinthetjük a kiválasztott könyv adatait (lásd az alábbi ábrán), mely révén ellenőrizhetjük, hogy a kívánt szerzőjű, tartalmú és értékű könyvet fogjuk-e megrendelni, avagy tovább folytathatjuk a könyvek közötti böngészést:
9. ábra Könyv adatai
3.2.4. Értékelés Ugyanezen az oldalon található meg a könyvek értékelését szolgáló funkció grafikus felülete is (lásd a lenti ábrán), ahol megtekinthető az eddigi értékelések átlaga (max. 5 csillag), az eddigi értékelések száma és a Tag által adott értékelés, mely lehet: Rossz, Átlagos, Jó, Nagyon jó és Kitűnő. Ezen lehetőségek egyikét kiválasztva, majd az Értékel gombra kattintva véleményezhetjük az adott könyvet.
10. ábra Értékelés
3.2.5. Kosár Szintén ugyanezen az oldalon van lehetőségünk a kiválasztott könyvet a kosarunkba tenni, melyhez csupán annyi szükséges, hogy megadjuk a rendelni kívánt mennyiséget (darabszámot) és a Kosárba gombra kattintsunk.
11. ábra Kosárba rakás felülete
12
Online könyvesbolt fejlesztése PHP és MySQL alapokon
Négyesi Péter
A kiválasztott könyv(ek) kosárba tétele után eljutunk a kosarunkhoz, ahol már szerepel(nek) az előzően hozzáadott tétel(ek) (lásd az alábbi ábrán):
12. ábra Kosár tartalma
A kosarunkba kerülő tételek mindegyike szerkeszthető a
(Szerkesztés) ikonra történő
kattintással, melynek segítségével frissíthetjük a Mennyiséget illetve akár törölhetjük is az adott tételt. A Böngészés gombra kattintva folytathatjuk a böngészést, újabb könyveket adhatunk hozzá a kosarunkhoz.
3.2.6. Rendelés Miután a megrendelni kívánt termékeket hozzáadtuk a kosarunkhoz, az Ellenőrzés gombra kattintva eljutunk a rendelésünk adatait tartalmazó oldalra (lásd az alábbi ábrán):
13. ábra Megrendelés adatai
A Feladó, az E-mail és a Szállítási cím mezők kitöltésével nem kell bajlódnunk, ezáltal is könnyítve és gyorsítva a megrendelés menetét. A fenti ábra jobb felső részében kap helyet a rendelésünk végösszege. A Levél szövege mezőben általános tájékoztatást kapunk a Rendelés és fizetés módjáról (előre utalás a megadott számlaszámra), de ugyanakkor ez a tartalom szerkeszthető is, mely révén kérdéseket intézhetünk az online könyvesbolt üzemeltetője felé, ha további megjegyzésünk, esetleg kérésünk lenne a rendelés lebonyolításával kapcsolatban. 13
Online könyvesbolt fejlesztése PHP és MySQL alapokon
Négyesi Péter
A Kosárba gombra kattintva módosíthatjuk kosarunk tartalmát (tétel hozzáadása, törlése, frissítése), míg ha a Megrendelés gombra kattintunk, akkor a rendelésünk elküldésre kerül. Ezután kapunk egy visszaigazolást (lásd az alábbi ábrán). Ha a Vissza gombra kattintunk, újra a kosarunknál találjuk magunkat, mely már ismét üres.
14. ábra Visszaigazolás
3.2.7. Kijelentkezés A vásárlás befejezése után jelentkezzünk ki az oldalról. Ezt kétféleképpen tehetjük meg. A Kijelentkezés első módszere, hogy a láblécben a Be- és Kijelentkezés hivatkozásra, avagy a fejlécben az ennek megfelelő ikonra kattintunk. Ezután a megjelenő oldalon kattintsunk a Kilépés gombra. A második kijelentkezési módszer, mely egyszerűségét tekintve inkább tekintendő az elsődleges módszernek, hogy a fejléc jobb felső sarkában rákattintunk a (Kilépés) ikonra. Három perc tétlenség esetén automatikusan kiléptetésre kerülünk, újbóli bejelentkezés szükséges.
3.3. Rendszergazda szemszögéből A Rendszergazda jelen esetben az online könyvesbolt üzemeltetője. Lehetősége van kezelni a Tagokat, a Rendeléseket, a Könyveket, a Kategóriákat, a Vezércikkeket és a Vezércikk kategóriákat az erre kialakított grafikus felületeken keresztül. Miután rendszergazdaként bejelentkeztünk az oldalra (lásd az alábbi ábrán), a láblécben az Admin Felület hivatkozásra, vagy a fejlécben ennek az ikonmegfelelőjére kattintva eljutunk az Admin Navigáció felületére (lásd az alábbi ábrán).
15. ábra Admin Felület
14
Online könyvesbolt fejlesztése PHP és MySQL alapokon
Négyesi Péter
Az felsorolt elemek mindegyike egy-egy hivatkozás, melyekre való kattintással érhető el az adott funkció. A Kártya típusok kezelése jelenleg csak teszt-üzemmódban elérhető, nem képezi a web-alkalmazás szerves részét.
3.3.1. Tagok kezelése A Tagok kezelése funkció felülete (lásd az alábbi ábrán) 2 részre osztható. Lehetőségünk van a tagok közötti keresésre a teljes vagy részleges felhasználónév, vezetéknév, avagy keresztnév megadásával, majd a Keresés gombra történő kattintással.
16. ábra Tagok kezelése felület
A felület második részében kerülnek felsorolásra a Tagok legfontosabb adatai (Felhasználónév, Vezetéknév, Keresztnév, Jogosultsági szint). Alapértelmezetten az összes regisztrált felhasználó megjelenítésre kerül. A felhasználónévre való kattintással elérhetőek az egyéb személyes adatok is, ahol ha ismét rákattintunk a felhasználónévre, lehetőség nyílik az adatok frissítésére, avagy a felhasználó törlésére. A fenti ábrán látható Beszúr hivatkozásra kattintva a rendszergazda új felhasználót regisztrálhat az oldalra (lásd az alábbi ábrán).
17. ábra Új Tag felvitele
15
Online könyvesbolt fejlesztése PHP és MySQL alapokon
Négyesi Péter
Az új felhasználó felvitelére ugyanazok a szabályok érvényesek, mint a regisztrációnál, annyi különbséggel, hogy a Rendszergazda itt megadja a felhasználó jogosultsági szintjét, ami alapértelmezetten a Tag. A Hozzáadás gombra kattintva már meg is jelenik az új felhasználó a felsorolt Tagok között. Erre a funkcióra akkor lehet szükség, ha például valaki nem akar „bajlódni” a regisztrációval, és a rendszergazdát kéri meg, hogy hozzon létre számára egy felhasználót.
3.3.2. Rendelések kezelése A Rendelések kezelése felület bemutatása előtt először lássuk, milyen formában is érkezik meg egy rendelés a Rendszergazda számára (lásd az alábbi ábrán):
18. ábra Beérkezett rendelés formája
A beérkező e-mail fejlécében látható a felhasználó e-mail címe (
[email protected]), valamint a beérkezés időpontja (20:11). A levél tartalmi részében szerepel a szakdolgozatom egy korábbi fejezetében (3.2.6. Rendelés) bemutatott tájékoztató, valamint ezt követően a megrendelt termék(ek) adatai (Cím, Ár, Mennyiség, Összesen), a rendelés végösszege, illetve a postázási adatok (Név, Cím). Több különböző termék megrendelése esetén a sorszámozott megjelenítés nagyban hozzájárul a tételek megfelelő elkülönítéséhez. Egy termék megrendelése esetén a beérkezett e-mailben a megrendelés adatainak formája az alábbi ábrán látható.
19. ábra Megrendelés adatainak formája egy termék esetén
16
Online könyvesbolt fejlesztése PHP és MySQL alapokon
Négyesi Péter
A Rendelések kezelése felület (lásd az alábbi ábrákon) elsősorban demonstrációs céllal készült, mely azt hivatott bemutatni, hogyan tud a Rendszergazda:
még el nem küldött rendelések között keresni,
még el nem küldött rendeléseket szerkeszteni,
még el nem küldött rendeléseket törölni,
új rendelést felvinni bármelyik felhasználó nevében/részére.
20. ábra Rendelések kezelése felület
21. ábra Új rendelés felvitele
3.3.3. Könyvek kezelése A könyvek kezelése felület (lásd az alábbi ábrán) lehetővé teszi a Rendszergazda számára, hogy aktualizálja az online könyvesbolt termékeinek adatait.
22. ábra Könyvek kezelése felület
17
Online könyvesbolt fejlesztése PHP és MySQL alapokon
Négyesi Péter
A kategória szerinti keresés mellett az Ajánlott (Mind/Igen/Nem) szűrőfeltétel megadásával kezelhetjük a könyvkészletet. Amennyiben egy könyv Ajánlott tulajdonságához Igen értéket rendelünk (pipát teszünk), úgy az a könyv a megrendelhető státuszt veszi fel, megjelenik a Főoldal Sikerlista részében. A
(Szerkesztés) ikonra kattintva frissíthetjük az adott könyv adatait, vagy akár
törölhetjük is az adott tételt (lásd a következő ábrán).
23. ábra Könyv adatainak szerkesztése
A Rendelhető mezőben adhatjuk meg az adott könyv készleten lévő darabszámát. A Kép URL mezőben, ahogy az ábrán is jól látható, az adott könyv képének linkje található, amely lehet egy külső weboldal linkje, avagy jelen esetben a tárhelyünk egy megadott mappájában szereplő kép elérési útvonala. Új könyv felvitele esetén az előző ábra mezőit kell megfelelően kitöltenünk, majd a Hozzáadás gombra kattintanunk.
3.3.4. Kategóriák kezelése Itt tudjuk kezelni a különböző könyvkategóriákat. Az egyes kategórianevekre történő kattintással átnevezhetjük (frissítés), vagy akár törölhetjük is az adott kategóriát. Új kategória felviteléhez elég megadnunk a Kategória nevét, majd rákattintanunk a Hozzáadás gombra.
3.3.5. Vezércikkek kezelése Vezércikkek az összefoglaló neve a Főoldalon megtalálható Személyes kedvencek, Eheti kiemelt könyvek és az Újdonságok csoportoknak. A vezércikkek már felvitt, de még nem rendelhető könyvekhez társíthatók. A kezelőfelületen az egyes vezércikkek címére kattintva módosíthatjuk azok leírását, kategóriáját, vagy akár törölhetjük is az adott vezércikket. Új vezércikket a Cikk címe, a Cikk leírása, a Vezércikk kategória és a Tétel mezők helyes kitöltésével/megadásával vehetünk fel. 18
Online könyvesbolt fejlesztése PHP és MySQL alapokon
Négyesi Péter
3.3.6. Vezércikk kategóriák kezelése Az alkalmazás három fő vezércikk kategóriát kezel (Újdonságok, Eheti, Személyes), melyek igazodnak a 3.3.5. fejezetben (Vezércikkek) felsorolt csoportokhoz. Jelen esetben, a Vezércikk kategóriák felülete (új kategória felvitele, frissítés, törlés) csak demonstrációs célt szolgál, ugyanis a Főoldalon csak a 3 fő kategóriához társított vezércikkek jelennek meg.
3.4. Alkalmazás telepítése és működtetése Az alkalmazás éles, üzemszerű telepítését egy távoli szerveren kell elvégezni, hiszen egy internetes tartalomról van szó. Kipróbálás céljából azonban a telepítést saját gépünkön is megtehetjük, amennyiben a számítógép rendelkezik Apache szerverrel, PHP és MySQL környezettel. Ehhez először töltsük le a http://www.appservnetwork.com oldalról az ingyenes AppServ 2.5.10 alkalmazás Windows-os telepítő fájlját, majd installáljuk fel azt (Telepítési útmutató a Melléklet II. pontjában). Ezután másoljuk a mellékelt zip fájlban található fájlokat helyi szerverünk (localhost) www könyvtárába. Ha nem szeretnénk, hogy ezek a már meglévőekkel összekeveredjenek, tegyük a fájlokat egy új mappába (ha távoli szerverre telepítjük az alkalmazást, úgy az FTP kapcsolattal másoljuk fel a fájlokat a gyökérkönyvtárba, ehhez szükségünk lesz a hozzáférési adatokra). Következő lépésként készítsük elő az adatbázis használatát, nyissuk meg a phpMyAdmin felületet (http://localhost/phpmyadmin/). Itt a felhasználónév alapértelmezetten a root lesz, míg a jelszó az, amit az AppServ telepítése során megadtunk. A felület főoldalán először hozzunk létre egy adatbázist, majd ezt követően importáljuk be a database mappában található MySQL dump fájlt (lásd a következő ábrán).
24. ábra MySQL dump fájl importálása
Ezután a common.php és a db_mysql.inc fájlokban írjuk át az adatbázis-kapcsolódási adatokat az alábbi megjegyzéssel jelölt helyeken: //-- adatbázis kapcsolat kezelése
19
Online könyvesbolt fejlesztése PHP és MySQL alapokon
Négyesi Péter
Az importálás révén létrejön az adatbázis a szükséges táblákkal és tesztadatokkal (4 kategória, 3 vezércikk, 4 vezércikk kategória, 29 könyv), valamint létrejön egy rendszergazda felhasználó (Belépő: admin, Jelszó: admin), amellyel be lehet jelentkezni az Admin Felületre. A fenti műveletek után futtatáshoz írjuk be az oldal webcímét a kompatibilis böngészők valamelyikébe. Amennyiben saját gépünkre telepítettük fel a szervert, úgy webcímként pl. a következő címet írjuk be: http://localhost/szakdolgozat. Az Admin Felületre történő belépést követően ajánlott a jelszavat módosítani, illetve fel lehet venni új rendszergazdát is. A termékekhez rendelt képek az images/books mappában találhatóak meg.
3.5. Hardver és szoftver környezet A felhasználó által használt számítógép (kliensgép) követelményei:
Ajánlott futtatási környezet: Firefox 9+, Opera 10+, Google Chrome 11+ böngészőprogramok; engedélyezett JavaScript támogatás; telepített Flash Player.
Operációs rendszer: a fent említett környezetet futtatni képes rendszer.
Célhardver: minimális, a fenti környezetet futtatni képes hardver.
Az általunk használni kívánt szerver gép követelményei:
Operációs rendszer: tetszőleges.
Web-szerver konfiguráció: PHP 5, MySQL 5 elérhetőség, telepített e-mail kiszolgáló, engedélyezett mail() függvény (telepített e-mail kiszolgáló esetén sem biztos, hogy engedélyezve van, érdemes ellenőrizni).
Célhardver: átlagos konfiguráció, néhány 100 megabyte tárhellyel a képek számától függően.
20
Online könyvesbolt fejlesztése PHP és MySQL alapokon
4.
Négyesi Péter
Fejlesztői dokumentáció Ebben a fejezetben a fejlesztés menetét fogom részletezni. Az alkalmazás PHP 4-es
verzióban íródott, a Notepad++ szövegszerkesztő segítségével. A 4-es verzióval szemben a PHP 5 rengeteg új funkciót tartalmaz, melyek közül legfontosabb az objektum-orientált programozás megfelelően kidolgozott támogatása. Alkalmazásom komplexitását és a szükséges fejlesztési időt mérlegelve mégis a 4-es verzióval kompatibilis, procedurális programozási módot alkalmaztam. A rendszer által használt adatbázis a MySQL 5-ös verziójára támaszkodik. Az implementáció során nem ütköztem semmilyen olyan problémába, amelyet a MySQL fejlettebb rendszerekhez képesti limitált képességei idéztek volna elő. A kódolás során használom a php szuperglobális változóit, melyek közül az egyik legfontosabb a $_SESSION, ez tárolja a munkamenethez rendelt változókat. A $_POST (az alkalmazásomban csak ezt használom) és $_GET szuperglobális asszociatív tömbök a HTTP protokoll POST illetve GET metódusai által a kiszolgálónak továbbított adatokat tárolják. Web-alkalmazás
fejlesztésekor
mindig
fontos
szempont
az
egyszerűség,
az
áttekinthetőség és a későbbiekben történő esetleges továbbfejlesztés lehetősége. Épp ezért a megírt kódnak könnyen értelmezhetőnek kell lennie, melyet figyelembe vettem az alkalmazás megírásakor. Az alkalmazás működéséért elsősorban PHP fájlok, másodsorban JavaScript (JS) és CSS fájlok felelnek. A JS fájlok általában kliens oldali működést valósítanak meg, melyekre a barátságosabb működés miatt van szükség. A CSS fájlok a megjelenésre vonatkozó stíluslapok, melyeket most nem részletezem.
4.1. Feladatspecifikáció A feladat egy adatbázis alapú, interaktív, esztétikus megjelenésű és ergonómikus webáruház fejlesztése. A weboldal kategóriák és címek szerint is legyen képes megjeleníteni a termékkínálatot. A Főoldalon kapjanak helyet a rendelhető könyvek, a várható újdonságok, az üzemeltető személyes kedvencei, és az adott heti kiemelt könyvek. Az üzemeltetőnek legyen lehetősége egy bemutatkozó videó megosztására az oldalon. Az oldal rendelkezzen egy egyszerű és összetett keresővel, melyek révén az oldalra érkező látogató megtekintheti a kínálatot. A termékeket csak regisztráció és bejelentkezés után lehessen kosárba tenni, megrendelni, értékelni. Egy összeállított kosarat lehessen rendelésként feladni, melyről az üzemeltető e-mailben, a felhasználó pedig egy visszaigazolás formájában értesüljön. A regisztrált tagoknak legyen lehetőségük adataik módosítására. 21
Online könyvesbolt fejlesztése PHP és MySQL alapokon
Négyesi Péter
A regisztrációs űrlap „bolond biztos” kell, hogy legyen, azaz egyértelművé kell tenni a leendő tag számára, milyen formátumú adatok bevitelével tud sikeresen regisztrálni az oldalra. A bejelentkezett tag felhasználóneve jelenítődjön meg az oldalon egy kijelentkezési ikon társaságában, ezzel vizuális értesítést küldve neki az oldalra való sikeres belépésről. A fentiekben felsorolt összes funkció legyen adminisztrálható egy jelszóval védett felületen, ahol programozói közbeavatkozás nélkül ezek könnyedén megtehetőek (pl. könyvek, vezércikkek felvitele, szerkesztése és törlése, regisztrált felhasználók listázása). Az adminisztrációs felület csak a rendszergazda számára legyen elérhető.
4.2. Használati eset diagram Az alábbi ábrán látható a web-alkalmazás használati eset diagramja, melyet a Pacestar UML Diagrammer szoftverrel készítettem el.
25. ábra Használati eset diagram
22
Online könyvesbolt fejlesztése PHP és MySQL alapokon
Négyesi Péter
4.3. Adatbázis terv Az alkalmazás egyetlen adatbázist használ a könyvekkel kapcsolatos adatok lekezelésére és a regisztrált felhasználók adataira is. Az adatbázisban hat táblát hoztam létre, melyek nevét és a mezőneveket angolul neveztem el (lásd az alábbi ábrán).
26. ábra Az adatbázis felépítése
Az adatbázishoz való kapcsolódás illetve az egyéb adatbázis függvények a db_mysql.inc fájlban találhatóak.
4.3.1. Táblák ismertetése Ebben a fejezetben az elkészített 6 adattábla szerkezetét mutatom be ABC sorrendben, ennek fényében magyarázom az oldal működését. A vastagon szedett mezőnév jelenti az elsődleges kulcsot. Minden táblához az alapértelmezett MyISAM motort, valamint az utf8_general_ci illesztést alkalmaztam. categories: könyvkategóriák adatainak tárolására szolgál Mezőnév category_id name
Típus int(11) varchar(50)
Leírás könyvkategória azonosítója könyvkategória neve
1. táblázat A categories tábla
editorials: Mezőnév article_id editorial_cat_id article_title article_desc item_id
Típus
Leírás vezércikk azonosítója vezércikk kategóriájának azonosítója vezércikk címe vezércikk leírása/tartalma könyv azonosítója
int(11) int(11) varchar(200) text int(11)
2. táblázat Az editorials tábla
Ebben a táblában tárolom le a Főoldalon megjelenő Vezércikkek (Személyes kedvencek, Újdonságok, Eheti kiemelt könyvek) adatait. A vezércikk egy, még nem rendelhető könyvhöz kapcsolódik, van kategóriája, címe és leírása. 23
Online könyvesbolt fejlesztése PHP és MySQL alapokon
Négyesi Péter
editorial_categories: vezércikk kategóriák adatainak tárolására szolgál Mezőnév editorial_cat_id editorial_cat_name
Típus
Leírás vezércikk kategória azonosítója vezércikk kategória neve
int(11) varchar(50)
3. táblázat Az editorial_categories tábla
items: Mezőnév item_id category_id name author price product_url image_url notes is_recommended rating rating_count rendelheto
Típus int(11) int(11) varchar(255) varchar(100) int(11) varchar(255) varchar(100) text tinyint(4) int(11) int(11) int(2)
Leírás könyv azonosítója könyvkategória azonosítója könyv címe könyv szerzője könyv ára könyv url címe (Amazon v. 7books) könyv borítójának url címe könyv tartalma könyv ajánlott/rendelhető-e könyv értékelése (1-5) könyv értékeléseinek száma könyv rendelhető max. darabszáma
4. táblázat Az items tábla
Ebben a táblában tárolom le az egyes könyvek adatait. Amennyiben az is_recommended mező értéke 1 (az admin felületen a checkbox be van pipálva), úgy a könyv megjelenik a Főoldalon a rendelhető könyvek között (Sikerlista). Az image_url mezőben adhatjuk meg a könyv borítójának elérési útvonalát. A borító képének kiterjesztése lehet: jpg, gif, png. members: Mezőnév member_id member_login member_password member_level first_name last_name email phone address notes
Típus
Leírás tag azonosítója tag felhasználóneve tag jelszava tag jogosultsági szintje tag vezetékneve tag keresztneve tag e-mail címe tag telefonszáma tag postacíme megjegyzések
int(11) varchar(20) varchar(50) int(11) varchar(50) varchar(50) varchar(50) varchar(50) varchar(50) text
5. táblázat A members tábla
Ebben a táblában tárolom le a regisztrált tagok adatait. A jogosultsági szint lehet 1 (Tag) vagy 2 (Rendszergazda). Az oldalra történő sikeres regisztrációval a felhasználó jogosultsági szintje automatikusan 1-re állítódik.
24
Online könyvesbolt fejlesztése PHP és MySQL alapokon
Négyesi Péter
orders: rendelések adatainak tárolására szolgál Mezőnév order_id member_id item_id quantity
Típus
Leírás rendelés azonosítója tag azonosítója könyv azonosítója rendelési mennyiség/darabszám
int(11) int(11) int(11) int(11)
6. táblázat Az orders tábla
A rendelések tábla szerkezetét tekintve jól látható, hogy csupán azt tárolja el, hogy „ki miből mennyit” vásárolt, ehhez társul egy rendelési azonosító. Amint a rendelés elküldésre kerül, a kosár automatikusan kiürül, ezáltal a tábla tartalma is.
4.3.2. Táblák kapcsolata Az alábbi ábrán, melyet a MySQL Workbench (a DBDesigner utódja) keresztplatformos adatbázis-tervezésre szolgáló szoftverrel készítettem el, jól látható a táblák közötti kapcsolat.
27. ábra A táblák kapcsolata
25
Online könyvesbolt fejlesztése PHP és MySQL alapokon
Négyesi Péter
4.4. Adatbiztonság Egyes hackerek közvetlenül támadják meg a kiszolgálókat és hálózatokat, de a legtöbben az ezeken futó nem biztonságos alkalmazásokat keresik, és általuk nyitnak kaput a kiszolgálóra vagy hálózatra. Azért az alkalmazásokat veszik célba, mert gyakran ezek a rendszer leggyengébb láncszemei. Magát a kiszolgálót a fizikai biztonság és a hálózat védi, a hálózatot pedig egy tűzfal. A kiszolgálón futó alkalmazások azonban gyakran nyitott ajtók, amelyeken keresztül mind a fizikai biztonság, mind a hálózat biztonsága megkerülhető (lásd az alábbi ábrán).
28. ábra Alkalmazások sebezhetősége3
Amint a kódunk futni kezd egy nyilvános kiszolgálón, feltételeznünk kell, hogy egy hacker előbb-utóbb rátalál, és megpróbálja feltörni. További biztonsági problémát jelent a felhasználó által a rendszerbe bevitt adatok kezelése. Mivel valamilyen formában tárolnunk kell a felhasználó e-mail címét és jelszavát ahhoz, hogy beléphessen, biztosítanunk kell azt is, hogy rajtunk és a programon kívül más ne férhessen hozzá ezekhez az adatokhoz. A hitelesítési információk tárolásának modernebb megközelítése egy felhasználói adatbázistábla (members tábla) használata. Ennél a módszernél a felhasználónevek és jelszavak az alkalmazás adatbázisának egy táblájában tárolódnak, az adott felhasználóra nézve egyéb fiókadatokkal együtt. Amikor egy felhasználó bejelentkezik az alkalmazásba, a felhasználónevét és jelszavát a program elküldi az adatbázisnak, amely TRUE vagy FALSE választ ad rá, attól függően, hogy a felhasználónév-jelszó pár megfelel-e a tábla valamelyik bejegyzésének, vagy sem. Mindezeket figyelembe vettem az alkalmazásom megírásakor.
4.4.1. Bemenet érvényességének ellenőrzése Az alapelv az, hogy minden felhasználói bemenetet ellenőrzünk, és mindent visszautasítunk, ami nem tűnik érvényesnek. Ehhez meg kell határoznunk, hogy az elvárásainknak milyen formátumú felhasználói bemenet felel meg. 3
Ballad [2010]
26
Online könyvesbolt fejlesztése PHP és MySQL alapokon
Négyesi Péter
Mikor a felhasználó a regisztráció során megadja felhasználónevét, jelszavát, e-mail címét, és egyéb szükséges adatait, reguláris kifejezéseket alkalmazva ellenőrzöm azok helyességét (a bevitt adat megfelel-e az előre megadott mintának), minimálisra csökkentve ezzel az SQL-befecskendezés lehetőségét. Az alábbi táblázatban felsorolom a verifikáció során használt reguláris kifejezéseket: Mezőnév
Reguláris kifejezés
Felhasználónév
/^[_a-z0-9-]*$/
Jelszó
/^[_a-zA-Z0-9-!]*$/
Teljes név
/^[a-zA-Z- áéíóöőúüűÁÉÍÓÖŐÚÜŰ]*$/
E-mail cím
/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-
Cím
/^[a-zA-Z0-9-\/\.\, áéíóöőúüűÁÉÍÓÖŐÚÜŰ]*$/ ]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/ /^06-(20|30|70)-([0-9]){7}$/
Telefonszám
7. táblázat Reguláris kifejezések
Hibaüzenete(ke)t kaphat a felhasználó a következő esetekben (lásd az alábbi ábrán):
üresen hagytunk egy kötelezően kitöltendő mezőt
nem megengedett karakter(eke)t használtunk bármelyik mezőben
olyan felhasználónevet választottunk, amely már szerepel az adatbázisban
olyan e-mail címet választottunk, amellyel már regisztráltak
29. ábra Regisztrációs hibaüzenetek
Feltételezve, hogy az oldalra regisztrálók valós vásárlási szándékkal rendelkeznek, érvényes formátumú adatok megadása után nem iktattam be validációt, azaz érvényesítést. Ezután már sor kerülhet a belépésre, melyhez szükségünk lesz a felhasználó azonosítására, az ehhez szükséges adatok ideiglenes tárolására. Ehhez egy munkamenet sütit fogok használni, 27
Online könyvesbolt fejlesztése PHP és MySQL alapokon
Négyesi Péter
ami a böngészőablak bezárása után törlődik a felhasználó számítógépéről. A sütiben egy változó értéket fogok tárolni a süti azonosítására, természetesen titkosítva, megakadályozva ezzel a munkamenet-rögzítés és munkamenet-eltérítés lehetőségét. A PHP beépített session_regenerate_id( ) függvény ugyan hatásos védelmet nyújt az ilyesfajta támadások
ellen, én mégis inkább a süti azonosítójának titkosítása mellett döntöttem.
4.4.2. Jogosultság-ellenőrzés Egy dinamikus honlapon gyakran szükség van arra, hogy különböző felhasználókat különítsünk el és további jogokat biztosítsunk számukra a weblaphoz történő hozzáférés tekintetében. Ennek megfelelően 3 felhasználót különböztetek meg: Vendég, Tag (1), Rendszergazda (2). A zárójelekben szereplő számok a jogosultsági szintek értékei. A jogosultság ellenőrzéséért a check_security($iLevel) függvény felel, melynek kódja a következő: function check_security($iLevel) { global $UserRights; if(!session_is_registered("UserID")) { header ("Location: login.php?querystring=" . tourl(getenv("QUERY_STRING")) . "&ret_page=" . tourl(getenv("REQUEST_URI"))."&message=1"); } else { if(!session_is_registered("UserRights") || $UserRights < $iLevel) header ("Location: login.php?querystring=" . tourl(getenv("QUERY_STRING")) . "&ret_page=" . tourl(getenv("REQUEST_URI"))."&alert=1");} }
Vendégként ($iLevel<1) mindösszesen 2 funkció elérhető, a Keresés valamint evidens módon a Regisztráció. Ha mindezek ellenére megpróbálunk mégis „tiltott területre” lépni, abban az esetben automatikusan átirányítódunk a belépési oldalra egy hibaüzenet (&message) kíséretében (lásd az alábbi ábrán).
30. ábra Jogosultsági hibaüzenet 1
28
Online könyvesbolt fejlesztése PHP és MySQL alapokon
Négyesi Péter
Amennyiben egy már bejelentkezett felhasználó ($iLevel=1) szeretne az Admin Felületre navigálni ($iLevel<2), úgy egy, a fentihez hasonló hibaüzenet (&alert) kíséretében értesítést kap (lásd az alábbi ábrán), hogy nincs jogosultsága megtekinteni az oldalt.
31. ábra Jogosultsági hibaüzenet 2
Összefoglalva, ha egy oldal megtekintéséhez 1-es jogosultsági szint szükséges, úgy azokat csak Tagok láthatják, ha 2-es jogosultsági szint szükséges, úgy azokat csak a Rendszergazda tekintheti meg.
4.4.3. Jelszavak titkosítása A megadott felhasználónév és jelszó biztosítja a felhasználó számára a hozzáférést az oldalhoz, ezeket érdemes olyan formában tárolni, hogy más ne férhessen hozzá. Ez főként a jelszóra igaz, mivel azt más számára nem szabad olvasható formában tárolni. Ennek oka, hogy egy felhasználó más oldalakon is ugyanazt a jelszót használhatja, és ha mi kiadjuk, akkor elég komoly gondot okoztunk számára. Egyirányú hash algoritmussal minimális többlet-erőfeszítéssel érhetünk el magasabb szintű biztonságot. A legrégebbi és legkevésbé biztonságos a crypt() függvény által kínált Unix Crypt algoritmus. Az md5() függvény által megvalósított Message Digest 5 (MD5) algoritmus ennél erősebb. Még erősebb ugyanakkor a Secure Hash Algorithm 1 (SHA-1) nevű algoritmus, melyet én is használok a jelszavak titkosítására. Az sha1() PHP függvény erős, egyirányú kriptográfiai hash függvény , melynek prototípusa a következő: string sha1 ( string str [, bool nyers_kimenet] )
Ha adott az str karakterlánc, a függvény egy pszeudo-véletlenszerű, 40 karakteres sztringet ad vissza. Vegyük például a „jelszo” karakterláncot: az sha1() függvény ekkor a 2f712f2b4c17b108f5961465d36a19c98301c173 sztringet adja vissza. Ezt nem lehet visszafejteni, még az sem tudja „jelszo”-vá visszaalakítani, aki létrehozta. Az sha1() függvény hasznosságát az adja, hogy kimenete egyértelmű (determinisztikus). Ha ugyanazt a karakterláncot adjuk neki, az sha1() mindig ugyanazt az eredményt fogja visszaadni. Nem 29
Online könyvesbolt fejlesztése PHP és MySQL alapokon
Négyesi Péter
szükséges tisztában lennünk azzal, hogyan nézett ki a jelszó az sha1( ) függvény alkalmazása előtt, csak arról kell meggyőződnünk, hogy az sha1() függvényt a begépelt és az eredeti jelszóra alkalmazva ugyanazokat a kimeneteket kapjuk-e.4
4.5. Az egyes funkciók működése Az alkalmazásom magját a common.php fájl képezi, mely tartalmazza a rendszerben használt függvények kódját, valamint include-olva a db_mysql.inc fájlt, amely az adatbázis függvényeket tartalmazza. Az oldalak többségének kódjában a következő fájlok vannak include-olva:
common.php
fejlec.php
lablec.php A fejléc bal felső sarkában található YouTube ikonra kattintva a Lightbox JS technológia
révén elérhetővé válik az oldal üzemeltetőjének bemutatkozó videója, melynek URL-je a fejlec.php fájlban a jelölt helyen módosítható. A láblécben találhatóak az egyes szöveges navigációs elemek, melyek megjelenítéséért a Footer_Show() függvény, míg a fejlécben ezek ikonmegfelelői, melyek megjelenítéséért a Menu_Show() függvény felel. A Regisztráció csak abban az esetben jelenik meg a fejlécben és
a láblécben, ha még nem jelentkeztünk be az oldalra, vagyis még nem vagyunk Tagok. Ezt a következőképpen oldottam meg: amennyiben az if($_SESSION["UserID"] == NULL) feltétel igaz, vagyis Vendég felhasználóról van szó, úgy elérhető a regisztrációs ikon és navigációs elem, egyébként nem. Ugyanezt a feltételt alkalmaztam a Reg_Show() függvény esetében is, amely a regisztrációs űrlap megjelenítéséért felel, ha valaki annak ellenére, hogy már regisztrált, megpróbál újra regisztrálni (beírja a regisztrációs oldal címét a böngészőbe). Ekkor az alábbi hibaüzenet jelenik meg:
32. ábra Többszörös regisztráció nem engedélyezett
4
Luke Welling [2010]
30
Online könyvesbolt fejlesztése PHP és MySQL alapokon
Négyesi Péter
A regisztrációs űrlap input mezőiben megadott értékek helyességét a preg_match() függvény ellenőrzi, melynek első paramétere az elfogadott minta (reguláris kifejezés), második paramétere pedig a vizsgálandó változó. Ha az adott változó megfelel a mintának, úgy a függvény visszatérési értéke TRUE, egyébként FALSE. A felhasználónév helyességét ellenőrző függvény (is_valid_user) például így néz ki: function is_valid_user($fldmember_login) { if(preg_match("/^[_a-z0-9-]*$/", $fldmember_login)) { return true; } else { return false; } }
A függvény paramétere a $fldmember_login (felhasználónév mezőben megadott értéknek megfelelő változó), melyre ha a preg_match() függvény visszatérési értéke TRUE, úgy helyes a felhasználónév, egyébként FALSE, vagyis nem megengedett karakter(eke)t tartalmaz. Ellenőrzésre kerül még, hogy a Jelszó és a Jelszó megismétlése mezőben megadott értékek megegyeznek-e, ezt a következőképp valósítottam meg: if ($fldmember_password != $fldmember_password2) { $sRegErr .= "\nA két jelszó nem egyezik."; }
Vagyis, ha a Jelszó mezőben ($fldmember_password) és a Jelszó megismétlése mezőben ($fldmember_password2) megadott értékek nem egyeznek, úgy hibaüzenetet kap a
felhasználó: A két jelszó nem egyezik. Ezeken kívül még megvizsgáltam azokat az eshetőségeket is, hogy a regisztrálandó felhasználónév és e-mail cím szerepel-e már az adatbázisban. if(strlen($fldemail)) { $iCount = 0; $iCount = dlookup("members", "count(*)", "email=" . tosql($fldemail, "Text")); if($iCount > 0) $sRegErr .= "Ez az e-mail cím már foglalt.
"; }
Először az strlen() függvény segítségével megvizsgálom, hogy az e-mail cím mezőben ($fldemail) lett-e megadva érték. Ha igen, akkor deklarálok egy változót ($iCount),
melynek kezdeti értéke 0. Ezután az előző változóhoz új értéket rendelek, amely nem lesz 31
Online könyvesbolt fejlesztése PHP és MySQL alapokon
Négyesi Péter
más, mint a dlookup() függvény visszatérési értéke. A függvény az adatbázis members táblájában megvizsgálja, hogy a bemenetben szereplő e-mail cím megegyezik-e az ott tárolt email címek egyikével. Ha igen, akkor a $iCount változó értéke 1 lesz, vagyis ez az e-mail cím már foglalt, ahogy ezt a hibaüzenet is jelzi. Hasonlóképpen oldottam meg a felhasználónév elérhetőségének ellenőrzését is. Ha a regisztrálandó adatok mindegyike átmegy az ellenőrzésen, úgy azok feltöltődnek az adatbázis members táblájába, ezzel új felhasználó került felvételre a rendszerbe. A felhasználó jelszava az sha1() függvénnyel titkosítva kerül be az előbb említett táblába. A be- és kijelentkezést (megjelenítéséért a Login_Show() függvény felel) egy switch szerkezettel oldottam meg. Bejelentkezés esetén a felhasználó által beírt felhasználónevet és jelszót letárolom egy-egy változóba ($sLogin, $sPassword), rögtön az input mezők ellenőrzése után. A jelszót, természetesen, sha1() függvénnyel itt is titkosítom. Ezután eme 2 változó értékét összevetem az adatbázis members táblájában szereplő bejegyzésekkel, és lekérdezem, létezik-e ilyen felhasználó. Ha igen, a rendszer deklarál két új munkamenet változót, melyeknek átadásra kerül a felhasználó azonosítója és jogosultsági szintje. Ezután a rendszer belépteti az adott felhasználót, és átirányítja a kosar.php oldalra, ahol személyes adatait és a jelenleg üres kosarát látja. A belépési folyamatot az alábbi folyamatábrával is szemléltetem:
33. ábra A belépési folyamat
32
Online könyvesbolt fejlesztése PHP és MySQL alapokon
Négyesi Péter
Kijelentkezés esetén a felhasználó azonosítója és jogosultsági szintje törlődik a 2 munkamenet változóból. Bejelentkezés után a fejléc jobb felső sarkában található kép belsejében megjelenik az adott Tag felhasználóneve, az eddigi Vendég felirat helyett. Ezt a következő módon oldottam meg: ha az if ($_SESSION["UserID"] == NULL) feltétel igaz, úgy a kiírandó $user változó értéke Vendég. Ellenkező esetben lekérdezem az adatbázis members táblájából az adott felhasználói
azonosítónak
megfelelő
(member_id=".$_SESSION["UserID"].")
felhasználónevet, melyet eltárolok a $num tömb típusú változóban. Ekkor a kiírandó $user változó értéke a $num[0] lesz. A konyvadatok.php oldalon több funkció is alkalmazásra kerül. Itt kerülnek megjelenítésre a Detail_Show() függvény által a Főoldalon kiválasztott könyv részletes adatai. Itt tehetjük kosárba az adott könyvet, megadva a rendelni kívánt mennyiséget, mely felület megjelenítéséért az Order_Show() függvény felel. Nem utolsó sorban itt értékelhetjük az adott könyvet, melyet a Rating_Show() függvény által megjelenített felületen tehetünk meg. A Detail_Show() függvény lekérdezi az adatbázis items táblájából az adott könyv adatait, melyet változókban tároltam el, majd azokat táblázatos formában jeleníti meg (Könyv adatai felület). Az ár helyes formátumú megjelenítéséért a number_format() függvény felel. A Order_Show() függvény által megjelenített felületen (Kosárba) jól látható, hogy a Mennyiség mező mellett zárójelben szerepel egy érték, mely esetünkben az adott könyv maximálisan rendelhető, készleten lévő darabszámát ($rendelhetoMax) jelöli. Az ezt tartalmazó változó értéke az adatbázis items táblájából kinyert rendelheto mezőben megadott érték. Ez az érték az Admin Felületen megadható új könyv felvitele esetén, illetve módosítható a könyv adatainak szerkesztésével. Ha a mennyiség megadása után kosárba tesszük a terméket, úgy az adatok (tag azonosítója, rendelési mennyiség, könyv azonosítója) feltöltődnek az adatbázis orders táblájába. Minden egyes kosárba tett termék külön rendelési azonosítót kap. A Rating_Show() függvény által megjelenített felületen (Értékelés) látható az eddig értékelések átlaga ($fldrating_view), az eddigi szavazatok száma ($fldrating_count), illetve a Tag által megadható értékelés ($fldrating). Az értékelések átlag úgynevezett „5 csillagos” rendszerben történik. Alapértelmezetten a következő értesítést láthatjuk: az adott könyvet még nem értékelték. A csillagok kapcsolatban állnak a Tag által megadható értékeléssel: 33
Online könyvesbolt fejlesztése PHP és MySQL alapokon
1* = Rossz (1)
2* = Átlagos (2)
3* = Jó (3)
4* = Nagyon jó (4)
5* = Kitűnő (5)
Négyesi Péter
if ($fldrating_view == 0) { $fldrating_view = "Még nem értékelték"; $fldrating_count_view = ""; } else { $fldrating_view = "
"; }
Vagyis, ha még egy felhasználó sem értékelte az adott könyvet, úgy a $ fldrating_view változó értéke „Még nem értékelték”, ellenkező esetben a Tagi értékelések és az eddigi szavazatok számának átlagának egészre kerekített értékének megfelelő csillagszámú kép elérési útvonala (Pl.:
). A kosar.php oldalon az Items_Show() függvény jeleníti meg az eddig kosárba tett termékeket az alábbi lekérdezés által: SELECT
order_id,
name,
price,
quantity,
member_id,
quantity*price
as
sub_total FROM items, orders WHERE orders.item_id=items.item_id ORDER BY order_id;
Ahogy a lekérdezésből is jól látható, a tételenkénti összeg (Összesen) egyenlő a Mennyiség és az Ár szorzatával. Egy fix érték (Postaköltség) automatikusan hozzáadódik a Fizetendő összeghez (megjelenítéséért a Total_Show() függvény felel), mely minden egyes rendelésnél megegyezik. A
(Szerkeszt) ikonra kattintva frissíthetjük vagy törölhetjük az adott tételt a
ShoppingCartRecord_Show()
függvény segítségével, mely egy switch szerkezet révén
frissítéskor (case "update":) az adatbázis orders táblájában frissíti az adott rendelési azonosítóhoz tartozó felhasználói azonosítót és a rendelési mennyiséget, míg törléskor (case "delete":) eltávolítja az adott rendelési azonosítóhoz tartozó tételt.
A kosar.php oldal a megrendelés adatait továbbküldi egy rejtett form révén a megrendel.php oldalnak. Az alábbi kódrészlet ennek menetét tükrözi:
34
Online könyvesbolt fejlesztése PHP és MySQL alapokon
Négyesi Péter
do { [...] $trash[$i] = $fldorder_id; //egy tömb típusú változóban eltárolom az aktuális rendelések azonosítóját // A $masolando egy kétdimenziós tömb típusú változó, melynek tartalma a kosárban található tételek adatai $masolando[$i][0] = $flditem_id; $masolando[$i][1] = $fldprice; $masolando[$i][2] = $fldquantity; $masolando[$i][3] = $fldsub_total; $i++; $is_next_record = @$db->next_record(); } while($is_next_record); //amíg van rákövetkező tétel a kosárban echo '