Ahoj,
pod dlouhé době jsem se zase dostal k napsání článku sem na MůjSkript.cz. Tentokrát na téma o superglobálních proměnných v $_POST a $_GET a jejich parametrech v URL adresách.
Hádám, že jste se už určitě setkali s tím, že jste měli v adresním řádku adresu podobou této:
http://domena.cz/stranka.php?kategorie=php&tema=promenne
Mám namysli ty proměnné v superglobální proměnné v PHP v $_GET: kategorie=php a tema=promenne. Superglobální proměnné jsou ty, které jsou již předem definované v jazyce PHP a my se o ně víceméně nemusíme vůbec starat. V superglobálních proměnných se ukrývají nějaké předávané parametry. Buď z nějakého formuláře, předchozího skriptu, nebo prostě jako klasický odkaz.
Mezi ty nejznámější superglobální proměnné řadíme $_GET a $_POST. Uvedu jednoduchý příklad. Pokud budeme tvořit nějaký formulář v HTML, můžeme si v hlavičce toho formuláře vybrat, jakým způsobem chceme data z formuláře odesílat. V HTML tím přesněji myslím atribut method ve formulářovém elementu form. Většinou pak také uvádíme adresu, na kterou chceme data poslat – a to pomocí dalšího atributu a to je action.
<form method="post" action="zpracuj_formular.php">
Tímto easy (čti: velmi jednoduchým) formulářem odešleme data z formulářem prostřednictvím POST souboru zpracuj_formular.php. Pokud data posíláte prostřednictvím metody POST, tak se nám tyto data skryjí a nelze je vypozorovat v URL adrese (pouze požadavky a posílanými daty).
Kdybychom chtěli (jakožto určitě chceme) tyto data z formuláře zpracovat, velmi jednoduše se k nim dostaneme v PHP v superglobální proměnné $_POST. Jak už jsem říkal, metoda POST posílá data skrytá. Nelze je tedy vyčíst z URL adresy. Například pokud bych měl takovýto formulář:
<form method="post" action="zpracuj_formular.php">
<input type="text" name="jmeno">
<input type="text" name="prijmeni">
<input type="submit">
</form>
tak data z něj v souboru zpracuj_formular.php mohu vyčíst takto:
<?php
$prvni = $_POST['jmeno'];
$druha = $_POST['prijmeni'];
?>
Což znamená, že do proměnné $prvni jsem uložil data ze superglobální proměnné $_POST, která si vzala data z formulářového políčka, které mělo name=“jmeno.“ Vlastně v těch hranatých závorkách a jednoduchých uvozovkách definuji, z jakého inputu (nebo třeba selectu) mám vybrat ty správná data.
Pokud stále někdo tápe, ukážu mu to na jiném příkladě s jinými názvy proměnný a name. Formulář bude vypadat třeba takto:
<form method="post" action="zpracuj_formular.php">
<input type="text" name="telefon">
<input type="text" name="adresa">
<input type="text" name="mail">
<input type="submit">
</form>
Tak si data vytáhnu takhle:
<?php
$nejakapromenna = $_POST['telefon'];
$dalsipromenna = $_POST['adresa'];
$nejakadalsipromenna = $_POST['mail'];
?>
Názvy těch proměnných před rovnítkem (v mém případě $nejakapromenna, $dalsipromenna, $nejakadalsipromenna) mohou být volitelné, to je na Vás. Jediné pravidlo je to, že text v hranatých závorkách a jednoduchých uvozovkách musí být vždy stejný s name v HTML. Takže abychom si to shrnuli:
- v proměnné $nejakapromenna bude uložen obsah inputu s name=“telefon
- v proměnné $dalsipromenna bude uložen obsah inputu s name=“adresa“
- v proměnné $nejakadalsipromenna bude uložen obsah inputu s name=“mail“.
Samozřejmě doporučuji používat názvy proměnných alespoň trochu více přívětivější, nejlépe takové, abychom věděli, co se v nich ukrývá. Já použil schválně jiné proměnné, abyste si nemysleli, že se musí shodovat s name v inputech. Nemusí, můžou být různé, ale můžou být i totožné. Naopak názvy u superglobálních proměnných se musí shodovat s name v inputu v HTML.
Další superglobální proměnnou je $_GET. Pomocí parametru $_GET můžeme předávat parametry veřejně dostupné v URL adrese. Uvedu příklad:
<form method="get" action="zpracuj_skript.php">
A pokud je budeme chtít zpracovat v PHP, tak to funguje úplně stejně jako u superglobální proménné $_POST, až na ten rozdíl, že nepoužijeme $_POST, ale $_GET. Takže si ukážeme zase nějaký kompletně funkční příklad. V HTML budu mít tenhle formulář:
<form method="get" action="zpracuj_formular.php">
<input type="text" name="jmeno">
<input type="text" name="mail">
<input type ="text" name="adresa">
<input type="submit">
</form>
A v PHP si pomocí superglobální proměnné $_GET data vypíšu:
<?php
$jmeno = $_GET['jmeno'];
$email = $_GET['mail'];
$adresa = $_GET['adresa'];
?>
Zase, není zde vůbec žádný problém použít jiné názvy proměnných. Například zde jsem jako proměnnou použil $email i když v superglobální proměnné a v name inputu mám jen mail. Opět to zde vůbec nevadí.
Pokud bychom chtěli zkombinovat v HTML formu metodu post a supergobální proměnnou $_GET, tak se Vám to nepovede. Respektive nezískáte žádná data. To samé platí i naopak – pokud budu v HTML formuláři definovat metodu get a v PHP ji volat jako superglobální proměnnou $_POST, nedostanu žádnou odpověď, žádná data.
Superglobální proměnné lze používat i pro všechny možné inputy, password, selecty i radio buttony, je to jedno. Vždy tu správnost ovlivňuje jen správně nastavená metoda ve formuláři a v PHP – musí se shodovat.
A teď konečně k těm slíbeným URL adresám pomocí $_GET parametrů… Vytvořte si nový soubor index.php a do jeho obsahu napište definici parametrů superglobální proměnné $_GET:
<?php
$predmet = $_GET['predmet'];
?>
Tento zápis, předpokládám, chápete. Nyní si přidáme první podmínku a to:
- pokud se obsah proměnné $predmet (což je obsah superglobální proměnné $_GET[‚predmet‘]) shoduje s textem prirodopis
- tak vypiš jednoduchou hlášku „Jsi v kategorii Přírodopis“
<?php
$predmet = $_GET['predmet'];
if ($predmet == "prirodopis"){
echo "Jsi v kategorii Přírodopis";
}
?>
Takže pokud přistoupíme na adresu http://vasedomena.cz/index.php?predmet=prirodopis, tak se nám zobrazí text „Jsi v kategorii Přírodopis“.
Nyní si zkusíme ještě trošku tu podmínku změnit, že:
- pokud se obsah proměnné $predmet (což je obsah superglobální proměnné $_GET[‚predmet‘]) shoduje s textem prirodopis
- a zároveň (to značí ty &&) pokud se obsah proměnné $tema (což je obsah superglobální proměnné $_GET[‚tema‘]) shoduje s textem obratlovci
- tak vypiš text „Jsi v kategorii Přírodopis v tématu Obratlovci“
<?php
$predmet = $_GET['predmet'];
$tema = $_GET['tema'];
if ($predmet == "prirodopis" && $tema = "obratlovci"){
echo "Jsi v kategorii Přírodopis v tématu Obratlovci";
}
?>
Takže pokud přistoupíme na adresu http://vasedomena.cz/index.php?predmet=prirodopis&tema=obratlovci, tak se nám zobrazí text „Jsi v kategorii Přírodopis v tématu Obratlovci“.
Tak, tohle by nám pro začátek mohlo stačit. Nejdříve měl být tenhle článek jenom o superglobálních proměnných, ale nějak jsem se rozepsal, tak jsem sem přidal i malou ukázku URL adresy s $_GET parametrem. V příštích dílech si ukážeme, jak rozsáhleji „opodmínkovat“ skript, jak ošetřit vstup, jak zobrazit chybovou hlášku v případě špatného parametru a ještě víc..
Tak se těšte! Příští díl bude v neděli (26.4.), nebo v pondělí (27.4.) 🙂