Pouze tento týden sleva až 80 % na e-learning týkající se Javy. Zároveň využij akce až 50 % zdarma při nákupu e-learningu - více informací.
Aktualizovali jsme Zásady zpracování osobních údajů. Pokračováním užívání sítě projevíte souhlas s těmito podmínkami. Tuto zprávu můžete nyní zavřít.
discount 50 + hiring

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',
    'maggie' => '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', 'maggie'). 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

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 2258x (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
Přeskočit článek
(nedoporučujeme)
Řešené úlohy k 5. lekci PHP
Článek pro vás napsal David Čápka
Avatar
Uživatelské hodnocení:
191 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

 

 

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

Avatar
Jiří Kindl
Člen
Avatar
Jiří Kindl:6. května 18:52

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

METODA GET SLOUŽÍ PRO ZÍSKÁVÁNÍ PODSTRÁNEK WEBU - CO JE TÍM MYŠLENO (JSEM ZAČÁTEČNÍK)? JIRKA

 
Odpovědět
6. května 18:52
Avatar
Odpovídá na Jiří Kindl
Jindřich Pšeničný:31. července 8:31

Metoda GET není bezpečná, proto by se přes ní neměli posílat důvěrné data, jeden z hlavních důvodů je, že je to komunikace nešifrovaná a za druhé se ukládá v historii. GET se hodí spíše pro formuláře, kde je dobré parametry ukázat (třeba vyhledávače, stránka s článkem), aby se na tu stránku dalo odkázat, případně se k ní vrátit v historii.

Odpovědět
31. července 8:31
tak trochu jiný svět...
Avatar
Jindřich Pšeničný:31. července 11:04

Já bych ještě k té metodě GET doplnil, že při prvním otevření skriptu v prohlížeči se mi objevila hláška:

**Notice:** Undefined index: cislo1 in **C:\xampp\htdocs\calculacka\calculacka.php** on line 25
**Notice:** Undefined index: cislo2 in **C:\xampp\htdocs\calculacka\calculacka.php** on line 25

Nejdřív mě to zmátlo, ale vlastně je to logické. Po předání hodnot do proměnných se už stránka načetla bez poznámek a se správným výsledkem.

Editováno 31. července 11:05
Odpovědět
31. července 11:04
tak trochu jiný svět...
Avatar
Petra Nejezchlebova:28. srpna 15:12

Pro člověka neznalého programovaní byla tato lekce masakr, zasekla jsem se na dlouho a chtěla to vzdát :( Možná by to chtělo pár PrtSc přesného postupu pro blondýnky :)

 
Odpovědět
28. srpna 15:12
Avatar
Jan Hrádek
Člen
Avatar
Jan Hrádek:30. srpna 22:53

Ahoj, nevíte někdo, jak naprogramovat tlačítko <button>,aby po jeho kliknutí vždy přičetlo jedničku.

 
Odpovědět
30. srpna 22:53
Avatar
Tomáš Pup
Člen
Avatar
Tomáš Pup:9. září 12:42

Tak jsme probrali rodinku Simpsnových :D atd.

 
Odpovědět
9. září 12:42
Avatar
Tomáš Pup
Člen
Avatar
Tomáš Pup:15. září 14:20

I po přečtení komentářů nejsem nějak chytřejší strávil jsem nad tím nějaké 2.hodiny a stejně nic nevyřešil. Z cvičení když jej stáhnu tak mi nějak nepomohlo. Nicméně mám vytvořenou složku v C:\xampp\htdoc­s\Kalkulacka a v ní soubory: kalkulacka.html, kalkulacka.php, soucet.php tedy vše jak by správně mělo být.

A teď zkouším kalkulacka.html, najede tabulka a když do ní vložím čísla, aby se sečetli tak mi to vypíše toto:

<!DOCTYPE html>
<!--
Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
Click nbfs://nbhost/SystemFileSystem/Templates/Project/PHP/PHPProject.php to edit this template
-->
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <?php

            $soucet = $_POST['cislo1'] + $_POST['cislo2'];
            echo("Součet: $soucet");
        ?>
    </body>
</html>

Tak nic nefunguje zkouším to dál zadávám url: localhost/kal­kulacka/kalku­lacka.php?cis­lo1=10&cislo2=20
Ano vyjede mi Součet: 30, ale nevím k čemu mi to je, nebo nevím jak to použít.
Koukám zda mám zapnuté v XAMPP Apache a mám.
Jestli někdo víte a poradíte budu rád.

 
Odpovědět
15. září 14:20
Avatar
Petr Tománek:16. září 10:20

Tak tohle je první lekce kurzu, kde jsem narazil na problém, se kterým si skutečně vůbec nevím rady...
Po zadání hodnot do formuláře mně vyskočí akorát stránka zobrazující zdrojový kód obsahující výsledek v php. Vůbec nevím, co dělám špatně. Zkoušel jsem to i s nakopírovanými kódy přímo odsud z lekce a výsledek je stejný. Takže v kódu chyba asi nebude. Apache mi běží, soubory jsem uložil do jedné složky C:\xampp\htdoc­s\Kalkulacka, tak teď opravdu nevím jak dál.
V čem by mohl být problém?

Editováno 16. září 10:21
 
Odpovědět
16. září 10:20
Avatar
Marek Šenk
Člen
Avatar
Marek Šenk:22. září 21:48

Ufff... tak nakonec jsem to taky zvládl. Už jsem si ale stihl i zanadávat, že to je kurz na prd, když to tu není popsané krok po kroku. A co to po mě jako chtějí? Vźdyť jsem úplný začátečník. 😀
Teď už si myslím, že to je asi i záměr autora a tak trochu takzvané síto. 😉

 
Odpovědět
22. září 21:48
Avatar
Marek Šenk
Člen
Avatar
Marek Šenk:22. září 21:57

Možná by se sem ještě před kapitolu GET hodilo pro úplné začátečníky s NetBeans napsat pár řádků o tom, jak a co kam ukládat, aby to fungovalo. Nakonec jsem se toho ale nějak dovtípil a pak už to šlo. Akorát jsem se tu na tom na pár hodin zasekl.

 
Odpovědět
22. září 21:57
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 164. Zobrazit vše