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

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

Unicorn College ONEbit hosting Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

V minulé lekci, Textové řetězce podruhé a pole v PHP, jsme se naučili zadávat textové řetězce různými způsoby a uvedli jsme si pole. 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.

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

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


 

Stáhnout

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

 

 

Článek pro vás napsal David Čápka
Avatar
Jak se ti líbí článek?
42 hlasů
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 sítě se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.
Miniatura
Všechny články v sekci
Základní konstrukce jazyka PHP
Miniatura
Následující článek
Cvičení k 5. lekci PHP
Aktivity (7)

 

 

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

Avatar
TEX
Člen
Avatar
TEX:14. února 10:22

Ahoj, co takhle si do podmínky dát jenom čísla která tam opravdu máš? :D Tudíž si toto

if (isset($_POST["cislo1"]) && isset($_POST["cislo1"]) && isset($_POST["cislo1"])){

oprav na

if (isset($_POST["cislo1"]) && isset($_POST["cislo2"]))){
 
Odpovědět 14. února 10:22
Avatar
Maroš Motaj
Člen
Avatar
Odpovídá na TEX
Maroš Motaj:14. února 10:33

Už som to opravil. :) ďakujem,

Ale aj tak:

Umiestnil som kalkulacka.html a vypocet.php do jednej zložky na disku. Spustím formulár zadám čísla dám sčítať, nasleduje prázdna stránka bez informácií... následne spustím vypocet.php a zas len prázdna web stránka....

ďakujem,

HTML:
<p>Vitajte v kalkulačke, zadajte 2 čísla a operáciu.</p>

<form method="POST" action="vypocet­.php">
<input name="cislo1" type="text" />

<input name="cislo2" type="text" />

Operacia:
<select name="operacia">
<option value="scitani­e">Sčítanie</op­tion>
<option value="odcita­nie">Odčítáni­e</option>
<option value="nasobe­nie">Násobeni­e</option>
<option value="deleni­e">Dělenie</op­tion>
</select>

<input type="submit" value="Vypočítaj" />

PHP:
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>vypocet</ti­tle>
</head>
<?php
if (isset($_POST["cis­lo1"]) && isset($_POST["cis­lo2"])){
$a = $_POST['cislo1'];
$b = $_POST['cislo2'];
$operacia = $_POST['operacia'];

if ($operacia == 'scitanie')
$vysledok = $a + $b;
else if ($operacia == 'odcitanie')
$vysledok = $a - $b;
else if ($operacia == 'nasobenie')
$vysledok = $a * $b;
else if ($operacia == 'delenie')
{
if ($b != 0)
$vysledok = $a / $b;
else
$vysledok = 'Chyba';
}
echo("vysledok: $vysledok");

 
Odpovědět 14. února 10:33
Avatar
TEX
Člen
Avatar
Odpovídá na Maroš Motaj
TEX:14. února 10:36

Teď koukám.. ty tam toho máš mnohem víc..otevři si svůj soubor.. vedle si otevři nový a nahraj tam tento kod, který funguje a podle něj si to oprav a přemýšlej jak a proč si tam měl chybu.

<?php
if (isset($_POST["cislo1"]) && isset($_POST["cislo2"])){
$a = $_POST['cislo1'];
$b = $_POST['cislo2'];
$operacia = $_POST['operacia'];

if ($operacia == 'scitanie') {
$vysledok = $a + $b;
}else if ($operacia == 'odcitanie'){
$vysledok = $a - $b;
}else if ($operacia == 'nasobenie'){
$vysledok = $a * $b;
}else if ($operacia == 'delenie'){
if ($b != 0)
$vysledok = $a / $b;
}else
$vysledok = 'Chyba';
}
echo("vysledok: $vysledok");

?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Kalkulacka</title>
</head>
<body>
<p>Vítejte v kalkulacke.</p>

<form method="POST">
<select name="operacia">
<option value="scitanie">scitanie</option>
<option value="odcitanie">odcitanie</option>
<option value="nasobenie">nasobenie</option>
<option value="delenie">delenie</option>
</select>
<input name="cislo1" type="text" />
<input name="cislo2" type="text" />
<input type="submit" value="Spocitaj" />
</form>

</body>
</html>
 
Odpovědět 14. února 10:36
Avatar
Maroš Motaj
Člen
Avatar
Odpovídá na TEX
Maroš Motaj:14. února 12:45

Ďakujem, už chápem kde som robil chyby :) už mi to ide.

 
Odpovědět  +1 14. února 12:45
Avatar
František Kreisinger:5. března 16:26

Proč tady v ukázce print_r($array) (třeba print_r($batoh); nebo print_r($batoh2);) vypíše jednotlivé prvky pole hezky každý na nový řádek, ale mně to namastí všechny do jednoho řádku i když použiji přesně ten příklad z ukázky?

Odpovědět 5. března 16:26
Začátečník v PHP, HTML i webovém programování vůbec.
Avatar
František Kreisinger:15. března 13:13

Lze odesílat FORMulář jen po ENTER na údaji bez toho, aby ve formuláři byl nějaký SUBMIT? Nikde jsem se o tom zatím nedočetl. Přesto mi to tak funguje, viz třeba:

<FORM action="ViewPos­t.php" method="POST">
<INPUT type=TEXT size=10 name=Text value="????">
</FORM>

Je to někde popsáno? Jak to by to pak fungovalo, pokud by v tom formuláři nějaké SUBMIT byly?

Odpovědět 15. března 13:13
Začátečník v PHP, HTML i webovém programování vůbec.
Avatar
Odpovídá na František Kreisinger
Dominik Gavrecký:15. března 13:23

Čo v prípade mobilov ? Aký enter by si tam použil ? http://www.alanflavell.org.uk/…uestion.html

Odpovědět 15. března 13:23
Hlupák nie je ten kto niečo nevie, hlupákom sa stávaš v momente keď sa na to bojíš opýtať.
Avatar
Odpovídá na František Kreisinger
František Kreisinger:15. března 14:08

Navíc v řadě případů může být takové chování formuláře nevhodné. Pokud je uživatel zvyklý napsané údaje ENTERovat, může formulář odeslat předčasně neúplně vyplněný. Jak tomu lze zabránit?

Odpovědět 15. března 14:08
Začátečník v PHP, HTML i webovém programování vůbec.
Avatar
Odpovídá na Dominik Gavrecký
František Kreisinger:15. března 21:30

Díky za reakci. Já s tím teprve začínám a moc o tom nevím. Smartphone nemám, jen tablet a tam se při zadávání zobrazuje klávesa Přejít, která je myslím jako ENTER. Zkouším si to zatím ale jen na svém PC, takže co v případě mobilu mě zatím netrápí.
Mně ale to chování po ENTER spíš překvapilo a zaskočilo, protože tady ani v příručkách, které mám (ale jsou většinou starší - Kosek a pod.), se všude píše, jen o tom, že se odesílá SUBMITem a o tom ENTER ani zmínka. Mně to chování po ENTER zatím spíš vadí a potřeboval bych to potlačit. Je sice pravda, že se to tak chová jen když je ve formuláři jen jeden textový input, ale mohou tam být třeba už jen SELECT nebo RADIO či CHECKBOX a dělá to také. Já mám právě takový formulář a za tím textovým INPUTem mám hned tlačítko SUBMIT na potvrzení zadání. Jenže jsou tam i další SUBMITová tlačítka pro jiné způsoby zpracování. A pokud odENTRuji ten zadaný TEXTový INPUT, tak se to neodešle tímto SUBMITem, který je k tomu určený, ale zřejmě prvním SUBMITem, který v tom FORMuláři je a to je pro mě špatně a potřeboval bych to řešit.

Odpovědět 15. března 21:30
Začátečník v PHP, HTML i webovém programování vůbec.
Avatar
Odpovídá na František Kreisinger
František Kreisinger:16. března 9:21

Opět jsem se nevyjádřil úplně přesně. Pokud je jen jeden textový INPUT (a pak už třeba jen CHECK, RADIO a pod.), tak se formulář po ENTER odešle i bez toho, že by v tom FORMuláři byl nějaký SUBMIT. Pokud tam nějaké SUBMITy jsou, tak se po ENTER na textovém INPUTu odešle i v případě, že je tam těch textových INPUTů víc. A jako odesílací se zřejmě použije první SUBMIT v tom FORMuláři bez ohledu na to, kde je umístěný ten textový INPUT a další SUBMITová tlačítka (byť jsou třeba hned za tím INPUTem). Dá se nějak ovlivnit, aby se v takovém případě použil SUBMIT, který si určím?

Odpovědět 16. března 9:21
Začátečník v PHP, HTML i webovém programování vůbec.
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 123. Zobrazit vše