Metody odesílání dat (GET a POST)

Kromě běžných proměnných máme v PHP k dispozici i tzv. superglobální proměnné, které nesou informace o aktuálně zavolané stránce a data, která předáváme.

Typicky na stránce máme formulář, do kterého nám uživatel něco vyplní a my chceme tato data přenést na webový server, kde je zpracujeme v PHP.

K tomu se nejčastěji používají 2 metody:

  • GET ~ data se předávají v URL adrese jako parametry
  • POST ~ data putují skrytě společně s požadavkem na stránku

Metoda GET

Data odesílané metodou GET jsou vidět v URL adrese (takové ty texty za otazníkem), maximální délka je v Internet Exploreru 1024 znaků. Výhoda této metody je převážně v jednoduchosti (vidíte co odesíláte) a v možnosti uvést odkaz na výsledek zpracování. Data se odešlou do proměnné.

Adresa přijímací stránky může vypadat třeba takto:

http://____________.com/script.php?promenna=obsah&promenna2=obsah

V PHP poté můžeme například hodnotu parametru promenna vypsat takto:

1 echo $_GET['promenna']; // vypíše "obsah"

Důrazné varování: Tento způsob vypisování dat přímo do HTML stránky není bezpečný, protože můžeme v URL adrese přenést například HTML kód, který by se vypsal do stránky a následně provedl. Data musíme tedy nejprve ošetřit, k tomu se hodí například funkce htmlspecialchars().

Správně ošetřená ukázka bude vypadat takto:

1 echo htmlspecialchars($_GET['promenna']);   // vypíše "obsah"

Metoda POST

Data odesílané metodou POST nejsou vidět v URL adrese, což řeší problém maximální délky odesílaných dat. Metodou POST bychom měli vždy odesílat formulářová pole, protože tím zabezpečíme, že nebudou vidět například hesla a na stránku se zpracováním výsledku konkrétního vstupu nepůjde uvést odkaz.

Data jsou k dispozici v proměnné $_POST.

Ověření existence odeslaných dat

Před zpracováním jakýchkoli dat bychom měli nejprve ověřit, že data byla skutečně odeslána, jinak bychom přistupovali
k neexistující proměnné, což by vyhodilo chybové hlášení.

K ověření existence proměnné slouží funkce isset().

1 if (isset($_GET['jmeno'])) {
2     echo 'Vaše jméno: ' . htmlspecialchars($_GET['jmeno']);
3 } else {
4     echo 'Nebylo zadáno žádné jméno.';
5 }

Formulář pro vložení dat

Formulář se dělá v HTML, nikoli v PHP. Může být i na obyčejné HTML stránce. O veškerou „magii“ se stará až PHP script, který data přijme.

Pro ukázku nám může posloužit formulář pro přijmutí 2 čísel, odeslaný metodou GET:

<form action="script.php" method="get">
    První číslo: <input type="text" name="x">
    Druhé číslo: <input type="text" name="y">

    <input type="submit" value="Sečíst čísla">
</form>

V prvním řádku je vidět, kam se budou data odesílat, a jakou metodou.

Na dalších 2 řádcích jsou jednoduché formulářové prvky, všimněte si atributu name="", tam se píše jméno proměnné, do které se dosadí to, co je nyní ve formuláři.

Dále následuje tlačítko pro odeslání dat (povinné) a ukončovací HTML tag formuláře (povinné, aby prohlížeč poznal, co ještě odesílat a co ne).

Zpracování formuláře na serveru

Nyní máme již hotový HTML formulář a odesíláme jej na script.php, který data přijímá metodou GET. Adresa požadavku na stránku může vypadat třeba takto:

http://________.com/script.php?x=5&y=3

script.php

1 $x = $_GET['x'];    // 5
2 $y = $_GET['y'];    // 3
3 
4 echo $x + $y;       // vypíše 8

Správně bychom měli nejprve ověřit, že obě formulářová pole byla vyplněna, to se dělá funkcí isset():

1 if (isset($_GET['x']) && isset($_GET['y'])) {
2     $x = $_GET['x'];    // 5
3     $y = $_GET['y'];    // 3
4 
5     echo $x + $y;       // vypíše 8
6 } else {
7     echo 'Formulář nebyl správně vyplněn.';
8 }

TIP: Konstrukci isset() je možné předat více parametrů a tím ověřit, že všechny existují.

Proto místo isset($_GET['x']) && isset($_GET['y']) je možno uvést jen:

isset($_GET['x'], $_GET['y'])

Zpracování dat přijmutých metodou POST

Pokud data přijímáme metodou POST, tak URL adresa scriptu pro zpracování bude vypadat vždy takto:

http://________.com/script.php

A nikdy jinak. Prostě ne. Data jsou skryta v HTTP requestu a nevidíme je.

Skrytě metodou POST je z důvodu bezpečnosti nutné odesílat přihlašovací jména a hesla.

Varování: Pokud na webu pracujete s hesly, přihlašovací i registrační formulář by měl být umístěn na HTTPS a hesla musíte patřičně hashovat (například funkcí BCrypt).

Sponzorované odkazy
Pomohl Vám tento článek?

Odeslaná data bychom měli vždy validovat a případně uživatele upozornit, že je chceme v jiném formátu.

Jak ověřit, že bylo formulářové pole odesláno?

K ověření existence proměnné se používá funkce isset() v kombinaci s podmínkou. Vždy bychom měli uvést případné chybové hlášení.

1 <?php
2 if (isset($_GET['jmeno'])) {
3     echo $_GET['jmeno'];
4 } else {
5     echo 'Jméno nebylo vyplněno.';
6 }

Jak ošetřit script před útoky?

Veškeré uživatelské vstupy musíme nejprve ošetřit, aby nám nemohl uživatel poslat nějaký nezpečný kód, který by mohl script (nebo případně webový prohlížeč) zpracovat.

K ošetření se používá funkce htmlspecialchars().

1 <?php
2 
3 echo htmlspecialchars($_GET['jmeno']);

Jak provést validaci dat?

K validaci dat slouží podmínky, jejich přehled je v samostatném článku o podmínkách.