Tartalmi kivonat
A PHP programozási nyelv (webes alkalmazásokra) *iERUpQHV)LVNROD e-jegyzet Dr. Medzihradszky Dénes )RQWRV$MHJ]HWNtVpUOHWLMHOOHJ&pVIRODPDWRVIHMOHV]WpVDODWWiOO (Van néhány üres címsor is. Kiegészítésként használja a kézikönyvet!) $IRUUiVNyGPHOOpNOHWQHPVRNiUDHOpUKHWOHV] (]D]HOVDONDORPKRJHJIDNXOWDWtYWDQWiUJHVHWpEHQD]RNWDWyLDQDJRWWHOMHVHJé- V]pEHQHOHNWURQLNXVIRUPiEDQDGMXNN|]UH(QQHNIRNDD]~MWDQWiUJPiUPRVWHOUH OiWKDWyGLQDPL]PXVDEL]WRVKRJ DM|YpYUHDMHJ]HWHWWHOMHVHJpV]pEHQiW NHOOGRl- JR]QLD]~MSURJUDPQHOYLIHMOHPpQHNQHN 3+3 PHJIHOHOHQ(]pUWHJDPiUNLa- GiVDNRUHODYXOWQDNWHNLQWKHWQRPWDWRWWMHJ]HWPHJMHOHQWHWpVHQHPOHQQHV]HUHQFVpV Ugyanakkor a tantárgy pozíciója csak mostanában körvonalazódik a tanári gárda és a KDOOJDWyN HOV YLVV]DMHO]pVHLQHN KDWiViUD pV V]HUHWQpP KD PD[LPiOLVDQ D IHOPHUO igényekhez és a szakmai követelményekhez tudnánk szabni a tantárgyat.
Ez természetesen most plusz feladatokat ró hallgatóra, oktatóra egyaránt, de ha valóban NRUV]HU&WXGiVWDNDUXQNiWDGQLDNNRUH]~JpU]HPYiOODOKDWypVV]HUHWQpPKDSDUWQerek lenQpQNDWDQWiUJYpJVpVGLQDPLNXVIRUPiMiQDNNLDODNtWiViEDQ Budapest, 2004. június 14 PHP programozási nyelv *iERUpQHV) LVNROD Tartalomjegyzék TARTALOMJEGYZÉK . 2 A0,7$-(*<=(75/781,.(// 4 JAVASLATOK A JEGYZET HASZNÁLATÁHOZ, (/,60(5(7(. 5 BEVEZETÉS . 6 KLIENS - SZERVER ARCHITEKTÚRA . 7 AMIRE TEKINTETTEL KELL LENNI ALKALMAZÁS-FEJLESZTÉS SORÁN . 10 JAVASCRIPT, VBSCRIPT - AZ "EGYETLEN" KLIENS OLDALI ESZKÖZ. 12 A SZERVER OLDALI PROGRAMOZÁS ESZKÖZEI. 14 Adatforrások . 14 CGI programozás . 16 Perl . 17 Python. 18 Java . 19 ASP . 20 A PHP NYELV . 21 A PEAR. 23 PROGRAMOZÁS PHP NYELVEN . 23 Nyelvi jellegzetességek: . 24 EGY APACHE + PHP + MYSQL )(-/(6=75(16=(5g66=(È//Ë7È6$, TELEPÍTÉSE. 31 A telepítés menete Windows rendszeren:. 32 MySQL Front
telepítése. 34 PHPEdit telepítése. 35 EGY VEGYES KÓDOLÁSÚ (PHP + HTML + JAVASCRIPT) WEBOLDAL ELKÉSZÍTÉSE. 36 GYAKORLATI FELADATOK. 39 Jelszavas belépés . 39 & $JDNUDQKDV]QiOW3+3IJJYpQHNNLJ MWpVHpVOLQNHOWOLVWDNpV]tWpVH iWXPpVLG PHJMHOHQtWpVH . 47 5HJLV]WUiFLyDGDWIHOYLWHODGDWIHOYLWHOHOOHQ 7|EEQHOY . 44 U]pV . 48 &ROGDODNHJUHJLV]WUiFLyV&UODSQHOYHQ. 54 Névnapozás, az aktuális névnap kiírása . 58 NH]HOpVIHOVIRNRQ . 60 iWXPpVLG 5HJXOiULVNLIHMH]pVDONDOPD]iVDEHYLWHOLPH] %DQQHUFVHUpO NHOOHQU]pVpUH. 63 N . 65 %0DGDWEi]LVNH]HOpVXWROVyOiWRJDWiVLG SRQWMD . 69 DBM adatbázis kezelés - jelszavas beléptetés. 72 (JV]HU &IyUXP]HQIDO. 77 /iWRJDWyV]iPOiOiVHJV]HU & . 77 Látogató számlálás - statisztika. 78 2/89 LVNROD PHP programozási nyelv *iERUpQHV) Képek kirakása, képgalériák. 78 Dinamikus képek - felirat készítés. 79 &LGRPRNNLUDM]ROiVD . 79
LQDPLNXVNpSHNHJV]HU Dinamikus képek - oszlopdiagram kirajzolása . 82 Dinamikus képek - vonaldiagram kirajzolása. 85 Szavazógép kódolása . 86 Felmérés készítése . 86 Tesztprogram kódolása. 87 E//(15=.e5e6( 87 IRODALOMJEGYZÉK. 87 Perl . 87 PHP . 88 PHP )(-/(6=7(6=.g=g 88 HASZNOS LINKEK . 88 &ROGDODN . 89 0DJDUQHOY & $QJROQHOY ROGDODN . 89 3/89 LVNROD PHP programozási nyelv *iERUpQHV) $PLWDMHJ]HWUOWXGQLNHOO .HGYHV2OYDVyP$NH]pEHQWDUWRWWYDJLQNiEEDNpSHUQMpQOiWKDWyMHJ]HW KiURPIUpV]EOiOO$]HOVUpV]pEHQU|YLGHQ|VV]HIRJODORPPLQGD]WDPLWV]HUYHU oldali programozás néven oktatunk, kiemelve az architektúrális sajátosságokat és a szerver-kliens közötti kommunikáció problémakörét. A második részben ennek a témaN|UQHND]HJLNpVWDOiQDOHJGLQDPLNXVDEEDQIHMOGHV]N|]pWD3+3SURJUDPR]iVL nyelvet ismertetem dióhéjban. A harmadik rész a tantárgy oktatási keretének
megfelelHQHOVVRUEDQJDNRUODWLLVPHUHWHNDGNRQNUpWZHEHVSpOGiNRQNHUHV]WOLVPHUWHWHPD QHOYDONDOPD]iVDLW(]DSpOGDJ&MWHPpQLVIRODPDWRVDQIHMOGLNWHUYHLPV]HULQWD] RNWDWiVVRUiQIHOPHUO|WOHWHNPHJROGiVRNLVIRNR]DWRVDQEHOHNHUOQHNtJUHPpOHP KRJLGYHOHJPLQGHQNLV]iPiUDMyOKDV]QiOKDWyJD]GDJDONDOPD]iVLPLQWDNpV]OHW halmozódik majd fel. ÏULiVLDQDJUpV]DV]HUYHUROGDOLSURJUDPR]iVPHUWDJRUVDQIHMOGZHEHV WHFKQLNiNDNiUD]HJV]HU&LVPHUHWQ~MWiVDNiUDFVRSRUWPXQNDV]LQWMpQPHJN|Yetelik a változatos eszköztár létrehozását. Ugyanakkor szeretném bemutatni, hogy mint PLQGHQDONDOPD]iVIHMOHV]WpVHVHWpEHQDJRQGRONRGiVHOVDMiWtWiVDD]HOVGOHJHVPHUWD] HJHVPHJYDOyVtWiVLPyGRNV]iPRVIRUUiVEyOKR]]iIpUKHWN(]pUWNpUHPD]ROYDVyW hogy az elvi megoldásra koncentráljon és ne a konkrét megvalósításokra. Nem kell a IJJYpQN|QYWiUDNDWNtYOUOLVPHUQLHOpJKDNLWXGMXNNHUHVQLDPHJIHOHOIJgvényt, metódust.
$MHJ]HWEHQW|UHNHGWHPDOHJNRUV]HU&EEGHPiUQHPNtVpUOHWL EpWD VWiGLXPEDQ OHYIHMOHV]WHV]N|]|NHWLVPHUWHWQLGHPLYHODSURJUDPR]iVQDNHJYDOyEDQV]pGOHWHV WHPSyEDQIHMOGV]HOHWpWWiUJDOMXND]LQIRUPiFLyQDJYDOyV]tQ&VpJJHODOHtUiVVDO együtt el is avul /(UUHMySpOGDKRJDMHJ]HWHOVQHUVYiOWR]DWiQDNHONpV]OWHyWD (2003. október-november) megjelent a PHP nyelv 5 verziója, amely alapjaiban változtatja majd meg a PHP nyelven végzett programozást Ez még jelenleg csak béta válto- ]DWEDQNHUOWNLDVWDELONLDGiVHJHQOUHYiUDWPDJiUDEiUDWDQpYYpJpUHYiUKDWyDQD] is megjelenik, így a jegyzet átdolgozására máris fel kell készülni. Ennek ellenére jó kiindulópontot adhat ezekhez a technológiákhoz, de nyomatékosan felhívom a figyelmet az internet használatára - ami persze együtt jár az angol nyelvismeret szükségességével. 4/89 LVNROD PHP programozási nyelv *iERUpQHV)
$IHQWLHNPLDWWKLYDWNR]iVNpQWOHKHWOHJD]RNDWDZHEKHOHNHWDGRPPHJDPelyek az egyes technikák hosszú távon is érvényes forrásai találhatók meg és kiindulási pontot biztosíthatnak az egyéb webes források felé. -DYDVODWRNDMHJ]HWKDV]QiODWiKR]HOLVPHUHWHN 1HPHJWHOMHVD3+3SURJUDPR]iVLQHOYHWD]DODSMDLWyOLVPHUWHWMHJ]HWHONé- szítésére vállalkoztam. Ezt a feladatot mások már elvégezték, magyar nyelven is szám- WDODQMyNp]LN|QYNDSKDWy&pORPDPLQWiNDODSMiQW|UWpQWDQtWiVD]D]D]HOPpOHWL összefoglaló után a gyakorlati webes megoldásokra helyezem a hangsúlyt és konkrét alkalmazási példákon keresztül mutatom be a PHP nyelv használatát, annak speciális OHKHWVpJHLWNLHPHOYH9pOHPpQHPV]HULQWQHPHJHJHV]N|]EODGRWWHVHWEHQ SURJUDPQHOYEONHOOPLQGHQWNLIDFVDUQLH]pUWNHUOWEHOHDIRQWRVDEEV]HUYHUROGDOL technikák ismertetése is, hogy az olvasó elhelyezhesse ezt az eszközt a webes alkalmazások
fegyvertárában. Kezdetnek javaslom az amúgy is olvasmányosnak szánt elméleti rész átnézését, elolvasását, hogy helyre tudjuk tenni a dolgokat és felfrissítsük webes, hálózati ismereWHLQNHW3UyEiOMXNPHJiWJRQGROQLPLQGD]RQHOQ|NHWpVQHKp]VpJHNHWNRUOiWRNDW amit egy kliens-szerver architektúra hoz magával. Ajánlatos felfrissíteni programozási ismereteinket is, mert sem a strukturált programozás alapjait, sem az objektumorientált programozás elveit nem fogom részleteiben ismertetni, csupán utalok rá, mint ismertnek feltételezett fogalmakra. Hasonlóképpen javaslom az adatbázis-kezelési ismeretek megújítását is. A dinamikus webes alkalmazások létrehozását az adatok, dokumentumok perzisztens tárolása
WHV]LOHKHWYpMHOHQWVPpUWpNEHQD]HOVVRUEDQZHEHVHV]N|]|NK|]NLIHMOHV]WHWWHJyV]HU&HQKDV]QiOKDWyDGDWEi]LVUHQGV]HUHNOpWUHM|WWHDGWDDG|QWO|NpVWDGLQDPLNXVDlNDOPD]iVRNXJUiVV]HU&HOWHUMHGpVpKH]$JDNRUODWLDONDOPD]iVRNVRUiQD]HJV]HU& lekérdezések, rekordbeszúrások, adatmódosítások, néhány táblás adatbázisok létrehozáVDUXWLQV]HU&OpSpVHNOHV]QHN Javasolom az internet alapos és kritikai tanulmányozását! Szeretném, ha a hall- JDWyNNHOONtYiQFVLViJJDOiOOQiQDNKR]]iHKKH]D]HOVVRUEDQJDNRUODWLLVPHUHWHNHW nyújtó tantárgyhoz és arra próbálnának a tantárgy keretén belül választ találni, hogy az 5/89 LVNROD PHP programozási nyelv *iERUpQHV) LQWHUQHWHQJDNUDQHOIRUGXOyPHJROGiVRNKRJDQKR]KDWyNOpWUHpVH]HNHQEHOOKRO alkalmazhatók az itt elsajátítható ismeretek! ,VPHUWQHNWpWHOH]HPIHOD+70/-DYD6FULSWDODSYHWLVPHUHWpWHUUHQHPIRJRN kitérni a jegyzetben, de akik eddig csak HTML formátumba
mentéseket csináltak, azok számára melegen javasolom a HTML szintaktika átnézését. $JDNRUODWLSUREOpPiNPHJROGiViWFVDNV]iPtWyJpSHOWWpUGHPHVYpJH]QL(]pUW V]HGWHP|VV]HDNpVEELVPHUWHWpVUHNHUOV]RIWYHUHV]N|]|NHWLVKRJEiUNL|VV]H WXGMRQUDNQLPDJiQDNHJIHMOHV]WN|UQH]HWHWpVRWWKRQLVIHMOHV]WKHVVHQHJV]HU&EE vagy bonyolultabb alkalmazásokat. Ne nézzük le ezt a környezetet, bár kétségtelen, KRJHJLJD]LZHEV]HUYHUHJHVHVHWHNEHQPiVNpQWP&N|GLND]tJIHMOHV]WHWWDQagokat minden további nélkül át lehet tenni egy valódi szerverre, jól elrendezett alkalmazás esetén csupán a beállításokat, konfigurációs fájlokat kell átírni a környezetnek megfeOHOHQ A tanuláshoz sok sikert kívánok és minden észrevételt, javaslatot szívesen veszek a tantárggyal, jegyzettel kapcsolatban - munkámban sokat segítenek az olyan gyakran IHOPHUONpUGpVHNLVPLQWSpOGiXO(]WDNRQNUpWSUREOpPiWKRJDQOHKHWPHJROGDQL" Bevezetés A
számítógépeken alapuló informatika hajnalán már felmerült, hogy az egyes GUiJDiPQDJWHOMHVtWNpSHVVpJ&V]iPtWyJpSHNVRNNLVHEEWHOMHVtWPpQ&JpSHWNLWXdnak szolgálni információval, futtatható programokkal. Ezt az elvet gyorsan belátták és hamar alkalmazásra került, így a szerver-kliens közötti munkamegosztás fogalma nagyon hamar bekerült a köztudatba. Az egyes számítógépek teljesítményének megnöve- NHGpVpYHONpVEEDV]HUYHUHNMHOHQWVpJHNLVHEEOHWWiPLVPpWQ|YHNHGpVQHNLQGXOWD számítógépek közötti kommunikáció elterjedésével és általánossá válásával párhuzamo- VDQ1DSMDLQNEDQDV]HUYHUNpQW]HPHOV]iPtWyJpSHNIIHODGDWDD]LQIRUPiFLyV]RlJiOWDWiVDNiUHJV]HU&V]|YHJHVpVNpSLIRUPiEDQ ZHEHVDONDOPD]iVRN DNiUSHGLJ strukturált adatok formájában (adatbázis szerverek). Ez a két forma természetesen keve- UHGKHWLVQDJRQVRNV]RUHOIRUGXOKRJDGRNXPHQWXPMHOOHJ&LQIRUPiFLyNEDNLVHEE nagyobb
mértékben adatbázisokból nyert információt ágyazunk bele. Szerverek intézik még az ember-ember közötti kommunikáció elosztását is, ezek az egyes szolgáltatók által üzemeltetett e-mail szerverek. A jegyzetben a dinamikus webes alkalmazások által 6/89 LVNROD PHP programozási nyelv *iERUpQHV) biztosított információ szolgáltatás eszközeit ismertetjük, a hangsúlyt a szerver oldalon megvalósítható alkalmazásokra helyezve. A technika azonossága miatt nem csak a :RUOG:LGH:HENHUHWHLQEHOONpS]HOKHWHODNLIHMOHV]WHWWDONDOPD]iVKDQHPKHOL KiOy]DWRNRQpVHJHGLJpSHNHQLV]HPHOWHWKHWEiUQHPH]HNYROWDNDPHJFpO]RWWWe- rületek a jegyzet írása során. Kliens - szerver architektúra $QDJN|]|QVpJV]iPiUDKR]]iIpUKHWLQIRUPiFLyG|QWW|EEVpJpWPDD]LQWHUQHW szolgáltatja. A fogalom mögött egy többszörösen - redundáns módon - összekapcsolt YLOiJPpUHW&V]iPtWyJpSKiOy]DWiOOHQQHNFVRPySRQWMDLWDONRWMiND]HJHVWDUWDORm-
szolgáltató szerverek és az ezek azonosítását szolgáló névszerverek. A tartalomszolgáltató számítógépek illetve a rajtuk futó szerver funkciót ellátó alkalmazások a kliens gé- SHNWOEHpUNH]NpUpVHNDODSMiQD+7731 protokoll szerint fájl lekéréseket hajtanak végre és ezeket a fájlokat az egyes kliens számítógépeken futó alkalmazások, a böngészprogramok értelmezik. Amennyiben szükséges, a tartalomszolgáltató szerverek adatbázis szerverekhez is fordulhatnak a kért információért Az információ hagyományos doNXPHQWXPMHOOHJHYLV]RQWQHPWHUHPWLPHJDOHKHWVpJHWJRUVDQYiOWR]yGLQDPLNXV DGDWRNEHLOOHV]WpVpUHpVtJPiUW|EEpYHH[SRQHQFLiOLVDQIHMOGYHQD]RQDONDOPD]á- VRNV]iPDDPHOHNDEHpUNH]+773NpUpVHNUHYiODV]XOQHPVWDWLNXVKDQHPDNpUpVUH |VV]HiOOtWRWWGRNXPHQWXPRWNOGHQHNHODE|QJpV]SURJUDPQDN7HUPpV]HWHVHQHEEHQD dinamikusan összeállított dokumentumban már helyet kaphatnak adatbázisokban tárolt
YDJV]iPtWRWWDGDWRNLV(QQHNPHJIHOHOHQEHV]pOQNPDNpWUpWHJ& WZRWLHU pVKá- URPUpWHJ& WKUHHWLHU DONDOPD]iVRNUyO2DKRODNpWUpWHJ&DONDOPD]iVDODWWpUWMNDNpWRl- GDO~NOLHQVV]HUYHUWtSXV~DONDOPD]iVWpVKiURPUpWHJ&DONDOPD]iVQDNQHYH]]ND]W ahol egy harmadik szolgáltató, egy adatbázis szerver is bekapcsolódik az információ HOillításába. 1 HTTP - hypertext transfer protocol; a hipertextes alkalmazások átviteli protokollja 2 A jegyzetben a többé-kevésbé meghonosodott réteg elnevezést használom, bár ez nem fedi teljesen az eredeti angol szakkifejezést. Nagyon fontos megjegyezni, hogy ez a réteg elnevezés semmiféle kapcsolatban nincs az OSI rétegmodell elemeivel, nincs egymásra épülés, inkább azt kívánja kifejezni, hogy több, HJPiVWyOIJJHWOHQVSHFLiOLVIHODGDWRNDWHOOiWyUHQGV]HUHJWWP lünk. 7/89 &N|GpVpQDODSXOyDONDOPD]iVUyOEHV]é- LVNROD PHP programozási nyelv *iERUpQHV) 1.
ábra$]HOVUpWHJHWNpSH]LDPHJMHOHQtWpVD]LQWHUQHWWHOPLQWV]iOOtWyN|]Hg- JHOpVDE|QJpV]YHOPLQWDUHQGHUHOpVHV]N|]pYHO$PiVRGLNUpWHJD]]OHWLORJLNDH] tartalmazza szerver oldali szkriptjeinket és a harmadik réteg az adattárolás eszköze, a megIHOHOHQYiODV]WRWWDGDWEi]LV 7HUPpV]HWHVHQH]FVDNHOYLPHJN|]HOtWpVD]HJHVV]HUYHUIXQNFLyWEHW|OWpVNOi- HQVSURJUDPRNV]pOVHVHWEHQD]RQRVIL]LNDLHJVpJHQLVIXWKDWQDNSpOGiXOHJIHj- OHV]WUHQGV]HUYDJRNWDWyUHQGV]HUHVHWpEHQpVIXWWDWKDWyNHJPiVWyOWiYROHVI|OdUDM]LKHOHNHQLV$]HJPiVWyOWiYROHOKHOH]NHGHJVpJHNN|]|WWLNRPPXQLNiFLyW ebben az esetben biztosíthatja az Internet fizikai hálózata vagy kisebb távolságok esetén helyi hálózatok is (intranetes alkalmazások egy-egy intézményen belül, LAN3). A fel- KDV]QiOyNpVDIHMOHV]WNV]HPSRQWMiEyOH]JDNRUODWLODJPLQGHJDPHQQLEHQDNRm- 3 LAN Local Area Network; helyi hálózat 8/89 LVNROD PHP programozási nyelv *iERUpQHV)
munikáció a TCP/IP4SURWRNROOpVD]HUUHpSO+773SURWRNROODODSMiQW|UWpQLND] LQIRUPiFLyWV]ROJiOWDWyDONDOPD]iVP&N|GpVLHOYHPLQGHQHVHWEHQD]RQRVOHV]pVD] DONDOPD]iVDKiOy]DWJHRPHWULiMiWyOpVNLWHUMHGpVpWOIJJHWOenül létrehozható. $NOLHQVJpSHQIXWyE|QJpV]SURJUDPEyOLQGtWRWWNpUpVHNUHYiODV]XOOHNOG|WWGo- kumentumok feldolgozásához csupán a dokumentumok leíró nyelvét, a HTML5 nyelvet NHOODE|QJpV]QHNpUWHOPH]QLpVHQQHNPHJIHOHOHQPHJMHOHQWHWQLDGRNXPHQWXPRWD NOLHQVJpSNpSHUQMpQ1HPLJpQHONO|Q|VHEEPDJDUi]DWRWKRJHJDGRNXPHnWXPV]HUNH]HWpWNOVPHJMHOHQpVpWOHtUyQHOYQHPDONDOPDVDUUDKRJYiOWR]yWDUWDl- PDWKRUGR]]RQpVMHOHQtWVHQPHJYDODPLQWOHKHWYpWHJHDIHOKDV]QiOyiOWDOEHYLWW adatok manipulálását. Erre azonban kétségtelenül szükség van és így adatbeviteli
funkFLyWPiUD+70/QHOYNRUDLYiOWR]DWDLEDLVEHpStWHWWHNH]]HOOHKHWYpWpYHDIHOKDVzQiOyLDGDWRNEHYLWHOpWDE|QJpV]SURJUDPVHJtWVpJpYHO(]D]HV]N|]D+70/&UODS IRUP REMHNWXPDpVDQQDNJHUPHNREMHNWXPDLD]HJHVVSHFLDOL]iOWEHYLWHOLPH]N DPHOHNiOODQGyIHMOGpVEHQYDQQDNDE|QJpV]SURJUDPRNNDOHJWWKLV]HQH]HN megjelenítését a bönJpV]YpJ]L +DMyOPHJILJHOMNHJHOVUiQp]pVUHPHJOHKHWVHQERQROXOWpVEL]RQWDODQ P&N|GpV&UHQGV]HUiOOWHKiWDUHQGHONH]pVQNUH9DQHEEHQDUHQGV]HUEHQHJYDJ W|EEV]HUYHUDPHO HN GRNXPHQWXPRNDWWXGQDNV]ROJiOWDWQL(]HNWHWV]OHJHVUHQd- V]HUEH|VV]HI&]KHWHNDKLSHUWH[WHOHPHNVHJtWVpJpYHODNOLHQVJpSHQPHJMHOHQtWHQG GRNXPHQWXPHJHVHOHPHLW|EEV]HUYHUUOLVV]iUPD]KDWQDN$+70/iOWDOEL]WRVtWRWW navigáció segítségével tetszés szerinti számú szervert járhatunk be, de nem tudjuk elleQUL]QLKRJDNtYiQWLQIRUPiFLyDOHNpUpVLGSRQWMiEDQUHQGHONH]pVUHiOOH%iUOHKe-
WVpJQNYDQV]LQWHEiUPLOHQLQIRUPiFLy QXPHULNXVpVV]|YHJHVDGDWRNNpSV]|YHJ PXOWLPpGLDIiMORN IHOYLWHOpUHD]HJHVV]HUYHUHNUHDNOLHQVJpSHQIXWyE|QJpV]SURg- UDPRNVHJtWVpJpYHOH]D]LQIRUPiFLyQHPpUKHWHON|]YHWOHQOD]DGDWRNIHOGROJR]iVD a dokumentum-kezelés szintjén nem valósítható meg. Bár fontos és kényelmes lenne a fogadó oldal, a kliens számítógép képességeinek ismerete, azok fel- és kihasználása, ez EL]WRQViJLRNRNEyOQHPYDJFVDNHUVHQNRUOiWR]RWWDQYDOyVtWKDWyPHJHJV]HUYHU ne kezelhesse a kliens számítógépet, ne kezeljen fájlokat, ne indíthasson programokat 4 TCP/IP Transmission Control Protocol/Internet Protocol; az Internet rendszerében alkalmazott csomag- küldésen és -fogadáson alapuló átviteli protokoll. 5 HTML HyperText Markup Language; hipertext leíró nyelv. 9/89 LVNROD PHP programozási nyelv *iERUpQHV) UDMWD0LQGHQDGDWiWDGiVNRPPXQLNiFLyV]NVpJV]HU&HQNpWYDJW|EEV]iPtWyJpSNö-
]|WW]DMOLNDPHOHNHWHQQHNPHJIHOHOHQNHOOYpGHQLpVD]DGDWRNDWLVHOOHQUL]QLNHOO$ EL]WRQViJLHOYHNQHNPHJIHOHOHQFVDNDNOLHQVJpSLQGtWKDVVRQGRNXPHQWXPOHNpUpVHNHW - HTTP lekérések - ezeket a szerver szolgálja ki, de regisztráljon minden kérést. KínálMRQIHOV]LQWHPLQGHQNpQHOPLOHKHWVpJHWDOHKHWOHJPDJDVDEEV]LQW&NLV]ROJiOiVpr- GHNpEHQGHDNNRULVPHJIHOHOOHJHQDWiODOiVKDDNOLHQVROGDORQQHPiOOUHQGHONezésre az ideálisnak tekintett háttér. Fontos az is, hogy a gyorsabb "ügyintézés" érdeké- EHQDOHKHWOHJW|EEJRUVUHDJiOiVWLJpQOYiODV]WpVOHKHWVpJHWDNOLHQVROGDORQNe]HOMQNOHV]iPROYDDJpSHNN|]|WWLNRPPXQLNiFLyV]&NNHUHV]WPHWV]HWpYHO SpOGiXO modemes kapcsolat). Amire tekintettel kell lenni alkalmazás-fejlesztés során )HQWLHNWHOMHVN|U&PHJYDOyVtWiVDHJKiURPUpWHJ&ZHEHVDONDOPD]iVNHUHWHLNö- ]|WWQHPHJV]HU&GRORJpVEL]WRVKRJW|EENO|QE|]VSHFLDOL]iOWHV]N|]P&N|GpVpW kell
összehangolnunk a jó eredmény érdekében. Nézzük meg tehát, hogy mi mindenre kell figyelmet fordítani egy tipikus webes alkalmazás elkészítése során. ♦ $IHOKDV]QiOyROGDOiQRODQE|QJpV]SURJUDPRNiOOQDNUHQGHONH]pVUHDPeOHNWtSXVDpVHEEODGyGyDQNpSHVVpJHLNV]pOHVVNiOiQYiOWR]QDNH]pUWJa- NRUODWLODJOHKHWHWOHQPLQGHQHVKHWVpJUHIHONpV]tWHQLD]DONDOPD]iVXQNDW OiVG Microsoft Explorer, Netscape Navigator, Mozilla, Opera és mások, valamint H]HNJDNUDEEDQHOIRUGXOyYHU]LyLD],(WyOpVD]11WyONH]GYHD pVYHU]LyNLJNENO|QE|]HV]N|]QHPEHV]pOYHDYDNRNiOWDO KDV]QiOKDWyVSHFLiOLVE|QJpV]SURJUDPRkról). ♦ 6]iPRVHVHWEHQDNLHJpV]tWLQIRUPiFLyKRUGR]yNPHJIHOHOPHJMHOHQtWpVpKH] NO|QE|]OHMiWV]ypVNLHJpV]tW SOXJLQ SURJUDPRNUDYDQV]NVpJ )ODVK mozgókép, hang, stb.), ezek hozzáférését illik megadni ♦ A felhasználó egyéni meglátásai és indítékai alapján ki- illetve bekapcsolhat
NOLHQVROGDOLHV]N|]|NHW -DYD6FULSWFRRNLHVpVNO|QE|]-DYDpUWHOPH]N Ezek alkalmazását vagy kerülni kell, vagy az alkalmazásunk feltételeként meg kell adni - és persze a feltétel nem teljesülését is le kell kezelni. 10/89 LVNROD PHP programozási nyelv *iERUpQHV) ♦ $IHOKDV]QiOyROGDOiUyOD]DGDWEHYLWHOWHOOHQUL]QLNHOOpVH]WIHOKDV]QiOyEDUiW PyGRQNHOOHOYpJH]QLUpV]EHQNRUOiWR]YDDEHYLKHWDGDWRNDW OHJ|UGOOLs- WiN UpV]EHQNOLHQVROGDORQHOOHQUL]YH HQQHNHV]N|]HLYLV]RQWNLNDSFVROKaWyNOiVG-DYD6FULSW pVDV]HUYHUROGDORQIHOWpWOHQO~MUDHOOHQUL]QLNHOOWekintettel a kliens oldal manipulálhatóságára. Nem szabad elfelejteni, hogy a NOLHQVROGDORQHJ&UODS IRUP WHWV]pVV]HULQWPHJYiOWR]WDWKDWyDNyG~MUDtUásával. ♦ A webes alkalmazáshoz nincs kidolgozott súgórendszer, tehát a felhasználó informálását és támogatását a web szövetébe kell ágyazni, a navigálás
kialaNtWiViQiOHJpUWHOP&VpJUHNHOOW|UHNHGQL ♦ A felhasználókat azonosítani is kell és esetenként személyre/kategóriára szabott megjelenítést kell biztosítani - ehhez a belépéseket és a navigálást regisztrálni, követni kell szerver oldali eszközökkel. ♦ $ZHEHVDONDOPD]iVRNQDNDQQLEHOpSpVLSRQWMDOHKHWDKiQNO|QE|]85/6 létezik az adott webhelyen belül. Ezek mindegyikét figyelni, kezelni kell EnQHNPHJIHOHOHQWHUPpV]HWHVHQDNLOpSpVLOHKHWVpJHNV]iPDLVQDJPLQGHQ egyes oldal lefutásakor gondoskodni kell például a fájlok, adatbázisok zárásáról. ♦ $E|QJpV]ND]D]RNDWIXWWDWyRSHUiFLyVUHQGV]HUHNDODSpUWHOPH]HWWHQU|YLG és hosszú távon tárolják a meglátogatott weboldalak URL címeit és navigációs HV]N|]|NHWEL]WRVtWDQDN HOUHpVYLVV]DJRPERNKLVWRU (]HNHWV]LQWpQIi- gyelembe kell venni, védett oldalak esetében kezelni kell a tárolt adatok alapján megkísérelt belépéseket. ♦
$NOLHQVUHOHNOG|WW+70/NyGpVIiMORNSXEOLNXVQDNWHNLQWHQGN6HPNpS VHPNyGQLQFVEL]WRQViJEDQH]HNEHQNpQHVLQIRUPiFLyQHPKHOH]KHWHO MHOV]yD]RQRVtWyUHMWHWWPH]N-DYD6FULSWNyG $]LGQNpWDZHEHVIyUXPo- NRQIHOUHSSHQKLHGHOPHNNHOV]HPEHQQLQFVOHKHWVpJNpSHNIiMORNYpGHOPé- 6 URL Uniform/Universal Resource Locator, az egységes forrás azonosító, az Internetes források ZHEODSRN HJHGLFtPHÒMDEEDQKHOHWWHHO V]HUHWHWWHOKDV]QiOMiND]iOWDOiQRVDEEpUWHOPH]pV&85,WD] Universal Resource Identifier elnevezést, a napjainkban leggyakrabban használt URI az URL. 11/89 LVNROD PHP programozási nyelv *iERUpQHV) re, maximum a laikus felhasználó dolgát lehet kismértékben megnehezíteni, de a jó öreg Print Screen ellen semmi sem véd meg ♦ A kliens - webszerver közötti kommunikáció lassú és megbízhatatlan, és amennyiben az adatbázis szerver külön gépen, külön URL címen helyezkedik el, az adatbázis - webszerver
közötti kommunikációra is ugyanez áll. Ezért PLQGLJILJHOHPEHNHOOYHQQLDKiOy]DWWHOMHVtWNpSHVVpJpWPRGHPHVNDSFVo- ODWHVHWpQQHPWHUYH]KHWMNQDJPHQQLVpJ&LQIRUPiFLyJRUVOHNOGpVpW Ugyanakkor mindig számolni kell a webszerver és az adatbázis szerver id- V]DNRVHOpUpVLQHKp]VpJHLYHO/HKHWOHJLOHQNRUQHD]HV]N|]|NEHpStWHWWKiED]HQHWHLNHUOMHQHNHOKDQHPDIHOKDV]QiOókat informáló hibajelentések. $PHQQLEHQD]DONDOPD]iVIOHJGLQDPLNXVDQYiOWR]yDGDWRNNDOGROJR]LNpVD] HPEHUGRNXPHQWXPV]HUNHV]WWHYpNHQVpJpWDPLQLPiOLVDQV]NVpJHVPpUWpNUHDNDrjuk visszaszorítani, ezeket az alapelveket fokozott mértékben kell betartani. Nyilvánva- OyKRJVWDWLNXVDGDWRNHVHWpEHQW|EEOHKHWVpJYDQD]RNPHJIHOHOpVVSHFLiOLVWiODOására" míg dinamikus adatok esetében nehéz az általánosan alkalmazható keretrendszer NLDODNtWiVD(]HNHJHQV~OiWyOIJJD]DONDOPD]iVPLQVpJH$]DOiEELDNEDQHJ
JRUViWWHNLQWpVWDGXQND]HJHVHV]N|]|NUOD]RNV]HUHSpUOpVKHOpUODNRPSOH[ webes alkalmazások fejlesztésben. JavaScript, VBScript - az "egyetlen" kliens oldali eszköz +DHJHWOHQDNNRUPLpUWNHWW"PHUOKHWIHODMRJRVNpUGpVDYiODV]SHGLJHJy- V]HU&HQDQQLKRJDNpWV]NULSWQHOYXJDQD]WDIHODGDWRWOiWMDHOiPD-DYD6FULSW QpSV]HU&VpJHLVPHUWVpJHMyYDOQDJREEN|UOEHOODUiQEDQWDOiOXQNDZHEHQ JavaScript-tel foglalkozó oldalakat a VBScript oldalakkal szemben. Mindkét nyelv természetesen megfelel céljainak, nem kívánok egyik mellett sem állást foglalni, ez éppen olyan értelmetlen lenne, mint a legjobb programnyelv meghatározása. Míg a JavaScript HJ&QHOYWtSXV~REMHNWXPDODS~QHOYD9%6FULSWQHYpQHNPHJIHOHOHQD%DVLF QHOYFVDOiGWDJMDtJD]HJHVVWUXNWXUiOLVHOHPHNHWHQQHNPHJIHOHOHQMHOHQtWLPHJ (OUHERFViWRPKRJD-DYD6FULSWQHOYQHNVHPPLN|]HD-DYDQHOYKH]FVXSiQD]
VND&QHOYD]RQRVpVDORJLNXVIHMOGpVKR]]DH]HNHWN|]HOHJPiVKR]0LYHOD WDQWiUJNHUHWpEHQIQHOYNpQWHJPiVLN&WtSXV~QHOYD3+3RNWDWiViUDNHUOVRU ezért fontosabbnak tartom a JavaScript ismertetését a szükséges minimális mértékben, hogy az elkerülhetetlen esetekben alkalmazása ne okozzon problémát. 12/89 LVNROD PHP programozási nyelv *iERUpQHV) Természetesen a JavaScript nem szerver oldali eszköz, bár vannak próbálkozások a nyelv kiterjesztésére szerveren futó alkalmazásokra is. Bár ez az egyetlen interaktív HV]N|]DPLDNOLHQVROGDORQIXWWDWKDWyQHPWHNLQWKHWWHOMHVSURJUDPR]iVLQHOYQHN EL]WRQViJLRNRNEyOWHOMHVHQKLiQ]LNEHOOHDIiMONH]HOpVPHJYDOyVtWiVDQHPROGKDWy PHJROYDViVtUiVP&YHOHWVHP8JDQDNNRUV]iPWDODQDONDOPD]iVPHJYDOyVtWKDWyVe- JtWVpJpYHOD]HJV]HU&HVHPpQNH]HOpVHNWODNRPSOH[MiWpNSURJUDPRNLJ-DYD6FULSW
VHJtWVpJpYHOYDOyVtWKDWyPHJD]|VV]HVNOLHQVROGDOLLQWHUDNWtYWDUWDORPDNO|QE|] PHQNWONH]GYHD]&UODSRNHOOHQU]pVpLJHQQHNNRUOiWMDLWPiUHPOtWHWWHPpVDIHl- KDV]QiOyYiODV]WiViQDNPHJIHOHOHQPyGRVXOyWDUWDOPDNLJ$E|QJpV]GRNXPHQWXP (document) és window objektumait is kezelni tudjuk JavaScript segítségével, de a webes alkalmazásokban gyakran használt ablaknyitások, egérmozgásra érzékeny tartalmak, egérkattintásra reagáló elemek megvalósítása is JavaScript segítségével történhet. 2ODQNRUV]HU&UHQGV]HUHNPLQWSpOGiXOD],%0:HEVSKHUHDONDOPD]iVDLV JavaScript nyelvet használ a kliens oldalon. Kihasználható a szerver és a kliens oldali SURJUDPQHOYHNpVD+70/V]LQWHNRUOiWODQNHYHUKHWVpJHQHPULWNDHJRODQDONDlmazás, ahol például az adatbázisban tárolt információ alapján egy szerver oldali nyelv -DYD6FULSWNyGRWiOOtWHOH]DNOLHQVWOLQGXOyNpUpVUHOHNHUODIHOKDV]QiOyJpSpUHpVD]
RWWIXWyE|QJpV]SURJUDPD-DYD6FULSWiOWDOHOiOOtWRWW+70/NyGRWDODSMiQMHOHQtWLPHJ D]LQIRUPiFLyW$NOLHQVROGDOLLQWHUDNWLYLWiVNXOFVDLVD]KRJD-DYD6FULSWiOWDOHOil- OtWRWW+70/NyGpUWHOPH]KHWDE|QJpV]EHQLOOHWYHD207 biztosít olyan elemeket, amelyek értéke változtatható, így a megjelenített tartalom is változik ezek felülírásával. (]HQDODSV]LNVRNHJV]HU&EEYDJERQROXOWDEEiPUHQGNtYOKDWiVRVZHEHVDONDOPazás kliens oldali eleme - órák, számológépek, értékszáPtWy&UODSRNNRQYHUWHUHN 1HPKDOOJDWKDWMXNHOD]WVHPKRJPLYHOD-DYD6FULSWDE|QJpV]EHQIXWDQQDN típusa, változata nagymértékben befolyásolja a JavaScript alkalmazhatóságát. A -DYD6FULSWHVDONDOPD]iVRNNO|QIHMH]HWpWDONRWMiNDE|QJpV]GLDJQRV]WLNiNRODQ 7 20RFXPHQW2EMHFW0RGHOGRNXPHQWXPREMHNWXPPRGHOO$]~MDEEWtSXV~E|QJpV] & NV]iPiUDD & o- +70/GRNXPHQWXPQHPHJV]HU V]|YHJHViOORPiQKDQHPHOHPHLHJPiVVDOIDV]HUNH]HW NDSFV
ODWEDQiOOYDHJHU VHQKLHUDUFKLNXVREMHNWXPRWDONRWQDNH]HNFVRPySRQWMDLKLYDWNR]iVRNDODSMiQN| YHWOHQOLVHOpUKHW N(J&UODS z- IRUP SpOGiXODGRNXPHQWXPJHUPHNREMHNWXPDQHYpYHOKLYDWNR]KDWy pVHOHPHLD]HJHVEHYLWHOLPH] NV]LQWpQKLHUDUFKLNXVDQDOiUHQGHOWJHUPHNREMHNWXPRNËJD document.formszovegmezo objektum tulajdonságai változtathatók, a value értéke változtatható Hasonlóképpen hivatkozhatunk egy névvel ellátott anchor tag-re is 13/89 LVNROD PHP programozási nyelv *iERUpQHV) SURJUDPRNDPHOHNDE|QJpV]HOWpUpVHNHWLJHNH]QHNILJHOHPEHYHQQLpVD]HOWpU E|QJpV]NEHQN|]HOD]RQRVDQP&N|GNyGRWWXGQDNHOiOOtWDQL1HPV]DEDGDUUyOVHP PHJIHOHGNH]QLKRJD]HJHVE|QJpV]NPiVNpQWpUWHOPH]LNDGRNXPHQWXPREMHNWXP PRGHOOWLVH]]HOIRNR]YDD]&U]DYDUW« A jegyzet célja nem a JavaScript ismertetése, így nem tárgyalhatjuk részletesen a gyakorlati alkalmazásait. Számos oktatóprogram, könyv áll rendelkezésre és
az egyes ZHEHVIRUUiVRNNLPHUtWKHWHWOHQWiUKi]DLD-DYD6FULSWHVDONDOPD]iVRNQDN0LQWHUVHQ REMHNWXPDODS~QHOYLVPHUHWHpUWpNHVVHJtWVpJHWDGDONDOPD]iVDLQNPDJDVV]LQW&PHg- YDOyVtWiViEDQGHPLQLPiOLVLVPHUHWHQpONOHJV]HU&IHOEXNNDQyDEODNQLWiVRNYDJ egy, az egérmozgatás hatására dinamikusan változó link sem hozható létre. Bár a legW|EE+70/IHMOHV]WHV]N|]EL]WRVtWHJV]HU&-DYDVFULSWDODS~V]NULSWHNHWDUXWLQIHOa- GDWRNPHJROGiViUDSURJUDPR]iVLWXGiVQpONOH]HNFVDNDIHMOHV]WHV]N|]iOWDONRUOiWo- zott körben alkalmazhatóak. Általában sok problémát okoz, hogy kevesen ismerik jól a JavaScript szintaktikát és a nyelvbe beépített objektumokat, függvényeket. Az alábbiakban megadok egy ZHEHVKLYDWNR]iVWDPLPLYHOD-DYD6FULSWNLIHMOHV]WLQHNZHEROGDOiUDPXWDWDXWHQWiNXVQDNWHNLQWKHWUHIHUHQFLiNDWWDUWDOPD] [http://devedge.netscapecom/central/javascript/]
$]DQJROQHOY&-DYD6FULSWUHIHUHQFLDJ&MWHPpQpVD-DYD6FULSWQHOYOHtUiVD Np]LN|QY OHW|OWKHWDN|YHWNH]PDJDURUV]iJLKRQODSUyOLV www.medzihu/javascript A szerver oldali programozás eszközei Adatforrások Dinamikus webes alkalmazások készítése nem oldható meg adatok tárolása nél- NO(UUHHOYLOHJNpWOHKHWVpJQNYDQD]DGDWRNWiUROKDWyNIiMORNEDQDNiUHJV]HU& szöveges fájlokban - ebben az esetben az adatok kikeresését le kell programoznunk és a felvitelüket is meg kell oldani - vagy tárolhatók adatbázisokban - ebben az esetben az DGDWRNNLQHUpVHpVU|J]tWpVHD]DGDWEi]LVPRWRUIHODGDWDpVPLYHOIHOWpWHOH]KHWHQUHOáFLyVDGDWEi]LVRNDWIRJXQNKDV]QiOQLH]64/SDUDQFVRNNDOHJV]HU&HQPHJROGKDWy 1DJRQVRNHVHWEHQH]DNHWWNHYHUHGLNLVPHUWYDQQDNRODQDGDWRNDPHOHNHWQHP pUGHPHVHJV]HU&EEDONDOPD]iVRNHVHWpEHQDGDWEi]LVEDUDNQLHOpJKDtUKDWyROYDVKDWy 14/89 LVNROD PHP programozási nyelv *iERUpQHV) fájlban
tároljuk. Ilyen lehet egy szimpla látogató számlálás vagy fájlokból olvashatók ki D]HJHVOHJ|UGOPHQNYiODV]WKDWyWpWHOHLLVPLQWSpOGiXORUV]iJQpYOLVWiNYDJKa- VRQOyHJV]HU&OLVWDDGDWRN7HUPpV]HWHVHQPLQGH]PHJROGKDWyDGDWEi]LVEyOLVGHVRN esetben az adatbázis hozzáférés korlátozott az egyes internetes szolgáltatóknál és ilyenNRUDOHKHWVpJHNV]DEMiNPHJD]DONDOPD]iVXQNEDQIHOKDV]QiOKDWyWHUOHWHNHW3HUV]H HJNRPRODEEDONDOPD]iVHVHWpEHQQHPNHUOKHWPHJD]DGDWEi]LVDONDOPD]iVDKacsak nem akarunk saját adatbá]LVNH]HOWtUQL« Az egyes rendelkezésünkre álló programnyelvek számos adatbázis rendszerrel ké- SHVHNHJWWP&N|GQLtJHUUOD]ROGDOUyOJDNRUODWLODJQLQFVNRUOiWR]iV$]DGDWEi]LV UHQGV]HUNLYiODV]WiViQiOD]RQEDQpUGHPHVQpKiQDODSYHWV]HPSRQWRWPHJYL]VJiOQL Általában relációs adatbázisokat használunk, de olyan alkalmazás esetében, ahol
FVDNLJHQHJV]HU&DGDWRNDWNHOONH]HOQLHJDVV]RFLDWtYNXOFVpUWpNSiURNRQDODSXOy DGDWEi]LVW|NpOHWHVHQHOHJHQGOHKHW(UUHDONDOPDVD3+3GEDB IJJYpQFVRPDJMD H]HNVHJtWVpJpYHONH]HOKHWV]iPRVIiMODODS~DGDWEi]LV0LHOWWD]RQEDQH]WDIJg- YpQFVRPDJRWKDV]QiOQLNtYiQMXNDMHOHQIHMOHV]WN|UQH]HWEHQDSKSLQLIiMOEDQ (C:/apache/php/php.ini) ki kell venni a megjegyzés (komment) „;” jelét a php dbadll NLWHUMHV]WpV H[WHQVLRQ SKSBGEDGOO HOOKRJDUHQGV]HULQGtWiVDNRUH]DPRGXOLV regisztrálva legyen. 0LOHQDGDWW|PHJHWNHOONH]HOQQN"*RUVDQYiOWR]ypVQDJPHQQLVpJ&V]|Yeges adat (például napilap és folyóirat cikkek) kezelése esetében ajánlatos olyan adatbá- ]LVNH]HOWYiODV]WDQLDPHOHJV]HU&HQpVJRUVDQNpSHVNH]HOQLKRVV]DEEV]|YHJHNHW EL]WRVtWMDD]RNNHUHVKHWVégét. 0HNNRUDDFpON|]|QVpJQNDNLND]DGDWRNDWKDV]QiOQLIRJMiN"$]D]LGHJVpJ
DODWWPHQQLOHNpUGH]pVWNHOONLV]ROJiOQXQN(QQHNPHJIHOHOHQNHOOMyOWHUKHOKHWDGDtbázis rendszert választani. Mennyire értékesek az adatok? Természetesen minden adat értékes, de van olyan HVHWDPLNRUQHPHQJHGKHWPHJKRJHJNRPELQiOWWUDQ]DNFLyWQHOHKHVVHQYLVV]a- görgetni annak hibája, megszakadása esetében - képzeljük el mi történne, ha egy banki tranzakció végrehajtása során a pénzösszeget az egyik számláról már leemeljük, de miHOWWDPiVLNRQMyYitUQiQNPHJV]DNDGDWUDQ]DNFLypVD]|VV]HJHOYpV]LOHQHVHWEHQ FpOV]HU&RODQDGDWEi]LVNH]HOWYiODV]WDQLDPHOEHQDWUDQ]DNFLyNH]HOpVEHpStWHWW funkció. 15/89 LVNROD PHP programozási nyelv *iERUpQHV) Milyen bonyolult lekérdezéseket kell végrehajtani? Nem mindegy, hogy relációs DGDWEi]LVNH]HOQNNpSHVHEHOVVHOHFW64/XWDVtWiVRNDWYpJUHKDMWDQLYDJWXGMDHNezelni az idegen kulcsokat. 0HOLNDGDWEi]LVNH]HOUHYDQV]pOHVN|U&WiPRJDWiVNO|QE|]RSHUiFLyVUHQdszerekben? A
webes alkalmazások esetében egy-egy adott esetben természetesen tudjuk, hogy milyen webszerverre fejlesztünk, de törekedni kell arra, hogy a kész kompo- QHQVHLQNHWOHKHWOHJW|EEV]|ULVIHOWXGMXNKDV]QiOQL$NpWOHJHOWHUMHGWHEEZHEV]HUYHU ma a Linux/Unix/FreeBSD rendszeren futó Apache (kb. 60% piaci részesedéssel) és a :LQGRZVV]HUYHUHQIXWy,,6UHQGV]HU NESLDFLUpV]HVHGpVVHO (]HNHUVHQ behatárolják az alkalmazható adatbázis rendszert is. )HQWLHNHWILJHOHPEHYpYHDNpWOHJLQNiEEDMiQOKDWyUHOiFLyVDGDWEi]LVNH]HOPD D064/DKDJRPiQRVNO|Q|VEL]WRQViJRWQHPLJpQOZHEHVDONDOPD]iVRNUDpVD 3RVWJUH64/DQDJEL]WRQViJRWLJpQODONDOPD]iVRNUD(]XWyEELREMHNWXPUHOiFLyV DGDWEi]LVNH]HOQHOYtJVSHFLiOLVPHJROGiVRNDWDWiEOiN|U|NOGpVpWLVOpWUHKRz- hatunk a segítségével. Ismertebb rendszer még webes fejlesztésekre az MSSQL, az ,QIRUPL[YDJD%DGDWEi]LVNH]HOLV(]HNUOUpV]OHWHVLQIRUPiFLyV]HUH]KHWD]
,QWHUQHWUOVWD]LURGDORPMHJ]pNEHQPHJDGMXND064/3RVWJUH64/UHQGV]HUHN összehasonlító elemzésének referenciáját is. CGI programozás 0pJDVSHFLiOLVDQZHEHVFpOUDNLIHMOHV]WHWWQHOYHNPHJMHOHQpVHHOWWIHOPHUOWD] LJpQDGDWIHOGROJR]iVUDpVD]DGDWRNDODSMiQNO|QE|]NLPHQHWHNNpV]tWpVpUH%iUPHO programnyelven megoldható az, hogy a program kimenete egy HTML fájl legyen, amit YLV]RQWDE|QJpV]SURJUDPRNNpSHVHNpUWHOPH]QLtJYpJVVRURQEiUPHOSURJUDm- QHOYVHJtWVpJpYHONpV]tWKHWZHEHVNLPHQHW(QQHNPHJYDOyVtWiViUDD]RQEDQEL]WRVtWa- QLNHOOKRJHJ&UODSUyOEHpUNH]DGDWRNHJVpJHVIRUPiEDQSDUDPpWHUNpQWHOMXVVa- nak a programhoz, és ez a program a kimenetet a webszerveren keresztül, HTTP kérésre MXWWDVVDHODE|QJpV]EH(KKH]KR]WiNOpWUHD&*,W &RPPRQDWHZD,QWHUIDFHNö- ]|VNDSXLQWHUIpV] DPHOH]HNHWD]LJpQHNHWNpSHVNLHOpJtWHQLpVDWHWV]OHJHVQHOYHQ megírt és lefordított programok (Pascal, C, C++, Java, Delphi, stb.) a
webszerver cgibin könyvtárából futtatva létrehozzák a kívánt HTML kimenetet Természetesen a program meg tud valósítani adatbázis kapcsolatot is és így megoldható az adatbázisba törtéQDGDWEHYLWHOYDJDQQDNOHNpUGH]pVHLV 16/89 LVNROD PHP programozási nyelv *iERUpQHV) $UHQGV]HUHOQHKRJWHWV]OHJHVQHOYDONDOPD]KDWyD]D]PLQGHQNLD]iOWDOD jól ismert programnyelven dolgozhat, az eredmény pedig nyelv-független lesz. Hátránya, hogy minden egyes módosítás a lefordított program újraírását, -fordítását igényli és minden esetben egy teljes weblap lesz a kimenet, nem oldható meg az így nyert információ beépítése egy már kész weboldalba. További hátránya az is, hogy a nem interpUHWiOWQHOYHNHQtUW&*,SURJUDPRNQHPKRUGR]KDWyDNNO|QE|]RSHUiFLyVUHQGV]e- UHNUHNO|QE|]SURJUDPRNDWNHOOtUQL SRQWRVDEEDQNO|QNO|QOHNHOOIRUGtWDQLD] egyes programokat). Talán nem véletlen, hogy ezt az eszközt ma már inkább a
számításigényesebb alkalmazások esetén használják és visszaszorul a szerver oldali nyelvek mellett. Ugyanakkor van bizonyos specifitása is Míg nagyon ritkán találunk CGI-ként IXWWDWRWW3+3SURJUDPRWD3HUOSURJUDPRNIOHJLWWW|UWpQIXWWDWiVUDNpV]OQHNpVHl- vétve találunk webszerver modulként futtatott Perl szkripteket. Ennek igazi racionális DODSMDQLQFVHJV]HU&HQtJDODNXOWNL« Perl $3HUO 3UDFWLFDO([WUDFWLRQDQG5HSRUW/DQJXDJH PDJDVV]LQW&V]NULSWQHOYHW /DUU:DOOKR]WDOpWUHEHQ0LQWQ OWIRUUiVNyG~QHOYD]yWDQDJPpUWpN&IHj- OHV]WpVHQPHQWNHUHV]WO7|EEVHOHOKHWIHOOHJQDJREEPpUWpNEHQD&QHOYUHWá- PDV]NRGLNGHVRNPiVQHOYEOLV|U|N|OWHOHPHNHWpVPDPiUW|EESODWIRUPUDNLIHj- lesztették. Mint szkriptnyelv, természetesen a Perl kód platform független (persze csak DNNRUKDQHPKDV]QiOXQNVSHFLiOLVSODWIRUPIJJHOHPHNHWDNyGEDQ pVDPHJIHOHO
LQWHUSUHWHUHJHVRSHUiFLyVUHQGV]HUHNEHQV]LQWHEHpStWHWWHOHPQHNWHNLQWKHW /HJQDJREEHUVVpJHDV]WULQJHNNH]HOpVpEHQYDQDEHpStWHWWUHJXOiULVNLIHMH]pV8 támogatás a szöveges adatok szinte egyedülállóan jó feldolgozó nyelvévé teszik. Ezt a reguláris kifejezés támogatást napjainkban már több más szkriptnyelv is átvette a nép- V]HU&VpJHPLDWW$3HUOOHJMHOHQWVHEEDONDOPD]iVLWHUOHWHD&*,V]NULSWHNtUiVD3Uimitív adattípusai rugalmasan egymásba alakíthatók, ami persze növeli a programozó IHOHOVVpJpWpVD3HUOEHQMHOHQWPHJHOV]|UDV]WULQJJHOLQGH[HOWW|PEDVV]RFLDWtY tömb - mint aggregált adattípus. A nyelv kezeli az objektumokat, de strukturáltan is 8 UHJXOiULVNLIHMH]pVRODQMHOpVNDUDNWHUNRPELQiFLyNDPHOHNVHJtWVpJpYHONLMHO|OKHW QDNPHJIHOHO NDGRWWPLQWá- NDUDNWHUVRUR]DWRN(QQHNOHJHJV]HU&EEPHJMHOHQpVLIRUPiMDD:LQGRZV26UHQGV]HUHN LEHQKDV]QiOKDWyKHOHWWHVtWNDUDNWHUHND NHUHV
DPLWHWV]pVV]HULQWLV]iP~NDUDNWHUWKHOHWWHVtWKHWpV a (?) ami egy karakter helyett állhat. 17/89 LVNROD PHP programozási nyelv *iERUpQHV) programozható. A Perl dinamikusan kezeli a memóriát (a Lisp örökség része) és a sze- PpWJ&jtést (a már nem referált változók által elfoglalt memóriaterület felszabadítását). 0LQWPLQGHQQ OWIRUUiVNyG~QHOYIROWRQRVDQIHMOGLNpVQHKp]DM|YMpWPHg- MyVROQLHUVHQIJJDQHOYDGRWWViJDLQW~ODGLYDWWyOpVHJpEIDNWRURNWyO$]EL]WRVDQ állítható, hogy a CGI programozásban még hosszú ideig nem veszít a fontosságából, YLV]RQWQHPOHV]EHOOHXQLYHU]iOLVZHEHVV]HUYHUROGDOLSURJUDPQHOY$QHOYV]DEadon és anyagi ellenszolgáltatás nélkül felhasználható bármely alkalmazásra, de termé- V]HWHVHQYDQQDNPHJYiViUROKDWyIHMOHV]WUHQGV]HUHLLVDPHOHNVRNH[WUDV]ROJiOWDWiVW EL]WRVtWDQDNDIHMOHV]WPXQNiKR] Python A Python programnyelvet 1990-ben kezdték kifejleszteni. A nyelv maga egy
interpretált, hordozható, objektum-alapú programnyelv, amelynek C-ben illetve C++-ban tUWQ OWIRUUiVNyGMDLJpQV]HULQWNLHJpV]tWKHWPyGRVtWKDWy1HKp]QHOYFVDOiGEDVoUROQLPHUWEiUPXWDW&V]HU&HOHPHNHWQDJRQVRNHVHWEHQDV]LQWDNWLNiEDQHJpQL XWDNDWMiUQDNDIHMOHV]WN(OVDMiWtWiVDYLV]RQODJN|QQ&pVLQWHUSUHWHUMpWPiUPLQGeJLNMHOHQWVHEERSHUiFLyVUHQGV]HUUHNLIHMOHV]WHWWHN&SURJUDPR]yLWXGiVVDOWHWV]pV szerint új függvények, osztályok adhatók hozzá [http://www.pythonorg/] $3HUOQHOYKH]KDVRQOyPyGRQHUVVpJHDV]WULQJNH]HOpVNH]HOQLNpSHVDUHJXOá- ULVNLIHMH]pVLOOHV]WpVHNHW%HpStWHWWPHPyULDNH]HOpVHHJV]HU&VtWLDSURJUDPR]yPXn- NiMiWpVHJV]HU&V]LQWDNWLNiMDOHKHWYpWHV]LDONDOPD]iViWSURWRWtSXVRNNLIHMOHV]WpVpEHQ illetve ideális kisebb programozói feladatok ad hoc megoldására. 1DJREESURJUDPRNLVPHJtUKDWyN3WKRQQHOYHQH]WVHJtWLHODQHOYNLYpWHl- kezelése és a számos már kifejlesztett kiterjesztési modul - ezek
egy része standard eszköz, mint például a matematikai könyvtár, mások alkalmazás-speciális feladatokat látnak el, mint például a képfeldolgozó vagy hangfeldolgozó modulok. Beépített módszerek vannak a nyelvben egy objektum bájtsorozattá alakítására illetve ennek fordított P&YHOHWpUHtJLPSOHPHQWiOKaWyNNO|QE|]HORV]WRWWREMHNWXPPRGHOOHNDQHOYEHQ Teljes mértékben szabad felhasználású nyelv, szabadon alkalmazható és terjeszt- KHWNHUHVNHGHOPLDONDOPD]iVRNEDQLVDV]HU]LMRJRVXOWViJIHOWQWHWpVH FRSULJKW mellett. 18/89 LVNROD PHP programozási nyelv *iERUpQHV) Java A Java egy általánosan alkalmazott platform független, objektum orientált nyelv, amely több szerepben is megállja a helyét a webes alkalmazásokban. Alkalmazzák mint &*,SURJUDPR]iVLQHOYGHMHOHQWVWpUWKyGtWRWWPDJiQDNPLQWEHpSOQHOYLV$] úgynevezett Java Server Pages (JSP) oldalakon a HTML kóddal keverve felhasználható dinamikus tartalmak
megjelenítésére [http://java.suncom/webservices/indexjsp] Eze- NHWHJpV]tWLNNLD-DYDDODS~V]HUYOHWDONDOPD]iVRNDPHOHNQHYNQHNPHJIHOHOHQD szerveren futó Java alkalmazások, az ezekben létrehozott osztályok, objektumok viszont HOpUKHWND-63NiOWDOLVËJHQQHNDNHWWQHN|VV]HNDSFVROiViYDONRPSOHWWDONDOPD]ások írhatók, kiegészítve a Java Enterprise Bean technológiával, amelyek többé-kevésbé önálló, egy-egy speciális feladatot - például adatbázis kapcsolat - ellátó programok. Bár UiQp]pVUHNyGV]LQWHQD-63D3+3YHO|VV]HYHWYHpSSHQRODQEHpSOIJJHWOHQO értelmezett nyelvet sejtet, a JSP oldalak feldolgozása speciális módon történik. A Java kóddal kombinált oldalak kezelésére egy külön webszervert is létrehoztak [Tomcat szerver verziók: http://jakarta.apacheorg/tomcat/] amely több platformon is WHOHStWKHWWHOMHVpUWpN&ZHEV]HUYHUNH]HOQLNpSHVD]HJV]HU&+773NpUpVHNHWGHD
EHpStWHWWPRGXOMDLYDO-63ROGDODNOHNpUpVHHVHWpQH]HNHWIHOGROJR]]DpVHOV]|UV]DEá- ORVMDYDIiMONLPHQHWHWNpV]tWEHOON(EEHQD]HUHGHWLFVXSiQD]DGDWRNNOVPHgjelenítésének leírására használt HTML kódokat már Java-specifikus kiíró utasítások RXWZULWH YHV]LNNp]EHPDMGDV]RNiVRV-DYDWHFKQLNiQDNPHJIHOHOHQOHV]EHOON .class fájl és végül ezt értelmezi a Java Virtuális Gép (JVM) Ennek segítségével kezelni WXGMDDV]HUYOHWNyGRNDWLVtJWHOMHVN|U&V]ROJiOWDWiVRNDWQ~MWD-DYDDONDOPD]iVRk- KR](]DZHEV]HUYHUW|EENRUV]HU&IHMOHV]WLUHQGV]HUEHpStWHWWHOHPHpVNRPROHUIe- V]tWpVHNHWWHV]QHNDIRODPDWRVIHMOHV]WpVpUH%iU|QiOOyDQLVWHOHStWKHW$SDFKH ZHEV]HUYHUKR]]iIpUKHWVpJHHVHWpQpUGHPHVHEEDQQDNPRGXOMDNpQWWHOHStWHQLPHUWD] HJV]HU&+773OHNpUpVHNHW VLPD+70/ROGDODNEHpSOWDUWDORPQpONO D]$SDFKH gyorsabban képes kiszolgálni.
$-DYDQHOYV]DEDGRQIHOKDV]QiOKDWyDPHJIHOHORSHUiFLyVUHQGV]HUHQDIRUGtWy iOWDOHOiOOtWRWWEiMWNyGRWpUWHOPH]LQWHUSUHWHUV]DEDGRQOHW|OWKHWpVDIHMOHV]WNpV]OHW -. LVV]DEDGRQIHOKDV]QiOKDWyDKRJXJDQLOHQKR]]iIpUpV&D7RPFDWZHEV]HUYHU is. Természetesen komolyabb alkalmazások fejlesztése esetén szükség lehet a munkát 19/89 LVNROD PHP programozási nyelv *iERUpQHV) OpQHJHVHQPHJJRUVtWyLQWHJUiOWIHMOHV]WLN|UQH]HWUHpVH]PiUMHOHQWVPpUWpN& anyagi befektetést jelent, amely az alkalmazás-fejlesztés felgyorsításával térülhet meg. ASP Az Active Server Page (ASP, aktív szerver oldal) olyan szerveren tárolt weblap, DPHODNyGMiEDQDV]RNiVRV+70/HOHPHNHQW~ODV]HUYHUHQIHOGROJR]iVUDNHUONóGRWLVWDUWDOPD](]HNNLWHUMHV]WpVHKWPYDJKWPOKHOHWWDVSpVHEEOWXGMDD ZHEV]HUYHUKRJD+773NpUpVUHQHPFVDNOHNHOONOGHQLHDPHJIHOHODVSROGDOW hanem azt fel is kell dolgozni. A feldolgozó modul a <% %> jelek közé
zárt kód helyett D]HOiOOtWRWW+70/NLPHQHWHWNOGLHODNOLHQVE|QJpV]SURJUDPQDNDPLWD]DV]RNáVRVPyGRQpUWHOPH]$0LFURVRIW&RUSRUDWLRQiOWDONLGROJR]RWWWHFKQROyJLDOHKHWYp WHV]LGLQDPLNXVWDUWDOPDNEHLOOHV]WpVpWD]HJV]HU&GiWXPpVIHOKDV]QiOyLLQIRUPiFLyWyO D]DGDWEi]LVEyOQHUWDGDWRNLJ7HUPpV]HWHVHQOHKHWVpJYDQDIHOKDV]QiOyWyONDSRWW DGDWRN &UODSDGDWRN V]HUYHUROGDOLIHOGROJR]iViUDLVD]$63WHFKQROyJLával. $]$63WHFKQROyJLDOHKHWYpWHV]LDNOLHQVROGDOLpVDV]HUYHUROGDOLNyGRNWHOMHV keverését, azaz mindegyiket az arra legalkalmasabb eszközzel készíthetjük el. NépszeU&VpJHMyUpV]WHQQHNN|V]|QKHWpVIXWWDWiVDQHPRNR]JRQGRW,,6DONDOPD]iVDHVHWpQ Nem platform független, bár az Apache webszervernek is létezik ASP interpreter modulja, így Linux rendszereken is jól futtatható. Természetesen az ASP eredeti környe- ]HWHD:LQGRZVN|UQH]HWpVNO|Q|VHQD1(7DONDOPD]iVRNKDV]QiOMiNHOV]HUHWHWWHO
VWJDNRUODWLODJNL]iUyODJD]$63WHFKQROyJLiWDONDOPD]]iN %iUPDJDDNyGKLV]HQQHPQHYH]KHWNO|Q|QPDJiEDQLVDONDOPD]KDWy nyelvnek, inkább csak egy hatékony technológia Basic programozási alapokon - minden NRUOiWR]iVQpONOHOiOOtWKDWyDPHQQLEHQ:LQGRZVRSHUiFLyVUHQGV]HUHQDNDUMXNIXt- tatni, az operációs rendszer szoftver licencét meg kell vásárolni, különösen, ha kereskeGHOPLFpOUDNtYiQMXNDONDOPD]QL(]SHUV]HHONHUOKHW$SDFKHZHEV]HUYHUDONDOPD]á- ViYDOËJDV]DEDGRQIHOKDV]QiOKDWyV]RIWYHUHNNHO|VV]HYHWYHHJV]HU&DQDJLRNRNEyO háttérbe szorul a kereskedelmi alkalmazásoknál. Maga a technológia ismerete azonban PLQGHQNpSSHQHOQ|VN|QQHQHOVDMiWtWKDWypVNRPSOH[DONDOPD]iVRNNpV]tWKHWNHO KDV]QiODWiYDO.HGYFVLQiOyQDNiOOMRQLWWNpWU|YLGiWIRJyRNWDWySURJUDPDPHONHOO betekintést biztosít a technológiába: [http://www.asptutorialinfo/; http://www.w3schoolscom/asp/defaultasp] 20/89 LVNROD PHP programozási nyelv
*iERUpQHV) A PHP nyelv $WDQWiUJJDNRUODWLUpV]pQHNIV]HUHSOMHD]yWDIHMOHV]WHWW3+3QHOYHn- nek segítségével készítjük el alkalmazásainkat, így ezt a szkriptnyelvet részletesebben LVPHUWHWMN$EHW&V]yHOV]|UD5DVPXV/HUGRUIiOWDONpV]tWHWW3HUVRQDO+RPH3DJH Tools-ra utalt, majd ennek teljes átdolgozása óta rekurzív módon a PHP Hypertext 3UHSURFHVV]RU 3+3KLSHUWH[WHOIHOGROJR]y V]DYDNNH]GEHW&LWUHMWLGHGLQDPLNXV IHMOGpVHVRUiQPiUPHVV]HHOWiYRORGRWWHWWODV]LPSODMHOHQWpVWO1 OWIRUUiVNyG~ objektum alapú szerver oldali szkriptnyelv, szabadon felhasználható bármely web alNDOPD]iVHVHWpEHQ/HKHWVpJHWEL]WRVtWD3+3SDUDQFVRNN|]YHWOHQEHiJD]iViUD (<?php utasítások ?> vagy a szintén használt rövid szintaxis <? utasítások ?>) a HTML kódba9, ezeket a szerver oldali szkript nyelveknél már megszokott módon a ZHEV]HUYHUEHEHpSOLQWHUSUHWHUPRGXOpUWHOPH]LpVD]HOiOOtWRWW+70/NLPHQHWHWD
OHNOGpVUHNHUOZHEODSEDLOOHV]WL7HUPpV]HWHVHQQHPFVDND+70/NyGPyGRVtWKDWy KDQHPSpOGiXODV]LQWpQDE|QJpV]iOWDOpUWHOPH]HWW-DYDVFULSWNyGLVtJPDJDDNOiens oldali Javascript program is dinamikusan változtatható. $3+3V]LQWD[LVRQHUVHQOiWKDWyD&QHOY|U|NVpJHGHPDJDDQHOYLV&EHQ LOOHWYH&EDQtUyGRWWÈWYHWWHD3HUOQDJHUVVpJpWDUHJXOiULVNLIHMH]pVHNKDV]QiOaWiWtJXJDQRODQV]LQW&V]|YHJPDQLSXOiFLyNKDMWKDWyNYpJUHDVHJtWVpJpYHO$Q OW IRUUiVNyGOHKHWVpJHWDG~MVSHFLiOLVPRGXORNPHWyGXVRNHONpV]tWpVpUHpVDV]pOHVIHj- OHV]WLEi]LVDODSR]]DPHJD3+3QHOYJRUVIHMOGpVpW3URJUDPR]yNQDNKDWiUR]RWWDQ pUGHPHVPHJOiWRJDWQLD>ZZZ]HQGFRP@ZHEKHOHWDKROPHJWHNLQWKHWD]|VV]HVIHjOHV]WpVDODWWOHYPHWyGXVLV&IRUUiVIiMOIRUPiMában. A PHP 3 verziót 1998-ban adták ki és gyors karriert futott be a webes alkalmazások terén. A sikerre való tekintettel átdolgozták az interpretert - Zend engine - és a PHP 4 már
az új interpreterrel került a felhasználók kezébe. Mivel a Zend engine nem egy HJV]HU&LQWHUSUHWHUKDQHPLQNiEED-DYD-,7LQWHUSUHWHUHOYHLWDONDOPD]]D tJSpOGiXO D]|VV]HVIJJYpQHOUHOHIRUGtWiVUDNHUOYDJD]HJHVNyGUpV]OHWHNJDNRUODWLODJ tárolásra kerülnek és nem szükséges ezeket - például egy ciklus magját - újra és újra 9 $3+3QHOYDONDOPD]yLQHPHJVpJHVHNHQQHNHO QKiWUiQPHJtWpOpVpEHQ%iUMyPDJDPD]HVHWHN V]HUHWHWWHOKDV]QiORPDNyGRNNHYHUpVpWpVDMHJ]HWKH]LVHQQHNDODSMiQNpV]OWHND W|EEVpJpEHQHO példák, sokan a sablonok alkalmazását tartják az egyedül elfogadható megoldásnak. Bízzuk ennek eldön- WpVpWD]HON|YHWNH] pYHNUH 21/89 LVNROD PHP programozási nyelv *iERUpQHV) pUWHOPH]QL H]]HOMHOHQWVHQPHJQ|YHOWpNDVHEHVVpJHW)JJHWOHQPpUpVHNV]HULQWD teljesítmény a teljesen újraírt interpreter hatására minimáliVDQ|WYHQV]HUHVpUHQWW A PHP 4 már gyakorlatilag az összes általánosan
használt kereskedelmi és szaba- GRQIHOKDV]QiOKDWyDGDWEi]LVWNpSHVN|]YHWOHQONH]HOQLDPHJIHOHOPRGXORNRQNe- resztül (Informix, Microsoft SQL Server, mSQL, MySQL, PostgreSQL, ODBC, Oracle pV6EDVHKRJt]HOtWWDGMXQNDOHKHWVpJHNEO .O|QE|]NOVPRGXORNVHJtWVpJéYHO3)GRNXPHQWXPRNDWWXGHOiOOtWDQLYDJpUWHOPH]QLWXGMDD];0/NyGRWGHUWI IiMOWLVHOiOOtWKDWXQNDVHJtWVpJpYHO $3+3HOVGOHJHVIHOKDV]QiOyLD/LQX[UHQGV]HUHNHQ$SDFKHV]HUYHUWIXWWDWyIHj- OHV]WNGHKDVRQOyMyHUHGPpQHNHWOHKHWHOpUQLEiUPHO8QL[YDJ:LQGRZVSODWIRrmon is (a gyakorlat során is egy Windows rendszeren futó változatot alkalmazunk a fejlesztéseinkben). A PHP támogatja a HTTP session-öket, Java kapcsolódásokat és számos protokollt. A PHP jelenleg mintegy 9 millió webszerveren fut [http://www.netcraftcom/survey/ felmérés] és folyamatosan nöYHNV]LNDQpSV]HU&VpJH $3+3QHOYDUHQGHONH]pVUHiOOyLQIRUPiFLyNV]HULQWDM|YEHQLVIHQQWDUWMDDGinamikus
növekedést. A jegyzet írása idején (2003 nov - 2004 márc) bocsátották ki a PHP 5 béta verzióját, amely ismét egy új interpretert kapott, a Zend Engine 2-t. Ennek VHJtWVpJpYHOMHOHQWVHQNLEYtWHWWpND3+3PiUNRUiEEDQLVOpWH]REMHNWXPRULHQWiOW OHKHWVpJHLWEHYH]HWWpND]RV]WiORNPLQVtWpVpW DEVWUDFWILQDOSURWHFWHG pVW|EE egyéb pattern (minta) mellett implementálták a Template Method design patternt (tervezési minta) a kód újrafelhasználás tökéletesítésére. Ennek egyenes következménye, hogy mire ez a jegyzet a hallgatóság kezébe kerül, neki lehet állni az új változat írásáQDNpVDSpOGiNLViWV]HUNHV]WKHWND3+3OHKHWVpJHLQHNDWHOMHVNLKDV]QiOiViUD 5|YLGHQ|VV]HIRJODOYDD3+3QHOYIHOQWWD]REMHNWXPRULHQWiOWQHOYHNYLOá- JiEDpVH]HJHQOUHFVDNQHKH]HQVHMWKHWWiYODWRNEDYH]HW(QQHNDWiYODWQDNDIHOPéréséhez segítséget nyújthat az a bejelentés, hogy a Zend Technologies Ltd., a Zend Engine létrehozója részt
vesz a Sun Microsystems Java Specification Request (JSR) kezdeményezés kifejlesztésében, amelynek célja Java-alapú rendszerek standard elérése V]NULSWQHOYHNEOHOVVRUEDQWHUPpV]HWHVHQ3+3EO(]HJUpV]WD3+3pUWpNpWQ|YHOL PiVUpV]WOHKHWYpWHV]L3+3ZHEHVDONDOPD]iVRN IURQWHQG pV-DYD]OHWLORJLNDLQWHgUiFLyMiW$]HONpS]HOpVWiPRJDWyLN|]|WWYDQQDNDN|YHWNH]QHYHVFpJHNLV$SSOH Borland, Macromedia, MySQL, Sun, Oracle és persze a Zend Technologies. 22/89 LVNROD PHP programozási nyelv *iERUpQHV) A PEAR $IHOQWWVpJHWEL]RQ WMDD]LVKRJHONpSHV]WPpUWpNEHQPHJQWWD]LQWHUQHWHQD PHP programok, megoldások száma. Gyakorlatilag szinte minden témára van csokornyi PHJROGiVpVD]tJyKDWDWODQXOOpWUHM|YNiRV]WIHOLVPHUYHPHJLQGXOWD]LQIRUPiFLy UHQGV]HUH]pVHLV(QQHNWDOiQOHJMHOHQWVHEEÄJP|OFVH´D3($5 Ä3+3([WHQVLRQ DQG$SSOLFDWLRQ5HSRVLWRU´3+3NLWHUMHV]WpVpVDONDOPD]iVJ&MWHPpQ DQ OWIRUUású PHP kódok rendezett
könyvtára. Ugyanakkor kicsit többet is jelent, mert rendszert teremtett a kódok terjesztésében és a kódcsomagok fenntartásában, egységes kódolási stílust követ, megalapozza a PHP Foundation Classes-t, azaz a PHP osztálykönyvtárát, DKRYDD3+3N|]|VVpJMyYiKDJiViYDONHUOKHWQHNEHPLQVpJLiOWDOiQRVDQDONDOPDzKDWypVNRPSDWLELOLVRV]WiORNDPHOHNNpV]tWLNLFVLWHOUHLVWHUYH]QHN ÄIRUZDUG FRPSDWLEOH´D]D]HOUHJRQGROQDNDIHMOHV]WpVLOHKHWVpJHNUH KRJHJiOWDOiQRVDQ használható rendszert hozzanak létre. Ennek és az itt tárolt osztályoknak a leírását is megtalálhatjuk már részben magyar nyelven a http://pear.phpnet/manual/hu/ webhelyen. Programozás PHP nyelven $3+3V]LQWD[LVDQHOYLHOHPHL±QpKiQJRUVDQHOVDMiWtWKDWyNLYpWHOWOHOWe- NLQWYHN|QQHQpUWKHWPLQGD]RNV]iPiUDDNLND&&SURJUDPQHOYEHQYDJD Javaban otthon vannak. Ezért ebben a jegyzetben nem akarom részletesen tárgyalni,
FVXSiQIHOVRURORPD]LVPHUWQHNIHOWpWHOH]KHWHOHPHNHWYLV]RQWU|YLGOHtUiVWDGRND]RQ HOHPHNUOpVDONDOPD]iVXNUyODPHOHND3+3QHOYVDMiWRVViJDLWWHVWHVtWLNPHJ(]HN N|]OLVHOVVRUEDQD]RNDWHPHOHPNLDPHOHNDWDQDQDJHOVDMiWtWiViWVHJtWSpOGiNEDQ HOIRUGXOQDN$WDQDQDJHOHNWURQLNXVMHOOHJPHJIHOHOHQXWDORNLWWD http://hu.phpnet/manual/hu/langrefphpZHEKHOUHH]DPDJDUQHOY&Np]LN|QY OHOKHOHDKROPLQGHQ3+3YDONDSFVRODWRVLVPHUHWPHJWDOiOKDWy(QQHNOHW|OWKHW változata megtalálható továbbá a tantárgyak weboldalán is a http://www.gdfhu/iai/Segedletek/Segedlethtm, címen, valamint a háttérként használt saját magam által üzemeltetett oldalon is www.medzihu/php A kódolás során igyekezzünk következetesek lenni változó elnevezéseinkben, je- O|OpVHLQNEHQVWtOXVXQNEDQ%VpJHVHQKDV]QiOMXQNPHJMHJ]pVHNHWKRJNpVEELV pUWKHWPDUDGMRQV]iPXQNUDD]HJV]HUNLWDOiOWNyG$VRNOHONHVSURJUDPR]yiOWDOIHj-
OHV]WHWWQHOYEHQPHJOHKHWVHQQDJDUHGXQGDQFLDJDNUDQWDOiOXQNN|]HOD]RQRV 23/89 LVNROD PHP programozási nyelv *iERUpQHV) funkciókat biztosító függvényeket, nyelvi elemeket. Érdemes kialakítani egy saját stílust pVNLYiODV]WDQLHJV]&NHEEHV]N|]WiUDWGHD]WDODSRVDQNLLVPHUQLPLQWPLQGLJ~MpV~M megoldásokat alkalmazni. PerV]HQHIpOMQNH]HNWOKDKDWiUR]RWWHOQQHOMiUQDN« Nyelvi jellegzetességek: Változók, típusok (kézikönyv::language.variableshtml; kézikönyv::languagetypeshtml) A PHP-ban a változókat nem kell külön deklarálni, a változó nevének leírásával OpWUHLVM|Q0LQGHQYiOWR]yWPHJHO]D$ jel, ez bizonyos értelemben könnyíti a kód ROYDViViWpVKDPDUPHJV]RNKDWy7tSXViWQHPN|WHOH]PHJDGQLDODSpUWHOPH]pVEHQ attól függ, hogy milyen érték kerül bele - ez a kódban mindenütt igaz, ha egy tömböt tartalmazó változóba integert rakunk, az attól kezdve integer típusú lesz. Hat típust
küO|QE|]WHWQNPHJH]HNDN|YHWNH]Ninteger (int), double, boolean (bool), string, array, object. A $tortszam = 214; kód például egy double típusú $tortszamQHY& YiOWR]yWKDWiUR]PHJ7tSXVNRQYHU]LyYDOKDHUUHOHKHWVpJYDQD]pUWpNNHUHWHLQEHOO tetszés szerint átalaNtWKDWMXNDYiOWR]yNDW$N|YHWNH]NyGSpOGiXOP&N|GLN $egyik = "szöveg"; $masik = (bool)$egyik; echo $masik; pVHJHJHVWtUNLPHUWKDQHPUHVV]WULQJUOYDQV]yDNNRUD]Wtrue értéknek tekinti, HQQHNPHJIHOHOMHD]pUWpN(QQHNPHJIRUGtWRWWMDDN|YHWNH]NyG $egyik = false; $masik = (int)$egyik; echo $masik; ami viszont nullát ír ki, a falsepUWpNQHNPHJIHOHOHQ A változók tartalmazta értékek átalakítására - pontosabban más típus szerinti értelmezésére - illetve a változók vizsgálatára több függvény áll rendelkezésre. A gya- NRUODWRNVRUiQLVHONHUOPDMGD]LQWYDO IJJYpQDPHOPHJSUyEiOMDDSDUDPpWHr- ként kapott változót vagy
karaktersorozatot egész számként értelmezni, így például az echo(intval("123asdf")) kód a "123" egész számot írja ki. Ha a változó karakterrel kezGGLNDNNRUDYLVV]DNDSRWWpUWpN$NO|QE|]LVBERROHDQ LVBDUUD LVBQXPHULF VWEIJJYpQHNNHOQHYNQHNPHJIHOHOHQYL]VJiOKDWyDYiOWR]yDNWXiOLV 24/89 LVNROD PHP programozási nyelv *iERUpQHV) WtSXVDpVDV]LQWpQLWWHPOtWKHWLVVHW LOOHWYHHPSW IJJYpQHNVHJtWVpJpYHOHOG|Qt- KHWKRJHJYiOWR]yNDSRWWHPiUpUWpNHW3pOGiXOHJZHEHV&UODSUiGLyJRPEFVoportja esetében, ha egyiket sem kattintják be, a hozzátartozó változóra az isset($radiogombcsoport) függvény hamis értéket fog adni. Egy sztring típusú változó esetében viszont az üres sztringet csak az empty() függvénnyel vizsgálhatjuk! Ezeket a IJJYpQHNHWQDJRQMyOOHKHWDONDOPD]QL&UODSRNpVV]|YHJHVIiMORNIHOGROJR]iViQiO így ismeretük ajánlott (legalább tudjunk annyit, hogy hol kell keresni).
A PHP specifikus dinamikus változókVRNQDJV]HU&OHKHWVpJHWHOHJiQVPHg- ROGiVRNDWEL]WRVtWDQDNDSURJUDPR]yQDNEiUDIRJDORPHOVDMiWtWiVDHOV]|UJRQGRNDW szokott okozni. Röviden arról van szó, hogy a változó nevét (pl $lakcim) egy másik változóban akarjuk tárolni, valahogy így: $cim = "lakcim". Ekkor a $$cím jelöléssel hivatkozhatunk a $ODNFLPYiOWR]yWDUWDOPiUD(QQHNMHOHQWVpJHDZHEHVDONDOPD]iVRknál nagy, ezért egy tipikus példán mutatjuk be a használatát. )HODGDWXQNHJVRNNpUGpVEOiOOyIHOPpUpVOpWUHKR]iVD+70/&UODSIRUPiMiEDQ ahol minden egyes kérdés mögött egy-egy változó áll. Az egyes változók nevei utalnak a kérdés sorszámára, de nem akarunk 50-100 változót külön-külön leírni a kódban. Arról nem is beszélve, hogy ezeket majd végül adatbázisba kell vinni Egy lehetséges PHJYDOyVtWiVNyGMDDN|YHWNH] <?php D]&UODSHONOGpVHXWiQPHJV]iPROMXNKiQPH]WQHPW|ltöttek ki $hibaszam = 100;
for ($i=1; $i<=100; $i++) { $kerdes = "kerdes".$i; if (!empty($$kerdes)) $hibaszam--; } if ($hibaszam < 10) echo($NLW|OWpVVLNHUHVD]&UODSHONOGKHW); EHYLWHOLPH]NNLUDNiVD for ($i=1; $i<=100; $i++) echo("<input type="text" name="kerdes".$i""> "); echo("<input type="submit" name="submit" value="Mehet!">"); ?> /iWKDWyKRJDV]i]YiOWR]yQHJV]HU&HQYpJLJWXGWXQNIXWQLfor ciklus segítségével, összeraktuk a nevét egy változóban ($kerdes), majd ezt a változót dinamikus változó- NpQWNH]HOYH NHUGHV PHJYL]VJiOWXNKRJD]DNWXiOLVpUWpNpQHNPHJIHOHOIHOPpUpVL kérdést azonosító változó üres-e. 25/89 LVNROD PHP programozási nyelv *iERUpQHV) $ZHEHVDONDOPD]iVRNHOUHGHILQLiOWYiOWR]yL (kézikönyv::reserved.variableshtml) Ezek a változók szolgáltatják számunkra az átadott értékek feldolgozásakor vagy
PiVHVHWHNEHQV]NVpJHVDGDWRNDW%YHEEHQOiVGDSKSLQIR PHWyGXVWiUJDOiViQiO $PHP SELF az éppen futó szkript fájlneve elérési úttal együtt, jól használható látogatási statisztikákhoz; $HTTP GET VARS az újabb nyelvi változatokban (4.10 felett) $ GET, a HTTP GET metódussal elküldött kulcs-érték párok asszociatív tömbjét tartalmazza, D]D]DIHQWLSpOGiEDQD]&UODSRQWDOiOKDWyNHUGHVQHY&YiOWR]ypUWpNpWDN|YHWNH]képpen kapjuk meg: $HTTP GET VARS["kerdes89"] illetve $ GET["kerdes89"]; $HTTP POST VARS az újabb nyelvi változatokban $ POST, a fentiekkel teljes mértékben analóg változó, csupán ez a POST metódussal elküldött kulcs-érték párok asszociatív tömbjét tartalmazza; $ REQUEST csak az újabb nyelvi változatokban megtalálható szuperglobal10 asszociatív tömb, amely tartalmazza a $ GET, $ POST, $ COOKIE változókat együtt; $GLOBALS az összes global tartományban deklarált változó asszociatív
tömbje, úgynevezett szuperglobal, azaz nem kell a metóduson belül külön hivatkozni a változó globális érvényességi tartományára. Konstansok (kézikönyv::language.constanshtml) Állandókat létrehozhatunk a define() metódus használatával, de nagyon sok eset- EHQHOQ|VHQDONDOPD]KDWyDND]HOUHGHILQLiOWNRQVWDQVRNDPHOHNVRNpUWpNHVLnIRUPiFLyWHOiUXOQDNDN|UQH]HWUOYDJpSSHQDNH]HOWIiMOUyO echo PHP VERSION." "; echo FILE ." "; 10 Minden programnyelvben fontos ismerni a változók érvényességi körét. A PHP esetében ha egy függ- YpQPHWyGXVEHOVHMpE OHODNDUXQNpUQLHJNtYOGHNODUiOWpVpUWpNHWNDSRWWYiOWR]yWDNNRUDJOREDO kulcsszóval kell rá hivatkozni. Ekkor a változó értéke mintegy bemásolódik a metódusba és kiolvasható A szuperglobal jelleg ezt automatikusan megteszi, nincs szükség külön global hivatkozásra. 26/89 LVNROD PHP programozási nyelv *iERUpQHV) echo LINE ." ";
H]DKiURPXWDVtWiVNLtUMDDKDV]QiOWpUWHOPH]YHU]LyV]iPiWDIXWWDWRWWIiMOQHYpWHOpUpVL úttal együtt és annak a sornak számát, ahol a harmadik utasítás ( LINE ) megtalálható - ez nagy segítség lehet például hibakeresés közben. A pont, mint konkatenációs RSHUiWRUVHJtWVpJpYHOKR]]iI&]|WWV]WULQJ D?QNDUDNWHUVRUR]DW WHUPpV]HWHVHQDVRremelést biztosítja. 9H]pUOV]HUNH]HWHN (kézikönyv::control-structures.html) Reguláris kifejezések (kézikönyv::ref.regexhtml) Függvények, metódusok (kézikönyv::funcref.html) A példákban gyakrabban használt függvények, metódusok, nyelvi szerkezetek Ezek pontos és hivatalosan elfogadott specifikációja - nagyon gyakran példákkal HJWWPHJWDOiOKDWyD3+3PDJDUQHOY&Np]LN|QYpEHQ$WDQXOiVpVDJDNRUODWL munka segítésére az alább felsorolt függvényekre a HTML forma változatlan megtartá- sával referenciát11 MHJ]HWKWP NpV]tWHWWHPDNp]LN|QYPHJIHOHOODSMDLQDNOLQNHOpVével.
Ezúton is köszönet illeti a kézikönyv magyar fordítóit és gondozóit include(), include once().OVIiMORNEHLOOHV]WpVpWYpJ]LDNyGED6HJtWVpJé- YHORV]WiORNDWNRPSRQHQVHNHWJDNUDQLVPpWOGNyGUpV]OHWHNHWLOOHV]WKHWQNEH Ilyen megoldásokat alkalmazunk az adatbázis kapcsolatokhoz szükséges állandó kódrészletek bevitelére. Az include once() alkalmazása esetében a rendszer figyel arra, hogy a kérdéses beillesztett kód csak egyszer szerepeljen a fájlban pl. ne legyen két osztályleírás. 11 A PHP kézikönyv sok fájlból álló csomagját (php kezikonyv.zip a Tantárgyi segédletek oldaláról, vagy bármely más forrásból) tegyük egy könyvtárba kibontva és ugyanott helyezzük el a jegyzet.htm fájlt Ezt EHQLQGLWYDUHQGHONH]pVUHiOODJRUVUHIHUHQFLDOLVWD E|QJpV] 27/89 LVNROD PHP programozási nyelv *iERUpQHV) echo(), print() – Kiíró utasítások, gyakran használjuk a generált HTML kód fájlba írására. VWUOHQ
VWUWRN VXEVWU H[SORGH WULP ±6]WULQJNH]HOPHWyGXVRNDVWUOHQ D sztring hosszát adja vissza, strtok(), explode() a sztring részekre bontását végzi, adott karakternél a sztringet szétvágja és darabjait egy tömb elemeiként adja vissza, a trim() PHWyGXVHOWiYROtWMDD]UHVNDUDNWHUHNHWDV]WULQJNpWYpJpUODVXEVWU NO|QE|]NppSHQSDUDPpWHUH]KHWpVVHJtWVpJpYHOWHWV]pVV]HULQWLGDUDEYiJKDWyNLDV]WULQJEO±H] MyODONDOPD]KDWyDGDWEi]LVEDQWiUROWV]WULQJHNIHOGROJR]iViUDSpOGiXOD064/LGEélyeg]MH12 (timestamp) esetében. tömbök és kezelésük (kézikönyv::language.typesarrayhtml; kézikönyv::functionarrayhtml) array(); array push(); array merge(); array rand(); Adatbázis kapcsolatot, kezelést biztosító függvények (kézikönyv::function.mysql-*.html; kézikönyv::functiondbm*.html) 12 $GDWEi]LVRNEDQV]LQWHPLQGHQWWPHJWDOiOKDWyD]LG EpOHJ] WLPHVWDPS IXQNFLy(QQHNVHJLWVpJpYHO
DJpSLGDODSMiQ8JDQDV]iPLWyJpSHNEHOVyUiLULWNiQSRQWRVDN DWUDQ]DNFLySRQWRVLGHMHU|J]LWKHW GHHJMyOEHiOOLWRWWV]HUYHUNRPPXQLNiODYLOiJKiOyQHOKHOH]HWWLG V]LQNURQL]iOyV]iPLWyJpSHNNHOLJD WPLQGLJPHJIHOHOSRQWRVViJJDONpSHVEL]WRVLWDQL,GEpOHJ]WV]LQWHPLQGHQWWKDV]QiOXQND JpSLG UHNRUGRNIHOYpWHOHVRUiQPpJDNNRULVKDH]QHPHO IHOEHFVOKHWHWOHQHO LUiVDNpUGpVHVDGDWEi]LVVSHFLILNiFLyMiEDQ±PHUW QQHOMiUDUHNRUGRNUHQGH]pVHNRUpVEiUPLOHQEL]WRQViJLSUREOpPDPHJROGiViEDQ 28/89 LVNROD PHP programozási nyelv *iERUpQHV) Osztályok, objektumok (kézikönyv::language.oophtml) A phpinfo() metódus Ha egy weboldalba beillesztjük ezt a metódus nevet a <?php és ?> jelölések közé és lefuttatjuk, csodát látunk. Ez ugyanis kiírja az összes PHP beállítást, konfigurációt, a környezeti változókat és adatokat, a PHP beépített változóinak aktuális értékét, a telepített programcsomagokat, azok
beállításait és még sok mást. Itt van például az én saját számítógépem PHP környezeti beállításainak egy részlete: Itt látható ugyanakkor az installált egyéb csomagok egy részlete is, történetesen %0DGDWEi]LVRNNH]HOpVpKH]pVDGLQDPLNXVNpSHNHOiOOtWiViKR]V]NVpJHVIJgvénykönyvtárak csomagjai: 29/89 LVNROD PHP programozási nyelv *iERUpQHV) Sablonok Különlegességek, speciális függvények $QHOYHWJDNUDQKDV]QiOMXNV]|YHJHNNH]HOpVpUHtJNO|Q|VHQHUVpVYiOWo- zatos a sztringkezelése rendelkezésre álló eszköztára. Ennek egyik példája az EOD szerkezet használata, amit egy SQL select utasítás összeállításával szemléltetünk: <?php $nev = "Kovács Bence"; $irszam = 1194; $select = <<<EOD insert into szemely (nev, lakcim, telszam) values ($nev, $irszam Budapest, Etele út 68, (06-1) 280-6207) EOD; echo $select; ?> A <<<EOD - soremelés - tetszés szerinti szöveg és változó
kombináció feloldó karakterek és konkatenálás nélkül - soremelés és EOD; lezárás egy sztringet határoz meg és ez a szokásos módon kiiratható egy echo utasítással. 30/89 LVNROD PHP programozási nyelv *iERUpQHV) (J$SDFKH3+3064/IHMOHV]WUHQGV]HU|VV]HiOOtWiVDWHOHStWpVH $KKR]KRJ3+3DONDOPD]iVRNDWPLQLPiOLVLGUiIRUGtWiVPHOOHWWWXGMXQNIHj- OHV]WHQLW|EEMyOHJWWP&N|GV]RIWYHUHV]N|]UHYDQV]NVpJQN.HOOKR]]iHJ +70/V]HUNHV]WSURJUDPUDKRJQHNp]]HONHOOMHQD]|VV]HV+70/NyGRWEHtUQL 7HUPpV]HWHVHQNHOOKR]]iDPHJIHOHOZHEV]HUYHUDPHOQHNEHpSOPRGXOMDD3+3 LQWHUSUHWHU0DJDD3+3NyGHJDUiQWV]HUNHV]WKHWDOHJHJV]HU&EEV]|YHJV]HUNHV]W- YHOpVSHUV]HD+70/V]HUNHV]WSURJUDPNyGV]HUNHV]WMpYHO DPRGHUQ+70/V]Hr- NHV]WNYDJN|]YHWOHQOYDJEHLOOHV]WKHWPRGXOIRUPiMiEDQEL]WRVtWMiNDV]LQWD[LV NLHPHOpVHV3+3NyGV]HUNHV]WpVW GHMREEDQiWWHNLQWKHWDNyGKDHUUHDFpOUDNLIHj-
OHV]WHWW3+3V]HUNHV]WSURJUDPRWKDV]QiOXQNKR]]i1HPXWROVyVRUEDQD]HJHVHONéV]OWUpV]SURJUDPRNPRGXORNNLSUyEiOiViWLVHJV]HU&HQHOYpJH]KHWMNHJIJJHWOHQ 3+3HGLWRUVHJtWVpJpYHO6]NVpJQNYDQWRYiEEiDGDWEi]LVNH]HOUHLVDPHOYDJ PDJDWDUWDOPD]]DDNH]HOIHOOHWHWDPHOVHJtWVpJpYHOHJV]HU&HQOpWUHKR]KDWMXND] adatbázis szerkezetét, bevihetjük az adatait, vagy szükséges még hozzá egy külön ke]HOIelület is. (]HNHWDIHMOHV]WUHQGV]HUNRPSRQHQVHNHWDODSYHWHQNpWIpOHPyGRQV]HUH]KHWMN EH0HJYiViUROKDWXQNNpV]IHMOHV]WUHQGV]HUHNHWDPHOHNEL]WRVtWMiND]|VV]HVNRPSoQHQVWpVDN|]|WWNOHYNDSFVRODWRNDWLOOHWYHNLKDV]QiOYDDZHEHVIHMOHV]WpVHNpVD PHP sok esetben alkalmazott GNU13 licencét, szinte minden egyes komponens esetében WDOiOKDWXQNV]DEDGRQWHOHStWKHWYiOWR]DWRWpVtJPLQLPiOLVN|OWVpJUiIRUGtWiVVDOGH
WHUPpV]HWHVHQHQQHNPHJIHOHOHQQDJREEPHQQLVpJ&PXQNiYDOpVD]HJHVNRQILJuUiFLyVIiMORNEHiOOtWiVDQpPLV]DNpUWHOPHWLVLJpQHO|VV]HiOOtWKDWMXNIHMOHV]WN|UQezetünket. $JDNRUODWEDQpVtJDMHOHQHVHWEHQLVDKHO]HWQNOpQHJHVHQHJV]HU&EE$ fejlesztési munkákat Windows rendszeren (Win98 - WinXP) végezzük, a webszervert (Apache), annak PHP modulját (PHP 4) és az adatbázis szervert (MySQL) a PHPTriad programcsomaggal együtt telepítjük. HTML szerkesztésre a Microsoft FrontPage al- NDOPD]KDWyH]DSURJUDPD0LFURVRIW&DPSXV/LFHQV]UpV]HNpQWKR]]iIpUKHWpVD 13 GNU General Public Licence, általános közösségi licensz, a Szabad Szoftver Alapítványhoz (Free 6RIWZDUH)RXQGDWLRQ WDUWR]ySURJUDPRNOLFHQV]HDPHOEL]WRVtWMDDV]HU] LMRJPHJWDUWiVDpVpUYpQHVí- WpVHPHOOHWWD]pUYpQHVpJHDOiWDUWR]yV]RIWYHUHNV]DEDGWHUMHV]WpVpWIHOKDV]QiOiViWPyGRVtWiViW(WW
fügJHWOHQOD]H]HQV]RIWYHUHNNHOYpJ]HWWPXQNipUWDWHUMHV]WpVpUWDQDJLHOOHQV]ROJiOWDWiVNpUKHW 31/89 O LVNROD PHP programozási nyelv *iERUpQHV) PHP kód szerkesztését illetve az egyes modulok kipróbálását a PHPEdit szintén szaba- GRQWHUMHV]WKHWV]HUNHV]WSURJUDPPDOYpJH]KHWMN+DNRPRODEEDGDWEi]LVRNDWDNarunk létrehozni és ezeket kezelni is szükséges, akkor a MySQL esetében érdemes megV]HUH]QLD064/)URQWV]LQWpQV]DEDGRQWHUMHV]WKHWDGDWEi]LVNH]HOSURJUDPRW LVDPHOVHJtWVpJpYHON|]YHWOHQOOpWUHKR]KDWMXNDWiEOiNDWpVDPH]NHW(]HNHWD SURJUDPRNDWPpJNLNHOOHJpV]tWHQLDPHJIHOHOGRNXPHQWiFLyYDOLVHKKH]V]NVpJHVD] ,QWHUQHWHQIHOOHOKHW3+30DQXDODPHO+70/IRUPiEDQWiUROMDD]|VV]HVSURJUDPozáshoz szükséges leírást, illetve az irodalomjegyzékben megtalálható ennek részben PDJDUUDIRUGtWRWWYiOWR]DWiQDNOHOKHOHLV$IHQWIHOVRUROWSURJUDPRNW|EEKHOUO
J&MWKHWN|VV]HDNpQHOHPNHGYppUWH]HNPLQGOHW|OWKHWNYLV]RQWD ZZZPHG]LKXSKSZHEKHOUOLVD]DQJROQHOY&Np]LN|QYYHOHJWWVWD webhelyen megtalálható a Javascript nyelv referencia anyaga is. A telepítés menete Windows rendszeren: Ahhoz, hogy eredményes legyen a telepítés, a Win2000 és a WinXP rendszereken rendelkeznünk kell adminisztrátori jogokkal. Ennek hiányában is sok minden megvalóVtWKDWyGHD]HUHGPpQEL]RQWDODQOHV](OV]|UD3+37ULDGFVRPDJRWWHOHStWMND WHOHStWNpV]OHWH[HIiMOHOLQGtWiViYDODMiQODWRVH]WD)XWWDWiVPHQSRQWEyOYpJH]QL$ IRODPDWDXWRPDWLNXVpVPLQGHQWEHiOOtWHJDODSpUWHOPH]pVQHNPHJIHOHOHQD]D]OpWUehoz egy apache könyvtárat a C: meghajtón és abban helyezi el az összes szükséges fájlt és könyvtárat, így például a htdocs könyvtárat is, amely a webszerverünk gyökérkönyvtára lesz. Ebben már van egy-két információs fájl, egy indexphp fájl és a phpadmin könyvtár is, amely egy php nyelven
írt MySQL adatbázis adminisztrációs program. A telepített Apache webszerver az alapértelmezett konfigurációs beállítások- QDNPHJIHOHOHQDORFDOKRVW,3FtPHQWDOiOKDWyPHJ $ZHEV]HUYHUWD]RQEDQ mint szolgáltatást el kell indítani (Futtatás menüpontból c:apacheApache.exe; a webszerver DOS ablakban fut, amely természetesen minimalizálható) és csak ez után LQGtWMXNDE|QJpV]WDPHOEHQDORNiWRUVRUEDDKWWSORFDOKRVWFtPHWtUMXNpVHUUHD HTTP kérésre a webszerver a c:apachehtdocs könyvtárban található index.php fájlt szolgáltatja ki. Amennyiben 404-es hibát (azaz a kért fájl nem található) kapunk, el- V]|UPLQGLJJ]GMQNPHJIXWHD]$SDFKHD:LQGRZVYLOiJiEDQLJHQN|QQ&Hlfeledkezni a manuális indításról. A modulként dolgozó PHP interpreter már lefuttatta a 3+3NyGRNDWpVDPHJIHOHO+70/NLPHQHWHWGROJR]]DIHODE|QJpV]W|NpOHWHVHQ 32/89 LVNROD PHP programozási nyelv *iERUpQHV) azonos rendszerben, mint
egy távoli szervernél. Ezért természetesen a közvetlenül a E|QJpV]EHQNLQLWRWWSKSIiMORNQHPpUWHOPH]KHWNDE|QJpV]|QPDJiEDQFVDN HTML és Javascript nyelveken ért. Ezzel lényegében kész a webszerverünk, de még számos probléma lehet. Gyakorlati tapasztalat, hogy amennyiben IIS szervert telepítünk az Apache szerver után, az operációs rendszer (WinXP) felülbírálja a localhost alapértelmezett könyvtárát és a saját rendszere szerint a C: meghajtón az Inetpubwwwroot könyvtár lesz a gyökérkönyvtár. $PHQQLEHQD3+37ULDGRW~MUDWHOHStWMNDNNRUYLVV]DiOODUHQGV]HUGHKDPLQGNHWWW használni kívánjuk, akkor az Apache konfigurációs fájlt kell beállítani. Ezt az c:apacheconf könyvtárban találjuk meg, httpd.conf14 néven és a Jegyzettömb, vagy PiVHJV]HU&V]|YHJV]HUNHV]WVHJtWVpJpYHONpWKHOHQiWNHOOtUQLD]DSDFKHKWGRFV bejegyzést Inetpub/wwwroot bejegyzésre (rákeresünk és átírjuk, az egyik a DocumentRoot, a másik a
Directory neve). Természetesen a konfigurációs fájl módosítását addig nem veszi figyelembe a rendszer, amíg le nem fut, azaz az Apache szolgálWDWiVWOHiOOtWMXN EHFVXNMXND26DEODNRWEHFVXNMXNDE|QJpV]W pV~MUDLQGtWMXND] Apache webszervert a már ismert módon. A telepítéssel nem csak a webszerver, hanem egy MySQL adatbázis - továbbá annak kiszolgáló program csomagja - is felkerült a rendszerünkre. Mivel dinamikus webes alkalmazások szinte elképzelhetetlenek adatbázis nélkül, ez nagy segítség a számunkra, FVDNPHJNHOOWDQXOQXQNDKDV]QiODWiWpVOHJHOV]|UDEeállítását. A MySQL a telepítés során szintén alapbeállításokat kap, azaz nem kell sokat EDMOyGQXQNYHOHEiUDUHQGV]HUPDJDDVRNIpOHIHODGDWQDNPHJIHOHOHQERQROXOW$] adatok az apachemysqldata könyvtárba kerülnek, ide a telepítéssel együtt már bekerül egy teszt adatbázis és egy mysql adatbázis, ez utóbbi a felhasználók nyilvántartását szolgálja és a rendszer
saját adatainak tárolását végzi. NE NYÚLJUNK HOZZÁ! Alapértelmezésben települ egy adminisztrátor felület is, ez a winmysqladmin, DPHOHWV]NVpJHVHWpQD]D]RQRVQHY&H[HIiMOVHJtWVpJpYHOLQGtWKDWXQND] 14 KWWSGFRQIKLSHUWH[WWUDQV]IHUSURWRNROOGpPRQNRQILJXUiFLyVIiMOD/LQX[8QL[UHQGV]HUHNHJV]HU & szöveges konfigurációs fájl szerkezete. Érdemes áttanulmányozni, mert sok minden állítható itt be, DPHOUHNpV EEHVHWOHJV]NVpJQNOHKHW$# jelzi a megjegyzéseket, az Apache induláskor nem veszi figyelembe az ezzel védett sorokat. 33/89 LVNROD PHP programozási nyelv *iERUpQHV) apachemysqlin könyvtárból. Amennyiben feltelepült, akkor minden Windows indíWiVQiOPHJMHOHQLND]PVFRQILJEDEHNHUOPVTOGRSWSURJUDPLQGtWMDpVDWiOFiQ N|]OHNHGpVLOiPSDLNRQNpQWOiWKDWy+DD]|OGYLOiJtWD]DGPLQIHOOHWP&N|GLNpVD] DGDWEi]LVRNUHQGHONH]pVUHiOOQDN$PHQQLEHQQHPP&N|GLNYDJQHPLVOiWKDWyD
IHQWHEEOHtUWSURJUDPPDOPDQXiOLVDQLQGtWKDWMXNLOOHWYHD]~V]yPHQMpEOLQGtWKDWyD] adatbázisszerver (jobb egér klikk az ikonra, Show me hozza be az ábrán is látható ke- ]HOIHOOHWHWLOOHWYHD:LQ[LOOHWYH:LQ17PHQSRQWRNEyOpUKHWHOD]LQGtWiVOHiOOtWiV PHQSRQW 8JDQDNNRUH]DNH]HOIHOOHWFVDND]DGDWEi]LVRNPHQHG]VHOpVpWNpSHV elvégezni és a kapcsolatokat tartja nyilván, az egyes adatbázisok ugyan itt is létrehozhatóak (Admin felület - Databases fül - jobb egér klikk a LOCALHOST gyökérelemen) GHWiEOiNPiUQHPKR]KDWyNOpWUHH]HQDPyGRQ64/V]DNpUWNQHNRWWDPVTOSa- UDQFVVRURVNH]HOIHOOHWHD064/0RQLWRU DSDFKH?PVTO?ELQ?PVTOH[H DPHOHQ keresztül minden megvalósítható az SQL ismeretében, kevésbé gyakorlottaknak pedig a KWWSORFDOKRVWSKS0$GPLQLQGH[SKSHOpUpVL~WRQWDOiOKDWyD]RQRVQHY&DGDWEi]LV NH]HOSURJUDPRWYDJDPpJEDUiWViJRVDEE064/)URQWSURJUDPRWDMiQORP OiVG NpVEE
3HUV]HD]DGDWEi]LVDWiEOiNDPH]NPLQGOpWUHKR]KDWyN3+3SURJUDPEyOLV erre majd a gyakorlati részben találunk példákat. MySQL Front telepítése Beszerzését lásd fentebb, telepítése is a fentebb leírtakkal azonos módon, az .exe fájl indításával, simán megy. Mindenképpen egy MySQL adatbázis szerver felrakása XWiQWHOHStWVN(OVLQGtWiVDNRUNpUHJORJLQWpVMHOV]yWD]DGDWEi]LVV]HUYHUKH]W|UWé- QNDSFVROyGiVKR]H]YLV]RQWPHJHJH]LNDZLQPVTODGPLQNH]HOIHOOHWHQOiWKDWy login/jelszó kombinációval, ami viszont - ha csak nem állítottuk át - megegyezik a gépünk operációs rendszerének loginjével és jelszavával. Ez után létre kell hozni magát az adatbázis kapcsolatot, megadva az adatbázis szervert futtató számítógép IP címét vagy domain nevét és a felhasználó nevet. Itt viszont alapértelmezésben a fenti rendszert logikusan követve a localhost lesz a domain név és root lesz a felhasználónevünk Ez után egy sokoldalú
felületen tudjuk kezelni az adatbázisainkat, mindenkinek javasolom a rendszer kiismerését és alapos kipróbálását, de részletes ismertetése egy újabb jegyzet anyaga lehetne. Ismerete viszont bármiféle adatbázis kezelési problémánkban segíthet, hiszen kattintásokkal és SQL parancsokkal egyaránt alakíthatjuk adatbázisunkat és meg is tanulhatjuk ezzel az eszközzel egy komolyabb adatbázis kezelését. 34/89 LVNROD PHP programozási nyelv *iERUpQHV) PHPEdit telepítése PHPEdit 0.6 verzió:(]DV]HUNHV]WSURJUDPW|EEPiVKDVRQOyWDOiOKDWyD] interneten szerteszét - kényelmessé teheti a munkát, mert a PHP szintaxis kiemelésével, DNyGDXWRPDWLNXVVWUXNWXUiOiViYDOpVKHOSIiMORNLQWHJUiFLyMiYDOHUWHOMHVHV]N|]UHWeszünk szert. A fentebb megadott helyen található install programot elindítva simán feltelepít- KHWpVPiUFVDNQHPKDV]QiODWUDLVNpV]$ODSpUWHOPH]HWWHQD3URJUDP)LOHVPDSSiED települ PHPEdit mappát hozva létre. A
telepítés során - francia nyelven - felkínálja a .php és az inc kiterjesztések regisztrálását a programhoz - fogadjuk el, ha nincs más távolabbi elképzelésünk - és máris írhatjuk PHP programjainkat. A programok az F9 JRUVELOOHQW&YHOYDJD]HV]N|]VRURQWDOiOKDWy5XQ]|OGQ OJRPEEDOIXWWDWKDWyNpVD kimenet - némi kommentár mellett - a View Debugger Windows Output ablakban látható. Vigyázni kell azonban, mert ez a kimenet egy hagyományos szöveges felület és ezért itt a soremelés például és nem <br> mint a webszerveren futtatott PHP kód HVHWpEHQ(]SHUV]HORJLNXVLWWQHP+70/NLPHQHWNpV]OKDQHPHJV]HU&V]|YHJHV A help rendszert viszont ki kell egészíteni. A Program Files PHPEdit mappában találunk egy help mappát, azon belül a chm mappába telepíthetjük a chm típusú PHP kézikönyvet és a PHP mappába a html típusú kézikönyvet helyezhetjük el. Ezeket
V]LQWpQPHJWDOiOKDWMXNDIHQWHEEPHJDGRWWZHEKHOHQpVD]HJV]HU&EHPiVROiVXWiQ már csak a PHPEdit.ini fájlt kell szerkesztenünk a webhelyen megadott minta ini fájl szerint. Ezzel részben helyzetérzékeny súgót kapunk, ami az egyes metódusok begépeOpVpQpOPiUIHONtQiOMDDOHKHWVpJHNHWLOOHWYHD]HJHVIJJYpQHNQHYpQiOOYDDKHOS HOKtYiVDNRUPHJMHOHQLNDKWPOIRUPiEDQKR]]iIpUKHWLQIRUPiFLyD]DGRWWQHOYLHOHmUO$UHQGV]HUYLV]RQODJHJV]HU&iPHUWHOMHVVHJtWVpJpYHOWHV]WHOKHWMNNtVpUOHWL kódjainkat webszerver nélkül is és minden további nélkül használhatjuk adatbázis kapcsolatokkal is - jómagam a webes programozástól függetlenül, számos szöveg feldolgo]iVLSUREOpPiWpVDGDWEi]LVIHOW|OWpVWROGRWWDPPHJH]HQHJV]HU&HV]N|]VHJtWVpJpYHO Nem hallgathatom el, hogy mint minden fejlesztés alatt álló eszköznek, ennek is vannak KLEiLLGQNpWIUDQFLDQHOY&KLED]HQHWHNNHOERPEi]GHKDDNyGROiVN|]EHQW|EE kevesebb
rendszerességgel mentettünk, ezeket nyugodt szívvel figyelmen kívül hagyhatjuk - legfeljebb újraindítjuk a programot, ha nagyon okvetetlenkedik. 35/89 LVNROD PHP programozási nyelv *iERUpQHV) PHPEdit 0.8 verzió: A jegyzet írása során került kezembe ennek a programnak HJPDJDVDEEV]LQW&YiOWR]DWDDPLWV]LQWpQEHUDNWDP3+3(GLWQpYHQDWDQWiUJSURgUDPFVRPDJMiED(]PiUDYiOWR]DWWHUPpV]HWHVHQW|EEHWWXGPLQWHOGMHDOHJIRnWRVDEEDKHOSUHQGV]HUPHJROGiVD$WHOHStWpVKH]YDJD]LQWHUQHWUONHOOOHW|OWHQLDNi- HJpV]tWNHWYDJDPLHVHWQNEHQPHOOpNHOWHPD]LSIiMOEDQD]RNDWDJLSNLWHUMHV]WpV& fájlokat, amelyek mindezeket tartalmazzák. Egy közös könyvtárba kell kibontani és onnét indítani a telepítést és a rendszer mindent felismer és helyre tesz. Jöhet a kódolás! Végre elkészült a rendszerünk, most már csak egy-két tanács az összehangoláshoz. Természetesen mindenki maga alakítja ki a munkamódszerét, én csupán
az általam alkalmazott és számomra bevált rendszert ismertetem. %iUPHONRPRODEE+70/V]HUNHV]WUHQGV]HUEHQYDQOHKHWVpJDV]HUNHV]WpV alatt álló webhely modellezésére. Így a Microsoft FrontPage esetében is beállítható, hogy webhelyen dolgozzunk, ez annyit jelent, hogy kijelölhetünk egy gyökérkönyvtárat a gépünkön, amelynek könyvtárszerkezete meg fog egyezni a tényleges webhely szerkezetével (fájl – létrehozás – lap vagy webhely – üres webhely – (beállítjuk a kívánt N|QYWiUDW 2. 6]iPXQNUDH]pUWHOHPV]HU&HQD]&?DSDFKH?KWGRFVPDJDYDJDnQDNYDODPHOLNEHOVPDSSiMDOHV](]XWiQDV]HUNHV]WSURJUDPIHOLVPHULpVUHJLV]t- UiOMDDODSRNN|]|WWLNDSFVRODWRNDWKDD]RNDWLWWKR]]XNOpWUH0iVV]HUNHV]WSURJUDPRN általában alapértelmezetten tudják, de a FrontPage esetében is beállítható, hogy a .php és .inc kiterjesztéseket is megnyissák, ne a Jegyzettömböt kínálja fel ezek szerkesztéséKH]
HV]N|]|N±EHiOOtWiVRN±V]HUNHV]WSURJUDPRNSDQHOLWWDGKDWyPHJKRJPHOLN NLWHUMHV]WpVKH]PHOLNV]HUNHV]WSURJUDPRWKDV]QiOMDDODSpUWHOPH]HWWHQ 8JDQH]WD J|NpUN|QYWiUDWKDV]QiOMXND3+3(GLWV]HUNHV]WSURJUDPPDOLVFVDND]WNHOOpV]EHQ tartani, hogy éppen mikor melyik programmal szerkesztjük a fájlt és mentsünk prog- UDPYiOWiVHOWW$OiWV]yODJERQROXOWEHiOOtWiVpUWHOPHKRJJRUVDQpVPLQLPiOLVKi- bával dolgozhatunk a PHP részeken, de ugyanakkor nem kell hosszadalmas HTML kóGRNDWNp]]HOEHtUQL7HNLQWVN~JKRJD+70/V]HUNHV]WQNEL]WRVtWMDDYL]XiOLV prograPR]iVHV]N|]HLWpVD3+3(GLWDNyGV]HUNHV]WQN Egy vegyes kódolású (PHP + HTML + Javascript) weboldal elkészítése A webes alkalmazások sok szempontból különlegesek, de a legfontosabb az adatok kezelése. Olyan szoftver alkalmazást kell készíteni, amely sok önálló kisebb prog- 36/89 LVNROD PHP programozási nyelv *iERUpQHV) ramból áll, sok belépési ponttal és ugyanannyi
kilépési ponttal (nem hagyhatunk például egy fájlt vagy adatbázist nyitva egy lap elhagyása esetén) és ezek még nem is ismerik egymás adatait, azok átadásáról külön gondoskodni kell. Az adatbevitel és feldolgozás külön egységen történik, a felhasználó megnyilvánulásaira csak egy másik gép tud rea- JiOQLLOOHWYHHOUHOHNHOOSURJUDPR]QLDYiUKDWyDGDWRNWyOIJJOHKHWVpJHNHWKDQHP DNDUMXND]|VV]HVYiODV]OpSpVWDV]HUYHUHQOHNH]HOQLDPLpV]OHOKHWLGEHOLNpVOHNHGéseket okoz. Nem használhatjuk a kliens gép memóriáját adatok tárolására, az összes DGDWIRUJDORPV]NVpJV]HU&HQDNOLHQVpVDV]HUYHUN|]|WW]DMOLN(]pUWD]HJLNOHJIRntosabb dolog az adatforgalom és a navigáció megtervezése, hogy minimalizálni tudjuk a szerver felé irányuló kérések számát. $IHOKDV]QiOyLIHOOHWHNHVHWpEHQPpJKDHJpV]HQHJV]HU&LVDIHODGDWPLQGLJ tervezzünk! Érdemes akár egy darab papírra felvázolni a webes felületeknél a már
is- PHUWHWHWWiOWDOiQRVHOYHNPLDWWROIRQWRVNOVPHJMHOHQpVW7HUYH]SURJUDPKLiQiEDQ NLKDV]QiOYDDZHEHVDONDOPD]iVRNHUVHQGRNXPHQWXPRVMHOOHJpWDNiUQpKiQ$HV ODSRQLVHONpV]tWKHWD]HJHVODSRNYi]ODWDpVMHO|lKHWD]RNORJLNDLNDSFVRODWD Gondoljuk végig, mit is kell csinálni az adott weblapon! Adatbevitel vagy adat- PHJMHOHQtWpVDG|QWIXQNFLyMD"+RYDNHUOQHND]DGDWRN"0iVLNZHEODSUDYDJDGDt- Ei]LVED"(]HNWOIJJKRJPHOLNODSRQPLOHQNyGRWNHOOHONpV]tWHQL+ROpVKRJDQ HOOHQUL]]NDEHYLWHOUHNHUODGDWRNDW"&pOV]HU&ERQROXOWDEEDGDWRNHVHWpQDNOLHQV ROGDORQLVHOYpJH]QLD]DGDWRNHOOHQU]pVpWGHVHPPLNpSSHQVHPPHOO]KHWMNDV]Hrver olGDOLHOOHQU]pVW 1HPV]pSGRORJLOHWIHOWpWHOH]QLM|YHQGOiWRJDWyLQNUyOGHJRQGROMXQNDURVVzindulatú felhasználókra! Az internet publikus, nem tudjuk meghatározni, milyen felté- telek mellett böngészhet a felhasználó - egy internet kávézóban bárki válla felett
más is ILJHOKHWLDNpSHUQQW|UWpQNHWpVD]RWWKDJRWWJpSHQWiUROWZHEODSRNVHPYpGKHWN +DYDQPLWYpGHQQNEHOVDGDWRNpU]pNHQDGDWRND]RNDWEL]WRQViJRVPyGRQHO NHOO]iUQLD]LOOHWpNWHOHQHNHOOQHPNHUOKHWQHNNLVHPPLNpSSHQVHP(]HNHWPLQGD navigáció során, mind a belépéseknél észben kell tartani, például GET metódussal nem adunk át érzéNHQDGDWRW D]85/KH]I&]LKR]]iD]DGDWRNDW A szkriptnyelvek esetében éppúgy érvényesek az általános programozási elvek, mind a hagyományos programozásnál. Igyekezzünk ismételten felhasználható kódot tUQLPHJpUL$ZHEHVDONDOPD]iVRNVWDQGDUGpStWHOHPHLWHOpJHJV]HUSUHFt]HQHONé37/89 LVNROD PHP programozási nyelv *iERUpQHV) V]tWHQLpVEiUPHODONDOPD]iVXQNEDEHLOOHV]WKHW)yUXPRNGiWXPpVLGNH]HOpVHN szavazógépek, látogató számlálás, jelszógenerálás és még sok egyéb újrafelhasználható komponens PHP kódja hozható létre mint osztály és ezt már csak
példányosítani kell (objektum létrehozása!) az újrafelhasználáshoz. A forráskód megjegyzésekkel való ellátása rendkívül fontos, hogy a HTML kóddal felhígított forrásban tájékozódni tudjunk Én például minden oldal elején leírom magamnak, mit akarok megvalósítani az adott IiMOEDQpVD]HJHVP&YHOHWHNHWNyGROiViWLVPHJMHJ]pVHNNHONtVpUHP«$]WYLV]RQW VRKDVHPIHOHMWVNHOKRJV]NULSWQHOYUOOpYpQV]yDIRUUiVRWWYDQDZHEV]HUYHUHQpV D3+3pUWHOPH]HJHVHWOHJHVKLEiMDPLDWW QHPpUWHOPH]LDNyGRWWHOMHVHJpV]pEHQ D] egész esetleg kikerülhet a felületre - határozottan kínos, ha ilyenkor a felhasználó megtudja, hogyan vélekedtünk róla kódolás közben - egyszóval csínján bánjunk a jópofa megjegyzésekkel Ha már mindent végiggondoltunk, megterveztünk, jöhet a kódolás. Ha grafika is YDQD]ROGDORQDNNRUD]WNHOOHOV]|UHONpV]tWHQLKRJD]HJHVNLtUiVRNHOKHOH]KHWN legyenek az elképzelés szerint. Ennek hiányában vagy ennek
kiegészítéseként készítjük HOD+70/Yi]DWSpOGiXOD]&UODSRNHOHPHLWIHOUDNMXNHOUHQGH]]N SpOGiXOWiEOi]Dtban) majd beállítjuk. Ekkor már tudnunk kell a szükséges adathordozó változókat, hiV]HQD]&UODSPH]NQHYHLOHV]QHNDYiOWR]yNQHYHLLV &pOV]HU&HONpV]tWHQLD]|VV]HVV]NVpJHVZHEODSRWPpJD3+3iOWDOJHQHUiOWDN vázát is és érdemes létrehozni a navigációs kapcsolatokat. Felbukkanó ablakoknál meg- tUKDWyNDV]NVpJHV-DYDVFULSWNyGRNpVDNiULGHLJOHQHVOLQNHNVHJtWVpJpYHOWHV]WHOKHWD P&N|GpV6RNV]RULOHQNRUGHUONLKRJYDODPLW~OQHKp]NHVUHVLNHUOWGHLOHQNRU minimális pluszmunkával még átalakítható a rendszer. (]WDV]HUNHV]WpVWNHOOUXWLQQDOJRUVDQPHJYDOyVtWKDWMXND+70/V]HUNHV]W programok segítségével, könnyen "összekattinthatók" az oldalak. Megjegyzem, hogy ez nem pótolja a HTML tudást, mert a PHP kóddal sokszor kell HTML elemeket kiíratni,
GHDYL]XiOLVV]HUNHV]WSURJUDPVHJtWVpJpYHOJRUVDEEDQPHJWDQXOKDWyNDV]NVpJHV kódok is. Arról semmiképpen ne feledkezzünk el, hogy a nyers HTML kód sokszor ütN|]LND3+3NyGRNNDOtJDNp]LV]HUNHV]WpVPHJLQWFVDNQHPPHOO]KHW$PDJDP UpV]pUOH]pUWNHGYHOHPMREEDQDNHYHVHEEDXWRPDWL]PXVWKDV]QiOyUpJHEELZHEHVV]HrNHV]WSURJUDPYiOWR]DWRNDW SpOGiXOUHDPYHDZHUGHH]QHPLQJHQHVPHJNHOO vásárolni /). 38/89 LVNROD PHP programozási nyelv *iERUpQHV) 1HIHOHGNH]]QNPHJDJDNRULWHV]WHOpVUO$GDWEi]LVEyOQHUWDGDWRNV]pSHQ PRGHOOH]KHWNGHILQLiOWYiOWR]yNNDOtJDGDWEi]LVLJpQEHYpWHOHQpONONLSUyEiOKDWyND NyGRN)iMOtUiVRNpVROYDViVRNV]WULQJIHOGROJR]iVRNV]LQWpQMyOPRGHOOH]KHWNSpOGiXO D3+3(GLWVHJtWVpJpYHOÒMRV]WiORNPRGXORNHVHWpEHQLVpUGHPHVHJV]HU&VtWHWWWHV]t- UHQGV]HUHNHWOpWUHKR]QL%iUIHQWHEEDJUDILNDHOVGOHJHVVpJpUOtUWDPWHUPpV]HWHVHQ nem érdemes egy bonyolult logikai rendszert a grafikai realizálás HTML kódjai
között tesztelgetni. Természetesen még sok elméleti ismeretet lehetne felsorolni, de térjünk át a sokkal szórakoztatóbb gyakorlati megvalósításokra. Mostantól kezdve kedves olvasóm elmélettel csak az esetleges magyarázatoknál fog találkozni és programozási feladatokon iWPXWDWRPEHDZHEHVIHMOHV]WpVHNJDNUDEEDQHOIRUGXOyHOHPHLW1HPIRJODONR]RPD NOVPHJMHOHQpVVHOV]tQHNNHOKRJDVRNIRUPi]yNyGQHIHGMHOHDOpQHJHW$MREE iWWHNLQWKHWVpJPLDWWtJIOHJWiEOi]DWRkban rendezzük el az egyes elemeket Gyakorlati feladatok Jelszavas belépés specifikáció %L]WRVtWVXQNHJV]HU&ORJLQMHOV]DYDVEHOpSpVWYpGHWW]yQiEDpVDMHOV]yPHJYil- WR]WDWiViWLVWHJNOHKHWYp$GDWEi]LVPRVWQHPiOOUHQGHONH]pVUHWHKiWDOHKHWOHg- HJV]HU&EEPHJROGiVWNHOOYiODV]WDQXQNIiMOEDQWiUROMXND]DGDWDLQNDW a feladat elméleti háttere $IHODGDWNpWNO|QUpV]EOiOOH]HNHJPiVKR]FVDNOD]iQNDSFVROyGQDN&pOV]e-
U&DZHEKHOQLWyODSMiQYDJEiUPHOPiVIHOOHWHQOLQNNpQWHOKHOH]QLDMHOV]yYil- WR]WDWiVLOHKHWVpJHWDPHOUHNDWWLQWYDIHOEXNNDQyDEODNEDQYpJH]KHWLHODIHOKDV]QiOyD MHOV]yFVHUpWWHUPpV]HWHVHQN|WHOH]D]~MMHOV]yNpWV]HULEHtUiVD8WiQDYLVV]DQDYLJálunk a beléptetést biztosító felületre, hogy rögtön kipróbálható legyen az új jelszavas belépés. Mind a jelszócsere, mind a belépés HTML form &UODS VHJtWVpJpYHOW|UWpQLN D]DGDWRNDWDV]HUYHUHQHOOHQUL]]NpVD]RNKHOHVVpJHHVHWpQHOIRJDGMXND]DGDWRW MHlszócsere esetében megkívánhatunk bizonyos bonyolultságot is, például reguláris kife- 39/89 LVNROD PHP programozási nyelv *iERUpQHV) jezés15 illesztéssel) illetve átirányítjuk a felhasználót a védett zónába. A jelszavas belépés a védelem mellett elegáns módon alkalmazható a felhasználó azonosítására, például QHOYKDV]QiODWHJpQLSURILOV]HPSRQWMiEyOYDJEL]RQRVV]LQW&KR]]iIpUpVHNEL]Wosítására.
tervezés .pW&UODSRWIRJXQNOpWUHKR]QLD]HJLNHWPDJiQD]ROGDOIHOOHWpQDPiVLNDWFpl- V]HU&HQNO|QIiMOEDQDPLFVDNH]WWDUWDOPD]]DpVHQQHNPpUHWHDIHOEXNNDQiVWEL]WRVtWy -DYD6FULSWEOV]DEiOR]KDWyHUUHJHOMQND]&UODSREMHNWXPRNHOKHOH]pVHNRU$ bevitel természetesen POST metódussal történik, hogy ne legyen látható az URL-ben. $]HJV]HU&VpJNHGYppUWDSHU]LV]WHQFLiW16EL]WRVtWyIiMOEyODMREEDQNH]HOKHWDVV]RFiDWtYW|PEEHpVRQQpWDIiMOEDYLVV]DtUiVWYpJ]IJJYpQHNHWNO|QLQFIiMOEDQKe- lyezzük el (tombok.inc), hiszen ezeket két helyen is használni kívánjuk %iUDVSHFLILNiFLyEDQNO|QQHPWpUWQNNLHUUHEL]RQRVHOOHQU]pVHNHWLVYpg- ]QNPDMGpVKLEDHVHWpQDPHJIHOHOKHOHQ]HQHWEHQpUWHVtWMNDIHOKDV]QiOyWKRJ hol és mit hibázott. megvalósítás (kód) tombok.inc fájl kódja: <?php //fuggveny, amely beolvas egy fajlt asszociativ tombbe es visszaadja a tombot function tomb feltolt($filenev){ if(!$fp =
fopen($filenev, "r")) //ha nem nyithato meg, hamis erteket ad vissza return false; while(!feof($fp)) { $sor=fgets($fp, 256); list($kulcs, $ertek) = split(" ", $sor); $asszoc tomb[$kulcs] = $ertek; } fclose($fp); return $asszoc tomb; } /* 15 V]DEiORNKHOHWWHVtWNDUDNWHUHNDONDOPD]iViYDOHOiOOtWKDWyPLQWDDPHOHWIJJYpQ 0HJIHOHO segítségével illesztünk a kérdéses karaktersorozatra. Reguláris expresszióval például meghatározhatjuk, PLD]HOIRJDGKDWyWHOHIRQV]iPYDJHPDLOFtPIRUPiWXPHJEHYLWHOLPH] 16 EHQ 3URJUDPR]iVV]RIWYHUWHUYH]pVVRUiQSHU]LV]WHQFLDDODWWD]DGDWRNHOYLWiUROiVLOHKHW VpJpWpUWMNiOWDOá- nosViJEDQHQQHNPHJYDOyVtWiVDOHKHWHJDGRWWIRUPiWXPXIiMOYDJWHWV]OHJHVDGDWEi]LV 40/89 LVNROD PHP programozási nyelv *iERUpQHV) * fuggveny, amely kiir egy asszociativ tombot fajlba, * ha sikerul, igaz erteket ad vissza */ function tomb kiir($tomb, $filenev) { if(!$fp = fopen($filenev, "w")) return
false; while (list($kulcs, $ertek) = each($tomb)) { $ertek = trim($ertek); $sor = $kulcs." "$ertek" "; fputs($fp, $sor); } fclose($fp); return true; } ?> index.php fájl kódja: <?php //ez tartalmazza a fajl kiolvasashoz szukseges fuggvenyt include ("tombok.inc"); //ha kitoltottek a login es jelszo mezoket if ($login != "" && $pwd != "") { //feltoltunk egy asszociativ tombot a tarolo fajlbol $tomb = tomb feltolt("jelszo.txt"); /* * megnezzuk, van-e ilyen login - jelszo par a tombben * a trim az esetleges sorveg es egyeb nem lathato * karakterek eltavolitasara szolgal */ if (trim($tomb[$login]) == trim($pwd)) { echo ("<script>location.replace(belsophp);</script>"); exit(); } } ?> <html> <head> <title>Jelszavas belépés</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-88592"> <style type="text/css">
<!-td { font-family: Arial, Helvetica, sans-serif; font-size: 10pt } .table { font-weight: bold; color: #330000; background-color: #FFFFCC; border: 1px #CC9933 solid } --> </style> </head> 41/89 LVNROD PHP programozási nyelv *iERUpQHV) <body bgcolor="#FFFFFF"> <table width="100%" border="0" cellspacing="0" cellpadding="6" align="center"> <tr> <td colspan="2"> <p><b>Nyitóoldal</b></p> </td> </tr> <tr> <td width="358" > </td> <td align="right" width="225"> <form name="belepes" method="post" action="" > <table width="220" cellspacing="0" cellpadding="3" class="table"> <tr> <td> <div align="center"> <p>Jelszavas belépés</p> <p >login:
<input type="text" name="login" size="15" maxlength="15"> </p> <p >jelszó: <input type="password" name="pwd" size="15" maxlength="15"> </p> <p > <input type="submit" name="Submit" value=" Belépés "> </p> </div> </td> </tr> </table> </form> <p> </p> <p align="center"><b><a href="javascript:void()" onClick="window.open(jelszomodphp,JELSZOMOD,width=400,height=400 )">jelszócsere</a></b></p> </td> </tr> </table> </body> </html> jelszomod.php fájl kódja: <?php //ez tartalmazza a fajl kiolvasashoz, irasahoz szukseges fuggvenyeket include ("tombok.inc"); $hiba = ""; $loginhiba = ""; $siker = ""; //ha a login, regi jelszo kitoltve if ($login !=
"" && $regipwd != "") { //feltoltunk egy asszociativ tombot a tarolo fajlbol $tomb = tomb feltolt("jelszo.txt"); if (trim($tomb[$login]) == trim($regipwd)) { if ($ujpwd1 == $ujpwd2 && $ujpwd1 != "") { 42/89 LVNROD PHP programozási nyelv *iERUpQHV) $tomb[$login] = $ujpwd1; tomb kiir($tomb, "jelszo.txt"); $siker = "<br>A jelszó módosítás megtörtént!"; } else $hiba = "<br>Nem egyezik a két jelszó!"; } else $loginhiba = "<br>Nem jó a belépési jelszó/login!"; } ?> <html> <head> <title>Jelszómódosítás</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-88592"> <style type="text/css"> <!-td { font-family: Arial, Helvetica, sans-serif; font-size: 10pt } .table { font-weight: bold; color: #330000; background-color: #FFFFCC; border: 1px #CC9933 solid } -->
</style> </head> <body bgcolor="#FFFFFF"> <p align="center"><b>Jelszómódosító felbukkanó oldal</b></p> <p> </p> <form name="modositas" method="post" action=""> <div align="center"></div> <table width="220" cellspacing="0" cellpadding="3" class="table" align="center"> <tr> <td colspan="2" > <p align="center">Jelszó módosítás</p> </td> </tr> <tr> <td width="53%" >login</td> <td width="47%" > <input type="text" name="login" size="15" maxlength="15" value=<? echo $login; ?>> </td> </tr> <tr> <td width="53%" >régi jelszó: </td> <td width="47%" > <input type="password"
name="regipwd" size="10" maxlength="15" value=<? echo $regipwd; ?>> <? if ($loginhiba != "") echo ("<font color=#FF0000 size=2>".$loginhiba"</font>");?> </td> </tr <tr> 43/89 LVNROD PHP programozási nyelv *iERUpQHV) <td width="53%" >új jelszó: </td> <td width="47%" > <input type="password" name="ujpwd1" size="10" maxlength="15"> </td> </tr> <tr> <td width="53%" >új jelszó ismét: </td> <td width="47%" > <input type="password" name="ujpwd2" size="10" maxlength="10"> <? if ($hiba != "") echo ("<font color=#FF0000 size=2>".$hiba"</font>");?> </td> </tr> <tr> <td colspan="2"> <div
align="center"> <input type="submit" name="Submit" value=" Módosítás "> </div> <? if ($siker != "") //siker eseten kiirjuk es/vagy becsukjuk az ablakot { echo ("<font color=#FF0000 size=-2>".$siker"</font>"); echo ("<script>window.close(self);</script>"); } ?> </td> </tr> </table> <div align="center"></div> </form> </body> </html> WRYiEEIHMOHV]WpVLOHKHWVpJHN $EHYLWHOLLQIRUPiFLyNHOVV]&UpVpW DGDWRNPHJOpWpWIRUPiMiWGHVHPPLNpSSHQ VHPNOGQNOHMHOV]yWDNOLHQVQHNHOOHQU]pVUH PHJYDOyVtWKDWMXN-DYD6FULSWVHJtWVégével a kliens oldalon, ezzel gyorsítható a használat, de nem pótolja - manipulálhatósáJDPLDWWDV]HUYHUROGDOLHOOHQU]pVW6]NVpJHVHWpQDMHOV]yWORJLQWNyGROKDWMXNLV SpOGiXO0NyGROiV pVUHJXOiULVNLIHMH]pVVHJtWVpJpYHOYDJPiVPyGRQHOOHQULz-
KHWKRJD]HOtUiVRNQDN ERQROXOtságnak) megfelel-e a bevitt/megváltoztatott jelszó. $JDNUDQKDV]QiOW3+3IJJYpQHNNLJ&MWpVHpVOLQNHOWOLVWDNpV]tWpVH specifikáció 7DQXOiVXQNWiPRJDWiViUDJ&MWVNNLPDJXQNQDNDJDNUDEEDQKDV]QiOW3+3 függvényeket egy külön könyvtárba. A könyvtár tartalmát jelenítsük meg egy HTML ODSRQOLQNHNNHOHOOiWYDKRJDPHJWHNLQWHQLNtYiQWIJJYpQOHtUiViWJRUVDQHOV]Hd- KHVVN$OLVWDDN|QQHEENHUHVKHWVpJpUGHNpEHQOHJHQ$%&UHQGEHQpVNpWKDViEED 44/89 LVNROD PHP programozási nyelv *iERUpQHV) V]HGYH7HUPpV]HWHVHQDN|QYWiUDWWHWV]pVV]HULQWEYtWMNPyGRVtWMXNHQQHNPHJIeOHOHQD+70/ROGDOpVDOLQNHNLVIULVVOMHQHN a feladat elméleti háttere A feladat megoldásához tudnunk kell egy könyvtárat listázni - ez nem sokban NO|QE|]LNDIiMOROYDViVWyOKLV]HQDN|QYWiUHJRODQVSHFLiOLVIiMOQDNWHNLQWKHW amely más fájlokra mutató bejegyzéseket tartalmaz. Mivel a könyvtár csak
virtuálisan V]HGKHW$%&UHQGEHKDpSSHQ~JNtYiQMXNPHJWHNLQWHQLH]pUWHJW|PEEHJ&MWMN HOV]|UDIiMQHYHNHWDQQDNUHQGH]pVpUHXJDQLVYDQQDNHV]N|]HLQN SpOGiXODsort() függvény). Meg kell oldani azt is, hogy amikor táblázat sorokat írunk ki, mindig két IJJYpQQHYHWNHOOHJPiVPHOOHWWPHJMHOHQtWHQLGHD]RNQHPHJPiVWN|YHWHOHPHN a rendezett tömbben. Végül az egyes függvénynevek linkek lesznek, ahol viszont a linkszöveg ne a függvényt tartalmazó fájl neve legyen (például functionarray-randhtml a függvénynév, de mi array-rand nevet akarunk megjeleníteni a link szövegében). tervezés Egy lista.php fájlt és egy konyvtarQHY&PDSSiWKR]XQNOpWUHpVDPDSSiEDEe- másoljuk a számunkra fontos fájlokat. Relatív elérési utat alkalmazunk, a listaphp és a mappa ugyanazon könyvtárban legyen a webszerver gyökérkönyvtárán belül valahol. A 3+3NyGGDOYpJLJROYDVVXNDPDSSiWNLV]&UMNDV]iPXQNUDIHOHVOHJHVIiMORNDWpVD többit
array push()IJJYpQVHJtWVpJpYHOW|PEEHW|OWMNDPLWPiUHJV]HU&HQWXGXQN rendezni. Ezt egy függvény valósítja meg, paraméterül kapva a mappa nevét és visszatérési értéke a feltöltött rendezett tömb lesz A rendezett tömböt a HTML kódban for ciklus segítségével táblázat soraiban jelenítjük meg, a kéthasábos megjelenítés miatt ILJHOQLNHOODSiURVSiUDWODQIiMOV]iPUDpVHQQHNPHJIHOHOHQNHOOHJSOXV]VRUWLVEeiktatni. A linkszöveghez a kiolvasott fájlnevet szét kell darabolni, míg a link megvalósításához a mappa nevét hozzá kell illeszteni a fájlnévhez megvalósítás (kód) lista.php fálj kódja <?php $dirnev = "fuggvenyek"; //ez a fuggveny egy ABC szerint rendezett tombben adja vissza a mappa tartalmat function dir lista($dirnev) { $lista = array(); 45/89 LVNROD PHP programozási nyelv *iERUpQHV) if(!$dp = opendir($dirnev)) //ha nem talalhato, hamis a visszateresi ertek return false; while($fajl =
readdir($dp)) if($fajl != "." && $fajl != "") //kiszurjuk a "" es "" nevu fajlokat array push($lista, $fajl); sort($lista); //rendezes a tombben closedir($dp); return $lista; } ?> <html> <head> <title>Kedvenc PHP függvényeim</title> </head> <body> <?php $lista = dir lista($dirnev); //megadjuk a dir nevet $fileszam = count($lista); if ($fileszam != 0) //ha nem ures a konyvtar { echo ("<table width ="70%" align="center">"); echo ("<tr><td colspan="2">Kedvenc PHP függvényeim</td></tr>"); for ($i=0; $i<$fileszam/2; $i++) //feltoltjuk a tablat { list($func, $nev, $kit) = explode(".", $lista[$i]); echo ("<tr><td><a href="".$dirnev"/"$lista[$i]"">"$nev"</a></td>"); list($func, $nev, $kit) = explode(".",
$lista[$i+$fileszam/2]); echo ("<td><a href="".$dirnev"/"$lista[$i+$fileszam/2]"">"$nev"</a></td></tr> "); } if ($fileszam % 2 != 0) //ha paratlan a fileszam, egy plusz sor kell { list($func, $nev, $kit) = explode(".", $lista[$i]); echo ("<tr><td><a href="".$dirnev"/"$lista[$i]"">"$nev"</a></td><td> </td></ tr>"); } echo ("</table>"); } ?> </body> </html> WRYiEEIHMOHV]WpVLOHKHWVpJHN Ha egészen precíz megvalósítást akarunk, akkor ki kell cserélni a "-" karaktereket a függvénynevekben " " karakterekre is (ereg replace()), illetve meg kell oldani az egyéb kategóriák kezelését is, esetleg külön táblázatokat alkalmazva. 46/89 LVNROD PHP programozási nyelv *iERUpQHV) iWXPpVLGPHJMHOHQtWpVH specifikáció
$]DGDWEi]LVWyOiWYHWWGiWXPLGDGDW LGEpOHJ] DODSMiQNpV]tWVNHODN|YHt- NH]GiWXPpVLGSRQWNLtUDWiVWHJZHEODSRQ $]gQXWROVyOiWRJDWiViQDNLGSRQWMDH]HQD]ROGDORQIHEUXiU feladat *DNUDQNHUOHOD]DSUREOpPDKRJDNiUHJDGDWEi]LVEyOYHWWDGDWHVHWpEHQ akár a honlap futtatása, az egyes lapok lekérése esetén meg kell jelenítenünk a dátumot pVD]LGW$]DGDWEi]LVNH]HONW|EEIpOHGiWXPpVLGIRUPiWXPPDOGROJR]KDWQDNpV SHUV]HDQHPNHOOJRQGRVViJJDOPHJWHUYH]HWWDGDWEHYLWHOHNHVHWpQLVOpWUHM|KHWQHNIXrFVDIRUPiWXPRNGH|VV]HVVpJpEHQDMiQODWRVUDJDV]NRGQLD]DGDWEi]LVNH]HOEHpStWHWW IRUPiWXPiKR]pVDUUDpStWHQLIHODPHJMHOHQtWUXWLQRNDWH]]HOOHKHWVpJHWDGXQND WiUROWGiWXPLGDGDWNpVEELWHWV]pVV]HULQWLIHOGROJR]iViUD1HPXWROVyVRUEDQtJ EL]WRVtWKDWMXNKRJD]HJV]HUOpWUHKR]RWWGiWXPLGPHJMHOHQtWPRGXOXQNNyGMD W|EEV]|ULVIHOKDV]QiOKDWyOHV]$YpJVFpOHJIHMOHV]WUpV]pUOPLQGLJDNyGW|EEV]ö-
ULIHOKDV]QiOiViUDW|UHNYpVtJNLIHMOHV]WHQGGiWXPLGPRGXOXQNDWFpOV]HU&RV]WiOyként létrehozni és ennek példányosításával megoldani a megjelenítési igényeket. A gyakran használt Linux/Unix webszerverek dátumformátumát és az általánosan alkal- PD]RWWLGEpOHJ]NIRUPiWXPiWILJHOHPEHYpYHNpV]tWMNHONyGXQNDW tervezés $]DGDWEi]LVWyOiWYHWWGiWXPLGDGDWRWPRVWHJ$datum változóba beolvasott sztringgel modellezzük és ez kerül feldolgozásra. A kiíratás az oldal tetején történik, grafikai vagy táblázatos struktúra nélkül. A hónapok magyar neveit tömbben tároljuk és onnét az indexük alapján vesszük ki. megvalósítás (kód) <?php $honapok = array("", "január", "február", "március", "április", "május", "június", "július", "augusztus", "szeptember", "október", "november", "december"); $datum =
"2002-02-24 15:10:32+01"; V]pWV]HGMNGiWXPUDLGUH list($datum resz, $ido resz) = explode(" ", $datum); HOGREMXND]LG]yQDUpV]WDMHOWODUpV]V]WULQJHWNLYiJMXN 47/89 LVNROD PHP programozási nyelv *iERUpQHV) $ido resz = strtok($ido resz, "+"); // az idõ elemeit kivesszük változókba list($ora, $perc, $mperc) = explode(":", $ido resz); //szétszedjük év, hó, nap értékekre, másként $datum resz = explode("-", $datum resz); // a hónap számot int értékké alakítjuk a tömb indexhez $ho = intval($datum resz[1]); //kiírjuk az elõállított adatokat echo ($]gQXWROVyOiWRJDWiViQDNLGSRQWMDDKRQODSRQ); echo ($datum resz[0]." "$honapok[$ho]" "$datum resz[2]", ".$ora":"$perc); WRYiEEIHMOHV]WpVLOHKHWVpJHN $064/DGDWEi]LVNH]HOWLPHVWDPS LGEpOHJ] WtSXVDQHPDIHQWLKDQHP 14 karakteren folytonosan írja ki az évszámot, hónapot, napot, órát,
másodpercet, azaz HJWHWV]OHJHVLGEpOHJ]tJQp]NLËUMXQNHJIJJYpQW amely ezt a formátumot átalakítja a $datum változó formátumába. 5HJLV]WUiFLyDGDWIHOYLWHODGDWIHOYLWHOHOOHQU]pV specifikáció 9HJQNIHONO|QE|]V]HPpOLpVIHOPpUpVLDGDWRNDWpVD]RNUHDOLWiViWPHJOpWpW HOOHQUL]]NOHPLHOWWD]DGDWEi]LVEDEHYLWWNYROQD$]HOOHQU]pVDOiYRQWEHYLWHOL PH]NOHJHQHNHJV]eU&HQIHOYHKHWNPyGRVtWKDWyN a feladat elméleti háttere $]DGDWEHYLWHO&UODSVHJtWVpJpYHOW|UWpQLNpVPiUHQQHNPHJV]HUNHV]WpVHNRUFpl- V]HU&DEHYLWHOUHNHUODGDWRNNRUOiWR]iVDD]D]DKROFVDNOHKHWDGDWYiODV]WiVWNtQil- MXQNIHO1HPV]DEDGHOIHOHMWHQLKRJD+70/IRUP &UODS REMHNWXPRNNpV]OHWHV]egényes más programnyelvek komponenseivel összehasonlítva, és bár JavaScript segít- VpJpYHOJDNRUODWLODJEiUPLPHJYDOyVtWKDWyDQQDNpUWHOPH]pVHHUVHQE|QJpV]IJJ
pVQHPYiUKDWyHJVpJHVtWpVHDN|]HOLM|YEHQ/7|UHNHGQLNHOOWHKiWD]HJV]HU&pV |WOHWHVPHJROGiVRNUD DSULPLWtYPRVWNLIHMH]HWWHQHOQ|V pVPLQGLJNLNHOOHJpV]tWHQL DEHYLWHOWV]HUYHUROGDOLDGDWHOOHQU]pVVHO&pOV]HU&DPLWOHKHWOHJ|UGOOLVWiEyOIHONíQiOQLDOLVWiNIHOW|OWpVHN|QQHQPHJYDOyVtWKDWyHJV]HU&V]|YHJIiMORNEyOpVYDJ DGDWEi]LVRNEyO LWWHOVVRUEDQQHPDNRPRODGDWEi]LVNH]HONUHJRQGRORNKDQHPD fájlból dolgozó adatbázisokra). 48/89 LVNROD PHP programozási nyelv *iERUpQHV) Tipikus beviteli feladat személyes adatoknál a dátumok felvitele, ez jól és bizton- ViJRVDQPHJROGKDWySpOGiXOKiURPOHJ|UGOOLVWiYDOD]pYHNKyQDSRNpVQDSRNIHOYitelére. Igény szerint a gyakran használt dátum (például az aznapi dátum) könnyen be is állítható alapértelmezettként egy bizonylat kitöltése esetén, ahol általában, de nem feltétlenül az aznapi dátumot kell megadni. Országnevek a hivatalos megnevezés szerint,
NDWHJyULiNPLQGOHJ|UGOOLVWiEyOV]HGKHWN +DHJEHYLWHOLPH]K|]W|EEHJHGLDGDWWDUWR]LNSpOGiXOW|EEIpOHpUGHNOGpV H]HNHJV]HU&HQPHJROGKDWyNKDDOHJ|UGOOLVWiWW|EEV]|U|VNLYiODV]WiV~YiWHVV]NpV DP|J|WWHHOKHOH]NHGYiOWR]yW|PEOHV](KKH]FVXSiQDselectPH]QDPHDWWULEútumában a változó név mögé szögletes zárójelet kell írni: <select name="ertekek[]" size="3" multiple> <option value="érték1">címke1</option> <option value="érték2">címke2</option> <option value="érték3">címke3</option> </select> /HJ|UGOOLVWDNyGMDW|EEV]|U|VNLYiODV]WiVEL]WRVtWiVDHVHWpQ 0HJMHJ]HPKRJV]LQWHEiUPHOLNHUUHHJpENpQWDONDOPDVEHYLWHOLPH]HVe- WpQDONDOPD]KDWyH]DWHFKQLNDgVV]HOHKHWtJNDSFVROQLMHO|OGRER]RNDW FKHFNER[ V]|YHJHVEHYLWHOLPH]NHW WH[W DPLNRUW|EEHOHPQHYH D]pUWpNHWWDUWDOPD]yYiOWR]y azonos és a változó tömb
jellegét a név mögé írt szögletes zárójel mutatja. Ezt a lehetVpJHWD+70/V]HUNHV]WNQHPWiPRJDWMiND]D]QHNQNNHOOILJHOQLDUUDKRJLOHQ beállításokat tegyünk. Tömbök adatbázisba vitele azonban nem megy közvetlenül, vagy mi írjuk meg a tömböt sztringgé alakító rutint, vagy a PHP serialize() függvényét KDV]QiOMXNHQQHNNLPHQHWHHJD]DGDWEi]LVEDHJV]HU&HQEHYLKHWVSHFLiOLVV]WULQJpV a tárolt információ alapján az unserialize() segítségével az eredeti tömb helyreállítható EHOOH 7DOiQDOHJIRQWRVDEEIHODGDWD]DGDWHOOHQU]pVNRUUHNWPHJROGiVD$ODSHOYKRJ maximális szabadságot biztosítsunk a felhasználónak, de a fontos adatok esetén ez a szabadság elkerülhetetlenül csorbul. Ugyanakkor a leggondosabb tervezés sem zárja ki D]WKRJDWUpIiVNHGY&YDJFVDNHJV]HU&HQURVV]LQGXODW~IHOKDV]QiOyYDOyGLQDN OiWV]yGHpUWHOPHWOHQDGDWRNDWNOGM|QEH(EEON|YHWNH]LNDV]DEDGRQKR]]iIpUKHW
ZHEHVIHOOHWHQiWNOG|WWDGDWRNNRUOiWR]RWWPHJEt]KDWyViJDDPLQ|YHOKHWEL]RQRV trükkökkel, de teljesen nem valósítható meg. Célunk a felhasználó érdekeltté tétele a precíz adatszolgáltatásban. 49/89 LVNROD PHP programozási nyelv *iERUpQHV) (OOHQUL]KHWYLV]RQWPLQGHQWRYiEELQpONOD]DGDWRNPHJDGiVD*DNRUODWLWa- SDV]WDODWKRJHJKRVV]DEE&UODSHVHWpEHQJDNUDQPDUDGNLHJHJOpQHJHVDGDt- PH]pVHUUHIHOWpWOHQOILJHOPH]WHVVNDIHOKDV]QiOyW6RNV]RUD]LVHJV]HU&HQHOOe- QUL]KHWKRJHJHJDGDWHOIRJDGKDWyHYDJWpYHVEHJpSHOpVHUHGPpQH-HO|OMN PHJYDODPLPyGRQDN|WHOH]DGDWRNDWpVD]RNDWHOOHQUL]]NOHDW|EELHVHWpEHQD] UHVPH]YLV]RQWHOIRJDGKDWy(]HNHOOHQU]pVpQHNDOHJHJV]HU&EEPyGMDDIHOGROJozás logikai döntés mögé rejtése, ha a feltétel nem teljesül, visszakapja a felhasználó az &UODSRWDGDWKHOHVEtWpVUH1pKiQDGDWHVHWpEHQH]W|NpOHWHVHQP&N|GLNGHKDPiU vizsgálandó adat van,
senki sem akar ennyi logikai részfeltételt megadni a feldolgozásKR]YH]HWV]HOHNFLyViJEDQ (JV]HU&PHJROGiVD]~JQHYH]HWWN|WHOH]PH]NQHYHLQHN YiOWR]yQHYHN W|PEEHJ&MWpVHpVWiUROiVD)HOYHV]QNPpJHJKLEiNDWWDUWDOPD]yDVV]RFLDWtYW|PE|W LVDPHOD]pV]OHOWKLEiNV]|YHJHVOHtUiViWIRJMDWDUWDOPD]QL(JFLNOXVFpOV]HU&HQHJ for ciklus, vagy foreachV]HUNH]HWYpJLJPHJDN|WHOH]PH]NW|PE|QpVD3+3 GLQDPLNXVYiOWR]yNH]HOpVpWIHOKDV]QiOYDHOOHQU]LKRJDIHOVRUROWPH]NpUWpNHPHgfelel-e a kívántaknak, ha nem, az asszociatív hiba tömbbe "belenyom" (array push()) egy aktuális hibaüzenetet, ahol az asszociatív tömb elemének kulcsa lesz a beviteli me- ]QHYHPLQWD]RQRVtWypVDKLED]HQHWDPH]K|]WDUWR]ypUWpN(]]HOOHKHWHOHJiQVDQ PHJROGDQLKRJD]HJHVEHYLWHOLPH]NK|]WDUWR]yDQMHOHQtWVNPHJDKLED]HQHWHWpV ne egy olyan, a JavaScript alert metódusával közvetített általános üzenet jelenjen meg,
KRJ.pUMND]|VV]HVPH]NLW|OWpVpW0RVWPiUFVDNDKLEDW|PE|WNHOOHOOHQUL]QL KDQLQFVEHQQHpUWpNPHKHWDIHOGROJR]iVKDYDQDNNRUDPHJIHOHOKHOUHHJNLtUiVW készítünk a hibáról. $]&UODSRNHONOGpVpWiOWDOiEDQ3267PHWyGXVVDOYpJH]]NKDDGDWEi]LVEDEe- YLWHOUOYDQV]yDNNRUDOHJHJV]HU&EEHVHWEHQDform önmagát hívja meg (action me- ]UHVYDJDIiMOVDMiWQHYH D]D]~MUDOHIXWD]HJpV]&UODSRWWDUWDOPD]ySKSIiMO Számolnunk kell azzal tehát, hogy egy-egy hiba esetén a felhasználó nem akarja újra kitölteni az összes adatot, így ne feledkezzünk meg arról, hogy a már elfogadottakat tUMXNYLVV]DDPHJIHOHO&UODSPH]NEHecho() vagy print() utasítások segítségével. tervezés $]HOVIHODGDWD]&UODSHUJRQyPLNXVPHJWHUYH]pVH/HJHQORJLNXVHJV]HU&HQ iWOiWKDWypVHJpUWHOP&NHUOMNDIHOHVOHJHVPDJDUi]DWRNDW$]HJV]HU&VpJNHGYppUW 50/89 LVNROD PHP programozási nyelv *iERUpQHV)
H]WiOWDOiEDQ+70/V]HUNHV]WEHQWHUYH]]NPHJRWWOHKHWVpJYDQDIRUPDSRQWRV EHiOOtWiViUD(VHWQNEHQQHYHWV]OHWpVLpYHWD]LOOHWQHPpWNpUGH]]NPHJUiNpUGe- ]QNMHO|OGRER]RNVHJtWVpJpYHOV]DNpUWHOPpUHpVJ|UGtWKHWOLVWDVHJtWVpJpYHOV]RIt- verismeretére. Ezeket mind egy táblázat soraiban, celláiban helyezzük el, hogy egyszeU&HQiWWHNLQWKHWNH]HOKHWOHJHQ$]LVPpWOGIHOYLWHOLPH]NNLUDNiViWLV3+3NyG segítségével végezzük. Az adatfelvitel adatbázisba történik, így a kapcsolódás utasításait - hiszen ezt adott rendszerben sokszor használjuk - külön fájlban helyezzük el, amit egy include() utasítás visz be a kódba (connect local.php) megvalósítás (kód) connect local.php fájl kódja <?php //konfigurációs rész // host neve $host = "localhost"; // adatbazis felhasznaloi neve - a Windows felhasznalo neve $username = "24-t"; // adatbazis felhasznaloi jelszava - a Windows belepesi jelszo $userpass =
""; //adatbazis neve - mindig az aktualis adatbazis neve kerul ide $database = "adatok"; //kapcsolati rész //kapcsolat letrehozasa a mysql adatbazis kezelovel, illetve hibauzenet $conn = mysql connect ("$host", "$username", "$userpass") or die ("<br>nem lehet csatlakozni a kiszolgalohoz"); //ellenorizzuk a kerdeses adatbazis letet if (!mysql query("use $database")) echo ("<script> alert(Az adatbazis nem áll készen!); </script>"); ?> urlap.php fájl kódja <?php /*Denes Medzihradszky * @version 1.0 * @copyright 2004 */ //hibakat tartalmazo tombot deklaralunk $hibak = array(); //kulcsmezot jelolunk ki if ($nev != "") { //atalakitasok es ellenorzesek //tabulatorral tagolt sztringbe fuzzuk a jelolodobozokra adott valaszokat 51/89 LVNROD PHP programozási nyelv *iERUpQHV) if (isset($szakertelem)) { $szakert = ""; for ($i=0; $i<count($szakertelem);
$i++) if ($i == count($szakertelem)-1) $szakert .= $szakertelem[$i]; else $szakert .= $szakertelem[$i]" "; } else $hibak["szakertelem"] = "Nem adott meg szakértelmet!"; //sztringbe fuzzuk a gorditheto listara adott valaszokat is if (isset($szoftverek)) { $szoftver = ""; for ($i=0; $i<count($szoftverek); $i++) if ($i == count($szoftverek)-1) $szoftver .= $szoftverek[$i]; else $szoftver .= $szoftverek[$i]" "; } else $hibak["szoftverek"] = "Nem adott meg szoftvert!"; //a nevet korrekt formara alakitjuk, a szavak elso betuje legyen nagybetu $nev = ucwords(strtolower($nev)); //regexp segitsegevel ellenorizzuk a szuletesi evet (19xx lehet) if (!ereg("^19([0-9]{2})", $szulev)) $hibak["szulev"] = "Nem jó a születési év!"; //ha minden rendben, feltoltheto az adatbazis if (count($hibak) == 0) { include("connect local.php"); $sql = "insert into szemelyek (nev, szulev, nem,
szakertelem, szoftverek) "; $sql .= "values ($nev, $szulev, $nem, $szakert, $szoftver) "; mysql query($sql); mysql close($conn); //ertesites es atiranyitas mas lapra echo ("<script language=JavaScript1.2>"); echo ("alert(Az adatokat felvittük);"); echo ("location.reload(tovabbphp);"); echo ("</script>"); } else //ez itt csak tesztelesi celokra van, kiiratjuk a hibakat! while (list($kulcs, $ertek) = each($hibak)) echo ($ertek."<br>"); } ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-88592"> <title>Regisztráció</title> 52/89 LVNROD PHP programozási nyelv *iERUpQHV) </head> <body bgcolor="#FFFFFF"> <p align="center">Adatbevitel</p> <form method="POST" action=""> <div align="center"> <table width="700"
cellspacing="0" cellpadding="6" border="0"> <tr> <td width="267" align="right">név</td> <td width="409"><input type="text" name="nev" size="30" maxlength="30"></td> </tr> <tr> <td width="267" align="right">születési év</td> <td width="409"><input type="text" name="szulev" size="4" maxlength="4"></td> </tr> <tr> <td width="267" align="right">nem</td> <td width="409"> <input type="radio" value="férfi" checked name="nem">férfi <input type="radio" name="nem" value="nõ">nõ</td> </tr> <tr> <td width="267" align="right">szakértelem</td> <td
width="409"> <div align="center"> <? //checkbox csoport kirakasa tomb ertekek alapjan $szakert tomb = array("video szerkesztés", "audio szerkesztés", "grafika", "programozás", "animáció", "webszerkesztés"); echo ("<table border="0" cellpadding="0" cellspacing="0">"); //hogy ne kelljen olyan hosszu sort irni. $input = "<input type="checkbox" name="szakertelem[]""; for ($i=0; $i<count($szakert tomb); $i+=2) { echo ("<tr><td>".$input" value="".$szakert tomb[$i]"">"$szakert tomb[$i]"</td>"); echo ("<td>".$input" value="".$szakert tomb[$i+1]"">"$szakert tomb[$i+1]"</td></tr>"); } //paratlan elemszam eseten ujabb sort kell kirakni itt a ciklus utan! echo ("</table>
"); ?> </div> </td> </tr> <tr> <td height="19" width="267" align="right">ismert szoftverek</td> <td height="19" width="409"> <? //tobbszoros kivalasztasu lista kirakasa $szoftvertomb = array("MS Office", "Corel", "Adobe Photoshop", "Dreamweaver", "After Effects", "Flash"); echo ("<select size="4" name="szoftverek[]" multiple>"); foreach ($szoftvertomb as $szoftver) echo ("<option value="".$szoftver"">"$szoftver"</option>"); echo ("</select>"); ?> </td> 53/89 LVNROD PHP programozási nyelv *iERUpQHV) </tr> <tr> <td width="267"> </td> <td width="409"> <p align="center"><input type="submit" value="Elküldés"
name="submit"></td> </tr> </table> </div> </form> </body> </html> WRYiEEIHMOHV]WpVLOHKHWVpJHN .pUGH]]NPHJD]LOOHWV]DNpUWHOPLV]LQWMpWUiGLyJRPEFVRSRUWVHJtWVpJpYHO ~JQHYH]HWW/LNHUWVNiOiWYDOyVtWRWWXQNPHJH]]HO pVPLQGDMHO|OGRER]RNEyOH]Hk- KH]NDSFVROMXQNKR]]iHJV]|YHJPH]WDPHOEHD]HJpEV]DNpUWHOPpWtUKDWMDEHD IHOKDV]QiOyD]HJpEPH]YHOHJWWNpV]tWVQNRV]WiOWKRJOHJN|]HOHEEQHNHOOMHQ ennyit gépelnünk, csak az osztályt fogjuk példányosítani, paraméterként átadva az értéNHNHW FpOV]HU&HQHJW|PE pVDYiOWR]yQHYpWHVHWOHJHJpED]HOUHQGH]pVUHXWDOy adatokat. 7|EEQHOY&ROGDODNHJUHJLV]WUiFLyV&UODSQHOYHQ specifikáció Egy nemzetközi oldalt kell készítenünk, ahol a bejelentkezéskor nyelv választható PDJDUDQJROQpPHWIUDQFLD pVDUHJLV]WUiFLyVNpUGtYHWHQQHNDODSMiQNtQiOMXNIHO
9HJQNIHOV]HPpOLDGDWRNDWpVYLJND]RNDWDGDWEi]LVEDGHUHJLV]WUiOMXND]LOOHW QHOYLSUHIHUHQFLiMiWLV.pVEEPDMGDEHMHOHQWNH]pVNRUDXWRPDWLNXVDQDV]iPiUDpUtKHWQHOYHQNtQiOMXNDWDUWDlPDNDW$GDWHOOHQU]pVWPRVWQHPNHOOYpJH]QQN a feladat elméleti háttere $ZHELQGXOiVDyWDLVPHUWDSUREOpPDDGLQDPLNXVOHKHWVpJHNPHJWHUHPWpVH HOWWH]WDODSRNSiUKX]DPRVQHOYLYiOWR]DWDLQDNHONpV]tWpVpYHOOHKHWHWWFVDNPHJROGani, illetve a GET metódussal átadott nyelvre utaló változóval JavaScript segítségével is lehetett alternatív kiírásokat is tenni - ezt utóbbi bonyolult kódot és a JavaScript rendelNH]pVUHiOOiVWLJpQHOWH H]WYLV]RQWDIHOKDV]QiOyV]DEiOR]]D PtJD]HOVYiOWR]DWRW különösen annak módosítását, senkinek sem kívánom. Dinamikus megoldás többféle is YDQDKHO]HWWOIJJOHKHWVpJHNNHO9DODPLRODQPHJROGiVNHOOHQHDPLV]yWiUV]e- U&HJUpV]WH]YDQOHJN|]HOHEED]HPEHULJRQGRONRGiVKR]PiVUpV]WPLQGLJOiWMXN 54/89
LVNROD PHP programozási nyelv *iERUpQHV) hogy mi helyett mi áll - nem kell nekünk ismerni az összes nyelvet, bárki elkészítheti KHOHWWQNDQHOYLYDULiFLyNDW7RYiEEitJEYtWKHWLVOHKHWFVDNHJV]yWiUIiMOWNHOO kicserélni és máris rendelkezésre áll az új nyelvi változat. Az oldal grafikai-szerkezeti váza viszont állandó lehet. Az adott oldal nyelv specifitását egy átadott változó vagy DGDWEi]LVEyODPLQGHQROGDOHOHMpQNLROYDVRWWYiOWR]yEL]WRVtWKDWMD(OUHOiWKDWyKRJ VZLWFKYH]pUOV]HUNH]HWHWpUGHPHVKDV]QiOQLPHUWVRNSiUKX]DPRVYiODV]WiVYDQpVD] LVHONpS]HOKHWKRJHJHVNpSNpQWPHJYDOyVtWRWWIHOLUDWRNDWLVQHOYIJJYpNHOOWHQQL Használjuk ki a PHP asszociatív tömbjeit, mert az pontosan a kívánt rendszer szerint dolgozik! Egy sztring - a magyar elnevezés - az index és értéke a kívánt nyelvi változat. Ez egyúttal azt is jelenti, hogy a kódban az index keretében mindig látni fogjuk a magyar jelentést, nem kell külön
keresgélni! tervezés Elkészítjük a regisztrációs oldal vázát, magyar feliratokkal. Minden nyelvnek készítünk egy-egy specifikus fájl (magyarinc, angolinc, nemetinc, franciainc), amely egyetlen $szotarQHY&YiOWR]yEDQDVV]RFLDWtYW|PE|WWDUWDOPD]DPHOQHNLQGH[HLDPiU PHJIRJDOPD]RWWPDJDUIHOLUDWRNpUWpNHLD]DGRWWQHOYPHJIHOHOIHOLUDWDL1HIHOHMWVN el, hogy kell egy magyarról-magyarra fájl is, mert a magyar változatot ugyanezen technikával kell megvalósítani az egység érdekében! Ezeket a fájlokat include utasítással visszük majd be, egy switchYH]pUOV]HUNH]HWNHUHWpEHQËJD$szotar változónak min- GLJD]DGRWWQHOYQHNPHJIHOHOW|PEpUWpNHLOHV]QHN$QHOYVSHFLILNXVYiOWR]yW $langPRVWHJV]HU&HQDEHMHOHQWNH]ROGDOUyO index.html) kapjuk a link kiegészítésével, az URL-hez kapcsoltan (ebben semmi titkolandó nincs) Az regisztrációt egy külön, felbukkanó ablakban végezzük, amit viszont JavaScript segítségével hívunk
meg Az adatok felvétele után biztosítani kell a visszalépést, továbbá el akarjuk tüntetni az ROGDOLVPpWHOWOHIXWiVDNRUDEHYLWHOLPH]NHWH]PHJROGKDWyW|EEIpOHNpSSHQSpOGiXOD HTML rész megjegyzésbe zárásával, kommentezésével, amelynek kiíratása viszont egy logikai változó értéke szerint fog megtörténni, vagy egy exit() utasítás segítségével, amikor a kód végrehajtása megszakad és a HTML rész már nem jelenik meg az oldalon. megvalósítás (kód) regform.php <?php /* ez a kod a nyelvi valtozatokat hivatott lekezelni, az atvett $lang valtozo 55/89 LVNROD PHP programozási nyelv * *iERUpQHV) alapjan egy include beleviszi a megfelelo $szotar valtozot */ $rendben = false; switch($lang) { case "ger" : include("nemet.inc") ; break ; case "fra" : include("francia.inc") ; break ; case "eng" : include("angol.inc") ; break ; default : include("magyar.inc") ; } // eddig a
nyelv kivalasztasa ?> <html> <head> <title>Regisztráció</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-88591"> </head> <? if(isset($vnev) && $vnev != "") { // Gyartunk egy random jelszot, amit majd kikuldunk srand((float) microtime() * 10000000); $pswd = strval(rand(10000, 100000)); // Benyomjuk a torzsadatokat es atalakitjuk a kisbetusen irt neveket $knev = ucwords(strtolower($knev)); $vnev = ucwords(strtolower($vnev)); //osszeallitjuk az email cimet $fullemail = "$email azon@$email path"; //osszeallitjuk az adatbazisba bevitelre kerulo ertekekkel az sql //utasitast /*elkuldjuk emailben a jelszot es a logint, * ez csak akkor mukodik, ha a szerveren illetve a php.ini-ben be van * allitva a mail program * mail($fullemail, "Regisztráció", "Loginja: $login, Ideiglenes jel * szó: $pswd"); * helyette: / echo("E-mail címe:
".$fullemail"<br>Regisztráció <br> Loginja: $login, Ideiglenes jelszó: $pswd"); //ertesitjuk a felhasznalot echo ("<body bgcolor="#FFFFFF"><p>Az adatokat rendben felvettük</p>"); echo ("<a href="javascript:void()" onClick="window.close();">>> vissza az index lapra >></a>"); echo ("</body>"); //ezzel tuntetjuk el a HTML kodot sikeres adatfelvetel eseten $rendben = true; 56/89 LVNROD PHP programozási nyelv *iERUpQHV) } if ($rendben) echo ("<!--"); ?> <body > <p align="center"><b><? echo $szotar["Regisztrációs adatok (a *-gal jelölt kötelezõ)"];?></b><br> </p> <form method="POST" action=""> <table width="500" border="0" cellspacing="0" cellpadding="6"
align="center"> <tr> <td width="192"><? echo $szotar["vezetéknév*"]; ?></td> <td width="284"> <input type="text" name="vnev" value="<? echo $vnev; ?>"> </td> </tr> <tr> <td width="192"><? echo $szotar["keresztnév*"];?></td> <td width="284"> <input type="text" name="knev" value="<? echo $knev;?>"> </td> </tr> <tr> <td width="192"><? echo $szotar["megjelenõ név (login)*"];?> </td> <td width="284"> <input type="text" name="login" maxlength="12" value="<? echo $login;?>"> </td> </tr> <tr> <td width="192"><? echo $szotar["foglalkozás/szakterület*"];?></td> <td
width="284"> <input type="text" name="szakma" value="<? echo $szakma;?>"> </td> </tr> <tr> <td width="192">e-mail*</td> <td width="284" valign="middle"> <input type="text" name="email azon" size="8" value="<? echo $email azon;?>"> @ <input type="text" name="email path" size="20" value="<? echo $email path; ?>"> </td> </tr> <tr> <td width="192"><? echo $szotar["telefon"];?></td> <td width="284"> <input type="text" name="tel" value="<? echo $tel;?>"> </td> </tr> <tr> <td width="192"><? echo $szotar["város"];?>*</td> <td width="284"> <input type="text"
name="varos" value="<? echo $varos;?>"> </td> </tr> <tr> 57/89 LVNROD PHP programozási nyelv *iERUpQHV) <td width="192"><? echo $szotar["irányítószám, házszám, utca"];?></td> <td width="284"> <input type="text" name="cim" value="<? echo $cim;?>"> </td> </tr> <tr> <td colspan="2"> <div align="right"> <input type="hidden" name="lang" value="<? echo $lang;?>"> <br> <input type="submit" name="submit" value=" <? echo $szotar["regisztrálás"];?> "> </div> </td> </tr> </table> </form> <? if ($rendben) echo ("-->"); ?> </body> </html> WRYiEEIHMOHV]WpVLOHKHWVpJHN (JERQROXOWDEEUHQGV]HUEHQHJV]HU&EEKDsession
segítségével kezeljük a $lang változót és minden oldal elején a felhasználót azonosítva töltjük be számára a PHJIHOHOQHOYLROGDOW(OIRUGXOD]LVKRJQHOYVSHFLILNXVJUDILNiWKDV]QiOXQN(b- EHQD]HVHWEHQDNpSHNIiMOQHYHLKH]DGMXQNKR]]iHJQHOYUHMHOOHP]HOHPHWpVH]D switch szerkezetben kapjon értéket, majd a képek a megjelenítés helyén ezzel a változóval kiegészített URL-t kapjanak. Névnapozás, az aktuális névnap kiírása17 specifikáció Készítsünk weboldalunk nyitólapjára az adott naphoz tartozó névnapokat feltün- WHWPRGXOW7|UHNHGMQND]REMHNWXPRULHQWiOWPHJN|]HOtWpVUH a feladat elméleti háttere Adatbázisban fogjuk tárolni a névnapok dátumhoz rendelését biztosító rekordokat. Ezek egy azonosító mellett - bár a hónap sorszáma és a nap sorszáma is egyedi kulcsot ad - tárolni fogják a hónap sorszámát, a nap sorszámát és karaktersorozat formájában,
N|]YHWOHQOPHJMHOHQtWKHWPyGRQD]DGRWWQDSKR]WDUWR]yQpYQDSR ND WLOOHWYHEL]Wo- 58/89 LVNROD PHP programozási nyelv *iERUpQHV) VtWVXQNOHKHWVpJHWiOODPLQQHSHVHWpQD]QQHSQDSQHYpQHNPHJMHOHQtWpVpUHLV$ UHQGV]HUWOOHNpUMNDGiWXPRWpVD]WIHOGROJR]YDHOiOOtWMXNDKyQDSpVQDSpUWpNHNHW DPHOHNVHJtWVpJpYHOD]RQRVtWKDWMXNDPHJIHOHOUHNRUGRW tervezés $]DGDWEi]LVWiEODD]D]RQRVtWyQ LG NtYOQpJPH]EOiOOH]HNKyQDS KRQDS QDS QDS QpYQDS QHYQDS QQHS XQQHS /pWUHKR]KDWyHJPiUPHJOHY adatbázis névnap táblájaként .sql fájlból, vagy a táblát külön létrehozva, egy Excel táblázatból tabulátorral elválasztott formában lementett szöveges fájlból az SQL copy paUDQFViYDO(OV]|UHONpV]tWQNHJVWUXNWXUiOWPHJYDOyVtWiVWPDMGH]WNLHJpV]tWYHitdolgozva elegáns megoldásra törekszünk, - csak nem fogunk külön kódot írni mindegyik alkalommal ha használni kívánjuk a rendszert! (a gyakorlatban a webhely több
ROGDOiQLVPHJNHOOMHOHQWHWQLDQpYQDSLQIRUPiFLyNDWQHPFVDNDIODSRQ WHKiWRVz- WiOWNpV]tWQNpVDQQDNSpOGiQRVtWiViYDOiOOtWMXNHODNHUHV]WQHYHNLOOHWYHD]HVHWOHJHV ünnep kimenetét. A használandó adatbázis referenciáját, a dátum értéket paraméterként adjuk át, a kimenet sztring. megvalósítás (kód) WRYiEEIHMOHV]WpVLOHKHWVpJHN (a) 9HJN ILJHOHPEH D V]|NpYHN HOWpU QpYQDS KR]]iUHQGHOpVpW KLYDWDORVDQ IHEUXiU D V]|NQDStJ V]|NpYEHQD IHEUXiULQpYQDSRN XWiQD W NLKDJYDHJQDSSDOFV~V]QDN pVtUMXNPHJ DV]|NpYHNHWPHJDGy DOJRULtmust18. Ebben az esetben vizsgálnunk kell az év értékét is a rendszerdátumból 17 Ne felejtsük el, hogy a névnapok ünneplése nem általános szokás még az úgynevezett nyugati kultúrájú világban sem! Ne próbáljunk egy angolszász közösségnek névnapozást csinálni, mert nem fogják tudni, PLU 18
OLVYDQV]y«(]DNpUGpVIHOPHUOWHJZHEIHMOHV]WLIyUXPRQH]pUWKtYRPIHOUiLWWLVDILJHOPHW 7|UHNHGMQNDSUHFL]LWiVUDpVJRQGROMXQNDM|Y NHOOILJHOHPEHYHQQLPHUWQHPV]|N - UH & 1HPFVDNHJV]HU HQDQpJJHORV]WKDWypYHNHW pYHNDV]i]]DORV]WKDWypYHNXJDQDNNRUD]RQEDQV]|NpYHND QpJV]i]]DORV]WKDWyDN8JDQDN|YHWNH] UHVRNDWNHOOYiUQLGHW|UWpQHWHVHQQHPYROWV]|NpY, míg 2000 az volt, így van némi ráció ennek figyelembe vételében egy általánosan használható algoritmus kidolgozása során. 59/89 LVNROD PHP programozási nyelv *iERUpQHV) (b) Nem mindig áll rendelkezésünkre szerveren telepített adatbázis! Dolgozzunk ki olyan adattárolási formá(ka)t, - természetesen a kiolvasó rutinokkal együtt amelyek segítségével adatbázis nélkül is megoldható a névnapok kikeresése. iWXPpVLGNH]HOpVIHOVIRNRQ specifikáció .pV]tWVQNNO|QE|]DGDWIRUUiVRNEyONO|QE|]PDJDUQHOY&GiWXPpVLG
NLtUiVLIRUPiNDWPHJYDOyVtWyRV]WiOW$]RV]WiOOHJHQWRYiEEIHMOHV]WKHWD]D]V]kség esetén újabb és újabb kiírásokat megvalósítható metódusokat adunk majd hozzá és újabb adatforrásokat is be kell tudnunk építeni a rendszerbe. a feladat elméleti háttere $PDJDUQHOY&GiWXPNLtUiVRNKR]D]REMHNWXPDGDWDLN|]|WWNHOOKRJV]HUe- SHOMHQHNDKyQDSRNQHYHLpVDKpWQDSMDLQDNQHYHL FpOV]HU&HQHJHJW|PEHOHPHi- NpQW $V]iPtWiVEDM|YDGDWIRUUiVRN/LQX[8QL[UHQGV]HULG:LQGRZVUHQGV]HULG PostgreSQL adatbázis és MySQL adatbázis timestamp adatformátuma. Az objektum létrehozása a konstruktor metódussal történik, ennek lefutása feltölti a hét napjai és a KyQDSRNW|PE|WPDMGD]REMHNWXPRWDNtYiQWGiWXPLGpUWpNUHiOOtWMXNDPHJIHOHO init()PHWyGXVPHJKtYiViYDO&pOV]HU&DNO|QE|]DGDWIRUPiWXPRNDWHJVpJHVV]Hr- NH]HWEHKR]QLpVHJRV]WiOV]LQW&YiOWR]yEDQWiUROQL(QQHNDODSMiQN|YHWNH]KHWQHND
NLtUiVRNHOV]|UFVDNQpKiQIRUPiWXPRWNpV]tWQNHOGHH]NpVEELJpQV]HULQWEYtWKHW$]RV]WiONyGMDHJNO|QLQFIiMOEDQNDSKHOHWDONDOPD]iVNRUH]WD] include once() szerkezettel visszük be a kódba. Fontos az include once() változatot használni, hogy az osztály kódja biztosan csak egyszer szerepeljen a teljes kódban. tervezés Az osztály neve legyen Mydatum. Az objektum adatai: $honapok, $napok tömbök, $datum változó, amely a közös formátumra hozott dátumértéket fogja tárolni (ez ebben D]HVHWEHQD81,;GiWXPLGNH]HOpVpQHNPHJIHOHOHQD]MDQXiUyWDHOWHOWPásodpercek számát fogja tárolni). Az objektumot létrehozó konstruktor az osztály nevé- YHONDUDNWHUUHPHJHJH]QHY&PHWyGXVHEEHQD]HVHWEHQD0GDWXP PHWyGXVH] tölti fel az adat tömböket és az utána meghívott most init() illetve mysql init() metódus DNtYiQWGiWXPLGpUWpNUHiOOtWMDEHD]REMHNWXPRW UHQGV]HULGUHLOOHWYHD064/ 60/89 LVNROD PHP
programozási nyelv *iERUpQHV) DGDWEi]LVEyOYLVV]DNDSRWWLGEpOHJHWIHOGROJR]YDD]DGDWEi]LVEDQWiUROWLGUH$NLtUy PHWyGXVRNDN|YHWNH]GiWXPLGIRUPiWXPRNDWDGMiNYLssza: ev ho nap napneve() 2004. április 22 csütörtök ev honap nap() 2004. április 22 ev ho nap() 2004-04-22 honap nap() április 22. ora perc() 15:14 megvalósítás (kód) mysql datum.inc fájl - a Mydatum osztály kódja <?php /* copyright 2004; Denes Medzihradszky, Peter Szabo / /* Osztaly, ami mysql datumformatumbol is tud magyar datum-ido * kiirasokat csinalni. */ class Mydatum { var $datum, $honapok, $napok; function Mydatum() //konstruktor, ami erteket ad a honap, napok tomboknek { $this->honapok = array("", "január", "február", "március", "április", "május", "június", "július", "augusztus", "szeptember", "október", "november", "december");
$this->napok = array("vasárnap", "hétfõ", "kedd", "szerda", "csütörtök", "péntek", "szombat"); } function most init() //a jelenlegi datumra allitja az objektumot { $this->datum = time(); } function mysql init($datum) //mysql timestamp adatformatumot vesz at parameterkent { $ev = intval(substr($datum, 0,4)); $ho = intval(substr($datum, 4,2)); $nap = intval(substr($datum, 6,2)); $ora = intval(substr($datum, 8,2)); $perc = intval(substr($datum, 10,2)); $mperc = intval(substr($datum, 12,2)); $this->datum = mktime($ora, $perc, $mperc, $ho, $nap, $ev); } function ev ho nap napneve() formatumban irja ki { //ev. honap nap, het napja 61/89 LVNROD PHP programozási nyelv *iERUpQHV) return date("Y", $this->datum)." "$this->honapok[ intval( date( "m", $this->datum ))]." "intval( date( "d", $this->datum )) ", " $this->napok[
date( "w", $this->datum )]; } function ev honap nap() //ev. honap nap formatumban irja ki { return date("Y", $this->datum)." "$this->honapok[ intval( date( "m", $this->datum ))]." "intval( date( "d", $this->datum )) ""; } function ev ho nap() //ev-ho-nap formatumban irja ki { return date("Y", $this->datum)."-"date( "m", $this->datum )""date( "d", $this->datum ); } function honap nap() //honap nap. formatumban irja ki { return $this->honapok[ intval( date( "m", $this->datum ))]." ".intval( date( "d", $this->datum ))""; } function ora perc() //ora:perc formatumban irja ki { return date("H", $this->datum ).":"date("i", $this->datum ); } } ?> mysql datum.php fájl - a megjelenítést végzi <?php include ("mysql datum.inc"); $dt = new Mydatum();
?> <html> <head> <title>Untitled Document</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-88592"> </head> <body bgcolor="#FFFFFF"> <? //adatbazis idobelyegzot modellezunk $db stmp = "20040505203452"; //"adatbazisbol" vett datumra allunk ra $dt->mysql init($db stmp); echo $dt->ev ho nap napneve(); echo "<br>"; echo $dt->ev honap nap(); echo "<br>"; echo $dt->ev ho nap(); echo "<br>"; echo $dt->honap nap(); echo "<br>"; echo $dt->ora perc(); echo "<br>"; $dt->most init(); //a jelenlegi datumra allunk ra 62/89 LVNROD PHP programozási nyelv *iERUpQHV) echo $dt->ev ho nap napneve(); ?> </body> </html> WRYiEEIHMOHV]WpVLOHKHWVpJHN ËUMXQNRODQPHWyGXVWDPHOiWYHV]NpWGiWXPLGWUHSUH]HQWiOyREMHNWXPRWpVD
NO|QEVpJNHWtUMDNLPHWWOPHGGLJIRUPiWXPEDQGHFVDND]RNDWD]HOHPHNHWDPe- lyekben eltérés van, azaz például 2004-03-15 és 2004-03-17 esetében a kiírás március 15-17. lesz! gU|NOGpVVHONpV]tWVQN~MRV]WiOWDPHOPiVQHOYHNHQLVNpSHVGiWXPRNDW PHJMHOHQtWHQL(KKH]WHUPpV]HWHVHQIHOONHOOtUQLDNRQVWUXNWRUNpQWP&N|GPHWyGXVW és egyik-másik kiíró metódust is. 5HJXOiULVNLIHMH]pVDONDOPD]iVDEHYLWHOLPH]NHOOHQU]pVpUH specifikáció 2OGMXNPHJD]HPDLOFtPEHYLWHOLHOOHQU]pVpW19, illetve biztosítsuk hogy egy be- YLWHOLPH]EHFVDNWHOHIRQV]iPRW DQQDNMHOOHP]NDUDNWHUHLWpVHOUHQGH]pVpW OHKHVVHQ EHYLQQL3UyEiOMXNPHJYDOyVtWDQLDOHKHWOHJMREEPHJN|]HOtWpVWKDW|NpOHWHVHWQHPLV tudunk alkotni! a feladat elméleti háttere Mindenki használt már reguláris kifejezést, ha nem is tudta róla, hogy így neve- ]LN$]HJV]HU&EEHNN|]OYDOyD]DPLNRUHJIiMOQpYNHUHVpVEHQ""QDS GRFPLQWiW adunk meg, mert rákeresünk minden
olyan fájlnévre, amely két tetszés szerinti karakter után a "nap" részláncot tartalmazza, majd tetszés szerinti hosszúságú karaktersorozat jöhet és a kiterjesztése "doc" legyen. Ezt továbbfejlesztve a szövegfeldolgozásra szakosodott nyelvekben (Perl, PHP) standardizált jelöléseket vezettek be és így gyakorlatilag EiUPLOHQPLQWiWLOOHV]WKHWQNDPHJIHOHOIJJYpQVHJtWVpJpYHO ereg() és a kisbe- 19 (QQHNDUHJXOiULVNLIHMH]pVQHND]HUHGHWLMpWD]LQWHUQHWHQWDOiOWDPPDMGSURJUDPR]yLVPHU PD]WDW V|PDONDl- OHPIJJHWOHQOV]LQWpQD]LQWHUQHWUOEHJ&MWYHHJ&UODSHOOHQU]pVHONpV]tWpVHVRUiQ$] &UODSWHV]WHOpVpQpOD]RQEDQNLGHUOWKRJQHPP&N|GLNMyOVWD]HUHGHWLLVKLEiVtJD]LWWN|]UHDGRWW már a javított változat. Ez mellesleg igen jól alátámasztja azt a gyakorlati tapasztalatot, hogy soha ne fogadjuk el a "talált" kódokat kritika és alapos tesztelés nélkül! 63/89 LVNROD PHP
programozási nyelv *iERUpQHV) W&QDJEHW&NO|QEVpJHNHWILJHOHPEHQHPYHYeregi() függvények), ha a minta ilOHV]NHGLNDIJJYpQYLVV]DWpUpVLpUWpNHLJD]KDQHPpUWHOHPV]HU&HQKamis. Ezekkel a jelölésekkel megadhatjuk, hogy milyen karakterek, azokból egymás XWiQPHQQLIRJDGKDWyHOKiQV]RULVPpWOGKHWHJHJHOHPpVPpJVRNPiVWLVHOtUKDWXQN(OtUKDWMXND]WLVKRJKRYDLOOHV]NHGMHQD]HOHPDNDUDNWHUVRUR]DWHOHMpUH DYDJDYpJpUH,JD]iQMyUHJXOiULVNLIHMH]pVWtUQLP&YpV]HWPHUWiWNHOOOiWQLD]LOOHVz- NHGpVW|UYpQV]HU&VpJHLWpVHOUHWXGQLNHOOKRJPHOHNOHKHWQHNDPHJHQJHGKHW esetek. Természetesen egy reguláris kifejezéses illeszkedés nem jelenti azt, hogy az email SpOGiXOYDOyVFtPH]DPyGV]HUFVDNDIRUPDLHOOHQU]pVUHDONDOPDV+DIRQWRVV]á- munkra, hogy a felhasználó valóban a saját email címét adja meg, tegyük ebben érdekeltté, például a belépési jelszót vagy a regisztrációs felület linkjét a megadott
email FtPUHNOGMNHOHVHWOHJPpJLGNRUOiWRWLVIHOiOOtWKDWXQNDEHMHOHQWNH]pVpKH] tervezés (OV]|ULVD]WNHOOEHOiWQXQNKRJPLOHQHJHPDLOFtPOHKHWVpJHVIRUPiWXPD $]HOVUpV]EHQD#MHOLJEHW&NpVV]iPRNOHKHWQHNEHW&YHONHOONH]GGM|QpVSRQW vagy aláhúzás karakter lehet benne. Egy és csak egy "@" karakter legyen benne, majd a domén név részben tetszés szerinti számú aldomén lehet ponttal elválasztva, amelyek WDUWDOPD]KDWQDNPpJN|WMHOHWGHDOiK~]iVNDUDNWHUWQHP9pJODFtPOH]iUiVDRODQ karaktersorozattal történik, amely a pont után minimum két karaktert tartalmaz. Nincs helye különleges karaktereknek sem, általában nem engednek meg speciális karaktereket a szolgáltatók. Erre kell tehát mintát írni $WHOHIRQV]iPHVHWpEHQDV]iPNH]GGKHWSOXV]MHOOHOpVYDJ]iUyMHOOHOpVWHUPészetesen számmal (országkód és körzetkód) amit lezárhatunk zárójellel, és amit követ-
KHWUHVNDUDNWHUPDMGLVPpWV]iPGHH]HNHWPHJV]DNtWKDWMXNN|WMHOOHOYDJUHVNaUDNWHUHNNHO%HW&YLV]RQWHJpV]HQEL]WRVDQQHPV]HUHSHOKHWEHQQH20 20 (JHQO UH$WHOHIRQV]iPRNN|QQHEEPHJMHJH]KHW VpJHpUGHNpEHQD](JHVOWÈOODPRNEDQPiU & HOpJJDNRULDEHW NNHONLIHMH]HWWWHOHIRQV]iPDPLNRUDFpJU|YLGQHYpQHNYDJV]ORJHQMpQHNPHJIHOHO V]iPRNDWYiODV]WMiNWHOHIRQV]iPNpQW(]]HOPRVWHJHQO UHQHPIRJODONR]XQN« 64/89 LVNROD PHP programozási nyelv *iERUpQHV) megvalósítás (kód) ellenorzes.inc fájl kódja <?php //ellenorzo funkciok regexp alapon function check email($email) { if(ereg("^([0-9,a-z,A-Z]+)([., ,-]([0-9,a-z,A-Z]+))*[@]([0-9,a-z,AZ]+)([.,-]([0-9,a-z,A-Z,-]+))*[.]([0-9,a-z,A-Z]){2}([0-9,a-z,A-Z])?$", $email)) return true; } function check telszam($telszam) { if (ereg("^([0-9,(,+]+)([-,(,)]([0-9]+))*[/,0-9]([0-9]+)?$", $telszam)) return true; } ?> WRYiEEIHMOHV]WpVLOHKHWVpJHN
7HUYH]]QNPHJHJHOOHQU]RV]WiOWDPHOQHNNO|QE|]PHWyGXVDLOHV]QHN D]HJHVJDNUDQKDV]QiOWEHYLWHOLpUWpNHNUHJXOiULVNLIHMH]pVHNHQDODSXOyHOOHQU] függvényei. A jól megfogalmazott és kitesztelt függvényekkel szinte mindent le lehet HOOHQUL]QLpVQHPFVDNDV]HUYHUROGDORQPHUWD-DYD6FULSWLVLVPHULpVNH]HOQLWXGMDD reguláris kifejezéseket! %DQQHUFVHUpON specifikáció (a) 9pOHWOHQV]HU&HQDNDUXQNPHJMHOHQtWHQLFlash segítségével készített bannereket, azaz olyan hirdetési célokat szolgáló képeket, ahol a képhez tartozó linket nem az img tag köré írt HTML kód biztosítja, hanem az a képben magában van kódolva. Az egyes hirdetéseket bannercsere egyezség keretében azonos gyakorisággal akarjuk megjeleníteni. (b) $YpOHWOHQV]HU&HQPHJMHOHQtWHWWNpSHNHJV]HU&.jpg vagy png képek21 és ennek következtében a hirdetett link nem a képfájlban van kódolva A megjelenítési követelmények azonosak 21 Ismert, hogy gyakran
használnak animált .gif gépeket bannerként Fontos megjegyezni, hogy a gif technika alkalPD]iVDOLFHQV]HWLJpQHOHQpONOIHOKDV]QiOiVDV]HU]LpVV]RPV]pGRVMRJRNDWVpUW 65/89 LVNROD PHP programozási nyelv *iERUpQHV) a feladat elméleti háttere Az (a) esetben a képfájl hordozza az összes információt, azaz csak ezek véletlen- V]HU&+70/ROGDOEDLOOHV]WpVpUONHOOJRQGRVNRGQLDW|EELPHJPDJiWyO$ZHEKHO ]HPHOWHWpVHVRUiQFpOV]HU&OHQQHKDFVDNIHONHOOHQHW|OWHQLDNpSHNHWHJEDQQHUHN HOQHYH]pV&PDSSiEDDKRQQDQV]NULSWQNYpOHWOHQV]HU&HQNLYHV]HJHJNpSHWpVD]W PHJMHOHQtWLD+70/ROGDOEDiJD]YD$SUREOpPiWWHKiWOHV]&NtWHWWNDGRWWPDSSDWDr- WDOPiQDNNLROYDViViUDD]RNEyOYpOHWOHQV]HU&NLYiODV]WiVUD$3+3PLQWV]HUYHUROGDOL szkriptnyelv képes fájlkezelésre (a JavaScript a kliens oldalon nem!) és a könyvtárak kezelésének mechanizmusa megegyezik a fájlkezeléssel (ne felejtsük el a Linux/Unix
IHOIRJiVWDN|QYWiULVIiMOFVDNNO|QOHJHVWXODMGRQViJDLYDQQDN D]D]HOV]|UPHgQLWMXNDWDUWDOPiWNLROYDVVXNYpOHWOHQV]HU&HQNLYiODV]WXQNHJNpSIiMOWPDMGPHJMelenítjük. A (b) esetben két, egymáshoz kapcsolódó információra van szükségünk, a képfájl QHYpUHpVHOpUpVL~WMiUDYDODPLQWDKLUGHWHQGOLQNUH(]HNHWWiUROKDWMXNDGDWEi]LVEDQ YDJIiMOEDQVWPDJiEDQDNyGEDQLVHOKHOH]KHWQNHJDVV]RFLDWtYW|PE|WDKROD NXOFVOHKHWDIiMOQpYD]pUWpNDOLQN85/MH(]HNEONHOOD]|VV]HWDUWR]yLQIRUPiFLóSiUWYpOHWOHQV]HU&HQNLYiODV]WDQLpVPHJMHOHQtWHQL$]HJpUWHOP&KRJ~MNpSHNpVD hozzájuk tartozó link távoli feltöltése csak adatbázison át történhet, a másik két esetben akár az információt hordozó fájlt, akár a kódot manuálisan szerkeszteni kell. tervezés $3+3QHOYEHQHJN|QYWiUPHJIHOHOPyGRQW|UWpQpVVLNHUHVPHJQLWiVD esetében (opendir()) egy azonosítót kapunk vissza, amelynek segítségével kiolvashatjuk
soronként a mappát (fájlonként) majd bezárjuk. Minden mappa tartalmaz egy "" és HJIiMOWLVH]HNUHSHUV]HYL]VJiOQLNHOODNLROYDViVWpVNLNHOOV]&UQL$NLROYDVRWW fájlokat egymás után egy erre a célra létrehozott tömbbe ($bannerek) nyomjuk bele (array push() függvény) majd az array rand()VHJtWVpJpYHOYpOHWOHQV]HU&HQLQGH[HW választunk ki és kiolvassuk/megjelenítjük az index alapján a képfájlokat tartalmazó W|PEPHJIHOHOHOHPpW A (b) esetben kicsit bonyolultabb a helyzet. Adatbázis alapú megoldás esetén ki kell olvasni az összes aktuális rekordot, meg kell számolni (az SQL count() függvénye) majd az így megismert határok között véletlenszámot generálunk és annak alapján a UHFRUGVHWEONLHPHOMND]tJNLYiODV]WRWWVRUW(]WIHOGROJR]YDNDSMXNPHJDPHJMHOe66/89 LVNROD PHP programozási nyelv *iERUpQHV) QtWHQGNpSIiMO85/MpWpVDOLQNHW+DQHPiOOUHQGHONH]pVQNUHDGDWEi]LVDNNRUYDJ fájlban
tároljuk a kép URL - hozzátartozó link párokat egy-egy sorban, vagy magában a kódban asszociatív tömb formájában. Fájlból kiindulva a fájlt megnyitjuk, a kapott fájlD]RQRVtWyDODSMiQVRURQNpQWNLROYDVVXNpVD]HOYiODV]Wy FpOV]HU&HQWDEXOiWRU PHQWpQ szétbontjuk, majd az információkat két párhuzamos tömbbe belenyomjuk és visszave]HWMNDPHJROGiVWDIHQWHEEOHtUWUD.yGEDQW|UWpQWiUROiVHVHWpEHQDOHJHJV]HU&EE KDDNpSpVOLQNLQIRUPiFLyHJDVV]RFLDWtYW|PEEHQWDOiOKDWypVHEEOW|UWpQLNDYpOHtlenszeU&NLYiODV]WiV $KiURPIpOHPHJROGiVW HOYLOHJFVDNNHWW IRJMXN|VV]HHJRV]WiONHUHWpEHQ 8WiQDPiUFVDNH]WNHOOSpOGiQRVtWDQLpVDPHJIHOHOPHWyGXVPHJKtYiViYDOWHWV]pV szerinti fájlEDQPHJYDOyVtWKDWyDEDQQHUFVHUpOP&N|GWHWpVH megvalósítás (kód) index.html fájl kódja: <?php include once("banner.inc"); ?> <html> <head> <meta http-equiv="Content-Type" content="text/html;
charset=iso-88592"> <title></title> </head> <body> <div align="center"> <center> <table border="0" cellpadding="6" cellspacing="0" width="700"> <tr> <td>Asszociativ tömb tartalmazza a képfájlok neveit és elérési útját (kulcs) valamint a hozzájuk tartozó linket (érték)</td> <td> <? $tomb = array("images/kek.gif" => "http://wwwmedzihu/php", "images/okker.gif" => "http://wwwgdfhu", "images/piros.gif" => "http://wwwindexhu", "images/zoldgif" => "http://www.greenpeaceorg"); $bn = new Banner(); $hivatkozas = $bn->standard($tomb); echo $hivatkozas; ?> </td> </tr> <tr> <td>Egyszerû szöveges fájl tartalmazza a képneveket elérési úttal együtt 67/89 LVNROD PHP programozási nyelv *iERUpQHV) valamint a hozzájuk tartozó
linket</td> <td> <? $bn = new Banner(); $hivatkozas = $bn->standard file("bannerek.txt"); echo $hivatkozas; ?> </td> </tr> <tr> <td>A kép hordozza a link információt, csak kiolvassuk a megfelelõ könyvtár tartalmát</td> <td> <? $bn = new Banner(); $kepurl = $bn->flash("images"); echo ("<img border="0" src=".$kepurl" >"); ?> </td> </tr> </table> </center> </div> </body> </html> banner.inc fájl kódja: <?php class Banner { //visszaad a konyvtarban talalhato fajlok kozul egyet, random kivalasztva function flash($konyvtar) { $bannerek = array(); $dp = opendir($konyvtar) or die("nem sikerült a könyvtár megnyitása!"); while ($file = readdir($dp)) { if ($file != "." && $file != "") array push($bannerek, $file); } closedir($dp); srand ((float) microtime() * 10000000); $index =
array rand ($bannerek); return $konyvtar."/"$bannerek[$index]; } //visszaad a tomb alapjan egy random kivalasztott kepet es a hozzatartozo linket function standard($tomb) { srand ((float) microtime() * 10000000); $index = array rand($tomb); return "<a href=".$tomb[$index]"><img src=""$index"" border="0"></a>"; } 68/89 LVNROD PHP programozási nyelv *iERUpQHV) //visszaad egy textfajl alapjan egy random kivalasztott kepet es a hozzatartozo linket function standard file($filenev) { $kepek = array(); $linkek = array(); $fp = fopen($filenev, "r") or die("nem sikerült a fájl megnyitása!"); while (!feof($fp)) { $puffer = fgets($fp, 128); $sor = explode(" ", $puffer); array push($kepek, $sor[0]); array push($linkek, $sor[1]); } fclose($fp); srand ((float) microtime() * 10000000); $index = array rand($kepek); return "<a href=".$linkek[$index]"><img
src="".$kepek[$index]"" border="0"></a>"; } }; ?> bannerek.txt fájl tartalma images/piros.gif images/kek.gif images/zold.gif images/okker.gif http://www.indexhu http://www.medzihu/php http://www.greenpeaceorg http://www.gdfhu WRYiEEIHMOHV]WpVLOHKHWVpJHN &VDOMXQNHJNLFVLW%iUDEDQQHUFVHUpOPHJYDOyVtWiVDVRUiQDODSYHWHQDYpOHt- OHQV]HU&NLYiODV]WiVUDW|UHNHGWQN±HJHQOHVpOWDGYDPLQGHJLNPHJMHOHQpVQHN±GH HOIRUGXOKDWRODQLJpQEL]WRVtWVXQNHJLG±SRQWRVDEEDQOHW|OWpV±DUiQRVPHJMelenítést. azaz valósítsuk meg, hogy adott bannerre beállítható legyen a kódban a száza- OpNRVHOIRUGXOiVpUWpNH %0DGDWEi]LVNH]HOpVXWROVyOiWRJDWiVLGSRQWMD specifikáció :HEV]HUYHUQN|QQHPiOOUHQGHONH]pVUH64/DGDWEi]LVNH]HOUHQGV]HU0iUD 3+3IXWWDWiVLOHKHWVpJHWLVFVDNQDJQHKH]HQWXGWXNHQJHGpOH]WHWQLGHDGDWEi]LVUyO szó sem lehet! Mi mégis szeretnénk nyilvántartani, hogy az egyes látogatók
esetében mikor történt a legutóbbi belépés - és ezt közölni is akarjuk velük az üdvözlésben. Valahogy így: 69/89 LVNROD PHP programozási nyelv *iERUpQHV) 6]LD[(]D]HOVOiWRJDWiVRGQiOXQN ,OOHWYHYLVV]DWpUOiWRJDWyknál: 6]LD[/HJXWROVyOiWRJDWiVRGLGSRQWMDYROW a feladat elméleti háttere Tipikus adatbázisos feladat, de ha nincs adatbázis? Van viszont a PHP nyelvnek RODQIJJYpQFVRPDJMDDPHODONDOPDVHJV]HU&NXOFVpUWpNSiURNRQDODSXOyDGDWEázisok kezelésére (ilyen lehet a Berkeley DB, a Gdbm, egyes rendszerkönyvtárak). Az DGDWEi]LVH]HNEHQD]HVHWHNEHQHJHWOHQIiMODPLWD3+3PHJIHOHOHQNH]HOQLNpSHVGH D]HJV]HU&IiMONH]HOpVHQW~OQLWiVNRUHJOFN ORFN IiMOOpWUHKR]iVDVHJtWVpJpYHOVDMiW zárolást is csinál, a felülírások elkerülésére. A login alapján tároljuk a belépéseket, mindenki esetében az utolsót (most nem HOOHQUL]]NDORJLQHJHGLVpJpWPDMGDWRYiEEIHMOHV]WpVEHQ
+DQLQFVLOHQD]RQRVí- WyYDOUHQGHONH]IHOKDV]QiOyDNNRU~MUHNRUGRWNpV]tWQNpVDUUyOLVJRQGRVNRGQLNHOO KRJD]HOVKDV]QiODWHVHWpQOpWUHKR]]XND]DGDWRNDWWDUWDOPD]yIiMOWLV(KKH]D dbmopen() függvényben megnyitási típusként a "c" jelölést használjuk (olvasás, írás, létrehozás). 1HIHOHMWVNHOHOOHQUL]QLDSKSLQLIiMOEHiOOtWiVDLW$OHJW|EEHVHWEHQH]DIJgvénycsomag alapértelmezetten nem áll rendelkezésre, a PHPTriad esetében például a php.ini fájlban a kiterjesztések (Windows extensions) részben az extension=php dbdll EHMHJ]pVHOONLNHOOYHQQLDNRPPHQWH]pVUHKDV]QiOWMHO|OpVW tervezés $ORJLQ HJHGLD]RQRVtWy EHNpUpVHHJ&UODSVHJtWVpJpYHOW|UWpQLNKDH]D]D]o- QRVtWyOpWH]LNDGDWEi]LVXQNEDQDNNRUD]&UODSHONOGpVHXWiQNLtUMXND]XWROVyEHOpSpV idpontját, ha nem, csak tájékoztató szöveg jelenik meg. A logint kulcsként alkalmazzuk és értékként a time() függvénnyel lekérdezzük a
UHQGV]HULGWPyGRVtWiVNRULOOHWYH~MUHNRUGIHOYpWHOHNRUNLtUiVHVHWpEHQSHGLJH]V]ROJiO LGEpOHJ]QHNDGDWH IJJYpQKH]DPLWDVSHFLILNiFLyQDNPHJIHOHOIRUPi]y V]WULQJJHOKtYXQNPHJ$]DODSHVHWHNQHNPHJIHOHONLtUiVWLVNpV]tWQNDV]HOHNFLy egyes ágaihoz. 70/89 LVNROD PHP programozási nyelv *iERUpQHV) megvalósítás (kód) adatbazis.php fájl <html> <head> <title>DBM adatbázis kezelése</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-88592"> </head> <body bgcolor="#FFFFFF"> <? if ($userid != "") { $dbm = dbmopen ("legutobb.db", "c") or die("nem sikerült adatbázist nyitni!"); if (dbmexists ($dbm, $userid)) { $latogatas = dbmfetch($dbm, $userid); echo ("Kedves ".$userid"! <br>Az utolsó látogatásod ideje: ".date("Y-m-d H:i:s", $latogatas)); dbmclose ($dbm); $dbm = dbmopen
("legutobb.db", "w"); $time = strval(time()); dbmreplace ($dbm, $userid, $time); dbmclose ($dbm); } else { echo ("Kedves ".$userid"! Üdvözöljük honlapunkon!"); dbminsert ($dbm, $userid, time()); dbmclose ($dbm); } } ?> <form method="POST" action=""> <table width="50%" cellpadding="6" border="0" cellspacing="0"> <tr> <td> Login: <input type="text" name="userid"> <input type="submit" name="Submit" value="Elküldés"> </td> </tr> </table> </form> </body> </html> WRYiEEIHMOHV]WpVLOHKHWVpJHN Hozzá lehetne szerkeszteni egy látogatási számot is, amely személyekre megmondja, ki hányszor járt már az adott lapon - ez átvezet minket a statisztikákhoz, amikor figyelni akarjuk az egyes látogatókat, kinek mi tetszik, merre barangol a lapon. 71/89 LVNROD
PHP programozási nyelv *iERUpQHV) DBM adatbázis kezelés - jelszavas beléptetés specifikáció :HEV]HUYHUQN|QQHPiOOUHQGHONH]pVUH64/DGDWEi]LVNH]HOUHQGV]HU PpJ PLQGLJ 0iUD3+3IXWWDWiVLOHKHWVpJHWLVFVDNQDJQHKH]HQWXGWXNHQJHGpOH]WHWQL GHDGDWEi]LVUyOV]yVHPOHKHW0LPpJLVOpWUHDNDUXQNKR]QLEHOVKDV]QiODWUDHJIó- rumot, ahol jelszavas belépés van és csak a társaságunk tagjai üzenhetnek egymásnak a fórum hasábjain. Tárolnunk kell a tagok loginját (azonosítóját) - ez a rendszeren feltét- OHQOHJHGLOHJHQMHOV]DYiWHPDLOFtPpW/HJHQOHKHWVpJDMHOV]yN|]YHWOHQPHgYiOWR]WDWiViUDDWDJRNUpV]pUO$IyUXPRWPRVWQHPNHOOPHJYDOyVtWDQLpVYpGHWWQDYigációt sem kell létrehozni. a feladat elméleti háttere Meg kell tehát oldani, hogy csak login/jelszó ismeretében léphessenek be a tagok, de azért ahhoz sokan vagyunk, hogy mindezt az információt fájlban tároljuk és minden változtatáshoz kézzel szerkesszük át az
adatokat tartalmazó fájlt. Tipikus adatbázisos feladat, de ha nincs adatbázis? Van viszont a PHP nyelvnek olyan függvénycsomagja, DPHODONDOPDVHJV]HU&NXOFVpUWpNSiURNRQDODSXOyDGDWEi]LVRN LOHQOHKHWD%HUNeley DB, a Gdbm, egyes rendszerkönyvtárak) kezelésére. Kulcsként adódik a login, hi- V]HQHOtUiVKRJHJHGLOHJHQDUHQGV]HUQNEHQD]pUWpNUHXJDQW|EEHOHPLVYDQ GHQHPRODQERQROXOWNpWYDJW|EEHOHP|VV]HI&]pVpYHOHJWiUROKDWyV]WULQJHWHOállítani. Itt most tömbökbe szervezzük a kulcshoz tartozó egyéb adatokat, ezeket kell majd az adatbázisba felvinni. .LKDV]QiORP D OHKHWVpJHW D] HJPiVUD pSO VWtOXVODSRN &DVFDGLQJ 6WOH Sheets, CSS) rövid gyakorlati bemutatására is. Az egyes fájlokon belül a weblapba épí- WHWWVWtOXVODSRNDGMiNPHJDEHYLWHOLPH]NODODNMiWDV]tQHNHWDNHUHWHNHW~JKRJ átdefiniáljuk a táblacellákat (td) és új osztályt hozunk létre (.table), amit majd a táblázat fejlécében helyezünk
el, hogy a táblázat egészére vonatkozzon. 1HIHOHMWVNHOHOOHQUL]QLDSKSLQLIiMOEHiOOtWiVDLW$OHJW|EEHVHWEHQH]DIJgvénycsomag alapértelmezetten nem áll rendelkezésre, a PHPTriad esetében például a php.ini fájlban a kiterjesztések (Windows extensions) részben az extension=php dbdll EHMHJ]pVHOONLNHOOYHQQLDNRPPHQWH]pVUHKDV]QiOWMHO|OpVW 72/89 LVNROD PHP programozási nyelv *iERUpQHV) tervezés +iURPIiMOWKR]XQNOpWUHD]LQGH[SKSIHODGDWDDMHOV]DYDVEHOpSpVKH]D]&UODS PHJMHOHQtWpVHpVDEHYLWWDGDWRNHOOHQU]pVHPDMGD]RNHOIRJDGiVDHVHWpQD]iWLUiQ WiV DEHOVRSKSZHEODSUD(]HQDODSRQHJ~MDEE&UODSVHJtWVpJpYHODIHOKDV]QiOyPHJYilWR]WDWKDWMDDMHOV]DYiW$]D]RQRVtWyWQHPLVNpUMNEH~MEyOKLV]HQFVDNDPHJIHOHO login/jelszó ismeretében kerülhet ide22. A harmadik fájl a regformphp, nevének meg- IHOHOHQH]HQDODSRQHJHJV]HU&UHJLV]WUiFLyKDMWKDWyYpJUHDKRO~MHJHGLD]RQRVtWyW (login), jelszót,
e-mail címet vihetünk fel. Ezeket a login egyediségén kívül külön nem HOOHQUL]]N$UHJLV]WUiFLyXWiQDIHOKDV]QiOyWiWLUiQ WMXND]LQGH[SKSODSUDDKROEH tud lépni a rendszerve, immár regisztrált felhasználóként. $]LQGH[SKSEHOpSpVL&UODSRWDNNRUGROJR]]XNIHOKDPLQGNpWPH]WNLW|OW|WWpN (OV]|UPHJYL]VJiOMXNDORJLQPHJOpWpWD]DGDWEi]LVEDQKDYDQLOHQOHNpUMNHQQHN DODSMiQDKR]]iWDUWR]ypUWpNHW QHIHOHGMNHJV]HU&NXOFVpUWpNSiUUyOYDQV]y Ni- V]HGMNEHOOHDMHOV]yV]WULQJHWpV|VV]HKDVRQOtWMXNDEHYLWWHO,JD]HUHGPpQHVHWpQ JavaScript segítségével megoldjuk az átirányítást, az URL-ben átadva a logint is. Ha nincs ilyen login, figyelmeztetést írunk a $loginhiba változóba, amit majd meg is jelenítünk újratöltéskor, ha nem azonos a bevitt és a tárolt jelszó, ugyanezt csináljuk a $jelszohiba változóval. $UHJIRUPSKSUHJLV]WUiFLyV&UODSHVHWpEHQKDVRQOyNpSSHQMiUXQNHOPLQGKiURP
PH]NLW|OWpVHXWiQNH]GQNHOIRJODONR]QLD]DGDWRNNDOpVHOV]|UHOOHQUL]]NYDQH már ilyen azonosító az adatbázisban. Ha igen, ezt a melléírásos technikával jelezzük is a EHYLWHOLPH]N|]HOpEHQPtJDW|EELPH]pUWpNpWYLVV]DtUMXNQHNHOOMHQD]RNDW~MUD kitölteni a felhasználónak. Siker esetén egy JavaScript üzenet után átirányítjuk a felhasználót a regisztrált belépésekhez $MHOV]yPyGRVtWiVWKRUGR]yEHOVRSKSIiMOKDVRQOyNpSSHQP&N|GLNPLYHODORJLQW PiUWXGMXND]85/EOIHOWpWHOH]pVQNV]HULQWLGHFVDNUHJLV]WUiOWDQOpSKHWEHDIHl- 22 )HOWpWHOH]pVQNV]HULQW(JpOHVUHQGV]HUHVHWpEHQH]WPLQGLJOHNHOOHOOHQ UL]QLDV]HUYHUROGDORQpV NRUOiWRWNHOOIHOiOOtWDQLDEHOpSpVKH]KLV]HQD]RWWKDJRWWDNOLHQVJpSHQOHPHQWHWWODSDODSMiQNO|n- LG EHQPiVLVEHWXGQDOpSQLLOOHWYHHJV]HU &EEOHQQHDKDFNHUpOHWHKDD]D]RQRVtWyWPiUQHPNHOOHQHPHg- keresni. 73/89 LVNROD PHP programozási nyelv *iERUpQHV) használó
- csak az új jelszót gépeltetjük be vele, a szokásos ismétléssel és átírjuk az adatbázisban annak értékét a kulcshoz tartozó szerializált sztringben. $NyGEDQFVDNDUHJIRUPSKSWPXWDWMXNEHWHOMHVHJpV]pEHQDPiVLNNHWWEO csak a PHP kód részletet másoljuk be ide. megvalósítás (kód) regform.php fájl kódja <?php //csak akkor foglalkozunk vele, ha ki vannak toltve a mezok $hiba = ""; if ($login != "" && $pwd != "" && $email != "") { //megvizsgaljuk, egyedi-e a login es ha nincs adatbazis, letrehozzuk $dbm = dbmopen("tagok.db", "c") or die("nem sikerült adatbázist nyitni!"); if (!dbmexists($dbm, $login)) // ha nem foglalt { $tomb = array($pwd, $email); $ertek = serialize($tomb); dbminsert($dbm, $login, $ertek); dbmclose($dbm); //regisztralt belepeshez atiranyitas JavaScript segitsegevel echo ("<script>"); echo ("alert(A regisztráció
sikeres);"); echo ("location.replace(indexphp);"); echo("</script>"); exit(); } else $hiba = "ilyen login már van!"; } ?> <html> <head> <title>DBM adatbázis - jelszavas belépés</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-88592"> <style type="text/css"> <!-td { font-family: Arial, Helvetica, sans-serif; font-size: 10pt } .table { font-weight: bold; color: #330000; background-color: #FFFFCC; border: 1px #CC9933 solid } --> </style> </head> <body bgcolor="#FFFFFF"> <table width="100%" border="0" cellspacing="0" cellpadding="6" align="center"> 74/89 LVNROD PHP programozási nyelv *iERUpQHV) <tr> <td colspan="3"> <p> </p> <p> </p> </td> </tr> <tr> <td
width="25%"> </td> <td width="50%" > <form name="regisztracio" method="post" action=""> <div align="center"> <table width="350" cellspacing="0" cellpadding="3" class="table"> <tr> <td colspan="2" > <div align="center"> <p>Regisztrálás</p> </div> </td> </tr> <tr> <td width="100">login: </td> <td> <input type="text" name="login" size="15" maxlength="15" value="<? echo $login; ?>"> <? if ($hiba != "") echo ("<font color=#FF0000 size=2>".$hiba"</font>");?> </td> </tr> <tr> <td width="100">jelszó:</td> <td> <input type="password" name="pwd" size="15"
maxlength="15" value="<? echo $pwd; ?>"> </td> </tr> <tr> <td width="100">email: </td> <td> <input type="text" name="email" size="30" maxlength="30" value="<? echo $email; ?>"> </td> </tr> <tr> <td colspan="2" > <div align="center"> <input type="submit" name="Submit" value=" Belépés "> </div> </td> </tr> </table> </div> </form> </td> <td width="25%"> </td> </tr> </table> </body> </html> index.php fájl kódrészlete 75/89 LVNROD PHP programozási nyelv *iERUpQHV) <?php //ha kitoltottek a login es jelszo mezoket $loginhiba = ""; $jelszohiba = ""; if ($login != "" && $pwd != "") { //eloszor megnezzuk, van-e
ilyen login $dbm = dbmopen ("tagok.db", "w") or die("nem sikerült adatbázist nyitni!"); if (dbmexists($dbm, $login)) { //kiszedjuk a tarolt jelszot es osszevetjuk $tomb = unserialize(dbmfetch($dbm, $login)); dbmclose($dbm); if ($tomb[0] == $pwd) { echo ("<script>location.replace(belsophp?login="$login");</script>"); exit(); } else { $jelszohiba = "nem jó a jelszó!"; } } else { $loginhiba = "nincs ilyen login!"; dbmclose($dbm); } } ?> belso.php fájl kódrészlete <?php //ha kaptunk egy jelszomodositasi kerelmet: (mar tudjuk a logint is) //ha a jelszavak rendben vannak, kitoltve es azonosak if ($ujpwd1 != "" && $ujpwd1 == $ujpwd2) { //fel kell tolteni a szerverre egy tagok.db fajlt legelso alkalommal $dbm = dbmopen ("tagok.db", "w") or die("nem sikerült adatbázist nyitni!"); $tomb = unserialize(dbmfetch($dbm, $login)); $tomb[0] = $ujpwd; $ertek =
serialize($tomb); dbmreplace($dbm, $login, $ertek); dbmclose($dbm); } ?> WRYiEEIHMOHV]WpVLOHKHWVpJHN Szerkesszük össze a két DBM adatbázis példát egyetlen alkalmazásba és oldjuk PHJD]WLVKRJOHJ|UGOPHQEONLYiODV]WYDDWDJRNORJLQMiW]HQHWHWNOGKHVVQN adott személynek, aki ezt belépésekor rögtön láthatja is a belso.php fájl erre a célra fenntartott paneljában. 76/89 LVNROD PHP programozási nyelv *iERUpQHV) (JV]HU&IyUXP]HQIDO specifikáció +R]]XQNOpWUHHJV]HU&IyUXPRWDKRODKR]]iV]yOiVRNDWLGUHQGEHQWQWHWMNIHO és lapozgathatunk a régebbi-újabb közlemények között, egyszerre adott számú tételt jelenítve meg. Mindenki hozzászólhat korlátozás nélkül, a hozzászóló nevét, becenevét (nick) és e-mail címét, valamint hozzászólását és annak rövid összefoglalását tüntetjük fel. Gondoskodjunk arról, hogy a szöveggel ne lehessen "elrontani" a fórumot! a feladat elméleti
háttere tervezés megvalósítás (kód) WRYiEEIHMOHV]WpVLOHKHWVpJHN /iWRJDWyV]iPOiOiVHJV]HU& specifikáció Számolni akarjuk látogatóinkat és ezt az adatot tárolni is akarjuk. Ki akarjuk vé- GHQLYLV]RQWDPDQLSXOiOiVLOHKHWVpJHNHWD]D]QHOHKHVVHQS|UJHWpVVHO IULVVtWpV JRPEEDO~MUDW|OWYHD]ROGDOW OiWRJDWyV]iPRWQ|YHOQL9DODPLOHQV]LQW&OiWRJDWyD]onosítást (például IP cím) is el akarunk végezni. a feladat elméleti háttere tervezés megvalósítás (kód) 77/89 LVNROD PHP programozási nyelv *iERUpQHV) WRYiEEIHMOHV]WpVLOHKHWVpJHN Látogató számlálás - statisztika specifikáció $]HO]IHODGDWWRYiEEIHMOHV]WpVHH]~WWDODV]iPROiVPHOOHWWD]HJHVROGDODN látogatottságát is fel akarjuk mérni. Külön kérésre kapjunk táblázatos összefoglalást az ROGDODNOiWRJDWRWWViJiUyODPHJIHOHOV]&UpVHNPHOOHWW.LDNDUMXNYpGHQLYLV]RQWDPaQLSXOiOiVLOHKHWVpJHNHWD]D]QHOHKHVVHQS|UJHWpVVHO
IULVVtWpVJRPEEDO~MUDW|OWYHD] ROGDOW OiWRJDWyV]iPRWQ|YHOQL9DODPLOHQV]LQW&OiWRJDWyD]RQRVtWiVW SpOGiXO,3FtP is el akarunk végezni. a feladat elméleti háttere tervezés megvalósítás (kód) WRYiEEIHMOHV]WpVLOHKHWVpJHN Képek kirakása, képgalériák specifikáció Egy könyvtárba töltjük fel képeinket és ezeket akarjuk megmutatni, egyszerre PLQGLJFVDNDGRWWV]iP~GDUDERW%HPXWDWiVXNKR]HOV]|UN|U|PQLPpUHW& WKXPEQDLO DGRWWpVHJVpJHVV]pOHVVpJ&NpSHNHWUHQGH]QNHODIHOOHWHQH]HNUHNDt- tintva viszont megjelenítMNDWHOMHVPpUHW&NpSHWHJIHOEXNNDQyDEODNEDQ a feladat elméleti háttere 1HIHOHMWVNHOHOOHQUL]QLDSKSLQLIiMOEHiOOtWiVDLW$JUDILNDLIJJYpQFVRPDJ alapértelmezetten nem áll rendelkezésre, a PHPTriad esetében például a php.ini fájlban 78/89 LVNROD PHP programozási nyelv *iERUpQHV) DNLWHUMHV]WpVHN :LQGRZVH[WHQVLRQV UpV]EHQD]H[WHQVLRQ SKSBJGGOOEHMHJ]pVHOO ki kell venni a
kommentezésre használt ";" jelölést. tervezés megvalósítás (kód) WRYiEEIHMOHV]WpVLOHKHWVpJHN Dinamikus képek - felirat készítés specifikáció )RWyJ&MWHPpQQNHWV]HUHWQpQNPHJMHOHQtWHQLDZHEHQGHQHPDNDUMXNKRJ bárki letölthesse és felhasználhassa. Ennek egyik lehetséges megoldása, hogy minde- JLNHQHOKHOH]QNHJV]HU]LMRJXQNDWGHNODUiOyIHOLUDWRWGHH]WQHPDNDUMXNNppszerkesztéssel megoldani, nem akarjuk "elrontani" a képeinket. a feladat elméleti háttere tervezés megvalósítás (kód) WRYiEEIHMOHV]WpVLOHKHWVpJHN LQDPLNXVNpSHNHJV]HU&LGRPRNNLUDM]ROiVD specifikáció +R]]XNOpWUHHJSLURVKiWWpUV]tQ&NpSHWDPHOEHQNpWNpNKDViERWKHOH]QNHO $KDViERNV]pOHVVpJHDGRWWPLQGLJSL[HOPpUHW&HNGHPDJDVViJXNYiOWR]yD] egyik a mindenkori képmagasság 50, a másik a 75 százaléka. A kép mérete legyen vál79/89 LVNROD PHP programozási nyelv *iERUpQHV)
WR]WDWKDWy&UODSRQNHUHV]WOW|UWpQDGDWEHYLWHOOHO V]pOHVVpJPDJDVViJ GHDKDViERN mindig az kép alapjához igazodjanak. Készítsünk egy feliratot is a képre, a "Hasábok" V]yWtUMXNNLDNpSIHOVUpV]pUH1HPNHOONO|QHOOHQU]pVWYpJH]QLD]HJHVHOHPHN elhelyezéséhez, tételezzük fel, hogy a képméret változtatásánál nem visznek be irreális értékeket. a feladat elméleti háttere A feladat lényege a PHP képkezelési elvének megértése. Az ezt szolgáló függvé- QHNHWD*QHY&FVRPDJWDUWDOPD]]DDPHOHWEHNHOOiOOtWDQLDIJJYpQHNHOpUpVH pUGHNpEHQ$NpSOpWUHKR]iVDDN|YHWNH]OpSpVHNEOiOO Alapelv, hogy HTML oldalba illesztett kép esetén létre kell hozni az oldalon a kép HTML hivatkozását, azaz bele kell írni/szerkeszteni a kódba az <img width="ddd" height="ddd"> src=kep.php képet meghatározó tag-et, amelyben a kep.php fájlnév a létrehozandó kép leírását tartalmazó PHP fájl neve
és a szélesség, magasság attribútumok opcionálisak, illetve általában a képet leíró fájlban adjuk meg (ez különösen akkor igaz, ha dinamikusan változik a képméret adott határok között). $NpSHWOHtUyIiMOYDOyEDQHJIiMOKR]OpWUHWHKiWHOV]|UHJKHDGHUXWDVtWiVWNldünk ki, meghatározva a kép típusát (jpg, png, stb.) Ezt követi a kép alapjának23 létrehozása az imagecreate() függvénnyel, amelynek paraméterei a kép szélesség, magasság adatai és visszatérési értéke a szokásos logikai értéken túl (sikeres/sikertelen végrehajtás) a kép azonosítója (például $img). Utána színeket határozhatunk meg, alapértelme]pVEHQD]HOVPHJKDWiUR]RWWV]tQDKiWWpUV]tQH(]HNHWN|YHWLNDNLtUyXWDVtWiVRN DPHOHND*FVRPDJYHU]LyMiWyOpVDN|UQH]HWWOIJJHQHOWpUKHWQHND]D]H]WDMinlatos kipróbálni a megcélzott futtató rendszeren is. Ha szöveget is ki akarunk írni, akkor HOV]|UPHJNHOOKDWiUR]QLDKDV]QiODQGyIRQWNpV]OHWHW
PHJNHOODGQLDQQDNHOpUpVL~tMiWKDD]DODSpUWHOPH]HWWOHOWpUIRQWRNDWDNDUXQNKDV]QiOQL PDMGSR]LFLRQiOWNLtUiVW NpV]tWQN$]XWDVtWiVVRUR]DWRWDNpSQHNPHJIHOHOimagepng($img) vagy imagejpg($img)IJJYpQ]iUMDOHDPHOOpWUHKR]]DDIiMOEDQD]HOEELXWDVtWiVRNNDO lert képet. Természetesen a kép akkor is létrejön, ha nem HTML-be ágyazva készítjük, DNNRUHJN|]|QVpJHVNpSIiMONDSXQNDOHtUiVQDNPHJIHOHOHQ H]WDYLVHONHGpVWNLOHKHW SpOGiXOKDV]QiOQLGLQDPLNXVDQPHJMHOHQIHOLUDWRNNpV]tWpVpUH 23 grafikai rendszerekben ez a "canvas", azaz vászon, az olajfestmények ugyanis vászonra készültek 80/89 - LVNROD PHP programozási nyelv *iERUpQHV) )RQWRV1HIHOHMWVNHOHOOHQUL]QLDSKSLQLIiMOEHiOOtWiVDLW$JUDILNDLIJJYpQycsomag alapértelmezetten nem áll rendelkezésre, a PHPTriad esetében például a php.ini fájlban a kiterjesztések (Windows extensions) részben az extension=php gd.dll
bejegy]pVHOONLNHOOYHQQLDNRPPHQWH]pVUHKDV]QiOWMHO|OpVW tervezés 3URJUDPWHUYH]pVUOLWWQHPQDJRQEHV]pOKHWQNLQNiEEDJUDILNDLWHUYH]pVD fontos. Létre kell hozni a képet leíró kepphpHVD]H]WPHJMHOHQtWkephtmlphp fájlokat (]XWyEELWDUWDOPD]HJEHYLWHOL&UODSRWLVDPpUHWYiOWR]WDWiViKR]+DQLQFVpUWpNPHgadva, alapértelmezett méreteket határozunk meg. Felhívom a figyelmet egy JavaScript trükkre - a form objektum nevet kapott (bevitel) és így hivatkozni tudunk annak submit() metódusára (javascript:document.bevitelsubmit()) így egy linkre kattintva, DXWRPDWLNXVDQD]RQ&OLFNHVHPpQNH]HOK|]NDSFVROWDQLVPHJYDOyVtWKDWyDIRUPHlküldése. megvalósítás (kód) kephtml.php fájl kódja <html> <head> <title>Kepek megjelenitese</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-88592"> </head> <body bgcolor="#FFFFFF"> <? if ($sz != ""
&& $m != "") echo ("<p><img src="kep.php?sz="$sz"&m="$m""></p>"); else echo ("<p><img src="kep.php"></p>"); ?> <p> </p> <form name="bevitel" method="post" action=""> <table width="50%" border="0" cellspacing="0" cellpadding="6" align="center"> <tr> <td>képszélesség</td> <td> <input type="text" name="sz" size="3" maxlength="3" value= <? echo $sz; ?> > </td> </tr> <tr> <td>képmagasság</td> <td> <input type="text" name="m" size="3" maxlength="3" value= <? echo $m; ?> > </td> </tr> 81/89 LVNROD PHP programozási nyelv *iERUpQHV) <tr> <td><a
href="javascript:document.bevitelsubmit()"><font size="2" face="Arial" color="#FF0000" ><b>Adatbevitel</b></font></a> </td> <td> <input type="submit" name="Submit" value=" Adatbevitel "> </td> </tr> </table> </form> </body> </html> kep.php fájl kódja <?php //keptipus meghatarozasa header ("Content-type: image/png"); //alapertelmezett ertekek kiosztasa if (!isset($sz) && !isset($m)) { $sz = 200; $m = 200; } //kepalap letrehozasa $img = @ImageCreate ($sz, $m) or die ("Nem inicializalodik az uj GD image stream"); //szinek meghatarozasa $hatter szin = ImageColorAllocate ($img, 255, 0, 0); $szoveg szin = ImageColorAllocate ($img, 0, 0, 255); //sikidomok kirajzolasa ImageRectangle($img, $sz/2, $m/2, $sz/2+20, $m, $szoveg szin); ImageFill($img, $sz/2+5, $m/2+5, $szoveg szin); ImageRectangle ($img, $sz/4*3,
$m/43, $sz/43+20, $m, $szoveg szin); ImageFill($img, $sz/4*3+5, $m/43+5, $szoveg szin); //fontkeszlet meghatarozasa $font = "c:windowsfontsarial.ttf"; //felirat elkeszitese ImageTTFtext($img, 12, 0, 10, 20, $szoveg szin, $font, "Hasábok"); //a kep osszeallitasa az utasitasoknak megfeleloen ImagePng ($img); ?> WRYiEEIHMOHV]WpVLOHKHWVpJHN D .pV]tWVQNNO|QE|]NLW|OW|WWpVN|UYRQDODVVtNLGRPNLUDM]ROiVRNDW E +R]]XQNOpWUHYpOHWOHQV]HU&HQPHJMHOHQWpJODODSRWDNpSHQDPHOHN színei is változnak minden egyes kirajzoláskor. Dinamikus képek - oszlopdiagram kirajzolása specifikáció .pWIHODGDWRWROGXQNPHJHEEHQDSpOGiEDQD]HOVHVHWpEHQDJUDILNRQRV]ORSDi- nak adatait egy tömb biztosítja és elrendezésüket a kép leírásában meghatározzuk, a 82/89 LVNROD PHP programozási nyelv *iERUpQHV) második esetben viszont majdnem mindent a kép méreteihez viszonyítva rajzolunk ki és az adatokat fájlból vesszük. Ebben az
esetben az az összehasonlítandó elemek száma is változhat bizonyos logikus határok között, de a kép kirakásakor egyenletesen elosztjuk az oszlopokat a rendelkezésre álló képfelületen. a feladat elméleti háttere $]HOPpOHWOpQHJpEHQPHJHJH]LND]H]WPHJHO]IHODGDWEDQOHtUWDNNDOLWWFVDN DOHJIRQWRVDEEUpV]pWLVPpWHOMNPHJKRJDIHODGDW|QPDJiEDQLVpUWKHWOHJHQ $NpSHWOHtUyIiMOEDQHOV]|UHJKHDGHUXWDVtWiVWNOGQNNLPHJKDWiUR]YDDNpS típusát (jpg, png, stb.) Ezt követi a kép alapjának létrehozása az imagecreate() függvénnyel, amelynek paraméterei a kép szélesség, magasság adatai és visszatérési értéke a szokásos logikai értéken túl (sikeres/sikertelen végrehajtás) a kép azonosítója (például $img 8WiQDV]tQHNHWKDWiUR]KDWXQNPHJDODSpUWHOPH]pVEHQD]HOVPHJKDWiUR]RWWV]tQ DKiWWpUV]tQH+DV]|YHJHWLVNLDNDUXQNtUQLDNNRUHOV]|UPHJNHOOKDWiUR]QLDKDVz- nálandó fontkészletet majd pozicionált kiírást
készítünk. Az utasítás sorozatot a képnek PHJIHOHOimagepng($img) vagy imagejpg($img) függvény zárja le, amely létrehozza a IiMOEDQD]HOEELXWDVtWiVRNNDOOHtUWNpSHWLQDPLNXVDQYiOWR]yHOHPHNHVHWpEHQPLQW például ezek az oszlopdiagrammok - gondoskodni kell az elemek algoritmus segítségéYHOW|UWpQHOUHQGH]pVpUOLVLOOHWYHIiMOEOW|UWpQDGDWiWYpWHOHVHWpQDIiMONLROYDViVáról. Látható, hogy a képet leíró fájl egy teljes PHP program, amely minden szükséges adatot és adatforrást önmagában kezelni képes, azonban paraméterként is átvehet értékeket (például egy adatokat tartalmazó tömböt). 1HIHOHMWVNHOHOOHQUL]QLDSKSLQLIiMOEHiOOtWiVDLW$JUDILNDLIJJYpQFVRPDJ alapértelmezetten nem áll rendelkezésre, a PHPTriad esetében például a php.ini fájlban DNLWHUMHV]WpVHN :LQGRZVH[WHQVLRQV UpV]EHQD]H[WHQVLRQ SKSBJGGOOEHMHJ]pVHOO ki kell venni a kommentezésre használt ";" jelölést. tervezés Egy grafikonok.php
fájl biztosítja a HTML környezetet a megjelenítéshez és az adatok.txt a kirajzolásra váró adatokat A grafikon 1php és a grafikon 2php biztosítja a kétféle grafikon leírását. megvalósítás (kód) grafikon 1.php fájl kódja 83/89 LVNROD PHP programozási nyelv *iERUpQHV) <?php header ("Content-type: image/png"); $tomb = array(100, 120, 190, 250, 40); $img = @ImageCreate (400, 300) or die ("Nem inicializalodik az uj GD image stream"); $hatter szin = ImageColorAllocate ($img, 255, 0, 0); $szoveg szin = ImageColorAllocate ($img, 0, 0, 255); $x = 50; for ($i=0; $i<count($tomb); $i++) { ImageRectangle ($img, $x, (300-$tomb[$i]), ($x+20), 300, $szoveg szin); ImageFill($img, ($x+2), 290, $szoveg szin); $x += 70; } $font = "c:windowsfontsarial.ttf"; ImageTTFtext($img, 12, 0, 10, 20, $szoveg szin, $font, "Grafikon PHPvel megjelenitve"); //ImageColorTransparent($img, $hatter szin); ImagePng ($img); ?> <?php header
("Content-type: image/png"); $tomb = array(100, 120, 190, 250, 40); $img = @ImageCreate (400, 300) or die ("Nem inicializalodik az uj GD image stream"); $hatter szin = ImageColorAllocate ($img, 255, 0, 0); $szoveg szin = ImageColorAllocate ($img, 0, 0, 255); $x = 50; for ($i=0; $i<count($tomb); $i++) { ImageRectangle ($img, $x, (300-$tomb[$i]), ($x+20), 300, $szoveg szin); ImageFill($img, ($x+2), 290, $szoveg szin); $x += 70; } $font = "c:windowsfontsarial.ttf"; ImageTTFtext($img, 12, 0, 10, 20, $szoveg szin, $font, "Grafikon PHPvel megjelenitve"); //ImageColorTransparent($img, $hatter szin); ImagePng ($img); ?> grafikon 2.php fájl kódja <?php header ("Content-type: image/png"); //header ("Content-type: image/jpeg"); $kep szeles = 400; $kep magas = 300; $szeles = 15; $tav = 50; $font = "c:windowsfontsarial.ttf"; 84/89 LVNROD PHP programozási nyelv *iERUpQHV) $fp = fopen("adatok.txt",
"r"); $sor = fgets($fp, 1024); $tomb = explode(" ", $sor); fclose($fp); $tav = ($kep szeles - count($tomb)* $szeles)/(count($tomb)+1); $img = @ImageCreate($kep szeles, $kep magas) or die ("Nem inicializalodik az uj GD image stream"); $hatter szin = ImageColorAllocate ($img, 254, 207, 137); $szoveg szin = ImageColorAllocate ($img, 166, 64, 0); $x = $tav; for ($i=0; $i < count($tomb); $i++) { ImageRectangle ($img, $x, ($kep magas - intval($tomb[$i])), ($x+$szeles), $kep magas, $szoveg szin); ImageTTFtext($img, 11, 0, $x, ($kep magas -10 intval($tomb[$i])), $szoveg szin, $font, "$tomb[$i]"); ImageFill($img, ($x+2), ($kep magas-2), $szoveg szin); $x += $tav + $szeles; } ImageTTFtext($img, 12, 0, 10, 20, $szoveg szin, $font, "Grafikon PHPvel megjelenitve, adatok fajlbol es auto rendezes"); ImagePng($img); //ImageJpeg ($img, , 100); ?> WRYiEEIHMOHV]WpVLOHKHWVpJHN Dinamikus képek - vonaldiagram kirajzolása specifikáció
ÈEUi]ROMXQNHJLGEHQYiOWR]yWXODMGRQViJRWSpOGiXODQDSLN|]pSKPpUVpNOe- WHNHWHJKpWHQNHUHV]WOYRQDODVGLDJUDPPRQ$]HJV]HU&VpJNHGYppUWD]DGDWRNDW HJW|PEEOYHVV]NGHPiVDGDWIRUUiVRNLVV]yEDM|KHWQHNDWRYiEEIHMOHV]WpVVRUiQ a feladat elméleti háttere 1HIHOHMWVNHOHOOHQUL]QLDSKSLQLIiMOEHiOOtWiVDLW$JUDILNDLIJJYpQFVRPDJ alapértelmezetten nem áll rendelkezésre, a PHPTriad esetében például a php.ini fájlban DNLWHUMHV]WpVHN :LQGRZVH[WHQVLRQV UpV]EHQD]H[WHQVLRQ SKSBJGGOOEHMHJ]pVHOO ki kell venni a kommentezésre használt ";" jelölést. tervezés 85/89 LVNROD PHP programozási nyelv *iERUpQHV) megvalósítás (kód) WRYiEEIHMOHV]WpVLOHKHWVpJHN Szavazógép kódolása specifikáció .pV]tWVQNV]DYD]yJpSHWDPHOWHWV]pVV]HULQWHOKHOH]KHWD]ROGDORQIJJOe- JHVHOUHQGH]pVEHQDNpUGpVHNV]iPiQDNPHJIHOHOV]iP~UiGLyJRPEEyOpVIHOLUDWEyOiOO és a szavazógép beillesztéséhez csupán a
kérdéseket kelljen megadni, akár fájlban, akár tömb formájában, onnét minden automatikus legyen. Egy Szavazok és egy a Szavazás állásaIHOLUDW~JRPEOHJHQPLQGHJLNDIHOLUDWiQDNPHJIHOHOHQP&N|GM|Q$V]DYa- ]DWRNQiOQHPNHOODIHOKDV]QiOyNDWD]RQRVtWDQLpVDOHJHJV]HU&EEYiOWR]DWQiODS|UJetést" sem védjük ki (az oldal frissíWpVVHOW|UWpQ~MUDW|OWpVH a feladat elméleti háttere tervezés megvalósítás (kód) WRYiEEIHMOHV]WpVLOHKHWVpJHN Felmérés készítése specifikáció a feladat elméleti háttere 86/89 LVNROD PHP programozási nyelv *iERUpQHV) tervezés megvalósítás (kód) WRYiEEIHMOHV]WpVLOHKHWVpJHN Tesztprogram kódolása specifikáció a feladat elméleti háttere tervezés megvalósítás (kód) WRYiEEIHMOHV]WpVLOHKHWVpJHN (OOHQU]NpUGpVHN Irodalomjegyzék Perl • Programming Perl, Larry Wall és Randal L. Schwartz, OReilly & Associates, Inc Sebastopol, Kalifornia ISBN 0-93715-64-1 •
Learning Perl, Randal L. Schwartz, OReilly & Associates, Inc, Sebastopol, Kalifornia • Perl 1-2. Michael McMillan, Panem Könyvkiadó, Budapest, 1998 87/89 LVNROD PHP programozási nyelv • *iERUpQHV) www.perlcom PHP • • • • http://www.developerfusioncom/php/ - PHP oktatóanyagok, cikkek, gyakorlati példák • http://pear.phpnet/D3($5RV]WiON|QYWiUpVFVRPDJRNOHOKHOH • http://www.phpnet/ a PHP "hivatalos" webhelye • http://www.zendcom/ D3+3LQWHUSUHWHUNLIHMOHV]WLQHNZHEROGDODNHUHVNHGHOPL megoldások is! • http://pointernet.mirrorsphpclassesorg/browsehtml/browsehtml - PHP osztályok lelhelye, leírások 3+3IHMOHV]WHV]N|]|N • Abriasoft Merlin Server www.abriasoftcom • FoxServer www.foxservnet • FoxSev http://foxserv.linuxmaxnet/portalphp apache+php+mysql+perl+python+myadmin 37mb xp-n is fut • merlin server http://www.abriasoftcom/ 28mb • phptriad http://sourceforge.net/projects/phptriad/ 11mb xp-n
is megy • EasyPHP Hasznos linkek (mind a szerver oldali, mind a kliens oldali programozáshoz) $]HJHVZHEROGDODNQDJRQJDNUDQUHIHUHQFLDMHOOHJ&HNWHKiWDNtQiOWSpOGiNRNWDWóDQDJRNIRUUiVNyGRNW|EENO|QE|]KHOHQIRUGXOQDNHOpVSHUV]HNHUHV]WKLYDWNR]áVRNLVHOIRUGXOQDN$KLYDWNR]iVRNiOWDOiEDQNHOOLQIRUPiFLyWN|]|OQHND]HOLJD]o- dáshoz (mit találhatunk a hivatkozott webhelyen), amennyiben erre nem történik utalás DOLQNV]|YHJpEHQRWWW|EEQLUHJ&MWHPpQHVZHEROGDODNUDKLYDWNR]QDN6]iQGpNRVDQ nincs megadva fontossági sorrend, ezt mindenki tegye meg saját ízlése és egyéni igé- QHLDODSMiQ$OLQNHNPLQGHOOHQU]|WWpVpOZHEKHOHNUHPXWDWWDNDNp]LUDWOpWUHM|WWe88/89 LVNROD PHP programozási nyelv *iERUpQHV) NRU RNWyEHUPiUFLXV GHWHUPpV]HWHVHQH]QHPJDUDQFLDDNpVEELIHOWa- OiOKDWyViJUD$]|VV]HiOOtWiVPHVV]HQHPWHOMHVpVWHUPpV]HWHVHQWNU|]LDV]HU]V]e-
PpOHVWDSDV]WDODWDLWLUiQXOWViJiW8JDQDNNRUPLQGHQLWWQHPV]HUHSOQHPKLYDWNo- ]RWWGHD]ROYDVyiOWDOMyOKDV]QiOKDWyQDNWDUWRWWROGDOWV]tYHVHQEHLOOHV]WHNDJ&MWe- PpQEHNpUHPKRJH]HNOLQNMHLWMXWWDVViNHOKR]]iPDMHJ]HWIRODPDWRVEYtWpVH és naprakész jelleJHPHJU]pVHpUGHNpEHQ 0DJDUQHOY&ROGDODN - http://www.ats-groupnet/webmaster többféle téma a webfejlesztés témakörében - www.proghu sokféle programozási téma, csoportosítva - www.weblaborhu cikkek, ötletek, sok PHP - http://hu.phpnet/manual/hu/D3+3PDJDUQHOY&GRNXPHQWiFLyMD - www.javascriptlaphuPLQGHQDPLWD-DYD6FULSWUOWXGQLOHKHW« $QJROQHOY&ROGDODN - http://www.evilwalruscom/codearchivephp - www.hotscriptscom - http://php.resourceindexcom/Complete Scripts/ - px.sklarcom/HOVVRUEDQ3+3 - http://www.phporacleadminorg/ - http://www.phpbuildercom - http://www.zendcom/zend/tut/ PHP oktató cikkek (tutorial) - http://www.onlampcom/php/ vegyes
anyagok, PHP cikkek - http://phplens.com/lens/ néhány érdekes alkalmazás - http://phpnuke.org/ automatikus portálrendszer PHP-ben - http://www.mysqlcom/ minden, amit a MySQL adatbázisról tudni kell/lehet - http://www.weberdevcom/ JavaScript, PHP, MySQL cikkek, forráskódok 89/89