kategória | ||||||||||
|
||||||||||
|
||
A 6. Munka az adatbázisokkal című fejezet azoknak a PHP-s eszközöknek a használatát mutatta be, amelyekkel az adatbázisokban tárolt információkhoz férhetünk hozzá. Az előző fejezetben a felhasználói felület és a kód szétválasztásának módszeréről volt szó a sablon alapú rendszerek felhasználásával. Ez a két 535f54f fejezet együtt adja ennek a fejezetnek a keretrendszerét, amelyben a részletek magas szintű tervezésével és implementálásával foglalkozunk. Az alacsony szintű adatbázis-kezelő függvényekről ezen a helyen nem szólunk. (Azokról a 6. fejezetben és a 2. kötetben, a referenciakönyvben találhat további információkat.)
A szoftverfejlesztés esetében a jó termék mindig a jó tervezés eredménye. Az adatbázis megfelelő tervezésének elmulasztása általában az integrációval, karbantartással és a gyártással kapcsolatos problémákhoz vezet. A megfelelő adatbázis-tervezés megannyi fantasztikus könyv témája. A probléma túl nagy és túl komplex, így csak a munka elkezdéséhez szükséges alapvető információkat tárgyaljuk.
Az első adatbázis-kezeléssel kapcsolatos döntésünkkor az adatbázis-kezelőt (Database Management System, DBMS) választjuk ki, amelyet használni fogunk. Mivel a PHP elég sok népszerű DBMS-t támogat, ezért a döntést a költség, a szükséges funkciók, a skálázhatóság és más DBMS-kulcskérdések vizsgálatával fogjuk meghozni, és nem a nyelvi támogatás a döntő szempont.
Sok PHP-alkalmazás esetén a MySQL DBMS nagyszerű választás, hiszen a PHP-be alapértelmezésként beépítették a MySQL támogatását. A MySQL a GNU nyilvános licence {General Public License, GPL) alatt áll rendelkezésre. Kiterjeszthető SQL-támogatást biztosít, ezenfelül gazdag API-t is. A MySQL installálást és használatát részletesen ismertettük a 6. fejezetben. Jelen fejezet példáit MySQL-adatbázissal fejlesztettük.
Más DBMS-ek is rendelkezésre állnak, és mindegyiknek megvan a maga előnye. Ha nagy forgalmú webes alkalmazást szeretnénk fejleszteni, vagy a tranzakciók támogatására van szükség, akkor fontolóra kell venni az Oracle-t vagy a Microsoft SQL Servert mint DBMS-t. Az alkalmazáshoz szükséges megfelelő DBMS kiválasztásához a DBMS árát, támogatottságát, skálázhatóságát és a funkciókat kell mérlegelnie. A DBMS rossz kiválasztásával a megpróbáltatások súlya alatt gyengén teljesítő vagy teljes egészében kudarcra ítélt alkalmazás készülhet. Ha előfordulhat, hogy az alkalmazás életciklusa alatt a DBMS megváltozhat, akkor generikus API használata javasolt, hogy elszigeteljük az alkalmazástól a DBMS-specifikus függvényeket, és használjunk szabványos SQL-t. Ezenkívül ügyelni kell a különféle DBMS-ek SQL-támogatásának különbségeire is. Az Oracle például támogatja a következőhöz hasonló lekérdezéseket:
select * from table1 where id in ( select id from table2 )
A könyv írásának idején a MySQL nem támogatta hasonló konstrukciók használatát. DBMS-semleges SQL-kód fejlesztése kihívásokkal teli feladat, ezért egy DBMS lecserélése egy nem praktikus megoldás, még relatíve kis alkalmazások esetén sem.
A DBMS kiválasztása után következik az aktuális adatmodell körültekintő létrehozása. Példaképpen képzeljünk el egy on-line árukatalógust, amelyben több kereskedő vagy "bolt" van. Ebben a fejezetben egy ilyen típusú adatbázis tervezését és implementációját ismertetjük részletesen, majd a következő két fejezetben használatos keretrendszert hozzuk létre. Az on-line katalógus célja egyszerű adatbázis, amely az adatokat különböző kereskedők között osztja fel úgy, hogy mindegyik kereskedő több kereskedelmi kategóriával rendelkezzen. A magas szintű modellt a 15.1. ábra mutatja be.
A 15.1. ábra alapján minden kereskedő kialakíthat egy vagy több kereskedelmi kategóriát, és minden kereskedelmi kategória tartalmazhat egy vagy több terméket. Az előbb említett alapvető részletekből az egész adatmodell megformálható. A 15.2. ábra szemlélteti az árukatalógus teljesen kifejlesztett adatmodelljét. A modell tényleges implementációja a 15.1. programlistában olvasható.
Ha a modellt megalkotta és ellenőrizte, akkor kezdődhet az alkalmazás implementációja. Az árukatalógust létrehozó alkalmazás elsődleges céljai a következők:
A termékek információinak logikus, könnyen használható formátumban történő megjelenítése.
Tegye lehetővé egy kereskedő számára, hogy bármikor frissítse a termékekről szóló információkat bármilyen internetkapcsolattal rendelkező helyről.
Tegye lehetővé a kereskedőnek, hogy bármikor kezelje a termékkategóriákat, és termékeket rendeljen a kategóriákhoz bármilyen internetkapcsolattal rendelkező helyről.
Tehát az alapvető feladat az, hogy egy internet alapú módszert biztosítsunk az árukatalógus információinak bővítésére, törlésére, módosítására és megjelenítésére. Az adatkezelés lehetőségeiről részletesen a következő fejezetben lesz szó.
Ha már megterveztük és implementáltuk az adatbázist egy DBMS-ben, akkor kialakíthatjuk az alkalmazás logikáját, amellyel a meglévő adatbázis rekordjait módosítjuk. Az alapműveletek, amelyeket bármilyen típusú adaton végre kell tudnunk hajtani: az új adatok felvétele, meglévő adatok szerkesztése, illetve törlése. Ebben az alkalmazásban az adatok hierarchiáját is tudnunk kell kezelni. Ahhoz, hogy ezt teljesíteni tudjuk, azt az egyetlen üzleti szabályt állítjuk fel, hogy legalább egy termékkategóriával rendelkeznie kell a kereskedőnek ahhoz, hogy új terméket vegyen fel.
Ezt a szempontot szem előtt tartva logikus, hogy úgy kezdjük a munkát, hogy lehetővé tesszük a kereskedőknek a kategóriák információinak kezelését. Az alkalmazás előfeltétele, hogy a kereskedő képes legyen a webhely-kezelőhöz bejelentkezni. A bejelentkezés során beállítjuk a kereskedő ID-jét tartalmazó session változót, amelyet az egész menedzsmentalkalmazásban használni fogunk. Az előzőekben bemutatott sablon alapú rendszert, a FastTemplate-et alkalmazzuk. A 15.2.-15.4. programlistákban olvasható sablonfájlok az adatkezelő alkalmazás alapját alkotják.
A 15.2.-15.4. programlistákban olvasható fájlok tartalmazzák az adatkezelő alkalmazás alapvető keretrendszerét. A kategóriaspecifikus kezelőlap sablonjai az 15.5.-15.7. programlistákban olvashatók. A 15.8. programlistában olvasható szkriptet használtam a sablonok és az adatbázis információinak összeillesztésére.
A szkript először is elindít egy sessiont és ellenőrzi a kereskedő azonosítóját, a $aMerchantID-t. Ha a kereskedő azonosítója nincs beállítva, akkor a felhasználót egy bejelentkező lapra kényszerítjük. A bejelentkező lap ellenőrzi a látogató igazolványait, és ha az ellenőrzés pozitív eredménnyel zárul, akkor az előbb említett session változót a kereskedő azonosítójára állítja be. Ezután a szkript a kereskedő azonosítójával mint szűrővel ellenőrzi a létező kategóriákat az adatbázisban. Ha legalább egy kategória létezik, akkor a szkript egy ciklussal végigmegy az adatokon, és a létező kategóriákból előállít egy táblázatot. A 15.3. ábra mutatja a főlapot, ahogyan azt egy kereskedő két kategóriával látja.
A szkript egy egyszerű hivatkozás segítségével biztosítja egy új kategória felvételét. Ha léteznek kategóriák, akkor minden kategóriának megvan a saját szerkesztés (edit) és törlés (delete) hivatkozása (lásd 15.2. ábra). Az új kategória felvételét megvalósító szkripteket lásd a 15.9. és 15.10. programlistákban.
A 15.10. programlistában található szkript abban hasonlít a többi könyvben található adatok gyűjtésére és érvényesítésére szolgáló szkriptre, hogy ugyanazt a szkriptet használjuk a form nyújtására, a form kezelésére és az elküldött adat érvényesítésére. Ebben az esetben az érvényesség ellenőrzését az IsVlidCategory() és az új kategória tárolását a SaveCategory() függvényekbe csomagoltuk. Ezek a segédfüggvények később a teljes mgmt_funcs.php fájlban olvashatók. Az érvényesítést végző rutin egyszerűen csak egy ugyanolyan nevű kategória meglétét ellenőrzi.
A kategória kezelésének szerkesztő és törlő függvényei nagyon hasonlítanak a könyv többi szkriptjéhez. A 15.8. programlista vizsgálatakor láthatja, hogy minden kategória szerkesztés és törlés hivatkozásai tartalmazzák a kategória azonosítóját. Például a ruházati (Apparel) kategória törlésére szolgáló URL a https://testserver.com/ch 15/mgmt_cat_del.phtml?cat_id = 1. A kategória azonosítóját átadjuk a szkriptnek, így egy egyszerű SQL törlő utasítást lehet összeállítani. A szerkesztéshez is ugyanezt a mechanizmust használtuk a szerkesztő mezőben a név kitöltésére. Nem ismertetjük itt a függvények teljes forrását, mert azok kódja hasonló a 15.9. és 15.10. programlistában láthatókhoz. A kategóriákat törlő és módosító függvényeket az mgmt_juncs.php fájlban találhatjuk (15.12. programlista).
Egy kategória módosításának feltétele, hogy a kategória új neve nem lehet azonos egy már létező kategória nevével. Kategória törlésekor feltétel, hogy a kategória nem tartalmazhat egyetlen terméket sem. Ha termékek lennének a kategóriában, akkor magának a kategóriának a törlése árva termékrekordokat eredményezne, ami az alkalmazás hibájához vezet. Adatbázis által vezérelt webes alkalmazások létrehozásánál a siker fontos tényezője az üzleti szabályok betartása az alkalmazás kódjában. Néhány szabályt a DBMS szolgáltatásaival is betarthatunk: ilyenek például a kényszerített kapcsolati szabályok és a lépcsőzetesen összekapcsolt adatműveletek. Más szabályoknak a triggerek és tárolt eljárások alkalmazásával tudunk a DBMS segítségével megfelelni. Ráadásul az alkalmazás kódját gyakran az üzleti szabályok betartatására használjuk.
Ha az üzleti szabályok menedzsmentjének kódjára támaszkodunk, jó, ha az üzleti szabályok összes aspektusára biztosítunk függvényt. Például használjunk egy DeleteEntity() (entitás törlése) nevű függvényt ahelyett, hogy a törlés SQL-utasítását a kódba építené. Ilyenkor az üzleti szabályokon is gyorsan változtathatunk, aminek hatása a teljes alkalmazásban azonnal megmutatkozik. A DeleteEntity() függvény belsejébe zárhatja az adatbázis integritásával kapcsolatos megszorítások ellenőrzésének logikáját és egyéb üzleti szabályokat, és hibakódokat adhat vissza a cselekvés meghiúsulása okának megfelelően. Ez a kód újrahasznosítását mozdítja előre, és egyszerűsíti az egész alkalmazásra érvényes új logika bevezetését.
Visszatérve az árukatalógushoz, a következő lépés a létező termékek adatainak kezelésére szolgáló lapok létrehozása. Ezek a lapok logikailag azonosak a kategóriák kezelésére szolgáló lapokkal. Az adatkezelő lapot a 15.4. ábra mutatja be, a lapot generáló fő szkript pedig a 15.11. programlistában olvasható.
Az új termékek felvételét, a meglévő termékek törlését és szerkesztését megvalósító lapokat nem részletezzük. Egy új termék felvételének üzleti szabályai a következők:
A terméket egyetlen kategóriához kell hozzárendelnünk.
Kategóriáján belül a termék nevének egyedinek kell lennie.
A termék ára csak nulla, vagy annál nagyobb érték lehet.
A termék rakodási súlya csak nulla, vagy annál nagyobb érték lehet.
Pillanatnyilag a termék törlésének nincsenek megkötései. Amikor egy termék adatait szerkesztjük, akkor ugyanazokat az üzleti szabályokat kell betartanunk, mint egy új termék felvételekor. Az mgmt_funcs.php fájl egy részlete a 15.12. programlistában tartalmaz néhányat az alkalmazás egésze során használt adatbázis-kezelő függvények és üzleti szabályok közül.
Az adatkezelő alkalmazás csak egy kis része az egész termékkatalógus alkalmazásunknak és a webes kezelői felületet biztosítja a katalógus adatainak karbantartására és kezelésére. A termékkatalógus másik fő célja a tételek megjelenítése, a tételek közötti keresés lehetővé tétele, valamint részletes információk megjelenítése a katalógus elemeiről. A fejezet következő részében erről lesz szó.
A termék adatbázis-adatai megjeleníthetők a kategória szerint, betűrend szerint, illetve egy adott termék keresésének lehetőségét tartalmazza. Ahhoz, hogy a termékeket és a kategóriákat kereskedők szerint különíthessük el, ismét olyan session változót használunk, amivel az aktuális kereskedő megjelenítendő adatait azonosítani tudjuk. Ezt a session változót még azelőtt beállítjuk, mielőtt a látogató először belép a termékeket megjelenítő területre.
A termékkatalógus főlapja a 15.5. ábrán látható. Ez a lap azonnali hozzáférést biztosít a kategóriák információihoz és a keresőszolgáltatáshoz. Ha nem létezik kategória (nem tartalmaz terméket), a lap kiírja, hogy a kereskedő számára nem áll rendelkezésre termék. Az ezt generáló fő szkriptet lásd a 15.13. programlistában.
A főlapot generáló sablonfájlok nagyon hasonlítanak a kategóriák kezelését megvalósító szkriptben használatosakhoz. Az előző programlistában a kategóriákra történő kattintáskor az URL-t előállító GerCategoryHREF() függvényhez egy érdekes megjegyzést fűzünk. A függvény az mgmt_funcs.php fájl része, ahogyan az a 15.14. programlistában is látható. A függvény megírásával egy olyan módszert biztosítottunk, amelynek segítőjével ugyanazzal a szkripttel több statikus lapot is tudunk generálni a dinamikus adatokból. Ezt a módszert részleteiben a következő fejezetben mutatjuk majd be.
A termékeket kilistázó szkriptet lásd a 15.15. programlistában. Ez az egyszerű szkript szolgál a kategória szerinti listázás, a betűrendes listázás és a keresés eredményeinek megjelenítésére is.
A szkript az első lépésben meghatározza a megfelelő adatok kiválasztásának módszerét. Ha a szkriptet egy HTTP POST eredményeképpen aktiválták, akkor a keresési szolgáltatás megvalósítására fogjuk használni. Ellenkező esetben ez vagy egy kategória, vagy egy betűrend szerinti listázás. Ha a $cat_id változó be van állítva, akkor kategória szerinti listázást kértek. A szkript a kérés típusáról függően állítja össze az SQL-utasítást. Az SQL-utasítás eredményei alapján az eredménylap termékek egy listáját vagy egy üzenetet tartalmaz, amely tudatja, hogy egyetlen termék sem felelt meg a kritériumnak. Minden rekordra ellenőrizzük a has_image_flag értékét is. Ha az érték true, akkor a kép szabályossá tett nevét használjuk fel, ellenkező esetben pedig egy alapértelmezett képet jelenítünk meg.
A kategóriák szerinti listázás, a betűrendes listázás és a keresés alapú listázás kimeneteit sorrendben a 15.6., 15.7. és 15.8. ábrákon figyelhetjük meg. Alaphoz a "knit" keresési feltételt használtuk.
Eddig tehát az adatbázisok által vezérlet webhelyek megjelenítésére koncentráltunk. Az adatbázisban található adatok megjelenítése általában sokkal egyszerűbb az adatok kezelésénél, mert kevesebb kielégítendő feltétel van, valamint kevesebb alkalma adódik a felhasználónak a hibázásra. A következő két fejezet az itt ismertetett információkra és példákra épít.
Adatbázis-vezérelt webes alkalmazások létrehozásához sok tervezési és fejlesztési munkára van szükség, de az eredmény megéri a befektetett energiát. Ha az adatkezelő rendszer a helyére kerül, akkor az alkalmazást akárhonnan, bármikor módosíthatjuk, ami nagyon dinamikus, kezelhető webes alkalmazást eredményez. Fontos az adatbázis körültekintő tervezése és az alkalmazás üzleti szabályainak megragadása, amelyet a moduláris programozással tehetünk meg. Ha ezeket a lépéseket gondosan megtervezzük és implementáljuk, akkor az alkalmazás kezelése és karbantartása is nagymértékben egyszerűsödik.
:
1448