diploma aktiv weboldal keszites php asp

91
DIPLOMAMUNKA Webes aktív oldalak készítése adatbázis eléréssel, HTML és programkód elkülönítésének lehetősége. Eötvös Loránd Tudományegyetem Természettudományi Kar Programtervező matematikus szak Nappali tagozat Budapest, 2003 Készítette: Újfalusi Krisztián Témavezető: Nikovits Tibor

Upload: krisztian-ujfalusi

Post on 04-Jul-2015

1.062 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Diploma Aktiv Weboldal Keszites Php ASP

DIPLOMAMUNKA

Webes aktív oldalak készítése adatbázis eléréssel, HTML és programkód elkülönítésének lehetősége.

Eötvös Loránd Tudományegyetem Természettudományi Kar

Programtervező matematikus szak

Nappali tagozat

Budapest, 2003

Készítette: Újfalusi Krisztián

Témavezető: Nikovits Tibor

Page 2: Diploma Aktiv Weboldal Keszites Php ASP

Tartalomjegyzék 1. Bevezetés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.1. Alapfogalmak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.2. Windows alatt IIS webkiszolgáló telepítése . . . . . . . . . . . . . . 6 1.3. Linux alatt Apache webkiszolgáló és PHP telepítése . . . . . . . . 7 1.4. Microsoft SQL szerver telepítése Windows alatt . . . . . . . . . . . 8 1.5. MySQL telepítése Linux alatt . . . . . . . . . . . . . . . . . . . . . . . . 10 2. Webes aktív oldalak készítése adatbázis eléréssel . . . . . 11 2.1. Webkiszolgálók SSI opciója . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.2. ASP illetve PHP működési modellje . . . . . . . . . . . . . . . . . . . . 13 2.3. ASP illetve PHP oldalak létrehozása . . . . . . . . . . . . . . . . . . . 14 2.4. Változók és állandók létrehozása, hatókörük ASP-ben . . . . . . . 16 2.5. Változók és állandók létrehozása, hatókörük PHP-ben . . . . . . . 19 2.6. Munkamenet változók használata ASP-ben és PHP-ben . . . . . . 23 2.7. Megjegyzések, utasítások írása ASP-ben és PHP-ben. . . . . . . . 27 2.8. Operátor, kifejezés, elágazás, ciklus, eljárás ASP-ben . . . . . . . 28 2.9. Operátor, kifejezés, elágazás, ciklus, eljárás PHP-ben . . . . . . . 30 2.10. Fájlok beágyazása ASP-ben és PHP-ben. . . . . . . . . . . . . . . . . 33 2.11. Űrlapadatok feldolgozása ASP-ben és PHP-ben. . . . . . . . . . . . 34 2.12. Sütik (cookie-k) használata ASP-ben és PHP-ben . . . . . . . . . . 37 2.13. Adatbáziskapcsolat ASP-ben és PHP-ben . . . . . . . . . . . . . . . . 39 3. HTML és programkód elkülönítésének lehetősége . . . . . . 42 3.1. Elkülönítés megvalósítása ASP-ben . . . . . . . . . . . . . . . . . . . . 42 3.2. Elkülönítés megvalósítása PHP-ben . . . . . . . . . . . . . . . . . . . . 43 4. Példaprogram . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 5. Mellékletek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 5.1. Microsoft SQL Server 2000 telepítésének folyamata . . . . . . . . 48 5.2. IIS webszerver előre definiált változói ASP-ben . . . . . . . . . . . 53 5.3. Apache webszerver előre definiált változói PHP-ben. . . . . . . . . 56 5.4. PHP előre definiált változói és állandói. . . . . . . . . . . . . . . . . . 57 5.5. ASP-ben megvalósított statisztikai rendszer forráskódja. . . . . . 58 5.6. PHP-ben megvalósított statisztikai rendszer forráskódja. . . . . . 75 6. Irodalomjegyzék. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91

Page 3: Diploma Aktiv Weboldal Keszites Php ASP

1. Bevezetés 3 / 91

1. Bevezetés

Napjainkban igen jelentős szerepet tölt be az Internet. Amikor egy oldalt töltünk le a távoli webkiszolgáló szerverről, aközben igen sokféle folyamat zajlik le. A diplomamunkám első részében röviden szólnék ennek a technikai hátteréről, vagyis hogyan történik valójában egy hivatkozás feloldása, az ott található információ letöltése.

A komolyabb oldalak elkészítéséhez szükség van dinamikusságra és interaktivitásra.

Ezért a HTML kódokba különféle parancsfájlkódok kerülhetnek. Ezek lehetnek kliens oldaliak, de ebben az esetben a böngésző kliens programnak tudnia kell értelmezni és futtatni a parancsfájlkódokat. Ilyen például a Javascript, Java alkalmazások, Flash objektumok. Általában az ilyen oldalakat statikus HTML oldalnak nevezzük. Ezzel szemben a dinamikus HTML oldalak szerver oldali parancsfájlkódokat tartalmaznak, amelyeket a kiszolgáló futtat le és a végeredmény a kliens számára egy statikus HTML oldal lesz.

Diplomamunkámban a szerver oldali parancsfájlkódok írásával foglalkozom. Első

részben azzal, hogy hogyan is kell telepíteni egy ilyen webkiszolgálót Windows operációs rendszer alatt, valamint Linux operációs rendszer alatt. Windows alatt jellemző webszerver az IIS (Internet Information Server) és a szerveroldali parancsfájl nyelv az ASP (Active Server Pages). Linux alatt a legelterjedtebb és legjobban támogatott nyílt forráskódú Apache webszerver a jellemző, valamint a legszélesebb körben használt PHP (Hypertext Preprocessor). Megjegyezném, mivel az Apache és a PHP is nyílt forráskódú programok, ezért létezik Windows operációs rendszer alá telepíthető változat is. A PHP és ASP parancsfájl nyelvet hasonlítom össze. Kitérnék arra, hogyan lehet adatbázis-kiszolgálóval összekapcsolni a dinamikus oldalainkat az egyes parancsfájl nyelvek segítségével. A Windows operációs rendszer alatt a Microsoft SQL 2000 Server a legelterjettebb, a komolyabb aktív weboldalak adatbázisa ilyen szerverhez kapcsolódik. Linux alatt több szintén nyílt forráskódú SQL szerver található, én MySQL szervert használatát mutatom be. Megjegyezném, ennek szintén van Windows alá átültetett verziója.

A diplomamunkám második felében bemutatom, hogy miként lehet a HTML

kódsorokat a parancsfájl kódsoroktól a lehető legjobban elkülöníteni, ezzel szétválasztva a webprogramozók és a webdesignerek munkáját.

Vagyis egy weblap fejlesztése során a következő lépések adódhatnak:

- adatbázisok kialakítása; - adatokkal való feltöltése; - adatbázisból történő lekérdezések és módosítások leprogramozása; - tényleges HTML kódok, azaz a design kialakítása.

Legvégül egy egyszerű alkalmazást mutatok be, amely a weboldalak látogatottságát

méri, oly módon, hogy adatbázisban tárolja a különféle letöltéssel kapcsolatos információkat. Ezek az információk, hogy az adott oldalt mikor töltötték le, milyen IP címről, és a kliens program milyen kliens információt közölt a webkiszolgálóval.

Page 4: Diploma Aktiv Weboldal Keszites Php ASP

1. Bevezetés 4 / 91

1.1. Alapfogalmak Az alábbi táblázatban szeretném összefoglalni azokat az alapfogalmakat, amelyekre a

diplomamunkám során hivatkozom. Ezeknek jelentősége van a webkiszolgálók beállításánál és böngésző programoknál is. A magyarázatok inkább áttekintő jellegűek, nem a teljes és pontos definíciók, inkább tömör és számomra lényeges tulajdonságaiknak a leírása.

Alapfogalom Magyarázat

TCP/IP: Az Internet alapprotokollja. Az IP protokoll felelős a két entitás közti kommunikáció lebonyolításáért. Az entitások rendelkeznek egy 32 bites egyedi IP címmel, és csomagkapcsolt hálózaton keresztül kommunikálnak egymással. A TCP (Transport Control Protocol) gondoskodik arról, hogy az adatkommunikáció sorrendtartó és veszteségmentes legyen. Létezik olyan IP protokoll is, amely nem sorrendtartó és nem garantált a csomagok megérkezése sem, ez az UDP.

IP cím: Entitás egyedi azonosítója. Jellemzően még az IPv4 használatos, amely 32 bites címeket használ, így 232 entitás címzését teszi lehetővé. Pl. egy ilyen lehetséges IP cím 101.102.103.104. Már sok helyen megtalálható a következő generációs IP protokoll, amely IPv6 nevet kapta és 128 bites címeket használ, így már 2128 entitás kommunikációját teszi lehetővé.

Entitás: Általában egy olyan eszközt értünk alatta, amely önálló IP címmel rendelkezik és kapcsolódik az Internethez. Jellemzően ez valamilyen kiszolgálót takar, amely rendelkezik egy hálózati interfésszel és operációs rendszerrel, amely azt használni tudja. Mivel egy kiszolgálónak lehet több hálózati interfésze is, vagy egy hálózati interfésznek több IP címet is adhatunk, ezért egy kiszolgáló nem feltétlen azonos az entitás fogalmával.

DNS: Domain Name System. Mivel az IP címeket nehéz fejben tartani, ezért általában egy entitás IP címére név alapján hivatkozunk. Ennek a feloldását végzi a DNS protokoll. Egy konkrét nevet egy bizonyos úgynevezett TLD (Top Level Domains) alá lehet regisztrálni. Minden országnak a sajátja TLD-je, pl. Magyarországnak .HU, valamint vannak még az úgynevezett gTLD (generic Top Level Domains), mint pl. .COM, .NET, .ORG, .INFO, .BIZ, amely alá szinte bárki regisztráltathat nevet, aki az ICANN szabályainak eleget tesz. Új domain nevek létrehozásával kapcsolatos ügyeket általában a NIC.TDL, pl. Magyarország esetén a http://www.nic.hu címen tudhatjuk meg. Legyen pl. egy első szintű domain név: cegnev.hu. Ez alá a tulajdonosa tetszőleges subdomaint állíthat be. Egy-egy ilyen domain név illetve subdomain, pl. www.cegnev.hu, mutat egy IP címre. Természetesen egy IP címre több ilyen domain név is mutathat, ezeket alias-oknak nevezzük, más néven host-nak, vagy hostname-nak (magyarul, hoszt, vagy hosztnév). Számunkra ez a fontosabb, ugyanis a névfeloldás során a hosztnév által mutatott IP címet kapjuk meg. Általában le lehet kérdezni egy adott IP címhez tartozó domain nevet is, ebből csak egy létezhet az úgynevezett RDNS (Reverse DNS). Ez egy speciális ága a DNS fának, nevezetesen .IN-ADDR.ARPA ágban helyezkedik el, előtte pedig szerepel az IP cím fordított sorrendben leírva.

Protokoll: A TCP/IP protokollra igen sok másik protokoll épül. Ezek különféle feladatok ellátásának szabványosítását teszik lehetővé. Ilyen például az SMTP, amely a levelezést (e-mail) teszi lehetővé; FTP (File Transfer Protocol); HTTP (Hypertext Transfer Protocol), amely a WEB böngészéskor használunk. Ezen kívül persze számos protokoll létezik még, pl.: NEWS, GOPHER, TELNET, SSH.

Page 5: Diploma Aktiv Weboldal Keszites Php ASP

1. Bevezetés 5 / 91

Alapfogalom Magyarázat Port: TCP/IP számunkra két entitás közti sorrendtartó és veszteségmentes

kommunikációt biztosítja. De az entitások egymással többféle módon is kapcsolódhatnak. Pl. az adott entitás egy kiszolgálószerver, amelyen levelezés, és web szolgáltatás is fut. Ezért az adott entitáson még 1 port is kapcsolódik az egyes alkalmazásokhoz, protokollokhoz, amely a TCP/IP protokoll része. Ezt a portot az operációs rendszeren keresztül lehet lefoglalni. A port egy 16 bites szám, így 0-65535 közti értékeket vehet fel. A legtöbb protokollnak van alapértelmezett portja. A HTTP alapértelmezett portja a 80-as port.

HTTP: A webszerver és a kliens közti kommunikációt biztosító protokoll. Létezik HTTPS protokoll is, ami a HTTP protokollt egy titkosított SSL (Secure Socket Layer) csatornába ágyazza be.

Webszerver, Webkiszolgáló:

A HTTP protokoll szerver oldali alkalmazása. A szerverprogram, vagyis a webkiszolgáló egy adott entitáson fut, tehát rendelkezik egy IP címmel, valamint alapértelmezés szerint az operációs rendszer TCP/IP alrendszerének a 80-as portját foglalja le, és oda érkező kérelmekre válaszol. A szerverre jellemző, hogy fix IP címmel rendelkezik.

Webes ügyfél, Webböngésző, Webes kliens:

A HTTP protokoll kliens oldali alkalmazása. Használata során hivatkozni kell egy webcímre (URL), amely alapján a megfelelő webkiszolgálóhoz fordul, ha létezik, és letölti, majd megjeleníti az ott található tartalmat. A hivatkozást egy úgynevezett URL formátumban kell megadni. Windows alatt a beépített webböngésző az Internet Explorer. Linux alatt igen sokféle szabadon elérhető webböngésző létezik, pl.: Opera, Netscape, Mozilla, Konquerer, Lynx, Links. Ezek egy részének Windows-os megfelelője is van.

URL: Uniform Resource Locator. Általános címzési formátum. A webböngészők is ezt használják. Felépítése a köveztkező: <protocol>://<hostname>:<port>/urlpath. Az alapértelmezett portok az egyes protokollok esetén elhagyhatók. HTTP esetén pl. a következőképpen néz ki: http://www.domain.hu/, vagy pl. http://httpd.apache.org:8080/doc/readme.html. A kliens a kiszolgáló felé a teljes URL cím szövegét is elküldi a kérelem során.

Virtualhost: A webkiszolgálóra jellemző beállítás. Egy adott hosztnévhez lehet megadni a beállításokat, főként a kezdőkönyvtár (DocumentRoot) paramétert sok más mellett. A webkiszolgáló az URL-el való hivatkozás esetén az adott hosztnévhez tartozó kezdőkönyvtárat [/var/www] egészíti ki az UrlPath-el [/dir1/file2.html], és a webkiszolgáló ezen az útvonalon elérhető állományt próbálja beolvasni [/var/www/dir1/file2.html] és küldeni a webes kliens felé. Van egy speciális hosztnév, a localhost, amelyet az operációs rendszerek hoznak létre. Feloldásakor a 127.0.0.1-es IP címet kapjuk, és ezzel saját magunkat címezhetjük meg. Lehetővé teszi, hogy saját szolgáltatásainkat elérjük, így pl. hálózat nélküli gépen olyan környezetet szimulálhatunk, mintha Internetre lennénk kötve.

CGI: Common Gateway Interface. Arra a célra fejlesztették ki, hogy a HTML űrlapok által elküldött adatokat bármely program által fogadni tudjuk, amelyet erre felkészítettek, vagy egy program kimenetét szeretnénk a webkiszolgálóval megjeleníttetni. Ezeket a CGI programokat a webkiszolgáló futtatja le, és adja át a programnak a paramétereket. Például: http://localhost/test.cgi?data=string hivatkozás esetén a test.cgi futáskor paraméterként megkapja a data változót, amely értéke a string lesz.

SSI: Server Side Include. Kiszolgáló oldali beágyazások, utasítások, amelyeket a webkiszolgáló hajt végre és az eredményt a HTML oldalakban szereplő speciális (SSI) megjegyzések helyére írja ki.

Page 6: Diploma Aktiv Weboldal Keszites Php ASP

1. Bevezetés 6 / 91

1.2. Windows alatt IIS webkiszolgáló telepítése

A Windows 2000 és Windows XP változatokban már megtalálható az IIS webkiszolgáló. A diplomamunkám során Windows XP Professional magyar nyelvű változatát használtam, ezért az alább leírtak arra érvényesek, de nagyon hasonlóan történik a Windows más verzióin is a telepítés.

Telepítését vagy a Windows telepítésekor végezzük el, vagy utólag a következő módon:

Start Menü -> Beállítások -> Vezérlőpult -> Programok telepítése és törlése kiválasztása.

A bal részen a Windows összetevők hozzáadás vagy eltávolítása ikonra kattintunk. Ekkor a következő ablak jelenik meg:

Itt kiválasztjuk az Internet Information Services (IIS) sort és bejelöljük, hogy telepíteni szeretnénk. A Részletek… gomb lenyomásával válogathatunk a komponensek közül. Ajánlott mindent komponenst bejelölni.

A tényleges telepítést a Tovább gomb lenyomásával végezhetjük el. Ezzel a telepítéssel, ha minden komponenst kiválasztottunk, akkor máris egy működő

webszervert kapunk, amely kiszolgálja a kérelmeket, és ASP parancsfájljainkat is futtatja. Ezt a http://localhost hivatkozással tudjuk tesztelni. Az alapértelmezett oldal a C:\InetPub\WWWRoot könyvtárban található fájlok alapján jelenik meg. De pl. a http://localhost/iishelp URL alatt elérhető IIS dokumentáció fájljai a SystemRoot\help\IISHelp könyvtárban találhatók. (Ez egy alapértelmezett virtuális könyvtár, mivel a C:\InetPub\WWWRoot alatt nincs IISHelp könyvtár.) A SystemRoot általában C:\Windows, amelyik könyvtárba a Windows-t telepítettük.

Az ASP fájlokat akár a jegyzettömb segítségével szerkeszthetjük.

Teszteljük le a webkiszolgálót: Hozzuk létre a következő fájlt: C:\InetPub\WWWRoot\test.asp a következő

tartalommal: <html> <head><title>test.asp - date test</title></head> <body> <%Response.Write"<h1>"&Date()&"</h1>"%> </body> </html>

Ekkor a http://localhost/test.asp URL hivatkozás esetén a webkiszolgálón futtatott

webböngészőben megjelenik a gépünkön beállított dátum.

Page 7: Diploma Aktiv Weboldal Keszites Php ASP

1. Bevezetés 7 / 91

Tegyük fel, hogy állandó Internet kapcsolattal és fix IP címmel rendelkezünk. A példák során legyen ez az IP cím 102.103.104.105 és legyenek a hosztnevek, amelyek DNS alapján ezt az IP címet oldják fel: www.sajatnev1.hu, www.sajatnev2.hu. Ekkor a webkiszolgálónk előbb létrehozott oldalát bármely Interneten lévő webes ügyfél a következő URL beírásával érheti el: http://102.103.104.105/test.asp http://www.sajatnev1.hu/test.asp http://www.sajatnev2.hu/test.asp

Ez azért lehetséges, mert az alapértelmezett webhely kezdőkönyvtárába tettük a test.asp állományunkat. A Windows XP alatt futó IIS 5.1-es webszerver nem teszi lehetővé, hogy több webhelyünk is legyen, ehhez egy Windows kiszolgáló termékre van szükségünk.

1.3. Linux alatt Apache webkiszolgáló és PHP telepítése Mivel nagyon sokféle Linux disztribúció létezik, ezért Linux alatt az adott

disztribúcióktól függő módon kell telepíteni az egyes programokat. Általában rendelkeznek csomagkezelővel az egyes disztribúciók, ez alapján általában két csoportba lehet sorolni, mivel két nagyon elterjedt csomagkezelő létezik. Az egyik az RPM (RedHat Package Manager) formátumot használó Linux, a RedHat disztribúció alapértelmezett csomagkezelőjét használja. Az RPM csomagokat rpm –i csomagneve.rpm paranccsal tudjunk feltelepíteni. A másik a DEB (Debian Package Manager) formátumot használó Linux, ami a Debian disztribúció alapértelmezett csomagkezelője. A DEB csomagokat a dpkg –i csomagneve.deb paranccsal lehet feltelepíteni.

Másik telepítési mód, hogy letöltjük a kívánt program forráskódját, jelen esetben az

Apache webszervert, a PHP parancsfájlértelmezőt, a MySQL adatbázis szervert és lefordítjuk a saját Linux disztribúciónk alá. A http://www.apache.org, a http://www.php.net, és a http://www.mysql.com címekről tölthetjük le. Az adott oldalakon, illetve a letöltött forrás mellett is találunk a telepítéssel kapcsolatos információkat. Általában a letölthető forráskód csomagok TAR-ral és GZIP-pel vannak becsomagolva. Pl. tar xfz apache_1.3.27.tar.gz paranccsal kicsomagoljuk, majd a létrejött könyvtárban (./apache_1.3.27) kiadjuk a következő parancsokat: ./configure -prefix=PREFIX; make; make install. PREFIX helyére érdemes a célkönyvtárat megadni, ami általában a /usr/local szokott lenni a forráskódból installált programok esetén. A PREFIX/bin/apachectl start paranccsal indíthatjuk el az Apache webkiszolgálót.

Diplomamunkám során a Debian disztribúcióra vonatkozó (Woody 3.0-ás verzió)

telepítést mutatom be. A későbbiekben a konfigurációs állományok szerkesztése során ez alapján írom a példákat. Természetesen ezek a példák a többi disztribúció esetén is érvényesek, csak egyes esetekben az említett útvonalak eltérőek lehetnek.

Debian alatt általában telepítéskor felkerül az apt-get nevű csomagkezelő program,

amely a dpkg csomagkezelőre épül. Ezzel a következőképpen tehetjük fel az Apache programot és a hozzá tartozó dokumentációt: apt-get install apache apache-doc. Az apt-get több csomagot installál majd fel, feloldva a csomagok függőségét. A telepítést a következő paranccsal ellenőrizhetjük le: user@debian:~$ dpkg -l | grep apache ii apache 1.3.26-0woody3 Versatile, high-performance HTTP server ii apache-common 1.3.26-0woody3 Support files for all Apache webservers ii apache-doc 1.3.26-0woody3 Apache webserver docs

Page 8: Diploma Aktiv Weboldal Keszites Php ASP

1. Bevezetés 8 / 91

Az apt-get install php4 paranccsal installálhatjuk az Apache webszerverbe integrálható PHP modult. A telepítés ellenőrzése: user@debian:~$ dpkg -l | grep php4 ii php4 4.1.2-6 A server-side, HTML-embedded scripting langu

Ellenőrízzük le, hogy a telepítő beállította-e a webszerver konfigurációs állományában

a PHP modul betöltését, és az egyéb szükséges dolgokat. Ha forráskód csomagból telepítenénk, akkor szintén hasonló beállításokat kellene elvégezni jelen esetben az /etc/apache/httpd.conf fájlban: # A #-el kezdődő sorok megjegyzésnek minősülnek. # PHP4 modul betöltése. LoadModule php4_module /usr/lib/apache/1.3/libphp4.so # Állítsuk be, ha csak index.php fájl van egy könyvtárban, akkor az töltődjön be, ne pedig könyvtárlista jelenjen meg. <IfModule mod_dir.c> DirectoryIndex index.html index.php index.htm index.shtml index.cgi </IfModule> # Ez a beállítás szükséges ahhoz, hogy kiértékelje az Apache a PHP kiterjesztésű fájlokat és # így nem tudja letölteni a kliens. A második sor általában nem szükséges, csak ha a PHP forrásfájlokat is # meg szeretnénk jeleníteni. # Megjegyezném, hogy kiterjesztésnek itt bármi mást is meg tudnánk adni. AddType application/x-httpd-php .php AddType application/x-httpd-php-source .phps

Ne feledkezzünk meg az Apache újraindításáról, ha a konfigurációs fájlt módosítottuk.

Megjegyezném, hogy az alapértelmezett kezdőkönyvtár a /var/www, ha ezt nem módosítjuk, illetve különböző webhelyeknek a következő módon adhatunk meg más kezdőkönyvtárat, az /etc/apache/httpd.conf állományban:

<VirtualHost 102.103.104.105> ServerName www.sajatnev1.hu DocumentRoot /var/www/sajatnev1.hu ServerAdmin [email protected] </VirtualHost>

1.4. Microsoft SQL szerver telepítése Windows alatt A Microsoft SQL szervernek többféle verziója van. Erről bővebben a következő címen

olvashatunk: http://www.microsoft.com/sql/evaluation/overview/default.asp. Windows XP-re például az SQL Server 2000 Personal Edition verziót lehet telepíteni. A telepítés lépései röviden a következők, a képek az 5.1. számú mellékletben láthatóak:

1. A telepítő automatikusan elindul. Itt válasszuk ki: SQL Server 2000 Components. 2. Következő menüben válasszuk ki: Install Database Server. 3. Tényleges telepítés üdvözlő ablaka jelenik meg. Válasszuk: Next. 4. Saját gépünkre szeretnénk telepíteni, ezért a Local Computert jelöljük be, majd Next. 5. Egy gépre több példányban (instance) is telepíthetjük az SQL 2000 szervert.

Válasszuk: Create a new instance of SQL Server or install Client Tools, majd Next. 6. Meg kell adni a nevünket és a szervezetünk nevét, ha van. Majd Next. 7. Fogadjuk el a Licence feltételeket: Yes. 8. Adjuk meg a CD-key-t, majd Next. 9. Válasszuk: Server and Client Tools, majd Next. 10. Adjunk meg egy példánynevet, pl.: HOMESQL, majd Next. 11. Válasszuk a tipikus telepítést, majd Next. 12. Állítsuk be az SQL szervernek működéséhez szükséges rendszer azonosítót, használja

a helyi rendszer azonosítót. Válasszuk: „Use the Local System account” és „Use the same account for each service. Auto start SQL Server Service”, majd Next.

Page 9: Diploma Aktiv Weboldal Keszites Php ASP

1. Bevezetés 9 / 91

13. Megadhatjuk, hogy milyen felhasználók használhassák az SQL szervert. Ajánlott a Mixed Mode, ilyenkor a Windows felhasználók mellett az SQL szerverben hozzáadott felhasználok is beléphetnek. Ehhez meg kell adni az sa felhasználó jelszavát kétszer. Majd Next.

14. Next gomb megnyomásával elkezdődik a tényleges telepítés, a fájlok másolása. 15. Sikeresen befejeződött a telepítés.

Ezután indítsuk újra a gépet, majd keressük meg a Start Menü -> Programok -> Microsoft SQL Server -> Enterprise Manager programot. Itt hozhatunk létre egy új adatbázist, amely a Windows-ba bejelentkezett felhasználó tulajdona lesz. Legyen ez az adatbázis aspdb.

Kiválasztjuk a bal részen a Databases ágat, majd Művelet menüben választjuk a New

database menüpontot, ekkor az alábbi hasonló ablak jelenik meg. Névnek írjuk be: aspdb, majd OK gomb lenyomásával létrehozzuk az adatbázist.

A későbbiekben \\HOMEPC\HOMESQL nevű MS SQL instanciára fogok hivatkozni. A

Security/Login ág alatt lehet létrehozni egy SQL felhasználót, legyen a felhasználó neve: msuser, és a jelszava: asp123. Erre a felhasználó névre és jelszóra fogok hivatkozni a MS SQL használata során. Az adatbázis neve a fenti példában szereplő aspdb lesz. Ehhez az adatbázishoz az msuser teljes hozzáférését be kell állítani a Databases\aspdb\Users ág alatt.

Page 10: Diploma Aktiv Weboldal Keszites Php ASP

1. Bevezetés 10 / 91

1.5. MySQL telepítése Linux alatt Bemutatnám Debian alatt a MySQL csomagok telepítését, illetve a szükséges

beállításokat. Az apt-get install mysql-client mysql-server mysql-doc paranccsal telepíthetjük fel a szervert, a kliens programot, valamint a dokumentációt. Ezután létre kell hoznunk a kezdeti adminisztrátori jelszót, hasonlóan root felhasználónak hívják, mint a Linux rendszerek alatt az adminisztrátor felhasználót, de a kettőnek egymáshoz nincsen semmi köze. Kezdeti jelszó megadása a következő paranccsal lehetséges: /usr/bin/mysqladmin -u root password '<secret>'. Érdemes létrehozni a következő fájlt az alábbi tartalommal:

# an example of /root/.my.cnf [mysql] user = root password = <secret>

Ha ezt a fájlt létrehoztuk, akkor nem kell állandóan megadni a felhasználói nevet és

jelszót, csak egyszerűen mysql kliens program elindításával tudunk csatlakozni a MySQL szerverhez. Szokás létrehozni minden felhasználónak külön adatbázist, és minden ilyen adatbázishoz tartozik külön felhasználó név és jelszó (akár több is, más jogosultságokkal). Ezt a legkönnyebben a mysql_setpermission segédprogrammal tehetjük meg, ha már adtunk kezdeti jelszót. Ez a Perl-ben megírt segédprogram bekéri interaktív módon a létrehozáshoz szükséges adatokat, majd beszúrja a megfelelő táblákba, amelyek a mysql adatbázis alatt található (user és db táblák). Tegyük fel, hogy létrehoztunk egy phpuser nevű felhasználót php123 jelszóval és phpdb nevű kezdeti üres adatbázissal. Később a példaprogramokban ezen adatokkal fogok hivatkozni a MySQL adatbázisra.

A PHP csomaghoz is telepíteni kell a MySQL eléréshez szükséges csomagot, ezt a

következőképpen tehetjük meg: apt-get install php4-mysql. A telepítést a következő paranccsal ellenőrizhetjük:

user@debian:~$ dpkg -l | grep mysql ii libmysqlclient 3.23.49-8.2 mysql database client library ii mysql-client 3.23.49-8.2 mysql database client binaries ii mysql-common 3.23.49-8.2 mysql database common files (e.g. /etc/mysql ii mysql-doc 3.23.51-0woody mysql database documentation ii mysql-server 3.23.49-8.2 mysql database server binaries ii php4-mysql 4.1.2-6 MySQL module for php4

Végül ellenőrizzük le, hogy az /etc/php4/apache/php.ini fájl végére bekerült-e a PHP-

hoz tartozó MySQL modul automatikus betöltésére vonatkozó bejegyzés:

# Betölti a MySQL modult automatikusan, amikor Apache webszerveren keresztül használjuk a PHP-t. extension=mysql.so

Teszteljük le a webkiszolgálót:

Debian alatt az alapértelmezett kezdőkönyvtárban [/var/www], amelybe

alapbeállítások szerint csak a rendszergazda jogosultsággal rendelkező felhasználó írhat, hozzunk létre egy test.php állományt a következő tartalommal: <?php phpinfo(); ?>

A http://localhost/test.php URL címen érhetjük el az oldalt a webkiszolgálón futatott

webböngésző programból. Ha mindent sikeresen beállítottunk, akkor megjelenik a PHP telepítéskor megadott beállításait, jellemzőit ismertető oldal, valamint az egyes PHP modulokról is találhatunk információt, pl. a MySQL modulról is.

Page 11: Diploma Aktiv Weboldal Keszites Php ASP

2. Webes aktív oldalak készítése adatbázis eléréssel 11 / 91

2. Webes aktív oldalak készítése adatbázis eléréssel Mint a bevezetőben már említettem két eltérő platformon alkalmazható technológiát

szeretnék bemutatni és összehasonlítani. Az egyik a Windows platform IIS webkiszolgálója és ASP parancsfájlnyelve. Itt még egyszer kiemelném, hogy a nyílt forráskódú Linux alá létező megoldások nagy része áttehető Windows alá is, de eredetileg UNIX-os környezetre fejlesztették ki őket, ezért adott esetben ott könnyebb telepíteni. A másik technológia a Linux/UNIX platform alatt az Apache webszerver és PHP programnyelv.

Hagyományos webszerver programozás a CGI programokkal volt lehetséges. Ezeknél

a legnagyobb gondot a hordozhatóság hiánya jelentette, illetve nem nyújtott egységes felületet, mivel szinte bármilyen programnyelven készülhettek az egyes CGI programok. Ha az adott CGI program hibás volt, akkor még a webszerver biztonságát is veszélyeztethette. Jellemzően ezek C/C++ nyelven íródtak, vagy shell programok voltak, pl. Perl-ben készültek. Az ASP és a PHP is olyan parancsértelmező (interpreter) nyelvek, amelyek hatékonyan futtatják a programokat. Nagyon sok funkciót, eljárást lehet elérni, valamint a programozók számára egy roppant egyszerű szintaxist kínálnak. Az ASP és a PHP kimenete szövegfájl, ami általában egy HTML oldal, persze lehet más is, mint pl. egy képfájl. A PHP programokat parancssorból is lehet futtatni, tesztelésnél ez hasznos lehet.

A CGI programozásra még használatos a fent már említett Perl interpreter nyelv,

amely szintén nagyon sok előre megírt modult és eljárást tartalmaz. Programozási szempontból haladóbb programozóknak ajánlott, mivel szintaxisa nagyon bonyolult és átláthatatlan is tud lenni. Perl nyelv sok egyéb olyan szolgáltatást is biztosít, amely az adott operációs rendszerhez kapcsolódik, mint pl. fájlműveletek, hálózat és grafikus felület programozása. Legnagyobb erősége a reguláris kifejezések feldolgozásában van.

Az alábbiakban bemutatok egy Perl programkódot, amely a webszerver megfelelő

beállításai mellett lefuttatható. CGI programozás során a legalapvetőbb különbség, hogy a MIME-type információt kell kiírnunk az első sorban, ami alapján HTTP fejlécben tudatjuk a klienssel, hogy milyen típusú fájt tölt le. #!/usr/bin/perl print "Content-type: text/html\r\n\r\n"; print "Hello, World.";

A PHP és ASP programozása során nem kell megadni a MIME-type információt, mivel

az alapértelmezés szerint HTML. Csak akkor kell megadni, ha ettől eltérő típusú oldallal szeretnénk megjeleníteni, pl. egy képet.

A PHP és ASP jellemzője, hogy weboldalak készítéséhez szükséges és fontos

eljárásokat tartalmaznak. Egyik ilyen kategóriája az eljárásoknak, amelyek valamely adatbázishoz történő kapcsolódást tesznek lehetővé. PHP esetén elég sok lehetőség kínálkozik: MySQL, PostgreSQL, Microsoft SQL, Unified ODBC, dBase, Informix, Interbase, Ingres, mSQL, Oracle 8, Ovrimos, Sybase. Ezekből a legelterjedtebb a MySQL és a PostgreSQL, amelyek nagyon hasonló tulajdonságokkal rendelkeznek. A Unified ODBC eljárások segítségével tetszőleges adatbázisforráshoz csatlakozhatunk, amelyhez elkészítették az ODBC meghajtóprogramot.

Az ASP kétféle módon kapcsolódhat adatbázishoz. Az egyik ilyen, az OLE DB kapcsolódás, ide tartozik a Microsoft® Access, Microsoft SQL, Oracle, Microsoft Indexing Service. A másik mód az ODBC, amellyel adatforrás-illesztőprogramhoz kapcsolódhatunk, mint pl. Microsoft Access, SQL Server, Oracle, Microsoft Excel, Microsoft Excel 97, Paradox, Szöveg, Microsoft Visual Foxpro®.

Page 12: Diploma Aktiv Weboldal Keszites Php ASP

2. Webes aktív oldalak készítése adatbázis eléréssel 12 / 91

Diplomamunkám során én csak a MySQL, illetve a Microsoft SQL Server elérését mutatom be, a többi is nagyon hasonlóan történik. Az SQL szerverek elérésénél voltaképpen a megszokott SQL parancsok alkalmazhatóak, figyelembe véve az adott SQL szerverre jellemző egyedi eltéréseket (pl. dátumkezelő függvények).

2.1. Webkiszolgálók SSI opciója Az Apache és az IIS is képes az SSI-direktívák feldolgozására. Az SSI lényege, hogy

feldolgozza a HTML weblap bizonyos HTML megjegyzéseit. Ha nem tudja értelmezni a webkiszolgáló, akkor a kliensek számára csak forráskód megtekintésével lesz látható, mint megjegyzés. Egyik legfontosabb direktíva, a fájlbeágyazó direktíva. Ha hivatkozhatunk egy fájlra, akkor a webkiszolgáló behelyettesíti az adott hivatkozás helyére a hivatkozott fájl tartalmát. Ha egy webtartalom minden lapjának ugyanaz a fejléce és a lábléce, akkor csak a törzseket kell megírni és a fej- és láblécekre elég hivatkozni. Lásd majd az alábbi 1. számú példát. Így nem kell minden fájlban átírni a változtatásokat, elég csak egy helyen. Az Apache webkiszolgáló esetén ezt külön be kell állítani az /etc/apache/httpd.conf állományban: LoadModule includes_module /usr/lib/apache/1.3/mod_include.so AddType text/html .shtml AddHandler server-parsed .shtml

Ebben az esetben az SHTML kiterjesztéssel létrehozott HTML oldalakban a

webkiszolgáló ki fogja értékelni a fájlban található SSI direktívákat. Ez egy globális megoldás, de adott esetben megadhatjuk másmilyen fájlokra is egyesével, vagy könyvtáranként az Options +Includes beállítással.

Az SSI-direktívák webkiszolgálótól függenek, Apache webkiszolgálónál a következő

címen olvashatunk róla: http://httpd.apache.org/docs/howto/ssi.html. Szintén dinamikus programozást tesz lehetővé, bár használata leginkább csak apróbb dinamikus oldalak létrehozására, illetve dinamikus elemek beszúrására ajánlott. Létrehozhatunk változókat, kiírathatjuk a változók értékét, írhatunk elágazást, futtathatunk programokat, és beágyazhatunk HTML vagy CGI oldalakat.

1. számú példa: header.html fájl tartalma: <html> <head> <title>1. számú példa HTML címsora</title> </head> <body> <h1>Fejléc </h1> <hr> footer.html fájl tartalma: <hr> </body> </html> main1.shtml fájl tartalma: <!--#include virtual="/header.html" --> Ez itt az egyik oldal dátummal. <br>Mai dátum:<!--#echo var="DATE_LOCAL" --> <!--#include virtual="/footer.html" --> main2.shtml fájl tartalma: <!--#include virtual="/header.html" --> Ez itt a másik oldal. <!--#include virtual="/footer.html" -->

Page 13: Diploma Aktiv Weboldal Keszites Php ASP

2. Webes aktív oldalak készítése adatbázis eléréssel 13 / 91

A következő SSI-direktívák adottak IIS alatt: - #config: Meghatározza az SSI hibaüzenetekben használandó karakterláncot,

valamint a #flastmod és #fsize direktívák által visszaadott dátumokhoz és fájlméretekhez használandó formátumot.

- #echo: Kiszolgálóváltozó értékét illeszti be egy adott HTML-lapba. - #exec: Alkalmazásokat vagy operációsrendszer-parancsokat futtat, és ezek

eredményét HTML-lapba ágyazza. - #flastmod: Beszúrja a weblapra a fájlnak a #config direktíva által formázott

módosítási dátumát. - #fsize: Beszúrja a weblapra a fájlnak a #config direktíva által formázott méretét. - #include: Felveszi a fájlt a weblapra. Ez az egyetlen direktíva, amely ASP- és

SHTML-fájlokban használható. Ezek az SSI-direktívák hasonlóan működnek Linux alatt is, legfeljebb az egyes

visszaadott dátumok formátumában térhetnek el. Apache nem támogatja az #fsize direktívát, de támogatja a #set direktívát, amivel változóknak lehet értéket adni.

De van egy lényeges különbség az #include direktívában. Az Apache csak egy

mélységig ágyazza be a fájlokat, míg az IIS a beágyazott oldalt is megvizsgálja, az abban található SSI-direktívákat feldolgozza, tetszőleges mélységig. Ezen kívül az #include direktíva alkalmazható ASP oldalakon is, míg a többi nem, azoknak van ASP programbeli megfelelője.

2.2. Az ASP illetve PHP működési modellje Az ASP és a PHP kiszolgálóoldali szkriptek (parancsfájl-utasítások) írását teszi

lehetővé, amelyek kódja HTML-kódba ágyazva jelennek meg. Bármire képesek, amit más CGI programok el tudnak végezni, ilyen funkciók az űrlap adatok feldolgozása, dinamikus tartalom generálása, vagy sütik küldése és fogadása.

Az ASP és a PHP nagyon hasonlít az SSI működéséhez, csak sokkal több lehetőséget

biztosít számunkra. Az Apache és az IIS kiszolgálónál is be lehet állítani, hogy milyen kiterjesztésű fájloknál dolgozza fel az esetlegesen bennük található SSI-direktívákat. Az IIS esetén az alapértelmezett a STM, SHTM, SHTML kiterjesztés, ezt a listát lehet módosítani, attól függően, hogy mit rendelünk hozzá – lényegében mit társítunk az SSINC.DLL-hez. Az Apache esetén az ajánlott az SHTML, de az /etc/apache/httpd.conf konfigurációs fájlban ezt tetszőlegesen megadhatjuk.

IIS-nél az ASP kiterjesztésű fájlok az ASP.DLL fájlhoz vannak rendelve, ezt nem lehet

megváltoztatni, valamint ehhez a kiterjesztéshez mást már nem tudunk társítani. Apache esetén a PHP fájlokhoz is tetszőleges kiterjesztést vagy akár kiterjesztéseket rendelhetünk. Az ilyen kiterjesztéssel rendelkező fájlokat az Apache kiszolgáló PHP modulja dolgozza fel.

Alapértelmezés szerint egy PHP illetve ASP oldal normál HTML oldalnak számít, tehát

ha írunk egy szöveges fájlt, ami esetlegesen HTML-kódokat is tartalmaz, akkor az már egy PHP illetve ASP oldal lehet. Ezzel lényegében semmit nem történik, változatlanul vissza kapjuk az oldalunkat, csak a webszerver lefuttatja az ASP vagy a PHP parancsértelmezőn. Az IIS 5.1-es verziója, azt hirdeti magáról, hogy az ilyen statikus HTML fájlokat, amelyek nem tartalmaznak parancsfájlkódokat, jóval gyorsabban dolgozza fel az ASP.DLL, mint az előző verziói.

Page 14: Diploma Aktiv Weboldal Keszites Php ASP

2. Webes aktív oldalak készítése adatbázis eléréssel 14 / 91

Az alábbi 1. ábrán látható egy egyszerű statikus HTML oldal megjelenítésének a modellje. Ahol a webes ügyfél egy kérést küld a webkiszolgáló felé, hogy az ott található sajatfajl.htm fájlt küldje el neki. Majd a válaszban meg is kapja a kért fájlt módosítások nélkül, és ezt jeleníti meg a webes ügyfél, ami a jelen példában az aktuális dátum.

A 2. ábrán látható az ASP működési modellje, ami igaz a PHP esetében is. Innen ered

a kiszolgálóoldali parancsfájl elnevezés, ugyanis amikor az ügyfél ASP oldalt kér le, akkor mielőtt a kiszolgáló elküldené a választ, azelőtt a kiszolgáló az ASP-fájlt az ASP parancsvégrehajtón keresztül küldi át, ahol a kiszolgálóoldali parancsfájlkódok végrehajtásra kerülnek, illetve HTML-kódra konvertálódnak. A konvertált kódok ezután átkerülnek a webügyfélhez.

1. ábra 2. ábra

2.3. Az ASP illetve PHP oldalak létrehozása Az ASP és a PHP oldalakat is tetszőleges szövegfájl szerkesztővel hozhatjuk létre.

Természetesen vannak professzionálisabb fejlesztőeszközök is hozzá, ASP-hez például a Miscrosoft Visual InterDev; PHP-hoz pedig például a PHPEditor, amelyet a http://www.phpedit.net webcímről tudunk letölteni.

A legegyszerűbben a már létező HTML oldalainkból is létrehozhatunk ASP illetve PHP

oldalakat, csak meg kell változtatni az eredeti fájl kiterjesztését HTML-ről ASP-re vagy PHP-re. Az ASP / PHP oldalak az alábbi elemek kombinációját tartalmazzák:

- szöveg, - HTML-kódok, - kiszolgálóoldali parancsfájlok.

A HTML fájlok szöveges fájlok, amelyek tartalmazhatnak (és általában tartalmaznak

is) HTML-kódokat. Számunkra lényegesebb a harmadik elem: kiszolgálóoldali parancsok. Kiszolgálóoldali parancsfájl-utasítások hozzáadása:

A kiszolgálóoldali parancsfájl olyan utasítássor, amellyel egymás után adhatók ki parancsok a webkiszolgáló számára. (Ha már előzőleg is fejlesztett webhelyeket, akkor valószínűleg ismeri az ügyféloldali parancsfájlokat, amelyek a webböngészőn futnak.) Az ASP fájlokban a parancsfájlokat határolójelek különböztetik meg a szövegtől és a HTML-kódoktól. A határolójel olyan karakter vagy karakterlánc, amely egy egység kezdetét vagy végét jelöli. A HTML esetén ezek a határolójelek a HTML-kódokat határoló "kisebb mint" (<) és "nagyobb mint" (>) szimbólumok.

Page 15: Diploma Aktiv Weboldal Keszites Php ASP

2. Webes aktív oldalak készítése adatbázis eléréssel 15 / 91

Az ASP a <% és a %> határolójelek segítségével jelöli a parancsfájl-utasításokat. A határolójelek közé bármely, a használt parancsnyelvben érvényes parancsot be lehet írni.

A határolójelek között lévő parancsokat elsődleges parancsfájl-utasításoknak hívják,

ezeket az elsődleges parancsnyelv segítségével dolgozza fel a rendszer. A parancsfájl-határolójelek között használt parancsoknak az elsődleges parancsnyelvben érvényes parancsoknak kell lenniük. Az alapértelmezett parancsnyelv a VBScript, azonban más alapértelmezett nyelv is megadható.

Ha nem az alapértelmezett parancsnyelvet szeretnénk használni, akkor az ASP oldal első sorában meg kell adni, a parancsfájl-utasításokat feldolgozó parancsleíró nyelvet, az alábbihoz hasonlóan:

<%@ LANGUAGE=ParancsleíróNyelv %>

IIS esetén két beépített parancsleíró nyelvet adhatunk meg, ami a Windows operációs

rendszer része is egyben: VBScript és JScript. Mindkét nyelv esetén érvényes, hogy a felhasználó felület elemeinek programozására szolgáló InputBox és MsgBox objektumok nem elérhetőek, valamint a CreateObject és GetObject metódusok helyett a Server.CreateObject metódust kell használni. A VBScript és a JScript közötti lényeges különbség, hogy az első nem tesz különbséget a kis- és a nagybetűk között és a Miscrosoft Visual Basic része, míg utóbbi különbséget tesz és a szintaxisa a C–hez és Java-hoz hasonlítható.

A PHP a <?PHP és a ?> határolójelek segítségével jelöli a parancsfájl-utasításait. De

általában alkalmazható a <? és a ?> határolójelpár is. Az ASP típusú határolójelek (<% és %>) használata is megengedett (a PHP megfelelő beállításai mellett), valamint az érték kiíró rövidítés is használható (<?= $valtozo ?> vagy ASP típusú: <%= $valtozo %>), ha be van állítva a konfigurációs fájlban. A PHP nyelv szintaxisa leginkább a C, JAVA, PERL nyelvekre hasonlít. A PHP-módba kerülésére 4 fajta lehetőség van:

1. <? echo ("Ez a legegyszerűbb, egy SGML processing utasítás\n"); ?> <?= $valtozo; # Ez egy rövidítése a "<? echo ..?>"-nak ?> 2. <?php echo("Ha XHTML vagy XML dokumentumokat is akarsz szolgáltatni," . "biztos szeretni fogod ezt\n"); ?> 3. <script language="php"> echo ("Néhány szerkesztő (ilyen pl. a FrontPage) nem" . "szereti a processing utasításokat"); </script> 4. <% echo ("Használhatsz ASP-stílusú tag-eket"); %> <%= $valtozo; # Ez egy rövidítése a "<% echo ..%>"-nak %>

Diplomamunkámban az ASP alapértelmezett VBScript nyelvét és a PHP nyelvet

hasonlítom össze. Olyan oldalak készítéséhez szükséges nyelvi elemeket mutatom be, amelyek szükségesek webfejlesztés során és más programozási nyelvekre kevésbé jellemzőek. Az egyik ilyen elem, az űrlapok által küldött adatok feldolgozása, vagy a HTTP-fejlécekben átadott paraméterek feldolgozása.

Megjegyzés a VBScript programozásához: A VBScript alkalmazható kliensoldali parancsnyelvként is, ekkor persze a webes

kliensnek támogatnia kell ezt a parancsnyelvet. Ilyenkor a HTML fájlban a <SCRIPT> és </SCRIPT> elhatároló karaktersorozatok között lehet megadni a parancsfájl-kódokat HTML megjegyzésként. Ha a kliens támogatja a parancsnyelvet, akkor értelmezi azt, majd az eredményt elhelyezi a megjegyzés helyén, ha nem, akkor csak a forráskódban láthatjuk a kódokat megjegyzésként, mivel a kliens nem dolgozta fel.

Page 16: Diploma Aktiv Weboldal Keszites Php ASP

2. Webes aktív oldalak készítése adatbázis eléréssel 16 / 91

Az alábbiakban látható egy példa HTML fájl, amely ilyen kliensoldali parancsfájl-utasításokat tartalmaz:

<HTML> <HEAD> <TITLE>Place Your Order</TITLE> <SCRIPT LANGUAGE="VBScript"> <!-- Function CanDeliver(Dt) CanDeliver = (CDate(Dt) - Now()) > 2 End Function --> </SCRIPT> </HEAD> <BODY>

2.4. Változók és állandók létrehozása, hatókörük ASP-ben Az alábbiakban az ASP oldalakkal kapcsolatos információk egy az egyben érvényesek a

VBScript nyelvre, vagyis aki Visual Basic programozásban jártas, annak nem jelent akadályt a VBScript használata sem. Aki nem jártas, annak az ASP programozásához a Visual Basic nyelvet érdemes megtanulnia. Mivel az ASP alapértelmezett parancsértelmező nyelve a VBScript, ezért fogom ezt ismertetni a továbbiakban.

Változók és állandók használata

A változó egy olyan, névvel ellátott tárolóhely a számítógép memóriájában, amely adatokat (például számot vagy karakterláncot) tárol. A változóban tárolt adatot a változó értékének hívják. A változók segítségével olyan nevekkel tárolhatók, kérdezhetők le és kezelhetők értékek, amelyek segítségével megérthető, hogy a parancsfájl hogyan is működik.

Változók deklarálása és elnevezése

A VBScript nyelvben nem kötelező a változók deklarálása, azonban nagyon hasznos minden változót annak használata előtt deklarálni. A változó deklarálásával azt lehet a szkriptkezelővel közölni, hogy egy adott nevű változó létezik, s ezáltal a parancsfájl egészében hivatkozni lehet a változóra. A VBScript nyelvben a Dim, a Public vagy a Private utasítással deklarálható változó. Például: <% Dim valtozonev %> <% Dim tombnev_ami_10_elemu(10) %>

A VBScript Option Explicit utasításával érheti el azt, hogy az ASP fájlban a Dim, a

Private, a Public és a ReDim utasítások használatával egyértelműen deklarálni kelljen a változókat. Az Option Explicit utasításnak minden ASP-direktíva után és minden HTML-szöveg vagy parancsfájlbeli parancs előtt meg kell jelennie. <% Option Explicit %> <HTML> <% Dim strUserName Public lngAccountNumber %>

Az előre definiált webszerver változókkal kapcsolatos információk az 5.2. számú mellékletben találhatóak meg. Ezek a változók a Request objektumon keresztül érhetőek el.

Page 17: Diploma Aktiv Weboldal Keszites Php ASP

2. Webes aktív oldalak készítése adatbázis eléréssel 17 / 91

A változók hatóköre:

A változó hatóköre (azaz élettartama) határozza meg, hogy mely parancsfájlbeli parancsok érhetik el a változót. Egy adott eljáráson belül deklarált változó helyi hatókörrel bír – a változó az eljárás minden egyes végrehajtásakor létrejön, majd törlődik. Semmilyen, az eljáráson kívüli elem nem érheti el. Az eljáráson kívül deklarált változónak globális hatóköre van – értékét bármely, ASP-lapon lévő parancsfájlbeli parancs használhatja vagy módosíthatja. Megjegyzés: A változó hatókörének az adott eljárásra történő korlátozásával javul a teljesítmény.

A változókat deklarálhatja úgy is, hogy a helyi változónak és a globális változónak ugyanazt a nevet adja. Az egyik értékének módosítása nem változtatja meg a másik értékét. Ha azonban nem deklarálja a változókat, akkor akaratlanul is módosíthatja egy adott globális változó értékét. A következő parancsfájlbeli parancsok például az 1 értéket eredményezik annak ellenére, hogy két Y nevű változó van: <% Option Explicit Dim Y Y = 1 SetLocalVariable Response.Write Y Sub SetLocalVariable Dim Y Y = 2 End Sub %>

Az alábbi parancsfájlbeli parancsok viszont a 2 értéket adják eredményül, mert a

változók nem egyértelműen vannak deklarálva. Amikor az eljáráshívás az Y-nak a 2 értéket adja, a parancsnyelv-értelmező azt feltételezi, hogy az eljárás a globális változót kívánta módosítani.

<% Option Explicit Dim Y = 1 SetLocalVariable Response.Write Y Sub SetLocalVariable Y = 2 End Sub %>

A problémák elkerülése végett minden változót egyértelműen deklaráljon. Ez különösen fontos, ha az #include utasítás segítségével ágyaz fájlokat az ASP fájlba. A beágyazott parancsfájlt külön fájl tartalmazza, de a parancsfájlt a rendszer úgy értelmezi, mintha a beágyazó fájl része volna. Könnyű megfeledkezni arról, hogy a fő parancsfájlban, valamint a beágyazott parancsfájlokban használt (globális) változóknak különböző neveket kell adni, hacsak nem deklarálta a változókat. Megyjegyzés: A változókat általában ASP szkriptekben a Dim utasítással deklaráljuk, ilyenkor az egész szkriptben és az összes eljárásban elérhető. Eljárások esetén, az eljárás elején ajánlott deklarálni a változókat. ReDim utasítás egy már deklarált változó dimenzióját és elemszámát definiálja felül. A Private és Public utasításoknak csak tényleges Visual Basic program esetén van jelentősége, mivel az ASP oldal, ha még #include utasítással tartalmaz is egy másik ASP oldalt, egy szkriptnek felel meg (mivel a másik oldalt csak beágyazza). A Private esetén csak az adott szkriptben, míg a Public esetén az összes szkriptben elérhető az adott változó.

Page 18: Diploma Aktiv Weboldal Keszites Php ASP

2. Webes aktív oldalak készítése adatbázis eléréssel 18 / 91

Példa állandók deklarálására: Const MyVar = 459 ' Constants are Public by default. Private Const MyString = "HELP" ' Declare Private constant. Const MyStr = "Hello", MyNumber = 3.4567 ' Declare multiple constants on same line. VBScript adattípusok:

Eddig nem igazán volt szó a deklarált változó típusáról. A VBScript egy úgynevezett

Variant típust használ, minden függvény ilyen típussal tér vissza. Ez egy speciális típus, amely különféle információkat tartalmazhat, jellemzően számot vagy szöveget. A szöveget idéző jelek közé kell tenni (” ”). A változó mindig a környezetéhez igazodik, ha szöveget (string data) várunk el, akkor szövegként kezeli, ha számot várunk, akkor számként. Többféle altípus is létezik, a változó értékétől függően, valamint altípusok közötti konvertáló függvények is használhatunk, ha szükséges:

Altípus Leírás Empty Variant nincsen kezdeti értéke. Az értéke numerikus változó esetében 0

vagy üres-string ("") string változó esetében. Null Variant szándékosan nem tartalmaz valódi értéket.

Boolean Értéke lehet True vagy False. Byte Integer típus: [0; 255] intervallumban.

Integer Integer típus: [-32,768; 32,767] intervallumban. Currency [-922,337,203,685,477.5808; 922,337,203,685,477.5807] intervallum.

Long Integer típus: [-2,147,483,648; 2,147,483,647] intervallumban. Single Egyszeres-precizitású lebegőpontos szám a következő intervallumban:

[-3.402823E38; -1.401298E-45] negatív érték esetén; [1.401298E-45; 3.402823E38] pozitív érték esetén.

Double Dupla-precizitású lebegőpontos szám a következő intervallumban: [-1.79769313486232E308; -4.94065645841247E-324] negatív érték esetén; [4.94065645841247E-324; 1.79769313486232E308] pozitív érték esetén.

Date (Time) Olyan számot tartalmaz, ami egy dátumot reprezentál: 100. január 1 és 9999. december 31 között.

String Változóhosszúságú karakterláncot (string) tartalmaz, ami akár 2 millió karakter hosszú is lehet.

Object Egy objektumot tartalmaz. Error Egy hibaszámot tartalmaz.

Változó-elnevezés konvenciók:

Az olvashatóság fokozása és a konzisztencia szempontjából az alábbi prefixek használata javasolt a változók deklarálása során.

Altípus Prefix Példa Boolean bln blnFound

Byte byt bytRasterData Date (Time) dtm dtmStart

Double dbl dblTolerance Error err errOrderNum

Integer int intQuantity Long lng lngDistance

Object obj objCurrent Single sng sngAverage String str strFirstName

Page 19: Diploma Aktiv Weboldal Keszites Php ASP

2. Webes aktív oldalak készítése adatbázis eléréssel 19 / 91

2.5. Változók és állandók létrehozása, hatókörük PHP-ben A PHP nyelvben hasonlóan az ASP-hez, a változók létrehozásánál nem kell típust

megadni, a változó típusát rendszerint nem a programozó adja meg (persze van beleszólása), hanem a PHP futási időben határozza meg a változó környezetétől függően. Sőt a PHP-ben még deklaráló utasítás sem létezik, a változóba mindig az utoljára adott érték található, a típust a változó értéke határozza meg. Valamint létezik olyan utasítás, amellyel le tudjuk kérdezni, hogy egy változónak adtunk-e már értéket.

A PHP nyolc primitív típust támogat. A négy skalár típus:

boolean (logikai) integer (egész szám) floating-point number (float, lebegőpontos szám) string (karakterlánc, karaktersorozat)

A két összetett típus:

array (tömb) object (objektum)

Végül két speciális típus:

resource (erőforrás) NULL

A PHP nem követeli meg (nem támogatja) az explicit típusdefiníciót a változók

deklarálásakor; egy változó típusát a környezet határozza meg, amiben a változót használjuk. Vagyis ha egy karakterláncot rendelünk var nevű változóhoz, akkor var karakterlánc lesz. Ha ezután egy egészet rendelünk hozzá, var egész lesz.

Vagyis minden egyes értékadásnál befolyásolhatjuk, hogy az adott változó milyen

típusú legyen. Fontos lehet még az operátorok használatánál az automatikus típuskonvertálás, pl. egy feltételnél logikai változót vár a program, ezért az adott változó értékét logikai típusra konvertálja, az adott változó típusától függő módon.

Megjegyzés:

Egy kifejezés értékét és/vagy típusát a var_dump() függvénnyel kérdezhetjük le. A típus szöveges információját gettype() segítségével kérdezhető le. Az is_type() függvények használhatók a programokban a típus ellenőrzésére.

Ha egy változó típusát egy adott típusra kell konvertálnunk, cast-olhatjuk a változót, vagy alkalmazzuk rá a settype() függvényt. Itt nem részletezném, hogy az egyes típusok konvertálása közben az új típus mellett milyen értékeket vesz fel a változónk.

Az alábbi táblázatban összefoglaltam a nyolc alaptípussal kapcsolatos fontosabb

információkat. A lehetséges értékadások módját, valamint hogy az adott típus milyen értékeket tud tárolni. Számok esetén igaz, hogy ha olyan nagy értéket használunk, amely nem fér bele az integer típusba, akkor automatikusan float típusú változó lesz.

Page 20: Diploma Aktiv Weboldal Keszites Php ASP

2. Webes aktív oldalak készítése adatbázis eléréssel 20 / 91

Típus Deklaráció, értékadás megjegyzéssel Konvertálás Intervallum Logikai //a logikai igaz értéket adjuk az $igaz változónak

$igaz = True; //a logikai hamis értéket adjuk a $hamis változónak $hamis = False;

(bool) $var (boolean) $var

0 - hamis 1 – igaz Általában nem nulla esetén igaz.

Egész szám # decimális szám $a = 1234; # negatív decimális szám $a = -123; # oktális szám (megegyezik a 83 decimális számmal) $a = 0123; # hexadecimális szám (megegyezik a 26 decimális számmal) $a = 0x1A;

(int) $var (integer) $var

Platformfüggő, de általában 32 bites előjeles egész szám, vagyis: [-2,147,483,648; 2,147,483,647] közötti egész.

Lebegőpon-tos szám

$a = 1.234; $a = 1.2e3; $a = 7E-10;

(float) $var Platformfüggő, de maximális érték kb. 1.8e308, 14 tizedesjegy pontossággal (64 bites IEEE formátum).

String $s = 'Arnold egyszer azt mondta: "I\'ll be back"'; $s = ”Ez is egy string\n” $str = <<<Vege_a_Stringnek_Tetszoleges_Jelsorozat Példa egy stringre, amely több sorban van, és heredoc szintaxisú Vege_a_Stringnek_Tetszoleges_Jelsorozat;

Hosszúsága nincsen korlátozva.

Tömb // a kulcs vagy egy string vagy egy nemnegatív integer // (egész szám), az érték bármi lehet $var = array( [kulcs =>] érték , ... ) $t = array( 1 => 'egy', 2 => 'kettő', 3 => 'három' );

Objektum #egy objektumosztály létrehozása, semmi az osztály neve class semmi osztály neve { function do_semmi () { echo "Csinálom a semmit."; } } # $bar most egy semmi típusú objektum $bar = new semmi; #a $bar objektum do_semmi() metódusát hívja $bar->do_semmi();

Resource Speciális típus a külső erőforrások felszabadítására. NULL #jelzi, hogy a változó nem tartalmaz értéket

$var = NULL

Változók létrehozása:

PHP-ben a változókat egy dollárjel utáni változónév jelöli. A változónevek érzékenyek kis- és nagybetűk különbözőségére. A változónevekre a PHP más jelzőivel azonos szabályok vonatkoznak. Egy érvényes változónév betűvel vagy aláhúzással kezdődik, amit tetszőleges számú betű, szám vagy aláhúzás követ. A betű nem csak az angol ABC betűiből kerülhet ki, hanem 127-255 ASCII kódú karakterek is lehetnek. Példák: $var = "Géza"; $Var = "János"; echo "$var, $Var"; // kiírja, hogy "Géza, János" $4site = 'ez nem jó'; // nem érvényes, mert számmal kezdődik $_4site = 'ez ok'; // érvényes, aláhúzással kezdődik $täyte = 'mansikka'; // érvényes, az 'ä' az ASCII 228-as karaktere $tükörfúrógép = "árvíztűrő"; // érvényes, ellenőrizheted egy ASCII táblában

Page 21: Diploma Aktiv Weboldal Keszites Php ASP

2. Webes aktív oldalak készítése adatbázis eléréssel 21 / 91

PHP 3-ban a változókhoz mindig értékek tartoznak. Vagyis ha egy kifejezést rendelünk egy változóhoz, az eredeti kifejezés egészének értéke másolódik a célváltozóba. Ez azt jelenti, hogy ha például egy változó értékét egy másikhoz rendeljük, egyikük megváltozása sincs hatással a másikra.

PHP 4-ben lehetőség van egy másik hozzárendelési módra: változó referencia szerinti

hozzárendelésére. Ez azt jelenti, hogy az új változó egyszerűen hivatkozik az eredetire. Az új változón végzett változtatások az eredetit is érintik és fordítva. Ez azt is jelenti, hogy nem történik másolás; ekképpen a hozzárendelés gyorsabban történik meg. Igaz ugyan, hogy ez a sebességnövekedés csak bonyolultabb ciklusokban vagy nagy tömböknél illetve objektumok átadásakor jelentkezik.

Referencia szerinti értékadáshoz egyszerűen & jelet kell az átadandó változó neve elé

írni. Az alábbi kód - például - kiírja kétszer, hogy 'Nevem Bob': <?php $ize = 'Bob'; // 'Bob' hozzárendelése $ize-hoz $bigyo = &$ize; // Hivatkozás $ize-ra $bigyo-ban. $bigyo = "Nevem $bigyo";// $bigyo megváltoztatása... echo $ize; // $ize is megváltozott echo $bigyo; ?>

Fontos tudni, hogy a referencia szerinti értékadás, csak változókra érvényes, konstansok vagy egyéb kifejezések értékét nem adhatjuk át referenciaként. <?php $ize = 25; $bigyo = &$ize; // Ez egy érvényes hozzárendelés. $bigyo = &(24 * 7); // Érvénytelen referencia egy névtelen kifejezésre. function test() { return 25; } $bigyo = &test(); // Érvénytelen. ?> Előre definiált változók PHP-ben:

A PHP számos előre definiált változót biztosít bármely futó szkript számára. Sokat

ezek közül nem lehet teljes pontossságal dokumentálni, mert függnek a futtató szervertől, a használt verziótól, a konfigurálástól, és más egyéb tényezőktől. Néhány ilyen változó nem elérhető, ha a PHP parancssorból fut.

Az összes előre definiált változó ki lehet listázni a phpinfo() utasítással, amely sok

más hasznos információt is. A változókat, három kategóriába sorolhatjuk aszerint, hogy értéküket honnan veszik

fel, nevezetesen az Apache webszerver szolgáltatja, vagy a shell környezet vagy pedig maga a PHP.

Apache változók Az előre definiált változók egy része függ a webszervertől, nevezetesen az Apache

webszervertől, annak verziójától és beállításától. Az 5.3. számú mellékletben a teljesség mellőzésével egy felsorolás és rövid ismertető található a PHP alatt elérhető Apache változókról.

Page 22: Diploma Aktiv Weboldal Keszites Php ASP

2. Webes aktív oldalak készítése adatbázis eléréssel 22 / 91

Környezeti változók

A PHP globális változói közé kerülnek a PHP feldolgozót futtató környezet változói. Számos változót a shell szolgáltat, ami alatt a PHP fut. Mivel más-más rendszerek más-más shell-eket használnak, ezért egy pontos lista összeállítása lehetetlen. A használt shell dokumentációjában nézhetünk utána az előre definiált környezeti változóknak.

Más környezeti változók - beleértve a CGI változókat is - attól függően kerülnek be,

hogy a PHP szerver modulként fut vagy CGI feldolgozóként. PHP változók

Ezeket a PHP maga állítja elő. A $HTTP_*_VARS változók csak akkor állnak rendelkezésre, ha a track_vars opció be van kapcsolva. Ha engedélyezve van ez a beállítást, akkor ezek a változók mindig létrejönnek, még ha üresek is. Ebben az esetben nem lehetséges, hogy a rosszindulatú felhasználók meghamisítsák a változókat.

Megjegyzés: A PHP 4.0.3 verziótól kezdve a track_vars mindig be van kapcsolva, függetlenül a konfigurációs fájl beállításától. Megjegyzés: Az új szuper globális (Superglobals) változók 4.1.0 verziótól használhatók. Ezek a $_GET, $_POST, $_ENV, $_SERVER, $_COOKIE, $_REQUEST $_FILES és a $_SESSION tömbök, amelyek fesztelen megfogalmazásban szuper globális jelzővel illetik, mivel minden esetben használhatók tekintet nélkül az aktuális érvényességi körre. Emiatt a régi, nekik megfelelő $HTTP_*_VARS tömbök használata már nem javasolt. Ha a register_globals be van kapcsolva, ezek a változók globális változókként is létrejönnek, függetlenül a $HTTP_*_VARS tömböktől.

A PHP változók leírása megtalálható az 5.4. számú mellékletben.

Változók hatóköre: A változó hatásköre az a környezet, amelyben a változó definiált. A legtöbb esetben

minden PHP változónak egyetlen hatásköre van. Ez az egyetlen hatáskör kiterjed az include és a require segítségével használt fájlokra is. Például:

<?php $a = 1; /* globális változó*/ include "b.inc"; ?>

Itt az $a változó elérhető lesz az beillesztett b.inc szkriptben is. A felhasználói függvényekkel a lokális függvényhatáskör kerül bevezetésre. Alapértelmezés szerint minden, függvényen belül használt változó ebbe a lokális függvényhatáskörbe tartozik. Vagyis a függvények nem látják a függvényen kívül definiált változók értékét, ha külön ezt nem kérjük. Éppen ezért az alábbi példa üres oldalt fog eredményezni: <?php $a = 1; /* globális hatáskör */ function Test () { echo $a; /* egy helyi változót vár */ } Test(); ?>

Page 23: Diploma Aktiv Weboldal Keszites Php ASP

2. Webes aktív oldalak készítése adatbázis eléréssel 23 / 91

A global kulcsszóval kell deklarálni függvényen belül a globális változókat. Valamint a $GLOBALS asszociatív tömbben érhetőek el a globális változók értékei. Az alább látható add1.php és add2.php hasonlóan a $a és $b globális változók értékét adja össze egy függvény segítségével.

add1.php add2.php <?php $a = 1; $b = 2; function Osszead() { global $a, $b; $b = $a + $b; } Ossszead(); echo $b; ?>

<?php $a = 1; $b = 2; function Osszead() { $GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"]; } Osszead(); echo $b; ?>

A változók hatáskörének másik fontos lehetősége a static (statikus) változó. A statikus

változó csak lokális hatáskörben él - egy függvényen belül, de két függvényhívás közt nem veszti el az értékét, a változó hatásköréből való kilépés esetén is megmarad az értéke: function Test() { static $a = 0; echo $a; $a++; }

Valahányszor meghívódik a Test() függvény, kiírja $a értékét, majd azt megnöveli

eggyel. A statikus változók jól alkalmazhatóak rekurzív függvényhívások esetén.

Változók használata a változónevekben: A „változó változók” olyan változókat jelentenek, amelynek a nevét dinamikusan lehet

beállítani.

//normál változó értékadás $a = "hello"; //változó változó, amely az előbb definiált változó értékét tekinti változó nevének, és annak add értéket $$a = "világ"; //kiírja a 2 definiált változó értékét ($a=”hello”, $hello=”világ”), azaz kiírja, hogy: hello világ echo "$a ${$a}"; //az előző parancs így is írható echo "$a $hello";

Annak érdekében, hogy változó változókat tömbökkel együtt is használhassuk, fel kell oldani a következő kétértelműséget. A $$a[1] kifejezés kiértékelésekor a feldolgozónak tudnia kell, hogy ez a $a[1] értékét tekintse a hivatkozott változó neveként, vagy $$a-t - és ekkor és ennek a tömbnek 1. indexű elemére történt a hivatkozás. Az első esetben ${$a[1]}, míg a másodikban ${$a}[1] írandó.

Page 24: Diploma Aktiv Weboldal Keszites Php ASP

2. Webes aktív oldalak készítése adatbázis eléréssel 24 / 91

Konstansok létrehozása, hatókörük A konstans egy egyszerű érték neve, amelynek az értéke a program futása során nem

változik, kivétel a __FILE__ és __LINE__ konstansokat. A konstansok alapesetben érzékenyek a kis- és nagybetűs írásmódra. Megállapodás

szerint általában csupa nagybetűs neveket adunk a konstansoknak. A konstansok neveire a PHP más jelzőivel azonos szabályok vonatkoznak. Egy

érvényes konstans név betűvel vagy aláhúzással kezdődik, amit tetszőleges számú betű, szám vagy aláhúzás követ. A konstansok bárhonnan elérhetőek.

Konstanst a define() függvénnyel lehet létrehozni. Definiálása után később nem lehet

törölni vagy megváltoztatni az értékét. Csak skaláris adat (boolean, integer, double, string típusú) lehet egy konstans tartalma. A konstans értékére a nevének megadásával lehet hivatkozni. A változókkal ellentétben nem szabad $ jelet tenni a konstans neve elé. Használható még a constant() függvényt is, ha például a konstans nevét egy változó adja. A get_defined_constants() függvénnyel lehet a definiált konstansok listáját megkapni.

Megjegyzés: A konstansok és a (globális) változók különböző névtérben vannak. Ez azt jelenti, hogy a TRUE és a $TRUE két különböző dolgot jelent. Ha egy definiálatlan konstanst próbál meg használni, a PHP a konstans nevét veszi karaktersorozatként értékül. Ilyen esetekben egy notice szintű hiba keletkezik. A defined() függvény segítségével vizsgálható a konstans létezése. A következők a fontosabb különbségek a változókhoz képest:

A konstansok nevét nem kell dollár jellel $ kezdeni. A konstansokat akárhol definiálhatók, és akárhonnan elérhetők, a változók

környezeti korlátozásaitól függetlenül. A konstansok nem módosíthatóak, és nem törölhetőek, miután egyszer

létrehozták azokat. A konstansok csak skaláris értékeket tartalmazhatnak

<?php define("KONSTANS", "Helló világ!"); echo KONSTANS; // kiírja, hogy "Helló világ!" echo Konstans; // kiírja, hogy "Konstans" és hibát eredményez ?>

2.6. Munkamenet változók használata ASP-ben és PHP-ben Mivel az ASP és a PHP oldalakban definiált globális változó csak az adott ASP illetve

PHP oldal futása alatt létezik, ezért szükség van az olyan változók definiálására is, amelyek nem csak az adott ASP illetve PHP szkriptből érhető el. Erre szolgálnak a munkamenet változók, amelyeket egy másik oldalról is elérhetünk.

Munkamenet vagy alkalmazás hatókörű változók ASP-ben: A globális változók csak egyetlen .asp fájlban érhetők el. Ha egy adott változót a lapon

kívül is elérhetővé kívánunk tenni, akkor a változóhoz munkamenet vagy alkalmazás hatókört kell hozzáadnunk.

Page 25: Diploma Aktiv Weboldal Keszites Php ASP

2. Webes aktív oldalak készítése adatbázis eléréssel 25 / 91

A munkamenet hatókörű változók az ASP-alkalmazás minden olyan lapja számára elérhetők, amelyeket egy felhasználó kér. Az alkalmazás hatókörrel rendelkező változók az ASP-alkalmazás minden olyan lapja számára elérhetők, amelyeket bármelyik felhasználó kér.

A munkamenet-változók segítségével kényelmesen tárolhatók az adott felhasználó

adatai (például a felhasználói beállítások vagy a felhasználó neve, azonosítója). Az alkalmazásváltozók segítségével egy adott alkalmazás összes felhasználójának adatai tárolhatók – például egy alkalmazás-specifikus üdvözlés, vagy az alkalmazás által igényelt általános értékek.

Az ASP két olyan beépített objektumot tartalmaz, amelyben változókat tárolhat. E két

objektum a Session és az Application.

Munkamenet hatókör Változóhoz úgy adhat munkamenet hatókört, hogy a változót a Session objektumban

tárolja. Ezt úgy teheti meg, hogy értéket rendel az objektumban lévő egyik névvel rendelkező bejegyzéshez. Az alábbi parancsok például két új változót tárolnak a Session objektumban: <% Session("KeresztNév") = "Erik" Session("VezetékNév") = "Nagy" %>

A Session objektumban tárolt adatok a névvel rendelkező bejegyzésen keresztül kérdezhetők le a (<%= … %>) kimeneti direktíva vagy a Response.Write metódus segítségével. Az alábbi példa a kimeneti direktíva segítségével jeleníti meg a Session("KeresztNév") aktuális értékét:

Üdvözöljük kedves <%= Session("KeresztNév") %>

Ha az adott munkamenet hatókörű változóra egynél többször hivatkozik egy

parancsfájlban, lehet, hogy célszerűbb azt (a teljesítmény javítása érdekében) egy helyi változóhoz rendelni. Alkalmazás hatókör

Az adott változónak úgy adhat alkalmazás hatókört, hogy az Application

objektumban tárolja úgy, hogy értéket rendel az objektumban lévő egyik, névvel rendelkező bejegyzéshez. Az alábbi parancs például egy alkalmazás-specifikus üdvözlést tárol az Application objektumban:

<% Application("Üdvözlés") = "Üdvözli az Értékesítés osztály!" %>

Az alábbi példa a kimeneti direktíva segítségével jeleníti meg az

Alkalmazás("Üdvözlés") értékét.

<%= Application("Üdvözlés") %> Ha a parancsfájl most is alkalmazás hatókörű változóra hivatkozik, a teljesítmény

javítása érdekében célszerű azt helyi változóhoz rendelni.

Page 26: Diploma Aktiv Weboldal Keszites Php ASP

2. Webes aktív oldalak készítése adatbázis eléréssel 26 / 91

PHP munkamenet kezelő függvényei: Hasonlóan az ASP-ben leírt munkamenet kezeléshez, a PHP munkamenet kezelése is

lehetővé teszi adatok megőrzését az egymást követő oldal lekérdezések között. Ez képessé tesz még testreszabhatóbb oldalak készítésére.

Minden webhelyre látogató egy-egy egyedi azonosítót kap, az úgynevezett

munkamenet azonosítót (session azonosítót). Ez vagy egy sütiben (cookie) tárolódik a látogató gépén, vagy az URL-ben közlekedik oldalról oldalra.

A munkamenet támogatás lehetővé teszi tetszőleges számú változó megőrzését a PHP

oldal lekérdezések között. Ha egy látogató érkezik webhelyre, háromféleképpen kezdődhet el, vagy folytatódhat a munkamenete. Mindhárom esetben a PHP egy munkamenet azonosító érkezését várja. Ha nem érkezik, új munkamenetet indít.

Ha a session.auto_start PHP opció be van kapcsolva, a PHP automatikusan megkezdi /

folytatja a munkamenetet. Ha ez nincs bekapcsolva, akkor közvetlenül a session_start() függvénnyel, vagy közvetve a session_register() függvénnyel tudjuk a munkamenetet folytatni / megkezdeni. Ha egy érvényes azonosító érkezett, a korábban beállított munkamenet környezet visszaállításra kerül.

Minden a munkamenethez rendelt változó szerializálódik a PHP oldal futásának

befejeződésekor. A nem definiált, de munkamenethez rendelt változók a későbbi folytatásokban nem jönnek újból létre. Példa munkamenet változó használatára: PHP 4.0.6 utáni verziókban PHP 4.0.6 vagy régebbi verziókban <?php if (isset($HTTP_SESSION_VARS['szamlalo'])) { $HTTP_SESSION_VARS['szamlalo']++; } else { $HTTP_SESSION_VARS['szamlalo'] = 0; } ?>

<?php if (!isset($_SESSION['szamlalo'])) { $_SESSION['szamlalo'] = 0; } else { $_SESSION['szamlalo']++; } ?>

A $_SESSION változó használata (vagy a $HTTP_SESSION_VARS változó használata

PHP 4.0.6 vagy régebbi verzió esetén) javasolt biztonsági és olvashatósági szempontok miatt. A $_SESSION vagy $HTTP_SESSION_VARS használatával nincs szükség a session_register() / session_unregister() / session_is_registered() függvényekre. A programozók éppen úgy dolgozhatnak a munkamenet változókkal, mint a "normális" változókkal. Az alábbi módon törölhetünk egy munkamenet változót: <?php // Használd a $HTTP_SESSION_VARS tömböt PHP 4.0.6 vagy régebbi verzióban unset($_SESSION['szamlalo']); ?>

Az alább látható munkamenet változó bejegyzése a register_globals PHP opció

bekapcsolt állapota mellett lehetséges. Ennek bekapcsolása biztonsági és hatékonysági okokból nem ajánlott. <?php if (!session_is_registered('szamlalo')) { session_register("szamlalo"); $szamlalo = 0; } else { $szamlalo++; } ?>

A munkamenet változók tárolásának módja nagyban függ a PHP konfigurációjától.

Page 27: Diploma Aktiv Weboldal Keszites Php ASP

2. Webes aktív oldalak készítése adatbázis eléréssel 27 / 91

2.7. Megjegyzések, utasítások írása ASP-ben és PHP-ben Kétféle módon írhatunk megjegyzéseket ASP-ben. Az egyik, hogy aposztróf (’) után

írjuk a megjegyzést, a másik lehetőség, hogy Rem utasításként, a Rem kulcsszó után adjuk meg. ASP-ben általában egy sor egy utasítást szokott tartalmazni, ha a konzekvenciához tartani szeretnénk magunkat. Ebben az esetben a sorvége karakter (<ENTER>) választja el az egyes utasításokat. Ha egy sorban több utasítást is meg szeretnénk adni, akkor az utasításokat kettősponttal (:) választhatók el egymástól. Lásd az alábbi példát a megjegyzések írására:

Dim MyStr1, MyStr2 MyStr1 = "Hello" : Rem Megjegyzés az utasítás után kettősponttal elválasztva MyStr2 = "Goodbye" ' Ez is egy megjegyzés, nem szükséges a kettőspont. Rem Csak megjegyzést tartalmazó sor, nincs szükség a kettőspontra.

PHP-ben az utasítások - a C és a Perl nyelvhez hasonlóan - pontosvesszővel

végződnek. Valamint utasításblokk a kapcsos zárójelek között ( { } ) adható meg, pl. elágazás esetén. A záró határolójel (?>) szintén feltételezi az utasítás végét, tehát az alábbiak egyenértékűek:

<?php echo "Ez egy teszt"; ?> <?php echo "Ez egy teszt" ?>

A PHP támogatja mind a C, C++ és Unix shell-szerű megjegyzéseket (kommenteket).

Például:

<?php echo "Ez egy teszt"; // Ez egy egysoros c++ szerű komment /* Ez egy többsoros komment Még egy sor komment */ echo "Ez egy másik teszt"; echo "Ez az utolsó teszt"; # Ez egy shell-szerű komment ?>

Az "egysoros" kommentek valójában csak a sor végéig, vagy az aktuális PHP kód végéig tartanak, attól függően, hogy melyik jön előbb. <h1>Ez egy <?php# echo "egyszerű";?> példa.</h1> <p>A fenti fejléc kiírja 'Ez egy példa'.

A programblokkok kommentezésére alkalmas megjegyzéseket nem lehet egymásba ágyazni. <?php /* echo "Ez egy teszt"; /* Ebből a kommentből baj lesz */ */ ?>

Page 28: Diploma Aktiv Weboldal Keszites Php ASP

2. Webes aktív oldalak készítése adatbázis eléréssel 28 / 91

2.8. Operátor, kifejezés, elágazás, ciklus, eljárás ASP-ben Ebben a részben az ASP főbb programkonstrukcióit mutatom be szintaxisuk

megadásával és rövidebb példaprogramokon keresztül. Ismertetem, hogy milyen operátorokat használhatunk, milyen precedenciával értékelődnek ki a kifejezésekben szereplő operátorok. De a teljes részletesség nem célom. Továbbá ismertetem a lényegesebb programkonstrukciókat, azaz milyen módon lehet elágazásokat és ciklusokat írni, valamint hogy lehet függvényeket, eljárásokat meghívni és írni. Nem mutatnám be az előre megírt eljárásokat. Későbbiekben, ahol valamilyen beépített eljáráshívást használok és nem egyértelmű, hogy mire szolgál, ott megmagyarázom megjegyzésként.

Operátor Az egyes kifejezésekből, pl. változókból az operátorok segítségével újabb kifejezéseket

hozhatunk létre, amelyeknek az értékét szintén változókban tárolhatjuk, ha szükséges. Nagyon fontos, hogy az operátorok hogyan értékelődnek ki, azaz milyen operátor-precedencia szerint kerül meghatározásra az értékük.

Ha egy kifejezés több különböző kategóriájú operátort tartalmaz, akkor először az

aritmetikai operátorok értékelődnek ki, majd az összehasonlító operátorok és legvégül a logikai operátorok. Természetesen zárójelezéssel befolyásolhatjuk az operátorok kiértékelésének a sorrendjét.

Az összehasonlító operátorok azonos precedenciával rendelkeznek, azaz kiértékelésük

balról-jobbra sorrendben történik, ahogyan szerepelnek. Az aritmetikai és logikai operátorok a következő sorrendben értékelődnek ki (felül a nagyobb precedenciájú):

1. Aritmetikai operátorok 2. Összehasonlító operátorok 3. Logikai operátorok Negálás (-) Egyenlő (=) Not (logikai tagadás) Hatványozás (^) Nem egyenlő (<>) And (logikai ÉS) Szorzás és osztás (*, /) Kisebb mint (<) Or (logikai VAGY) Egész osztás (\) Nagyobb mint (>) Xor (logikai kizáró VAGY) Modulus (Mod) Kisebb egyenlő (<=) Eqv (logikai egyenlőség) Összeadás és kivonás (+, -) Nagyobb egyenlő (>=) Imp (logikai implikáció) String konkatenálás (&) Is

Ha egy kifejezésben a szorzás és az osztás együtt szerepel, akkor a kiértékelés balról-

jobbara történik. Ugyanez igaz, akkor, ha az összeadás és a kivonás szerepelnek együtt egy kifejezésben. A string konkatenáló operátor (&) nem aritmetikai operátor, de a precedenciája kisebb az aritmetikai operátorokénál, de nagyobb az összehasonlító operátoroknál. Az Is operátor egy objektum referencia összehasonlító operátor. Vagyis nem az objektumokat vagy azok értékét hasonlítja össze, hanem azt hogy, ugyanarra az objektumra hivatkoznak-e.

Kifejezés Az egyik legfontosabb kifejezés az értékadás, pl. A=10. A fenti operátorokat használva

bonyolultabb értékadásokat is le tudunk írni, pl. A=A-B+10. Valamint a kifejezések szerepelhetnek az utasítások - például az elágazás - feltétel részében, nem csak az értékadás jobb oldalán. A kifejezésekben szerepelhetnek eljáráshívások is, pl. A=MyFunc(A, B, 10)-5.

Page 29: Diploma Aktiv Weboldal Keszites Php ASP

2. Webes aktív oldalak készítése adatbázis eléréssel 29 / 91

Elágazás

A feltétel speciális kifejezés, nevezetesen a feltételnél mindig logikai változót, vagy logikai kifejezést várunk. Ha nem azt adunk meg, akkor a változóban tárolt szám vagy szöveg értéke határozza meg, hogy az adott feltétel igaz-e, vagy hamis-e. Szintaxis Példa If feltétel Then utasítások [Else else-utasítások ] If A > B Then A=A-B : C=1 Else B=B-A : C=0 If feltétel Then [utasítások] [ElseIf n. feltétel Then [elseif-utasítások]] . . . [Else [else-utasítások]] End If

If A >B Then A=A-B C=1 ElseIf A=B Then C=2 Else B=B-A C=0 End If

Select Case kifejezés [Case kifejezéslista] [utasítosok] [Case Else] [else-utasítások] End Select

Select Case strColor Case "red" strSzin = "piros" Case "green" strSzin = "zöld" Case "blue" strSzin = "kék" Case Else strSzin = "fekete" End Select

Ciklus While esetén, amíg igaz a feltétel, Until esetén, amíg a feltétel igazzá nem válik,

hajtja végig az utasításokat a ciklus. Do … Loop ciklus belsejéből az Exit Do utasítással is kiléphetünk.

Szintaxis Példa Do [{While | Until} feltétel] [utasítások] [Exit Do] [utasítások] Loop

C=20 Do Until c=0 C=C-1 Loop

Do [utasítások] [Exit Do] [utasítások] Loop [{While | Until} feltétel]

Dim Check, Counter Check = True: Counter = 0 ' Kezdő értékadás a változóknak. Do ' Küldő ciklus. Do While Counter < 20 ' Belső ciklus. Counter = Counter + 1 ' Számláló növelése. If Counter = 10 Then Check = False Exit Do ' Kilépés a belső ciklusból. End If Loop Loop Until Check = False ' Kilépés a külső ciklusból.

Rem Tömb összes eleme szerinti ciklus. For Each elem In csoport [utasítások] [Exit For] [utasítások] Next

Dim tomb[10] Rem Értékadás tömbnek Dim szumma ' Ebbe kerül bele szumma=0 For Each elem In tomb szumma = szumma + elem Next

Rem számláló kezdőértékét növeli (csökkenti) a lépés értéké- Rem vel, amíg kisebb (nagyobb) egyenlő, mint a végérték For számláló = kezdőérték To végérték [Step lépés] [utasítások] [Exit For] [utasítások] Next

For I = 1 To 10 For J = 2 To 30 Step 2 IJ = I * J Next Next

Rem addig hajtja végre, amíg igaz (TRUE) a feltétel While feltétel Wend

Dim C C = 0 While c<20 C = C + 1 Wend

Page 30: Diploma Aktiv Weboldal Keszites Php ASP

2. Webes aktív oldalak készítése adatbázis eléréssel 30 / 91

Eljárás

Szintaxis Példa Rem Függvény írása, ami rendelkezik visszatérési értékkel [Public [Default] | Private] Function név [(argumentumlista)] [utasítások] [név = kifejezés] [Exit Function] [utasítások] [név = kifejezés] End Function

Rem ASP-ben Public és Private nem játszik fontos szerepet Function Osszeg ( numA, numB) Osszeg = 0 If numA < 0 And numB < 0 Then Exit Function Osszeg = A + B End Function

Rem Eljárás írása, nincsen visszatérési értéke [Public [Default] | Private] Sub név [(argumentumlista)] [utasítások] [Exit Sub] [utasítások] End Sub

Sub Eljaras (numP) If numP > 0 Then Response.Write ”Pozitív szám” Else Response.Write ”Negatív szám” End Sub

Rem Függvény vagy eljárás hívása [Call] név [(argumentumlista)]

Call Osszes(2, 3) Eljaras(4)

Rem név futtatása, különösen érdekes A = B esetén, ami Rem lehet értékadás vagy logikai kifejezés is Execute név

Execute B = 6 S = "Sub Proc2" & vbCrLf S = S & " Print X" & vbCrLf S = S & "End Sub" Execute S

Rem kiértékeli a név kifejezést Eval név

Eval A*B+C Eval A=5

2.9. Operátor, kifejezés, elágazás, ciklus, eljárás PHP-ben Ebben a fejezetben az előző fejezethez hasonlóan a PHP főbb programozási elemeit

mutatom be. A PHP erősen kifejezés-orientált nyelv. A legegyszerűbb kifejezések a változók és az állandók. Értékadás segítségével, valamint az operátorok használatával új kifejezéseket hozhatunk létre. Lényegesen több operátor van a PHP nyelvben, mint az ASP. Hasonlóan itt is, ha külön zárójelezéssel nem jelezzük, akkor az operátorok precedenciája határozza meg, hogy mi lesz az új kifejezés értéke. Továbbá ismertetem a hagyományos programozási konstrukciókat példákon keresztül: elágazás, ciklus, eljárás.

Operátor Az operátorok itt is több kategóriába sorolhatók: aritmetikai, hozzárendelő,

bitorientált, összehasonlító, hibakezelő, végrehajtó, növelő/csökkentő, logikai, string. Kategóriák szerint külön felsorolom rövid megjegyzésekkel az egyes operátorokat.

A PHP-ben számos olyan operátort találhatunk, amely kifejezhető máshogy is, ilyenek

például, a speciális hozzárendelő operátorok (+=, -=, *=, /=, %=, stb.). Például az összeadás esetén az ’$a = $a + 3;’ utasítás helyett egyszerűen ’$a +=3;’ utasítást írhatunk.

Az alábbi táblázatban látható az operátorok precedenciája, illetve az asszociativitás

iránya. Az összehasonlító operátorok nem köthető operátorok, mivel itt az asszociativitás nem értelmezett. PHP-ben nem implementálták a hatványozást, arra a pow() függvény szolgál. A táblázat az operátorkat precedenciájuk szerint növekvő sorrendben tartalmazza.

Page 31: Diploma Aktiv Weboldal Keszites Php ASP

2. Webes aktív oldalak készítése adatbázis eléréssel 31 / 91

Asszociativitás Operátorok balról-jobbra , balról-jobbra or balról-jobbra xor balról-jobbra and jobbról-balra print balról-jobbra =, +=, -=, *=, /=, .=, %=, &=, |=, ^=, ~=, <<=, >>= balról-jobbra : ? balról-jobbra || balról-jobbra && balról-jobbra ^ balról-jobbra & nem köthető ==, !=, ===, !== nem köthető <, <=, >, >= balról-jobbra <<, >> balról-jobbra +, -, . balról-jobbra *, /, % jobbról-balra !, ~, ++, --, (int), (float), (string), (array), (object), @ jobbról-balra [ ] nem köthető new()

Aritmetikai operátorok: összeadás (+), kivonás (-), szorzás (*), osztás (/), modulus

(%). Az osztás egész osztás, vagyis az eredmény egész lesz, kivéve ha az egyik operandus lebegőpontos szám volt.

Alapvető hozzárendelő operátor: = . Például: $a = ($b = 4) + 5. Itt $b értéke 4 és $a értéke 9.

Speciális hozzárendelő operátorok: +=, -=, *=, /=, .=, %=, &=, |=, ^=, ~=, <<=, >>= . Az alapvető hozzárendelő operátor és az előtte álló operátor kombinációja, lerövidíti az értékadásokat, pl. $a = $a + 3 helyett $a += 3 írható.

Bitorientált operátorok: bitenkénti ÉS (&), bitenkénti VAGY (|), bitenkénti kizáró VAGY (^), bitenkénti tagadás (~), eltolás balra (<<), eltolás jobbra (>>). Bitenkénti tagadás egyoperandusú, míg a többi kettő. Valamint $a<<$b illetve $a>>$b esetén az $a változó bitjeit toljuk el balra, illetve jobbra a $b számú bittel.

Összehasonlító operátorok: egyenlő (==), azonos (===), nem egyenlő (!= vagy <>), nem azonos (!===), kisebb mint (<), nagyobb mint (>), kisebb egyenlő (<=), nagyobb egyenlő (>=). Az azonos operátor annyiban tér el az egyenlő operátortól, hogy nem csak az értékek egyenlősége kerül összehasonlításra, hanem az is, hogy azonos típusúak-e. Feltételes operátor ($a ? $b : $c) úgy működik, mint a C-ben, azaz, ha az $a értéke igaz, akkor $b kifejezést értékeli ki, ha hamis, akkor $c kifejezést.

Hibakezelő operátor: @ . Az operátort egy PHP kifejezés elé írva a kifejezés által esetlegesen generált hibaüzenete(ke)t figyelmen kívül hagyja a rendszer.

Végrehajtó operátor: `` . Az operátor közé írt parancsot futtatja, pl.: $o = `ls -la`; Növelő/csökkentő operátorok: ++$a, --$a, $a++, $a-- . Az első kettő, előbb növeli

illetve csökkenti az $a változó értékét eggyel, majd visszatér az értékével, míg az utolsó kettő, előbb visszatér $a értékével majd növeli illetve csökkenti azt.

Logikai operátorok: logikai ÉS (and vagy &&), logikai VAGY (or vagy ||), logikai kizáró vagy (xor), logikai tagadás (!).

String operátorok: konkatenáció (.), hozzárendelő konkatenáció (.=).

Kifejezés Mindent, amely értékkel tér vissza kifejezésnek tekintünk. Ide tartoznak a változók,

állandók, függvények (mivel van visszatérési értékük); valamint ezekből a kifejezésekből az operátorok segítségével felírt összetettebb kifejezések. ASP-ben nem található meg, de hasznos lehet számunkra a növelő/csökkenő operátor, valamint a hozzárendelő operátor segítségével felírt kifejezések.

Page 32: Diploma Aktiv Weboldal Keszites Php ASP

2. Webes aktív oldalak készítése adatbázis eléréssel 32 / 91

Elágazás PHP-ben hasonlóan az ASP-hez kétféle módon írhatunk elágazást. A kifejezés helyén

itt is logikai változót várunk el, ha más szerepelne ott, akkor boolean típusra konvertálódik. Az utasítás helyén szerepelhet utasításblokk, ilyenkor az utasításokat kapcsos zárójel ( { } )között kell megadni.

Szintaxis Példa if (kifejezés): utasítások; elseif (kifejezés n.): utasítások; else: utasítások; endif;

if ($a > $b): $c = 0; print $a; elseif ($a == $b): $c = 1; print ”egyenlő”; else: $c = 2; print $b; endif;

if (kifejezés1) utasítás; elseif (kifejezés n.) elseif-utasítás; else else-utasítás;

if ($a > $b) { $c = 0; print $a; } elseif ( $a == $b) { $c = 1; print ”egyenlő”; } else { $c = 2; print $b; }

//Hasonló a C-ben levőhöz, ha a kifejezés értékét megtalálja //valamelyik ágon, akkor onnan az összes utasítás lefut //a switch végéig, ha nem használjuk a break utasítást. switch (kifejezés) { case érték1: utasítások; case érték2: utasítások; … case értékN: utasítások; default: utasítások; }

switch $szam { case 1: print ”egy”; break; case 2: print ”kettő”; break; case 3: print ”három”; break; default: print ”nem 1 vagy 2 vagy 3”; }

Ciklus Szintaxis Példa while (kifejezés) utasítás; $i = 1;

while ($i < 10) print $i++; while ($i < 20) { print $i; $i++; }

while (kifejezés): utasítások; endwhile;

$i = 1; while ($i <= 10): print $i; $i++; endwhile;

do { utasítások; } while (kifejezés);

$i = 10; do { print $i--; } while ($i > 0);

for (kif1; kif2; kif3) utasítás; for (kif1; kif2; kif3): utasítások; endfor;

// for ciklus megfelel a következőnek: kif1; while (kif2) { utasítás; kif3; }

//tömb összes elemét iterálhatjuk foreach(tömb_kifejezés as $ertek) utasítás; foreach(tömb_kifejezés as $kulcs => $ertek) utasítás;

foreach ($tomb as $ertek) { echo "Érték: $ertek<br>\n"; } foreach ($tomb as $kulcs => $ertek) { print "\$tomb[$kulcs] => $ertek.\n"; }

Page 33: Diploma Aktiv Weboldal Keszites Php ASP

2. Webes aktív oldalak készítése adatbázis eléréssel 33 / 91

A ciklusutasítások (do … while, while, for, foreach) belsejében, valamint a switch utasításban használható a break utasítás, amely a ciklus utáni utasításra adja a vezérlést. A ciklusokban használható még a continue utasítás, amely a ciklus elejére ugrik, átugorva a continue utasítás után álló utasításokat.

Eljárás PHP 3-ban a függvényeket definiálni kell, mielőtt hivatkozás történik rájuk

(függvényhívás előtt). PHP 4-ben nincs ez a megkötés. A PHP nem támogatja a függvények polimorfizmusát (többalakúságát), a függvény definíciókat nem lehet megszüntetni vagy újradefiniálni, ha egy függvény már definiált. A PHP 3 nem támogatja a változó számú függvényargumentumokat, bár az argumentumok kezdőértéke támogatott. A PHP 4 mindkettő lehetőséget támogatja.

Szintaxis Példa // PHP-ben a függvényeknek mindig van visszatérési értéke, // amit nem kötelező megadni, ebben az esetben // az utolsó utasítás értéke lesz a visszatérési érték function fuggveny ($arg_1, $arg_2, ..., $arg_n) { utasítások; return $retval; //hatására rögtön befejeződik a függvény } function fuggveny( $arg = $ertek) { //$arg belső változó, ezért az eredeti változóra nincs //hatással, a következő értékadás $arg=$uj_ertek; utasítások; return $retval; } /* Referencia szerinti értékadás, hasznos lehet hatékonyság szempontjából, ha bonyoltabb struktúrájú változót adunk át, vagy ha a paraméter értékét kell változtatni. */ funcion fuggveny( &$refer ) { $refer = $var; }

function szumma ($arg_1, $arg_2) { echo "Számolok.\n"; $retval = $arg_1 + $arg_2; return $retval; } function ize() { $parameterek_szama = func_num_args(); echo "argumentumok száma: {$parameterek_szama}\n"; if ($parameterek_szama >= 2) { echo "A második paraméter: " . func_get_arg (1) . "\n"; } }

//function fuggveny által definiált függvény meghívása fuggveny(par1, par2, …, parN);

//a $szumma és a szumma() két különböző kifejezés $szumma = szumma(2, 3); ize(1, 2, 3);

2.10. Fájlok beágyazása ASP-ben és PHP-ben Már az SSI kapcsán említésre került az #include direktíva. ASP-ben is használható

direktíva nagyon jól használható, már megirt ASP-oldalak betöltésére, amelyek különféle eljárásokat tartalmaznak. Így nem kell minden oldalon elhelyezni a sűrűn előforduló eljárásokat.

Egy beágyazott fájl tartalmazhat más beágyazott fájlokat. Egy .asp fájlba ugyanazt a

fájlt többször is be lehet ágyazni, feltéve, hogy az #include direktívák nem hoznak létre hurkot. Például, ha az Első.asp fájlba beágyazza a Második.inc fájlt a Második.inc fájlba nem ágyazhatja az Első.asp fájlt. Egy fájl önmagába sem ágyazható. Az ASP felderíti ezeket a hurok- és beágyazási hibákat, hibaüzenetet küld és felfüggeszti a kívánt .asp fájl feldolgozását.

Page 34: Diploma Aktiv Weboldal Keszites Php ASP

2. Webes aktív oldalak készítése adatbázis eléréssel 34 / 91

Az ASP a fájlokat a parancsfájl-utasítások végrehajtása előtt beágyazza. Ezért a beágyazott fájl nevének létrehozásához parancsfájl-utasítás nem használható. Tehát a beágyazandó fájl nevében nem szerepelhet változó értéke, mivel akkor még nincsen az adott változóhoz érték rendelve.

PHP-ben hasonló szerepet játszanak az include() és require() függvények, amelyek

segítségével a paraméterként megadott fájlt illeszthetjük be és dolgozhatjuk fel. A két függvény egyenértékű, csak a hibakezelésben térnek el, az include() csak figyelmeztetést, míg a require() fatális hibát generál. Hasonlóan igaz ez az include_once() és a require_once() függvényekre, de itt ha többször próbálnánk meg beilleszteni az adott fájlt a PHP szkrtipbe, akkor már nem illeszti be újra. Ez nagyon hasznos akkor, ha a beillesztett fájlban függvényeket definiálunk. Mivel nem lehet egy függvényt újradefiniálni, a második beillesztésnél hibaüzenetet kapnánk.

Az ASP-vel szemben a PHP-ben már használhatunk tetszőleges kifejezést, amikor

megadjuk a beágyazni kívánt fájl útvonalát: <?php require_once("local.php"); require_once("../inc/global.php"); for ($i=1; $i<5; $i++) include "util".$i."php"; echo "Required_once files\n"; print_r(get_required_files()); echo "Included_once files\n"; print_r(get_included_files()); ?>

A get_required_files() és a get_included_files() függvényekkel lekérdezhetjük,

hogy milyen fájlok lettek már beillesztve. Részben ide sorolható a readfile() függvény, amely egy fájlt olvas be és ír ki a

kimenetre, ez a fájl lehet lokális, vagy akár URL segítségével megadott távoli fájl is. A virtual() függvény használható az Apache #include direktívájához hasonlóan.

Fontos megjegyezni, hogy a fájl nem lehet PHP fájl, arra az include() használandó. A virtual() hasznos SSI direktívákat tartalmazó oldalak (.shtml fájlok) beágyazására.

2.11. Űrlapadatok feldolgozása ASP-ben és PHP-ben A HTML-űrlapok a webalapú információk gyűjtésének leggyakoribb módjai. Speciálisan

elrendezett HTML-kódokat tartalmaznak, amelyek a felhasználói felület elemeit weblapon jelenítik meg. Ezek az elemek (például szövegmezők, gombok és jelölőnégyzetek) teszik lehetővé a weblapok interaktív használatát, és adatok továbbítását a webkiszolgálónak.

Az alábbi HTML-kódok például egy olyan űrlapot hoznak létre, amelyen a felhasználó

beírhatja a keresztnevét, vezetéknevét és életkorát, és tartalmaz egy gombot, amellyel ezen adatokat a webkiszolgálónak továbbíthatja. Az űrlap tartalmaz még egy rejtett beviteli kódot is (ez nem jelenik meg a böngészőben), amelynek segítségével további adatok juttathatók el a webkiszolgálónak.

Page 35: Diploma Aktiv Weboldal Keszites Php ASP

2. Webes aktív oldalak készítése adatbázis eléréssel 35 / 91

<FORM METHOD="Get" ACTION="profile.cgi"> <INPUT TYPE="Text" NAME="VezetékNév"> <INPUT TYPE="Text" NAME="KeresztNév"> <INPUT TYPE="Text" NAME="Kor"> <INPUT TYPE="Hidden" NAME="FelhasználóÁllapota" VALUE="Új"> <INPUT TYPE="Submit" VALUE="Bevitel"> </FORM>

Az első sorban az ACTION után kell megadni, hogy melyik, a webszerveren található

oldalnak küldje el az űrlap információkat. Ez általában egy CGI program, ugyanis az űrlapadatokat át kell venni, és fel kell dolgozni. Ez természetesen lehet egy ASP vagy egy PHP szkript is.

Három egyszerű módon lehet adatokat gyűjteni HTML-űrlapokról: statikus .htm fájlok tartalmazhatnak olyan űrlapot, amely értékeit egy .cgi fájlnak

továbbítja egy adott .cgi fájl létrehozhat egy olyan űrlapot, amely az adatokat egy másik .cgi

fájlnak továbbítja, valamint egy adott .cgi fájl létrehozhat olyan űrlapot, amely az adatokat visszaküldi az

űrlapot tartalmazó .cgi fájlnak. A következőkben bemutatom, hogy miként kezeli le az űrlap által küldött adatokat az

ASP valamint a PHP. De előtte még érdemes kitérni arra, hogy kétféle metódus létezik (method=”get” és a method=”post”) a HTML-űrlapok elküldése során. „Get” metódus esetén az űrlap adatok .cgi fájl neve mögött egy kérdőjel után felsorolva jelennek meg. Ez az úgynevezett QueryString. Ilyen módon akkor is tudunk adatokat átadni a CGI programnak, ha az nem űrlapból származik, hanem például egy hivatkozásban (<A HREF=”http://localhost/profile.cgi?kor=20”>példa</A>) fordul elő. „Post” metódus esetén az adatok az HTTP-kérés törzsében kerülnek továbbításra a feldolgozó programhoz. Fontos különbség még, hogy „get” metódus esetén csak ASCII karakterek szerepelhetnek.

A fenti űrlap esetén a QueryString a következőképpen néz ki, ha az űrlapba a

felhasználó ezeket az adatokat írja: Kovács, Béla, 30. Természetesen a .cgi helyén .php vagy .asp szerepel, ha PHP vagy ASP parancsértelmezőnek küldjük az űrlapadatokat.

http://localhost/profile.cgi?Vezetéknév=Kovács&Keresztnév=Béla&Kor=30&FelhasználóÁllapota=Új http://localhost/profile.asp?Vezetéknév=Kovács&Keresztnév=Béla&Kor=30&FelhasználóÁllapota=Új http://localhost/profile.php?Vezetéknév=Kovács&Keresztnév=Béla&Kor=30&FelhasználóÁllapota=Új

Az ASP-ben a Request objektum segítségével kérdezhetjük le az űrlapok által

elküldött információkat. Az alábbi utasítással megjeleníthetjük az űrlap „KeresztNév” mezőjébe írt információt. <%= Request.QueryString("KeresztNév") %>

Mivel az URL-kérésben többször is elküldésre kerülhet egy mező, pl. többelemű lista

kiválasztása esetén, vagy az alábbi hivatkozás esetén: http://localhost/lista.asp?Étel=Alma&Étel=Olíva&Étel=Kenyér

Ebben az esetben Request.QueryString("Étel").Count mondja meg, hogy hányszor

fordult az érték, és az alábbi ciklus segítségével kérdezhetjük le az összes értéket (egymás alá kiírja az ételek nevét): <% lngTotal = Request.QueryString("Étel").Count For i = 1 To lngTotal Response.Write Request.QueryString("Étel")(i) & "<BR>" Next %>

Page 36: Diploma Aktiv Weboldal Keszites Php ASP

2. Webes aktív oldalak készítése adatbázis eléréssel 36 / 91

Az alábbi utasítás vesszővel elválasztva felsorolja az ételeket: <% Response.Write Request.QueryString("Étel") %>

A „get” metódus másik hátránya, hogy a webkiszolgáló korlátozhatja az általa feldolgozandó URL hosszát, így bizonyos információk elveszhetnek. Ennek elkerülése érdekében ajánlott a „post” metódus használata. A Request.QueryString-hez hasonlóan a Request.Form tárolja a „post” által elküldött adatokat. Teljesen hasonlóan használható, mint a QueryString, lásd az alábbi példát: <% lngTotal = Request.Form("Étel").Count For i = 1 To lngTotal Response.Write Request.Form("Étel")(i) & "<BR>" Next %> Megjegyzés:

Minden változó a gyűjteménynév (Form, QueryString, Cookies) nélkül közvetlenül elérhető a Request(változó) objektum meghívásával. Ebben az esetben webkiszolgáló az alábbi sorrendben végez keresést a gyűjteményekben: QueryString, Form, Cookies, ClientCertificate, ServerVariables.

PHP-ben egy HTML-űrlap elküldésével az űrlap összes beviteli mezőjének értéke

automatikusan elérhetővé válik a szkript számára. Ha a track_vars PHP szolgáltatás be van kapcsolva, ezek a változók a $HTTP_POST_VARS, $HTTP_GET_VARS, és/vagy $HTTP_POST_FILES asszociatív tömbökben foglalnak helyet a változók forrásának megfelelően.

<form action="foo.php" method="post"> Name: <input type="text" name="usernev"><br> <input type="submit"> </form

Ha elküldjük a fenti űrlapot, akkor a PHP létrehozza a $HTTP_POST_VARS['usernev']

változót. Ha a register_globals beállítás aktív, akkor ez a változó elérhető lesz $usernev globális változóként is. A PHP megérti és kezeli a tömbökbe rendezett űrlapváltozókat. Hasznos lehet csoportosítani az összetartozó változókat, vagy az olyan űrlapelemeket, ahol több lehetőség közül nem csak egy választható.

<form action="array.php" method="post"> Név: <input type="text" name="szemelyes[nev]"><br> Email: <input type="text" name="szemelyes[email]"><br> Sör: <br> <select multiple name="ital[]"> <option value="warthog">Warthog <option value="guinness">Guinness <option value="stuttgarter">Stuttgarter Schwabenbräu </select> <input type="submit"> </form>

Az űrlap elküldésekor megoldható, hogy gomb helyett képet használunk ilyesféle

jelölés segítségével:

<input type="image" src="image.gif" name="elkuld"> Ha a felhasználó a képre kattint, a kiszolgálóra a következő két változó jut el:

elkuld_x-et és elkuld_y-t. Ezek tartalmazzák a kattintás képen belüli koordinátáit. Eredetileg ezek a változók elkuld.x és elkuld.y néven szerepelnek. De a PHP a pontot automatikusan aláhúzássá konvertálja, mivel a változónévben a pont nem érvényes karakter. Minden bejövő változó esetén ez az automatikus konvertálás végbemegy.

Page 37: Diploma Aktiv Weboldal Keszites Php ASP

2. Webes aktív oldalak készítése adatbázis eléréssel 37 / 91

2.12. Sütik (cookie-k) használata ASP-ben és PHP-ben A sütik lehetővé teszik azt, hogy adatokat tároljunk a kliens gépen, így követve vagy

azonosítva a visszatérő látogatókat. A webkiszolgáló küldi el a HTTP-fejlécben a kliens felé a következőhöz hasonló formában: Set-Cookie:SAJÁT1_COOKIE=csak_adat Set-Cookie:SAJÁT2_COOKIE=TÍPUS1=adat&TÍPUS2=valami+adat

A klienstől függ, hogy engedélyezi-e a sütik tárolását. Ha igen, akkor a következő

látogatás alkalmával a webszerver által előzőleg tárolt sütiket szintén elküldi a webkiszolgálónak.

A sütiknek van egy neve, valamint egy kulcsa (de ez nem kötelező), de ha van kulcs,

akkor az állhat alkulcs-érték párosból is. A fenti példában a SAJÁT1_COOKIE nevű sütinek csak értéke van, míg a SAJÁT2_COOKIE sütinek van két kulcsa, TÍPUS1 kulcsnak az értéke „adat”, a TÍPUS2 kulcsnak az értéke „valami adat”. Ezen kívül a sütikhez megadhatunk egy domain nevet, egy elérési útvonalat, egy lejárat dátumot és azt, hogy biztonságos-e a süti.

ASP-ben a sütik értékét a Response.Cookies() segítségével állíthatjuk be. Ennek a

szintaxisa a következő:

Response.Cookies(cookie)[(kulcs)|.attribútum] = érték

A cookie a süti neve. A kulcs nem kötelező paraméter. Ha meg van adva, akkor a cookie-t szótárként értelmezi a program, kulcs beállítása pedig az érték lesz. Az attribútum megadja a sütire vonatkozó adatokat. Az érték a kulcs vagy az attribútum paraméterekhez rendelendő érték. Az attribútum paramétere az alábbiak egyike lehet:

Név Leírás Domain Csak írható. Megadása esetén a sütit csak az erre a tartományra

érkező kérelmekre küldi el a program. ExpiresAbsolute Csak írható. A süti lejáratának dátuma. Ezt a dátumot meg kell adni

annak érdekében, hogy a sütit a program a munkamenet befejezését követően az ügyfél lemezén tárolhassa. Amennyiben ez az attribútum nem az aktuális dátumot követő dátumot ad meg, a süti a munkamenet végeztével lejár.

Expires Hasonló mint az előző, de nem dátumot, hanem másodpercet vár. HasKeys Csak olvasható. Megadja, hogy a süti tartalmaz-e kulcsot. Path Csak írható. Megadása esetén a program a sütit csak az erre az elérési

útra vonatkozó kérelmekre küldi el. Ha az attribútum nincs beállítva, az alkalmazás elérési útja érvényesül.

Secure Csak írható. Megadja, hogy a süti biztonságos-e.

A sütik lekérdezésére a Request.Cookies függvény szolgál. Szintaxisa megegyezik a

Response.Cookies szintaxisával, csak annyiban tér el, hogy az érték csak olvasható és az attribútumok közül csak a HasKeys elérhető. Ha nem adunk meg kulcsot, de a sütink alkulcs-érték párokat tartalmaz, akkor a lekérdezésnél a teljes értéket kapjuk vissza.

<% Rem Az alábbi mycookie értéke a fenti beállítás esetén a következő: ”TÍPUS1=adat&TÍPUS2=valami+adat” saját_cookie=Request.Cookies(”SAJÁT2_COOKIE”) Rem Az alábbi sajáttípus1_cookie értéke a fenti beállítás esetén a következő: ”adat” sajáttípus1_cookie=Request.Cookies(”SAJÁT2_COOKIE”)(”TÍPUS1”) Rem Az alábbi sajáttípus2_cookie értéke a fenti beállítás esetén a következő: ”valami adat” sajáttípus2_cookie=Request.Cookies(”SAJÁT2_COOKIE”)(”TÍPUS2”) %>

Page 38: Diploma Aktiv Weboldal Keszites Php ASP

2. Webes aktív oldalak készítése adatbázis eléréssel 38 / 91

PHP-ben a sütik beállítása a setcookie() függvénnyel lehetséges. A sütik részei a HTTP-fejlécnek, így a setcookie() függényt azelőtt kell meghívni, mielőtt bármilyen kimenetet küldenénk a böngészőnek. Ez a header() függvénnyel megegyező korlátozást jelent. A header() közvetlen HTTP-fejlécet küld. Egyik ilyen HTTP-fejléc a MIME típus megadása, ez ASP-ben a Response objektumon keresztül adható meg:

<?php //PHP-ben ha JPG képet állítunk elő, akkor a MIME típust be kell állítani, még mielőtt bármit kiíratnánk. header ("Content-type: image/jpg"); ?> <% Rem ASP-ben a MIME típus beállítása, szintén meg kell előznie bármilyen kiírató utasítást. Response.ContentType = "image/jpg" %>

A kimenetet szabályzó függvények (ob_start(), ob_end_flush()) használhatók

arra, hogy a kimenetet késleltessük addig, amíg minden süti és fejléc elküldésre kerül.

<?php ob_start(); echo "Szia\n"; setcookie ("sutineve", "sutiadat"); ob_end_flush(); ?>

A setcookie() pontos szintaxisa, ahol a name a süti neve, a value a süti értéke,

expire a lejárat dátuma másodpercekben, path az elérési útvonal valamint a domain az a tartomány, amely esetén el kell küldeni a sütit és a secure pedig, hogy biztonságos legyen-e: int setcookie ( string name [, string value [, int expire [, string path [, string domain [, int secure]]]]])

<? //Az alábbi süti lejárati dátuma a múltban van, így a munkamenet végeztével meg is szűnik. //Csak a /~user/ útvonal és *.cegnev.hu domain esetén küldi el a sütit biztonságos módon. setcookie ("TestCookie", "", time() - 3600, "/~user/", ".cegnev.hu", 1); ?>

Minden süti, amit a klienstől visszakapunk, automatikusan PHP változóvá válik, pont

úgy, mint a „get” és a „post” kérésekkel érkező adatok, feltéve, hogy a register_globals és variables_order php.ini beállítások ennek megfelelően vannak beállítva. Ha több értéket szeretnél adni egy sütinek, adjunk hozzá a szokásos [] végződést a süti nevéhez, ahol [] közé írjuk be a süti nevéhez tartozó kulcsot.

A PHP 4.1.0 és későbbi változataiban a $_COOKIE nevű mindenhonnan látható változó

mindig létrejön, tartalmazva a klienstől érkezett sütiket. A $HTTP_COOKIE_VARS a korábbi verziókban használható, ha a track_vars php.ini beállítás be van kapcsolva, bár ez a változó nem látszik mindenhonnan. A következő példa elhelyez a kliens gépen sütiket, majd a következő betöltéskor meg is jeleníti azokat: <?php setcookie ("sajat_cookie[kulcs1]", "ertek1"); setcookie ("sajat_cookie[kulcs2]", "ertek2"); setcookie ("sajat_cookie[kulcs3]", "ertek3"); if (isset ($sajat_cookie)) { while (list ($name, $value) = each ($cookie)) { echo "$name == $value<br>\n"; } } ?>

Page 39: Diploma Aktiv Weboldal Keszites Php ASP

2. Webes aktív oldalak készítése adatbázis eléréssel 39 / 91

2.13. Adatbáziskapcsolat ASP-ben és PHP-ben Mint a bevezetőben említettem, az ASP-ben azt szeretném megmutatni, hogy miként

lehet kapcsolódni egy Microsoft SQL adatbázishoz, abban táblát létrehozni, adatokat beszúrni, illetve az ott található táblákon lekérdezéseket végrehajtani. Az adatbázishoz az OLE DB kapcsolat-karakterlánc segítségével lehet kapcsolódni: <% 'Connection objektum létrehozása Set dbConn = Server.CreateObject("ADODB.Connection") 'Kapcsolat megnyitása az OLE DB kapcsolat-katrakterlánc használatával dbConn.Open "DSN=WEBSQL;DATABASE=aspdb;UID=msuser;PWD=asp123" ’Ide kerülnek az adatbázis műveletek ’Adatbázis kapcsolat lezárása dbConn.Close %>

Ahhoz, hogy ez működjön a Windowsban a Vezérlőpultnál, az ODBC adatforrásokban

be kell állítani az SQL szerver elérését, ahol is egy új adatforrást kell felvenni (SQL Server), majd megadni neki egy tetszőleges nevet (a fenti példában WEBSQL), leírást és egy kiszolgáló szervert, ami alapértelmezés szerint a localhost, a Microsoft SQL 2000 Server telepítésnél leírtak alapján ez a \\HOMEPC\HOMESQL instanciának felel meg.

Az adatbázis műveletek egy SQL kérés futtatásával történnek. Csak a tipikus adatbázis

műveleteket szeretném bemutatni, azaz, hogyan lehet egy táblát létrehozni, hogyan lehet sort beszúrni, módosítani, törölni, hogyan lehet egy táblát törölni. Aztán a legtöbbet használt részre térnék ki, hogyan is lehet lekérdezni egy adatbázis tábla tartalmát. Az alábbi példaprogramban találhatóak az adatbázis műveletek, megjegyzéssel együtt: <% Set dbConn = Server.CreateObject("ADODB.Connection") dbConn.Open "DSN=WEBSQL;DATABASE=aspdb;UID=msuser;PWD=asp123" ’A nevek tábla létrehozása, amelynek 3 oszlopa van: vezetéknév, keresztnév, kor SQLcmd = ”CREATE TABLE nevek (vezeteknev varchar(30), keresztnev varchar(30), kor integer);” ’SQL parancs futtatása dbConn.Execute (SQLcmd) ’Beszúrás az előzőleg létrehozott táblába SQLcmd = ”INSERT INTO nevek VALUES(’Kovács’, ’Béla’, ’43’);” dbConn.Execute (SQLcmd) ’ Az előzőleg beszúrt sor módosítása SQLcmd = ”UPDATE nevek SET kor=’45’ WHERE vezeteknev=’Kovács’ AND keresztnev=’Béla’ AND kor=’43’;” dbConn.Execute (SQLcmd) ’ Az előzőleg beszúrt sor törlése SQLcmd = ”DELETE nevek WHERE vezeteknev=’Kovács’ AND keresztnev=’Béla’ AND kor=’45’;” dbConn.Execute (SQLcmd) ’ Az egész tábla törlése SQLcmd = ”DROP TABLE nevek;” dbConn.Execute (SQLcmd) dbConn.Close %>

Ha egy SQL lekérdezést hajtunk végre, akkor az eredménytábla, egy Recordset típusú

objektum lesz. Ezen az objektumon keresztül olvashatjuk ki a táblából az aktuális sor tartalmát, majd léptethetjük az aktuális sort a következőre.

Page 40: Diploma Aktiv Weboldal Keszites Php ASP

2. Webes aktív oldalak készítése adatbázis eléréssel 40 / 91

<% Set dbConn = Server.CreateObject("ADODB.Connection") dbConn.Open "DSN=WEBSQL;DATABASE=aspdb;UID=msuser;PWD=asp123" ’A nevek tábla teljes tartalmát lekérdezi SQLcmd = "SELECT vezeteknev, keresztnev, kor FROM nevek;" ’SQL parancs futtatása és az eredmény eltárolása az rs Recordset-ben Set rs = dbConn.Execute(SQLcmd) ’Ha több mint 5 soros volt a lekérdezés eredménye, akkor kiírjuk a sorok számát If rs.RecordCount >= 5 then Response.Write "A sorok száma: " & rs.RecordCount & ". <BR>" ’Megjeleníti a lekérdezés tartalmát Do Until rs.EOF Response.Write "Név, kor: " & rs("vezeteknev") & " " & rs("keresztnev") & ", " & rs("kor") &"<BR>" rs.MoveNext Loop rs.Close dbConn.Close %>

PHP-ben nagyon sokféle adatbázishoz lehet kapcsolódni, amelyek működése és

használatának módja is nagyban hasonlít egymásra. (A fontosabb függvények nevének csak a prefixe tér el az adatbázistól függően.) MySQL adatbázis eléréséhez a mysql_ prefixű függvényeket használhatjuk. (Ehhez persze szükséges a php-mysql modul betöltése.) Az alábbi táblázatban megtalálhatóak a legfontosabb MySQL függvények:

Függvény neve Leírás mysql_connect(), Kapcsolódik az adatbázishoz. mysql_pconnect() Megpróbál egy már meg létező, kiépített adatbázis kapcsolat azonosítójával

visszatérni, ha van ilyen, ha nincs új kapcsolatot épít fel. PHP oldal végén sem záródik be az ilyen kapcsolat a mysql_close() hatására.

mysql_close() Bezárja a mysql_connect() utasítással megnyitott kapcsolatot. mysql_select_db() Kiválasztja a MySQL adatbázist. mysql_query() Egy SQL lekérdezést, műveletet hajt végre. mysql_fetch_array() Az SQL lekérdezés eredménytábláját soronként adja vissza, amely oszlopait

egy asszociatív tömbként érjük el. mysql_num_rows() Megmondja, hogy a mysql_query() a SELECT kérésnél hány sorral tért vissza. mysql_affected_rows() Megmondja, hogy a mysql_query() az INSERT, UPDATE, DELETE esetén hány

sor módosított.

<? //A MySQL kapcsolat kiépítése, a paraméterek: MySQL kiszolgáló hosztneve, MySQL felhasználónév, MySQL jelszó. $kapcsolat = mysql_pconnect("localhost", "phpuser", "php123"); //Kiválasztja az aktuális adatbázist az előzőleg felépített kapcsolatban. mysql_select_db("phpdb", $kapcsolat); //A nevek tábla létrehozása, amelynek 3 oszlopa van: vezetéknév, keresztnév, kor $keres = "CREATE TABLE nevek (vezeteknev varchar(30), keresztnev varchar(30), kor integer);" mysql_query($keres, $kapcsolat); //Beszúrás az előzőleg létrehozott táblába $keres = ”INSERT INTO nevek VALUES(’Kovács’, ’Béla’, ’43’);” mysql_query($keres, $kapcsolat); //Az előzőleg beszúrt sor törlése $keres = ”DELETE nevek WHERE vezeteknev=’Kovács’ AND keresztnev=’Béla’ AND kor=’45’;” mysql_query($keres, $kapcsolat); //Az előzőleg beszúrt sor módosítása $keres = ”UPDATE nevek SET kor=’45’ WHERE vezeteknev=’Kovács’ AND keresztnev=’Béla’ AND kor=’43’;” mysql_query($keres, $kapcsolat); //Az egész tábla törlése $keres = ”DROP TABLE nevek;” mysql_query($keres, $kapcsolat); ?>

Page 41: Diploma Aktiv Weboldal Keszites Php ASP

2. Webes aktív oldalak készítése adatbázis eléréssel 41 / 91

A fenti esetekben a mysql_query() visszatérési értéke egy logikai érték, amely megmondja, hogy az adott SQL-kérés sikeresen végrehajtódott-e. Ha egy SELECT utasítást hajtunk végre, akkor a kimenetet fel kell dolgozni a mysql_fetch_array() függvény segítségével.

<? $kapcsolat = mysql_pconnect("localhost", "phpuser", "php123"); mysql_select_db("phpdb", $kapcsolat); //A nevek tábla teljes tartalmát lekérdezi $keres = "SELECT vezeteknev, keresztnev, kor FROM nevek;"; //A kimenetet eltároljuk $kimenet = mysql_query($keres, $kapcsolat); //Eltároljuk, hogy hány sor került a táblába $rows = mysql_num_rows($kapcsolat); //Ha a sorok száma több mint 5, akkor a sorok számát if($rows > 5) echo "Sorok száma: $rows <BR>"; //A kimenetet feldolgozzuk, ha visszatérési érték igaz, akkor történt sorkiolvasás. //Az eredményt egy asszociatív tömbben kapjuk vissza, ahol a kulcsok a lekérdezett mezők nevei. //Következő futtatásra a következő sort kapjuk vissza, ha van. while ($adatok = mysql_fetch_array($kimenet)) { echo "Név, kor: ".$adatok["vezeteknev"]." ".$adatok["keresztnev"].", ".$adatok["kor"]."<BR>"; } ?>

Megjegyzés: Lényeges eltérés található a MS SQL és a MySQL között a SELECT lekérdezésben.

Nevezetesen a "SELECT * FROM table"; utasítás csak MS SQL esetén működik, ugyanis a mysql_fetch_array() PHP függvénynek szüksége van az oszlopok nevére, így minden esetben fel kell sorolni azokat, még akkor is, ha az összes oszlopra szükségünk van. Valamint mutatkoznak eltérések még az SQL lekérdezés során használt rendszerspecifikus függvények során, mint pl. dátumkezelő és stringkezelő függvényekben, amelyeket egy SQL lekérdezés során alkalmazhatunk.

Page 42: Diploma Aktiv Weboldal Keszites Php ASP

3. HTML és programkód elkülönítésének lehetősége 42 / 91

3. HTML és programkód elkülönítésének lehetősége Ebben a fejezetben röviden azokra a lehetőségekre térnék ki, hogy milyen

módszerekkel lehet az ASP illetve PHP kódsorokat a lehető legjobban elkülöníteni a HTML kódsoroktól.

Az elkülönítésre azért van szükség, mert általában a webprogramozónak nem feladata

a weblap látványának kialakítása, az a webdesigner feladata. A webprogramozó munkája során a HTML űrlapokhoz szükséges HTML kódokat alakítja ki, amelyet majd a webdesigner beépít a saját HTML kódjába. De mint az ASP és PHP működési modelljéből is kitűnik, a tényleges programkódok és a HTML kódok vegyesen szerepelnek a kiszolgálón elhelyezett fájlokban.

Jellemzően a következő feladatok fordulnak elő egy weblap programozása során:

1. űrlap vagy adatbázisból nyert információk megjelenítése, 2. űrlap adatok feldolgozása, 3. változó értékének kiszámolása, 4. változó értékének megjelenítése.

Érdemes az összetartozó programkódokat tartalmazó kódsorokat egy fájlba szervezni,

vagy ha lehetőség van eljárások, függvények írására, akkor ezeket az eljárásokat, függvényeket egy fájlba elhelyezni. Ez megkönnyíti az olvashatóságot, valamint növeli a hatékonyságot, ha akkor használjuk fel a tényleges weblapon, ha szükségünk is van rá. Például az adatbázis kezeléssel kapcsolatos függvényeket, mint adatbázis megnyitás, adatbázis műveletek, adatbázis lezárása, érdemes külön fájlban elhelyezni. Ezt csak akkor használjuk majd fel, ha az adott weboldal megjelenítése során adatbázis műveleteket kell igénybe vennünk.

Érdemes a HTML kódokat is külön fájlokban elhelyezni. Ezekben legfeljebb változó

értékének kiíratása, vagy esetleg logikai kifejezés szerinti elágazás szerepeljen. Így minimalizálni lehet a programkódok és a HTML kódok keveredésének lehetőségét. A weblap tényleges fájljába pedig beágyazzuk ezeket a programkódokat és HTML kódokat tartalmazó fájlokat.

3.1. Elkülönítés megvalósítása ASP-ben Az IIS webszerver az ASP programozása során támogatja az #include SSI

direktívákat, amelynek a használata nagyobb weblapok esetén erősen ajánlott. Fontos tudni, hogy a beágyazás még az oldal kiértékelése előtt hajtódik végre, így például változókat nem használhatunk a direktíva meghívásánál. Paramétereket is csak globális változókon keresztül tudunk átadni. De mégis a direktíva segítségével a lehető legjobban el tudjuk különíteni a programkódokat és a HTML kódokat.

Jellemző feladatok megvalósítása:

1.) Elkülönítjük egy fájlba a programkódokat, amelyek az űrlapból, vagy adatbázisból kinyerik a szükséges információkat, valamint feldolgozzák azokat. Szintén elkülönítjük a HTML kódokat egy külön fájlba, és ebben legfeljebb változó érték kiíratás utasítást (<%= VÁLTOZÓ_NEVE%>) használjuk. Esetleg szerepelhet még elágazás is, a következő formában:

Page 43: Diploma Aktiv Weboldal Keszites Php ASP

3. HTML és programkód elkülönítésének lehetősége 43 / 91

<% If logikai_feltétel_vagy_logikai_változó Then %> HTML igaz ág <% Else %> HTML hamis ág <%End If%>

2.) Hasonlóan az előbbihez elkülönítjük az űrlapadatok feldolgozásához szükséges ASP utasításokat (Request.Form, Request.QueryString), és a HTML kódot, amelyben a feldolgozás során keletkezett információk is szerepelhetnek.

3.) Változó értékének a kiszámítása elkülönítve szerepeljen a programkódok között,

külön fájlban, ha bonyolultabb számítás, akkor akár külön eljárásban. 4.) Változó érték kiíratást alkalmazzuk a HTML kódokban: <%= VÁLTOZÓ_NEVE%>.

Megjegyzés: ASP oldalak fejlesztésénél figyelni kell arra, hogy gyorstárba kerülnek az oldalak, ezért ezt a funkciót a webszerver beállításainál érdemes kikapcsolni, mert a változtatásokat különben nem veszi azonnal figyelembe.

3.2. Elkülönítés megvalósítása PHP-ben A PHP-ben fejlettebb a fájlbeágyazás támogatása, mint az ASP-ben. Többféle módon

tehetjük meg, mint ahogy az a 2.10. számú fejezetben olvasható. Két kategóriába sorolhatóak a beágyazandó fájlok a kiterjesztésük (típusuk) szerint. Ha HTML oldalt szeretnénk beágyazni, ami tartalmazhat Apache SSI direktívákat, akkor a virtual() függvényt kell alkalmaznunk, ilyen esetben a beágyazandó fájl nem tartalmazhat PHP kódokat. Az include(), require(), include_once(), require_once() függvények alkalmazhatók PHP kódok beágyazására. Ebben az esetben már használhatunk változókat a beágyazandó fájl nevének megadásakor, mivel PHP utasítás végzi a beágyazást. Érdemes az include_once() függvényt használni, ugyanis ha több helyről is szeretnénk ugyanazt a fájlt beágyazni, akkor nem kapunk hibaüzenetet (pl. a függvények újradeklarálása miatt, ami nem megengedett). Ha olyan PHP oldalt készítünk, amelyben nagyon fontos, hogy a beágyazás megtörténjen, akkor alkalmazzuk a require_once() függvényt az include_once() helyett, ugyanis ilyenkor végzetes hibával leáll az adott PHP oldal feldolgozása, míg a másik esetben csak egy hibaüzenet figyelmeztet.

A jellemző feladatok megvalósítása nagyban hasonlít az ASP-ben leírtakra, csak a

szintaxisban tér el. Az űrlap adatok feldolgozása során alkalmazhatjuk a globális változókat (megfelelő PHP installáció esetén), vagy $HTTP_GET_VARS, $HTTP_PUT_VARS asszociatív tömböket. HTML oldalakon a változó értékének megjelenítésehez használjuk a <?= $változó_neve ?> utasítást, vagy elágazás esetén a következőt:

<? if (logikai_feltétel_vagy_logikai_változó) { ?> HTML igaz ág <? } else { ?> HTML hamis ág <? } ?>

Függvények esetén figyelni kell a paraméterek átadására, valamint a visszatérési értékek kezelésére. A globális változók nem érhetők el a függvények belsejében, mivel ott minden változó lokális hatókörrel rendelkezik. Ezért a globális változókat deklarálni kell a függvények elején (global utasítással), vagy $GLOBALS asszociatív tömböt kell használni. Paramétereket adhatunk át referencia szerint is, ha összetettebb adattípusról van szó, ami hatékonyabbá teszi a PHP kódot.

Page 44: Diploma Aktiv Weboldal Keszites Php ASP

4. Példaprogram 44 / 91

4. Példaprogram A diplomamunkám során elkészítettem egy kis alkalmazást, amely szemlélteti az előző

fejezetekben tárgyalt ASP és PHP programnyelvek használatát. Az alkalmazás egy statisztikai rendszert valósít meg, amely egy adott weboldal

látogatottsági statisztikáját méri. Az adatokat SQL adatbázisban tárolja és jeleníti meg táblázatos, illetve grafikonos formában.

Először ASP nyelven valósítottam meg a rendszert, alakítottam ki a HTML kódokat,

majd utána a szintaxis megfelelő módosításával készítettem el a PHP nyelven megírt változatot. A fejlesztés során tapasztaltam, hogy a PHP jóval erősebben alkalmazható weboldalak fejlesztéséhez, mert sokkal több eljárást tartalmaz és dokumentációjában is könnyebb eligazodni. Egyik eltérés a képek kezelésében jelentkezett. Az ASP nem tud képeket létrehozni, ezért egy külső gyártó által készített kiprobálható kiegészítőt kellett felinstallálni az IIS webszerverhez, az ASPIMAGE.DLL-t. Ezzel volt csak megoldható a képek előállítása ASP-ben. A dokumentációban leírtak alapján az átlátszó kép előállítását nem sikerült működésre bírni. A másik lényeges eltérés, hogy PHP közvetlenül nem támogatja a Windows-ban megtalálható betűkészleteket, de be tudja tölteni azokat, ezért a megfelelő betűtípus fájlokat át kellett másolni a Windows rendszerből, ezeket egy külön /fonts alkönyvtárba tettem.

A statisztikai rendszer leírása: A főoldal két különböző részből áll. Az egyik egy adminisztrációs felület, ahol a kezdeti

adatbázist lehet létrehozatni, új felhasználót lehet felvenni a rendszerbe, felhasználó adatait lehet módosítani, illetve törölni lehet a felhasználót. Minden felhasználóhoz tartozik egy számláló, aminek a kinézetét a felhasználó határozhatja meg. Minden egyes számlálóhoz külön adatbázis tartozik. A számlálónak megadhatjuk, hogy az azonos látogatókat milyen időközönként számolja újra, illetve melyik weboldalon működjön a számláló. Természetesen a felhasználót egy login név és egy jelszó azonosítja, valamint egy egyedi azonosító szám (ID).

A másik a felhasználói felület, amelyen a felhasználó be tud lépni, és ki tud jelentkezni. A sikeres bejelentkezés után egy süti információban eltárolódik a felhasználó azonosítója. Kilépésnél a süti információ törlődik. Ha belépett, akkor elérhető számára a számlálójának a statisztikája. Táblázatban megnézheti az összes látogató összes látogatási információját (mikor, milyen IP címről, milyen hosztnévről, milyen bőngészővel), megnézheti éves, havi, napi, óránkénti oldaltalálatainak számát. Az éves adatokat havi bontásban grafikon is szemlélteti, hasonlóan havit napi bontásban, valamint a napit óránkénti bontásban.

A statisztikai rendszer működése: Miután az adminisztrációs oldalon létrehoztuk a kívánt számlálót (felhasználó név;

jelszó; előtérszín; háttérszín; transzparens legyen-e; URL címe, amire működjön a számláló; időkorlát másodpercben azonos IP című látogatók szűrése miatt; betűméret; betűtípus megadásával), a megfelelő HTML oldalunkon el kell helyezni egy hivatkozást:

<img src="http://localhost/stat/counter.asp?id=100000"> vagy <img src="http://localhost/stat/counter.php?id=100000">

Ha adtunk meg URL címet, akkor a fenti hivatkozást az URL cím által hivatkozott HTML

fájlban kell elhelyezni, mivel csak onnan fog működni a számláló.

Page 45: Diploma Aktiv Weboldal Keszites Php ASP

4. Példaprogram 45 / 91

Az első létrehozott felhasználó kapja a 100000-es azonosító számot (ID), a következőek pedig mindig a maximális számúnál eggyel nagyobb számút kapnak. Ezzel a hivatkozással a HTML oldalunkon megjelenik a számláló, ugyanis a counter.asp illetve counter.php egy PNG formátumű képet állít elő. Közben növeli a számláló értékét, figyelve, az időkorlátra, valamint az URL címre, hogy jó oldalról hívták-e meg; és eltárolja egy SQL táblában a jelenlegi látogatás információit. Ez a rendszer lelke, lényegében az új felhasználó felvételén kívül itt történik az adatbázis táblákba beszúrás, a többi oldalon ezen információk kerülnek megjelenítésre.

A graph.asp és a graph.php jeleníti meg a látogatottsági információkat szintén PNG

kép formájában, amelyre egy grafikont rajzol. Megadható paraméterként a grafikon típusa: éves, havi, napi, illetve megadható két dátum is (az aktuális és egy régebbi), amelyek alapján kiszámolja az oszlopok magasságát. Az első grafikon oszlopgrafikon, ha nem adunk meg semmit, akkor az idei év havi bontású grafikonja, és a másik grafikon pedig az előző évhez tartozó havi bontású grafikon. Az <id> megadása feltétlen fontos, különben hibajelzést kapunk, mert nem lehet adatbázist olvasni. Egy tesztoldal 2002. augusztus és 2003. május között gyűjtött adatai alapján a következő grafikont generálja:

Két fontos fájl működéséről már szóltam, az alábbi táblázatban összefoglalnám, hogy

az egyes fájlokban mi található. A pontos forráskód az 5.5. és az 5.6. számú mellékletben olvasható. A főkönyvtárban találhatók a meghívható (ASP illetve PHP) weboldalak, amelyek beágyazzák az INC_ASP illetve INC_PHP könyvtár alatt található programkódokat, illetve az INC_HTM alatt található HTML kódokat tartalmazó fájlokat.

ASP / PHP fájl Leírás admin_create.asp admin_create.php

Létrehozza a kezdeti adatbázist (statusers nevű tábla), amelybe a felhasználók adatai kerülnek.

admin_delete.asp admin_delete.php

Megjeleníti a felvett felhasználókat egy listában. Ha a megjelenő listában rákattintunk valamelyik felhasználó azonosítójára, akkor azt kitörli az adatbázisból, majd a maradék felhasználókat újra kilistázhatjuk.

admin_modify.asp admin_modify.php

Megjeleníti a felvett felhasználókat egy listában. Ha a megjelenő listában rákattintunk valamelyik felhasználó azonosítójára, akkor behozza a felhasználó felvételénél kitöltött űrlapot, az ott megadott adatokkal, amelyeket átírhatunk és módosíthatjuk az adatbázist.

admin_newuser.asp admin_newuser.php

Új felhasználót vehetünk fel egy űrlap kitöltésével. A statusers táblába bekerül a felhasználó összes adata, valamint a statuser<id> adatbázis tábla is létrejön, amelybe majd a felhasználó statisztikai adatai kerülnek bele.

counter.asp counter.php

Kiírja az <id> sorszámú számlálóhoz tartózó összes találat számát a felhasználó felvételénél megadott megjelenítési információk alapján.

default.asp index.php

Főoldal, amelyről az összes adminisztrátori, illetve felhasználói weboldal elérhető. Paraméter határozza meg, hogy melyik jelenjen meg, az alapértelmezett az adminisztrátori oldal.

graph.asp graph.php

Grafikont rajzol <id> sorszámú adatbázis alapján. Paraméterben meg lehet adni a grafikon típusát (year, month, day), valamint az időközt, ami alapján olvassa az adatbázist.

user_login.asp user_login.php

Felhasználó név és jelszó ellenőrzése után, ha ez sikeresen megtörtént, akkor egy süti információt helyezz el a webkliensen, amely a felhasználó <id> számát tartalmazza.

Page 46: Diploma Aktiv Weboldal Keszites Php ASP

4. Példaprogram 46 / 91

ASP / PHP fájl Leírás user_logout.asp user_logout.php

A belépéskor elhelyezett süti információt törli. Utána újra be kell jelentkezni, hogy elérjük a felhasználói menüt.

user_menu.asp user_menu.php

Kirajzol egy HTML táblázatot, amelyben a felhasználói statisztikák oldalt hívhatjuk meg különféle módon. (Pl. milyen időközről szeretnénk információt, táblázatos vagy grafikonos formában szeretnénk-e.)

user_stat.asp user_stat.php

A menüben kiválasztott és paraméterként átadott információk alapján <id> sorszámú adatbázisból jelenít meg információkat. Például az éves statisztikára rákattintva látjuk annak havi bontását, amelyeket napi bontásban tovább részletezhetünk.

inc_asp/add.inc inc_php/add.inc

Az új felhasználóhoz tartozó adatbázis táblát hozza létre, valamint az adatbázis táblához egy index mezőt is definiál.

inc_asp/admin_create.inc inc_php/admin_create.inc

A felhasználók adatait tartalmazó adatbázis táblát hozza létre. Ezt csak egyszer kell megtenni.

inc_asp/admin_delete.inc inc_php/admin_delete.inc

Feldolgozza a paramétereket, majd azok alapján megjelenít egy felhasználó listát, amelyben ki lehet választani egy felhasználót. Ha már kiválasztottunk egy felhasználót, akkor az adott felhasználót megprobálja törölni, ha nem sikerül hibát jelez.

inc_asp/admin_modify.inc inc_php/admin_modify.inc

Felhasználó adatainak módosítását teszi lehetővé. Ha először hívjuk meg, akkor megjeleníti a felhasználó adatait egy listában. Ha a listából kiválasztottunk egy felhasználót, akkor egy űrlapon megjeleníti az adatait, amely űrlap kitöltésével módosíthatjuk az adatokat, vagy hibajelzést kapunk, ha pl. a jelszó nem lett jól megadva.

inc_asp/admin_newuser.inc inc_php/admin_newuser.inc

Felvesz egy új felhasználót. Ha először hívjuk meg, akkor bead egy üres űrlapot. Ha ezt elküldjük és a jelszó megfelelő akkor felveszi, egyébként hibát jelez.

inc_asp/dbfunc.inc inc_php/dbfunc.inc

Az adatbázis kapcsolatért felelős. Létrehozza az adatbázis kapcslatot és két függvényt definiál, egyikkel adatbázis táblát hozhatunk létre, a másikkal egy sort szúrhatunk a táblába. A tábla neve és a létrehozandó mezők illetve beszúrandó adatokat paraméterként veszi át.

inc_asp/declares.inc inc_php/declares.inc

A globális változókat deklarálja, amelyek több helyen is előfordulnak. ASP-ben a változók deklarálását is kényszeríti.

inc_asp/declares_form.inc inc_php/declares_form.inc

A felhasználó bevitelénél / módosításánál megjelenő űrlapváltozókat deklarálja, valamint feltölti kezdeti értékekkel, ha az adott feltétel teljesül.

inc_asp/declares_login.inc inc_php/declares_login.inc

A felhasználó belépésénél található űrlap által elküldött értéket tárolja el globális változókban.

inc_asp/delete.inc inc_php/delete.inc

Felhasználó törlésénél használt függvényeket tartalmazza. Az egyik a felhasználók listázása, a másik a tényleges törlést végző eljárás, amely az <id>-t várja paraméterként.

inc_asp/default.inc inc_php/index.inc

Megjeleníti az adminisztrációs vagy a felhasználói oldal HTML kódját a paraméternek megfelelően.

inc_asp/modify.inc inc_php/modify.inc

Felhasználók módosítása során használt három fontos eljárást tartalmaz. Az egyik megjelenít egy felhasználó listát, amellyel az egyes felhasználók adatait tudjuk módosításra kijelölni. A másik kiolvassa az adott <id>-hoz tartozó felhasználó adatait és eltárolja globális változókban. A harmadik ezen globális változók alapján módosítja a felhasználó adatait az adatbázisban.

inc_asp/user_login.inc inc_php/user_login.inc

Először megjelenít egy űrlapot a felhasználó név és jelszó bekéréséhez. Majd megnézi, hogy jól adtuk-e meg, ha igen, akkor az <id> információt eltárolja egy süti információban, ha nem akkor hibát jelez és újra probálkozhatunk.

inc_asp/user_logout.inc inc_php/user_logout.inc

Törli az <id>-re vonatkozó süti információt.

inc_asp/user_menu.inc inc_php/user_menu.inc

Kirajzol egy HTML táblázatot, amelyben a user_stat.asp / user_stat.php fájlra hivatkozik különböző paraméterekkel. Pl. grafiont vagy táblázatos statisztikát szeretnénk és az éves, havi, napi, vagy óránkénti legyen-e.

inc_asp/user_stat.inc inc_php/user_stat.inc

Kirajzol egy HTML táblázatot, amelyben saját magára hivatkozik más paraméterekkel. Pl. táblázatos éves statisztika esetén kiírja az adatbázis éves találatait, hogy melyik évben mennyi találat volt és felkínálja az adott év havi bontású statisztikájának megjelenítését táblázat, vagy grafikon formájában.

inc_htm/admin_newuser1.inc A felhasználó felvételénél és módosításánál megjelenő űrlap HTML kódját tartalmazza.

inc_htm/admin_newuser2.inc Felhasználó sikeres felvétele után megjelenítendő HTML kódokat tartalmazza. inc_htm/admin_newuser3.inc Felhasználó sikertelen felvétele után megjelenítendő HTML kódokat tartalmazza.

Jelenleg a felvétel sikertelen, ha nem egyezik az űrlapon szereplő jelszómezők tartalma.

inc_htm/footer.inc Az összes oldal lábléce, maga a lábléc HTML kódja található itt. inc_htm/header.inc Az összes oldal fejléce, maga a fejléc HTML kód található itt. Globális változón

keresztül a fejléc mező szöveges értékét át tudjuk adni. inc_htm/user_login.inc A felhasználó belépésénél megjelenő űrlap HTML kódját tartalmazza.

Page 47: Diploma Aktiv Weboldal Keszites Php ASP

5. Mellékletek 47 / 91

5. Mellékletek Az 5.1. pont alatt található mellékletben a Microsoft SQL Server 2000 változatának a

telepítését illusztrálnám, a telepítő program által megjelenített ablakok segítségével. Az 5.2. pont alatt az IIS webszerver által definiált változók leírását mutatnám be. A

változók egy része más webszervereken is elérhetőek. ASP-ben a Request objektum ServerVariables függvényével kérdezhetjük le.

Az 5.3. pont alatt az Apache webszerver előre definiált változóinak lekérdezését

mutatnám be PHP alatt. A PHP-ben ezek globális változók, amelyek értékeit nem tudjuk megváltoztatni.

Az 5.4. pont alatt a PHP előre definiált változóinak és konstansainak leírásait foglaltam

össze. Ide azok az előre definiált változók kerültek, amelyek a csak a PHP-re jellemzőek, nem pedig webszerver specifikus változók.

Az 5.5. pont alatt a példaprogram ASP-ben megírt programkódja található. Az egyes

fájlok tartalma olvasható, a fájlok elérési útvonala a Windows XP alatt beüzemelt IIS webszervernek kezdőkönyvtárával (c:\inetpub\wwwroot) együtt szerepelnek. A főoldal a http://localhost/stat/ URL segítéségével érhető el.

Az 5.6. pont alatt a példaprogram PHP-ben megírt programkódja található. Az egyes

fájlok tartalma olvasható, a fájlok elérési útvonala a Linux alatt beüzemelt Apache webszervernek kezdőkönyvtárával (/var/www) együtt szerepelnek. A főoldal a http://localhost/stat/ URL segítéségével érhető el.

Page 48: Diploma Aktiv Weboldal Keszites Php ASP

5. Mellékletek 48 / 91

5.1. Microsoft SQL Server 2000 telepítésének folyamata

Az alábbi képeken látható az Microsoft SQL Server 2000 Personal Edition verziójának telepítése lépésről lépésre.

1. lépés

2. lépés

3. lépés

Page 49: Diploma Aktiv Weboldal Keszites Php ASP

5. Mellékletek 49 / 91

4. lépés

5. lépés

6. lépés

Page 50: Diploma Aktiv Weboldal Keszites Php ASP

5. Mellékletek 50 / 91

7. lépés

8. lépés

9. lépés

Page 51: Diploma Aktiv Weboldal Keszites Php ASP

5. Mellékletek 51 / 91

10. lépés

11. lépés

12. lépés

Page 52: Diploma Aktiv Weboldal Keszites Php ASP

5. Mellékletek 52 / 91

13. lépés

14. lépés

15. lépés

Page 53: Diploma Aktiv Weboldal Keszites Php ASP

5. Mellékletek 53 / 91

5.2. IIS webszerver előre definiált változói ASP-ben A ServerVariables gyűjtemény az előre definiált környezeti változók értékeit kéri le.

Request.ServerVariables (kiszolgálói környezeti változó) szintaxisú utasítással kérhetjük le, ahol a kiszolgálói környezeti változó paraméter értéke az alábbi táblázatban szereplők lehetnek. Változó Leírás ALL_HTTP Az ügyfél által küldött minden HTTP-fejléc.

ALL_RAW Nyers formában kéri le a fejléceket. Az ALL_RAW és az ALL_HTTP változó között az a különbség, hogy az ALL_HTTP változó a fejlécnév elé egy HTTP_ előtagot helyez, és a fejlécet minden esetben nagy betűkkel írja. Az ALL_RAW használatakor a fejlécnév és az értékek az ügyfél által küldött módon jelennek meg.

APPL_MD_PATH Az ISAPI DLL alkalmazása metabázisbeli elérési útját kéri le.

APPL_PHYSICAL_PATH A metabázisbeli elérési útnak megfelelő fizikai elérési utat kéri le. Az IIS az APPl_MD_PATH változót értékét a fizikai (könyvtárbeli) elérési útra konvertálja, és ezt az értéket küldi vissza.

AUTH_PASSWORD Az ügyfél hitelesítési párbeszédpaneljén megadott érték. Ez a változó csak Alapfokú hitelesítésnél használható.

AUTH_TYPE A kiszolgáló által használt hitelesítési módszer, amely során a kiszolgáló érvényesíti a felhasználókat, amikor védett parancsfájlhoz kísérelnek meg hozzáférni.

AUTH_USER Nyers hitelesített felhasználói név.

CERT_COOKIE Az ügyféltanúsítvány karakterláncként visszaküldött egyedi azonosítója. Használható a teljes ügyféltanúsítvány aláírásaként.

CERT_FLAGS A bit0 az 1 értéket kapja, ha van ügyféltanúsítvány. A bit1 az 1 értéket kapja, ha érvénytelen az ügyféltanúsítvány hitelesítésszolgáltatója (azaz nem található a kiszolgáló elismert hitelesítésszolgáltatókat tartalmazó listáján).

CERT_ISSUER Az ügyféltanúsítványnak a kiállítóra vonatkozó mezője (O=MS, OU=IAS, CN=felhasználói név, C=USA)

CERT_KEYSIZE A Secure Sockets Layer kapcsolat kulcsméretében lévő bitek száma. Például: 128.

CERT_SECRETKEYSIZE A kiszolgálói tanúsítvány személyes kulcsában lévő bitek száma. Például: 1024.

CERT_SERIALNUMBER Az ügyféltanúsítványnak a sorozatszámra vonatkozó mezője.

CERT_SERVER_ISSUER A kiszolgálói tanúsítványnak a kiállítóra vonatkozó mezője.

CERT_SERVER_SUBJECT A kiszolgálói tanúsítványnak a tárgyra vonatkozó mezője.

CERT_SUBJECT Az ügyféltanúsítványnak a tárgyra vonatkozó mezője.

CONTENT_LENGTH Az ügyfél által megadott tartalom hossza.

CONTENT_TYPE A tartalom adattípusa. Olyan lekérdezések esetén használatos, amelyek csatolt információt tartalmaznak, például a GET, POST vagy PUT típusú HTTP-lekéréseket.

GATEWAY_INTERFACE A kiszolgáló által alkalmazott CGI-specifikáció változata; formátuma: CGI/változat.

HTTP_<Fejlécnév> A Fejlécnév fejléc értéke. Az ebben a táblázatban fel nem sorolt fejlécek elé a HTTP_ előtagot kell helyezni, hogy a ServerVariables gyűjtemény lekérhesse értéküket. Megjegyzés: A kiszolgáló a Fejlécnév változóban lévő minden aláhúzásjelet (_) a tényleges fejlécben lévő kötőjelként értelmez. Ha például a HTTP_SAJÁT_FEJLÉC változót adja meg, a kiszolgáló SAJÁT-FEJLÉC nevű fejlécet keres.

HTTP_ACCEPT Az Accept fejléc értékét küldi vissza.

HTTP_ACCEPT_LANGUAGE A tartalom megjelenítéséhez használandó nyelvet meghatározó karakterláncot küldi vissza.

HTTP_USER_AGENT A kérelmet küldő böngészőt leíró karakterláncot küld vissza.

HTTP_COOKIE A kérelemhez csatolt cookie-kat küldi vissza.

HTTP_REFERER Visszaküldi annak a lapnak az URL-címét tartalmazó karakterláncot, amely az aktuális lapra vonatkoztatta a kérést, de átirányítási kérést nem tartalmaz. Az átirányítási kérések nem tárolódnak.

Page 54: Diploma Aktiv Weboldal Keszites Php ASP

5. Mellékletek 54 / 91

Változó Leírás HTTPS Az ON értéket küldi vissza, ha a kérelem biztonságos csatornán (SSL) érkezett, illetve az

OFF értéket küldi vissza, ha a kérelem nem biztonságos csatornán érkezett.

HTTPS_KEYSIZE A Secure Sockets Layer kapcsolat kulcsméretében lévő bitek száma. Például: 128.

HTTPS_SECRETKEYSIZE A kiszolgálói tanúsítvány személyes kulcsában lévő bitek száma. Például: 1024.

HTTPS_SERVER_ISSUER A kiszolgálói tanúsítványnak a kiállítóra vonatkozó mezője.

HTTPS_SERVER_SUBJECT A kiszolgálói tanúsítványnak a tárgyra vonatkozó mezője.

INSTANCE_ID Az IIS-példány azonosítója szöveges formátumban. Ha a példányazonosító 1, karakterláncként jelenik meg. E változó segítségével kérheti le azon webkiszolgáló-példány (metabázisban lévő) azonosítóját, amelyhez a kérelem tartozik.

INSTANCE_META_PATH A kérelemre válaszoló IIS-példány metabázisbeli elérési útja.

LOCAL_ADDR Azon Kiszolgálócímet küldi vissza, amelyre a kérelem érkezett. Ez a többhelyű számítógépeken fontos, ahol több IP-cím ugyanahhoz a számítógéphez lehet kötve, és tudni szeretné, hogy melyik címre érkezett a kérelem.

LOGON_USER Azon Windows felhasználói fiók, amelyre a felhasználó bejelentkezett.

PATH_INFO Az elérési út további adatai ügyfél által megadott módon. A parancsfájlokat virtuális elérési útjuk és a PATH_INFO kiszolgálói változó használatával érheti el. Ha ez az információ egy URL-ből származik, a kiszolgáló dekódolja, mielőtt a CGI-parancsfájlhoz továbbítaná.

PATH_TRANSLATED Az elérési útra vonatkozó PATH_INFO változó lefordított változata, amely a szükséges virtuális-fizikai csatlakoztatást végzi.

QUERY_STRING A HTTP-kérelemben lévő kérdőjelet (?) követő karakterláncban található lekérdezési információ.

REMOTE_ADDR A kérelmet küldő távoli állomás IP-címe.

REMOTE_HOST A kérelmet küldő állomás neve. Ha a kiszolgáló nem rendelkezik ezzel az információval, a beállítja a REMOTE_ADDR változó értékét, ezt pedig üresen hagyja.

REMOTE_USER A felhasználó által küldött, nem csatlakoztatott felhasználói nevet tartalmazó karakterlánc. A felhasználó ezt a nevet küldte ténylegesen (szemben a kiszolgálóra telepített hitelesítő szűrő által módosított névvel).

REQUEST_METHOD A kérelemhez alkalmazott metódus. HTTP esetén ez lehet GET, HEAD, POST és így tovább.

SCRIPT_NAME A végrehajtás alatt lévő parancsfájl virtuális elérési útja. Az önmagukra hivatkozó URL-címekben használatos.

SERVER_NAME A kiszolgáló állomásneve, DNS aliasneve vagy IP-címe, ahogyan az az önmagukra hivatkozó URL-címekben megjelenik.

SERVER_PORT_SECURE Olyan karakterlánc, amelynek értéke 0 (nulla) vagy 1 (egy). Ha a kérelmet a rendszer a biztonságos porton keresztül kezeli, akkor értéke 1, egyébként 0.

SERVER_PROTOCOL A kérelemadatok továbbításához használt protokoll neve és verziója; formátuma: protokoll/változat.

SERVER_SOFTWARE A kérelemre válaszoló és az átjárót üzemeltető kiszolgálóprogram neve és verziószáma; formátuma: név/verzió.

URL-cím Az URL-cím alaprészét adja meg,

Megjegyzés:

Ha az ügyfél a fenti táblázatban megadottaktól eltérő fejlécet küld, a fejléc értékét a

Request.ServerVariables objektum meghívásában a fejléc elé tett HTTP_ előtaggal lehet lekérni. Ha például az ügyfél a következő fejlécet küldte: Új_fejléc: Új_érték

Az Új_érték értéket az alábbi szintaxis segítségével kérheti le: <% Request.ServerVariables("HTTP_Új_fejléc") %>

Page 55: Diploma Aktiv Weboldal Keszites Php ASP

5. Mellékletek 55 / 91

Az alábbi példa számos kiszolgálói változót jelenít meg név szerint: <HTML> <!-- Ez a példa néhány ServerVariables gyűjtemény tartalmát jeleníti meg. --> ALL_HTTP kiszolgálói változó = <%= Request.ServerVariables("ALL_HTTP") %> <BR> CONTENT_LENGTH kiszolgálói változó = <%= Request.ServerVariables("CONTENT_LENGTH") %> <BR> CONTENT_TYPE kiszolgálói változó = <%= Request.ServerVariables("CONTENT_TYPE") %> <BR> QUERY_STRING kiszolgálói változó = <%= Request.ServerVariables("QUERY_STRING") %> <BR> SERVER_SOFTWARE kiszolgálói változó = <%= Request.ServerVariables("SERVER_SOFTWARE") %> <BR> </HTML>

Ez a példa a VBScript For Each ciklus használatával iterál a meglévő kiszolgálói változóneveken át. Amennyiben a Névtelen hozzáférés engedélyezett, bizonyos változók üresek lesznek. A következő parancsfájl kinyomtatja egy táblázat minden kiszolgálói változóját:

<TABLE BORDER="1"> <TR><TD><B>Kiszolgálói változó</B></TD><TD><B>Érték</B></TD></TR> <% For Each strKey In Request.ServerVariables %> <TR> <TD><%= strKey %></TD> <TD><%= Request.ServerVariables(strKey) %></TD> </TR> <% Next %> </TABLE>

A következő példa a kiszolgáló nevét egy hiperhivatkozásba illeszti.

<A HREF= "http://<%=Request.ServerVariables("SERVER_NAME")%>/scripts/MyPage.asp”> A MyPage.asp fájlhoz vezető hivatkozás </A>

Page 56: Diploma Aktiv Weboldal Keszites Php ASP

5. Mellékletek 56 / 91

5.3. Apache webszerver előre definiált változói PHP-ben

Ezek a változók az Apache webszerver változói. Ha másik szerveren fut a PHP, nincs rá

garancia, hogy ugyanezek a változók akkor is rendelkezésre állnak: némelyik hiányozhat, esetleg itt nem szereplőket is biztosíthat a szerver. Számos a CGI 1.1 specifikációban dokumentált változókra biztosan lehet alapozni.

Figyelni kell arra, hogy ha a PHP-t parancssorból használjuk a változók egy részének

van csak értelme, ha egyáltalán definiáltak ilyen esetben.

Változó Leírás $GATEWAY_INTERFACE A server CGI specifikációjának verziója. Pl.: 'CGI/1.1'.

$SERVER_NAME A gazdagép (host) neve, ami alatt a szkript fut. Ha a szkript virtuális host-on fut, a virtuális host neve.

$SERVER_SOFTWARE Serverazonosító sztring, amely a kérésekre adott válasz fejlécében szerepel. $SERVER_PROTOCOL Az oldal lekéréséhez használt protokoll neve és verziója pl. 'HTTP/1.0' $REQUEST_METHOD Az oldal eléréséhez használt kérési forma, pl.: 'GET', 'HEAD', 'POST', 'PUT'. $QUERY_STRING Keresési kérdés, az oldalt meghívó URL-ben a ? után szereplő rész, ha létezik. $DOCUMENT_ROOT A www dokumentumok főkönyvtára, amely alatt a jelenlegi szkript fut. Ez a szerver

konfigurációs fájljában meghatározott érték. $HTTP_ACCEPT Az aktuális kérés Accept: HTTP fejlécének tartalma, ha van ilyen. Ebben adja meg a

böngésző, hogy milyen formátumokat képes fogadni. $HTTP_ACCEPT_CHARSET Az aktuális kérés Accept-Charset: HTTP fejlécének tartalma, ha van ilyen. pl.

'iso-8859-1,*,utf-8'. $HTTP_ENCODING Az aktuális kérés Accept-Encoding: HTTP fejlécének tartalma, ha van ilyen. pl. 'gzip'. $HTTP_ACCEPT_LANGUAGE Az aktuális kérés Accept-Language: HTTP fejlécének tartalma, ha van ilyen. pl. 'en'. $HTTP_CONNECTION Az aktuális kérés Connection: HTTP fejlécének tartalma, ha van ilyen. pl. 'Keep-Alive'. $HTTP_HOST Az aktuális kérés Host: HTTP fejlécének tartalma, ha éppen van ilyen. $HTTP_REFERER Annak az oldalnak az URL címe, ahonnan ide került a látogató. Ezt a látogató

böngészőprogramja állítja be, de ezt nem minden böngésző és nem mindig teszi meg. $HTTP_USER_AGENT Az aktuális User_Agent: HTTP fejlécének tartalma, ha van ilyen. Ez a string, amely

meghatározza az oldal megtekintéséhez használt böngészőt, pl. ’Mozilla/4.5 [en] (X11; U; Linux 2.2.9 i586)’.

$REMOTE_ADDR A látogató IP címe, aki az oldalt lekérte. $REMOTE_PORT A látogató gépén a webszerverrel való kommunikációhoz használt port száma. $SCRIPT_FILENAME A PHP szkript abszolút elérési útja a szerver gépen. $SERVER_ADMIN A SERVER_ADMIN a kiszolgáló konfigurációs fájl direktíva értéke (Apache alatt). Ha a

szkript egy virtuális host-on fut, akkor ez a virtuális host-hoz rendelt érték. $SERVER_PORT A kiszolgálógépen a kiszolgáló kommunikációjában használt port száma. $SERVER_SIGNATURE A kiszolgáló verziószámát és a virtuális host-ot tartalmazó sztring, ha engedélyezett. Ez a

szöveg jelenik meg minden szerver által generált oldal alján. $PATH_INFO Hasonló értéket tartalmaz, mint a SCRIPT_NAME, de CGI verzió esetén ez jobb lehet az

önhivatkozó kérdőívek készítésekor, mert egyes szervereken a SCRIPT_NAME tartalmazza a PHP bináris meghívási útvonalát is.

$PATH_TRANSLATED A szkript a fájlrendszer szerinti (nem a document root-hoz viszonyított!) elérési útja. Ezt a kiszolgáló a virtuális->valós átalakítás után határozza meg.

$SCRIPT_NAME Az aktuális szkript elérési útja, ahogy az az URL-ben megjelenik. Hasznos a saját magukra mutató oldalakhoz.

$REQUEST_URI Az az URI, amellyel az oldalt lekérték. pl. '/index.html'.

Page 57: Diploma Aktiv Weboldal Keszites Php ASP

5. Mellékletek 57 / 91

5.4. PHP előre definiált változói és állandói Az alábbi táblázatban találhatók azok a változók, amelyeket a PHP definiál.

Változó Leírás $argv A szkriptnek átadott argumentumok tömbje. Ha a szkript parancssor alól futtatjuk, ez egy C-

szerű hozzáférést biztosít a parancssor argumentumokhoz. Ha GET metódussal hívjuk, az URL kérdőjel utáni részét (query string) tartalmazza.

$argc A parancssori argumentumok számát tartalmazza (ha parancssorból futtatjuk). $PHP_SELF A most futó szkriptfájl neve, a document root-hoz képest relatív alakban. Ha a PHP

parancssorból fut, ez a változó nem elérhető. Ez a változó a kérés útvonal információját is tartalmazza, ha az létezik, azaz a $PHP_SELF a "http://example.com/test.php/foo.bar" címre a következőt fogja adni: "/test.php/foo.bar"

$HTTP_COOKIE_VARS HTTP cookie-kat (sütiket) tartalmazó asszociatív tömb. $_COOKIE HTTP cookie-kat (sütiket) tartalmazó asszociatív tömb, amely minden hatókörben elérhető. $HTTP_GET_VARS HTTP GET metódussal által szolgáltatott adatokat tartalmazó asszociatív tömb. $_GET HTTP GET metódussal által szolgáltatott adatokat tartalmazó asszociatív tömb, amely minden

hatókörben elérhető. $HTTP_POST_VARS HTTP POST metódussal által szolgáltatott adatokat tartalmazó asszociatív tömb. Amelyeket pl.

egy HTML FORM hatására küld el a kliens. $_POST HTTP POST metódussal által szolgáltatott adatokat tartalmazó asszociatív tömb, amely minden

hatókörben elérhető. $HTTP_POST_FILES A HTTP POST metódussal feltöltött fájlokról tartalmaz információkat, asszociatív tömb. $_FILES A HTTP POST metódussal feltöltött fájlokról tartalmaz információkat, asszociatív tömb. $HTTP_ENV_VARS A szülő/futtató környezet aktuális változóit tartalmazó asszociatív tömb. $_ENV A szülő/futtató környezet aktuális változóit tartalmazó asszociatív tömb, amely minden

hatókörben elérhető. $HTTP_SERVER_VARS A HTTP szervertől érkező változókkal feltöltött asszociatív tömb. Ezek a változók megfelelnek a

fent említett Apache változóknak. $_SERVER A HTTP szervertől érkező változókkal feltöltött asszociatív tömb, amely minden hatókörben

elérhető. $HTTP_SESSION_VARS Az aktuális szkripthez tartozó session változókat tartalmazó asszociatív tömb. $_SESSION

Az aktuális szkripthez tartozó session változókat tartalmazó asszociatív tömb, amely minden hatókörben elérhető. A _SESSION tömbben új bejegyzések létrehozásával automatikusan regisztrálhatók értékek, mint a session_register() segítségével.

$_REQUEST A GET, POST és Cookie változókból összeállított asszociatív tömb. Más szóval, bármilyen a felhasználótól ügyféltől érkező adatot tartalmaz, ami biztonsági szempontból nem megbízható. Minden hatókörben elérhető.

Az alábbi táblázatban látható a PHP alatt elérhető konstansok (állandók). A __FILE__,

__LINE__, TRUE, FALSE, NULL írása esetén tetszőlegesen használhatjuk a kis- vagy a nagybetűs írásmódot.

Konstans Leírás __FILE__ A szkript állomány neve. Ha egy olyan fájlon belül használjuk, amelyet include-oltunk, vagy

require-ral töltöttük be, akkor az include-olt fájl nevét kapjuk, nem a futtatott szkriptét. __LINE__ Az aktuális szkripten belüli sor száma. Ha include-dal, vagy require-ral behívott fájlra

alkalmazzuk, akkor azon a fájlon belüli pozíciót kapjuk. PHP_VERSION Az alkalmazott PHP verziószáma (string). Pl.: '4.1.0'. PHP_OS Az operációs rendszer, ami alatt a PHP fut. Lehetséges értékei: "AIX", "Darwin" (MacOS),

"Linux", "SunOS", "WIN32", "WINNT" Megjegyzés: elképzelhető, hogy később további értékek is elérhetőek lesznek.

TRUE Igaz érték. Lásd boolean adattípus. FALSE Hamis érték. Lásd boolean adattípus. NULL NULL érték. Lásd NULL adattípus. E_ERROR Egy nem feldolgozás során keletkezett helyrehozhatatlan hibát jelez. E_WARNING Egy olyan állapotot jelez, amiben a PHP tudja, hogy valami nincs rendben, de folytatja a

működést, mert a szkript kijavíthatja a hibát. Ennek egy példája lehet egy érvénytelen reguláris kifejezés az ereg()-ben.

E_PARSE A parser meghalt a szkriptbeli érvénytelen szintaxis miatt; helyrehozhatatlan hiba. E_NOTICE Valami történt, ami lehet, hogy hiba, de lehet, hogy nem. A végrehajtás folytatódik. Ilyenre

példa egy idézőjelek nélküli sztring, mint tömbindex, vagy egy változó elérése, amelynek még nem adtunk értéket.

E_ALL Minden E_* formátumú konstans egyben. Ha az error_reporting() függvénnyel használják, akkor tetszőleges típusú hiba fellépését jelezni fogja a PHP.

Page 58: Diploma Aktiv Weboldal Keszites Php ASP

5. Mellékletek 58 / 91

5.5. ASP-ben megvalósított statisztikai rendszer forráskódja

Fájl: c:\inetpub\wwwroot\stat\admin_create.asp

<!-- #include virtual="/stat/inc_asp/declares.inc" --> <% TitleName = "Adatbázis létrehozás" %> <!-- #include virtual="/stat/inc_htm/header.inc" --> <!-- #include virtual="/stat/inc_asp/admin_create.inc" --> <!-- #include virtual="/stat/inc_htm/footer.inc" --> Fájl: c:\inetpub\wwwroot\stat\admin_delete.asp <!-- #include virtual="/stat/inc_asp/declares.inc" --> <!-- #include virtual="/stat/inc_asp/admin_delete.inc" --> <!-- #include virtual="/stat/inc_htm/footer.inc" --> Fájl: c:\inetpub\wwwroot\stat\admin_modify.asp <!-- #include virtual="/stat/inc_asp/declares.inc" --> <!-- #include virtual="/stat/inc_asp/admin_modify.inc" --> <!-- #include virtual="/stat/inc_htm/footer.inc" --> Fájl: c:\inetpub\wwwroot\stat\admin_newuser.asp <!-- #include virtual="/stat/inc_asp/declares.inc" --> <!-- #include virtual="/stat/inc_asp/declares_form.inc" --> <% TitleName = "Új felhasználó hozzáadása" %> <!-- #include virtual="/stat/inc_htm/header.inc" --> <!-- #include virtual="/stat/inc_asp/admin_newuser.inc" --> <!-- #include virtual="/stat/inc_htm/footer.inc" --> Fájl: c:\inetpub\wwwroot\stat\counter.asp <!-- #include virtual="/stat/inc_asp/declares.inc" --> <!-- #include virtual="/stat/inc_asp/declares_form.inc" --> <!-- #include virtual="/stat/inc_asp/dbfunc.inc" --> <% Dim strMessage Dim blnError Dim Image Dim counter Dim OldDate Dim NewDate Dim rs2 Dim rs3 Dim iptimelimit Response.ContentType = "image/png" Set Image = Server.CreateObject("AspImage.Image") Image.ImageFormat = 3 ' For PNG blnError = False If IsEmpty(p_id) Then blnError = True dbOpen strSQL = "SELECT b_r, b_g, b_b, f_r, f_g, f_b, transbackground, fontsize, fontname, iptimelimit, url FROM " & t_userdb & " WHERE id='" & p_id & "';" Set rs = dbConn.Execute(strSQL) If Not rs.EOF Then p_b_r=rs("b_r") p_b_g=rs("b_g") p_b_b=rs("b_b") p_f_r=rs("f_r")

Page 59: Diploma Aktiv Weboldal Keszites Php ASP

5. Mellékletek 59 / 91

p_f_g=rs("f_g") p_f_b=rs("f_b") p_fontsize=rs("fontsize") p_fontname=rs("fontname") p_transbackground=rs("transbackground") p_url=rs("url") strSQL = "SELECT COUNT(*) C FROM statuser" & p_id & ";" Set rs = dbConn.Execute(strSQL) counter=rs("c") strSQL = "SELECT iptimelimit FROM " & t_userdb & " WHERE id='" & p_id & "';" Set rs2 = dbConn.Execute(strSQL) iptimelimit=rs2("iptimelimit") strSQL = "SELECT logdate FROM statuser" & p_id & " ORDER BY logdate DESC;" Set rs3 = dbConn.Execute(strSQL) OldDate = rs3("logdate") NewDate = Now OldDate = DateAdd("s", iptimelimit, OldDate) If (p_url<> "" And Request.ServerVariables("HTTP_REFERER") <> p_url ) Then blnError = true If(Not blnError And NewDate > OldDate) Then dbInsert "statuser" & p_id, "'" & Now & "', '" & Request.Servervariables("REMOTE_ADDR") & "', '" & Request.ServerVariables("REMOTE_HOST") & "', '" & Request.ServerVariables("HTTP_USER_AGENT") & "'" counter = counter + 1 End If Else blnError = True End IF dbClose If Not blnError Then strMessage = " " & counter & " " Image.MaxX = Image.TextWidth (strMessage) + 20 Image.MaxY = Image.TextHeight (strMessage) + 20 If p_transbackground = 1 Then Image.Transparent = True Image.TransparentColor = RGB(P_b_r, p_b_g, p_b_b) 'Valamiért nem mükődik Image.PenColor = RGB(p_b_r, p_b_g, p_b_b) Image.BrushColor = RGB(p_b_r, p_b_g, p_b_b) Image.Rectangle 0, 0, Image.MaxX, Image.MaxY Image.FontColor = RGB(p_f_r, p_f_g, p_f_b) Else Image.PenColor = RGB(p_b_r, p_b_g, p_b_b) Image.BrushColor = RGB(p_b_r, p_b_g, p_b_b) Image.Rectangle 0, 0, Image.MaxX, Image.MaxY Image.FontColor = RGB(p_f_r, p_f_g, p_f_b) End If Image.Italic = False Image.Bold = True Image.FontName = p_fontname Image.FontSize = p_fontsize Image.PadSize = 1 Else If (p_url<>"" And Request.ServerVariables("HTTP_REFERER") <> p_url ) Then strMessage = "Hibás hivatkozás" Else strMessage="Nincs ilyen számláló" Image.MaxX = Image.TextWidth (strMessage) + 20 Image.MaxY = Image.TextHeight (strMessage) + 20 Image.Italic = False Image.Bold = True Image.FontName = "Arial" Image.FontSize = 12 Image.PadSize = 0 Image.PenColor = RGB(255, 0, 0) Image.BrushColor = RGB(222, 222, 222) Image.Rectangle 0, 0, Image.MaxX, Image.MaxY Image.FontColor = RGB(0, 0, 255) End If Image.TextOut strMessage, 5, 20, false Response.BinaryWrite Image.Image Set Image = nothing %>

Page 60: Diploma Aktiv Weboldal Keszites Php ASP

5. Mellékletek 60 / 91

Fájl: c:\inetpub\wwwroot\stat\default.asp <!-- #include virtual="/stat/inc_asp/declares.inc" --> <% TitleName = "Főmenü" %> <!-- #include virtual="/stat/inc_htm/header.inc" --> <!-- #include virtual="/stat/inc_asp/default.inc" --> <!-- #include virtual="/stat/inc_htm/footer.inc" --> Fájl: c:\inetpub\wwwroot\stat\graph.asp <!-- #include virtual="/stat/inc_asp/declares.inc" --> <!-- #include virtual="/stat/inc_asp/declares_form.inc" --> <!-- #include virtual="/stat/inc_asp/dbfunc.inc" --> <% 'Deklarációk Dim Image Dim Pos, MaxRow Dim DataMax, Data Dim X, SpaceX, ShiftX, ColX, ColMax Dim Y, SpaceY Dim MaxX Dim MaxY Dim FrameX, PicFrameX Dim FrameY, PicFrameY Dim BackColor Dim FrameColor, ColFrameColor Dim GraphColor, ColColor, FontColor, LineColor, TitleColor Dim DataTemp Dim p_year, p_oldyear, p_month, p_oldmonth, p_day, p_oldday, p_graph, p_oldgraph, p_now Dim strFMonth(12), strMonth(12), strTitle 'Hónapok beállítása strMonth(0) = "Jan" strMonth(1) = "Feb" strMonth(2) = "Már" strMonth(3) = "Ápr" strMonth(4) = "Máj" strMonth(5) = "Jún" strMonth(6) = "Júl" strMonth(7) = "Aug" strMonth(8) = "Szep" strMonth(9) = "Okt" strMonth(10) = "Nov" strMonth(11) = "Dec" strFMonth(0) = "január" strFMonth(1) = "február" strFMonth(2) = "március" strFMonth(3) = "április" strFMonth(4) = "május" strFMonth(5) = "június" strFMonth(6) = "július" strFMonth(7) = "augusztus" strFMonth(8) = "szeptember" strFMonth(9) = "október" strFMonth(10) = "november" strFMonth(11) = "december" 'Paraméterek beállítása p_now = Now p_oldgraph = Request("oldgraph") If IsEmpty(Request("graph")) Or Request("graph") = "" Then p_graph="year" Else p_graph = Request("graph") End If If Request("year") = "" Then p_year=Year(p_now) Else p_year = Request("year") End If If p_graph = "year" Then If Request("oldyear") = "" Then p_oldyear=p_year-1 Else p_oldyear = Request("oldyear") End If End If If Request("month") = "" Then p_month=Month(p_now) Else p_month = Request("month") End If

Page 61: Diploma Aktiv Weboldal Keszites Php ASP

5. Mellékletek 61 / 91

If p_graph = "month" Then p_now = p_year & "/" & p_month & "/1" If Request("oldmonth") = "" Then p_oldmonth=Month(DateAdd("m", -1, p_now)) Else p_oldmonth = Request("oldmonth") End If If Request("oldyear") = "" Then p_oldyear=Year(DateAdd("m", -1, p_now)) Else p_oldyear = Request("oldyear") End If End If If Request("day") = "" Then p_day=Day(p_now) Else p_day = Request("day") End If If p_graph = "day" Then p_now = p_year & "/" & p_month & "/" & p_day If Request("oldday") = "" Then p_oldday=Day(DateAdd("d", -1, p_now)) Else p_oldday = Request("oldday") End If If Request("oldmonth") = "" Then p_oldmonth=Month(DateAdd("d", -1, p_now)) Else p_oldmonth = Request("oldmonth") End If If Request("oldyear") = "" Then p_oldyear=Year(DateAdd("d", -1, p_now)) Else p_oldyear = Request("oldyear") End If End If 'Megjelenítéshez szükséges változók beállítása BackColor = RGB(245, 245, 245) FrameColor = RGB(180, 180, 180) GraphColor = RGB(235, 235, 235) ColColor = RGB(255, 250, 220) ColFrameColor = RGB(255, 180, 0) LineColor = RGB(255, 20, 20) FontColor = RGB(10, 120, 10) TitleColor = RGB(15, 15, 255) MaxX = 700 MaxY = 220 FrameX = 50 FrameY = 60 PicFrameX = 70 PicFrameY = 100 MaxRow = 5 Response.ContentType = "image/png" Set Image = Server.CreateObject("AspImage.Image") Image.ImageFormat = 3 ' For PNG dbOpen If p_graph="year" Then strSQL = "SELECT count(*) AS data, DATEPART(yy, logdate) AS year, DATEPART(mm, logdate) AS month FROM statuser" & p_id & " WHERE DATEPART(yy, logdate) = '" & p_year & "' OR DATEPART(yy, logdate) ='" & p_oldyear & "' GROUP BY DATEPART(yy, logdate), DATEPART(mm, logdate) ORDER BY DATEPART(yy, logdate), DATEPART(mm, logdate);" If p_graph="month" Then strSQL = "SELECT count(*) AS data, DATEPART(yy, logdate) AS year, DATEPART(mm, logdate) AS month FROM statuser" & p_id & " WHERE (DATEPART(yy, logdate) = '" & p_year & "' AND DATEPART(mm, logdate) = '" & p_month & "') OR (DATEPART(yy, logdate) ='" & p_oldyear & "' AND DATEPART(mm, logdate) = '" & p_oldmonth & "') GROUP BY DATEPART(yy, logdate), DATEPART(mm, logdate), DATEPART(dd, logdate) ORDER BY DATEPART(yy, logdate), DATEPART(mm, logdate), DATEPART(dd, logdate);" If p_graph="day" Then strSQL = "SELECT count(*) AS data, DATEPART(yy, logdate) AS year, DATEPART(mm, logdate) AS month, DATEPART(dd, logdate) AS day FROM statuser" & p_id & " WHERE (DATEPART(yy, logdate) = '" & p_year & "' AND DATEPART(mm, logdate) = '" & p_month & "' AND DATEPART(dd, logdate) = '" & p_day & "') OR (DATEPART(yy, logdate) = '" & p_oldyear & "' AND DATEPART(mm, logdate) = '" & p_oldmonth & "' AND DATEPART(dd, logdate) = '" & p_oldday & "') GROUP BY DATEPART(yy, logdate), DATEPART(mm, logdate), DATEPART(dd, logdate), DATEPART(hh, logdate) ORDER BY DATEPART(yy, logdate), DATEPART(mm, logdate), DATEPART(dd, logdate), DATEPART(hh, logdate);" Set rs = dbConn.Execute(strSQL) 'Képméret beállítása Image.FontColor = FontColor Image.Bold = True Image.FontSize=10 Image.Fontname="Ariel" Image.BackgroundColor = BackColor Image.ClearImage Image.MaxX = MaxX + PicFrameX Image.MaxY = MaxY + PicFrameY Image.PenColor= FrameColor Image.BrushColor = GraphColor Image.PenWidth = 1 ' Belső grafikon keret rajzolása Image.Rectangle FrameX, FrameY, MaxX+FrameX, MaxY+FrameY

Page 62: Diploma Aktiv Weboldal Keszites Php ASP

5. Mellékletek 62 / 91

' Viszintes segédvonalak rajzolása Y = MaxY / MaxRow Pos = 1 Image.X = FrameX Do While Pos < MaxRow Image.Y = FrameY + Pos*Y Image.LineTo Image.X+MaxX, Image.Y Pos = Pos + 1 Loop ' Maximum megállapítása DataMax = 0 ColMax = 0 Do Until rs.EOF If DataMax < rs("data") Then DataMax = rs("data") rs.MoveNext ColMax = ColMax + 1 Loop ' Maximális érték beállítása DataMax = round(DataMax *1.1) If DataMax Mod MaxRow = 0 Then DataMax = DataMax + MaxRow Else DataMax = DataMax + MaxRow - DataMax Mod MaxRow End If ' Viszintes értékek felrajzolása Pos = MaxRow Do While Pos >= 0 DataTemp = DataMax * Pos / MaxRow Image.TextOut DataTemp, FrameX-Image.TextWidth(DataTemp)-6, FrameY-(Image.TextHeight(DataTemp)*2/3) + MaxY-MaxY*Pos/MaxRow, false Pos = Pos - 1 Loop Image.FontColor = TitleColor If p_graph = "year" Then strTitle = p_year & ". év látogatottsági statisztikája havi bontásban" if p_graph = "month" Then strTitle = p_year & ". év " & strFMonth(p_month-1) & " hó látogatottsági statisztikája napi bontásban" if p_graph = "day" Then strTitle = p_year & ". év " & strFMonth(p_month-1) & " hó " & p_day & ". nap látogatottsági statisztikája óránkénti bontásban" Image.TextOut strTitle, FrameX+25, 40, false Image.BrushColor=ColColor Image.PenColor=ColFrameCOlor Image.Rectangle FrameX, 40, FrameX+20, 55 If p_oldgraph = "" OR p_oldgraph = "yes" Then If p_graph = "year" Then strTitle = p_oldyear & ". év látogatottsági statisztikája havi bontásban" if p_graph = "month" Then strTitle = p_oldyear & ". év " & strFMonth(p_oldmonth-1) & " hó látogatottsági statisztikája napi bontásban" if p_graph = "day" Then strTitle = p_oldyear & ". év " & strFMonth(p_oldmonth-1) & " hó " & p_oldday & ". nap látogatottsági statisztikája óránkénti bontásban" Image.TextOut strTitle, FrameX+25, 20, false Image.BrushColor=LineColor Image.PenColor=LineCOlor Image.Rectangle FrameX, 27, FrameX+20, 29 End If ' Oszlopok kirajzolása If p_graph = "year" Then ColMax = 13 ColX = 10 End If If p_graph = "month" Then ColMax = 32 ColX = 5 End If If p_graph = "day" Then ColMax = 25 ColX = 7 End If

Page 63: Diploma Aktiv Weboldal Keszites Php ASP

5. Mellékletek 63 / 91

SpaceX = MaxX / ColMax - ColX Image.BrushColor = ColColor Image.PenColor = ColFrameColor Image.FontColor = FontColor If p_graph = "year" Then Pos = 0 Do Until Pos = 12 Image.TextOut strMonth(pos), FrameX+(SpaceX+ColX)/2+Pos*(SpaceX+ColX)+(SpaceX-Image.TextWidth(strMonth(pos)))/2-1, FrameY+MaxY+3+Image.TextHeight(strMonth(pos))/2, false Pos = Pos + 1 Loop End If If p_graph = "month" Then Pos = 0 Do Until Pos = 31 Image.TextOut Pos+1, FrameX+(SpaceX+ColX)/2+Pos*(SpaceX+ColX)+(SpaceX-Image.TextWidth(Pos+1))/2-1, FrameY+MaxY+3+Image.TextHeight(Pos)/2, false Pos = Pos + 1 Loop End If If p_graph = "day" Then Pos = 0 Do Until Pos = 24 Image.TextOut Pos, FrameX+(SpaceX+ColX)/2+Pos*(SpaceX+ColX)+(SpaceX-Image.TextWidth(Pos))/2-1, FrameY+MaxY+3+Image.TextHeight(Pos)/2, false Pos = Pos + 1 Loop End If dbClose dbOpen If p_graph = "year" Then strSQL = "SELECT count(*) AS data, DATEPART(yy, logdate) AS year, DATEPART(mm, logdate)" _ & " AS month FROM statuser" & p_id & " WHERE DATEPART(yy, logdate) = '" & p_year _ & "' GROUP BY DATEPART(yy, logdate), DATEPART(mm, logdate) ORDER BY DATEPART(yy, logdate), " _ & "DATEPART(mm, logdate);" If p_graph = "month" Then strSQL="SELECT count(*) AS data, DATEPART(yy, logdate) AS year, DATEPART(mm, logdate)" _ & "AS month, DATEPART(dd, logdate) AS day FROM statuser" & p_id & " WHERE DATEPART(yy, logdate) = '" & p_year _ & "' AND DATEPART(mm, logdate) = '" & p_month & "' GROUP BY DATEPART(yy, logdate), DATEPART(mm, logdate), " _ & "DATEPART(dd, logdate) ORDER BY DATEPART(yy, logdate), DATEPART(mm, logdate), DATEPART(dd, logdate);" If p_graph = "day" Then strSQL = "SELECT count(*) AS data, DATEPART(yy, logdate) AS year, DATEPART(mm, logdate) " _ & "AS month, DATEPART(dd, logdate) AS day, DATEPART(hh, logdate) AS hour FROM statuser" & p_id & " WHERE " _ & "DATEPART(yy, logdate) = '" & p_year & "' AND DATEPART(mm, logdate) = '" & p_month & "' AND " _ & "DATEPART(dd, logdate) = '" & p_day & "' GROUP BY DATEPART(yy, logdate), DATEPART(mm, logdate), " _ & "DATEPART(dd, logdate), DATEPART(hh, logdate) ORDER BY DATEPART(yy, logdate), DATEPART(mm, logdate), " _ & "DATEPART(dd, logdate), DATEPART(hh, logdate);" Set rs = dbConn.Execute(strSQL) Pos = 0 Do Until rs.EOF If p_graph = "year" AND pos+1 = rs("month") Then Data = rs("data") Else Data=0 End If If p_graph = "month" Then If pos+1 = rs("day") Then Data = rs("data") Else Data=0 End If End If If p_graph = "day" Then If pos = rs("hour") Then Data = rs("data") Else Data=0 End If End If SpaceY=MaxY-(MaxY*Data/DataMax)-1 Image.PenColor= ColFrameColor Image.BrushColor = ColColor Image.PenColor= ColFrameColor Image.BrushColor = ColColor Image.Rectangle FrameX+(SpaceX+ColX)/2+Pos*(SpaceX+ColX), FrameY+SpaceY, FrameX+(SpaceX+ColX)/2+SpaceX+Pos*(SpaceX+ColX), FrameY+MaxY If p_graph = "year" AND pos+1 = rs("month") Then rs.MoveNext If p_graph = "month" Then If pos+1 = rs("day") Then rs.MoveNext End If If p_graph = "day" Then If pos = rs("hour") Then rs.MoveNext End If Pos = Pos + 1 Loop

Page 64: Diploma Aktiv Weboldal Keszites Php ASP

5. Mellékletek 64 / 91

dbClose dbOpen If p_graph = "year" Then strSQL = "SELECT count(*) AS data, DATEPART(yy, logdate) AS year, DATEPART(mm, logdate) AS month FROM statuser" & p_id & " WHERE DATEPART(yy, logdate) = '" & p_oldyear & "' GROUP BY DATEPART(yy, logdate), DATEPART(mm, logdate) ORDER BY DATEPART(yy, logdate), DATEPART(mm, logdate);" If p_graph = "month" Then strSQL = "SELECT count(*) AS data, DATEPART(yy, logdate) AS year, DATEPART(mm, logdate) AS month, DATEPART(dd, logdate) AS day FROM statuser" & p_id & " WHERE DATEPART(yy, logdate) = '" & p_oldyear & "' AND DATEPART(mm, logdate) = '" & p_oldmonth & "' GROUP BY DATEPART(yy, logdate), DATEPART(mm, logdate), DATEPART(dd, logdate) ORDER BY DATEPART(yy, logdate), DATEPART(mm, logdate), DATEPART(dd, logdate);" If p_graph = "day" Then strSQL = "SELECT count(*) AS data, DATEPART(yy, logdate) AS year, DATEPART(mm, logdate) AS month, DATEPART(dd, logdate) AS day, DATEPART(hh, logdate) AS hour FROM statuser" & p_id & " WHERE DATEPART(yy, logdate) = '" & p_oldyear & "' AND DATEPART(mm, logdate) = '" & p_oldmonth & "' AND DATEPART(dd, logdate) = '" & p_oldday & "' GROUP BY DATEPART(yy, logdate), DATEPART(mm, logdate), DATEPART(dd, logdate), DATEPART(hh, logdate) ORDER BY DATEPART(yy, logdate), DATEPART(mm, logdate), DATEPART(dd, logdate), DATEPART(hh, logdate);" Set rs = dbConn.Execute(strSQL) ' Előző évi grafikon rajzolása If p_oldgraph = "" Or p_oldgraph = "yes" Then Pos = 0 Do Until rs.EOF If p_graph = "year" AND pos+1 = rs("month") Then Data = rs("data") Else Data=0 End If If p_graph = "month" Then If pos+1 = rs("day") Then Data = rs("data") Else Data=0 End If End If If p_graph = "day" Then If pos = rs("hour") Then Data = rs("data") Else Data=0 End If End If SpaceY=MaxY-(MaxY*Data/DataMax)-1 Image.PenColor= LineColor Image.BrushColor = LineColor Image.FontColor = LineColor If Pos = 0 Then Image.X = FrameX + (SpaceX+ColX)/2+SpaceX/2 Image.Y = FrameY+SpaceY Else Image.LineTo FrameX+(SpaceX+ColX)/2+Pos*(SpaceX+ColX)+SpaceX/2, FrameY+SpaceY Image.X = FrameX+(SpaceX+ColX)/2+Pos*(SpaceX+ColX)+SpaceX/2 Image.Y = FrameY + SpaceY End If If p_graph = "year" AND pos+1 = rs("month") Then rs.MoveNext If p_graph = "month" Then If pos+1 = rs("day") Then rs.MoveNext End If If p_graph = "day" Then If pos = rs("hour") Then rs.MoveNext End If Pos = Pos + 1 Loop End If dbClose Response.BinaryWrite Image.Image Set Image = nothing %> Fájl: c:\inetpub\wwwroot\stat\user_login.asp <!-- #include virtual="/stat/inc_asp/declares.inc" --> <!-- #include virtual="/stat/inc_asp/declares_login.inc" --> <% TitleName = "Belépés" %> <!-- #include virtual="/stat/inc_asp/user_login.inc" --> <!-- #include virtual="/stat/inc_htm/footer.inc" --> Fájl: c:\inetpub\wwwroot\stat\user_logout.asp <% TitleName = "Kilépés" %> <!-- #include virtual="/stat/inc_asp/user_logout.inc" --> <!-- #include virtual="/stat/inc_htm/footer.inc" -->

Page 65: Diploma Aktiv Weboldal Keszites Php ASP

5. Mellékletek 65 / 91

Fájl: c:\inetpub\wwwroot\stat\user_menu.asp <% TitleName = "Felhasználói oldal" %> <!-- #include virtual="/stat/inc_htm/header.inc" --> <!-- #include virtual="/stat/inc_asp/user_menu.inc" --> <!-- #include virtual="/stat/inc_htm/footer.inc" --> Fájl: c:\inetpub\wwwroot\stat\user_login.asp <!-- #include virtual="/stat/inc_asp/declares.inc" --> <% TitleName = "Látogatottsági oldal" %> <!-- #include virtual="/stat/inc_htm/header.inc" --> <!-- #include virtual="/stat/inc_asp/user_stat.inc" --> <!-- #include virtual="/stat/inc_htm/footer.inc" --> Fájl: c:\inetpub\wwwroot\stat\inc_asp\add.inc <% dbOpen strSQL = "SELECT COUNT(id) c FROM "& t_userdb & ";" Set rs = dbConn.Execute(strSQL) Dim numID If rs("c") > 0 Then strSQL = "SELECT MAX(id) max_id FROM " & t_userdb & ";" Set rs = dbConn.Execute(strSQL) numID = rs("max_id") + 1 Else numID = 100000 End If dbInsert t_userdb, "'" & numID & "', '" & p_username & "', '" & p_password1 & "', '" & p_url & "', '" & p_iptimelimit & "', '" & p_b_r & "', '" & p_b_g & "', '" & p_b_b & "', '" & p_f_r & "', '" & p_f_g & "', '" & p_f_b & "', '" & p_transbackground & "', '" & p_fontsize & "', '" & p_fontname & "'" dbCreate "statuser" & numID, "logdate datetime, ipaddress char(15), hostname varchar(200), browser varchar(200)" strSQL = "CREATE INDEX logdate_ndx ON statuser" & numID & " (logdate);" dbConn.Execute(strSQL) dbClose %> Fájl: c:\inetpub\wwwroot\stat\inc_asp\admin_create.inc <!-- #include virtual="/stat/inc_asp/dbfunc.inc" --> <% dbOpen dbCreate t_userdb, "id int primary key, username varchar(30) not null, password varchar(8) not null, url varchar(200) not null, iptimelimit int not null default 0, b_r int default 0, b_g int default 0, b_b int default 0, f_r int default 255, f_g int default 255, f_b int default 255, transbackground int default 0, fontsize int default 12, fontname varchar(50) default 'Arial'" dbClose Response.Write "Adatbázis sikeresen létrehozva." %> Fájl: c:\inetpub\wwwroot\stat\inc_asp\admin_delete.inc <!-- #include virtual="/stat/inc_asp/dbfunc.inc" --> <!-- #include virtual="/stat/inc_asp/delete.inc" -->

Page 66: Diploma Aktiv Weboldal Keszites Php ASP

5. Mellékletek 66 / 91

<% If (IsEmpty(p_do) Or p_do = "list") Then %> <% TitleName = "Felhasználó listázása (törlés)" %> <!-- #include virtual="/stat/inc_htm/header.inc" --> <% dbList %> <% ElseIf p_do = "delete" And Not IsEmpty(p_id) Then dbDelete p_id TitleName = "Felhasználó törlése" %> <!-- #include virtual="/stat/inc_htm/header.inc" --> <h1>Törölve az adatbázisból: <%=p_id%>!</h1> <a href="<%=ASPSELF%>?do=list">Listázás</a> <% Else TitleName = "HIBA" %> <!-- #include virtual="/stat/inc_htm/header.inc" --> <h1>Hiba a törlés közben!</h1> <% End If %> Fájl: c:\inetpub\wwwroot\stat\inc_asp\admin_modify.inc <!-- #include virtual="/stat/inc_asp/dbfunc.inc" --> <!-- #include virtual="/stat/inc_asp/modify.inc" --> <!-- #include virtual="/stat/inc_asp/declares_form.inc" --> <% If (IsEmpty(p_do) Or p_do = "list") And IsEmpty(p_state) Then %> <% TitleName = "Felhasználó listázása (módosítás)" %> <!-- #include virtual="/stat/inc_htm/header.inc" --> <% dbList %> <% ElseIf p_do = "detail" And Not IsEmpty(p_id) Then %> <% dbRead p_id TitleName = "Felhasználó módosítása" HeadTitle = "Felhasználó adatai" ButtonName = "Módosít" p_state=3 %> <!-- #include virtual="/stat/inc_htm/header.inc" --> <!-- #include virtual="/stat/inc_htm/admin_newuser1.inc" --> <% ElseIf Not IsEmpty(p_state) And p_state = 3 And Not IsEmpty(p_id) And p_password1=p_password2 Then %> <% TitleName = "Felhasználó adat módosítása" %> <!-- #include virtual="/stat/inc_htm/header.inc" --> <% dbUpdate p_id %> <h1>Sikeres módosítás!</h1> <a href="<%=ASPSELF%>?do=list">Listázás</a> <% Else %> <% TitleName = "HIBA" %> <!-- #include virtual="/stat/inc_htm/header.inc" --> <h1>Hiba a módosítás megadásánál! Rossz jelszó?</h1> <% End If %> Fájl: c:\inetpub\wwwroot\stat\inc_asp\admin_newuser.inc <% HeadTitle = "Új felhasználó adatai" ButtonName = "Felvesz" %>

Page 67: Diploma Aktiv Weboldal Keszites Php ASP

5. Mellékletek 67 / 91

<!-- #include virtual="/stat/inc_asp/dbfunc.inc" --> <% If IsEmpty(p_state) Or p_state<>2 Then p_id=-1 p_state=2 p_username="Login_name" p_password1="" p_url="http://localhost" p_iptimelimit=3600 p_f_r=255 p_f_g=255 p_f_b=255 p_b_r=0 p_b_g=0 p_b_b=0 p_transbackground=0 p_fontsize=11 p_fontname="Times New Roman" %> <!-- #include virtual="/stat/inc_htm/admin_newuser1.inc" --> <% ElseIf p_state = 2 And p_password1=p_password2 And p_username<>"" And p_password1<>"" Then %> <!-- #include virtual="/stat/inc_asp/add.inc" --> <!-- #include virtual="/stat/inc_htm/admin_newuser2.inc" --> <% Else %> <!-- #include virtual="/stat/inc_htm/admin_newuser3.inc" --> <% End If %> Fájl: c:\inetpub\wwwroot\stat\inc_asp\dbfunc.inc <% Sub dbOpen Set dbConn = Server.CreateObject("ADODB.Connection") dbConn.Open "DSN=WEBSQL;DATABASE=aspdb;UID=msuser;PWD=asp123" End Sub Sub dbCreate (pName, pType) strSQL = "CREATE TABLE " & pName & "(" & pType & ");" dbConn.Execute (strSQL) End Sub Sub dbInsert (pName, pLine) strSQL = "INSERT INTO " & pName & " VALUES(" & pLine & ");" dbConn.Execute (strSQL) End Sub Sub dbClose dbConn.Close End Sub %> Fájl: c:\inetpub\wwwroot\stat\inc_asp\declares.inc <% Option Explicit Dim TitleName

Page 68: Diploma Aktiv Weboldal Keszites Php ASP

5. Mellékletek 68 / 91

Dim HeadTitle Dim ButtonName Dim ASPSELF Dim dbConn Dim strSQL Dim t_userdb Dim rs Dim p_state Dim p_do Dim p_id Dim p_page p_page = Request("page") p_state = Request.Form("state") p_id = Request("id") p_do = Request("do") t_userdb = "statusers" ASPSELF = Request.ServerVariables("SCRIPT_NAME") %> Fájl: c:\inetpub\wwwroot\stat\inc_asp\declarec_form.inc <% Dim p_username Dim p_password1 Dim p_password2 Dim p_url Dim p_iptimelimit Dim p_f_b Dim p_f_r Dim p_f_g Dim p_b_b Dim p_b_r Dim p_b_g Dim p_transbackground Dim p_fontsize Dim p_fontname If Not IsEmpty(p_state) Or Not IsEmpty(p_id) Then p_username = Request.Form("username") p_password1 = Request.Form("password1") p_password2 = Request.Form("password2") p_url = Request.Form("url") p_iptimelimit = Request.Form("iptimelimit") p_f_r = Request.Form("f_r") p_f_g = Request.Form("f_g") p_f_b = Request.Form("f_b") p_b_r = Request.Form("b_r") p_b_g = Request.Form("b_g") p_b_b = Request.Form("b_b") p_transbackground = Request.Form("transbackground") p_fontsize = Request.Form("fontsize") p_fontname = Request.Form("fontname") End IF %> Fájl: c:\inetpub\wwwroot\stat\inc_asp\declares_login.inc <% Dim p_username Dim p_password p_username = Request.Form("username") p_password = Request.Form("password") %> Fájl: c:\inetpub\wwwroot\stat\inc_asp\default.inc <% If p_page = "" Or p_page = "admin" Then %>

Page 69: Diploma Aktiv Weboldal Keszites Php ASP

5. Mellékletek 69 / 91

<center> <h1>Adminisztrációs menü</h1> <table border=0 cellpadding=3 align=center valign=center> <tr><td align="center"><b>Leírás</b></td><td align=center><b>Link</b></td></tr> <tr><td align="right" >Üres adatbázis létrehozása:</td><td><a href="admin_create.asp">inicializálás!</a></td></tr> <tr><td align="right">Új felhasználó hozzáadása:</td><td><a href="admin_newuser.asp">regisztráció!</a></td></tr> <tr><td align="right">Felhasználó adatainak módosítása:</td><td><a href="admin_modify.asp?do=list">változtatás!</a></td></tr> <tr><td align="right">Felhasználó törlése:</td><td><a href="admin_delete.asp">törlés!</a> </table> </center> <% Else %> <center> <h1>Felhasználói menü</h1> <table border=0 cellpadding=3 align=center valign=center> <tr><td align="center"><b>Leírás</b></td><td align=center><b>Link</b></td></tr> <tr><td align="right">Felhasználó beléptetése:</td><td><a href="user_login.asp">belépés!</a> <tr><td align="right">Felhasználó menü:</td><td><a href="user_menu.asp">menü megjelenítése!</a> <tr><td align="right">Felhasználó kiléptetése:</td><td><a href="user_logout.asp">kilépés!</a> </table> </center> <% End If %> Fájl: c:\inetpub\wwwroot\stat\inc_asp\delete.inc <% Sub dbList dbOpen strSQL = "SELECT * FROM "& t_userdb & ";" Set rs = dbConn.Execute(strSQL) Response.Write "<h1>Törlés</h1><center><table align=center><tr><td><b>Sorszám</b></td><td><b>Név</b></td></tr>" Dim cnt cnt = 1 Do Until rs.EOF Response.Write "<tr><td align=right> " & cnt & ". </td><td><a href=" & ASPSELF & "?do=delete&id=" & rs("id") & ">" & rs("username") & "</a></td></tr>" cnt = cnt + 1 rs.MoveNext Loop Response.Write "</table></center>" dbClose End Sub Sub dbDelete(r_id) dbOpen strSQL = "DELETE FROM " & t_userdb & " WHERE id='" & r_id & "';" dbConn.Execute(strSQL) strSQL = "DROP TABLE statuser" & r_id & ";" dbConn.Execute(strSQL) dbClose End Sub %> Fájl: c:\inetpub\wwwroot\stat\inc_asp\modify.inc <% Sub dbList dbOpen strSQL = "SELECT * FROM "& t_userdb & ";" Set rs = dbConn.Execute(strSQL)

Page 70: Diploma Aktiv Weboldal Keszites Php ASP

5. Mellékletek 70 / 91

Response.Write "<h1>Módosítás</h1><center><table align=center><tr><td><b>Sorszám</b></td><td><b>Név</b></td></tr>" Dim cnt cnt = 1 Do Until rs.EOF Response.Write "<tr><td align=right> " & cnt & ". </td><td><a href=" & ASPSELF & "?do=detail&id=" & rs("id") & ">" & rs("username") & "</a></td></tr>" cnt = cnt + 1 rs.MoveNext Loop Response.Write "</table></center>" dbClose End Sub Sub dbRead(r_id) dbOpen strSQL = "SELECT * FROM "& t_userdb & " WHERE id='" & r_id & "';" Set rs = dbConn.Execute(strSQL) p_username = rs("username") p_password1 = rs("password") p_password2 = rs("password") p_iptimelimit = rs("iptimelimit") p_url = rs("url") p_f_r = rs("f_r") p_f_b = rs("f_b") p_f_g = rs("f_g") p_b_r = rs("b_r") p_b_g = rs("b_g") p_b_b = rs("b_b") p_transbackground = rs("transbackground") p_fontsize = rs("fontsize") p_fontname = rs("fontname") dbClose End Sub Sub dbUpdate(r_id) dbOpen strSQL = "UPDATE "& t_userdb & " SET " & _ "username = '" & p_username & "', " & _ "password = '" & p_password1 & "', " & _ "url = '" & p_url & "', " & _ "iptimelimit = '" & p_iptimelimit & "', " & _ "f_r = '" & p_f_r & "', " & _ "f_b = '" & p_f_b & "', " & _ "f_g = '" & p_f_g & "', " & _ "b_r = '" & p_b_r & "', " & _ "b_b = '" & p_b_b & "', " & _ "b_g = '" & p_b_g & "', " & _ "transbackground = '" & p_transbackground & "', " & _ "fontsize = '" & p_fontsize & "', " & _ "fontname = '" & p_fontname & "' " & _ "WHERE id='" & r_id & "';" dbConn.Execute(strSQL) dbClose End Sub %> Fájl: c:\inetpub\wwwroot\stat\inc_asp\user_login.inc <!-- #include virtual="/stat/inc_asp/dbfunc.inc" --> <% If IsEmpty(p_state) Or p_state<>2 Then %> <!-- #include virtual="/stat/inc_htm/header.inc" --> <!-- #include virtual="/stat/inc_htm/user_login.inc" -->

Page 71: Diploma Aktiv Weboldal Keszites Php ASP

5. Mellékletek 71 / 91

<% ElseIf p_state=2 And p_username<>"" And p_password<>"" Then dbOpen strSQL = "SELECT username, password, id FROM " & t_userdb & " WHERE username='" & p_username & "' AND password='" & p_password & "';" Set rs = dbConn.Execute(strSQL) If Not rs.EOF Then p_id=rs("id") Response.Cookies("STAT_ID") = p_id Response.Redirect("/stat/user_menu.asp") Else %> <!-- #include virtual="/stat/inc_htm/header.inc" --> <% Response.Write "<h1>Sikertelen belépés!</h1>" Response.Write "Helytelen a felhasználónév / jelszó páros!<br>" Response.Write "<a href=" & ASPSELF & ">Újra</a>" End IF dbClose Else %> <!-- #include virtual="/stat/inc_htm/header.inc" --> <% Response.Write "<h1>Sikeretelen belépés!</h1>" Response.Write "<a href=" & ASPSELF & ">Újra</a>" End If %> Fájl: c:\inetpub\wwwroot\stat\inc_asp\user_logout.inc <% Response.Cookies("STAT_ID") = -1 %> <!-- #include virtual="/stat/inc_htm/header.inc" --> <h2>Sikeres kilépés. </h2> Fájl: c:\inetpub\wwwroot\stat\inc_asp\user_menu.inc <% Dim stat_id stat_id = Request.Cookies("STAT_ID") If stat_id = "" Or stat_id = "-1" Then Response.Write "<h1>Hiba</h1>Süti információ nem található, vagy érvénytelen adat. (" & stat_id & ")" Else %> <h1>Statisztikák</h1> <table border=1><tbody> <tr><td align=right><b>Intervallum</b></td><td align=center><b>Táblázat</b></td><td align=center><b>Grafikon</b></td></tr> <tr><td align="right" width=100>Összes:</td><td align=center width=100><a href=/stat/user_stat.asp?show=table&data=all>mutat</a></td><td align=center width=100>&nbsp;</td></tr> <tr><td align="right" width=100>Éves:</td><td align=center width=100><a href=/stat/user_stat.asp?show=table&data=year>mutat</a></td><td align=center width=100><a href=/stat/user_stat.asp?show=graph&data=year>mutat</a></td></tr> <tr><td align="right" width=100>Havi:</td><td align=center width=100><a href=/stat/user_stat.asp?show=table&data=month>mutat</a></td><td align=center width=100><a href=/stat/user_stat.asp?show=graph&data=month>mutat</a></td></tr> <tr><td align="right" width=100>Heti:</td><td align=center width=100><a href=/stat/user_stat.asp?show=table&data=week>mutat</a></td><td align=center width=100>&nbsp;</td></tr> <tr><td align="right" width=100>Napi:</td><td align=center width=100><a href=/stat/user_stat.asp?show=table&data=day>mutat</a></td><td align=center width=100>&nbsp;</td></tr> <tr><td align="right" width=100>Óránkénti:</td><td align=center width=100><a href=/stat/user_stat.asp?show=table&data=hour>mutat</a></td><td align=center width=100>&nbsp;</td></tr> </tbody></table> <% End If %>

Page 72: Diploma Aktiv Weboldal Keszites Php ASP

5. Mellékletek 72 / 91

Fájl: c:\inetpub\wwwroot\stat\inc_asp\user_stat.inc <!-- #include virtual="/stat/inc_asp/dbfunc.inc" --> <% Dim cnt Dim d_show Dim d_data Dim stat_id Dim p_where stat_id = Request.Cookies("STAT_ID") d_show = Request.QueryString("show") d_data = Request.QueryString("data") If d_data = "" Then d_data = "all" If d_show = "" Then d_show = "table" cnt = 1 dbOpen Response.Write "<a href=/stat/user_menu.asp>M E N Ü</a><br>" p_where = "" If(d_data = "month" And Request("year") <> "") Then p_where = "WHERE DATEPART(yy, logdate) = '" & Request("year") & "'" If(d_data = "day" And Request("year") <> "" And Request("month")<> "" ) Then p_where = "WHERE DATEPART(yy, logdate) = '" & Request("year") & "' AND DATEPART(mm, logdate) = '" & Request("month") & "'" If(d_data = "hour" And Request("year") <> "" And Request("month")<> "" AND Request("day") <> "") Then p_where = "WHERE DATEPART(yy, logdate) = '" & Request("year") & "' AND DATEPART(mm, logdate) = '" & Request("month") & "' AND DATEPART(dd, logdate) = '" & Request("day") & "'" If d_show = "table" Then If(d_data = "all") Then strSQL = "SELECT logdate, ipaddress, hostname, browser FROM statuser" & stat_id & " ORDER BY logdate;" If(d_data = "year") Then strSQL = "SELECT count(*) AS c, DATEPART(yy, logdate) AS year FROM statuser" & stat_id & " " & p_where & " GROUP BY DATEPART(yy, logdate) ORDER BY DATEPART(yy, logdate);" If(d_data = "month") Then strSQL = "SELECT count(*) AS c, DATEPART(yy, logdate) AS year, DATEPART(mm, logdate) AS month FROM statuser" & stat_id & " " & p_where & " GROUP BY DATEPART(yy, logdate), DATEPART(mm, logdate) ORDER BY DATEPART(yy, logdate), DATEPART(mm, logdate);" If(d_data = "week") Then strSQL = "SELECT count(*) AS c, DATEPART(yy, logdate) AS year, DATEPART(ww, logdate) AS week FROM statuser" & stat_id & " " & p_where & " GROUP BY DATEPART(yy, logdate), DATEPART(ww, logdate) ORDER BY DATEPART(yy, logdate), DATEPART(ww, logdate);" If(d_data = "day") Then strSQL = "SELECT count(*) AS c, DATEPART(yy, logdate) AS year, DATEPART(mm, logdate) AS month, DATEPART(dd, logdate) AS day FROM statuser" & stat_id & " " & p_where & " GROUP BY DATEPART(yy, logdate), DATEPART(mm, logdate), DATEPART(dd, logdate) ORDER BY DATEPART(yy, logdate), DATEPART(mm, logdate), DATEPART(dd, logdate);" If(d_data = "hour") Then strSQL = "SELECT count(*) AS c, DATEPART(yy, logdate) AS year, DATEPART(mm, logdate) AS month, DATEPART(dd, logdate) AS day, DATEPART(hh, logdate) AS hour FROM statuser" & stat_id & " " & p_where & " GROUP BY DATEPART(yy, logdate), DATEPART(mm, logdate), DATEPART(dd, logdate), DATEPART(hh, logdate) ORDER BY DATEPART(yy, logdate), DATEPART(mm, logdate), DATEPART(dd, logdate), DATEPART(hh, logdate);" Set rs = dbConn.Execute(strSQL) If(d_data = "all") Then Response.Write "<h1>Látogatás, összes adat</h1><center><table align=center border=1><tr><td><b>Sorszám</b></td><td><b>Dátum, idő</b></td><td><b>IP</b></td><td><b>Host</b></td><td><b>Böngésző</b></td></tr>" If(d_data = "year") Then Response.Write "<h1>Látogatás, éves összesítés</h1><center><table align=center border=1><tr><td><b>Sorszám</b></td><td><b>Év</b></td><td><b>Találatok</b></td><td><b>Táblázat</b></td><td><b>Grafikon</b></td></tr>" If(d_data = "month") Then Response.Write "<h1>Látogatás, havi összesítés</h1><center><table align=center border=1><tr><td><b>Sorszám</b></td><td><b>Év</b></td><td><b>Hónap</b></td><td><b>Találatok</b></td><td><b>Táblázat</b></td><td><b>Grafikon</b></td></tr>" If(d_data = "week") Then Response.Write "<h1>Látogatás, heti összesítés</h1><center><table align=center border=1><tr><td><b>Sorszám</b></td><td><b>Év</b></td><td><b>Hét</b></td><td><b>Találatok</b></td></tr>" If(d_data = "day") Then Response.Write "<h1>Látogatás, napi összesítés</h1><center><table align=center border=1><tr><td><b>Sorszám</b></td><td><b>Év</b></td><td><b>Hónap</b></td><td><b>Nap</b></td><td><b>Találatok</b></td><td><b>Táblázat</b></td><td><b>Grafikon</b></td></tr>" If(d_data = "hour") Then Response.Write "<h1>Látogatás, óránkénti összesítés</h1><center><table align=center border=1><tr><td><b>Sorszám</b></td><td><b>Év</b></td><td><b>Hónap</b></td><td><b>Nap</b></td><td><b>Óra</b></td><td><b>Találatok</b></td></tr>"

Page 73: Diploma Aktiv Weboldal Keszites Php ASP

5. Mellékletek 73 / 91

Do Until rs.EOF if(d_data = "all") Then Response.Write "<tr><td align=right> " & cnt & ". </td><td>" & rs("logdate") & "</td><td>" & rs("ipaddress") & "</td><td>" & rs("hostname") & "</td><td>" & rs("browser") & "</td></tr>" if(d_data = "year") Then Response.Write "<tr><td align=right> " & cnt & ". </td><td>" & rs("year") & ".</td><td align=right>" & rs("c") & "</td><td><a href=" & ASPSELF & "?show=table&data=month&year=" & rs("year") & ">havi bontás</a></td><td><a href=/stat/graph.asp?id=" & stat_id & "&year=" & rs("year") & "&graph=year>havi bontás</a></td></tr>" if(d_data = "month") Then Response.Write "<tr><td align=right> " & cnt & ". </td><td>" & rs("year") & ".</td><td align=right>" & rs("month") & ".</td><td align=right>" & rs("c") & "</td><td><a href=" & ASPSELF & "?show=table&data=day&year=" & rs("year") & "&month=" & rs("month") & ">napi bontás</a></td><td><a href=/stat/graph.asp?id=" & stat_id & "&year=" & rs("year") & "&month=" & rs("month") & "&graph=month>napi bontás</a></td></tr>" if(d_data = "week") Then Response.Write "<tr><td align=right> " & cnt & ". </td><td>" & rs("year") & ".</td><td align=right>" & rs("week") & ".</td><td align=right>" & rs("c") & "</td></tr>" if(d_data = "day") Then Response.Write "<tr><td align=right> " & cnt & ". </td><td>" & rs("year") & ".</td><td align=right>" & rs("month") & ".</td><td align=right>" & rs("day") & ".</td><td align=right>" & rs("c") & "</td><td><a href=" & ASPSELF & "?show=table&data=hour&year=" & rs("year") & "&month=" & rs("month") & "&day=" & rs("day") & ">óránkénti bontás</a></td><td><a href=/stat/graph.asp?id=" & stat_id & "&year=" & rs("year") & "&month=" & rs("month") & "&day=" & rs("day") & "&graph=day>óránkénti bontás</a></td></tr>" if(d_data = "hour") Then Response.Write "<tr><td align=right> " & cnt & ". </td><td>" & rs("year") & ".</td><td align=right>" & rs("month") & ".</td><td align=right>" & rs("day") & ".</td><td align=right>" & rs("hour") & ".</td><td align=right>" & rs("c") & "</td></tr>" cnt = cnt + 1 rs.MoveNext Loop Response.Write "</table></center>" Response.Write "<br><a href=/stat/user_menu.asp>M E N Ü</a>" Else If(d_data = "year") Then strSQL = "SELECT count(*) AS c, DATEPART(yy, logdate) AS year FROM statuser" & stat_id & " GROUP BY DATEPART(yy, logdate) ORDER BY DATEPART(yy, logdate);" If(d_data = "month") Then strSQL = "SELECT count(*) AS c, DATEPART(yy, logdate) AS year, DATEPART(mm, logdate) AS month FROM statuser" & stat_id & " GROUP BY DATEPART(yy, logdate), DATEPART(mm, logdate) ORDER BY DATEPART(yy, logdate), DATEPART(mm, logdate);" Set rs = dbConn.Execute(strSQL) If(d_data = "year") Then Response.Write "<h1>Látogatás, éves összesítés grafikon</h1><center><table align=center border=1>" If(d_data = "month") Then Response.Write "<h1>Látogatás, havi összesítés grafikon</h1><center><table align=center border=1>" Do Until rs.EOF if(d_data = "year") Then Response.Write "<tr><td><img src=/stat/graph.asp?id=" & stat_id & "&year=" & rs("year") & "&graph=year&oldgraph=no></td></tr>" if(d_data = "month") Then Response.Write "<tr><td><img src=/stat/graph.asp?id=" & stat_id & "&year=" & rs("year") & "&month=" & rs("month") & "&graph=month&oldgraph=no></td></tr>" rs.MoveNext Loop Response.Write "</table></center>" Response.Write "<br><a href=/stat/user_menu.asp>M E N Ü</a>" End If dbClose %> Fájl: c:\inetpub\wwwroot\stat\inc_htm\admin_newuser1.inc <h1><%=HeadTitle%></h1> <form action="<%= ASPSELF %>" method="post"> <table align="center" width="800"> <tr><td align="right" width="300">Felhasználó neve: </td><td width="500"><input type="text" maxlength="30" size="30" name="username" value="<%=p_username%>"></td></tr> <tr><td align="right" width="300">Jelszó: </td><td width="500"><input type="password" maxlength="8" size="32" name="password1" value="<%=p_password1%>"></td></tr> <tr><td align="right" width="300">Jelszó mégegyszer:</td><td width="500"><input type="password" maxlength="8" size="32" name="password2" value="<%=p_password2%>"></td></tr> <tr><td align="right" width="300">URL: </td><td width="500"><input type="text" maxlength="200" size="30" name="url" value="<%=p_url%>"></td></tr> <tr><td align="right" width="300">IP időkorlátozás: </td><td width="500"><input type="text" maxlength="4" size="4" name="iptimelimit" value="<%=p_iptimelimit%>"> &nbsp;másodperc</td></tr> <tr><td align="right" width="300">Szöveg szine (RGB): </td><td width="500"><input type="text" maxlength="3" size="3" name="f_r" value="<%=p_f_r%>"> &nbsp;<input type="text" maxlength="3" size="3" name="f_g" value="<%=p_f_g%>"> &nbsp;<input type="text" maxlength="3" size="3" name="f_b" value="<%=p_f_b%>"> &nbsp;</td></tr> <tr><td align="right" width="300">Háttérszín (RGB): </td><td width="500"><input type="text" maxlength="3" size="3" name="b_r" value="<%=p_b_r%>"> &nbsp;<input type="text" maxlength="3" size="3" name="b_g" value="<%=p_b_g%>"> &nbsp;<input type="text" maxlength="3" size="3" name="b_b" value="<%=p_b_b%>"> &nbsp;</td></tr>

Page 74: Diploma Aktiv Weboldal Keszites Php ASP

5. Mellékletek 74 / 91

<tr><td align="right" width="300">Transzparens háttér:</td><td width="500"> <select name="transbackground"> <option value="0" <%If p_transbackground=0 Then Response.Write "selected" %>>Nem</option> <option value="1" <%If p_transbackground=1 Then Response.Write "selected" %>>Igen</option> </select></td></tr> <tr><td align="right" width="300">Betű mérete: </td><td width="500"><input type="text" maxlength="2" size="2" name="fontsize" value="<%=p_fontsize%>"></td></tr> <tr><td align="right" width="300">Betűtípus:</td><td width="500"> <select name="fontname"> <option value="Arial" <% If p_fontname="Arial" Then Response.Write "selected" %>>Arial</option> <option value="Times New Roman" <% If p_fontname="Times New Roman" Then Response.Write "selected" %> >Times New Roman</option> <option value="Courier New" <% If p_fontname="Courier New" Then Response.Write "selected" %> >Courier New</option> <option value="Verdana" <% If p_fontname="Verdana" Then Response.Write "selected" %> >Verdana</option> </select></td></tr> </table> <input type="hidden" name="state" value="<%=p_state%>"> <input type="hidden" name="id" value="<%=p_id%>"> <br><input type="submit" value="<%=ButtonName%>"> </form> Fájl: c:\inetpub\wwwroot\stat\inc_htm\admin_newuser2.inc <h1>Sikeresen felvéve az adatbázisba.</h1> Fájl: c:\inetpub\wwwroot\stat\inc_htm\admin_newuser3.inc <h2>Hibás a jelszó vagy a felhasználó neve nem lett megadva!</h2> <a href="<%= ASPSELF %>">újra</a>

Fájl: c:\inetpub\wwwroot\stat\inc_htm\footer.inc <hr> <font color="blue" size="-1">WebStat v1.0</font> </center> </body> </html> Fájl: c:\inetpub\wwwroot\stat\inc_htm\header.inc <html> <head> <title>Statisztikai rendszer -=- <%= TitleName %></title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2"> </head> <body> <p align=center><a href="/stat/default.asp?page=admin">Admin oldal</a> | <a href="/stat/default.asp?page=user">Felhasználói oldal</a></p> <hr> <center> Fájl: c:\inetpub\wwwroot\stat\inc_htm\user_login.inc <h1>Belépés</h1> <form action="<%= ASPSELF %>" method="post"> <table align="center" width="800"> <tr><td align="right" width="300">Felhasználó neve: </td><td width="500"><input type="text" maxlength="30" size="30" name="username" value=""></td></tr> <tr><td align="right" width="300">Jelszó: </td><td width="500"><input type="password" maxlength="8" size="32" name="password" value=""></td></tr> </table> <input type="hidden" name="state" value=2><br> <input type="submit" value="Belép"> </form>

Page 75: Diploma Aktiv Weboldal Keszites Php ASP

5. Mellékletek 75 / 91

5.6. PHP-ben megvalósított statisztikai rendszer forráskódja

Fájl: /var/www/stat/admin_create.php <?php Include("inc_php/declares.inc"); $TitleName="Adatbázis létrehozás"; Include("inc_htm/header.inc"); Include("inc_php/admin_create.inc"); Include("inc_htm/footer.inc"); ?> Fájl: /var/www/stat/admin_delete.php <?php Include("inc_php/declares.inc"); Include("inc_php/admin_delete.inc"); Include("inc_htm/footer.inc"); ?> Fájl: /var/www/stat/admin_modify.php <?php Include("inc_php/declares.inc"); Include("inc_php/admin_modify.inc"); Include("inc_htm/footer.inc"); ?> Fájl: /var/www/stat/admin_newuser.php <?php Include("inc_php/declares.inc"); Include("inc_php/declares_form.inc"); $TitleName="Új felhasználó hozzáadása"; Include("inc_htm/header.inc"); Include("inc_php/admin_newuser.inc"); Include("inc_htm/footer.inc"); ?> Fájl: /var/www/stat/counter.php <?php Include("inc_php/declares.inc"); Include("inc_php/declares_form.inc"); Include("inc_php/dbfunc.inc"); Header("Content-type: image/png"); $error=false; if($p_id=="") $error=true; $SQL_query = "SELECT b_r, b_g, b_b, f_r, f_g, f_b, transbackground, fontsize, fontname, iptimelimit, url FROM ".$t_userdb." WHERE id='".$p_id."';"; $SQL_result = mysql_query($SQL_query, $dbConn); $FontColor=""; $BackGroundColor=""; $message=""; $image =""; $fontfile="/var/www/stat/fonts/arial.ttf"; $p_url=""; $counter=0; if( ($rs=mysql_fetch_array($SQL_result)) ){ $p_b_r=$rs["b_r"]; $p_b_g=$rs["b_g"]; $p_b_b=$rs["b_b"];

Page 76: Diploma Aktiv Weboldal Keszites Php ASP

5. Mellékletek 76 / 91

$p_f_r=$rs["f_r"]; $p_f_g=$rs["f_g"]; $p_f_b=$rs["f_b"]; $p_fontsize=$rs["fontsize"]; $p_fontname=$rs["fontname"]; $p_transbackground=$rs["transbackground"]; $p_url=$rs["url"]; if($p_fontname=="Courier New") $fontfile="/var/www/stat/fonts/cour.ttf"; if($p_fontname=="Times New Roman") $fontfile="/var/www/stat/fonts/times.ttf"; if($p_fontname=="Verdana") $fontfile="/var/www/stat/fonts/verdana.ttf"; $SQL_query = "SELECT COUNT(*) AS c FROM statuser".$p_id.";"; $SQL_result = mysql_query($SQL_query, $dbConn); $rs=mysql_fetch_array($SQL_result); $counter=$rs["c"]; $SQL_query = "SELECT iptimelimit FROM ".$t_userdb." WHERE id='".$p_id."';"; $SQL_result = mysql_query($SQL_query, $dbConn); $rs=mysql_fetch_array($SQL_result); $iptimelimit=$rs["iptimelimit"]; $SQL_query = "SELECT logdate FROM statuser" .$p_id." ORDER BY logdate DESC LIMIT 0, 1;"; $SQL_result = mysql_query($SQL_query, $dbConn); $rs=mysql_fetch_array($SQL_result); $OldDate = strtotime($rs["logdate"]); $NewDate = strtotime("-$iptimelimit second"); if ($p_url<>"" && $HTTP_REFERER <> $p_url ) $error=true; if(!$error && $NewDate > $OldDate) { dbInsert("statuser".$p_id, "'".date("Y.m.d H:i:s")."', '".$REMOTE_ADDR."', '".gethostbyaddr($REMOTE_ADDR)."', '".$HTTP_USER_AGENT."'"); $counter++; } } else { $error=true; } if(!$error) { $message=" ".$counter." "; $TTFBBox = ImageTTFBBox($p_fontsize, 0, $fontfile, $message); $image = ImageCreateTrueColor($TTFBBox[2]-$TTFBBox[6]+20, $TTFBBox[3]-$TTFBBox[7]+20); if ($p_transbackground==1) { $FontColor = ImageColorAllocate($image, $p_f_r, $p_f_g, $p_f_b); $BackgroundColor = ImageColorAllocate($image, $p_b_r, $p_b_g, $p_b_b); ImageColorTransparent($image, $BackgroundColor); ImageFilledRectangle($image, 0, 0, ImageSX($image)-1, ImageSY($image)-1, $BackgroundColor); } else { $FontColor = ImageColorAllocate($image, $p_f_r, $p_f_g, $p_f_b); $BackgroundColor = ImageColorAllocate($image, $p_b_r, $p_b_g, $p_b_b); ImageFilledRectangle($image, 0, 0, ImageSX($image)-1, ImageSY($image)-1, $BackgroundColor); } } else { if ($p_url<>"" && $HTTP_REFERER<>$p_url) $message="Hibás hivatkozás"; else $message="Nincs ilyen számláló"; $p_fontsize=14; $TTFBBox = ImageTTFBBox($p_fontsize, 0, $fontfile, $message); $image = ImageCreate($TTFBBox[2]-$TTFBBox[6]+20, $TTFBBox[3]-$TTFBBox[7]+20); $FontColor = ImageColorAllocate($image, 255, 255, 255); $BackgroundColor = ImageColorAllocate($image, 0, 0, 0); ImageFilledRectangle($image, 0, 0, ImageSX($image)-1, ImageSY($image)-1, $BackgroundColor); } ImageTTFText ($image, $p_fontsize, 0, 10, 25, $FontColor, "/var/www/stat/fonts/arial.ttf", $message); ImagePng($image); ImageDestroy($image); ?>

Page 77: Diploma Aktiv Weboldal Keszites Php ASP

5. Mellékletek 77 / 91

Fájl: /var/www/stat/graph.php <?php Include("inc_php/declares.inc"); Include("inc_php/declares_form.inc"); Include("inc_php/dbfunc.inc"); //Hónapok beállítása $Month[0] = "Jan"; $Month[1] = "Feb"; $Month[2] = "Már"; $Month[3] = "Ápr"; $Month[4] = "Máj"; $Month[5] = "Jún"; $Month[6] = "Júl"; $Month[7] = "Aug"; $Month[8] = "Szep"; $Month[9] = "Okt"; $Month[10] = "Nov"; $Month[11] = "Dec"; $FMonth[0] = "január"; $FMonth[1] = "február"; $FMonth[2] = "március"; $FMonth[3] = "április"; $FMonth[4] = "május"; $FMonth[5] = "június"; $FMonth[6] = "július"; $FMonth[7] = "augusztus"; $FMonth[8] = "szeptember"; $FMonth[9] = "október"; $FMonth[10] = "november"; $FMonth[11] = "december"; //Paraméterek beállítása $p_now = getdate(); $p_oldgraph = $HTTP_GET_VARS["oldgraph"]; if ($HTTP_GET_VARS["graph"]=="") $p_graph="year"; else $p_graph=$HTTP_GET_VARS["graph"]; if ($HTTP_GET_VARS["year"]=="") $p_year=$p_now['year']; else $p_year=$HTTP_GET_VARS["year"]; if ($p_graph=="year") { if ($HTTP_GET_VARS["oldyear"]=="") $p_oldyear=$p_year-1; else $p_oldyear = $HTTP_GET_VARS["oldyear"]; } if ($HTTP_GET_VARS["month"]=="") $p_month=$p_now['mon']; else $p_month=$HTTP_GET_VARS["month"]; if ($p_graph=="month") { $p_now = getdate(mktime(0, 0, 0, $p_month, 1, $p_year)); $olddate=getdate(mktime(0, 0, 0, $p_month-1, 1, $p_year)); if ($HTTP_GET_VARS["oldmonth"]=="") $p_oldmonth=$olddate['mon']; else $p_oldmonth=$HTTP_GET_VARS["oldmonth"]; if ($HTTP_GET_VARS["oldyear"]=="") $p_oldyear=$olddate['year']; else $p_oldyear=$HTTP_GET_VARS["oldyear"]; } if ($HTTP_GET_VARS["day"]=="") $p_day=$p_now['mday']; else $p_day=$HTTP_GET_VARS["day"]; if ($p_graph=="day") { $p_now = getdate(mktime(0, 0, 0, $p_month, $p_day, $p_year)); $olddate=getdate(mktime(0, 0, 0, $p_month, $p_day-1, $p_year)); if ($HTTP_GET_VARS["oldday"]=="") $p_oldday=$olddate['mday']; else $p_oldday=$HTTP_GET_VARS["oldday"]; if ($HTTP_GET_VARS["oldmonth"]=="") $p_oldmonth=$olddate['mon']; else $p_oldmonth=$HTTP_GET_VARS["oldmonth"]; if ($HTTP_GET_VARS["oldyear"]=="") $p_oldyear=$olddate['year']; else $p_oldyear=$HTTP_GET_VARS["oldyear"]; } //Kép létrehozása $MaxX = 700; $MaxY = 220; $FrameX = 50; $FrameY = 50; $PicFrameX = 70; $PicFrameY = 90; $MaxRow = 5;

Page 78: Diploma Aktiv Weboldal Keszites Php ASP

5. Mellékletek 78 / 91

Header("Content-type: image/png"); $image = ImageCreateTrueColor($MaxX + $PicFrameX, $MaxY + $PicFrameY); //Megjelenítéshez szükséges változók beállítása $BackColor = ImageColorAllocate($image, 245, 245, 245); $FrameColor = ImageColorAllocate($image, 180, 180, 180); $GraphColor = ImageColorAllocate($image, 235, 235, 235); $ColColor = ImageColorAllocate($image, 255, 250, 220); $ColFrameColor = ImageColorAllocate($image, 255, 180, 0); $LineColor = ImageColorAllocate($image, 255, 20, 20); $FontColor = ImageColorAllocate($image, 10, 120, 10); $TitleColor = ImageColorAllocate($image, 15, 15, 255); if ($p_graph=="year") $SQL_query = "SELECT count(*) AS data, YEAR(logdate) AS year, MONTH(logdate) AS month FROM statuser$p_id WHERE YEAR(logdate) = '$p_year' OR YEAR(logdate) = '$p_oldyear' GROUP BY YEAR(logdate), MONTH(logdate) ORDER BY logdate;"; if ($p_graph=="month") $SQL_query = "SELECT count(*) AS data, YEAR(logdate) AS year, MONTH(logdate) AS month FROM statuser$p_id WHERE (YEAR(logdate) = '$p_year' AND MONTH(logdate) = '$p_month') OR (YEAR(logdate) ='$p_oldyear' AND MONTH(logdate) = '$p_oldmonth') GROUP BY YEAR(logdate), MONTH(logdate), DAYOFMONTH(logdate) ORDER BY logdate;"; if ($p_graph=="day") $SQL_query = "SELECT count(*) AS data, YEAR(logdate) AS year, MONTH(logdate) AS month, DAYOFMONTH(logdate) AS day FROM statuser$p_id WHERE (YEAR(logdate) = '$p_year' AND MONTH(logdate) = '$p_month' AND DAYOFMONTH(logdate) = '$p_day') OR (YEAR(logdate) = '$p_oldyear' AND MONTH(logdate) = '$p_oldmonth' AND DAYOFMONTH(logdate) = '$p_oldday') GROUP BY YEAR(logdate), MONTH(logdate), DaYOFMONTH(logdate), HOUR(logdate) ORDER BY logdate;"; $SQL_result = mysql_query($SQL_query, $dbConn); //Képméret beállítása $fontsize=10; $fontfile="/var/www/stat/fonts/arialbd.ttf"; // Háttér és belső grafikon keret rajzolása ImageFilledRectangle($image, 0, 0, ImageSX($image)-1, ImageSY($image)-1, $BackColor); ImageFilledRectangle($image, $FrameX, $FrameY, $MaxX+$FrameX, $MaxY+$FrameY, $GraphColor); ImageRectangle($image, $FrameX, $FrameY, $MaxX+$FrameX, $MaxY+$FrameY, $FrameColor); //Viszintes segédvonalak rajzolása $Y = $MaxY / $MaxRow; $Pos = 1; while ($Pos < $MaxRow) { ImageLine($image, $FrameX, $FrameY + $Pos*$Y, $FrameX+$MaxX, $FrameY + $Pos*$Y, $FrameColor); $Pos++; } // Maximum megállapítása $DataMax = 0; $ColMax = 0; while( ($rs=mysql_fetch_array($SQL_result)) ) { if ($DataMax < $rs["data"]) $DataMax = $rs["data"]; $ColMax++; } // Maximális érték beállítása $DataMax = round($DataMax*1.1); if ($DataMax % $MaxRow == 0) { $DataMax += $MaxRow; } else { $DataMax += $MaxRow-($DataMax%$MaxRow); } // Viszintes érékek felrajzolása $Pos = $MaxRow; while($Pos >= 0) { $DataTemp = $DataMax * $Pos / $MaxRow; $ttfbbox=ImageTTFBBox($fontsize, 0, $fontfile, $DataTemp); $width=$ttfbbox[4]-$ttfbbox[6]+1; $height=$ttfbbox[3]-$ttfbbox[5]+1; ImageTTFText($image, $fontsize, 0, $FrameX-$width-6, $FrameY+$height/2 + $MaxY-$MaxY*$Pos/$MaxRow, $FontColor, $fontfile, $DataTemp); $Pos--; }

Page 79: Diploma Aktiv Weboldal Keszites Php ASP

5. Mellékletek 79 / 91

if ($p_graph=="year") $Title="$p_year. év látogatottsági statisztikája havi bontásban"; if ($p_graph=="month") $Title="$p_year. év ".$FMonth[$p_month-1]." hó látogatottsági statisztikája napi bontásban"; if ($p_graph=="day") $Title="$p_year. év ".$FMonth[$p_month-1]." hó $p_day. nap látogatottsági statisztikája óránkénti bontásban"; $ttfbbox=ImageTTFBBox($fontsize, 0, $fontfile, $Title); $height=$ttfbbox[3]-$ttfbbox[5]; ImageTTFText($image, $fontsize, 0, $FrameX+25, $FrameY-5, $TitleColor, $fontfile, $Title); ImageFilledRectangle($image, $FrameX, $FrameY-$height-3, $FrameX+20, $FrameY-3, $ColColor); ImageRectangle($image, $FrameX, $FrameY-$height-5, $FrameX+20, $FrameY-5, $ColFrameColor); if ($p_oldgraph=="" || $p_oldgraph=="yes") { if ($p_graph=="year") $Title = "$p_oldyear. év látogatottsági statisztikája havi bontásban"; if ($p_graph=="month") $Title = "$p_oldyear. év ".$FMonth[$p_oldmonth-1]." hó látogatottsági statisztikája napi bontásban"; if ($p_graph=="day") $Title = "$p_oldyear. év ".$FMonth[$p_oldmonth-1]." hó $p_oldday. nap látogatottsági statisztikája óránkénti bontásban"; ImageTTFText($image, $fontsize, 0, $FrameX+25, $FrameY-$height-10, $TitleColor, $fontfile, $Title); ImageFilledRectangle($image, $FrameX, $FrameY-$height-17, $FrameX+20, $FrameY-$height-16, $LineColor); } // Oszlopok kirajzolása if ($p_graph=="year") { $ColMax = 13; $ColX = 10; } if ($p_graph=="month") { $ColMax = 32; $ColX = 5; } if ($p_graph=="day") { $ColMax = 25; $ColX = 7; } $SpaceX = $MaxX / $ColMax - $ColX; if ($p_graph=="year") { $Pos = 0; while($Pos < 12) { $ttfbbox=ImageTTFBBox($fontsize, 0, $fontfile, $Month[$Pos]); $width=$ttfbbox[4]-$ttfbbox[6]+1; ImageTTFText($image, $fontsize, 0, $FrameX+($SpaceX+$ColX)/2+$Pos*($SpaceX+$ColX)+($SpaceX-$width)/2-1, $FrameY+$MaxY+10+$fontsize, $FontColor, $fontfile, $Month[$Pos]); $Pos++; } } if ($p_graph=="month") { $Pos = 0; while($Pos < 31) { $ttfbbox=ImageTTFBBox($fontsize, 0, $fontfile, $Pos+1); $width=$ttfbbox[4]-$ttfbbox[6]+1; ImageTTFText($image, $fontsize, 0, $FrameX+($SpaceX+$ColX)/2+$Pos*($SpaceX+$ColX)+($SpaceX-$width)/2-1, $FrameY+$MaxY+10+$fontsize, $FontColor, $fontfile, $Pos+1); $Pos++; } } if ($p_graph=="day") { $Pos = 0; while($Pos < 24 ) { $ttfbbox=ImageTTFBBox($fontsize, 0, $fontfile, $Pos); $width=$ttfbbox[4]-$ttfbbox[6]+1; ImageTTFText($image, $fontsize, 0, $FrameX+($SpaceX+$ColX)/2+$Pos*($SpaceX+$ColX)+($SpaceX-$width)/2-1, $FrameY+$MaxY+10+$fontsize, $FontColor, $fontfile, $Pos); $Pos++; } } // Aktuális grafikon adatainak lekérdezése és kirajzolása if ($p_graph=="year") $SQL_query = "SELECT count(*) AS data, YEAR(logdate) AS year, MONTH(logdate) AS month FROM statuser$p_id WHERE YEAR(logdate) = '$p_year' GROUP BY YEAR(logdate), MONTH(logdate) ORDER BY logdate;"; if ($p_graph=="month") $SQL_query = "SELECT count(*) AS data, YEAR(logdate) AS year, MONTH(logdate) AS month, DAYOFMONTH(logdate) AS day FROM statuser$p_id WHERE YEAR(logdate) = '$p_year' AND MONTH(logdate) = '$p_month' GROUP BY YEAR(logdate), MONTH(logdate), DAYOFMONTH(logdate) ORDER BY logdate;"; if ($p_graph=="day") $SQL_query = "SELECT count(*) AS data, YEAR(logdate) AS year, MONTH(logdate) AS month, DAYOFMONTH(logdate) AS day, HOUR(logdate) AS hour FROM statuser$p_id WHERE YEAR(logdate) = '$p_year' AND MONTH(logdate) = '$p_month' AND DAYOFMONTH(logdate) = '$p_day' GROUP BY YEAR(logdate), MONTH(logdate), DAYOFMONTH(logdate), HOUR(logdate) ORDER BY logdate;";

Page 80: Diploma Aktiv Weboldal Keszites Php ASP

5. Mellékletek 80 / 91

$SQL_result = mysql_query($SQL_query, $dbConn); $Pos = 0; $rs=mysql_fetch_array($SQL_result); while ( $rs) { if ($p_graph=="year" && $Pos+1==$rs["month"]) $Data=$rs["data"]; else $Data=0; if ($p_graph=="month") { if ($Pos+1==$rs["day"]) $Data=$rs["data"]; else $Data=0; } if ($p_graph=="day") { if ($Pos==$rs["hour"]) $Data=$rs["data"]; else $Data=0; } $SpaceY=$MaxY-($MaxY*$Data/$DataMax)-1; if($Data>0) { ImageFilledRectangle ($image, $FrameX+($SpaceX+$ColX)/2+$Pos*($SpaceX+$ColX), $FrameY+$SpaceY, $FrameX+($SpaceX+$ColX)/2+$SpaceX+$Pos*($SpaceX+$ColX), $FrameY+$MaxY, $ColColor); ImageRectangle ($image, $FrameX+($SpaceX+$ColX)/2+$Pos*($SpaceX+$ColX), $FrameY+$SpaceY, $FrameX+($SpaceX+$ColX)/2+$SpaceX+$Pos*($SpaceX+$ColX), $FrameY+$MaxY, $ColFrameColor); } if ($p_graph=="year" && $Pos+1==$rs["month"]) $rs=mysql_fetch_array($SQL_result); if ($p_graph=="month") { if ($Pos+1==$rs["day"]) $rs=mysql_fetch_array($SQL_result); } if ($p_graph=="day") { if ($Pos==$rs["hour"]) $rs=mysql_fetch_array($SQL_result); } $Pos++; } // Előző évi grafikon adatainak lekérdezése és kirajzolása if ($p_graph=="year") $SQL_query = "SELECT count(*) AS data, YEAR(logdate) AS year, MONTH(logdate) AS month FROM statuser$p_id WHERE YEAR(logdate) = '$p_oldyear' GROUP BY YEAR(logdate), MONTH(logdate) ORDER BY logdate;"; if ($p_graph=="month") $SQL_query = "SELECT count(*) AS data, YEAR(logdate) AS year, MONTH(logdate) AS month, DAYOFMONTH(logdate) AS day FROM statuser$p_id WHERE YEAR(logdate) = '$p_oldyear' AND MONTH(logdate) = '$p_oldmonth' GROUP BY YEAR(logdate), MONTH(logdate), DAYOFMONTH(logdate) ORDER BY logdate;"; if ($p_graph=="day") $SQL_query = "SELECT count(*) AS data, YEAR(logdate) AS year, MONTH(logdate) AS month, DAYOFMONTH(logdate) AS day, HOUR(logdate) AS hour FROM statuser$p_id WHERE YEAR(logdate) = '$p_oldyear' AND MONTH(logdate) = '$p_oldmonth' AND DAYOFMONTH(logdate) = '$p_oldday' GROUP BY YEAR(logdate), MONTH(logdate), DAYOFMONTH(logdate), HOUR(logdate) ORDER BY logdate;"; $SQL_result = mysql_query($SQL_query, $dbConn); if ($p_oldgraph=="" || $p_oldgraph=="yes") { $Pos = 0; $rs=mysql_fetch_array($SQL_result); while ( $rs) { if($p_graph=="year" && $Pos+1==$rs["month"]) $Data=$rs["data"]; else $Data=0; if($p_graph=="month") { if($Pos+1==$rs["day"]) $Data=$rs["data"]; else $Data=0; } if($p_graph=="day") { if ($Pos==$rs["hour"]) $Data=$rs["data"]; else $Data=0; } $SpaceY=$MaxY-($MaxY*$Data/$DataMax)-1; if ($Pos==0) { $from_x=$FrameX+($SpaceX+ColX)/2+SpaceX/2; $from_y=$FrameY+$SpaceY; } else { $to_x = $FrameX+($SpaceX+$ColX)/2+$Pos*($SpaceX+$ColX)+$SpaceX/2; $to_y = $FrameY + $SpaceY; ImageLine($image, $from_x, $from_y, $to_x, $to_y, $LineColor); $from_x = $to_x; $from_y = $to_y; } if ($p_graph=="year" && $Pos+1==$rs["month"]) $rs=mysql_fetch_array($SQL_result); if ($p_graph=="month") { if ($Pos+1==$rs["day"]) $rs=mysql_fetch_array($SQL_result); }

Page 81: Diploma Aktiv Weboldal Keszites Php ASP

5. Mellékletek 81 / 91

if ($p_graph=="day") { if ($Pos==$rs["hour"]) $rs=mysql_fetch_array($SQL_result); } $Pos++; } } ImagePng($image); ImageDestroy($image); ?> Fájl: /var/www/stat/index.php <?php Include("inc_php/declares.inc"); $TitleName="Főmenü"; Include("inc_htm/header.inc"); Include("inc_php/index.inc"); Include("inc_htm/footer.inc"); ?> Fájl: /var/www/stat/user_login.php <?php Include("inc_php/declares.inc"); Include("inc_php/declares_login.inc"); $TitleName="Főmenü"; Include("inc_php/user_login.inc"); Include("inc_htm/footer.inc"); ?> Fájl: /var/www/stat/user_logout.php <?php $TitleName="Kilépés"; Include("inc_php/user_logout.inc"); Include("inc_htm/footer.inc"); ?> Fájl: /var/www/stat/user_menu.php <?php $TitleName="Felhasználói oldal"; Include("inc_htm/header.inc"); Include("inc_php/user_menu.inc"); Include("inc_htm/footer.inc"); ?> Fájl: /var/www/stat/user_stat.php <?php Include("inc_php/declares.inc"); $TitleName="Látogatottsági oldal"; Include("inc_htm/header.inc"); Include("inc_php/user_stat.inc"); Include("inc_htm/footer.inc"); ?> Fájl: /var/www/stat/inc_php/add.inc <?php Include_once("dbfunc.inc"); $SQL_query = "SELECT COUNT(id) c FROM ".$t_userdb.";"; $SQL_result = mysql_query($SQL_query, $dbConn); $rs = mysql_fetch_array($SQL_result);

Page 82: Diploma Aktiv Weboldal Keszites Php ASP

5. Mellékletek 82 / 91

If ($rs["c"] > 0) { $SQL_query = "SELECT MAX(id) max_id FROM ".$t_userdb.";"; $SQL_result = mysql_query($SQL_query, $dbConn); $rs = mysql_fetch_array($SQL_result); $numID = $rs["max_id"] + 1; } else { $numID = 100000; } dbInsert($t_userdb, "'".$numID."', '".$p_username."', '".$p_password1."', '".$p_url."', '".$p_iptimelimit."', '".$p_b_r."', '".$p_b_g."', '".$p_b_b."', '".$p_f_r."', '".$p_f_g."', '".$p_f_b."', '".$p_transbackground."', '".$p_fontsize."', '".$p_fontname."'"); dbCreate("statuser".$numID, "logdate datetime, ipaddress char(15), hostname varchar(200), browser varchar(200)"); $SQL_query = "CREATE INDEX logdate_ndx ON statuser".$numID." (logdate);"; mysql_query($SQL_query, $dbConn); ?> Fájl: /var/www/stat/inc_php/admin_create.inc <?php Include("dbfunc.inc"); dbCreate($t_userdb, "id int primary key, username varchar(30) not null, password varchar(8) not null, url varchar(200) not null, iptimelimit int not null default 0, b_r int default 0, b_g int default 0, b_b int default 0, f_r int default 255, f_g int default 255, f_b int default 255, transbackground int default 0, fontsize int default 12, fontname varchar(50) default 'Arial'"); echo "Adatbázis sikeresen létrehozva."; ?> Fájl: /var/www/stat/inc_php/admin_delete.inc <?php Include("dbfunc.inc"); Include("delete.inc"); If ($p_do=="" || $p_do == "list") { $TitleName = "Felhasználó listázása (törlés)"; Include("/var/www/stat/inc_htm/header.inc"); dbList(); } elseIf ($p_do == "delete" && $p_id<>"") { dbDelete($p_id); $TitleName = "Felhasználó törlése" ; Include("/var/www/stat/inc_htm/header.inc"); ?> <h1>Törölve az adatbázisból: <?= $p_id ?>!</h1> <a href="<?= $PHP_SELF ?>?do=list">Listázás</a> <?php } else { $TitleName = "HIBA" ; Include("/var/www/stat/inc_htm/header.inc"); ?> <h1>Hiba a törlés közben!</h1> <?php } ?> Fájl: /var/www/stat/inc_php/admin_modify.inc <?php Include("dbfunc.inc");

Page 83: Diploma Aktiv Weboldal Keszites Php ASP

5. Mellékletek 83 / 91

Include("modify.inc"); Include("declares_form.inc"); If (($p_do=="" || $p_do == "list") && $p_state=="") { $TitleName = "Felhasználó listázása (módosítás)"; Include("/var/www/stat/inc_htm/header.inc"); dbList(); } elseif ($p_do == "detail" && $p_id<>"") { dbRead($p_id); $TitleName = "Felhasználó módosítása"; $HeadTitle = "Felhasználó adatai"; $ButtonName = "Módosít"; $p_state=3; Include("/var/www/stat/inc_htm/header.inc"); Include("/var/www/stat/inc_htm/admin_newuser1.inc"); } elseIf ($p_state<>"" && $p_state == 3 && $p_id<>"" && $p_password1==$p_password2) { $TitleName = "Felhasználó adat módosítása"; Include("/var/www/stat/inc_htm/header.inc"); dbUpdate($p_id); ?> <h1>Sikeres módosítás!</h1> <a href="<?= $PHP_SELF ?>?do=list">Listázás</a> <?php } else { $TitleName = "HIBA"; Include("/var/www/stat/inc_htm/header.inc"); ?> <h1>Hiba a módosítás megadásánál! Rossz jelszó?</h1> <?php } ?> Fájl: /var/www/stat/inc_php/admin_newuser.inc <? $HeadTitle = "Új felhasználó adatai"; $ButtonName = "Felvesz"; Include("dbfunc.inc"); If (!isset($p_state) || $p_state<>2) { $p_id=-1; $p_state=2; $p_username="Login_name"; $p_password1=""; $p_url="http://localhost"; $p_iptimelimit=3600; $p_f_r=255; $p_f_g=255; $p_f_b=255; $p_b_r=0; $p_b_g=0; $p_b_b=0; $p_transbackground=0; $p_fontsize=11; $p_fontname="Times New Roman"; Include("/var/www/stat/inc_htm/admin_newuser1.inc"); } elseif ($p_state == 2 && $p_password1==$p_password2 && $p_username<>"" && $p_password1<>"") { Include("add.inc"); Include("/var/www/stat/inc_htm/admin_newuser2.inc"); } else { Include("/var/www/stat/inc_htm/admin_newuser3.inc"); } ?>

Page 84: Diploma Aktiv Weboldal Keszites Php ASP

5. Mellékletek 84 / 91

Fájl: /var/www/stat/inc_php/dbfunc.inc <?php $dbConn = mysql_pconnect("localhost", "phpuser", "php123"); mysql_select_db("phpdb", $dbConn); Function dbCreate($pName, $pType) { global $dbConn; $SQL_query = "CREATE TABLE ".$pName."(".$pType.");"; mysql_query($SQL_query, $dbConn); } Function dbInsert($pName, $pLine) { global $dbConn; $SQL_query = "INSERT INTO ".$pName." VALUES(".$pLine.");"; mysql_query($SQL_query, $dbConn); } ?> Fájl: /var/www/stat/inc_php/declares.inc <?php global $page, $state, $id, $do, $PHPSELF; $p_page = $page; $p_state = $state; $p_id = $id; $p_do = $do; $t_userdb = "statusers"; ?> Fájl: /var/www/stat/inc_php/declares_form.inc <?php global $username, $password1, $password2, $url, $iptimelimit, $f_b, $f_r, $f_g, $b_b, $b_r, $b_g, $transbackground, $fontsize, $fontname; If ( $p_state<>"" || $p_id<>"" ) { $p_username = $username; $p_password1 = $password1; $p_password2 = $password2; $p_url = $url; $p_iptimelimit = $iptimelimit; $p_f_r = $f_r; $p_f_g = $f_g; $p_f_b = $f_b; $p_b_r = $b_r; $p_b_g = $b_g; $p_b_b = $b_b; $p_transbackground = $transbackground; $p_fontsize = $fontsize; $p_fontname = $fontname; } ?> Fájl: /var/www/stat/inc_php/declares_login.inc <?php global $username, $password;

Page 85: Diploma Aktiv Weboldal Keszites Php ASP

5. Mellékletek 85 / 91

$p_username = $username; $p_password = $password; ?> Fájl: /var/www/stat/inc_php/delete.inc <?php function dbList() { global $PHP_SELF, $dbConn, $t_userdb; $SQL_query = "SELECT id, username FROM ".$t_userdb.";"; $SQL_result = mysql_query($SQL_query, $dbConn); echo "<h1>Törlés</h1><center><table align=center><tr><td><b>Sorszám</b></td><td><b>Név</b></td></tr>"; $cnt = 1; while ( ($rs=mysql_fetch_array($SQL_result)) ) { echo "<tr><td align=right> ".$cnt.". </td><td><a href=".$PHP_SELF."?do=delete&id=".$rs["id"].">".$rs["username"]."</a></td></tr>"; $cnt++; } echo "</table></center>"; } function dbDelete($r_id) { global $dbConn, $t_userdb; $SQL_query = "DELETE FROM ".$t_userdb." WHERE id='".$r_id."';"; mysql_query($SQL_query, $dbConn); $SQL_query = "DROP TABLE statuser".$r_id.";"; mysql_query($SQL_query, $dbConn); } ?> Fájl: /var/www/stat/inc_php/index.inc <? If ($p_page == "" || $p_page == "admin") { ?> <center> <h1>Adminisztrációs menü</h1> <table border=0 cellpadding=3 align=center valign=center> <tr><td align="center"><b>Leírás</b></td><td align=center><b>Link</b></td></tr> <tr><td align="right" >Üres adatbázis létrehozása:</td><td><a href="admin_create.php">inicializálás!</a></td></tr> <tr><td align="right">Új felhasználó hozzáadása:</td><td><a href="admin_newuser.php">regisztráció!</a></td></tr> <tr><td align="right">Felhasználó adatainak módosítása:</td><td><a href="admin_modify.php?do=list">változtatás!</a></td></tr> <tr><td align="right">Felhasználó törlése:</td><td><a href="admin_delete.php">törlés!</a> </table> </center> <? } Else { ?> <center> <h1>Felhasználói menü</h1> <table border=0 cellpadding=3 align=center valign=center> <tr><td align="center"><b>Leírás</b></td><td align=center><b>Link</b></td></tr> <tr><td align="right">Felhasználó beléptetése:</td><td><a href="user_login.php">belépés!</a> <tr><td align="right">Felhasználó menü:</td><td><a href="user_menu.php">menü megjelenítése!</a> <tr><td align="right">Felhasználó kiléptetése:</td><td><a href="user_logout.php">kilépés!</a> </table> </center> <? } ?> Fájl: /var/www/stat/inc_php/modify.inc <?php function dbList() { global $PHP_SELF, $dbConn, $t_userdb;

Page 86: Diploma Aktiv Weboldal Keszites Php ASP

5. Mellékletek 86 / 91

$SQL_query = "SELECT id, username FROM ".$t_userdb.";"; $SQL_result = mysql_query($SQL_query, $dbConn); echo "<h1>Módosítás</h1><center><table align=center><tr><td><b>Sorszám</b></td><td><b>Név</b></td></tr>"; $cnt = 1; while( ($rs = mysql_fetch_array($SQL_result, $dbConn)) ) { echo "<tr><td align=right> ".$cnt.". </td><td><a href=".$PHP_SELF."?do=detail&id=".$rs["id"].">".$rs["username"]."</a></td></tr>"; $cnt++; } echo "</table></center>"; } function dbRead($r_id) { global $dbConn, $t_userdb, $p_username, $p_password1, $p_password2, $p_iptimelimit, $p_url, $p_f_r, $p_f_b, $p_f_g, $p_b_r, $p_b_b, $p_b_g, $p_transbackground, $p_fontsize, $p_fontname; $SQL_query = "SELECT username, password, iptimelimit, url, f_r, f_b, f_g, b_r, b_g, b_b, transbackground, fontsize, fontname FROM ".$t_userdb." WHERE id='".$r_id."';"; $SQL_result = mysql_query($SQL_query, $dbConn); $rs = mysql_fetch_array($SQL_result); $p_username = $rs["username"]; $p_password1 = $rs["password"]; $p_password2 = $rs["password"]; $p_iptimelimit = $rs["iptimelimit"]; $p_url = $rs["url"]; $p_f_r = $rs["f_r"]; $p_f_b = $rs["f_b"]; $p_f_g = $rs["f_g"]; $p_b_r = $rs["b_r"]; $p_b_g = $rs["b_g"]; $p_b_b = $rs["b_b"]; $p_transbackground = $rs["transbackground"]; $p_fontsize = $rs["fontsize"]; $p_fontname = $rs["fontname"]; } function dbUpdate($r_id) { global $dbConn, $t_userdb, $p_username, $p_password1, $p_password2, $p_iptimelimit, $p_url, $p_f_r, $p_f_b, $p_f_g, $p_b_r, $p_b_b, $p_b_g, $p_transbackground, $p_fontsize, $p_fontname; $SQL_query = "UPDATE ".$t_userdb." SET ". "username = '".$p_username."', ". "password = '".$p_password1."', ". "url = '".$p_url."', ". "iptimelimit = '".$p_iptimelimit."', ". "f_r = '".$p_f_r."', ". "f_b = '".$p_f_b."', ". "f_g = '".$p_f_g."', ". "b_r = '".$p_b_r."', ". "b_b = '".$p_b_b."', ". "b_g = '".$p_b_g."', ". "transbackground = '".$p_transbackground."', ". "fontsize = '".$p_fontsize."', ". "fontname = '".$p_fontname."' ". "WHERE id='".$r_id."';"; mysql_query($SQL_query, $dbConn); } ?> Fájl: /var/www/stat/inc_php/user_login.inc <?php Include("dbfunc.inc"); If ($p_state=="" || $p_state<>2) { Include("/var/www/stat/inc_htm/header.inc");

Page 87: Diploma Aktiv Weboldal Keszites Php ASP

5. Mellékletek 87 / 91

Include("/var/www/stat/inc_htm/user_login.inc"); } elseIf ($p_state==2 && $p_username<>"" && $p_password<>"") { $SQL_query = "SELECT username, password, id FROM ".$t_userdb." WHERE username='".$p_username."' AND password='".$p_password."';"; $SQL_result = mysql_query($SQL_query, $dbConn); If ($rs=mysql_fetch_array($SQL_result)) { $p_id=$rs["id"]; SetCookie("STAT_ID", $p_id, time()+3600); header("Location: /stat/user_menu.php"); exit; } else { echo "<h1>Sikertelen belépés!</h1>"; echo "Helytelen a felhasználónév / jelszó páros!<br>"; echo "<a href=".$PHP_SELF.">Újra</a>"; } } else { Include("/var/www/stat/inc_htm/header.inc"); echo "<h1>Sikeretelen belépés!</h1>"; echo "<a href=".$PHP_SELF.">Újra</a>"; } ?> Fájl: /var/www/stat/inc_php/user_logout.inc <?php SetCookie("STAT_ID", -1, time()-3600); Include("/var/www/stat/inc_htm/header.inc"); ?> <h2>Sikeres kilépés.</h2> Fájl: /var/www/stat/inc_php/user_menu.inc <?php $stat_id=$HTTP_COOKIE_VARS["STAT_ID"]; if ($stat_id == "" || $stat_id == "-1") { echo "<h1>Hiba</h1>Süti információ nem található, vagy érvénytelen adat. ($stat_id)"; } else { ?> <h1>Statisztikák</h1> <table border=1><tbody> <tr><td align=right><b>Intervallum</b></td><td align=center><b>Táblázat</b></td><td align=center><b>Grafikon</b></td></tr> <tr><td align="right" width=100>Összes:</td><td align=center width=100><a href=/stat/user_stat.php?show=table&data=all>mutat</a></td><td align=center width=100>&nbsp;</td></tr> <tr><td align="right" width=100>Éves:</td><td align=center width=100><a href=/stat/user_stat.php?show=table&data=year>mutat</a></td><td align=center width=100><a href=/stat/user_stat.php?show=graph&data=year>mutat</a></td></tr> <tr><td align="right" width=100>Havi:</td><td align=center width=100><a href=/stat/user_stat.php?show=table&data=month>mutat</a></td><td align=center width=100><a href=/stat/user_stat.php?show=graph&data=month>mutat</a></td></tr> <tr><td align="right" width=100>Heti:</td><td align=center width=100><a href=/stat/user_stat.php?show=table&data=week>mutat</a></td><td align=center width=100>&nbsp;</td></tr> <tr><td align="right" width=100>Napi:</td><td align=center width=100><a href=/stat/user_stat.php?show=table&data=day>mutat</a></td><td align=center width=100>&nbsp;</td></tr> <tr><td align="right" width=100>Óránkénti:</td><td align=center width=100><a href=/stat/user_stat.php?show=table&data=hour>mutat</a></td><td align=center width=100>&nbsp;</td></tr> </tbody></table> <?php } ?>

Page 88: Diploma Aktiv Weboldal Keszites Php ASP

5. Mellékletek 88 / 91

Fájl: /var/www/stat/inc_php/user_stat.inc <?php Include("dbfunc.inc"); $stat_id = $HTTP_COOKIE_VARS["STAT_ID"]; $d_show = $HTTP_GET_VARS["show"]; $d_data = $HTTP_GET_VARS["data"]; $year = $HTTP_GET_VARS["year"]; $month = $HTTP_GET_VARS["month"]; $day = $HTTP_GET_VARS["day"]; if ($d_data == "") $d_data = "all"; if ($d_show == "") $d_show = "table"; $cnt = 1; echo "<a href=/stat/user_menu.php>M E N Ü</a><br>"; $p_where = ""; if($d_data=="month" && $year<>"") $p_where = "WHERE YEAR(logdate) = '$year'"; if($d_data=="day" && $year<>"" && $month<> "") $p_where = "WHERE YEAR(logdate) = '$year' AND MONTH(logdate) = '$month'"; if($d_data=="hour" && $year<>"" && $month<>"" && $day<>"") $p_where = "WHERE YEAR(logdate) = '$year' AND MONTH(logdate) = '$month' AND DAYOFMONTH(logdate) = '$day'"; If ($d_show == "table") { if($d_data=="all") $SQL_query = "SELECT logdate, ipaddress, hostname, browser FROM statuser$stat_id ORDER BY logdate;"; if($d_data=="year") $SQL_query = "SELECT count(*) AS c, YEAR(logdate) AS year FROM statuser$stat_id $p_where GROUP BY YEAR(logdate) ORDER BY logdate;"; if($d_data=="month") $SQL_query = "SELECT count(*) AS c, YEAR(logdate) AS year, MONTH(logdate) AS month FROM statuser$stat_id $p_where GROUP BY YEAR(logdate), MONTH(logdate) ORDER BY logdate;"; if($d_data=="week") $SQL_query = "SELECT count(*) AS c, YEAR(logdate) AS year, WEEK(logdate, 1) AS week FROM statuser$stat_id $p_where GROUP BY YEAR(logdate), WEEK(logdate, 1) ORDER BY logdate;"; if($d_data=="day") $SQL_query = "SELECT count(*) AS c, YEAR(logdate) AS year, MONTH(logdate) AS month, DAYOFMONTH(logdate) AS day FROM statuser$stat_id $p_where GROUP BY YEAR(logdate), MONTH(logdate), DAYOFMONTH(logdate) ORDER BY logdate;"; if($d_data=="hour") $SQL_query = "SELECT count(*) AS c, YEAR(logdate) AS year, MONTH(logdate) AS month, DAYOFMONTH(logdate) AS day, HOUR(logdate) AS hour FROM statuser$stat_id $p_where GROUP BY YEAR(logdate), MONTH(logdate), DAYOFMONTH(logdate), HOUR(logdate) ORDER BY logdate;"; $SQL_result = mysql_query($SQL_query, $dbConn); if($d_data=="all") echo "<h1>Látogatás, összes adat</h1><center><table align=center border=1><tr><td><b>Sorszám</b></td><td><b>Dátum, idő</b></td><td><b>IP</b></td><td><b>Host</b></td><td><b>Böngésző</b></td></tr>"; if($d_data=="year") echo "<h1>Látogatás, éves összesítés</h1><center><table align=center border=1><tr><td><b>Sorszám</b></td><td><b>Év</b></td><td><b>Találatok</b></td><td><b>Táblázat</b></td><td><b>Grafikon</b></td></tr>"; if($d_data=="month") echo "<h1>Látogatás, havi összesítés</h1><center><table align=center border=1><tr><td><b>Sorszám</b></td><td><b>Év</b></td><td><b>Hónap</b></td><td><b>Találatok</b></td><td><b>Táblázat</b></td><td><b>Grafikon</b></td></tr>"; if($d_data=="week") echo "<h1>Látogatás, heti összesítés</h1><center><table align=center border=1><tr><td><b>Sorszám</b></td><td><b>Év</b></td><td><b>Hét</b></td><td><b>Találatok</b></td></tr>"; if($d_data=="day") echo "<h1>Látogatás, napi összesítés</h1><center><table align=center border=1><tr><td><b>Sorszám</b></td><td><b>Év</b></td><td><b>Hónap</b></td><td><b>Nap</b></td><td><b>Találatok</b></td><td><b>Táblázat</b></td><td><b>Grafikon</b></td></tr>"; if($d_data=="hour") echo "<h1>Látogatás, óránkénti összesítés</h1><center><table align=center border=1><tr><td><b>Sorszám</b></td><td><b>Év</b></td><td><b>Hónap</b></td><td><b>Nap</b></td><td><b>Óra</b></td><td><b>Találatok</b></td></tr>"; while( ($rs=mysql_fetch_array($SQL_result)) ) { if($d_data=="all") echo "<tr><td align=right> $cnt. </td><td>".$rs["logdate"]."</td><td>".$rs["ipaddress"]."</td><td>".$rs["hostname"]."</td><td>".$rs["browser"]."</td></tr>"; if($d_data=="year") echo "<tr><td align=right> $cnt. </td><td>".$rs["year"].".</td><td align=right>".$rs["c"]."</td><td><a href=$PHP_SELF?show=table&data=month&year=".$rs["year"].">havi bontás</a></td><td><a href=/stat/graph.php?id=$stat_id&year=".$rs["year"]."&graph=year>havi bontás</a></td></tr>"; if($d_data=="month") echo "<tr><td align=right> $cnt. </td><td>".$rs["year"].".</td><td align=right>".$rs["month"].".</td><td align=right>".$rs["c"]."</td><td><a href=$PHP_SELF?show=table&data=day&year=".$rs["year"]."&month=".$rs["month"].">napi bontás</a></td><td><a href=/stat/graph.php?id=$stat_id&year=".$rs["year"]."&month=".$rs["month"]."&graph=month>napi bontás</a></td></tr>"; if($d_data=="week") echo "<tr><td align=right> $cnt. </td><td>".$rs["year"].".</td><td align=right>".$rs["week"].".</td><td align=right>".$rs["c"]."</td></tr>"; if($d_data=="day") echo "<tr><td align=right> $cnt. </td><td>".$rs["year"].".</td><td align=right>".$rs["month"].".</td><td align=right>".$rs["day"].".</td><td align=right>".$rs["c"]."</td><td><a href=$PHP_SELF?show=table&data=hour&year=".$rs["year"]."&month=".$rs["month"]."&day=".$rs["day"].">óránkénti

Page 89: Diploma Aktiv Weboldal Keszites Php ASP

5. Mellékletek 89 / 91

bontás</a></td><td><a href=/stat/graph.php?id=$stat_id&year=".$rs["year"]."&month=".$rs["month"]."&day=".$rs["day"]."&graph=day>óránkénti bontás</a></td></tr>"; if($d_data=="hour") echo "<tr><td align=right> $cnt. </td><td>".$rs["year"].".</td><td align=right>".$rs["month"].".</td><td align=right>".$rs["day"].".</td><td align=right>".$rs["hour"].".</td><td align=right>".$rs["c"]."</td></tr>"; $cnt++; } echo "</table></center>\n"; echo "<br><a href=/stat/user_menu.php>M E N Ü</a>"; } else { if($d_data=="year") $SQL_query = "SELECT count(*) AS c, YEAR(logdate) AS year FROM statuser$stat_id GROUP BY YEAR(logdate) ORDER BY YEAR(logdate);"; if($d_data=="month") $SQL_query = "SELECT count(*) AS c, YEAR(logdate) AS year, MONTH(logdate) AS month FROM statuser$stat_id GROUP BY YEAR(logdate), MONTH(logdate) ORDER BY YEAR(logdate), MONTH(logdate);"; $SQL_result = mysql_query($SQL_query, $dbConn); if($d_data=="year") echo "<h1>Látogatás, éves összesítés grafikon</h1><center><table align=center border=1>"; if($d_data=="month") echo "<h1>Látogatás, havi összesítés grafikon</h1><center><table align=center border=1>"; while(($rs=mysql_fetch_array($SQL_result)) ) { if($d_data=="year") echo "<tr><td><img src=/stat/graph.php?id=$stat_id&year=".$rs["year"]."&graph=year&oldgraph=no></td></tr>"; if($d_data=="month") echo "<tr><td><img src=/stat/graph.php?id=$stat_id&year=".$rs["year"]."&month=".$rs["month"]."&graph=month&oldgraph=no></td></tr>"; } echo "</table></center>"; echo "<br><a href=/stat/user_menu.php>M E N Ü</a>"; } ?> Fájl: /var/www/stat/inc_htm/admin_newuser1.inc <? global $PHPSELF; ?> <h1><?= $HeadTitle ?></h1> <form action="<?= $PHP_SELF ?>" method="post"> <table align="center" width="800"> <tr><td align="right" width="300">Felhasználó neve: </td><td width="500"><input type="text" maxlength="30" size="30" name="username" value="<?= $p_username ?>"></td></tr> <tr><td align="right" width="300">Jelszó: </td><td width="500"><input type="password" maxlength="8" size="32" name="password1" value="<?= $p_password1 ?>"></td></tr> <tr><td align="right" width="300">Jelszó mégegyszer:</td><td width="500"><input type="password" maxlength="8" size="32" name="password2" value="<?= $p_password2 ?>"></td></tr> <tr><td align="right" width="300">URL: </td><td width="500"><input type="text" maxlength="200" size="30" name="url" value="<?= $p_url ?>"></td></tr> <tr><td align="right" width="300">IP időkorlátozás: </td><td width="500"><input type="text" maxlength="4" size="4" name="iptimelimit" value="<?= $p_iptimelimit ?>"> &nbsp;másodperc</td></tr> <tr><td align="right" width="300">Szöveg szine (RGB): </td><td width="500"><input type="text" maxlength="3" size="3" name="f_r" value="<?= $p_f_r ?>"> &nbsp;<input type="text" maxlength="3" size="3" name="f_g" value="<?= $p_f_g ?>"> &nbsp;<input type="text" maxlength="3" size="3" name="f_b" value="<?= $p_f_b ?>"> &nbsp;</td></tr> <tr><td align="right" width="300">Háttérszín (RGB): </td><td width="500"><input type="text" maxlength="3" size="3" name="b_r" value="<?= $p_b_r ?>"> &nbsp;<input type="text" maxlength="3" size="3" name="b_g" value="<?= $p_b_g ?>"> &nbsp;<input type="text" maxlength="3" size="3" name="b_b" value="<?= $p_b_b ?>"> &nbsp;</td></tr> <tr><td align="right" width="300">Transzparens háttér:</td><td width="500"> <select name="transbackground"> <option value="0" <?If ($p_transbackground==0) echo "selected" ?>>Nem</option> <option value="1" <?If ($p_transbackground==1) echo "selected" ?>>Igen</option> </select></td></tr> <tr><td align="right" width="300">Betű mérete: </td><td width="500"><input type="text" maxlength="2" size="2" name="fontsize" value="<?= $p_fontsize ?>"></td></tr> <tr><td align="right" width="300">Betűtípus:</td><td width="500"> <select name="fontname"> <option value="Arial" <? If ($p_fontname=="Arial") echo "selected" ?>>Arial</option> <option value="Times New Roman" <? If ($p_fontname=="Times New Roman") echo "selected" ?> >Times New Roman</option> <option value="Courier New" <? If ($p_fontname=="Courier New") echo "selected" ?> >Courier New</option> <option value="Verdana" <? If ($p_fontname=="Verdana") echo "selected" ?> >Verdana</option> </select></td></tr> </table>

Page 90: Diploma Aktiv Weboldal Keszites Php ASP

5. Mellékletek 90 / 91

<input type="hidden" name="state" value="<?= $p_state ?>"> <input type="hidden" name="id" value="<?= $p_id ?>"> <br><input type="submit" value="<?= $ButtonName ?>"> </form> Fájl: /var/www/stat/inc_htm/admin_newuser2.inc <h1>Sikeresen felvéve az adatbázisba.</h1> Fájl: /var/www/stat/inc_htm/admin_newuser3.inc <h2>Hibás a jelszó vagy a felhasználó neve nem lett megadva!</h2> <a href="<?= $PHP_SELF ?>">újra</a> Fájl: /var/www/stat/inc_htm/footer.inc <hr> <font color="blue" size="-1">WebStat v1.0</font> </center> </body> </html> Fájl: /var/www/stat/inc_htm/header.inc <html> <head> <title>Statisztikai rendszer -=- <?= $TitleName ?></title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2"> </head> <body> <p align=center><a href="/stat/index.php?page=admin">Admin oldal</a> | <a href="/stat/index.php?page=user">Felhasználói oldal</a></p> <hr> <center> Fájl: /var/www/stat/inc_htm/user_login.inc <h1>Belépés</h1> <form action="<?= $PHP_SELF ?>" method="post"> <table align="center" width="800"> <tr><td align="right" width="300">Felhasználó neve: </td><td width="500"><input type="text" maxlength="30" size="30" name="username" value=""></td></tr> <tr><td align="right" width="300">Jelszó: </td><td width="500"><input type="password" maxlength="8" size="32" name="password" value=""></td></tr> </table> <input type="hidden" name="state" value=2><br> <input type="submit" value="Belép"> </form>

Page 91: Diploma Aktiv Weboldal Keszites Php ASP

6. Irodalomjegyzék 91 / 91

6. Irodalomjegyzék

- Apache dokumentáció: http://www.apache.org

- MySQL dokumentáció: http://www.mysql.com

- PHP dokumentáció: http://www.php.net

- IIS dokumentáció, ASP útmutató: http://localhost/iishelp [WinXP alatt, ha telepítve van az IIS 5.1 a helyi számítógépen.] http://msdn.microsoft.com/library/default.asp?url=/nhp/default.asp?contentid=28000522

- VBScript dokumentáció: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/vtorifunctions.asp

- Miscrosoft SQL 2000 Server dokumentáció: http://www.microsoft.com/sql

- Hasznos ASP oldalak: http://www.activeserverpages.com http://www.asphole.com http://www.15seconds.com

- HTML 4.01 specifikáció: http://www.w3.org/TR/html4/

- ServerObject Inc. honlapja: http://www.serverobject.com

- Microsoft Internet Information Server Resource Kit Technical Information And Tools for Building Better Web Site Microsoft Press, 1998