Superglobální proměnné v PHP (1.díl/2.série)

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.) 🙂

Napište komentář!