Lekce 7: Dotazy GET a POST
- Příkazy
$_GET a
$_POST se používají při práci s formuláři.
- Jedinej rozdíl mezi GET a POST je ten, že přes metodu POST se data přenášejí v HTTP objektu, takže nejsou vidět v URL adrese.
- Přes GET jak už nejspíš tušíte, se data přenášejí jako text a jsou vidět v URL.
- Pro práci s těmito metodami je nutné zvládat
jazyk HTML (aspoň znát tvorbu formulářů).
Tvorba formulářů
- Jako první si ukážeme, jak vytvořit formulář v HTML.
- Nebudu se moc zabývat a komentovat HTML, budu předpokládat, že máte potřebné znalosti.
// tento HTML kod je psany v souboru index.php na prvnich par radcich
- Jen tak okrajově...
form parametr
action určuje php soubor, kde je logika dotazu (co se má vykonat). A
method je právě metoda, která má být použita pro přenos dat.
- V
input parametr
name určuje název dotazu, který se bude používat jako proměnná.
- Takže máme jednoduchý formulář a teď si ukážem, jak použít metodu
GET v PHP.
if (isset($_GET['submit'])) // pokud se stiskne tlacitko odeslat
{
$jmeno = $_GET['jmeno']; // priradime jmeno do nove promenne
$heslo = $_GET['heslo']; // priradime heslo do nove promenne
echo "Vaše jméno je $jmeno a heslo $heslo"; // vypiseme
}
- Celkem nic težkého že? Jinak příkaz
isset(), který je v podmínce si přeložte jako - pokud je nastaven.
- A do hranatých závorek se píše název toho objektu, ze kterého chceme získat informace.
- Ale toto bych osobně moc nepoužil, protože přánášet jméno a heslo přes metodu GET není moc bezpečné. Spíš tedy vůbec, protože vše po odeslání vidíte jako text v URL!
Proto použijeme metodu POST.
Pozor: Nikdy nepoužívejte metodu
GET pro odesílání citlivých informací. Vše je vidět v URL!
// zde staci zamenit $_GET za $_POST
$jmeno = $_POST['jmeno'];
$heslo = $_POST['heslo'];
- Dále je nutné ještě v HTML formuláři nastavit jako metodu POST.
- Je ještě možné použít příkaz
$_REQUEST, který nerozlišuje mezi GET a POST, ale určuje se automaticky podle metody formuláře.
// opet by stacilo zamenit $_GET za $_REQUEST
$jmeno = $_REQUEST['jmeno'];
$heslo = $_REQUEST['heslo'];
- Zde se metoda přenosu bude řídit podle formuláře.
Pozor: Jak vidíte, tak všechny metody
$_GET,
$_POST a
$_REQUEST musí být velkými pismeneny!
Práce s URL
- Určitě jste si všimli, že některé weby mají URL trochu jinou, delší a někdy dost nesrozumitelnou.
- Například http://mujweb.cz/index.php?id=10 nebo něco podobného.
- Když si to rozeberem, tak předpokládám, že toto http://mujweb.cz/index.php chápete bez problémů a nyní nastavá ta část dotazu (metoda GET) ?id=10.
- Jak tedy vytvořit takovou URL? Tak se na to podiváme z pohledu kódu.
if (isset($_GET['moje'])) // pokud bude GET dotaz s nazvem "moje"
{
echo "Můj tajný text!"; // vypise text
}
- Teď stačí do URL doplnit:
http://mujweb.cz/index.php?moje a zobrazí se tajný text.
- Můžeme udělat dotaz takový jako v úvodu, že tam budě nějaké
id s hodnotou.
// pokud bude identifikator "moje" a bude se rovnat "auto"
if (isset($_GET['moje']) && $_GET['moje'] == "auto")
{
echo "Moje tajné auto"; // vypise text
}
- Po takové úpravě bude URL pro vypsání vypadat takto:
http://mujweb.cz/index.php?moje=auto.
- Dále pak máme spojování více dotazů. Co třeba, aby auto mohlo být bílé nebo černé?
// pokud bude identifikator "moje" a bude se rovnat "auto"
if (isset($_GET['moje']) && $_GET['moje'] == "auto")
{
if (isset($_GET['bile'])) // pridame dalsi dotaz na barvu "bile"
{
echo "Auto je bílé";
}
if (isset($_GET['cerne'])) // pridame dalsi dotaz na barvu "cerne"
{
echo "Auto je černé";
}
}
- Je to vlastně taková nástavba původního dotazu. Takže URL bude vypadat:
http://mujweb.cz/index.php?moje=auto&bile.
- Všimněte si, že dotazy se spojujou pomocí ampersandu
&.
Odkazy
- Každého snad napadlo mít nějaké menu a po kliknutí na odkaz by se měnila URL na index.php?id=0 na index.php?id=1.
- Tady už nastává trochu komplikovanější část. Budeme mít index.php, kde bude hlavní stránka s menu.
- Víme, že v menu budou 3 odkazy.
Odkaz A
Odkaz B
Odkaz C
- V odkazu stačí zadat pouze samotný dotaz, není nutné zadávat celý, protože se bude měnit pouze dotaz.
- Teď, můžeme použít třeba
switch na změnu stránek.
// pokud bude nastaven dotaz "id" a nebude prazdny (bude mit hodnotu)
if (isset($_GET['id']) && !empty($_GET['id']))
{
switch ($_GET['id']) // projdeme stranky
{
// seznam stranek
case "aaa": echo "A"; break;
case "bbb": echo "B"; break;
case "ccc": echo "C"; break;
}
}
- Místo
echo ve switch si můžete dát cokoliv. Nejspíše nějaký include.
- Teď se dostáváme k bodu, kdy se naučíme další příkazy -
include,
include_once,
require a
require_once.
- Příkaz
include vkládá soubor (většinou PHP soubor) do stránky. Pomocí přípony
_once se vloží pouze jednou.
- U příkazu
require je to stejné, jen s tím rozdílem, že soubor je pro stránku potřebný. Takže pokud někde v souboru, který vkládáme přes require nastane chyba,
tak to vypíše fatal error. U include to vypíše pouze error v místu, kam vkládáme soubor.
- Dále je tu další příkaz
empty(), který nám kontroluje, zda dotaz bude mít nějakou hodnotu
Dodatek: Používejte
require_once než klasický require. A pouze na soubory, které nutně stránka potřebuje (nastavení, knihovny apod.).
- Nyní se vrátíme opět k našim odkazům. Jak jsem předtím řekl, tak
echo nahradíme za
include_once, ale musíme ošetřit, aby ten soubor existoval.
// pokud bude nastaven dotaz "id" a nebude prazdny (bude mit hodnotu)
if (isset($_GET['id']) && !empty($_GET['id']))
{
$soubor = null; // uklada nazev stranky, pro kterou je dotaz
switch ($_GET['id']) // // projdeme stranky
{
// seznam stranek
case "aaa": $soubor = "A"; break;
case "bbb": $soubor = "B"; break;
case "ccc": $soubor = "C"; break;
}
if ($soubor) // pokud dotaz bude stejny jak nazev dotazu z odkazu
{
// pokud stranka bude existovat, tak ji nacte, jinak nacte hlavni stranku
include_once ((file_exists($soubor)) ? $soubor : "main").".php";
}
}
else include_once 'main.php'; // pokud dotaz bude spatny nebo zadny
- Jak vidíte, tak to moc těžké není. Jen se tu objevil nový příkaz (funkce)
file_exists(), který ještě neznáme. Ale jen název napovídá,
tak tato původní funkce zjišťuje, jestli soubor existuje nebo ne a vrací true nebo false.
- Můžete si všimnout, že u proměnné
$soubor je přiřazena hodnota
null. To znamená, že proměnná je pouze nadeklarována (vytvořena).
- Jinak pokud stránka nebude existovat, tak stránka main.php
nesmí být stejná, ve které je tento kód! To znamená, že to bude jiná stránka,
třeba novinky, ale né index, ve kterém je tento kód.
Dobrovolný domácí úkol
1) Vytvořte GET funkci (dotaz), která bude mít 2 číselné parametry, které se sečtou a vypíšou na stránku.
Tedy URL bude vypadat takto - index.php?a=10&b=20 a na stránku se vypíše součet, takže 30.
if (isset($_GET['a']) && !empty($_GET['a'])) // dotaz A
{
if (isset($_GET['b']) && !empty($_GET['b'])) // dotaz B
{
echo $_GET['a'] + $_GET['b']; // vypise vysledek
}
}
2) Vytvořte PHP soubor, kde na prvních řádcích bude v proměnné uložené heslo. Potom vytvořte jednoduchý formulář, kde uživatel zadá jméno, heslo a icq.
Toto vše se bude přenášet přes metodu POST a pokud uživatel zadá správné heslo, tak to napíše na stránku jeho jméno a icq.
A pokud uživatel zapomene zadat nejaký údaj nebo heslo bude špatně, tak tuto informaci vypíše na stránku.
$tajneHeslo = "mimic"; // tajne heslo
if (isset($_POST['submit'])) // po zmacknuti tlacitka odeslat
{
if ($_POST['jmeno'] && $_POST['icq'] && $_POST['heslo']) // pokud vstup nebude prazdny
{
if ($_POST['heslo'] == $tajneHeslo) // pokud heslo bude spravne
{
echo $_POST['jmeno']." má icq: ".$_POST['icq']; // vypise
}
else echo "Heslo není správné!";
}
else echo "Nevyplnili jste všechny údaje!";
}
3) Pomocí URL vypisujte text na stránku. Pokud zadám do URL
index.php?vypis=ahoj svete, tak to vypíše "ahoj svete".
if (isset($_GET['vypis'])) echo $_GET['vypis']; // jednoduche ze?