Zpracování formulářů v PHP

Začínající autory stránek vždycky mrzí, že zajištění funkčnosti formulářů není žádná sranda. Jakmile ale pochopíte základy formulářů (včetně způsobu, kterým předávají data přes adresu), zpracování v PHP bude relativně snadné. 

Nejjednodušší příklad

Budu mít dva soubory

  1. formular1.html s jedním vstupním polem (úplně obyčejné HTML)
  2. zpracovani_formulare1.php s php kódem

Soubor formular1.html (Vypisuji bez hlaviček.):

<body>
<form method="GET" action="zpracovani_formulare1.php" >
<p>Zadejte oblíbené jídlo: 
<input type="text" name="jidlo" size="20"> 
<input type="submit" value="Odeslat"></p>
</form>
</body>

A soubor zpracovani_formulare1.php:

<body>
<H1>Zpracování formuláře</h1>
<p>Výborně! Zajdeme si někdy na čaj a k tomu si dáme 
<?php echo $_GET["jidlo"] ?>!
</body>

Příklad si můžete zobrazit (pozn.: pokud mi na serveru neběží PéHáPka, nebude to fungovat). Pozor, tento nejjednodušší příklad slouží jenom pro výuku. V praxi je nebezpečný. Níže mám bezpečnější verzi s ošetřenými chybami.

Všimněte si prosím těchto věcí:

  1. Formulář má nastavenou action na jméno php souboru, který to bude zpracovávat. 
  2. Ten PHP soubor obsahuje jak obyčejné HTML (<p>Výborně...), tak PHP kód oddělený znaky <? a ?>. Vše, co je mezi nimi, je PHP program, který server vyhodnocuje (to je to echo $_GET["jidlo"]).
  3. Formulář obsahoval vstupní pole (<input>) se jménem name="jidlo". PHP skript přebírající formulář si vytvoří pole automaticky založí pole $_GET, které obsahuje klíč jidlo. Takže $_GET["jidlo"] bude obsahovat to, co uživatel před odesláním zadal do pole formuláře s názvem jidlo. (Ten dolar $ je pro PHP označení, že jde o proměnnou.)

PHP příkaz echo pak už jenom vypíše hodnotu proměnné a celé to odešle prohlížeči. (Samozřejmě se s tou proměnnou dají dělat i úpravy, např. zjistit, zda není prázdná atd. PHP má celou řadu příkazů. PHP má celkem mohutné možnosti práce s proměnnými. Cokoli, co začíná znakem $, je v PHP proměnná.)

Ještě jednou obrázkem:

Více formulářových polí

V příkladu jsem zatím měl jediné formulářové políčko (to jídlo). Ve formuláři můžu mít políček kolik chci. Jediné, co je důležité, aby měly rozdílná jména, tj. atribut name. Formulář potom při odesílání seskládá proměnné do URL za sebe a oddělí je znakem &. Například:

zpracovani-formular.php?jidlo=ryby&piti=sodovka&kytky=ruze

V PHP následně není potřeba se o nějaký znak & starat: ve skriptu budou v pohodě dostupné proměnné $_GET["jidlo"], $_GET["piti"] a $_GET["kytky"]. Také nezáleží na pořadí, ve kterém jsou v URL proměnné uvedeny.

Jak to někam uložit

V tomhle článku probírám jenom jednoduchou komunikaci formulářů s php skripty. Takže nebudu popisovat ukládání, jenom naznačím, jak se to dělá.

Asi chápete, že jakmile už má PHP skript na serveru hodnotu z formuláře, může s ní dělat úplně cokoliv. Já jsem v příkladu ukázal tu nejjednodušší věc -- vypsání do stránky. PHP ale tu hodnotu může zapsat do databáze, do souboru na serveru, poslat ji mailem, nebo něco jiného.

Pro zapisování do databáze hledejte ve vyhledávači něco jako PHP SQL insert into. Databáze jsou trochu složitější, malinko jsem je nakousnul v článku Možnosti PHP a Vytvoření databáze a tabulky v MySQL, ale přímo vkládání do databáze zatím nepopisuji nikde.

Zapisování do souboru se v PHP dělá příkazem fwrite().

Posílání mailem se dělá příkazem mail().

Odesílání přes POST

Když se formulář odesílá metodou post, místo $_GET se musí psát $_POST. Get je výchozí metoda, takže pro první pokusy si vystačíte s $_GET. Přes POST se posílají až větší data, typicky dlouhé texty, maily apod.

Zatímco při metodě GET komunikují stránky pomocí URL v prohlížeči (query string za otazníkem), při metodě POST cestují data úplně jiným požadavkem. Ovšem zpracování v PHP je úplně stejné. Jediný rozdíl ej to $_POST[] namísto $_GET[].

Aby se posílalo metodou POST, je potřeba v HTML nastavit u tagu <form> atribut method na hodnotu "post":

<form action="zpracovani.php" method="post">

Formuláře bezpečně

Výše uvedený nejjednodušší příklad má dva problémy.

  1. proměnná nemusí v URL existovat
  2. v proměnné může být nebezpečný kód

V příkladu uvedeném na začátku tohoto návodu bezpečnost neřeším, aby byl co nejjednodušší. Na to je čas teď.

Zjištění existence proměnné - isset()

v URL nemusí být proměnná uvedena. Může se to stát chybným odesláním formuláře nebo ji může uživatel z URL prostě smazat. Proto je potřeba před použitím proměnné ověřit, jestli existuje.

Jak ošetřit, jestli proměnná z formuláře (obecně z URL) dorazila? Podmínkou a funkcí isset. Funkce isset() vrací true, pokud je proměnná nastavená (v tomto případě pokud je v GET parametrech). Příklad:

if(isset($_GET["jidlo"])===true) { // proměnná existuje
    $jidlo = htmlspecialchars($_GET["jidlo"]);
}
else { // proměnná neexistuje
    $jidlo = ""; // naplnění jinou hodnotou
    // nebo chybová hláška
}

Kdybych totiž ve skriptu použil rovnou $_GET["jidlo"] bez kontroly, jestli parametr jidlo dorazil, tak by to vyhazovalo chybové hlášky a skript by mohl dělat něco jiného, než jsem chtěl.

Odstranění nebezpečných znaků

Větší problém je v tom, že nějaký útočník může do proměnné zadat přes URL libovolný řetězec. Třeba javascript nebo SQL příkaz, které se můžou vykonat v prohlížeči nebo dokonce na serveru. Tomu se brání použitím funkce htmlspecialchars(), která v hodnotách proměnných nahradí nebezpečné znaky za jejich html entity, které nebezpečné nejsou. Funkci htmlspecialchars() už jsem uvedl v příkladu výše.

Prastaré proměnné $nazev

V PHP do verze 3 stačilo namísto $_GET["jidlo"] napsat $jidlo. To ale je strašně nebezpečné, protože potom by šlo aplikaci vnutit libovolnou proměnnou, kterou by útočník uvedl v URL za otazníkem. Proto se to musí zadávat takhle složitěji s GET, podtržítkem a závorkami.

Tolik jenom drobný nástin o zpracování formulářů v PHP. 

Stránka vytvořena 17. 2. 2016, hrubá aktualizace 13.6.2020

 

Reklama

www.webhosting-c4.cz, extra rychlý SSD webhosting s doménou v ceně
o tvorbě, údržbě a zlepšování internetových stránek

Návody HTML CSS JavaScript Články Ostatní

Encyklopedie FrontPage Reklama PHP Server

Jak psát web píše Yuhů, Dušan Janovský. Kontakt.