Pouze tento týden sleva až 80 % na e-learning týkající se C# .NET. Zároveň využij akci až 30 % zdarma při nákupu e-learningu - Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
discount 30 + hiring

5. diel - Asociatívne polia v PHP a obsluha formulárov

V predchádzajúcom cvičení, Riešené úlohy k 1.-4. lekciu PHP, sme si precvičili získané skúsenosti z predchádzajúcich lekcií.

V minulej lekcii, Riešené úlohy k 1.-4. lekciu PHP , sme sa naučili zadávať textové reťazce rôznymi spôsobmi a uviedli sme si pole. Dnes si v PHP tutoriálu rozšírime znalosti ohľadom polí a hneď je prakticky využijeme na vytvorenie webovej kalkulačky. Áno, konečne budeme reagovať na nejaký vstup od užívateľa :)

Asociatívne pole

Druhý typ polí v PHP je tzv. Pole asociatívne. Funguje úplne rovnako, ako číselne indexované, ale indexy už nie sú čísla, ale textové reťazce. Indexom v tomto type polí hovoríme kľúča.

Asociatívne pole definujeme podobne ako číselne indexované, len okrem hodnôt zadávame aj kľúče. K tomu používame operátor dvojitej šípky (=>):

$oblibeneVeci = array(
    'homer' => 'šiška',
    'marge' => 'rúra',
    'bart' => 'prak',
    'liza' => 'kniha',
    'meggie' => 'cumlík',
);

Zápis pole sme rozdelili kvôli prehľadnosti do viacerých riadkov, ale išlo by to aj v jednom. V poli máme 5 hodnôt: ' šiška ', ' rúra ', ' prak ', ' kniha ', ' cumlík '. Každá hodnota patrí nejakému kľúči ('homer', 'marge', 'bart', 'liza', 'meggie'). Hodnoty priradíme ku kľúču pomocou šípky a oddeľujeme čiarkou, ktorá sa väčšinou píše aj za poslednou položkou. Nezabudnete ju tak napísať až do poľa budete pridávať ďalší prvok.

Mimochodom, všimnite si, že ak vytvárame premennú, ktorej názov zahŕňa viac slov, použijeme tzv. Ťaví notáciu. Prvé písmeno malé a každé začiatočné písmeno ďalšieho slova veľké. Ľudia v PHP píšu rôzne, ale táto konvencie je bezpochyby najlepší.

Pre prácu s asociatívnym poľom platí to isté, ako sme si ukazovali minule u poľa číselne indexovaného:

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

Namiesto aby sme napísali $oblibeneVeci[0], použijeme textový kľúč. Obrovskou výhodou je prehľadnosť. Vidíme, čo z poľa vyťahujeme, na rozdiel od číselného indexu, ktorý nám mnohokrát nič nehovorí.

Každé číselne indexované pole možno zapísať ako pole asociatívne a to takto:

$batoh = array('povraz', 'svietidlo', 'peňaženka');

$batoh2 = array(
    0 => 'povraz',
    1 => 'svietidlo',
    2 => 'peňaženka',
);

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

Z výpisu vidíme, že pole $batoh a $batoh2 sú úplne rovnaká. PHP totiž vnútorne pozná len polia asociatívne a keď založíme číselne indexované, jednoducho vytvorí indexy podľa poradia položiek.

Vo väčšine jazykov je pole obmedzené svojou veľkosťou a keď sa raz vytvorí, nemožno do neho prvky pridávať. V PHP tomu tak nie je, s poľom si môžete robiť úplne čo chcete.

Spracovanie formulárov v PHP

Konečne sa dostávame k niečomu zaujímavému. Pravé aplikácie predsa reagujú na vstup od užívateľa. Skúsme si takú aplikáciu vytvoriť - naprogramujeme si jednoduchú webovú kalkulačku.

Webovej aplikácii možno odovzdať vstup pomocou dvoch metód - GET a POST. HTTP protokol pozná ešte niekoľko ďalších metód (REST), ale prehliadača je nepodporujú. Dáta dorazí do PHP skriptu vždy v asociatívnom poli, ktoré sa volá podľa metódy, ktorú prišla.

Vytvorme si nejakú zložku pre novú aplikáciu (napríklad kalkulacka/).

Metóda GET

Vytvorte si súbor kalkulacka.php. Ak budeme tomuto skriptu chcieť odovzdať nejaké dáta metódou GET, zadáme ich do URL adresy pomocou tzv. Query stringu. Query string začína otáznikom (?) A jednotlivé parametre sú oddelené ampersand (&). Medzi názvom parametra a jeho hodnotou je rovná sa (=).

Do URL adresy by sme teda zadali toto:

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

Skriptu odovzdávame metódou GET dve premenné. Prvá sa volá cislo1 a má hodnotu 10, cislo2 má hodnotu 20.

Obsah skriptu by mohol byť nasledovné:

<!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("Súčet: $soucet");
        ?>
    </body>
</html>

Skript pracuje s tzv. Superglobálním poľom $_GET. Superglobálním preto, že je prístupné odkiaľkoľvek. Všetky premenné, ktoré boli skriptu odoslané v query stringu, nájdeme v tomto poli. Pole je asociatívne, ako kľúč zadáme názov premennej a dostaneme jej hodnotu. Súčet hodnôt jednoducho vypíšeme.

výsledok:

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

Metóda GET slúži skôr pre získavanie podstránok webu a pre kalkulačku sa príliš nehodí.

Metóda POST

Metóda POST sa zvyčajne používa pre odosielanie formulárov. Naša aplikácia sa bude teraz skladať z dvoch súborov. V prvom bude formulár, kam užívateľ zadá 2 čísla do textových polí a odošle tlačidlom "vypočítajte". Dáta sa odošlú druhému súboru, čo bude PHP skript, ktorý vykoná výpočet.

kalkulacka.html

Súbor obsahuje formulár. Môžeme mu dať koncovku PHP, ale nie je to nutné, žiadne PHP bloky tu nie sú. Ak súbor pomenujete index, zobrazí sa samozrejme ako predvolený stránka, keď do zložky kalkulacka/ pristúpite. Súbor bude vyzerať asi takto:

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Kalkulačka</title>
    </head>
    <body>
        <p>Vitajte v kalkulačke, zadajte 2 čísla a získajte ich súčet.</p>

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

    </body>
</html>

Výsledok by mal vyzerať takto:

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

Na HTML stránke máme formulár a v ňom pár vstupných textových polí typu text. Ak ctíte HTML 5, môžete použiť ako typ polí vo formulári "number". Posledné pole je odosielacie tlačidlo, ktoré vyvolá odoslanie formulára.

Zaujímavejšie sú atribúty formulára. method="POST" udáva spôsob, akým sa dáta z formulára odošlú. Hoci POST nie je predvolená hodnota, nedáva pre formuláre príliš zmysel používať žiadnu inú. Ak by sme atribút neuviedli, použila by sa metóda GET, kde by formulár odoslal dáta ako query string do URL adresy. Tak by boli jednak vidieť a tiež je dĺžka adresy obmedzená. Používajte teda vždy POST. action označuje skript, ktorý formulár spracuje. Ak atribút neuvedieme, odošle sa formulár do toho istého súboru, v ktorom sa nachádza.

soucet.php

Súbor je skript s obslužným kódom, ktorému sa dáta z formulára odošlú a on je spracuje. Asi vás neprekvapí, že dáta z formulára prídu v superglobálním poli $_POST. Opäť je asociatívne a kľúčom sú názvy textových (alebo iných) polí, teda ich atribúty name.

Obsah skriptu bude nasledujúci:

<!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("Súčet: $soucet");
        ?>
    </body>
</html>

Oproti obslužnému skriptu pre metódu GET sa vlastne vôbec nezmenil. Môžete si vyskúšať, že kalkulačka naozaj počíta :)

Projekty máte k stiahnutiu nižšie a ja sa na vás teším v budúcej lekcii, Riešené úlohy k 5. lekcii PHP , predstavíme si totiž podmienky.

V nasledujúcom cvičení, Riešené úlohy k 5. lekcii PHP, si precvičíme nadobudnuté skúsenosti z predchádzajúcich lekcií.


 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 2258x (1.15 kB)
Aplikácia je vrátane zdrojových kódov v jazyku php

 

Predchádzajúci článok
Riešené úlohy k 1.-4. lekciu PHP
Všetky články v sekcii
Základné konštrukcie jazyka PHP
Preskočiť článok
(neodporúčame)
Riešené úlohy k 5. lekcii PHP
Článok pre vás napísal David Čápka
Avatar
Užívateľské hodnotenie:
1 hlasov
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 sa informačné technológie naučil na Unicorn University - prestížnej súkromnej vysokej škole IT a ekonómie.
Aktivity

 

 

Komentáre

Avatar
Jiří Kindl
Člen
Avatar
Jiří Kindl:6. mája 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

 
Odpovedať
6. mája 18:52
Avatar
Odpovedá na Jiří Kindl
Jindřich Pšeničný:31. júla 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.

Odpovedať
31. júla 8:31
tak trochu jiný svět...
Avatar
Jindřich Pšeničný:31. júla 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.

Editované 31. júla 11:05
Odpovedať
31. júla 11:04
tak trochu jiný svět...
Avatar
Petra Nejezchlebova:28. augusta 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 :)

 
Odpovedať
28. augusta 15:12
Avatar
Jan Hrádek
Člen
Avatar
Jan Hrádek:30. augusta 22:53

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

 
Odpovedať
30. augusta 22:53
Avatar
Tomáš Pup
Člen
Avatar
Tomáš Pup:9. septembra 12:42

Tak jsme probrali rodinku Simpsnových :D atd.

 
Odpovedať
9. septembra 12:42
Avatar
Tomáš Pup
Člen
Avatar
Tomáš Pup:15. septembra 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.

 
Odpovedať
15. septembra 14:20
Avatar
Petr Tománek:16. septembra 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?

Editované 16. septembra 10:21
 
Odpovedať
16. septembra 10:20
Avatar
Marek Šenk
Člen
Avatar
Marek Šenk:22. septembra 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. 😉

 
Odpovedať
22. septembra 21:48
Avatar
Marek Šenk
Člen
Avatar
Marek Šenk:22. septembra 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.

 
Odpovedať
22. septembra 21:57
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zatiaľ nikto nevložil komentár - buď prvý!