Jedna z najdôležitejších vlastností PHP je možnosť spracúvať dáta získané z HTML formulárov (tag FORM
). Vaše skripty teraz konečne získajú plný význam - budete môcť reagovať na to, čo zadá užívateľ (volá sa to tiež „vstup“).
Najskôr si vysvetlíme, ako formuláre fungujú. Dajme tomu, že máme súbor zadaj.html s jednoduchým formulárom. V ňom sú ňom dva textové políčka s jedným odosielacím tlačidlom:
<form action="spocitaj.php" method="get"> Prvé číslo: <input name="prve"><br> Druhé číslo: <input name="druhe"><br> <input type="submit" value="Spočítaj"> </form>
Súbor spocitaj.php bude mať za úlohu spočítať dva čísla, zadané v textových políčkach s názvami prve
a druhe
. Zatiaľ však doňho napíšeme iba:
<?php ?>
Otvorte stránku zadaj.php v prehliadači a skúste zadať napríklad čísla 5 a 8. Stlačte odosielacie tlačidlo. Zobrazí sa prázdna stránka, čo je v poriadku. Všimnite si však adresu stránky, ktorá sa vám práve načítala:
http://localhost/spocitaj.php?prve=5&druhe=8
Za názvom súboru nasleduje otáznik a páry názov=hodnota, oddelené znakom &
. Podobným spôsobom môžete používať adresy aj sami (bez pomoci formulárov), napr.:
<a href="zobraz.php?id=vlaky">Vlaky</a>
Ešte musím poznamenať, že ak dáme tlačidlu meno a hodnotu, tieto údaje sa tiež odošlú.
To som ale trochu odbočil od témy.
Teraz si ukážeme, ako tieto údaje získať v jazyku PHP. Keďže ako metódu formulára (atribút METHOD
) sme zvolili GET, k údajom budeme pristupovať pomocou poľa $_GET. To obsahuje prvky s indexmi nazvanými podľa atribútov NAME
jednotlivých políčok. Napríklad tento kód vypíše hodnotu políčka prve
:
<?php echo $_GET['prve']; ?>
Keďže chceme hodnoty políčok spočítať, upravíme kód takto:
<?php echo $_GET['prve'] + $_GET['druhe']; ?>
Pripravil som pre vás aj funkčnú ukážku:
Metóda GET, ktorú sme použili, je vhodná pre akcie, ktoré nemenia stav servera, iba zobrazujú informácie. Ak by sme ju použili napr. na uloženie hlasu do ankety, pri každej návšteve našich stránok indexovacím robotom (napr. Googlebotom) by sa zaznamenal nový hlas. Aj preto existuje metóda POST. Medzi nevýhody GET-u patrí tiež obmedzená dĺžka parametrov.
Metódu POST použijeme jednoducho - zmeníme atribút METHOD
formulára. Dáta tu nie sú ukladané do adresy. Pristupujeme k nim pomocou poľa $_POST
.
Samozrejme, že textové políčka nie sú jediný spôsob, ako získať od užívateľa informácie. Vezmime si napr. štvorcové zaškrtávacie políčko. To nastaví svoju hodnotu na on
, ak je zaškrtnuté. V PHP má neprázdny reťazec pravdivú logickú hodnotu, čo sa dá využiť pri tvorbe podmienky. Ako príklad uvediem zdrojový kód súboru uvar.php:
<form action="uvar.php" method="post"> <input type="checkbox" name="cukor"> s cukrom <input type="submit" value="Uvar kávu"> </form> <?php if ($_POST['cukor']) echo "Prajete si kávu s cukrom."; else echo "Prajete si kávu bez cukru."; ?>
Iste ste zistili, že odosielací formulár a prijímací skript môžu byť tá istá stránka.
Guľaté výberové políčko je jednou z foriem, ako si užívateľ môže vybrať jednu z ponúkaných možností.
<form action="uvar.php" method="post"> <input type="radio" name="napoj" value="kava"> káva <input type="radio" name="napoj" value="caj" checked="checked"> čaj <input type="checkbox" name="cukor"> s cukrom <input type="submit" value="Uvar"> </form> <?php $napoj = ($_POST['napoj'] == "kava") ? "kávu" : "čaj"; if (isset($_POST['cukor'])) echo "Prajete si $napoj s cukrom."; else echo "Prajete si $napoj bez cukru."; ?>
Nasledujúci príklad bude trochu náročnejší.
Vyskúšajme výberové pole (tag SELECT
) s možnosťou výberu viacerých možností naraz (atribút MULTIPLE
). V tomto prípade je nutné dať za názov SELECT
u hranaté zátvorky, aby sa hodnoty ukladali do poľa.
<form action="vyskum.php" method="post"> <select multiple="multiple" name="pouzivam[]"> <option>CD</option> <option>DVD</option> </select> <input type="submit" value="Hlasuj"> </form>
Napríklad, ak v prehliadači vyberiete obidve možnosti (tlačidlom Ctrl), $_POST['pouzivam'][0] bude CD a $_POST['pouzivam'][1] bude DVD.
Pomocou isset
zistíme, či premenná existuje, a ak áno, prejdeme pole príkazom foreach
.
<?php if (isset($_POST['pouzivam'])) foreach ($_POST['pouzivam'] as $medium) echo "Používam $medium. "; ?>
Obrázkové tlačidlo má oproti bežnému jednu zvláštnu vlastnosť - odosiela aj súradnice, kde užívateľ klikol.
Napríklad, tlačidlo sa volá odosli
a metóda formulára je GET. X-ová súradnica bude uložená v premennej $_GET['odosli_x'], y-ová v $_GET['odosli_y'].
Predstavte si, že podobným spôsobom vytvoríte napr. diskusné fórum. Príspevky budete ukladať do súboru a potom ich vypíšete. Na vašu stránku príde nejaký užívateľ a ako text príspevku vloží:
<script> alert("Pozor!"); </script> <img src="http://hnusne-reklamy.com/1.jpg">
Každému návštevníkovi, ktorý sa potom dostane na vaše fórum, sa zjaví JavaScriptové výstražné okno a nejaký obrázok (napr. reklama).
To je samozrejme nežiadúce. Preto je potrebné nejako tieto dáta zakódovať, aby sa z nich stal obyčajný text. Na to slúži funkcia htmlspecialchars
. Prevedie špeciálne HTML znaky na entity.
$prispevok = htmlspecialchars($prispevok); ...
Potom sa text na stránke zobrazí doslovne a žiaden skript ani obrázok tam nebude.