5. díl - Asociativní pole v PHP a obsluha formulářů

PHP Základní konstrukce Asociativní pole v PHP a obsluha formulářů American English version English version

V minulém dílu seriálu tutoriálů se základy PHP jsme se naučili zadávat textové řetězce různými způsoby a uvedli jsme si pole. Dnes si 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.

Pozn.: 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 v PHP pomocí metody GET

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 v PHP pomocí metody formulářů

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á :)

Projekty máte ke stažení níže a já se na vás těším příště, představíme si totiž podmínky.


 

Stáhnout

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

 

  Aktivity (3)

Článek pro vás napsal David Čápka
Avatar
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn College Autor se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.

Jak se ti líbí článek?
Celkem (26 hlasů) :
4.923074.923074.923074.923074.92307


 


Miniatura
Předchozí článek
Cvičení k 1.-4. lekci PHP
Miniatura
Všechny články v sekci
Základní konstrukce jazyka PHP
Miniatura
Následující článek
Cvičení k 5. lekci PHP

 

 

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

Avatar
Matej Muščík:

ano presne tak ... používam intellij idea a v ňom mam nastavený php 7.0 ... &_get funguje dobre :-) ale $_post vôbec ...

 
Odpovědět 27. listopadu 18:40
Avatar
Jakub Žák
Člen
Avatar
Odpovídá na Matej Muščík
Jakub Žák:

Buď sem hoď přesné znění tvých zdrojáků s popisem, který je který, nebo to zabal a nahrej.

 
Odpovědět 27. listopadu 18:42
Avatar
Odpovídá na Jakub Žák
Matej Muščík:

mam origo ten čo je tu nakoniec moj modifikovany som dal preč a nejde ... asi mam problem so serverom

 
Odpovědět 27. listopadu 19:08
Avatar
Odpovídá na Jakub Žák
Matej Muščík:

je v princípe rozidel medzi chodom _get a _post ?

 
Odpovědět 27. listopadu 19:28
Avatar
mkub
Redaktor
Avatar
Odpovídá na Matej Muščík
mkub:

metoda GET posiela udaje v riadku prehliadaca a pomocou _get sa tieto udaje zachytavaju
a metoda POST funguje uplne inak, posle na pozadi v podobe ziadosti obsah toho formulara a server ten obsah zachyti a pomocou _post dekoduje, cize sa nic neposiela cez adresny riadok...

metoda GET je vhodna pre zadavanie adresy k danemu clanku a metoda POST sa zase pouziva na posielanie vacsieho mnozstva udajov, na spracovavanie registracnych udajov,...

 
Odpovědět  +1 27. listopadu 21:47
Avatar
Jakub Žák
Člen
Avatar
Odpovídá na Matej Muščík
Jakub Žák:

Zkus přidat na začátek soucet.php tyto řádky:

ini_set('display_errors',1); // zapne zobrazování chyb (ale to ti vlastně vypsiuje už teď :D )
error_reporting(E_ALL); // zajistí, že se budou vypisovat všechny chyby včetně všech warningů (pro jistotu)
print_r($_POST); // vypíše obsah pole POST
Editováno 28. listopadu 10:09
 
Odpovědět 28. listopadu 10:08
Avatar
Odpovídá na Jakub Žák
Matej Muščík:

Už mi to ide v poriadku zle nastevný server :-) ale ďakujem za rady

 
Odpovědět 28. listopadu 10:58
Avatar
Marian Benčat
Redaktor
Avatar
Marian Benčat:

@davidcapka jen detial,..v PHP normální a asociativní pole tak úplně ve skutečnosti není. Všechno v PHP je hashtable, což je nejčastější impelmentace asociativního pole i v jiných jazycích. Vnitřně pak jsou data uloženy jako uniony (LOL).

"Normální" php array je také uloženo jako Hashtable(LOL v 2.0) s tím rozdílem, že je ten hashtable obalený do věci, které říkají symtable. Je to to věsmes to samé s tím rozdílem, že není rozdíl mei intem a "stringovým intem". Tedy a[1] = a["1"], symtable to je n pri pristupu (R/W) prevede na cislo a az pak saha na hashtable.

 
Odpovědět 28. listopadu 12:59
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Marian Benčat
David Čápka:

Když si článek přečteš, tak zjistíš, že je to v něm napsané. Je dobré článek nejprve přečíst, než pod něj něco napíšeš.

PHP totiž vnitřně zná jen pole asociativní a když založíme číselně indexované, jednoduše vytvoří indexy podle pořadí položek.

Do zdrojáků PHP jsem koukal již několikrát, protože občas potřebuji optimalizovat a vědět jak to uvnitř funguje. Nemá se o tom ale smysl bavit v článku pro začátečníky.

Odpovědět 28. listopadu 13:02
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Marian Benčat
Redaktor
Avatar
Odpovídá na David Čápka
Marian Benčat:

Hmm.. tak to se omlouvam, to jsem skutecne prehledl :-) Kdyz mam ted tvoji pozornost, muzu dostat redaktorske prava?

 
Odpovědět 28. listopadu 13:05
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 90. Zobrazit vše