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áziskiszolgá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.
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 TCP/IP:
IP cím:
Entitás:
DNS:
Protokoll:
Magyarázat 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. 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é. Á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. 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. 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.
1. Bevezetés Alapfogalom Port:
HTTP:
Webszerver, Webkiszolgáló:
Webes ügyfél, Webböngésző, Webes kliens:
URL:
Virtualhost:
CGI:
SSI:
5 / 91 Magyarázat 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. 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. 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. 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. 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>://:<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. 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. 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. 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.
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 tartalommal:
a
következő
fájlt:
C:\InetPub\WWWRoot\test.asp
a
következő
test.asp - date test <%Response.Write"
"&Date()&"
"%>
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.
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
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. DirectoryIndex index.html index.php index.htm index.shtml index.cgi # 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: ServerName www.sajatnev1.hu DocumentRoot /var/www/sajatnev1.hu ServerAdmin [email protected]
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. 2. 3. 4. 5.
A telepítő automatikusan elindul. Itt válasszuk ki: SQL Server 2000 Components. Következő menüben válasszuk ki: Install Database Server. Tényleges telepítés üdvözlő ablaka jelenik meg. Válasszuk: Next. Saját gépünkre szeretnénk telepíteni, ezért a Local Computert jelöljük be, majd Next. 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.
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.
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 ii mysql-client 3.23.49-8.2 ii mysql-common 3.23.49-8.2 ii mysql-doc 3.23.51-0woody ii mysql-server 3.23.49-8.2 ii php4-mysql 4.1.2-6
mysql database client library mysql database client binaries mysql database common files (e.g. /etc/mysql mysql database documentation mysql database server binaries 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 PHPhoz 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:
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.
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®.
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: 1. számú példa HTML címsora
Fejléc
footer.html fájl tartalma: main1.shtml fájl tartalma: Ez itt az egyik oldal dátummal. Mai dátum: main2.shtml fájl tartalma: Ez itt a másik oldal.
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.
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 HTMLkó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.
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ájlhatá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 határolójelek segítségével jelöli a parancsfájl-utasításait. De általában alkalmazható 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ó ( 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. "-nak ?> 2. 3. <script language="php"> echo ("Néhány szerkesztő (ilyen pl. a FrontPage) nem" . "szereti a processing utasításokat"); 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 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.
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ájlutasításokat tartalmaz: <TITLE>Place Your Order <SCRIPT LANGUAGE="VBScript"> 2 End Function -->
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 %> <% 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.
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ó.
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 Empty Null Boolean Byte Integer Currency Long Single
Double
Date (Time) String Object Error
Leírás Variant nincsen kezdeti értéke. Az értéke numerikus változó esetében 0 vagy üres-string ("") string változó esetében. Variant szándékosan nem tartalmaz valódi értéket. Értéke lehet True vagy False. Integer típus: [0; 255] intervallumban. Integer típus: [-32,768; 32,767] intervallumban. [-922,337,203,685,477.5808; 922,337,203,685,477.5807] intervallum. Integer típus: [-2,147,483,648; 2,147,483,647] intervallumban. 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. 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. Olyan számot tartalmaz, ami egy dátumot reprezentál: 100. január 1 és 9999. december 31 között. Változóhosszúságú karakterláncot (string) tartalmaz, ami akár 2 millió karakter hosszú is lehet. Egy objektumot tartalmaz. 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 Boolean Byte Date (Time) Double Error Integer Long Object Single String
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.
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; # 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; $a = 1.234; $a = 1.2e3; $a = 7E-10;
(bool) $var (boolean) $var
0 - hamis 1 – igaz Általában nem nulla esetén igaz. 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.
Egész szám
Lebegőpontos szám
String
Tömb
Objektum
Resource NULL
$s = 'Arnold egyszer azt mondta: "I\'ll be back"'; $s = ”Ez is egy string\n” $str = <<] érték , ... ) $t = array( 1 => 'egy', 2 => 'kettő', 3 => 'három' ); #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(); Speciális típus a külső erőforrások felszabadítására. #jelzi, hogy a változó nem tartalmaz értéket $var = NULL
(int) $var (integer) $var
(float) $var
Platformfüggő, de maximális érték kb. 1.8e308, 14 tizedesjegy pontossággal (64 bites IEEE formátum). Hosszúsága nincsen korlátozva.
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
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':
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.
// É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.
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ásmá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:
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:
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
function Osszead() { global $a, $b; $b = $a + $b; }
function Osszead() { $GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"]; }
Ossszead(); echo $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ó.
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
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.
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 Alkalmazás("Üdvözlés") értékét.
direktíva
segítségével
jeleníti
meg
az
<%= 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.
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
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:
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.
A munkamenet változók tárolásának módja nagyban függ a PHP konfigurációjától.
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:
A PHP támogatja mind a C, C++ és Unix shell-szerű megjegyzéseket (kommenteket). Például:
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.
Ez egy példa.
A fenti fejléc kiírja 'Ez egy példa'.
A programblokkok kommentezésére alkalmas megjegyzéseket nem lehet egymásba ágyazni.
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átorprecedencia 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 (-) Hatványozás (^) Szorzás és osztás (*, /) Egész osztás (\) Modulus (Mod) Összeadás és kivonás (+, -) String konkatenálás (&)
Egyenlő (=) Nem egyenlő (<>) Kisebb mint (<) Nagyobb mint (>) Kisebb egyenlő (<=) Nagyobb egyenlő (>=) Is
Not (logikai tagadás) And (logikai ÉS) Or (logikai VAGY) Xor (logikai kizáró VAGY) Eqv (logikai egyenlőség) Imp (logikai implikáció)
Ha egy kifejezésben a szorzás és az osztás együtt szerepel, akkor a kiértékelés balróljobbara 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.
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 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 Else B=B-A : C=0 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 strColor Case "red" strSzin = "piros" Case "green" strSzin = "zöld" Case "blue" strSzin = "kék" Case Else strSzin = "fekete" End Select
Select Case kifejezés [Case kifejezéslista] [utasítosok] [Case Else] [else-utasítások] 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 Do [utasítások] [Exit Do] [utasítások] Loop [{While | Until} feltétel]
C=20 Do Until c=0 C=C-1 Loop
Rem Tömb összes eleme szerinti ciklus. For Each elem In csoport [utasítások] [Exit For] [utasítások] 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 Rem addig hajtja végre, amíg igaz (TRUE) a feltétel While feltétel Wend
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. 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 For I = 1 To 10 For J = 2 To 30 Step 2 IJ = I * J Next Next
Dim C C=0 While c<20 C=C+1 Wend
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 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 Rem Függvény vagy eljárás hívása [Call] név [(argumentumlista)] 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
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 kiértékeli a név kifejezést Eval név
Sub Eljaras (numP) If numP > 0 Then Response.Write ”Pozitív szám” Else Response.Write ”Negatív szám” End Sub Call Osszes(2, 3) Eljaras(4) Execute B = 6 S = "Sub Proc2" & vbCrLf S = S & " Print X" & vbCrLf S = S & "End Sub" Execute S 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.
2. Webes aktív oldalak készítése adatbázis eléréssel
Asszociativitás
Operátorok
balról-jobbra balról-jobbra balról-jobbra balról-jobbra jobbról-balra 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 jobbról-balra nem köthető
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.
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 (kifejezés1) utasítás; elseif (kifejezés n.) elseif-utasítás; else else-utasítás;
//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; }
Ciklus Szintaxis
Példa
while (kifejezés) utasítás;
$i = 1; while ($i < 10) print $i++; while ($i < 20) { print $i; $i++; } $i = 1; while ($i <= 10): print $i; $i++; endwhile; $i = 10; do { print $i--; } while ($i > 0); // for ciklus megfelel a következőnek: kif1; while (kif2) { utasítás; kif3; } foreach ($tomb as $ertek) { echo "Érték: $ertek \n"; } foreach ($tomb as $kulcs => $ertek) { print "\$tomb[$kulcs] => $ertek.\n"; }
while (kifejezés): utasítások; endwhile;
do { utasítások; } while (kifejezés); for (kif1; kif2; kif3) utasítás; for (kif1; kif2; kif3): utasítások; endfor;
//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;
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 fuggveny által definiált függvény meghívása fuggveny(par1, par2, …, parN);
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"; } }
//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.
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:
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.
2. Webes aktív oldalak készítése adatbázis eléréssel
35 / 91
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 (példa) 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) & " " Next %>
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) & " " 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.
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ó.
Az űrlap elküldésekor megoldható, hogy gomb helyett képet használunk ilyesféle jelölés segítségével:
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.
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 Domain ExpiresAbsolute
Expires HasKeys Path
Secure
Leírás Csak írható. Megadása esetén a sütit csak az erre a tartományra érkező kérelmekre küldi el a program. 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. Hasonló mint az előző, de nem dátumot, hanem másodpercet vár. Csak olvasható. Megadja, hogy a süti tartalmaz-e kulcsot. 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. 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”) %>
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: <% 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.
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]]]]])
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: \n"; } } ?>
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.
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 & ". " ’Megjeleníti a lekérdezés tartalmát Do Until rs.EOF Response.Write "Név, kor: " & rs("vezeteknev") & " " & rs("keresztnev") & ", " & rs("kor") &" " 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.
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. 5) echo "Sorok száma: $rows "; //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"]." "; } ?>
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.
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:
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 utasítást, vagy elágazás esetén a következőt: HTML igaz ág 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.
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: vagy
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ó.
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 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
Létrehozza a kezdeti adatbázist (statusers nevű tábla), amelybe a felhasználók adatai kerülnek. 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. 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. Ú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 adatbázis tábla is létrejön, amelybe majd a felhasználó statisztikai adatai kerülnek bele. Kiírja az 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. 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. Grafikont rajzol 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. 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ó számát tartalmazza.
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. 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.) A menüben kiválasztott és paraméterként átadott információk alapján 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. 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. A felhasználók adatait tartalmazó adatbázis táblát hozza létre. Ezt csak egyszer kell megtenni. 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. 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. 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. 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. 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. 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. 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. 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 -t várja paraméterként. Megjeleníti az adminisztrációs vagy a felhasználói oldal HTML kódját a paraméternek megfelelően. 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 -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. 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 információt eltárolja egy süti információban, ha nem akkor hibát jelez és újra probálkozhatunk. Törli az -re vonatkozó süti információt.
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. 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. A felhasználó felvételénél és módosításánál megjelenő űrlap HTML kódját tartalmazza. Felhasználó sikeres felvétele után megjelenítendő HTML kódokat tartalmazza. 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. Az összes oldal lábléce, maga a lábléc HTML kódja található itt. 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. A felhasználó belépésénél megjelenő űrlap HTML kódját tartalmazza.
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.
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
5. Mellékletek
4. lépés
5. lépés
6. lépés
49 / 91
5. Mellékletek
7. lépés
8. lépés
9. lépés
50 / 91
5. Mellékletek
10. lépés
11. lépés
12. lépés
51 / 91
5. Mellékletek
13. lépés
14. lépés
15. lépés
52 / 91
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_
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.
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ó URLcí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") %>
5. Mellékletek
55 / 91
Az alábbi példa számos kiszolgálói változót jelenít meg név szerint: ALL_HTTP kiszolgálói változó = <%= Request.ServerVariables("ALL_HTTP") %> CONTENT_LENGTH kiszolgálói változó = <%= Request.ServerVariables("CONTENT_LENGTH") %> CONTENT_TYPE kiszolgálói változó = <%= Request.ServerVariables("CONTENT_TYPE") %> QUERY_STRING kiszolgálói változó = <%= Request.ServerVariables("QUERY_STRING") %> SERVER_SOFTWARE kiszolgálói változó = <%= Request.ServerVariables("SERVER_SOFTWARE") %>
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:
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 $REQUEST_METHOD
Az oldal lekéréséhez használt protokoll neve és verziója pl. 'HTTP/1.0'
$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'.
Az oldal eléréséhez használt kérési forma, pl.: 'GET', 'HEAD', 'POST', 'PUT'.
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 Cszerű 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. A parancssori argumentumok számát tartalmazza (ha parancssorból futtatjuk). 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-kat (sütiket) tartalmazó asszociatív tömb. HTTP cookie-kat (sütiket) tartalmazó asszociatív tömb, amely minden hatókörben elérhető. HTTP GET metódussal által szolgáltatott adatokat tartalmazó asszociatív tömb. HTTP GET metódussal által szolgáltatott adatokat tartalmazó asszociatív tömb, amely minden hatókörben elérhető. 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. HTTP POST metódussal által szolgáltatott adatokat tartalmazó asszociatív tömb, amely minden hatókörben elérhető. A HTTP POST metódussal feltöltött fájlokról tartalmaz információkat, asszociatív tömb. A HTTP POST metódussal feltöltött fájlokról tartalmaz információkat, asszociatív tömb. A szülő/futtató környezet aktuális változóit tartalmazó asszociatív tömb. A szülő/futtató környezet aktuális változóit tartalmazó asszociatív tömb, amely minden hatókörben elérhető. 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. A HTTP szervertől érkező változókkal feltöltött asszociatív tömb, amely minden hatókörben elérhető. Az aktuális szkripthez tartozó session változókat tartalmazó asszociatív tömb. 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. 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. 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. Az alkalmazott PHP verziószáma (string). Pl.: '4.1.0'. 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. Igaz érték. Lásd boolean adattípus. Hamis érték. Lásd boolean adattípus. NULL érték. Lásd NULL adattípus. Egy nem feldolgozás során keletkezett helyrehozhatatlan hibát jelez. 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. A parser meghalt a szkriptbeli érvénytelen szintaxis miatt; helyrehozhatatlan hiba. 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. 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.
__LINE__ PHP_VERSION PHP_OS
TRUE FALSE NULL E_ERROR E_WARNING
E_PARSE E_NOTICE
E_ALL
5. Mellékletek
58 / 91
5.5. ASP-ben megvalósított statisztikai rendszer forráskódja
Fájl: c:\inetpub\wwwroot\stat\counter.asp <% 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")
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 %>
' 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) + MaxYMaxY*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
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)+(SpaceXImage.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
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\inc_asp\admin_create.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." %>
5. Mellékletek <% 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" %> <% ElseIf p_state = 2 And p_password1=p_password2 And p_username<>"" And p_password1<>"" Then %> <% Else %> <% 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
67 / 91
5. Mellékletek 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 %>
Fájl: c:\inetpub\wwwroot\stat\inc_asp\user_login.inc <% If IsEmpty(p_state) Or p_state<>2 Then %>
5. Mellékletek
<% 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 %> <% Response.Write "
Sikertelen belépés!
" Response.Write "Helytelen a felhasználónév / jelszó páros! " Response.Write "Újra" End IF dbClose Else %> <% Response.Write "
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 "
Hiba
Süti információ nem található, vagy érvénytelen adat. (" & stat_id & ")" Else %>
Fájl: c:\inetpub\wwwroot\stat\inc_asp\user_stat.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 "M E N Ü " 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 "
Látogatás, összes adat
Sorszám
Dátum, idő
IP
Host
Böngésző
" If(d_data = "year") Then Response.Write "
Látogatás, éves összesítés
Sorszám
Év
Találatok
Táblázat
Gr afikon
" If(d_data = "month") Then Response.Write "
Látogatás, havi összesítés
Sorszám
Év
Hónap
Találatok
Tábl ázat
Grafikon
" If(d_data = "week") Then Response.Write "
Látogatás, heti összesítés
Sorszám
Év
Hét
Találatok
" If(d_data = "day") Then Response.Write "
Látogatás, napi összesítés
Sorszám
Év
Hónap
Nap
Találatok< /b>
Táblázat
Grafikon
" If(d_data = "hour") Then Response.Write "
Látogatás, óránkénti összesítés
Sorszám
Év
Hónap
Nap
Óra
Találatok
"
5. Mellékletek
73 / 91
Do Until rs.EOF if(d_data = "all") Then Response.Write "
" Response.Write " M E N Ü" 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 "
Látogatás, éves összesítés grafikon
" If(d_data = "month") Then Response.Write "
Látogatás, havi összesítés grafikon
" Do Until rs.EOF if(d_data = "year") Then Response.Write "
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);
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;";
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); }
5. Mellékletek if ($p_graph=="day") { if ($Pos==$rs["hour"]) $rs=mysql_fetch_array($SQL_result); } $Pos++; } } ImagePng($image); ImageDestroy($image); ?>
Fájl: /var/www/stat/inc_php/user_stat.inc M E N Ü "; $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 "
\n"; echo " M E N Ü"; } 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 "
- 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