1 Webes felülettel rendelkez adatbázis készítése szabadon felhasználható szoftverekkel Filetóth László Konzulens: Pánovics János Debreceni Egyetem Inf...
Webes felülettel rendelkez・ adatbázis készítése szabadon felhasználható szoftverekkel Filetóth László
Konzulens: Pánovics János Debreceni Egyetem Informatikai Kar Debrecen, 2004.
Tartalomjegyzék Bevezetés ...............................................................................................................................................4 A GNU Project ....................................................................................................................................5 A Linux .............................................................................................................................................5 Felhasznált szoftverek ......................................................................................................................... 9 A Debian Project ...........................................................................................................................10 Az Apache Project.........................................................................................................................11 A MySQL........................................................................................................................................12 A PHP .............................................................................................................................................13 Telepítés ..........................................................................................................................................17 Konfigurálás ...................................................................................................................................17 Témaválasztás .....................................................................................................................................18 A portál meghatározó részei ........................................................................................................18 Általános informatikai hírek ....................................................................................................19 Biztonsági hírek.........................................................................................................................19 Letölthet・ alkalmazások...........................................................................................................19 Egyéb linkek...............................................................................................................................19 Az adatbázis ........................................................................................................................................20 Az adatbázisban található f・bb táblák........................................................................................20 Az adatbázis b・vebb ismertetése.................................................................................................22 Az adatbázis létrehozásának menete...........................................................................................26 A szerver oldali szkriptnyelv ismertetése........................................................................................28 Koncepció.......................................................................................................................................28 Használható paraméterek.........................................................................................................28 Többarcú szkriptállományok .......................................................................................................30 Kapcsolat a MySQL adatbázis-kezel・vel ...................................................................................31 Függvények kontra állományok...................................................................................................35 A felhasználó által bevitt adatok tárolása adatbázisban, illetve annak megjelenítése a weboldalon......................................................................................................................................35 Tárolás ........................................................................................................................................35 Megjelenítés................................................................................................................................36
2
MySQL lekérdezések eredményeinek sorba vétele...................................................................38 Az adminisztrációs felület .................................................................................................................39 Biztonság.........................................................................................................................................39 Használat.........................................................................................................................................40 Belépés........................................................................................................................................40 F・oldal........................................................................................................................................40 Koncepció ..................................................................................................................................42 Paraméterek ...............................................................................................................................42 Pozícionálás................................................................................................................................46 Adminisztrátori hozzáférések karbantartása .........................................................................48 Általános informatikai hírek karbantartása............................................................................49 Biztonsági hírek platformjai.....................................................................................................50 Portálhírek..................................................................................................................................50 Zárszó ..................................................................................................................................................51 A függelék ...........................................................................................................................................52 Fontosabb SQL táblák létrehozó parancsainak listázása .........................................................52 B függelék............................................................................................................................................54 Néhány feladat konkrét megvalósítása PHP-ben......................................................................54 Id・ kiíratása formázott módon ...............................................................................................54 Id・ kiíratása formázott módon az angol nyelv szabályai szerint rövid formában ...........54 Id・ kiíratása formázott módon az angol nyelv szabályai szerint hosszú formában ........54 セrlap legördül・ menüjének generáló függvénye el・re megadott adatok alapján ............54 セrlap jelöl・négyzetének generáló függvénye el・re megadott adatok alapján ..................55 セrlap szöveg típusú beviteli mez・jének generáló függvénye el・re megadott adatok alapján .........................................................................................................................................55 セrlap rejtett mez・jének generáló függvénye el・re megadott adatok alapján ...................55 Apache session létrehozása......................................................................................................56 Adatrögzítés Apache session-be .............................................................................................56 Jogosultságellen・rz・ modul.....................................................................................................56 Ábrajegyzék.........................................................................................................................................58 Hivatkozások ......................................................................................................................................59 Felhasznált irodalom..........................................................................................................................60
3
Bevezetés Az informatika utóbbi húsz évében egy – az addigi felfogástól mer・ben eltér・ – irányzat n・tte ki magát a szoftverek fejlesztésében: a szabad szoftver mozgalom. Kezdetben csupán néhány szakmabeli fejében fogalmazódott meg a gondolat, hogy az addig szinte alternatívák nélkül létez・ fizet・s megoldások helyett mindenki számára hozzáférhet・ programokat kellene létrehozni, ezzel is növelve az informatika térhódításának ütemét. Az évek múlásával egyre többen gondolták – és gondolják most is – úgy, hogy ez a kezdeményezés felkarolásra érdemes. Ennek keretében évr・l-évre egyre több cég csatlakozik a mozgalomhoz, és egyre több anyagi forrás kerül bevonásra, amib・l az egyre növekv・ számú fejlesztés felmerül・ költségeit finanszírozzák. Ezeknek az embereknek a munkája tette lehet・vé, hogy munkám megszülethessen, azaz egy mind fejleszt・i, mind felhasználói oldalról tekintve jelent・snek mondható portált hozzak létre a kés・bbiekben részletezett alkalmazások felhasználásával.
4
A GNU Project
A mozgalom legf・bb összefogó szervezete a Szabad Szoftver Alapítvány (FSF – Free Software Foundation), ami a GNU (GNU Nem Unix) Project legfontosabb szponzora. A GNU Project 1984-ben indult azzal a célkitソzéssel, hogy kifejlesszenek egy teljes értékソ, Unix-szerソ operációs rendszert, amely szabad szoftver. A GNU operációs rendszer Linux kernelt használó változatai ma már széles körben elterjedt, az informatika számos területén használják. Bár ezeket a rendszereket gyakran egyszerソen Linuxnak nevezik, mégis meg kell említenem, hogy a teljes nevük GNU/Linux rendszer. Manapság ezek a rendszerek már komoly alternatívát jelentenek a piacon megtalálható fizet・s társaiknak, hiszen szinte minden feladat hasonló hatékonysággal elvégezhet・ velük, mint versenytársaikkal. Ez a fejlettségi szint tette lehet・vé a témaválasztásomat, azaz a szabadon
felhasználható
programok
segítségével
megvalósított
webes
felületソ
adatbáziskezelést.
A Linux Amikor a Unix még csak az egyetemi és akadémiai szférában volt közismert, kialakult körülötte egy hatalmas programkörnyezet: minden egyetem, kutatóintézet elkészítette saját megoldásait
a
táblázatkezelést・l
felmerül・ kezdve
számítástechnikai a
mindenféle
problémáira
apró
utility-n
(a
szövegszerkesztést・l,
keresztül
a
különböz・
fordítóprogramokig), és mivel ezek az intézmények non-profit szervezetek voltak, elkészült szoftvereiket publikussá tették. Forráskódban, C nyelven adták közre ezeket a programokat,
5
egyre inkább a terebélyesed・ Hálózat segítségével, és a C nyelv és az egységes környezet miatt
minden
Unix
felhasználó
lefordíthatta,
használhatta,
módosíthatta
és
továbbfejleszthette ・ket szinte teljes szabadsággal. Ennek a folyamatnak az eredményeként alakult meg az FSF és a GNU project. Ennek jogi megfogalmazása a GPL (GNU General Public License). GPL alá es・ szoftvert bárki készíthet, amennyiben megfelel bizonyos feltételeknek, és jogi (copyright) probléma esetén számíthat az FSF segítségére. GPL alá es・ szoftvert bárki használhat, s・t módosíthatja is azt, amennyiben amikor a szoftvert továbbadja, továbbadja annak teljes forráskódját is, esetleges módosításai feltüntetésével. GPL szoftverért pénzt kérni nem szabad, viszont fel lehet számítani a másolással, terjesztéssel, installálással, konfigurálással stb. kapcsolatos költségeket. A szoftver módosításáért sem szabad pénzt kérni – GPL forrás módosítva is GPL forrás marad. Megvolt tehát a GNU környezet: fordítók, segédprogramok, és a szabadon terjeszthet・ XFree grafikus felület, egy olyan operációsrendszer-mag hiányzott csak, amely bizonyítottan szabad. Ennek megírását kezdte el egy helsinki egyetemista, Linus Torvalds, hogy aztán több száz segít・jével együtt létrehozza azt, amit ma Linuxként ismerünk: egy teljes, szabad operációs rendszert bárki PC-jére. Bár Linus Torvalds egyedül kezdett hozzá operációs rendszere elkészítéséhez, ma már a Linux oly sokfelé ágazott és akkorára n・tt, hogy Linus maga már csak koordinálja a fejlesztéseket. A Linux jogi értelemben nem UNIX tehát, leghelyesebb volna Unix-klónnak nevezni, és nem is követi szigorúan egyik szabványt sem: sok BSD-s és SYSV jellemvonást egyesít magában. Legközelebb a független POSIX-hoz áll, mind a mai napig a Linux tekinthet・ a legteljesebb POSIX implementációnak. Maga a Linux, illetve a Linuxon futó szoftverek legnagyobb része a GPL alá esik. Szót kell itt még ejtenünk még egy fontos dologról, ami nélkül a Linux operációs rendszer nem születhetett volna meg: ez pedig az Internet, amely összekötötte a fejleszt・ket, és amelyen mindig bárki számára ingyen hozzáférhet・k az egyes Linux változatok. A Unix és az Internet mindig is szorosan köt・dött egymáshoz: az els・ IP (Internet Protocol) implementációkat BSD Unix rendszerekre készítették, a Unixot nyíltsága, jól b・víthet・sége miatt választották a fejleszt・k. A Linux az Interneten született: bár támogat más hálózati protokollokat is, igazán egyszerソen Internetes környezetbe illeszthet・.
6
A Linux folyamatosan fejl・d・ rendszer. Gyors fejl・désének és terjedésének egyik oka az, hogy a fejleszt・k már a munkaverziókat elérhet・vé tették (és teszik jelenleg is) bárki számára, akárki kipróbálhatta (kipróbálhatja) a fejlesztés bármely stádiumában. Teljesen tipikus eset, hogy az önkéntes (önjelölt) tesztel・k a megtalált hibákat már a javítással együtt küldték vissza a fejleszt・knek – az Interneten. Mivel a Linux rendkívül gyorsan fejl・dik, szükséges rendet tenni a verziószámok dzsungelében. Legel・ször is jegyezzük meg, hogy ha „stabil” verzióról beszélünk, akkor is csak saját felel・sségünkre használhatjuk a Linuxot: mivel nem áll mögötte kereskedelmi cég, nincs aki a megbízható mソködésért garanciát vállaljon. Ha hajlandók vagyunk áldozni rá, vásárolhatunk támogatást valamely erre szakosodott cégt・l, az ingyenes Linuxhoz azonban nem jár garancia. Megjegyzend・, hogy szoftvereik hibamentességére gyakran nagy szoftvercégek sem vállalnak garanciát. Linux verziószám alatt az ún. „kernel”, az operációs rendszer mag verziószámát értjük, ez a tulajdonképpeni Linux, azonban mint minden operációs rendszer esetén, önmagában ez összesen annyira alkalmas, hogy más programokat futtassunk rajta. A kernel verziószámozása a következ・: x.y.z, ahol az x a f・ verziószám, az y, a középs・ szám az alverziószám, amely ha páros, akkor az egy „stabil” béta-verziót jelent, ha páratlan, akkor pedig alfa-verziót, amely tényleg teljesen fejleszt・i változat. A harmadik szám, a z pedig az ún. patch-level: az apróbb változtatásokat sorszámozzák ezzel. Tehát a 2.2.18 stabil verziót jelent, míg a 2.3.10 fejleszt・i változat. Jelenleg a f・ verzió már a 3-as, ebb・l a sorozatból vannak alváltozatok. Szokás még az ún. disztribúció verziószámáról is beszélni: a disztribúció egy Linux kernelen alapuló teljes (mソköd・képes) Unix rendszer, segédprogramokkal, alkalmazásokkal együtt. Egy disztribúció elkészítése tulajdonképpen a C forrásban meglév・ utility-k, programok lefordításából, könyvtárstruktúrába helyezéséb・l és összekonfigurálásából áll. Sokféle disztribúció létezik, ingyenesek is és kereskedelmiek is. Ilyen disztribúció például a Debian is, amelynek a legfrissebb verziója a 3.0 r3, ami a 3-as Linux kernelre épül・ Debianok közül a harmadik kiadás. Említettem, hogy léteznek kereskedelmi (nem ingyenes) disztribúciók is – talán ez furcsa lehet egy szabad szoftver esetén, azonban mint azt már a GPL ismertetésekor
7
láttuk, ezek a cégek nem a Linux-ért kérnek pénzt, hanem a disztribúció összeállításáért, illetve esetleg a disztribúcióban lév・, Linux alatt futó, de nem ingyenes szoftverek használatáért.
8
Felhasznált szoftverek Választásom a Debian Linux disztribúcióra, az Apache webszerverre, a PHP szkriptnyelvre és a MySQL adatbázis-kezel・re esett. Ennek oka az, hogy a portál hosztolására használt szerveren a felsoroltakhoz férhettem hozzá, illetve az, hogy ezek mindegyikével sok tapasztalatot szereztem korábban. Debian
http://www.debian.org/
Apache v1 család
http://httpd.apache.org/
PHP v4 család
http://www.php.net/
MySQL v4 család
http://www.mysql.com/
PHPMyAdmin
http://www.phpmyadmin.net
9
A Debian Project
A Debian szabad vagy nyílt forráskódú számítógépes operációs rendszer. A Debian kernelfüggetlen. Jelenleg a Linux-kernelt használja, de készül・ben van a Debian más kernelekhez is, például Hurdra. A Hurd szerverprogramok gyソjteménye, amelyek egy mikrokernel (mint például a Mach) felett futnak, és különböz・ funkciókat implementálnak. A Hurd szabad szoftver, és a GNU-projekt eredménye. Az operációs rendszert kitölt・ alapprogramok nagy része a GNU-projektb・l származik; ez a magyarázata a GNU/Linux és GNU/Hurd neveknek. Az embereknek természetesen alkalmazásokra van szükségük: olyan programokra, amelyekkel el tudják végezni munkájukat, dokumentumok szerkesztését・l kezdve az üzletvezetésen és a játékokon át a programírásig. A Debian több mint 2250 csomagot (könnyen telepíthet・ formátumba csomagolt lefordított szoftvert) tartalmaz -- mindegyikük szabad szoftver. Az egész olyan, mint egy alaposan megtervezett torony. Legalul van a kernel, mint a torony talapzata. Efölött az alapprogramok, majd az alkalmazói programok következnek. A torony tetején van a Debian, ami gondosan összeilleszti, és rendszerbe szervezi mindezt, hogy együtt is jól mソködjenek.
10
Az Apache Project
Az Apache egy webszerver, vagy – ahogyan a fejlesz・k nevezni szeretik – egy httpd szerver. Nagyon megbízható, robosztus, flexibilis alkalmazás, ami a legújabb protokollokat is támogatja. Teljes mértékben támogatja a HTTP/1.1-et (RFC2616). Kitソn・en konfigurálható, és beépül・ programokkal egészíthet・ ki. Ilyen modulokat bárki készíthet a mellékelt API segítségével. A forráskódja bárki számára hozzáférhet・. Támogatja a legtöbb UNIX alapú rendszert, a Windows NT/95 termékvonalakat, az OS/2-t és a Novell Netware 5.x-et. Nevét amerikai indiánok egyik törzsér・l kapta (Apache), de egy szójátékot is elrejtettek benne, ugyanis az A PAtCHy server néven emlegetik a fejleszt・k, utalva arra, hogy az Apache nem volt más, mint néhány meglév・ kód és egy sor folt (patch). Az els・ kiadott Apache webszerver a 0.6.2 verziójú volt 1995 áprilisában, de azóta is töretlenül fejl・dik. Jelenleg a 2.x-es sorozatnál járnak, de párhuzamosan él mellette az 1.3x-es sorozat is. A project alapító tagjai a következ・k: Brian Behlendorf, Roy T. Fielding, Rob Hartill, David Robinson, Cliff Skolnick, Randy Terbush, Robert S. Thau, Andrew Wilson.
11
A MySQL
A nyílt forráskódú MySQL adatbázis-kezel・ rendszer az egyik legnépszerソbb kiszolgáló oldali szoftvercsomag. Rendkívüli gyorsasága, viszonylag kis terhelése a központi rendszerre és a webes alkalmazások háttereként való alkalmazhatósága alapján joggal került be a legjobb rendszer-összeállítást jelképez・ LAMP rövidítésbe (Linux, Apache, MySQL és a PerlPython-PHP hármas). Fejlesztését már több, mint 10 éve kezdték. Az els・ verzió még mSQL néven látott napvilágot és természetesen sokkal kisebb tudású volt mai megfelel・jénél. A programozók körében a könnyen használható alkalmazásfejleszt・i interfésze (API) miatt népszerソ. A MySQL név származása kétséges, a fejleszt・k két lehetséges verziót is említenek. Az egyik szerint a fejlesztés során a saját rutinjaikat a my el・taggal illették, míg a másik lehet・ségként az egyik alapító tag My nevソ lánya volt a névadó.
A rendszer teljes mértékben C/C++ project, de az API-ja C, C++, Eiffel, Java, Perl, PHP, Python, Ruby, és Tcl nyelveken programozható. Több tucat operációs rendszerre elkészítették már a változatait. Támogat többprocesszoros rendszereket is. Relációs adatbáziskezelQ, amit SQL felületen keresztül lehet használni.
12
A PHP
A PHP hosszú utat járt be az elmúlt néhány évben. Az, hogy a legkiemelked・bb webes programozási nyelvek egyikévé váljon, nem volt könnyソ feladat. PHP/FI A PHP el・dje a PHP/FI volt, amelyet Rasmus Lerdorf készített 1995-ben. Kezdetben egy egyszerソ Perl szkriptgyソjtemény volt, amely arra szolgált, hogy nyomon kövesse az online önéletrajzához való hozzáféréseket. Ezt a szkriptgyソjteményt 'Personal Home Page Tools'nak (személyes honlap eszközök) nevezte el. Amikor több funkcionalitásra volt szükség, Rasmus készített egy sokkal terjedelmesebb C nyelvソ implementációt, amely képes volt adatbázisokkal kommunikálni, és lehet・vé tette, hogy a felhasználók egyszerソ dinamikus webes alkalmazásokat fejlesszenek. Rasmus úgy döntött, hogy kiadja a PHP/FI forráskódot, hogy mindenki beletekinthessen, tehát mindenki használhatja, valamint hibákat is javíthat benne, ezzel is tökéletesítve a kódot. A PHP/FI, amely a Personal Home Page / Forms Interpreter (személyes honlap / ソrlapértelmez・) rövidítése, tartalmazott néhányat a mai PHP alapfunkcionalitásai közül. Néhány jellemz・je: Perl-szerソ változók, ソrlapváltozók automatikus értelmezése, HTML-be ágyazott szintaxis. 1997-re a PHP/FI 2.0, a C implementáció második újraírása, világszerte mintegy több ezres felhasználói tábornak örvendett, hozzávet・legesen 50 000 domain jelentette, hogy telepítve van nála, amely az Internet domain-ek 1%-át jelentette. Annak ellenére, hogy a projekthez többen hozzájárultak kisméretソ kódokkal, nagyjából még egyszemélyes projekt volt. A PHP/FI 2.0 csak 1997 novemberében került hivatalosan kiadásra, miután a legtöbb id・t béta kiadásokként töltötte. Röviddel ezután követték a PHP 3.0 alfa kiadásai.
13
PHP 3 Az els・ olyan verzió, amelyik jobban hasonlít a ma ismert PHP-re, a PHP 3.0 volt, amelyet Andi Gutmans és Zeev Suraski készített 1997-ben. Ez egy teljes újraírása volt a PHP-nek, mivel készít・i szerint a PHP/FI 2.0 kevés segítséget nyújtott egy eCommerce alkalmazás írására, amelyen egy egyetemi projekt keretén belül dolgoztak. Egy alkalommal, amikor azzal próbálkoztak, hogy együttmソködjenek és kezdjék építeni a PHP/FI felhasználói táborát, Andi, Rasmus és Zeev elhatározta, hogy bejelentik a PHP 3.0-at mint a PHP/FI 2.0 hivatalos utódját. A PHP/FI 2.0 fejlesztése többnyire leállt. A PHP 3.0 egyik legnagyobb er・sségét a kiterjeszthet・sége jelentette. Azon kívül, hogy a végfelhasználókat egy szilárd, sok különböz・ adatbázist támogató infrastruktúrával, protokollokkal és API-kkal szolgálja ki, a PHP 3.0 kiterjeszthet・ségének lehet・sége több tucat fejleszt・ben ébresztett vonzalmat aziránt, hogy csatlakozzon és új kiterjesztéseket írjon hozzá. Vitatható ugyan, de ez volt a kulcsa a PHP 3.0 óriási sikerének. Egyéb újonnan bevezetett alaptulajdonsága a PHP 3.0-nak az objektum-orientált szintaxis támogatása és a sokkal er・sebb és konzisztens nyelvi szintaxis volt. Az egész új nyelv új névvel került kiadásra, ami kiküszöbölte PHP/FI 2.0 nevének azt az értelmét, hogy csak személyes célokra használható. Egyszerソen csak 'PHP'-nak nevezték el, ami egy rekurzív rövidítés – PHP: Hypertext Preprocessor. 1998 végére a PHP telepít・i tábora (a becslések szerint) több tízezerre n・tt, és több százezer webhely jelentette, hogy telepítette. Amikor elérte a csúcsot, a PHP 3.0 az Interneten található webszerverek 10%-án volt telepítve. A PHP 3.0-t hivatalosan 1998 júniusában adták ki, miután 9 hónapot töltött nyilvános tesztelési stádiumban. PHP 4 1998 telére, röviddel a PHP 3.0 hivatalos kiadása után, Andi Gutmans és Zeev Suraski elkezdett dolgozni a PHP magjának újraírásán. A felvázolt cél az volt, hogy javítsák a bonyolult alkalmazások hatékonyságát, és tökéletesítsék a PHP kódbázisának modularitását. Ilyen alkalmazások készültek, mivel a PHP 3.0 új szolgáltatásai, és széles körben támogatott
14
harmadik féli adatbázisok és API-k támogatása lehet・vé tette, de a PHP 3.0 nem arra volt tervezve, hogy ilyen bonyolult alkalmazásokat hatékonyan kezeljen. Az új motor, amit 'Zend Engine'-nek neveztek el (Zeev és Andi nevekb・l összeállítva), sikeresen teljesítette ezeket a célokat, és el・ször 1999 közepén mutatták be. Ezen motoron alapulva és egy sor további új képességgel meger・sítve, a PHP 4.0 hivatalosan 2000 májusában került kiadásra, majdnem két évvel a PHP 3.0 után. A PHP 4.0 tartalmazott más alapszolgáltatásokat is, mint például sokkal több webszerver támogatása, HTTP session-ök, kimenet-pufferelés, a felhasználói inputok sokkal biztonságosabb módon történ・ kezelése és számos egyéb nyelvi konstrukció. PHP 5 A PHP jöv・jét többnyire a Zend Engine nevソ magja irányítja. A PHP 5 a Zend Engine 2.0ra, az új magra épül. Jelenleg a PHP-t (a becslések szerint) több százezer fejleszt・ használja, és sokmillió webhely jelenti, hogy telepítette, amely az Interneten található webhelyek több mint 20%-át teszi ki. A PHP fejleszt・i csapata több tucat fejleszt・t foglal magába, valamint jónéhány egyéb embert, akik a PHP-hez fソz・d・ projektekben – mint például a PEAR és a dokumentációs projektekben – dolgoznak. A PHP segítségével háromféle alkalmazást készíthetünk: ‚
Szerver oldali program
‚
Parancssori program
‚
Kliensoldali ablakozós alkalmazás
A PHP használható a legfontosabb operációs rendszereken, beleértve a Linuxot, sok Unix változatot (beleértve a HP-UX, Solaris és OpenBSD rendszereket), a Microsoft Windows-t, a Mac OS X rendszert, a RISC OS-t, és másokat. A PHP a legtöbb webszervert is támogatja, beleértve az Apache, Microsoft Internet Information Server, Personal Web Server, Netscape és iPlanet szervereket, az Oreilly Website Pro, Caudium, Xitami, OmniHTTPd és más szervereket. A legtöbb szerverhez a PHP modul szintソ támogatást nyújt, de más a CGI szabványt támogató szerverekkel is együtt tud mソködni CGI feldolgozóként. 15
A PHP támogatja a kommunikációt más szolgáltatásokkal is különböz・ protokollok segítségével, úgy mint LDAP, IMAP, SNMP, NNTP, POP3, HTTP, COM (Windows rendszeren), és számos más. S・t, nyithatók vele hálózati foglalatok (socket) és képes kommunikálni más protokollokkal is. A PHP támogatja a WDDX komplex adatcseréket, ami bármely más webprogramozási nyelvvel való kommunikációt megkönnyítheti. A PHP szintén rendelkezik a Java-objektumok létrehozásának, és átlátszóan PHP-objektummokként való kezelésének képességével. A CORBA kiterjesztés távoli objektumok elérésére használható. A PHP rendkívül jó szövegfeldolgozó képességekkel rendelkezik, a POSIX és Perl reguláris kifejezésekt・l az XML állományok kezeléséig. Az XML dokumentumok feldolgozásához és eléréséhez a SAX és DOM szabványok is használhatóak. Az XSLT kiterjesztés XML dokumentumok átalakítására használható. A nyelv egyik legjobb és legfontosabb tulajdonsága az adatbázisok széles körソ támogatása. Adatbázisokat kezel・ weblap készítése PHP segítségével hihetetlenül egyszerソ. Jelenleg a következ・ adatbázisokat támogatja:
Adabas D
Ingres
Oracle (OCI7 és OCI8)
dBase
InterBase
Ovrimos
Empress
FrontBase
PostgreSQL
FilePro (csak olvasásra) mSQL
Solid
Hyperwave
Direct MS-SQL Sybase
IBM DB2
MySQL
Velocis
Informix
ODBC
Unix dbm
16
Telepítés Általános esetben els・ lépésként a Debian Linux telepítése említend・. Az én esetemben ez adott volt. További lépések az Apache, a PHP és a MySQL telepítése. Ezekkel szintén nem volt szükséges bajlódnom, de telepítésük – hála a Linux kiforrottságának – igen egyszerソ. Telepítéskor figyeljünk arra, hogy az apt-tools csomag felkerüljön gépünkre. Amennyiben mégsem került fel, akkor a dpkg –i apt-tools paranccsal telepíthet・. A telepítéshez és a konfiguráláshoz minden esetben rendszergazdai jogosultság szükséges. Ezután a következ・ parancsokat adjuk ki: # apt-get install apache # apt-get install php4 # apt-get install mysql Ha a gép végzett a fenti parancsokkal, máris egy olyan számítógép el・tt ülünk, ami rendelkezik minden eszközzel ahhoz, hogy megfeleljen céljainknak.
Konfigurálás Írjuk a /etc/apache/httpd.conf állomány végére, hogy. LoadModule php4_module /usr/lib/apache/1.3/libphp4.so
Ezután a /etc/apache/mime.types állományhoz adjuk hozzá a következ・ sort: application/x-httpd-php php Ett・l kezdve az Apache számára a php kiterjesztés php szkriptállományt jelent, azaz feldolgoztatja a php modullal, miel・tt kiszolgálja a böngész・ kérését. Adjuk még ki a # /etc/init.d/apache restart parancsot a konzolból. PHP modulunkat és a helyes beállításokat úgy ellen・rizhetjük legegyszerソbben, ha készítünk egy index.php állományt a saját könyvtárunkba tartalommal, majd megtekintjük böngész・nkkel.
17
Témaválasztás A
bemutatásra
szánt
project
egy
már
évek
óta
létez・
webportál,
ami
a
http://www.addict3d.org címen található. Létrehozói azt a célt tソzték maguk elé, hogy egy maximálisan naprakész, a látogatók hírigényét messzemen・kig kielégít・ hírportált hozzanak létre. A koncepció lényege az, hogy ne kelljen a látogatónak akár több tucat informatikai portált végigböngésznie nap mint nap. Helyette a szerkeszt・k összegyソjtik ezeket a híreket egy lapra, ahonnan elvezetik az érdekl・d・ket a hírek forrásaihoz. Ezzel a módszerrel sok id・ megtakarítható. A rendszer mソködni látszik: az utóbbi id・ben napi nyolc-tízezer találat körül alakul a portál forgalma. Az én feladatom természetesen az adatbázis megtervezése és a felhasználói, illetve adminisztrátori felület megalkotása volt, amiben egy grafikus munkáját használtam fel. A megvalósításhoz tisztán ingyenes programokat használtunk, kivéve a Microsoft Internet Explorer böngész・jét, amit a teszteléshez igénybe kellett vennünk, tekintve annak példátlanul magas elterjedtségét a böngész・piacon.
A portál meghatározó részei ‚
általános informatikai hírek
‚
biztonsági hírek
‚
letölthet・ alkalmazások
‚
egyéb linkek
18
Általános informatikai hírek Az informatika világában történt fontosabb események
Biztonsági hírek Az informatikai megoldásokban, szoftverekben, szoftverrendszerekben felfedezett hibák, sebezhet・ségek hírei, esetlegesen azok javítását lehet・vé tev・ foltok forrásával együtt.
Letölthet・ alkalmazások A szerkeszt・k által hasznosnak ítélt alkalmazások legfrissebb verzióira mutató linkek, és a hozzájuk tartozó rövidebb-hosszabb leírások.
Egyéb linkek Minden, ami nem fért bele az eddigi kategóriákba, de f・ként vicces vagy érdekes oldalak kerülnek ide. Nincs konkrét céljuk, csupán szórakoztatóak. A hírek mindkét fajtája külön táblában tárolódik, ahogyan a maradék két kategória is külön táblákat igényel. Szükséges még a portál híreinek egy tábla. Ezen kívül az adminisztrátorokat és azok jogait és a látogatók egy részének adatait is tárolni kell. A hírekhez tartozik fórum is, annak is külön táblát hoztam létre. Mivel a híreket és letöltéseket kategóriákba soroljuk, illetve platformhoz kötjük, így újabb táblák szükségesek.
19
Az adatbázis Az adatbázisban található f・bb táblák
1. ábra: Általános informatikai – és biztonsági hírek
20
2. ábra: Letöltések
3. ábra: Egyéb, kapcsolatok nélküli vagy fel nem tüntetett kapcsolatokkal rendelkez・ táblák
21
Az adatbázis b・vebb ismertetése A dolgozat korlátozott keretei miatt a megítélésem szerint egyértelmソ táblákat nem részletezem, azok minimális angoltudás birtokában önállóan is értelmezhet・ek.
news – általános informatikai hírek táblája ‚
ID – az adatbázis jellegéb・l adódóan szükséges egyedi azonosító, mellyel egyszerソvé válik a hivatkozás a rekordokra. A továbbiakban ezt az oszlopot nem fejtem ki többször a hátralév・ tábláknál, mert szerepük azonos az itt megismerttel.
‚
time – a rekord utolsó módosítási ideje. Ideális esetben ez megegyezik a rekord felvitelének idejével.
‚
visited – letöltések száma, azaz eddig hányszor jelenítették meg az oldalon a hírt teljes méretben. Szerepe a statisztikák és a top10 elkészítésénél van.
‚
title – a cikk címe
‚
category – küls・ kulcs a newscategories táblához. Jelentése: a cikk melyik kategóriába tartozik. A kategória szerint is lehetséges csoportosítani a cikkeket.
‚
author – a cikk szerz・je, illetve az a személy, aki feltette a hírt az adatbázisba.
‚
article – a cikk törzse.
‚
showinpage – technikailag fontos mez・, ezzel letiltható az adott cikk publikálása az oldalon anélkül, hogy törölni kellene azt.
‚
url – a cikk forrása, ahol a látogató az eredeti cikket elolvashatja, esetleg többet tudhat meg róla. Ha nem átvett cikkr・l van szó, akkor a saját portál címe kerül ide.
security – biztonsági hírek táblája A tábla nem említett mez・i megegyeznek a news táblánál megadottakkal. ‚
category – nagyon hasonló a news tábla azonos nevソ oszlopához, csupán abban tér el, hogy ez a securiycategories táblához jelent küls・ kulcsot. Ez azért szükséges, mert a különböz・ típusú hírek különböz・ kategóriákba sorolhatóak.
22
‚
platform – küls・ kulcs a securityplatforms táblához, amiben a hírekhez tartozó platformok tárolódnak. A híreket ezen oszlop szerint nem lehet ugyan rendezni, de segíti a gyors áttekinthet・séget.
suggestednews – a látogatók által javasolt hírek táblája A portál üzemeltetése során felmerült a látogatók részér・l az az igény, hogy ・k is javasolhassanak híreket. Az oldalon található ソrlap kitöltésével és elküldésével az általuk javasolt hírek kerülnek be ebbe a táblába. Amikor valamelyik adminisztrátor éppen karbantartja a híreket, egyesével megtekintheti a bejegyzéseket, amennyiben szükséges, módosíthat rajtuk, majd egyetlen mozdulattal átteheti ・ket a megfelel・ táblába. (news vagy a security) Az adminisztrátorok véleménye szerint ez a lehet・ség nagyban megkönnyíti a munkájukat, a látogatók pedig láthatják a saját nevüket a cikkírók között. Az eddig megismert oszlopokat hasonló módon nem tárgyalom, ahogy eddig. ‚
section – az ajánló szerint az adott hír inkább általános informatikai vagy biztonsági hír-e.
newscategories, securitycategories, securityplatforms – a hírekhez kapcsolódó kategóriák és platformok tároló táblái ‚
ID – küls・ kulcs a megfelel・ táblákhoz.
‚
time – utolsó módosítás id・pontja. Jellemz・en a rekord felvitel id・pontja.
‚
name / value – az adott kategória / platform szöveges megnevezése. Ez kerül ki a portálra.
download – letöltések táblája Ide kerülnek a szerkeszt・k által fontosnak tartott alkalmazások leírásai és a rájuk mutató link. A portál jellegéb・l adódóan a linkek küls・ címekre mutatnak, de néha-néha el・fordul saját címre mutató link is. A portál segíti az EviLyrics nevソ alkalmazás terjedését, annak hivatalos letöltési forrása is. A tábla nem említett mez・i megegyeznek a news táblánál megadottakkal.
23
‚
counter – a tényleges letöltések száma. Nem feltétlenül egyezik meg a visited értékkel, ami a leírás és a közvetlen link megjelenítését számolja. Ez az érték mindig kisebb egyenl・, mint a visited.
‚
name – a letöltend・ alkalmazás teljes neve.
‚
addedby – azon adminisztrátor neve, aki hozzáadta a rekordot a táblához.
‚
description – az alkalmazás rövid leírása
‚
top – megjelenjen-e a rekord a portál tetején nagyban kiemelve vagy sem. Egyszerre csak egy ilyen rekord lehet megjelölve.
‚
screen – a portál tetején való megjelenítéshez kirakandó kis méretソ kép címe.
‚
url – közvetlen link a letöltése kínált tartalomhoz.
downloadcategories, downloadplatforms – a letöltésekhez kapcsolódó kategóriák és platformok tároló táblái funs – azok a linkek, amik sehová sem fértek be A hírekhez és a letöltésekhez hasonlító tábla, de itt nincs cikk vagy leírás a bejegyzéshez, csak a cím és a link. A tábla mez・i megegyeznek az eddig említett tábláknál megadottakkal.
links – néhány olyan link, ami nem cserél・dik gyakran, csupán a szerz・k által ajánlottak A funs-hoz hasonlító tábla, szintén csupán cím és link. A tábla mez・i megegyeznek az eddig említett tábláknál megadottakkal.
sitenews – a portál hírei, amib・l a legutolsó mindig kiírásra kerül a portál fejlécében Feladata a látogatók figyelmének felkeltése és tájékoztatásuk. A tábla mez・i megegyeznek az eddig említett tábláknál megadottakkal.
24
comments – a látogatók megjegyzéseit tartalmazó tábla Minden cikkhez és letöltéshez tartozik egy-egy fórum, amik bejegyzései mind ebbe a táblába kerülnek. A tábla nem említett mez・i megegyeznek az eddig említett tábláknál megadottakkal. ‚
articleID – a cikket azonosítja, amihez a bejegyzés tartozik
‚
type – megadja, hogy az articleID melyik táblára vonatkozik. Tételesen news, security vagy download
‚
name – a hozzászóló neve
‚
email – a hozzászóló e-mail címe
‚
comment – maga a hozzászólás
online – az aktív látogatók táblája A rendszer minden letöltést feljegyez. Ebben a táblában az utolsó 5 percben letöltött oldalak letölt・inek IP címei szerepelnek. A tábla nem említett mez・i megegyeznek az eddig említett tábláknál megadottakkal.
visitors – az utolsó ezer látogató adatait tároló tábla Pusztán statisztikai célokat szolgáló tábla, ahol az aktuális utolsó ezer látogató részletes adatai találhatóak. A tábla nem említett mez・i megegyeznek az eddig említett tábláknál megadottakkal. ‚
IP – a látogató IP címe
‚
host – az el・z・ IP cím címfordítás után, hosztnév formájában
‚
referer – ha volt el・zmény a böngész・ben, mikor a feljegyzés készül, akkor azt itt tároljuk. Azaz ez mutatja, ha más oldalon található linken keresztül jutott el ide a látogató.
‚
agent – a látogató által használt böngész・ típusa és verziója.
adminaccount – az adminisztrátorok adatait tartalmazó tábla Jogosultságok és belépési információk az adminisztrációs felület használatához. A tábla nem említett mez・i megegyeznek az eddig említett tábláknál megadottakkal.
25
‚
username – belépéshez szükséges felhasználói név
‚
password – jelszó
‚
adminright – ha ez be van állítva, akkor szabályozhatja a többi adminisztrátor hozzáférését
‚
chpassword – megváltoztathatja-e a saját jelszavát
‚
chnews – van-e adminisztrátori joga az általános informatikai hírekhez
‚
chsitenews – adminisztrálhatja-e a portál saját híreit
‚
chsecurity, chdownload,… – az adott szekciót adminisztrálhatja-e
Természetesen a figyelmes olvasó felfedezhet további – itt nem ismertetett – táblákat is a mellékelt ábrákon, illetve állományokban, de azok ismertetése a portálépítés lépéseinek megismerése során elhagyható, azok tisztán programozástechnikai jellegソek, vagy további – kés・bb beépített – funkciók használják ・ket.
Az adatbázis létrehozásának menete PHP-s fejleszt・i körökben elterjedt megoldásnak számít a MySQL adatbázis-kezel・ használata. Részben annak egyszerソsége, részben a hozzá használható adminisztrációs felület miatt. Ez a felület PHPMyAdmin néven vált híressé. A készít・k a PHP nyelvre alapozva létrehoztak egy szinte minden MySQL funkció megvalósítására alkalmas grafikus felhasználói interfészt, amin keresztül az adatbázis menedzselése jelent・sen leegyszerソsödik. A megoldás használata nem jelenti azt, hogy nem szükséges alaposan ismerni az SQL nyelvet, csupán a hosszadalmas gépelés fárasztó terhét veszi le az ember válláról. A PHPMyAdmin telepítése igazán egyszerソ. Elég csupán a hivatalos oldalról letölteni egy tömörített verziót bel・le, és ezt kitömöríteni a kívánt könyvtárba. Figyeljünk arra, hogy a webszerverünk és az adatbázis-kezel・nk már telepítve és helyesen konfigurálva legyen! Ezután a célkönyvtárban keressük meg a config.php állományt, és állítsuk be a legfontosabb jellemz・ket! Ezek a következ・k: az adatbázis helye, neve, az adatbázist használni kívánó személy felhasználói neve és jelszava. Ezután, ha minden utasítást helyesen követtünk, akkor
26
a böngész・be beírva a szerver nevét és a könyvtár elérési útját, máris elénk tárul az impozáns felhasználói felület. Sok szolgáltatónál már alapértelmezetten telepítve van ez a termék, ilyen esetben a helyzetünk még egyszerソbb. Saját telepítés esetén célszerソ figyelmet szentelni a biztonságnak is, azaz megoldani, hogy ne érhesse el bárki ezt a felületet, aki ismeri a címét. Sajnos erre a PHPMyAdmin maga nem nyújt megoldást, de az Apache beépített httpauthentication modulját használhatjuk a szokásos módon a .htaccess és .htpasswd állományokkal. A hosztolást végz・ cég már el・re létrehozta a hozzáféréshez tartozó adatbázist és felhasználót, mivel erre nincs joga az el・fizet・nek. A táblák létrehozása és hangolása a PHPMyAdmin felületén keresztül történt. A táblák pontos definícióinak listázása a függelékben található, illetve a dolgozathoz csatolt PHP forráskód mellett ezt is mellékelem. Saját szerver esetén a felhasználó és az adatbázis létrehozása a következ・képpen történik: 1. # mysql --user=root mysql 2. mysql> use mysql; 3. mysql> INSERT INTO user VALUES( 'localhost', 'username',PASSWORD(‘password'), 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y' ); 4. mysql> INSERT INTO db (Host, Db, User, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv) VALUES ('localhost', 'adatbazis', 'username’, 'Y', 'Y', 'Y', 'Y', 'Y', 'Y' ); 5. mysql> FLUSH PRIVILEGES; 6. mysql> quit;
27
A szerver oldali szkriptnyelv ismertetése Koncepció A portál építése során a manapság nagy népszerソségnek örvend・ egypontos hivatkozást használó módszert választottam. Ennek lényege, hogy az összes funkció és oldal egyetlen állományhivatkozás segítségével vehet・ igénybe. Jelen esetben az index.php látja el ezt a feladatot, amit megfelel・en paraméterezve számos különböz・ oldalra juthatunk. El・nye, hogy a felhasználót csupán egy helyen szükséges azonosítani – vagy éppen beléptetni és ellen・rizni a jogosultságait –, az összes oldal azonos kinézettel rendelkezhet, amit elég egyetlen helyen változtatni ahhoz, hogy az összes oldal kerete megváltozzon. Valamint, ha biztonsági szempontok is szerepet játszanak, akkor a PHP include és require függvényeit felhasználva a bels・ oldalak forráskódjait kívülr・l nem elérhet・ helyen is tárolhatjuk a szerveren. Ez az állomány végzi a látogatók statisztikáinak rögzítését, az összes oldal közös grafikai keretelemeinek és a mindenhol megtalálható menü kirakását, illetve a változó területre a paraméternek megfelel・ változó tartalom megjelenítését. Rossz paraméter esetén az alapértelmezett oldalt mutatja meg. Jelen esetben ez az oldal a f・oldal.
Használható paraméterek ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚
mainpage – kezd・oldal showarticle – cikkeket mutatja downloadfile – letöltések leírása, illetve maga a letöltés technews – általanos informatikai hírek listája security – biztonsági hírek listája download – letöltések listája links – linkek listája top10 – a leglátogatottabb 10 cikk about – névjegy az oldalról mixed – kategorizálás nélküli legfrissebb cikkek id・rendben
28
‚ ‚ ‚ ‚ ‚ ‚
search – keresés categories – kategóriák szerinti lista archive – régi cikkek, letöltések éves/havi/napi rendszerben sitenews – a portál híreinek listája id・rendben suggest – hírajánlat feladására szolgáló oldal funs – sehová nem sorolható, f・ként vicces linkek listája
4. ábra: Kezd・oldal
29
Többarcú szkriptállományok A változó tartalom megjelenítésére alkalmas szkriptállományok egy része több funkciót lát el. Vegyük például a technews paraméterhez rendelt szkriptállományt. Alapesetben a legfrissebb általános informatikai híreket listázza id・ szerint rendezve, a legfrissebbt・l visszafelé. Természetesen nem az összes hírt mutatja, hanem csak az utolsó ötvenet. Ez az els・dleges funkciója. Azonban, ha további paramétereket adunk át a szkriptnek, akkor máris más funkció kerül el・térbe: a cikk megjelenítése. Azaz, ha átadunk egy ID-t is, akkor azt a cikket próbálja megjeleníteni a rendszer, aminek az ID-je éppen az általunk átadott. Ennek a módszernek az az el・nye, hogy egy állományba fogja össze a logikailag összetartozó dolgokat.
5. ábra: A legfrissebb általános informatikai hírek
30
6. ábra: Egy konkrét cikk megjelenítése
Kapcsolat a MySQL adatbázis-kezel・vel A PHP beépített elemeket tartalmaz a MySQL adatbázis-kezel・vel való kapcsolat kiépítéséhez, kezeléséhez és lebontásához. Az 5-ös verziójú PHP megjelenése el・tt tulajdonképpen a MySQL volt a PHP által javasolt adatbázis-kezel・. Az 5-ös verzióban már megjelent egy nagyon egyszerソ beépített adatbázis-kezel・ a PHP-ben, amivel sok esetben kiváltható a MySQL, de a pár sorosnál nagyobb adatbázisokat használó oldalak esetén ennek használata nem javasolt. Tehát a MySQL tekinthet・ továbbra is az alapértelmezett PHP adatbázis-kezel・nek.
31
7. ábra: Kategóriák listája
Csatlakozás Egy igen egyszerソ kis programrészlet elég arra, hogy csatlakozzunk és kiválasszuk a nekünk szükséges adatbázist. Probléma esetén hibaüzenetet ad és befejezi a futást.
$conn = mysql_connect($hostname, $mysql_user, $mysql_password); if (!mysql_select_db($database, $conn)) { echo ('Not connected to the server. '); exit; } 32
Fordítsunk figyelmet rá, hogy a php.ini-ben a hibaüzenetek és figyelmeztetések legyenek letiltva, ellenkez・ esetben hiba esetén könnyen kiderülhet az egyszerソ látogató számára is, hogy melyik állományban történt a hiba és szerencsétlen esetben az adatbázis-hozzáférésünk is nyilvánosságra kerülhet. Persze ezzel még nincs veszve minden, hiszen a jogosultságokat csak a helyi gépre adtuk, tehát távolról senki nem okozhat kárt adatbázisunkban, de mindenképpen kerüljük az ilyen eseteket!
SQL parancs végrehajtása A csatlakozás után rendelkezünk egy $conn változóval, ami az adatbázisunkhoz tartalmaz egy hozzáférést. Ezt használjuk fel a kés・bbiekben:
$query_str = 'select * from table'; $query = mysql_query($query_str, $conn); if (! $query) { echo “Hiba lépett fel a lekérdezés során”; exit; }
Ha a kiadott SQL parancs adatokat ad vissza – mint jelen esetben például –, akkor a következ・ sor a $row-ban tárolja el az eredmény els・ sorát. Természetesen a select helyén bármilyen érvényes SQL parancs állhat.
$row = mysql_fetch_array($query);
33
Ha több sor a lekérdezés eredménye, akkor a mysql_fetch_array újbóli hívásaival mindig a következ・ sort kapjuk meg, egészen az utolsóig. Ha nincs következ・, akkor NULLlal tér vissza a függvény. A lekérdezés eredményeként kapott sorok számát a mysql_num_rows($query)
adja meg.
SQL kapcsolat megszakítása A $conn változót MySQL kapcsolatként a csatlakozás után folyamatosan használhatjuk, egészen a program futásának végéig, illetve addig, amíg értékét felül nem írjuk, vagy a kapcsolatot meg nem szakítjuk. A megszakítás nem szükséges, mivel a PHP ezt elvégzi helyettünk a program futásának végén. Akkor lehet mégis hasznos, ha egy viszonylag hosszú ideig futó program nagy mennyiségソ adatot kér le és gyorsan felhasználja azt. Ilyenkor érdemes lehet takarékoskodni a memóriával és a lekérés eredményét törölni. Más esetben, ha az adatbáziskezel・ korlátozott számú egyidejソ kapcsolatot engedélyez, szintén érdemes a feldolgozás után azonnal zárni a kapcsolatot.
mysql_close($conn);
Memóriát felszabadítani persze lehetséges anélkül, hogy lezárnánk a kapcsolatot. Erre a következ・ utasítás szolgál: mysql_free_result($query);
34
Függvények kontra állományok A PHP több módszert is lehet・vé tesz a jól elkülönített programrészletek többszöri felhasználására. Készíthetünk függvényeket a más nyelvekben megismert módon, paraméterekkel, vagy használhatunk különálló állományokat kódrészleteink elkülönítésére. Ebben az esetben a paraméterek átadása deklarált változókon keresztül történik. Sebesség szempontjából nincs számottev・ különbség a két módszer között, mivel a rendszer a kis méretソ állományokat az adathordozóhoz rendelt cache memóriában tartja, miután el・ször feltöltötte ・ket, és amíg gyakran szükség van rájuk, nem is kerülnek ki onnan. A PHP állományok e fajtája jellemz・en kisebb, mint néhány kilobájt. A portál fejlesztése során mind a két módszert használtam, attól függ・en, hogy melyik tソnt alkalmasabbnak. A paraméterátadás egyszerソbb vagy bonyolultabb módja volt minden esetben a dönt・.
A felhasználó által bevitt adatok tárolása adatbázisban, illetve annak megjelenítése a weboldalon Mint minden olyan esetben, ahol a felhasználótól kapott adatokkal dolgozik a rendszer, a webes felületen mソköd・ alkalmazásoknál is ez a rész rejti az egyik legnagyobb buktatót. Sajnos nem feltételezhetjük, hogy minden látogató jó szándékú és nem követ el hibákat a gépelése során, így a bevitt adatokat maximális gyanakvással kell kezelnünk.
Tárolás Tárolás során adatvesztés léphet fel, amennyiben nem kell・ odafigyeléssel kezeljük adatainkat, ugyanis a tárolást végz・ SQL parancsban valamilyen jellel – általában idéz・jellel – jelöljük az adat kezdetét és végét. Amennyiben a bevitt adat tartalmazza ezt a jelet, úgy könnyen abba a hibába eshetünk, hogy az SQL utasításunk helytelenné válik és ezért sikertelen lesz a tárolás, vagy csonkolódik a szöveg, és a bevitt idéz・jel utáni részt nem tároljuk el. Szerencsére a PHP tartalmaz beépített eszközöket ennek kivédésére. Az
35
addslashes függvény úgynevezett escape szekvenciákat ír az adatunkban található idéz・jelek helyére, amit így már biztonságosan tárolhatunk. Ha újra fel szeretnénk használni az ilyen módon tártolt szöveget, akkor az adatbázisból való kiolvasás után a stripslashes függvényt használva visszakapjuk a bevitt szöveget.
Megjelenítés Az adatok megjelenítése még nagyobb veszélyt hordoz magában, mint a tárolás. Ebben az esetben mindegy, hogy azonnal jelenítjük meg a bevitt szöveget vagy adatbázisból nyertük vissza azt. A probléma abban rejlik, hogy ez a szöveg is a kész HTML oldal részét fogja képezni. Amennyiben a felhasználó HTML utasításokat írt az általa megadott szövegbe, akkor azt végrehajtja a böngész・ a megjelenítés során. Valójában ezt csak nagyon ritka esetekben szeretnénk, sokkal inkább gyakori az, hogy csupán szeretnénk megjeleníteni a szöveget. A portálon erre több példa is adódik. Ilyen helyzetek a fórum és az ajánlott hírek egyaránt. Persze az ellenkez・jére is van példa, hiszen az adminisztrátorok által felvitt hírekben szükséges aktív HTML tartalommal dolgozni, de ezekr・l az emberekr・l feltételezhetjük, hogy nincs rossz szándékuk, és probléma esetén maguk is kijavíthatják a hibás tartalmat. Meg kell különböztetni két helyzetet, úgymint a bevitt szöveg módosítása, illetve egyszerソ megjelenítése. Megjelenítéskor minden HTML karaktert át kell konvertálni annak szimbólumává, azaz olyan jellé, amit a böngész・ már nem értelmez parancsként, csupán megjeleníti azt. Erre szolgál a htmlentities függvény. Módosításnál nem ilyen egyszerソ a helyzet, hiszen HTML környezetben kell HTML forráskódot kitenni anélkül, hogy azt a rendszer értelmezné. Erre a htmlspecialchars függvény szolgál. Természetesen létezik lehet・ség ennek a folyamatnak az ellenkez・ irányú elvégzésére is, ezt a html_entity_decode függvény szolgáltatja.
36
Fontos megemlíteni még, hogy a felhasználó által bevitt szöveg sorvégjelekkel van tagolva, amennyiben használt tagolást a bevitel során. A HTML forráskódban ezek a sortörések nem váltanak ki semmilyen hatást, egyszerソen kimaradnak a megjelenítésb・l. Mivel a felhasználó feltehet・leg szándékosan használta ezeket a jeleket, így célszerソ szövegét ennek megfelel・en tagolva megjeleníteni. A bevitt szövegre az nl2br függvényt meghívva kapjuk a kívánt eredményt.
37
MySQL lekérdezések eredményeinek sorba vétele A MySQL lekérdezések eredménye minden esetben soronként érhet・ el. A sorokhoz hozzáférni három különböz・ függvénnyel lehetséges. Ezek a következ・k: mysql_fetch_row() mysql_fetch_assoc() mysql_fetch_array()
A három függvény gyakorlatilag ugyanazt végzi el, visszaadja a lekérdezés eredményének következ・ sorát, a különbség mégis számottev・. Mindhárom olyan tömböt ad vissza, amiben a lekérdezett mez・k értékei szerepelnek, de a tömbelemek címzése eltér・. Míg az els・ függvény csupán indexekkel enged hozzáférni az elemekhez, a második pedig csupán a lekérdezésben használt nevek alapján asszociatív tömbként, addig a harmadik mindkét módszert támogatja. Talán nem kell külön hangsúlyozni, hogy mekkora segítséget jelent a fejleszt・nek az, ha a lekérésben használt nevekkel hivatkozhat a forrásban, hiszen ezzel is javítja a kód olvashatóságát a kés・bbiekben. Más esetekben el・nyösebb lehet az indexelés, például, ha az összes elemen végre kell hajtani ugyanazt a lépést, hiszen így ciklusba szervezhet・ a mソvelet. Ezen indokok alapján a harmadik függvényt ajánlom minden leend・, illetve már tapasztalt PHP fejleszt・nek egyaránt, a módszer flexibilissége miatt.
38
Az adminisztrációs felület Az adminisztrációs felület célja a portál adatbázisának célszerソ, gyors és legf・képpen biztonságos karbantartása. Új elemek felvitele, régiek módosítása, esetleges törlése, bizonyos statisztikák nyomon követése.
Biztonság Mivel szükség volt a felület elérhet・vé tételére bármely számítógépr・l, ami képes a portált megjeleníteni, így a biztonságra fokozott figyelmet kellett fordítani. Az Apache által kínált http authentikáció tソnt a legegyszerソbbnek, de sajnos ez a módszer viszonylag könnyen feltörhet・, ezáltal bárki által hozzáférhet・vé válhat a védett tartalom, azaz számunkra nem jelentett igazán jó megoldást. A másik – már sokkal használhatóbb – lehet・ség szintén egy, az Apache által nyújtott szolgáltatást használ fel: a HTTP session-kezelést. Ez a módszer a PHP-ba épített függvények segítségével érhet・ el, alapja a session, azaz az az id・szak, amíg a böngész・ az adott webszerverhez kapcsolódik. A webszerver képes a böngész・höz rendelt egyedi azonosító alapján információkat meg・rizni két letöltés között. Amikor a böngész・ új lapot akar letölteni, akkor el・bb megadja az el・z・leg hozzárendelt azonosítót, aminek birtokában a PHP el tudja kérni a webszervert・l az általa tárolt információkat. Ennek segítségével elég egyszer azonosítania magát a felhasználónak, majd az összes olyan tartalmat használhatja, ami az adott védelem alá esik. Mindezt addig teheti, amíg be nem zárja a böngész・jét, illetve le nem jár a tárolt információra vonatkozó tárolási id・. Ha egy bizonyos ideig – általában harminc percig – nem mutat aktivitást a felhasználó, azaz nem tölt le újabb oldalakat, akkor a webszerver automatikusan kilépteti. A tárolt adatok a $_SESSION tömbben érhet・k el. Írásuk a session_register, illetve session_unregister függvényekkel végezhet・.
39
Használat Belépés Belépni az adminisztrációs oldal f・oldalán keresztül lehetséges. Az adatbázisban tárolt felhasználói név és jelszó páros megadása után, ha az adatok érvényesek, akkor a f・oldalra kerül a böngész・.
8. ábra: Belépés az adminisztrációs felületre Természetesen a jelszó (password) mez・ a HTML szabvány szerinti adatbeviteli mez・k közül a titkosított változatot használja, azaz beíráskor csupán csillagok látszanak.
F・oldal A f・oldalon található minden olyan lehet・ség linkje, amit végrehajthatunk az adminisztrációs felület segítségével. A lehet・ségeknek csupán egy részét tárgyalom, a többi lehet・ség hasonlóképpen mソködik, azok használata nem igényel további magyarázatot.
40
Tárgyalt részek ‚
adminisztrátorok
‚
általános informatikai hírek
‚
biztonsági hírek platformjai
‚
portálhírek
9. ábra: Az adminisztrátori oldalak f・oldala
41
Koncepció Mivel minden adminisztrátori oldal alapvet・en arra készült, hogy egy vagy több tábla adatai alapján egy adott táblát lehessen karbantartani a segítségével, így egy közös PHP szkriptet készítettem hozzájuk, ami a megfelel・ paraméterek átadása után különböz・ tartalmakat képes kezelni azonos módon.
Paraméterek $table_name A feldolgozandó tábla neve
$not_editable_column_number $not_editable_column_names Azon oszlopok száma és nevei, amiket nem módosíthat az adminisztrátor
$required_column_to_insert_number $required_column_to_insert_names Oszlopok száma és nevei, amiket kötelez・ megadni felvitel vagy változtatás során.
$multiline_editable_column_number $multiline_editable_column_names Többsoros beviteli mez・t használó oszlopok száma és nevei.
42
$ID_name_link_number $ID_name_link_ID_name $ID_name_link_field_table $ID_name_link_field_column_name Küls・ kulcsok segítségével lehetséges legördül・ menüket alkalmazni a kívánt oszlopokon. A megadott oszlopok értékeit a másik táblában rögzített értékekb・l engedi kiválasztani, majd eltárolja az ahhoz az értékhez tartozó számot.
$extra_columns_number $extra_columns_name $extra_columns_new_record_title $extra_columns_value_before_ID $extra_columns_value_after_ID Az adott táblában nem szerepl・ oszlop, melynek az adminisztráció során van jelent・sége. Ezzel az eszközzel létre lehet hozni számított tartalmakat. Konkrét példa a használatára a hírek el・nézeti képe az adminisztrátor számára, anélkül, hogy a portálon meg kellene keresnie az adott hírt.
$order_by_column Melyik oszlop szerint legyen rendezve a tartalom.
$hidden_field_number $hidden_field_name $hidden_field_value A kés・bbi feldolgozáshoz szükséges értékek adhatók itt meg, ami a felépül・ formanyomtatványba beépülve feldolgozáskor továbbkerül az új oldalra. Példa: a tábla aktuálisan kiválasztott helyének tárolása, hogy a módosítás után is ugyanazon a részen álljon.
43
$unique_field_number $unique_field_name $unique_field_policy Megadható, hogy bizonyos oszlopok tartalma egyedi legyen, azaz ne szerepelhessen kétszer a táblában. Módosításkor a rendszer figyeli, hogy ne legyen duplikálás. A policy-nél megadható, hogy duplikálás esetén mit tegyen a rendszer. Megadható a régi törlése, illetve felülírása is.
$default_field_value_number $default_field_name $default_field_value Bizonyos mez・ket id・rabló minden felvitelnél újra és újra kitölteni, miközben értékük csak ritkán tér el egy bizonyos értékt・l. Itt megadható, hogy felvitelnél melyik mez・ben mi legyen az alapértelmezett érték. Ezt az értéket a rendszer a HTML oldal felépítése során beépíti az oldalba.
$update_time_only_at_insert Minden tábla rendelkezik egy TIMESTAMP oszloppal, aminek értéke minden módosításkor megváltozik az aktuális dátumra. Ezt a mez・t beállítva módosításkor az értéke nem változik meg.
$working_connection_to_mysql Szükségtelen minden mソvelethez új adatbáziskapcsolat kiépítése, így a szkript képes egy már megnyitott kapcsolatot használni. Ez adható itt át.
$target_page A HTML formanyomtatvány céljaként szolgáló oldal címe, azaz az az oldal, ami feldolgozza a megtett változtatásokat. 44
Megjegyzések ‚
A szkript mソködéséhez minden általa kezelt táblának tartalmaznia kell egy ID és egy TIMESTAMP oszlopot. El・bbit az azonosításhoz, utóbbit a naplózáshoz használja.
‚
Természetesen ennél jóval több paramétert támogat a szkript, de ismertetésük meghaladja e dokumentum kereteit.
45
Pozícionálás A kezelt táblák máris meghaladják a több ezer rekordos méretet. Ekkora táblákat lehetetlen egyben kezelni az adminisztrátor szempontjából. A probléma megoldásaként az ablakozás technikáját választottam. Tekintsük a teljes táblát egy papírlapnak. Az adatok mennyiségéb・l adódóan lehetetlen az egész táblát egyszerre látni, de kijelölhetünk egy mozgó csúszkát a lapon, ami egyszerre csak néhányszor tíz elemet fed le. Egy ekkora területet már mindenféle gond nélkül megjeleníthetünk egyszerre. Ezt a csúszkát (ablakot) tetszés szerint mozgathatjuk a tábla felett, s・t ennek méretét is megválaszthatjuk. Természetesen bizonyos esetekben nem megfelel・ az ilyen választási lehet・ség, hanem tartalom alapján is szeretnénk keresni. Az el・bb ismertetett ablakozós technika kib・vítésre került egy keres・mez・vel, aminek eredményeképpen el・bb a szkript a beírt kulcsszó alapján leválogatja a bejegyzéseket, majd ezen bejegyzéseken használhatjuk az ablakozós technikát.
46
10. ábra: Ablakméret és kezd・pozíció választása
11. ábra: Ablakméret és pozíció megadása keresési lehet・séggel
12. ábra: Keres・szó nélküli ablakozás eredménye
47
13. ábra: Keres・szó megadásával használt ablakozás. A keresett szó a WinAmp volt.
Adminisztrátori hozzáférések karbantartása A f・oldal els・ lehet・sége az adminisztrátorok karbantartása. Itt állíthatja be a jogosult személy, hogy melyik felhasználónak mihez legyen jogosultsága. A saját jelszavát mindenki szabadon változtathatja meg, ezen kívül minden mソvelethez jogosultságot kell szerezni. A jogosultságok kategóriákra adhatóak. Minden a f・oldalon felsorolt mソvelethez lehet adni jogosultságot, de ugyanígy el is vehet・ ezen az oldalon.
14. ábra: Adminisztrátori jogosultságok 48
Lehetséges új adminisztrátor felvitele, illetve már létez・ törlése, illetve módosítása egyaránt. A változtatások érvényesítéséhez szükséges a megadott sor el・tt található jelöl・dobozt vagy dobozokat bejelölni, különben a feldolgozás során az elvégzett változtatások nem kerülnek végrehajtásra.
Általános informatikai hírek karbantartása A feladat nagymértékben megegyezik az el・bb ismertetettel, bár vannak apróbb eltérések, de azokról is esett már szó. Mivel nagy méretソ tábláról van szó, így el・bb a már megismert ablakozós választóoldal jelenik meg, ahol a felhasználó beállíthatja, hogy mit szeretne adminisztrálni. Ezután a szokásos kép tárul a szeme elé, ahol megteheti a változtatásokat. (11. és 12. ábra) A többi hír karbantartása minimális eltérésekkel ugyanígy zajlik.
15. ábra: Biztonsági hírek platformjainak karbantartása
49
Biztonsági hírek platformjai Azért esett erre a választásom, mert ezzel az egy példával lefedhet・ az összes kategória- és platformtábla. Tekintve, hogy ezek kisméretソ táblák (maximum néhányszor tíz elem), így nincs ablakozás, csupán maga a teljes tábla minden esetben. Ezt leszámítva a mソködés a már korábban ismertetett rendszerソ.
Portálhírek Az eddigiekkel megegyez・ rendszer, köszönhet・en az egységes szkriptes kezelésnek. Bemutatását azért tartom fontosnak, mert egy viszonylag egyszerソ felépítésソ tábla, ami azért rendelkezik többsoros bevitellel és alapértelmezett értékkel is. A mellékelt képet tanulmányozva csupa ismer・s dolgot vélhetünk felfedezni.
16. ábra: Portálhírek karbantartása
50
Zárszó Úgy gondolom, hogy munkámmal sikerült alátámasztanom, hogy manapság a nyílt forrású és ingyenesen hozzáférhet・ szoftverek versenyképes alternatívát nyújtanak a webes adatbáziskezelés területén, és nem csupán egyszerソ, kis látogatottságú és kevés lehet・séget nyújtó oldalak készíthet・k vele, mint ahogyan azt sokan a bennük kialakult tévhit alapján gondolják. El kell ismerni, hogy a Szabad Szoftver Mozgalom és a GNU/Linux születésének hajnalán az általuk nyújtott eszközök még kezdetlegesek voltak, de mára méltó ellenfeleik fizet・s társaiknak. Az elmúlt id・szakban megfigyelhet・ fejl・dést véve alapul nyugodtan kijelenthet・, hogy ezek a megoldások magukban rejtik a lehet・séget arra, hogy teljes szegmensekben egyeduralkodóvá váljanak. Ez a folyamat máris látható a kis és közepes méretソ webszerverek piacán, ahol az Apache elterjedtsége ötven százalék feletti. Hasonlóképpen a kis és közepes méretソ cégek piacán a GNU/Linux és egyéb szabad forrású operációs rendszerek (pl. OpenBSD) is meghatározó szeletet hasítanak ki a szerverek piacából. Az asztali munkaállomások esetén ez a tendencia nem ilyen er・teljes, hiszen itt a GNU/Linux és egyéb szabad forrású társaik kevesebb, mint tíz százalékos népszerソségnek örvendhetnek, de itt is évr・l-évre nagyobb szeletet mondhatnak magukénak. Összességében tehát elmondhatjuk, hogy a jelenlegi helyzetben az ingyenes eszközökkel minden fejleszt・nek számolnia kell, legyen szó akár alternatíváról, akár konkurenciáról.
51
A függelék Fontosabb SQL táblák létrehozó parancsainak listázása CREATE TABLE `adminaccount` ( `ID` bigint(20) NOT NULL auto_increment, `username` varchar(255) binary NOT NULL default '', `password` varchar(255) binary NOT NULL default '', `adminright` tinyint(4) NOT NULL default '0', `chpassword` tinyint(4) NOT NULL default '0', `chnews` tinyint(4) NOT NULL default '0', `chsitenews` tinyint(4) NOT NULL default '0', `chsecurity` tinyint(4) NOT NULL default '0', `chdownload` tinyint(4) NOT NULL default '0', `chlink` tinyint(4) NOT NULL default '0', `chcategorynews` tinyint(4) NOT NULL default '0', `chcategorysecurity` tinyint(4) NOT NULL default '0', `chplatformsecurity` tinyint(4) NOT NULL default '0', `chcategorydownload` tinyint(4) NOT NULL default '0', `chplatformdownload` tinyint(4) NOT NULL default '0', `chvisitors` tinyint(4) NOT NULL default '0', `chcomment` tinyint(4) NOT NULL default '0', `time` timestamp(14) NOT NULL, `acceptsuggestions` tinyint(4) NOT NULL default '0', `chfuns` tinyint(4) NOT NULL default '0', PRIMARY KEY
(`ID`)
) TYPE=MyISAM AUTO_INCREMENT=14 ;
CREATE TABLE `download` ( `ID` bigint(20) NOT NULL auto_increment, `time` timestamp(14) NOT NULL, `counter` bigint(20) NOT NULL default '0', `visited` bigint(20) NOT NULL default '0', `name` text NOT NULL, `category` int(11) NOT NULL default '0', `addedby` varchar(255) NOT NULL default '', `platform` int(11) NOT NULL default '0', `description` text NOT NULL, `url` text NOT NULL, `screen` varchar(150) NOT NULL default '', `Top` varchar(11) NOT NULL default '', PRIMARY KEY
(`ID`)
) TYPE=MyISAM AUTO_INCREMENT=3237 ;
52
CREATE TABLE `funs` ( `ID` bigint(20) NOT NULL auto_increment, `time` timestamp(14) NOT NULL, `author` varchar(255) NOT NULL default '', `title` text NOT NULL, `url` text NOT NULL, `visited` bigint(20) NOT NULL default '0', PRIMARY KEY
(`ID`)
) TYPE=MyISAM AUTO_INCREMENT=353 ;
CREATE TABLE `news` ( `ID` bigint(20) NOT NULL auto_increment, `time` timestamp(14) NOT NULL, `visited` bigint(20) NOT NULL default '0', `title` text NOT NULL, `category` int(11) NOT NULL default '0', `author` varchar(255) NOT NULL default '', `article` text NOT NULL, `showinpage` int(11) NOT NULL default '0', `url` text NOT NULL, PRIMARY KEY
(`ID`)
) TYPE=MyISAM AUTO_INCREMENT=3528 ;
CREATE TABLE `security` ( `ID` bigint(20) NOT NULL auto_increment, `time` timestamp(14) NOT NULL, `visited` bigint(20) NOT NULL default '0', `title` text NOT NULL, `category` int(11) NOT NULL default '0', `platform` int(11) NOT NULL default '0', `author` varchar(255) NOT NULL default '', `article` text NOT NULL, `showinpage` int(11) NOT NULL default '0', `url` text NOT NULL, PRIMARY KEY
(`ID`)
) TYPE=MyISAM AUTO_INCREMENT=2383 ;
53
B függelék Néhány feladat konkrét megvalósítása PHP-ben Id・ kiíratása formázott módon function formatedtimestamp($text) { echo $text[0].$text[1].$text[2].$text[3].'-'.$text[4].$text[5].'-'.$text[6]. $text[7]. ' '.$text[8].$text[9].':'.$text[10].$text[11].':'.$text[12].$text[13]; }
Id・ kiíratása formázott módon az angol nyelv szabályai szerint rövid formában function reversedformatedtimestampshort($text) { echo $text[6].$text[7].'.'.$text[4].$text[5].'.'.$text[0].$text[1].$text[2].$text[3]. ' '.$text[8].$text[9].':'.$text[10].$text[11].':'.$text[12].$text[13]; }
Id・ kiíratása formázott módon az angol nyelv szabályai szerint hosszú formában function reversedformatedtimestamp($text) { echo $text[8]. $text[9]. '.'. $text[5]. $text[6]. '.'. $text[0]. $text[1]. $text[2]. $text[3].' '.$text[11].$text[12].':'.$text[14].$text[15].':'.$text[17].$text[ 18]; }
セrlap legördül・ menüjének generáló függvénye el・re megadott adatok alapján
54
<SELECT class="selectstyle" NAME="" SIZE="1" style="fontsize:8pt;width:80px;">
セrlap jelöl・négyzetének generáló függvénye el・re megadott adatok alapján function createcheckbox($name,$value,$checked=FALSE) { ?> >
セrlap szöveg típusú beviteli mez・jének generáló függvénye el・re megadott adatok alapján function createtextbox($name,$value,$size=15) { ?>
セrlap rejtett mez・jének generáló függvénye el・re megadott adatok alapján function createhidden($name,$value) {