V rámci základního kurzu jsme si už ukázali základy práce s proměnnými, ale ještě nám chybí způsob, jakým do těch proměnných dostat nějaká data od návštěvníka stránky. O tom bude tato kapitola.
Z HTML víme, že návštěvník stránky může data zadávat pomocí [odkaz]formulářů[/odkaz]. Formulář může obsahovat různé druhy
políček, má atribut action
pro určení adresy, kam se mají data odeslat (tam vyplníme adresu PHP skriptu, který
s nimi má pracovat) a atribut method
, který určuje metodu odeslání dat (GET nebo POST).
Stačí tedy v atributu action uvést adresu PHP skriptu a po odeslání formuláře se data předají tomuto skriptu.
Na straně serveru je pak možné data formuláře číst pomocí tří speciálních proměnných, které definuje samo PHP.
Jmenují se $_REQUEST
, $_GET
a $_POST
a jde o pole (viz kapitola [odkaz]o polích[/odkaz]).
Už názvy proměnných napovídají, že přijatá data jsou do nich organizovaná podle toho, jakou metodou byla odeslána. Data
přijatá metodou GET se uloží do pole $_GET, data přijatá metodou POST do pole $_POST. A kromě toho jsou data přijatá
libovolnou metodou ještě uložena v poli $_REQUEST.
Data jsou organizována tak, že klíčem je název formulářového políčka (hodnota atributu name
) a hodnotou pole
je hodnota formulářového políčka. Políčko bez atributu name se neodešle. Hodnotou přepínacího pole (radio) a výklopného
seznamu (select) je hodnota zvolené možnosti. Zaškrtávací pole (checkbox) se v případě, že není zaškrtnuté, neodešle
vůbec. Pokud zaškrtnuté je, odešle se hodnota atributu value a není-li nastavena, řetězec "on".
Příklad:
<?php // vložení hlavičky stránky, kterou jsme vytvořili ve [odkaz]4. kapitole[/odkaz] include "spolecna_hlavicka.php"; // jestliže je nastaveno $_GET["cislo"], tedy bylo něco odesláno if (isset($_GET["cislo"])) { echo "Naposledy odeslaná hodnota: " . $_GET["cislo"]; echo "<br> data GET:"; var_dump($_GET); } // níže HTML formulář pro odeslání ?> <form action="" method="get"> <label for="cislo">Zadejte číslo:</label> <input type="text" name="cislo" id="cislo"> <input type="submit" name="odeslat" value="Odeslat"> </form>
Metoda GET odešle data v adrese stránky (zkontrolujte blíže adresu po odeslání nějaké hodnoty u výše uvedeného příkladu). Metoda POST data odesílá v hlavičce HTTP požadavku a adresu stránky neovlivní. Z toho vyplývá, že u metody GET lze serveru data předat kromě formuláře i vytvořením příslušného odkazu. Vyzkoušejte k příkladu výše v prohlížeči otevřít adresu: http://localhost/k12p1.php?cislo=1 Metoda GET je proto vhodná tam, kde je toto chování přínosné, například vyhledávání. Metoda POST je pak vhodná v situacích, kdy je toto naopak nežádoucí, jako například přihlašovací formulář (jednak je nevhodné, aby přihlašovací jméno a heslo bylo viditelné v adrese a jednak by návštěvník mohl někomu poslat odkaz se svými přihlašovacími údaji.
Kontrola správnosti se liší podle typu odesílaných dat. V první řadě ale libovolný prvek může být prázdný, takže se nám budou hodit funkce isset a empty (připomeňme, že jednak mají navzájem obrácenou logiku, tj. pokud v proměnné je neprázdná hodnota, isset vrátí true a empty vrátí false, jednak isset testuje pouze zda proměnná nějakou hodnotu má, empty testuje i zda hodnota není „prázdná“, tedy prázdný řetězec, nula, false apod). V případě zaškrtávacího pole nám (vzhledem k výše popsanému mechanismu jeho fungování) tedy často stačí jen funkce empty nebo isset:
// V $zaskrtnuto bude true/false podle toho, zda checkbox "zaskrtavaci" byl/nebyl označen $zaskrtnuto = isset($_POST["zaskrtavaci"]); // Totéž pomocí funkce empty. Vzhledem k obrácené logice použijeme negaci $zaskrtnuto = !empty($_POST["zaskrtavaci"]);
Očekáváme-li celé číslo, po zkontrolování, zda je dané pole vůbec vyplněné, můžeme použít přetypování na číslo, nebo funkci intval, která udělá prakticky totéž.
<?php if (isset($_GET["cislo"])) { $cislo = (int) $_GET["cislo"]; // Nebo by šlo použít: $cislo = intval($_GET["cislo"]); } else { // hodnota pokud položka není nastavena $cislo = 0; } ?>
<?php $cislo = isset($_GET["cislo"]) ? intval($_GET["cislo"]) : 0; // Druhá varianta téhož: $cislo = isset($_GET["cislo"]) ? (int) $_GET["cislo"] : 0; ?>
U desetinných čísel lze použít analogický postup, přetypování anebo funkci floatval, ale komplikuje se to tím, že se v češtině používá desetinná čárka, zatímco v PHP desetinná tečka. Můžeme použít funkci pro nahrazení řetězce str_replace, nahradit čárku za tečku a pak zkusit převod. Použití funkce str_replace je: str_replace(nahradit co, čím, v čem) Příklad:
<?php $cislo = empty($_GET["cislo"]) ? 0 : $_GET["cislo"]; $cislo = (float) str_replace(",", ".", $cislo); ?>
mb_strlen
)
===
místo normálního
porovnávání ==
. Pro počet znaků místo bajtů použijte analogickou funkci mb_strpos.
Poznámka: Dejte pozor na kombinování „bajtových“ a „znakových“ variant, můžete pak získat neočekávané výsledky. Zároveň zejména při použití „znakových“ (mb_*) funkcí a kódování UTF-8 nezapomeňte nastavit interní kódování PHP:
mb_internal_encoding("UTF-8");
Ukažme si jako příklad jednoduchou validaci e-mailové adresy. (Poznámka: Přesná kontrola formátu e-mailové adresy je daleko složitější než by se zdálo a téměř nikde se nedělá. My si ukážeme základní jednoduchou kontrolu, důslednější kontroly se dělají pomocí regulárních výrazů, o kterých si povíme v pokročilejší části této učebnice).
<?php // vložení hlavičky stránky, kterou jsme vytvořili ve [odkaz]4. kapitole[/odkaz] include "spolecna_hlavicka.php";if (isset($_POST["email"])) { $adresa = $_POST["email"]; $kontrola = true;
// strpos vrátí false pokud tam není vůbec a 0 pokud je hned na začátku. // Ani jedno není platný e-mail, takže v tomto případě nemusíme rozlišovat. $zavinac = mb_strpos($adresa, "@");
// část adresy od zavináče do konce $zaZavinacem = ($zavinac > 0) ? mb_substr($adresa, $zavinac + 1) : "";
// Adresa není prázdná, obsahuje "@" (ne jako první znak), // část za "@" obsahuje tečku a neobsahuje další "@" if (!empty($adresa) && ($zavinac > 0) && (mb_strpos($zaZavinacem, ".") > 0) && (mb_strpos($zaZavinacem, "@") === false)) { echo "Zadaná adresa vypadá v pořádku"; } else { echo "Nebyla zadána správná e-mailová adresa"; } } ?>
<form action="" method="post"> <label for="email">Zadejte e-mailovou adresu:</label> <input type="text" name="email" id="email"> <input type="submit" name="odeslat" value="Odeslat"> </form>
K tomu slouží dvě PHP funkce:
"
) na
„"“ a apostrofy ('
) na „'“. Nastavení ENT_NOQUOTES uvozovky a apostrofy ignoruje. A výchozí režim
je nastavení ENT_COMPAT, který převede jen uvozovky (na „"“) a apostrofy ignoruje.
Výsledkem příkazu echo strip_tags("<b>Ahoj!</b>");
tedy bude řetězec "Ahoj!", čili HTML tagy se odstraní.
Výsledkem příkazu echo htmlspecialchars("<b>Ahoj!</b>");
bude řetězec "<b>Ahoj!</b>" a při jeho
vypsání do stránky se v prohlížeči objeví text „<b>Ahoj!</b>“,
Příklad:
<?php // vložení hlavičky stránky, kterou jsme vytvořili ve [odkaz]4. kapitole[/odkaz] include "spolecna_hlavicka.php"; if (isset($_POST["text"])) { echo "Naposledy odeslaná hodnota: " . htmlspecialchars($_POST["text"]); } // níže HTML formulář pro odeslání ?> <form action="" method="post"> <label for="text">Toto pole bezpečně zpracuje i HTML kód:</label> <textarea type="text" name="text" id="text"></textarea> <input type="submit" name="odeslat" value="Odeslat"> </form>