Ugrás a főoldalra!

Felhasználónév:

Jelszó:

 :: ".$_ASWC_['NAME']." ".$_ASWC_['VERSION']." ".$_ASWC_['STATUS'];?> - [Látogatók: 622017]  
Freelance Jobs

Témaköreink

 


On-line

Dev, Admin: 0
Lektorok, írók: 1
  ÷Magus|BOT
Felhasználók: 0
Vendégek: 1
Tegnap: 0
E havi:
 

Statisztika

Oktatóanyagok száma
 Publikus: 128

Legolvasottabb írónk
 outesticide 287847

Legszorgalmasabb írók
1. balymo 24
2. outesticide 20
3. tipli 19
4. adrob 18
5. akciolap 15

Legolvasottabb címek
1. CSS
Egyszerü vízszintes menü és vízszintes menü legördülő almenükkel [48915]
2. CSS
A pozícionálás, és a z-index [25822]
3. CSS
Függőleges menü, legördülő almenüvel [20242]
4. CSS
Függőleges menü készítése listából [20025]
5. CSS
Bevezetés a CSS alapjaiba [19221]
 

 

PHP -> Hydra Portal System

Író: Magus ( netoktato@orseolo.hu )
  http://orseolo.hu
Készült: 2007-04-02 10:47:37
Lektorálta: Wicky
Lektorálva:
2008-03-16 16:37:24 [7077]
Hydra Portal System

Az első cikkben megismerkedtünk a PHP nyelv rövid történetével, valamint személyi számítógépünkből webszervert varázsoltunk. A második cikkben megismerkedtünk, az általánosan ismert vezérlési szerkezetekkel, ciklusokkal, valamint a különböző típusú változókkal és azok kezelésével.

Mostani, harmadik cikkünkben rátérünk a tényleges programozásra. A parancsok részletezésére csak végszükség esetén térek ki, ez ügyben mindenkinek ajánlom a PHP hivatalos manual-ját: http://www.php.net/manual/hu/index.php.

Elsőként tekintsük át, mit is szeretnénk elkészíteni, ahhoz milyen előismeretek, valamint milyen alkotóelemek szükségesek, és mindezt milyen ütemben kívánjuk elvégezni.

A feladat, melyet kitűzünk magunk elé mindig legyen kicsit szűkebb, mint amit ténylegesen el szeretnénk érni, mert így egyrészt könnyebb eljutni a kitűzött célig, másrészt onnan tovább bővíteni könnyebb és lélektanilag is jobban hat, valamint hosszútávon eredményesebb.
Ezt az elvet nagyobb projekteknél úgy érdemes kivitelezni, hogy természetesen meghatározzuk a végleges célt, majd kis lépésekre bontjuk azt.

Állítsunk talpra egy portálmotort, melyben mindenki kezelheti a maga kedvenc linkjeit, jelszavait, legyen benne továbbá fórum, belső üzenő, e-mail küldő, és 1-2 játék. Ez a végleges célkitűzés, de még ez is tovább bővíthető, és tovább is fogjuk fejleszteni ezeken túl is. Bontsuk részegységekre. Legelsőnek mindenféleképp a portál motorját kell megalkotni, azaz a modulok felépítését és a felhasználó-kezelést, legyen ez a mai leckénk célkitűzése.

1. Függvények



A függvényekről eddig még nem sok szó esett. Vannak beépített és felhasználói függvények. A beépítettek azok, melyeket a PHP fejlesztői írtak, ilyen például az strlen("szöveg"), mely visszaadja a "szöveg" hosszát, jelen esetben: 6. A beépített függvények listája és leírása a fentebb említett weboldalon található.

A felhasználói függvények azok, melyek jelen esetben érdekesek számunkra. Létrehozásuk:

function teszt($param1, $param2=null, $param3=true, $param4="szia") {
    global $valtozo;
}


$param1-t kötelező megadni, $param2-$param4-ig nem kötelező, azaz ezek opcionális paraméterek. A függvény csak akkor fut le, ha minden kötelező paraméterét megkapja. Nem kötelező paramétert tehát úgy tudunk adni neki, hogy = jel után megadjuk az alapértelmezett értékét. Ez lehet boolean (igaz/hamis) értékű (pl. $param3), NULL értékű (üres), vagy szám illetve karakterlánc típusú is.

A függvényen belül deklarált változók a függvény végeztével megsemmisülnek, ezek a lokális változók. A függvény csak azokat a változókat látja, amelyeket paraméterben megkap, vagy amelyeket a global kulcsszóval elérhetővé teszünk számára. Amennyiben a változó, melyet a global kulcsszóval elérhetővé tettünk, értéke a függvényen belül megváltozik, annak értéke a függvény lefutása után a megváltozott tartalommal fog bírni. Röviden ennyi, bővebben a MANUAL-ban a fenti címen.

2. Munkamenet



A programozás menetét felgyorsítja és leegyszerűsíti az úgynevezett munkamenet, angolul session.

A session nem más, mint egy tároló, mely a Cookie-val ellentétben nem a kliens számítógépén tárolja az adatokat, hanem a szerveren, így a sütinél biztonságosabb, megbízhatóbb. Ugyanakkor a SESSION_ID-t cookie-ban tárolja, így a munkamenet is törölhető a sütik törlésével.

Munkamenet indítása mindig azelőtt kell, hogy megtörténjen, mielőtt bármi is a kimenetre kerülne. Érdemes ezzel kezdeni a fájlt. Munkamenet indítását kezdeményező függvény a session_start(). A munkamenetet nem kell lezárni.

A session-ről bővebben itt olvashatsz:
http://php.net/manual/hu/ref.session.php

3. Portálmotor



A portál motorját alaposan meg kell tervezni. Ezt mindig papíron tegyük. Szedjük össze, miket és miként akarunk tárolni. Kellenek felhasználói adatok (név, e-mail, telefonszám, cím, stb), kellenek jogok (jogkör neve, jogai), kellenek modul adatok (modul neve, leírása, elhelyezkedés, adatok), kell egy modul-felhasználó összekötő (úgynevezett relációs) tábla.

3.1. Adatbázis-struktúra kialakítása

Előszőr is lépjünk be a PHPMyAdmin-ba a root jogokkal rendelkező felhasználónkkal (ügyeljünk rá, hogy ennek jelszavát biztonságosan tároljuk, és root csak egy legyen), és hozzunk létre egy új felhasználót és egy új adatbázist. (Én minden esetben az SQL parancsokat írom, de kattingatva is végre lehet ezeket hajtani, erre azonban nem térek ki külön.)
Ezt az egyet megsúgom, hogy a Privilégium menüben lehet megtenni. Minden egyéb SQL parancsot az adatbázis kiválasztása után az SQL menüpontnál lehet beszúrni.

GRANT USAGE ON * . * TO 'netokt'@'localhost' 
IDENTIFIED BY 'titkosjelszo' WITH
   MAX_QUERIES_PER_HOUR 0
   MAX_CONNECTIONS_PER_HOUR 0
   MAX_UPDATES_PER_HOUR 0;


CREATE DATABASE IF NOT EXISTS `netokt`;


GRANT ALL PRIVILEGES ON `netokt` . * TO 'netokt'@ 'localhost';


Ha kész az adatbázisunk, akkor hozzuk létre a felhasználókat tároló táblát:
CREATE TABLE `user` (
  `id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
  `login` VARCHAR( 50 ) NOT NULL ,
  `email` VARCHAR( 255 ) NOT NULL ,
  `logintype` INT( 1 ) NOT NULL ,
  `pass` VARCHAR( 32 ) NOT NULL ,
  `lastname` VARCHAR( 255 ) NOT NULL ,
  `firstname` VARCHAR( 255 ) NOT NULL ,
  `city` VARCHAR( 255 ) NOT NULL ,
  `zip` VARCHAR( 4 ) NOT NULL ,
  `address` VARCHAR( 255 ) NOT NULL ,
  `tel` VARCHAR( 50 ) NOT NULL ,
  `mobile` VARCHAR( 50 ) NOT NULL ,
  `acc` INT( 11 ) NOT NULL ,
  `desc` TEXT NOT NULL ,
  `status` INT( 1 ) NOT NULL 
) TYPE = MYISAM ;


A jogokat tároló táblát létrehozzuk, de még sokszor fogjuk módosítani, mert nem tudhatjuk előre, mihez milyen jogi beállítások kellenek:
CREATE TABLE `acc` (
  `id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
  `name` VARCHAR( 255 ) NOT NULL ,
  `desc` TEXT NOT NULL ,
  `status` INT( 1 ) NOT NULL 
) TYPE = MYISAM ;


A modulok megtervezése előtt tisztázni kell a leendő oldal felépítését. Először egy primitív megjelenésű, kevés design elemmel rendelkező oldalt hozunk létre, a későbbiekben is ráérünk a designnal foglalkozni. Az oldal legyen 6 részre bontva, 3 header és 3 body részre. A 3 header részből a baloldaliban lesz egy logó, a jobboldaliban egy óra, és egy mini statisztika, középsőben nagybetűkkel a portál neve + némi infó, ezt később pontosítjuk vagy módosítjuk. A body rész két szélén lesznek a menük, középen a tartalom és egy gyorsmenü.

Így tehát a moduloknak 3 helye lehet: jobboldali, baloldali és a gyorsmenü. A két szélsőnél megadható, hogy csak X oldalnál vagy mindegyiknél jelenjenek meg, a középső sávra ültetettnél kötelező ezt megadni. (Ez most így bonyolult lehet, de a cikk végére kitisztul majd :-) !)
CREATE TABLE `modul` (
  `id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
  `name` VARCHAR( 255 ) NOT NULL ,
  `desc` TEXT NOT NULL ,
  `place` INT( 1 ) NOT NULL ,
  `page` VARCHAR( 255 ) NOT NULL ,
  `status` VARCHAR( 1 ) NOT NULL 
) TYPE = MYISAM ;


Mint látható, mindhárom létrehozott táblánál van egy ID, egy STATUS és egy DESC mező is. Bár azt írtam, SQL ügyben nem fogok magyarázni, most kivételt teszek. Az ID az angol identifier (azonosító) szó rövidítése, mindig ez különbözteti meg az egyedeket egymástól. A STATUS értékei eltérő jelentést hordozhatnak, de nálam mindig a status = 0 jelenti a "minden rendben"-t. Általánosan: 0 - aktív, 1 - inaktív, 2 - törölt. Persze sokszor teljesen mást jelenthetnek, néha az inaktív ugyan azt jelenti, mint a törölt, de pl. itt a MODUL-nál pontosan így fogjuk használni. A DESC az angol description (leírás) szó rövidítése.

És mint említettem, kell egy modul-felhasználó (jelen esetünkben egy modul-jogszint) relációs tábla, melyből kiderül, mely modulhoz mely jogszinten lévő felhasználóknak van hozzáférési joguk.
CREATE TABLE `rel_modul_acc` (
  `modul_id` INT( 11 ) NOT NULL ,
  `acc_id` INT( 11 ) NOT NULL 
) TYPE = MYISAM ;


Fontos alapelv, hogy adatbázisból csak ritkán törlünk adatot, többnyire csak töröltnek jelöljük (lásd STATUS). A REL táblák azonban ez alól szinte mindig kivételt képeznek. (Akkor nem törlünk REL táblából sem fizikailag, amikor annak visszamenőleg is kereshetőnek kell lennie, pl. ügyviteli rendszerek.)

Ahhoz, mindez szépen működjön, kell még egy tábla, melyben az éppen aktuálisan on-line tartózkodó látogatókat tartjuk nyilván:
CREATE TABLE `online` (
  `id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
  `ip` VARCHAR( 15 ) NOT NULL ,
  `last` VARCHAR( 10 ) NOT NULL ,
  `time` INT( 11 ) NOT NULL ,
  `user_id` INT( 11 ) NOT NULL ,
  `refresh` INT( 11 ) NOT NULL ,
  `day` DATE NOT NULL ,
  `week` VARCHAR( 2 ) NOT NULL ,
  `month` VARCHAR( 2 ) NOT NULL ,
  `year` VARCHAR( 2 ) NOT NULL 
) TYPE = MYISAM ;


Mindezek segítségével a mára előirányzott feladatokat el lehet végezni (sőt, az online tábla nem is kell még ma).

3.2. Keretrendszer

Az index.php és majdnem minden php fájl elkészítéséhez alkalmazni kell természetesen a HTML és CSS témakör tudását is.

Fontos tudni 2 parancsot, ezek az include(); és az include_once();. Ezekkel lehet betölteni külső fájlt. Milyen esetben hasznosak ezek? Minden alkalommal amikor olyan kódrészre van szükségünk amit már egyszer megírtunk. Több előnye is van a dolognak. Először is nem kell az egyes részeket újra és újra megírni, elég őket a megfelelő helyre betölteni. Így lehet írni függvény-gyűjteményeket (úgynevezett library-kat), ezeket elég egyszer megírni, majd valamennyi oldalba elég csak betölteni, így azokban is elérhetővé téve az adott függvényeket (... kódrészleteket).

Pár fontos fájl, melyet most nem részletezek:
- config.php - Ebben fogjuk tárolni a portál beállításait
- function.php - Ebben lesznek az általános függvények
- sql_conn.php - Kapcsolatot létesít a MySQL szerverrel
- sql.php - Az SQL szerverrel kapcsolatot tartó függvény-gyűjtemény
- header.php - A HTML oldal fejléce
- footer.php - A HTML oldal lábléce

Nos akkor itt az ideje, hogy elkészítsük a config.php-t és az index.php vázát. Nevezzük a készülő portált Hydra-nak.

Haladtam kicsit a portállal, dokumentálni azonban nem volt időm és sajnos tovább fejleszteni se.mert 2 hete egy kiskrapekre vigyázok, a 2 hét alatt eddig jutottam... A folytatás nem marad el, és a ledokumentálatlan forráskód elérhető a weblapon (lásd 1. cikk).


4. Azonosító



A http://alfazonesoft.ath.cx/netoktato.hu/ oldalra a 3. cikkhez az azonosító: eleskezdetcikk3

Magyarázat



A DumaAblakban kaptam egy erős kritikát, melyeket továbbra is szívesen fogadok (lehetőleg a fórumban vagy e-mailben, mert a DA elég kis méretű, és ezért nem szeretem olvasni.). A kritikákra, ha az jogos, vagy építő jellegű, szívesen válaszolok is.

A kritika szövegét nem idézem, mert nem kértem engedélyt rá, a választ azonban bemásolom 1in1:

[Magus]
2007-04-03 21:05

Üdv!
Ugyan nem szoktam ilyen hangnemben írni, de most muszálynak érzem.
1. A PHP témakörben a MySQL magyarázatára túl sok szót nem akarok ejteni.
2. A portál fejlesztése közben akarom magyarázni, mert a száraz elméletnek nem látom értelmét, arra vegyen valaki egy könyvet.
3. A 3. cikk félkész állapotú a már említett okból, a héten befejezésre kerül, csak nagyvonalakban van kész.
4. A legelső cikkben érthetően tudattam mindenkivel, hogy nem "Hogyan kell programozni, mert tök láma vagyok?" témát akarok vezetni, hanem PHP-t.

[Magus]
2007-04-03 21:11

Manual ... hálistennek az előző hsz-emre hivatkozva, aki php-zni akar, az a programozás-elmé letet már ismeri (legalábbis valamennyire). Aki pedig tud programozni, vagy legalábbis nem tök láma, annak csak arra van szüksége, hogy az adott nyelv specialitásait, függvényeit, azok alkalmazását, szintaktikai és szemantikai szabályait megismerje. Nos ígérem, aki nem tegnap kezdte a programozást (akármilyen nyelven), és nem is a múlthéten ... az a cikksorozat végére magától meg fogja tudni írni az iwiw mását, max nem lesz olyan csicsa, és olyan látogatott 


Konkrúzió: gyorsan a levesbe csapok, mert tapasztalataim alapján egy nyelvet megtanulni szárazon elég nehézkes, konkrét példában sokkal érthetőbb és könnyebb.

És ami még lényeg, amit többször hangoztattam is, hogy nem "Hogyan kell programozni?" és nem "Mi az a weblap?" témakört vezetek. Így tehát nem szeretnék olyan kérdést kapni, hogy "Mi az a ciklus?", "Mi az a változó és a konstans?" és társai.

Hogyha kicsit néha sietek, nem magyarázok el mindent elég részletesen, úgy kérdezzetek bátran a fórumban, vagy e-mailben a magus@netoktato.hu címen, és ha kell, részletesebben kifejtem az adott részt.

További kellemeset mindenkinek!
* Minden további kérdéseddel fordulj az anyag írójához.

 

Hello Vendég

Az oktatóanyagok olvasásához be kell jelentkezned.

Szeretnék regisztrálni.

Elfelejtettem a jelszavam!
Kiküldöm magamnak!