A könyv eddigi példáiban egy nagyon fontos dolgot nem láttunk. Létrehoztunk változókat és tömböket, készítettünk és meghívtunk különbözõ függvényeket, különféle objektumokkal dolgoztunk, eddigi ismereteink azonban értelmetlenek, amíg a felhasználó által megadott adatokat kezelni nem tudjuk. Ebben az órában ezt a témakört tekintjük át. A Világhálón alapvetõen a HTML ûrlapokon keresztül áramlik az információ a felhasználó és a kiszolgáló között. A PHP-t úgy tervezték, hogy a kitöltött HTML ûrlapokat könnyen fel tudja dolgozni. Ebben az órában a következõket tanuljuk meg: Hogyan férjünk hozzá a környezeti változókhoz és hogyan használjuk azokat? Hogyan férjünk hozzá az ûrlapmezõkben megadott információkhoz? Hogyan dolgozzunk az ûrlapok több elem kiválasztását engedélyezõ elemeivel? Hogyan készítsünk olyan kódot, amely egyszerre tartalmazza a HTML ûrlapot és az ezt kezelõ PHP programot? Hogyan mentsük az állapotot rejtett mezõkkel? Hogyan irányítsuk a felhasználót új oldalra? Hogyan készítsünk fájlfeltöltõ HTML ûrlapot és hogyan írjunk olyan PHP programot, amely kezeli ezt? Globális és környezeti változók Mielõtt elkészítenénk elsõ igazi ûrlapunkat, kis kitérõt kell tennünk, hogy újra áttekintsük a globális változókat. A globális változókkal elõször a függvényekrõl szóló hatodik órában találkoztunk. A globális változók azok a változók, amelyeket a program legfelsõ szintjén, azaz a függvényeken kívül vezettünk be. Minden függvény számára elérhetõ a beépített $GLOBALS nevû tömb. A $GLOBALS tömb használatát láthatjuk a 9.1. példában, amelyben egy ciklussal kiírjuk programunk összes globális változóját. 9.1. program A $GLOBALS tömb elemeinek kiírása 1: 2:
3:
9.1. program A $GLOBALS tömb elemeinek kiírása 4:
5:
6: 7: $user1 = "Judit";
8: $user2 = "István";
9: $user3 = "János";
10: foreach ( $GLOBALS as $kulcs=>$ertek )
11: {
12: print "\$GLOBALS[\"$kulcs\"] == $ertek
";
13: }
14: ?>
15:
16:
150 9. óra
Három változót vezettünk be és a $GLOBALS tömb elemein végiglépkedve kiírtuk
a változók neveit és értékeit a böngészõben. Láthatjuk az általunk megadott változ
ókat, de a program ezeken kívül másokat is kiírt, a PHP ugyanis automatikusan
bevezet néhány globális változót, amelyek a kiszolgáló és az ügyfél környezetét
írják le. Ezeket a változókat környezeti változóknak nevezzük. A kiszolgálótól,
a rendszertõl és a beállításoktól függõen különféle környezeti változók létezhetnek,
ezek ismerete rendkívül fontos. A 9.1. táblázatban a leggyakoribb környezeti változ
ókat soroltuk fel. A környezeti változók értéke közvetlenül vagy a $GLOBALS
tömb részeként érhetõ el.
9.1. táblázat Környezeti változók
Változó Tartalma Példa
$HTTP_USER_AGENT A böngészõ neve és Mozilla/4.6 (X11;I;
változatszáma Linux2.2.6-15apmac ppc)
$REMOTE_ADDR Az ügyfél IP címe 158.152.55.35
$REQUESTED_METHOD A kérelem módja POST
(GET vagy POST)
$QUERY_STRING A GET kérelmeknél nev=janos&cim=
az URL-hez kapcsolt ismeretlen
kódolt adat
$REQUEST_URI A kérelem teljes címe /php-konyv/urlapok/
a lekérdezõ 9.14.program.php?nev=
karaktersorozattal janos
$HTTP_REFERER Az oldal címe, http://www.proba.hu/
amelyrõl a kérelem egy_oldal.html
érkezett
A PHP létrehoz más környezeti változókat is.
Például a $GLOBALS["PHP_SELF"] az éppen futó program elérési útját adja
meg. A szerzõ rendszerén az érték a következõ volt:
/php-konyv/urlapok/9.1.program.php
Ûrlapok 151
9
A változó értéke közvetlenül is elérhetõ, $PHP_SELF néven. Ebben az órában még
sokszor fogjuk használni ezt a változót. A HTML oldalt leíró és az ûrlapot elemzõ
PHP kódot gyakran tároljuk egy állományban. Az oldal nevének tárolásához
a $PHP_SELF változó értékét a HTML FORM elemének ACTION paraméteréhez
rendeljük.
A $GLOBALS tömb ezenkívül még sok másra is használható.
Adatok bekérése a felhasználótól
Jelenleg a HTML és PHP kódot külön állományban tároljuk. A 9.2. példában egy
egyszerû HTML ûrlap kódját láthatjuk.
9.2. program Egy egyszerû HTML ûrlap
1:
2:
3:
9.2. program Egy egyszerû HTML ûrlap 4:
5:
6:
14:
15:
Egy HTML ûrlapot hoztunk létre, amely egy "felhasznalo" nevû szövegmezõt,
egy "cim" nevû szövegterületet, és egy gombot tartalmaz. Könyvünk nem foglakozik
részletesen a HTML ismertetésével, ha mégis nehéznek találjuk a példákat,
olvassunk el egy, a HTML nyelvvel foglalkozó kötetet vagy számítógépes leírást.
A FORM elem ACTION paramétere a 9.3.program.php fájlra mutat, amely
feldolgozza az ûrlapon megadott adatokat. Mivel az ACTION csak a fájl nevét adja
meg, a HTML és PHP kódot tartalmazó fájloknak egy könyvtárban kell lenniük.
A 9.3. példaprogram kiírja a felhasználó által megadott információkat.
152 9. óra
9.3. progran A 9.2. példa ûrlapjának feldolgozása
1:
2:
3:
9.3. program A 9.2. példa ûrlapjának feldolgozása 4:
5:
6: 7: print "Üdvözlet
$felhasznalo \n\n"; 8: print "A címe:
\n\n$cim "; 9: ?> 10: 11: Ez a könyv elsõ olyan programja, amelyet nem hivatkozáson keresztül hívunk meg és nem közvetlenül a böngészõbe írjuk be a címét. A 9.3. példában található kódot az 9.3.program.php fájlban tároljuk. A fájlban lévõ kódot akkor hívjuk meg, amikor a felhasználó kitölti a 9.2. példában található ûrlapot. A program a $felhasznalo és a $cim változók értékét írja ki, amelyek a HTML ûrlap "felhasznalo" szövegmezõjének és "cim" területének értékét tartalmazzák. Látható, hogy a PHP 4 segítségével milyen egyszerûen kezelhetõek az ûrlapok. Bármilyen megadott információ globális változóként hozzáférhetõ és a változók neve megegyezik a megfelelõ HTML elem nevével. Több elem kiválasztása a SELECT elemmel Elõzõ példánkban olyan HTML ûrlap szerepelt, amely egy elemhez egyetlen érték hozzárendelését engedélyezte. Most megtanuljuk a SELECT elem kezelését, melynek segítségével több elem kiválasztását engedélyezhetjük. Ha a SELECT elemnek egyszerû nevet adunk: akkor a feldolgozó program csak az egyik kiválasztott elemhez fér hozzá. Ha minden elemet el szeretnénk érni a programból, az elem neve után írjunk üres szögletes zárójeleket. Ezt láthatjuk a 9.4. példában. Ûrlapok 153 9 9.4. program SELECT elemet tartalmazó HTML ûrlap 1: 2: 3: 9.4. program SELECT elemet tartalmazó HTML ûrlap 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: Ultrahangos csavarhúzó 14: Tricorder 15: ORAC AI 16: HAL 2000 17: 18: 19: 20: 21: 22: Az ûrlapot feldolgozó programban a SELECT elemben kiválasztott adatok a $termekek tömbben találhatóak. Ezt mutatjuk be a 9.5. példában 9.5. program A 9.4. példában látott ûrlap feldolgozása 1: 2: 3: 9.5. program A 9.4. példában látott ûrlap feldolgozása 4: 5: 6: 7: print "Üdvözlet $felhasznalo \n\n"; 8: print "A címe:
\n\n$cim "; 9: print "A következõ termékeket választotta:
\n\n"; 10: print "
\n\n"; 154 9. óra 9.5. program (folytatás) 11: foreach ( $termekek as $termek ) 12: { 13: print "$termek \n"; 14: } 15: print " "; 16: ?> 17: 18: Nem csak a SELECT elem engedélyezi több elem kiválasztását. Ha több jelölõ- négyzetnek ugyanazt a nevet adjuk, ahol a felhasználó több elemet is kiválaszthat, csak az utolsó kiválasztott értéket kapjuk meg, de ha a nevet üres szögletes zárójelek követik, az adott nevû elemeket a PHP tömbként kezeli. A 9.4. példa SELECT elemét jelölõnégyzetekre cserélhetjük és ugyanazt a hatást érjük el: Ultrahangos csavarhúzó å value="Tricorder">Tricorder å "ORAC AI">ORAC AI å "HAL 2000">HAL 2000 Az ûrlap minden mezõjének hozzárendelése egy tömbhöz Az eddig megtanult módszerek mindaddig jól mûködnek, amíg programunk tudja, milyen mezõkkel dolgozik. Gyakran azonban olyan programra van szükségünk, amely az ûrlap változásaihoz alkalmazkodik vagy egyszerre többféle ûrlapot képes kezelni, anélkül, hogy keverné a mezõk neveit. A PHP 4 globális változói erre a problémára is megoldást nyújtanak. Attól függõen, hogy a kitöltött ûrlap GET vagy POST metódust használt, elérhetõvé válnak a $HTTP_GET_VARS vagy a $HTTP_POST_VARS változók. Ezek az asszociatív tömbök tartalmazzák az ûrlap mezõinek neveit és a hozzájuk rendelt értékeket. A 9.6. példa azt mutatja be, hogyan listázható ki az ûrlap minden mezõje egy GET kérelem esetén. Ûrlapok 155 9 9.6. program A $HTTP_GET_VARS tömb használata 1: 2: 3: 9.6. program A $HTTP_GET_VARS tömb használata 4: 5: 6: 7: foreach ( $HTTP_GET_VARS as $kulcs => $ertek ) 8: { 9: print "$kulcs == $ertek \n"; 10: } 11: ?> 12: 13: A fenti kód a GET kérelmen keresztül érkezett paraméterek neveit és értékeit írja ki. Természetesen itt még nem kezeltük azt az esetet, amikor valamelyik átadott param éter tömb. Ha a 9.4. példaprogrammal olyan HTML ûrlapról érkezõ adatok feldolgoz ását végeztetjük, amelyben több elem kiválasztását engedélyezõ SELECT mezõ szerepel, valami hasonlót olvashatunk: felhasznalo == Kiss Iván cim == Budapest, Magyarország termekek == Array A termekek tömböt tartalmazza a $HTTP_GET_VARS tömb, de kódunk még nem tudja ezt kezelni. A 9.7. példaprogram ellenõrzi, hogy a paraméter típusa tömb-e és ha igen, kiírja a tömb elemeit. 9.7. program A $HTTP_GET_VARS tömb használata, ha tömböt tartalmaz 1: 2: 3: 9.7. program A $HTTP_GET_VARS tömb használata, ha tömböt tartalmaz 4: 5: 6: 156 9. óra 9.7. program (folytatás) 7: foreach ( $HTTP_GET_VARS as $kulcs => $ertek ) 8: { 9: if ( gettype( $ertek ) == "array" ) 10: { 11: print "$kulcs == \n"; 12: foreach ( $ertek as $tombelem ) 13: print ".........$tombelem "; 14: } 15: else 16: { 17: print "$kulcs == $ertek \n"; 18: } 19: } 20: ?> 21: 22: Mielõtt a forearch segítségével a $HTTP_GET_VARS tömb elemein végiglépkedn énk, a gettype() függvénnyel ellenõrizzük, hogy a következõ elem tömb-e. Ha az elem tömb, egy második foreach segítségével végiglépkedünk az elemein és kiírjuk azokat a böngészõbe. Különbségek a GET és a POST továbbítás között A program akkor rugalmas, ha el tudja dönteni, hogy $HTTP_POST_VARS vagy $HTTP_GET_VARS tömbbõl olvassa-e ki az elemeket. A továbbítás típusát (GET vagy POST) a legtöbb rendszerben a $REQUEST_METHOD környezeti változó tartalmazza, értéke értelemszerûen "get" vagy "post". Érdemes tudni, hogy a $HTTP_POST_VARS tömb csak POST továbbítási mód esetén tartalmaz elemeket. A 9.8. program mindig a megfelelõ tömbbõl olvassa ki a paramétereket. Ûrlapok 157 9 9.8. program A GET és POST kérelmek kezelése 1: 2: 3: 9.8. program A GET és POST kérelmek kezelése 5: 6: 7: 8: $PARAMETEREK = ( count( $HTTP_POST_VARS ) ) 9: ? $HTTP_POST_VARS : $HTTP_GET_VARS; 10: foreach ( $PARAMETEREK as $kulcs => $ertek ) 11: { 12: if ( gettype( $ertek ) == "array" ) 13: { 14: print "$kulcs == \n"; 15: foreach ( $ertek as $tombelem ) 16: print ".........$tombelem "; 17: } 18: else 19: { 20: print "$kulcs == $ertek \n"; 21: } 22: } 23: ?> 24: 25: A feltételes mûveletjellel beállítjuk a $PARAMETEREK változó értékét. A count() függvénnyel ellenõrizzük, hogy a $HTTP_POST_VARS változó tartalmaz-e elemeket. A count() visszatérési értéke a tömb elemeinek száma: pozitív, ha a param éterében megadott változó tartalmaz elemeket és 0 (false), ha nem. Ha a $HTTP_POST_VARS tartalmaz elemeket, akkor a $PARAMETEREK változót egyenlõvé tesszük vele, egyébként a $PARAMETEREK a $HTTP_GET_VARS érté- két veszi fel. Most már kiírathatjuk a $PARAMETEREK tömb tartalmát a korábban látott módon. 158 9. óra PHP és HTML kód összekapcsolása egy oldalon Néhány esetben szükség lehet rá, hogy az ûrlapot leíró HTML kódot és az ûrlapot kezelõ PHP kódot egyetlen fájlban tároljuk. Ez akkor lehet hasznos, amikor a felhaszn áló számára többször adjuk át ugyanazt az ûrlapot. Természetesen kódunk sokkal rugalmasabb, ha dinamikusan írjuk meg, de ekkor elveszítjük a PHP haszn álatának elõnyét. A HTML és PHP kódot ne keverjük a közös fájlon belül, mert így a forrás nehezebben lesz olvasható és módosítható. Ahol lehetséges, készíts ünk HTML kódból meghívható PHP függvényeket, amelyeket késõbb fel tudunk használni. A következõ példákban olyan oldalt fejlesztünk, amely az ûrlapról beérkezõ egész számról megmondja, hogy kisebb vagy nagyobb-e egy elõre megadott egész értéknél. A 9.9. példában a fenti feladat megoldását tartalmazó HTML kódot láthatjuk. A kód egy egyszerû szövegmezõt és némi PHP kódot tartalmaz. 9.9. program Saját magát meghívó HTML kód 1: 2: 3: 9.9. program Saját magát meghívó HTML kód 4: 5: 6: 7: Ide írja a tippjét: 8: 9: 10: A fenti ûrlap saját magát hívja meg, mert a FORM elem ACTION paraméterének a $PHP_SELF értéket adtunk. Vegyük észre, hogy nem készítettünk gombot, amely elküldi a beírt számot. Az újabb böngészõk a szövegmezõ kitöltése és az ENTER lenyomása után automatikusan elküldik a megadott adatot, viszont néhány régebbi böngészõ ezt nem teszi meg. A 9.9. példában lévõ program nem dinamikus, hiszen nem ír ki semmit, ami a felhaszn álótól függ. A 9.10. példában további PHP kódot építünk az oldalba. Elõször meg kell adnunk a számot, amit a felhasználónak ki kell találnia. A teljes változatban valószínûleg véletlenszámot állítanánk elõ, most azonban egyszerûen megadjuk, mondjuk a 42-t. Ezután megnézzük, hogy az ûrlapot kitöltötték-e már, különben Ûrlapok 159 9 olyan változóval számolnánk, amely még nem létezik. A $tipp változó létezésének ellenõrzésével megtudhatjuk, hogy az ûrlapot kitöltötték-e már. Amikor az ûrlap elk üldi a "tipp" paramétert, a $tipp változó globális változóként hozzáférhetõ lesz a programban. A $tipp változó létezése esetén egészen biztosak lehetünk benne, hogy az ûrlapot a felhasználó kitöltötte, így elvégezhetjük a további vizsgálatokat. 9.10. program Számkitalálós PHP program 1: 2: $kitalalando_szam = 42; 3: $uzenet = ""; 4: if ( ! isset( $tipp ) ) 5: { 6: $uzenet = "Üdvözlöm a számkitalálós játékban!"; 7: } 8: elseif ( $tipp > $kitalalando_szam ) 9: { 10: $uzenet = "A(z) $tipp túl nagy, próbáljon egy kisebbet!"; 11: } 12: elseif ( $tipp < $kitalalando_szam ) 13: { 14: $uzenet = "A(z) $tipp túl kicsi, próbáljon egy nagyobbat!"; 15: } 16: else // egyenlõk kell, hogy legyenek 17: { 18: $uzenet = "Telitalálat!"; 19: } 20: ?> 21: 22: 23: 9.10. program Számkitalálós PHP program 24: 25: 26: 27: 28: 29: 30: Ide írja a tippjét: 31: 32: 33: 160 9. óra A program törzsében egy if szerkezettel vizsgáljuk a $tipp változót és adunk ért éket az $uzenet változónak. Ha a $tipp változó még nem létezik, a felhaszná- ló csak most lépett az oldalra, ezért üdvözöljük. Különben megvizsgáljuk az elõre megadott számot és a $tipp értékét, és ez alapján rendeljük az $uzenet változ óhoz a megfelelõ szöveget. Végül a HTML oldal törzsében csak ki kell írnunk az $uzenet értékét. A program persze még továbbfejleszthetõ. A PHP és a HTML kódot szétválasztva tartva egy grafikus könnyen módosíthatja az oldalt, a programozó közremûködése nélkül. Állapot mentése rejtett mezõkkel A 9.10. példában található program nem tudja, hogy a felhasználó hányszor tippelt, egy rejtett mezõ bevezetésével azonban ez is számon tartható. A rejtett mezõ ugyanúgy mûködik, mint a szövegmezõ, de a felhasználó nem látja, hacsak meg nem nézi a HTML forráskódot. A 9.11. példában található programban bevezetünk egy rejtett mezõt, amely a találgatások számát tartalmazza. 9.11. program Állapot mentése rejtett mezõvel 1: 2: $kitalalando_szam = 42; 3: $uzenet = ""; 4: $probalkozasok = ( isset( $probalkozasok ) ) ? ++$probalkozasok : 0; 5: if ( ! isset( $tipp ) ) 6: { 7: $uzenet = "Üdvözlöm a számkitalálós játékban!"; 8: } 9: elseif ( $tipp > $kitalalando_szam ) 10: { 11: $uzenet = "A(z) $tipp túl nagy, próbáljon egy kisebbet!"; 12: } 13: elseif ( $tipp < $kitalalando_szam ) 14: { 15: $uzenet = "A(z) $tipp túl kicsi, próbáljon egy nagyobbat!"; 16: } 17: else // egyenlõk kell, hogy legyenek 18: { 19: $uzenet = " Telitalálat!"; 20: } Ûrlapok 161 9 9.11. program (folytatás) 21: $tipp = (int) $tipp; 22: ?> 23: 24: 25: 9.11. program Állapot mentése rejtett mezõvel 26: 27: 28: 29: 30: 31: Tippelés sorszáma: 32: 33: Ide írja a tippjét: 34: 35: value=""> 36: 37: 38: A rejtett mezõ neve "probalkozasok". A PHP segítségével kiírjuk a "probalkozasok" és a "tipp" mezõ értékét, hogy a felhasználó tudja, hányszor próbálkozott és mit tippelt utoljára. Ez az eljárás akkor lehet hasznos, amikor a kitöltött ûrlapot elemezzük. Ha az ûrlapot rosszul töltötték ki, a felhasználó tudni fogja, mit rontott el. A beadott tipp értékét egész számmá alakítjuk a kérdõívbe írás elõtt. 162 9. óra Egy kifejezés értékének kiírásához a böngészõben a print() vagy az echo() utasításokat használhatjuk. PHP módban ezt egyszer ûbben is megtehetjük. Ha egyenlõségjelet (=) teszünk a PHP blokkot nyitó elem után, a böngészõ az azt következõ kifejezés értékét kiírja, így a helyett írhatjuk a következõt is: A PHP kód törzsében egy feltétellel megvizsgáljuk, hogy kell-e növelni a $probalkozasok változó értékét. Ha a változó létezik, akkor növeljük az értékét, különben 0-ra állítjuk. A HTML kód törzsében folyamatosan kiírjuk, hányszor próbálkozott a felhasználó. A felhasználó átirányítása Programunknak van egy nagy hátulütõje. Az ûrlap mindig újratöltõdik, akár kital álta a felhasználó a számot, akár nem. A HTML nyelvben sajnos elkerülhetetlen az egész oldal újratöltése, a felhasználót azonban átirányíthatjuk egy gratuláló oldalra, ha kitalálta a számot. Amikor az ügyfélprogram elkezdi a kapcsolatot a kiszolgálóval, elküld egy fejlécet, amely különbözõ információkat tartalmaz az azt követõ dokumentumról. A PHP ezt automatikusan megteszi, de a header() függvénnyel mi is beállíthatjuk a fejléc egyes elemeit. Ha a header() függvényt szeretnénk használni, biztosnak kell benne lennünk, hogy a böngészõnek nem írtunk ki semmit, különben a függv ényhívás elõtt a PHP elküldi a saját fejlécét. Ez mindenféle kiírás, még sortörés és szóköz karakter esetén is bekövetkezik. A header() függvény használatakor semmi nem lehet a függvényhívás elõtt, így ellenõriznünk kell a felhasználandó külsõ állományokat is. A 9.12. példában egy jellemzõ PHP fejlécet láthatunk. 9.12. példa Egy jellemzõ PHP fejléc 1: HEAD /php-konyv/urlapok/9.1.program.php HTTP/1.0 2: HTTP/1.1 200 OK 3: Date: Sun, 09 Jan 2000 18:37:45 GMT 4: Server: Apache/1.3.9 (Unix) PHP/4.0 5: Connection: close 6: Content-Type: text/html Ûrlapok 163 9 Ne bízzunk meg feltétel nélkül a rejtett mezõkben. Nem tudhatjuk, hogy honnan származik az értékük. Nem mondjuk, hogy ne haszn áljuk õket, csak azt, hogy nagy körültekintéssel tegyük. A felhasználó a forrás megváltoztatásával könnyedén csalhat a programban. A rejtett mezõk használata nem biztonságos. Egy "Location" fejléc elküldésével a böngészõt egy másik lapra irányíthatjuk: header( "Location: http://www.kiskapu.hu/" ); Tegyük fel, hogy készítettünk egy "gratulacio.html" oldalt, ahova átirányítjuk a felhasználót, amikor kitalálta a megadott számot. A megoldást a 9.13. példában találjuk. 9.13. program Fejléc küldése a header() függvénnyel 1: 2: $kitalalando_szam = 42; 3: $uzenet = ""; 4: $probalkozasok = ( isset( $probalkozasok ) ) ? ++$probalkozasok : 0; 5: if ( ! isset( $tipp ) ) 6: { 7: $uzenet = "Üdvözlöm a számkitalálós játékban!"; 8: } 9: elseif ( $tipp > $kitalalando_szam ) 10: { 11: $uzenet = "A(z) $tipp túl nagy, próbáljon egy kisebbet!"; 12: } 13: elseif ( $tipp < $kitalalando_szam ) 14: { 15: $uzenet = "A(z) $tipp túl kicsi, próbáljon egy nagyobbat!"; 16: } 17: else // egyenlõk kell, hogy legyenek 18: { 19: header( "Location: gratulacio.html" ); 20: exit; 21: } 22: $tipp = (int) $tipp; 164 9. óra A fejlécet a Telnet programmal írathatjuk ki. Kapcsolódjunk a 80-as kapun a webkiszolgálóhoz és gépeljük be a következõt: HEAD /utvonal/fajl.html HTTP/1.0 Az ügyfélprogram ekkor kiírja a fejlécet. 9.13. program (folytatás) 23: ?> 24: 25: 26: 9.13. program Fejléc küldése a header() függvénnyel 27: 28: 29: 30: 31: 32: Tippelés sorszáma: 33: 34: Ide írja a tippjét: 35: 36: 37: value=""> 38: 39: 40: Az if szerkezet else ágában a böngészõt átirányítjuk a "gratulacio.html" oldalra. A header() függvény meghívása után az oldalnak exit utasítással kell végzõdnie, hogy befejezze az ûrlap vizsgálatát. Fájlfeltöltõ ûrlapok és programok Megtanultuk, hogyan kérhetünk be adatokat a felhasználótól, de a Netscape Navigator 2-tõl és az Internet Explorer 4-tõl kezdve lehetõségünk van fájlok feltölt ésére is. Ebben a részben azzal foglalkozunk, hogyan lehet a fájlok feltöltését kezelni a PHP 4 segítségével. Elõször létre kell hoznunk egy HTML ûrlapot, amely tartalmazza a fájlfeltöltõ mez õt, melynek egyik paramétere kötelezõen a következõ: ENCTYPE="multipart/form-data" A feltöltõ mezõ elõtt meg kell adnunk egy rejtett mezõt is. Ennek neve MAX_FILE_SIZE kell, hogy legyen, és a fogadandó fájl lehetséges legnagyobb méretét adja meg, bájtban. Nem lehet nagyobb, mint a php.ini fájlban megadott Ûrlapok 165 9 upload_max_filesize értéke, amely alapértelmezés szerint 2 megabájt. Miután kitöltöttük a MAX_FILE_SIZE mezõt, a fájlt egy egyszerû INPUT elemmel tölthetjük fel, melynek TYPE paramétere "file". Bármilyen nevet adhatunk neki. A 9.14. példában a fájlt feltöltõ HTML kódot láthatjuk. 9.14. program Fájlfeltöltõ ûrlap 1: 2: 3: 9.14. program Fájlfeltöltõ ûrlap 4: 5: 6: action="" method="POST"> 7: value="51200"> 8: 9: 10: 11: 12: Vegyük észre, hogy a program meghívja az oldalt, amely tartalmazza, hogy PHP kóddal kezeljük a fájlt. A legnagyobb fájlméretet 50 kilobájtban adjuk meg és "fajl"-nak nevezzük el. Amikor a fájlt feltöltöttük, az egy ideiglenes könyvtárban tárolódik (ez alapbeállí- tásban a /tmp, ha UNIX rendszerrõl van szó). A fájl elérési útját a betöltõ mezõ nevével megegyezõ globális változó tartalmazza (példánkban a $fajl). A fájlról a különbözõ információkat a PHP globális változókban tárolja. Nevük a fájl elérési útját tartalmazó változónév, kiegészítve a "name", "size" és "type" utótagokkal. A változók jelentését a 9.2. táblázat tartalmazza. 9.2. táblázat Feltöltött fájlhoz kapcsolódó globális változók Változónév Tartalma Példa $fajl A fájl ideiglenes elérési útja /tmp/php5Pq3fU $fajl_name A feltöltött fájl neve test.gif $fajl_size A feltöltött fájl mérete bájtban 6835 $fajl_type A feltöltött fájl típusa image/gif 166 9. óra A PHP 4 a feltöltött fájlok adatainak tárolására beépített tömb típusú változókat használ. Ha egy vagy több fájlt töltünk fel egy ûrlapon keresztül, a fájlok adatai a $HTTP_POST_FILES tömbben tárolódnak. A tömb indexei a feltöltést meghatá- rozó mezõk nevei. A 9.3. táblázatban láthatjuk a tömb elemeinek nevét és értékét. 9.3. táblázat Feltöltött fájlhoz kapcsolódó globális változók Elem Tartalma Példa $HTTP_POST_FILES["fajl"]["name"] A feltöltött fájl neve test.gif $HTTP_POST_FILES["fajl"]["size"] A feltöltött fájl mérete 6835 bájtban $HTTP_POST_FILES["fajl"]["type"] A feltöltött fájl típusa image/gif A 9.15. példában látható program kiírja a rendelkezésre álló információkat a feltöltött fájlról, és ha az GIF formátumú, megjeleníti. 9.15. program Fájlfeltöltõ program 1: 2: 3: 9.15. program - Fájlfeltöltõ program 4: 5: 6: $feltoltes_konyvtar = "/home/httpd/htdocs/feltoltesek"; 7: $feltoltes_url = "http://php.kiskapu.hu/feltoltesek"; 8: if ( isset( $fajl ) ) 9: { 10: print "elérési út: $fajl \n"; 11: print "név: $fajl_name \n"; 12: print "méret: $fajl_size bájt \n"; 13: print "típus: $fajl_type\n\n"; 14: if ( $fajl_type == "image/gif" ) 15: { 16: copy ( $fajl, "$feltoltes_konyvtar/$fajl_name") or die ("Nem lehet másolni"); 17: 18: print " src=\"$feltoltes_url/$fajl_name\">
\n\n"; 19: } 20: } Ûrlapok 167 9 9.15. program (folytatás) 21: ?> 22:
23: 24: value="51200"> 25: 26: 27: 28: A 9.15. példában elõször ellenõrizzük, hogy a $fajl globális változó létezik-e. Ha létezik, feltehetjük, hogy a feltöltés sikeres volt (legalábbis e példa erejéig). Miután feltöltöttük a fájlt, a böngészõben megjelenítjük a $fajl, $fajl_name, $fajl_size és $fajl_type változók tartalmát, amelyek a fájlról információkat tartalmaznak. Ezután ellenõrizzük a $fajl_type változót. Ha értéke "image/gif", akkor az érkezett állományt GIF képként megjeleníthetjük. A típust a fájlkiterjesztés alapján állapítja meg a rendszer, ezért érdemes ellenõrizni, hogy a fájl valóban GIF formátumú-e. Ennek módjáról a tizenhetedik, karakterláncokkal foglalkozó órában tanulunk. A copy() függvénnyel a feltöltött fájlt a kiszolgáló másik könyvtárába másolhatjuk. A copy() függvénynek két paramétert kell megadni: az elsõ a másolandó fájl elérési útja, a második a fájl új elérési útja. A fájl eredeti elérési útja a $fajl változóban található. Az új elérési út számára létrehozunk egy $feltoltes_konyvtar nevû változót, amihez hozzáfûzzük a $fajl_name értéket. Ezután a copy() függvénnyel átmásoljuk a fájlt. UNIX rendszerben a kiszolgálóprogramok a 'nobody' felhaszná- 168 9. óra Mindig csak megbízható forrásból fogadjunk fájlt és ellenõrizzük, hogy programunk számára megfelelõ formátumú-e. A rosszindulat ú látogatók olyan ûrlapot készíthetnek, amelyben megegyezõ nevû elemek találhatóak, de teljesen más tartalommal, így programunk nem a várt adatokat kapja meg. Lehet, hogy ez paranoiá- nak tûnik, de jegyezzük meg, hogy a kiszolgálóoldali programoz ásban a paranoia jó dolog. Soha ne bízzunk külsõ forrásból érkezõ adatokban, még akkor sem, ha a külsõ forrás egy olyan ûrlap, amit éppen mi készítettünk. lónév alatt futnak, ezért mielõtt másolatot készítenénk a fájlról, ellenõriznünk kell, hogy a mûvelet engedélyezett-e. Az or mûvelettel a die() függvényt használjuk, ha a másolás sikertelen. Ezt a módszert a tizedik, a fájlokkal foglalkozó órában részletesebben áttekintjük. Másolás után az eredeti fájlt nem kell törölnünk, a PHP ezt megteszi helyettünk. Ha nem másoljuk vagy helyezzük át a feltöltött állományt, a fájl elvész, mivel az a PHP kód végrehajtása után törlõdik az ideiglenes könyvtárból. Amikor létrehozzuk a $feltoltes_konyvtar változót, létrehozzuk a $feltoltes_url változót is, a célkönyvtár URL címének tárolására. A lemá- solt fájlt HTML kép elemként jelenítjük meg. Összefoglalás Eddig olyan dolgokat tanultunk, amelyek segítségével igazi interaktív környezetet hozhatunk létre. Van azonban még néhány tanulnivaló. A felhasználóról képesek vagyunk információkat szerezni, de mit tegyünk ezekkel? Például fájlba írhatjuk. Ez lesz a következõ óra témája. Ebben az órában megtanultuk, hogyan használjuk a $GLOBALS tömböt, az ûrlapok adatait, a feltöltött fájlokat és a globális változókat. Megtanultuk, hogyan küldhet ünk fejlécet az ügyfélnek a böngészõ átirányítása érdekében. Megnéztük, hogyan listázzuk ki az ûrlapról kapott adatokat és rejtett mezõket használtunk, adatok átad ására a programtól a böngészõnek. Kérdések és válaszok Létre lehet hozni tömböt olyan elemek tárolására is, amelyek nem választómezõvel vagy jelölõnégyzetekkel megadottak? Igen. Minden elem, amely nevének végén üres szögletes zárójel van, tömbként tá- rolódik, így az elemek csoportba rendezhetõk. A header() függvény nagyon hasznosnak tûnik. Tanulunk még a HTTP fejlécekrõl? Magáról a HTTP-rõl még beszélünk a tizenharmadik órában. Az elemek nevének automatikus változónévvé alakítása veszélyesnek tûnik. Kikapcsolható valahol ez a lehetõség? Igen a php.ini fájl register_globals elemét kell off-ra állítani a lehetõség kikapcsolásához. Ûrlapok 169 9 Mûhely A mûhelyben kvízkérdések találhatók, melyek segítenek megszilárdítani az órában szerzett tudást. A válaszokat az A függelékben helyeztük el. Kvíz 1. Melyik környezeti változó tartalmazza a felhasználó IP címét? 2. Melyik környezeti változó tartalmaz a böngészõrõl információkat? 3. Hogyan nevezzük el az ûrlap mezõjét, hogy a rá hivatkozó globális változó $urlap_tomb nevû tömb legyen? 4. Melyik beépített tömb tartalmazza a GET kérelmen keresztül érkezõ változókat? 5. Melyik beépített tömb tartalmazza a POST kérelmen keresztül érkezõ változókat? 6. Melyik függvényt használjuk a böngészõ átirányítására? Milyen karaktersorozatot kell átadnunk a függvénynek? 7. Hogyan lehet korlátozni egy ûrlapról feltölthetõ fájl méretét? 8. Hogyan korlátozható az összes ûrlapról vagy programból feltölthetõ fájl mérete? Feladatok 1. Készítsünk számológép-programot, amelyben a felhasználó megadhat két számot és a rajtuk végrehajtandó mûveletet (összeadás, kivonás, szorzás vagy osztás ezeket ismerje a program). 2. Készítsünk programot, amely rejtett mezõ használatával megmondja, hogy a felhasználó hányszor használta az elsõ feladatban szereplõ számológépet.