Pouze tento týden sleva až 80 % na e-learning týkající se C# .NET
Využij akce až 80% zdarma při nákupu e-learningu. Více informací .
BF summer

Lekce 5 - Asociativní pole v PHP a obsluha formulářů

V předešlém cvičení, Řešené úlohy k 1.-4. lekci PHP, jsme si procvičili nabyté zkušenosti z předchozích lekcí.

Dnes si v PHP tutoriálu rozšíříme znalosti ohledně polí a hned je prakticky využijeme k vytvoření webové kalkulačky. Ano, konečně budeme reagovat na nějaký vstup od uživatele :)

Asociativní pole

Druhý typ polí v PHP je tzv. pole asociativní. Funguje úplně stejně, jako číselně indexované, ale indexy již nejsou čísla, ale textové řetězce. Indexům v tomto typu polí říkáme klíče.

Asociativní pole definujeme podobně jako číselně indexované, jen kromě hodnot zadáváme i klíče. K tomu používáme operátor dvojité šipky (=>):

$oblibeneVeci = array(
    'homer' => 'kobliha',
    'marge' => 'trouba',
    'bart' => 'prak',
    'liza' => 'kniha',
    'meggie' => 'dudlík',
);

Zápis pole jsme rozdělili kvůli přehlednosti do více řádků, ale šlo by to i v jednom. V poli máme 5 hodnot: 'kobliha', 'trouba', 'prak', 'kniha', 'dudlík'. Každá hodnota patří nějakému klíči ('homer', 'marge', 'bart', 'liza', 'meggie'). Hodnoty přiřadíme ke klíči pomocí šipky a oddělujeme čárkou, která se většinou píše i za poslední položkou. Nezapomenete ji tak napsat až do pole budete přidávat další prvek.

Mimochodem, všimněte si, že pokud vytváříme proměnnou, jejíž název zahrnuje více slov, použijeme tzv. velbloudí notaci. První písmeno malé a každé počáteční písmeno dalšího slova velké. Lidé v PHP píší různě, ale tato konvence je bezesporu nejlepší.

Pro práci s asociativním polem platí to samé, jako jsme si ukazovali minule u pole číselně indexovaného:

echo('Homer má rád: ' . $oblibeneVeci['homer']);

Místo abychom napsali $oblibeneVeci[0], použijeme textový klíč. Obrovskou výhodou je přehlednost. Vidíme, co z pole vytahujeme, na rozdíl od číselného indexu, který nám mnohdy nic neříká.

Každé číselně indexované pole lze zapsat jako pole asociativní a to takto:

$batoh = array('provaz', 'svítilna', 'peněženka');

$batoh2 = array(
    0 => 'provaz',
    1 => 'svítilna',
    2 => 'peněženka',
);

print_r($batoh);
print_r($batoh2);

Z výpisu vidíme, že pole $batoh a $batoh2 jsou naprosto stejná. PHP totiž vnitřně zná jen pole asociativní a když založíme číselně indexované, jednoduše vytvoří indexy podle pořadí položek.

Ve většině jazyků je pole omezené svou velikostí a když se jednou vytvoří, nelze do něj prvky přidávat. V PHP tomu tak není, s polem si můžete dělat úplně co chcete.

Zpracování formulářů v PHP

Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

Konečně se dostáváme k něčemu zajímavému. Pravé aplikace přeci reagují na vstup od uživatele. Zkusme si takovou aplikaci vytvořit - naprogramujeme si jednoduchou webovou kalkulačku.

Webové aplikaci lze předat vstup pomocí dvou metod - GET a POST. HTTP protokol zná ještě několik dalších metod (REST), ale prohlížeče je nepodporují. Data dorazí do PHP skriptu vždy v asociativním poli, které se jmenuje podle metody, kterou přišla.

Vytvořme si nějakou složku pro novou aplikaci (třeba kalkulacka/).

Metoda GET

Vytvořte si soubor kalkulacka.php. Pokud budeme tomuto skriptu chtít předat nějaká data metodou GET, zadáme je do URL adresy pomocí tzv. query stringu. Query string začíná otazníkem (?) a jednotlivé parametry jsou oddělené ampersandy (&). Mezi názvem parametru a jeho hodnotou je rovná se (=).

Do URL adresy bychom tedy zadali toto:

localhost/kalkulacka/kalkulacka.php?cislo1=10&cislo2=20

Skriptu předáváme metodou GET dvě proměnné. První se jmenuje cislo1 a má hodnotu 10, cislo2 má hodnotu 20.

Obsah skriptu by mohl být následující:

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Kalkulačka</title>
    </head>
    <body>
        <?php
            $soucet = $_GET['cislo1'] + $_GET['cislo2'];
            echo("Součet: $soucet");
        ?>
    </body>
</html>

Skript pracuje s tzv. superglobálním polem $_GET. Superglobálním proto, že je přístupné odkudkoli. Všechny proměnné, které byly skriptu odeslány v query stringu, nalezneme v tomto poli. Pole je asociativní, jako klíč zadáme název proměnné a dostaneme její hodnotu. Součet hodnot jednoduše vypíšeme.

Výsledek:

Kalkulačka
localhost/kal­kulacka/kalku­lacka.php?cis­lo1=10&cislo2=20

Metoda GET slouží spíše pro získávání podstránek webu a pro kalkulačku se příliš nehodí.

Metoda POST

Metoda POST se obvykle používá pro odesílání formulářů. Naše aplikace se bude nyní skládat ze dvou souborů. V prvním bude formulář, kam uživatel zadá 2 čísla do textových polí a odešle tlačítkem "vypočítej". Data se odešlou druhému souboru, což bude PHP skript, který provede výpočet.

kalkulacka.html

Soubor obsahuje formulář. Můžeme mu dát koncovku PHP, ale není to nutné, žádné PHP bloky zde nejsou. Pokud soubor pojmenujete index, zobrazí se samozřejmě jako výchozí stránka, když do složky kalkulacka/ přistoupíte. Soubor bude vypadat asi takto:

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Kalkulačka</title>
    </head>
    <body>
        <p>Vítejte v kalkulačce, zadejte 2 čísla a získejte jejich součet.</p>

        <form method="POST" action="soucet.php">
            <input name="cislo1" type="text" /><br />
            <input name="cislo2" type="text" /><br />
            <input type="submit" value="Sečti" />
        </form>

    </body>
</html>

Výsledek by měl vypadat takto:

Kalkulačka
localhost/kal­kulacka/kalku­lacka.html

Na HTML stránce máme formulář a v něm pár vstupních textových polí typu text. Pokud ctíte HTML 5, můžete použít jako typ polí ve formuláři "number". Poslední pole je odesílací tlačítko, které vyvolá odeslání formuláře.

Zajímavější jsou atributy formuláře. method="POST" udává způsob, jakým se data z formuláře odešlou. Ačkoli POST není výchozí hodnota, nedává pro formuláře příliš smysl používat žádnou jinou. Pokud bychom atribut neuvedli, použila by se metoda GET, kde by formulář odeslal data jako query string do URL adresy. Tak by byly jednak vidět a také je délka adresy omezená. Používejte tedy vždy POST. action označuje skript, který formulář zpracuje. Pokud atribut neuvedeme, odešle se formulář do toho samého souboru, ve kterém se nachází.

soucet.php

Soubor je skript s obslužným kódem, kterému se data z formuláře odešlou a on je zpracuje. Asi vás nepřekvapí, že data z formuláře přijdou v superglobálním poli $_POST. Opět je asociativní a klíčem jsou názvy textových (nebo jiných) polí, tedy jejich atributy name.

Obsah skriptu bude následující:

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Kalkulačka</title>
    </head>
    <body>
        <?php
            $soucet = $_POST['cislo1'] + $_POST['cislo2'];
            echo("Součet: $soucet");
        ?>
    </body>
</html>

Oproti obslužnému skriptu pro metodu GET se vlastně vůbec nezměnil. Můžete si vyzkoušet, že kalkulačka opravdu počítá :)

V následujícím cvičení, Řešené úlohy k 5. lekci PHP, si procvičíme nabyté zkušenosti z předchozích lekcí.


 

Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 2120x (1.15 kB)
Aplikace je včetně zdrojových kódů v jazyce PHP

 

Předchozí článek
Řešené úlohy k 1.-4. lekci PHP
Všechny články v sekci
Základní konstrukce jazyka PHP
Článek pro vás napsal David Čápka
Avatar
Jak se ti líbí článek?
61 hlasů
David je zakladatelem ITnetwork a programování se profesionálně věnuje 13 let. Má rád Nirvanu, sushi a svobodu podnikání.
Unicorn university David se informační technologie naučil na Unicorn University - prestižní soukromé vysoké škole IT a ekonomie.
Aktivity (19)

 

 

Komentáře
Zobrazit starší komentáře (130)

Avatar
Patrik Hudec
Člen
Avatar
Patrik Hudec:13.12.2019 10:14

Zdravím, zkoušel jsem podle návodu udělat kalkulátor přes $_GET, ale vyhazuje mi to chybu na ten řádek, kde je to zapsané.
Zkoušel jsem stáhnout přiložený soubor a otevřít jej, ale ten mi vyhazuje uplně stejnou chybu
"do not access superglobal $_post array directly" ,nevíte někdo co s tím? (přes html mi kalkulátor funguje)

Používám Notbeans IDE 8.2 a XAMP 3.2.4.

 
Odpovědět
13.12.2019 10:14
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Patrik Hudec
David Čápka:13.12.2019 10:29

Ahoj, to není chyba, ale warning NetBeans, skript normálně spustíš.

Odpovědět
13.12.2019 10:29
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Daniel Ondřich:29.3.2020 12:25

Zdravím mám problém s tou funkcí _GET když nastavím url jako v článku (localhost/kal­kulacka/kalku­lacka.php?cis­lo1=10&cislo2=20) a zdrojový kód udělám taky podel vás a pak chci stránku spustit tak mně to hodí na stránky XAMPU nevíte prosím někdo co s tím :)

 
Odpovědět
29.3.2020 12:25
Avatar
Gina Jana Dvořáková:15.4.2020 12:48

Tak metoda PHP bohužel nefunguje. HTML se zobrazí, ale PHP nepočítá a je tam nějaká chyba :-( Nevím co jsem přehlídla :-(

 
Odpovědět
15.4.2020 12:48
Avatar
Gina Jana Dvořáková:15.4.2020 18:27

Tak už funguje, ale nechápu tu chybovou hlášku pod ní?

 
Odpovědět
15.4.2020 18:27
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
ezekil
Člen
Avatar
Odpovídá na Gina Jana Dvořáková
ezekil:25.4.2020 12:43

Ahoj nebude to tým že máš všetko v jednom súbore? skús zmazat položku action=soucet.php alebo php script dat zvlast do suboru soucet.php

 
Odpovědět
25.4.2020 12:43
Avatar
Pavel Kubalík:18.11.2020 15:20

Dobrý den
Uzavírám tuto lekci, i když jsem možná něco (nevím co) nepochopil a v následném test jsem měl tedy problémy.
První příklad jsem udělal bez problému.
Druhý příklad mě dlouho trápil. Z textu lekce pět jsem nepochopil, že je to stejné jako POST jen se používá GET. Stále jsem tam "cpal" nějakou URL (href) až jsem zvolil jinou cestu. Na internetu jsem si našel jiný kurz, kde to asi vysvětlovali asi pro lidi s nižším IQ, a tak jsem to pochopil.
dalo mi to několik dní, dokonce jsem přešel na řešení třetí úlohy, ale nakonec jsem zvítězil.
Třetí úloha mi šla v NetBeansu celkem hladce a za chvíli jsem měl vše, včetně úvodního zobrazení názvu filmu (Zadal jsem název Měsíc) a vyšel mi krásně, velkými písmeny pomocí <h1>. Když jsem to však zadal do Vyzkoušení robotovi žádný Měsíc se mi nezobrazil. Pouze když jsem odstranil <h1> (a </h1>), tak se Měsíc zobrazil, ale pochopitelně malým písmem. Robot mi taky po předání k hodnocení hlásil neshodný text. Bohužel zde je chyba robota, má jiný text, ale poslechl jsem a opravil (je to asi past).
Takže to opouštím se smíšenými pocity. Možná se k tomu někdy vrátím. Každopádně jsem se s tím dost dlouho zabýval, a tak asi "Účel světí prostředky".
Nebudu nikoho zatěžovat dlouhým textem, každý zde to má stručné.
Děkuji PK

 
Odpovědět
18.11.2020 15:20
Avatar
Vladimír Beneš:15. února 16:15

Když jsem se prokousal URL adresováním, lekce proběhla bez problémů. Odcházím na příklady

 
Odpovědět
15. února 16:15
Avatar
Petra Petty Kunzová:14. března 21:36

Konečně jsem taky vyřešila kalkulačku metodou GET přes url :D ....

Odpovědět
14. března 21:36
Kam míří naše pozornost, tam energie a tam se i objeví naše výsledky .
Avatar
Dušan Kovářík:16. června 12:47

Tohle je pro mě historický okamžik :) Poprvé v životě jsem se dozvěděl něco o tom, jak fungují ty "slavné" metody GET a POST v PHP :) Začíná trochu přituhovat, ale zatím všechno chápu, tak jdu na cvičení...

 
Odpovědět
16. června 12:47
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 140. Zobrazit vše