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é.
Budu mít dva soubory
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í:
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 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.
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().
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">
Výše uvedený nejjednodušší příklad má dva problémy.
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ď.
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.
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.
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
Jak psát web píše Yuhů, Dušan Janovský. Kontakt.