Űrlapok feldolgozása I.
Szükséges előismeret: Alapok rész 1-9 lecke
Ebben a leckében arról lesz szó, hogy hogyan készíthetünk az űrlaphoz egy kiértékelő PHP kódot, és hogy abban hogyan érhetjük el az űrlappal elküldött adatokat. Az egyes űrlapelemek által küldött adatok kezelésének részleteit a következő leckében találjuk.
Az űrlap és az űrlapkezelő kapcsolata
Vegyük először a legegyszerűbb esetet: van egy html fájlunk, legyen ez az urlap.html! Ebben van egy űrlap, amiben az egyszerűség kedvéért csak egysoros szövegbeviteli mezők vannak. A többi űrlapelemmel majd a következő leckében foglalkozunk. Ehhez szeretnénk készíteni egy feldolgozo.php nevű fájlt, aminek a feladata, hogy kiírja amit a felhasználó a szövegbeviteli mezőkbe írt. A fájlok a következőképpen néznek ki:
urlap.html:
<html> <head><title>Űrlap</title></head> <body> <form> Név: <input type="text" name="nev" value="" /> <br /><br /> E-mail: <input type="text" name="email" value="" /> <br /><br /> <input type="submit" value="Elküldés" /> </form> </body> </html>
feldolgozo.php:
<html> <head><title>Űrlap feldolgozása</title></head> <body> <?php ?> </body> </html>
Látható, hogy az űrlapon két szövegbeviteli mező van, és egy űrlapelküldő gomb. Először is utasítanunk kell az űrlapot, hogy a küldéskor nyissa meg a feldolgozo.php fájlt, és adja át neki az adatokat. Ezt egyszerűen úgy csináljuk, hogy az űrlap form tegjét kiegészítjük két paraméterrel:
<form method="post" action="feldolgozo.php">
A method paraméter az adatok továbbításának módját adja meg, egyenlőre ne foglalkozzunk vele! Az action paraméterbe kell írni az űrlapfeldolgozó fájl elérési útját. Az egyszerűség kedvéért itt a két fájl ugyanabban a mappában van. Az adatok most már továbbítódni fognak a feldolgozo.php fájlnak, már csak annak a PHP kódját kell megírnunk.
Az űrlap elküldése esetén megnyílik a feldolgozó fájl, és a továbbított adatok $_POST["..."] nevű változókba kerülnek. A ... helyén annak az azonosítónak a neve áll, amit az űrlapelem name paraméterében adtunk meg. Tehát jelen esetben két változó jön létre: $_POST["nev"] és $_POST["email"]. Mindkettő egy karakterláncot tárol, értelemszerűen az első a nev azonosítójú szövegbeviteli mezőbe beírt karakterláncot, a másik pedig a másikat. Ezeket ugyanúgy használhatjuk a PHP kódban, mint bármilyen, általunk létrehozott változót! A feladat az volt, hogy írjuk ki, amit a felhasználó beírt a mezőkbe. Ennek megfelelően a feldolgozo.php fájl PHP kódja ez lesz:
<?php print "Név: ".$_POST["nev"]; print "<br /><br />"; print "E-mail: ".$_POST["email"]; ?>
És készen is vagyunk! Feldolgoztuk az űrlap által küldött adatokat.
Űrlapok különféle feldolgozási módja
Az előző példa a legegyszerűbb eset, egyetlen űrlapot dolgoztunk fel egy feldolgozó fájllal. A feldolgozó fájl egy másik weblap volt, így mikor az űrlap elküldésre került, a másik oldal ugyanúgy nyílt meg, mintha egy linkre kattintottunk volna, ami oda mutatott. A különbség annyi, hogy változókat is továbbítottunk. Sokszor szükség lehet rá, hogy az űrlap elküldésekor ne ugorjunk át egy másik fájlba, hanem a feldolgozást ugyanabban a fájlban végezzük el, ahol az űrlap kódja található. Maradjunk az előző példánál, de a feladat most legyen az, hogy az űrlap elküldésekor ne nyíljon meg egy másik fájl, hanem az űrlap fölé írjuk ki az általa elküldött adatokat!
Most tehát egyetlen fájlunk lesz, az urlap.php (php kiterjesztés kell, mivel a feldolgozó kód ebben lesz):
<html> <head><title>Űrlap és feldolgozó (2 az 1-ben!)</title></head> <body> <?php ?> <br /><br /> <form> Név: <input type="text" name="nev" value="" /> <br /><br /> E-mail: <input type="text" name="email" value="" /> <br /><br /> <input type="submit" value="Elküldés" /> </form> </body> </html>
Felmerülhet a kérdés: hova rakjuk a HTML kódon belül a <?php ... ?> PHP blokkot? Ez tulajdonképpen a probléma típusától függően változhat. Mivel a feladat az, hogy az űrlap fölé kell kiírni az elküldött adatokat, így az űrlap kódja előtt kell létrehozni. Itt a <body> tegen belül hoztuk létre, de a legjobb megoldás általában az, ha a nyitó <html> teg fölé rakjuk az űrlapfeldolgozó kódot. Ez abból a szempontból előnyös, hogy így a <head> részben lévő adatokat is dinamikusan állíthatjuk be (amennyiben szükséges), valamint a PHP kód így jobban "kiemelkedik" a HTML kódból, ami általában sokkal hosszabb, mint ebben a kis példában. Ha a <html> tegek előtt hozzuk létre a feldolgozást végző programot, akkor nyilván nem adhatunk ki ott print parancsokat! Ehelyett azt kell csinálnunk, hogy változókban tároljuk el a kiírandó adatokat, majd a <body>-n belül a megfelelő helyen kiíratjuk őket. Tehát a fenti példában már meglévő PHP blokk marad, mivel ott adjuk ki a print utasítást.
Már csak azt kell elérnünk, hogy az űrlap annak a fájlnak küldje az adatokat, amelyikben szerepel. Nyilván a legegyszerűbb, ha action paraméterként azt adjuk meg, hogy "urlap.php". Viszont alapértelmezés szerint, ha az action paraméter üres, az azt jelenti, hogy az űrlapot annak a fájlnak kell elküldeni, amelyikben szerepel, így inkább hagyjuk üresen! Ez azért jobb megoldás, mert egyrészt az űrlap kódjára ránézve azonnal látszik, hogy a feldolgozó kódot ugyanebben a fájlban kell keresni, másrészt bizonyos űrlapoknál előfordulhat, hogy a fájlnév dinamikusan (PHP segítségével) lett előállítva, így a HTML kód írásakor nem ismert. Magát az action paramétert meg kell adni, különben nem lesz elküldve az űrlap, csak az értéke egy üres karakterlánc:
<?php // feldolgozás ?> <html> <head><title>Űrlap és feldolgozó (2 az 1-ben!)</title></head> <body> <?php // feldolgozott adatok kiírása ?> <br /><br /> <form method="post" action=""> Név: <input type="text" name="nev" value="" /> <br /><br /> E-mail: <input type="text" name="email" value="" /> <br /><br /> <input type="submit" value="Elküldés" /> </form> </body> </html>
Alakul a dolog, most már csak meg kéne írni a feldolgozó kódot. Ezzel az a probléma, hogy mi van akkor, amikor a felhasználó először lép az oldalra? Vagyis nem azért nyílt meg az oldal, mert elküldte az űrlapot, az csak ezután fog megtörténni. Nyilván ilyenkor nem kapjuk meg a változókat, amikre természetesen ugyanúgy hivatkozhatunk, mint az előző pédában ($_POST["nev"] és $_POST["email"]).
Egy változó létezését az isset($valtozo) kifejezéssel vizsgálhatjuk, amely true értéket ad vissza, ha a változó létezik, false-t ha nem (lásd részletesebben az Alapok 11. leckéjében). A kerek zárójelek közé kell írni a vizsgálandó változó nevét. Ezek szerint egy elágazást kell létrehoznunk, ami a feltételében megvizsgálja az említett változók létezését:
if (isset($_POST["nev"])){
...
}
Vagyis ilyen szerkezetek lesznek a feldolgozó kódban. Az alapelv tehát a következő: megvizsgáljuk, hogy léteznek-e az űrlap által továbbküldött változók. Ha igen, akkor kiírjuk őket az űrlap fölé, ha nem, akkor nem írunk oda semmit. A teljes kiírandó szöveget a feldolgozó részben (a <html> teg fölött) hozzuk létre, majd berakjuk egy változóba, később ezt írjuk ki. A teljes program tehát így néz ki:
<?php
// feldolgozás
if (isset($_POST["nev"]) && isset($_POST["email"])){
$adatok = "Név: ".$_POST["nev"]."<br /><br />E-mail: ".$_POST["email"];
}
else{
$adatok = "";
}
?>
<html>
<head><title>Űrlap és feldolgozó (2 az 1-ben!)</title></head>
<body>
<?php
// feldolgozott adatok kiírása
print $adatok;
?>
<br /><br />
<form method="post" action="">
Név: <input type="text" name="nev" value="" />
<br /><br />
E-mail: <input type="text" name="email" value="" />
<br /><br />
<input type="submit" value="Elküldés" />
</form>
</body>
</html>
A teljes kiírandó szöveget most egy az egyben összedobtam az összefűző operátor segítségével. Ha pedig nincsenek továbbküldött adatok, akkor egy üres karakterlánc kerül kiírásra, ami olyan, mintha nem történne semmi. Fontos megjegyezni, hogy az isset nem azt vizsgálja, hogy a változó üres-e. Ha a változó egy üres karakterlánc, akkor az már létezik. Így ha a mezők kitöltése nélkül küldi el a felhasználó az űrlapot (vagyis üres karakterláncokat küld), akkor az if ág hajtódik végre.
Természetesen előfordulhat, hogy több különálló űrlap van egy fájlban! Tulajdonképpen ezzel nincs különösebb probléma, amennyiben minden űrlaphoz önálló kiértékelő fájlt hozunk létre. Ebben az esetben ugyanúgy működik a program, mint ahogy az első példában láthattuk. A lényeg csak az, hogy mindkét űrlapba raknunk kell űrlapelküldő gombot (submit). Értelemszerűen az űrlapelküldő azt a feldolgozó fájlt fogja megnyitni, amelyik ahhoz az űrlaphoz tartozik, amelyikben elhelyezkedik. Ha legalább két űrlapot ugyanaz a fájl értékel ki, akkor csak arra kell ügyelni, hogy a PHP-ben ne legyen két azonos nevű változó. Ez azt jelenti, hogy az űrlapokban nem lehet két azonos nevű azonosító (name paraméter).
Házi feladat
1.) Módosítsuk az urlap.php fájlt (vagyis amikor a feldolgozó kód ugyanabban a fájlban van, mint az űrlap) úgy, hogy ha a felhasználó az egyik mezőt üresen hagyja, akkor az ahhoz tartozó sor nem kerül kiírásra, a másik viszont igen. Pl. ha nem ad meg e-mail címet, akkor nem kerül kiírásra az "E-mail: " karakterlánc sem.
A feldolgozó kód az alábbi volt:
if (isset($_POST["nev"]) && isset($_POST["email"])){
$adatok = "Név: ".$_POST["nev"]."<br /><br />E-mail: ".$_POST["email"];
}
else{
$adatok = "";
}
Ezt kell úgy módosítani, hogy ha üres karakterlánc van az egyik változóban, akkor azt nem írjuk ki. Szét kell bontani a feltételvizsgálatot, a két változót külön-külön vizsgáljuk, és a feltételt kiegészítjük az üres karakterlánc vizsgálatával:
$adatok = "";
if (isset($_POST["nev"]) && $_POST["nev"] != ""){
$adatok .= "Név: ".$_POST["nev"]."<br /><br />";
}
if (isset($_POST["email"]) && $_POST["email"] != ""){
$adatok .= "E-mail: ".$_POST["email"];
}
Itt az $adatok karakterlánc eredetileg üres. Ha az űrlap el lett küldve (isset($_POST["nev"])), és a felhasználó beírt nevet ($_POST["nev"] != ""), akkor hozzáfűzzük a kiírandó adatokhoz az ehhez tartozó sort. Ha az e-maillel ugyanez a helyzet, akkor azt is hozzáfűzzük.







