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, má obmedzenú dĺžku a nehodí sa napríklad na odosielanie príspevkov do diskusie. Vtedy používame metódu POST (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="get"> <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 = ($_GET['napoj'] == "kava") ? "kávu" : "čaj"; if ($_GET['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 SELECTu hranaté zátvorky, aby sa hodnoty ukladali do poľa.
<form action="vyskum.php"> <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), $_GET['pouzivam'][0] bude CD a $_GET['pouzivam'][1] bude DVD.
Pomocou isset zistíme, či premenná existuje, a ak áno, prejdeme pole príkazom foreach.
<?php if (isset($_GET['pouzivam'])) foreach ($_GET['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.