LINUXSOFT.cz Přeskoč levou lištu
Uživatel: Heslo:  
   CZUKPL

> PHP (24) - Pracujeme s formuláři

PHP umí zpracovat data z formulářů. Je to často používané a jednoduché, takže se to pojďme naučit.

14.7.2004 15:00 | Petr Zajíc | Články autora | přečteno 117403×

Komerční sdělení: Pořádáme Kurzy PHP

Internet je interaktivní záležitost. To znamená, že uživatel může nějaká data nejen od serveru požadovat, ale také je na server může poslat. K tomu slouží v HTML formuláře - a PHP je potom na straně serveru umí zpracovat.

Trocha teorie

Formulářům bude zanedlouho věnován díl sesterského seriálu věnujícímu se HTML obecně, takže k teorii jen stručně. Klasický formulář obsahuje nějaké prvky pro uživatelský vstup (třebas textová pole) a nějaké prvky pro jeho odeslání. Hodně jednoduchý formulář by tedy mohl vypadat nějak takto:

<form>
  Příjmení: <input> <input type="Submit">
</form>

A jedním dechem dodejme, že pro účely zpracování v PHP je to nepostačující. Abychom mohli formulář zpracovat pomocí PHP, měl by splňovat dvě zásady:

  • měl by mít specifikován v tagu <form> atributy method a action
  • ovládací prvky (jako jsou například textová pole) by měly mít specifikovány svůj název.

Takže o něco "správnější" formulář pro účely zpracování PHP by mohl vypadat například takhle:

<form method="get" action="zpracuj.php">
  Příjmení: <input name="prijmeni"> <input type="Submit" name="odesli">
</form>

Tolik tedy lehce k definiční části formuláře. V PHP nás ale bude zajímat především jeho zpracování.

Zpracování formuláře

Jelikož je PHP jazyk spouštěný na serveru, zpracovává se formulář pochopitelně také na serveru. V našem případě by tedy na serveru musel existovat soubor zpracuj.php, který by zadané údaje nějak vyhodnotil. Tím vyhodnocením může být prakticky jakákoli myslitelná akce. Skript může zadané údaje zapsat do souboru nebo do databáze, může je použít pro vrácení nějakých údajů z databáze nebo jiného serveru, může pomocí nich ověřit uživatele a tak dále. Prakticky jakýkoli seriál o formulářích ale začíná ukázkou, jak zaslaná data prostě jen vypsat do prohlížeče.

Tomu zůstaneme věrni i my. V našem skriptu zpracuj.php si ukážeme, jak vypsat do prohlížeče příjmení, zadané v textovém poli při zobrazení formuláře. Ještě jedna poznámka: teď budeme předpokládat, že existují dva soubory - jeden bude obsahovat formulář (viz výše) a druhý bude zpracovávat formulář. Tedy, skript pro zpracování formuláře zpracuj.php může vypadat nějak takto:

<?
  
echo "Právě mi přišel formulář. Uživatel tam jistě zadal nějaké příjmení!<BR>\n";
  echo
"Á, je to <B>".$_REQUEST["prijmeni"]."</B>";
?>

Spustit skript

Z příkladu vidíme, že PHP obsahuje asociativní pole $_REQUEST[], které obsahuje zaslaná data a zachází s nimi, jako by to byly klasické proměnné. Kdyby bylo proměnných více, bylo by více i prvků pole $_REQUEST. Abychom byli úplně přesní, dodejme, že už teď  má pole $_REQUEST dva prvky. O čemž se nevěřící Tomášové mohou přesvědčit skriptem ve stylu:

<?
  
foreach ($_REQUEST as $pole)
  {
    echo
$pole."<BR>\n";
  }
?>

Zkrátka: Ovládací prvek pro odeslání má také svoji hodnotu (je to jeho popisek) a název (odesli), takže se pole $_REQUEST bude i v našem jednoduchém případě skládat ze dvou prvků. Polužití pole $_REQUEST ná přivádí ještě k jedné důležité odbočce do teorie zpracování formulářů, a tou je

GET a POST

Obecně vzato lze formuláře odesílat jak pomocí metody GET (tak jsme to dělali v našem příkladu), tak i pomocí metody POST. K tomu je dobré uvědomit si následující věci:

  • metodu odesílání stanovujeme v úvodním tagu <FORM> pomocí atributu method. Když atribut vynecháme, použije se GET
  • pokud skript zpracovává formulář, je v asociativním poli $_REQUEST obsah proměnných při použití kterékoli z obou metod
  • metody GET a POST jsou rozdílné a každá se hodí na něco jiného

Metoda GET posílá data z formuláře jako součást URL. Neboli, data se objeví v poli Adresa Vašeho prohlížeče. Z toho vyplývá, že se tento postup hodí dobře pro data, která jsou krátká a u kterých nevadí, když si je někdo přečte. Mějte rovněž na paměti, že když si data může někdo přečíst, může je taky změnit. Takový člověk pak může udělat "formulář sám ze sebe" a poslat ke zpracování data, která vůbec nebyla vytvořena odesláním zdrojového formuláře, ale byla zadána třebas jako součást adresy do prohlížeče.

Naproti tomu POST nepřidává data do URL, ale odesílá je jako samostatný HTTP objekt. Z toho vyplývá jednak to, že odesílaná data mohou být podstatně delší než u GET, a jednak to, že je odesílatel nemůže tak snadno změnit například vhodným zásahem do adresy.

Pozn.: Ale může je změnit zásahem do komunikace mezi serverem a klientem. Takže, metoda POST je jen o něco bezpečnější než GET.

Kterou metodu vybrat je otázka pro programátora. Pro jemnější rozlišení jsou v PHP kromě pole $_REQUEST rovněž pole $_GET a $_POST, která se naplní proměnnými v případě, že formulář byl odeslán metodou GET nebo POST. Což se hodí v případě, kdy budete chtít mezi těmito metodami rozlišovat.

A já sám, vždycky sám...

V úvodu jsem prohlásil, že jeden soubor obsahuje samotný formulář a druhý soubor jej zpracovává. To nemusí být vždycky pravda. Lze napsat skript, který bude formulář jak obsahovat, tak taky zpracovávat. Což může mít výhody a nevýhody. Výhodou může být jednoduchost - místo dvou souborů je jen jeden. Nevýhoda je ta, že si tím trochu svazujeme ruce - je obtížnější zpracovávat dva formuláře jedním skriptem a definice formuláře musí být v souboru php, ne htm.

Situace, kdy je v jednom souboru formulář i jeho zpracování, se ale používá docela často. Docela zajímavý problém je pak ten, jak má nebohý skript poznat, jestli po něm chceme: a) zobrazit formulář a zadat hodnoty, nebo b) už se zadávalo a on by měl zpracovat výsledky.  Ukážu Vám dva způsoby, jak to udělat a použiji přitom náš formulář výše. Takže, první způsob:

<?
  
if (!$_REQUEST["UzJsemToOdeslal"])
  {
?>
<form method="get" action="25_jeden.php">
  Příjmení: <input name="prijmeni">
    <input type="hidden" name="UzJsemToOdeslal" value="1">
    <input type="Submit" name="odesli">
</form>
<?
  
}
  else
  {
  echo
"Mám tě, odeslaný formuláři! Tys vyplnil ".$_REQUEST["prijmeni"];
  }
?>

Spustit skript

Spočívá to v tom, že vytvoříme skryté pole (hidden) formuláře, které sice uživatel neuvidí, ale skript sám jej obdrží jakožto jeden z prvků pole $_REQUEST. A pokud ho neobdrží, znamená to, že formulář ještě nebyl odeslán a měl by se tedy zobrazit, ne zpracovat. Je zajímavé, že to používá většina lidí.

Druhá metoda spočívá v tom, že vůbec nebudeme zavádět žádná další skrytá pole formuláře, ale prozkoumáme PHP pole $_REQUEST. Je jasné, že když bude toto pole prázdné, formulář jsme ještě neodeslali. Může to vypadat nějak takhle:

<?
  
if (empty ($_REQUEST))
  {
?>
<form method="get" action="source.php">
  Příjmení: <input name="prijmeni">
    <input type="Submit" name="odesli">
</form>
<?
  
}
  else
  {
  echo
"Mám tě, odeslaný formuláři! Tys vyplnil ".$_REQUEST["prijmeni"];
  }
?>

Co z toho použijete je pochopitelně jen na Vás. Přijde mi ale dobré využívat možnosti jazyka, když už jsou tak bohaté. Příště si ukážeme, jak data z formulářů ověřovat.

Verze pro tisk

pridej.cz

 

DISKUZE

Zkritizuju se sám 14.7.2004 19:49 Petr Zajíc
L Re: Zkritizuju se sám 15.7.2004 16:02 Michal Vyroubal
Superglobální pole 17.7.2004 19:56 Petr Zajíc
Změna při každém odeslání formuláře 19.2.2008 20:36 Dan Pelíšek
L Re: Změna při každém odeslání formuláře 22.7.2008 11:52 Lukáš Pop
Kontrola zpracovanosti pomocí empty($_REQUEST) 26.8.2010 12:29 Leoš Junek




Příspívat do diskuze mohou pouze registrovaní uživatelé.
> Vyhledávání software
> Vyhledávání článků

8.5.2016 17:19 /Redakce Linuxsoft.cz
PR: Dne 26.5.2016 proběhne v Praze konference Cloud computing v praxi. Tématy bude např. nejnovější trendy v oblasti cloudu a cloudových řešení, cloudové služby, infrastruktura cloudu, efektivní využití cloudu, možné nástrahy cloudů a jak se jim vyhnout
Přidat komentář

21.4.2016 8:01 /František Kučera
Spolek OpenAlt zve na 127. distribuovaný sraz příznivců svobodného softwaru a otevřených technologií (hardware, 3D tisk, SDR, DIY, makers…), který se bude konat ve čtvrtek 28. dubna od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).
Přidat komentář

2.3.2016 22:41 /Ondřej Čečák
Letošní ročník konference InstallFest již tento víkend!
Přidat komentář

14.2.2016 16:39 /Redakce Linuxsoft.cz
O víkendu 5. a 6. března 2016 proběhne na pražském Strahově 8. ročník tradiční konference InstallFest. Celkem za dva dny uvidíte ​30 přednášek​ a ​6 workshopů.
Přidat komentář

5.2.2016 17:38 /Petr Ježek
Utilitka z XFce "xfce4-power-manager" nejen umožňuje nastavení lhůty pro uspání či hybernaci, ale i zapínání a vypínání prezentačního módu pro nerušené sledování videí. Stačí ji nastavit v každém vybavenějším panelu a v jakémkoli nontiled WM/DE.
Přidat komentář

10.1.2016 11:32 /Pavel `Goldenfish' Kysilka
LinuxMarket změnil provozovatele. Nově jej provozuje Marek Pszczolka. Více info a detaily #1 a #2.
Přidat komentář

29.12.2015 11:38 /Ondřej Čečák
Ještě posledních pár dní můžete přidávat příspěvky nebo nápady na Install Fest 2016, který se bude konat 5. a 6. března 2016.
Přidat komentář

8.12.2015 11:36 /Petr Ježek
Logické se stává realitou. LibreOffice a Thunderbird se mají dle článku na Redditu stát protiváhou MS řešení (MS Office a Outlook).
Přidat komentář

   Více ...   Přidat zprávičku

> Poslední diskuze

10.6.2016 21:10 / pavel riha
FreeBSD 10.3 a virtualizace

8.6.2016 21:56 / Milan Gallas
Nevalidní prefix m

7.5.2016 14:58 / Teodor Komárek
Soubory

20.4.2016 0:07 / Jakub Cleing
Sázkový panel PHP FUSION

9.4.2016 9:43 / jiwopene@gmail.com
Re: problém s dpkg a nemožností instalovat

Více ...

ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2016) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze