C a C++ týden ITnetwork Flashka zdarma
Akce! Pouze tento týden sleva až 80 % na kurzy C++. Lze kombinovat s akcí 50 % bodů navíc na prémiový obsah!
Brno? Vypsali jsme pro vás nové termíny školení Základů programování a OOP v Brně!

Lekce 6 - Podmínky v PHP

Unicorn College 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, Asociativní pole v PHP a obsluha formulářů, jsme si ukázali jak fungují formuláře a vytvořili si jednoduchou kalkulačku. Ta uměla jen sčítat. V dnešním PHP tutoriálu ji rozšíříme o další funkce. Budeme k tomu potřebovat podmínky.

Podmínky

Podmínky (nebo-li programátorsky větvení) umožňují, aby se skript nechoval stále stejně, ale reagoval na různé situace. Nejčastěji reagujeme na vstup od uživatele nebo různé události (např. že požadovaný článek neexistuje).

Pokud jste již programovali v nějakém céčkovém jazyce, budete se nyní asi chvilku nudit :)

Podmínku zapíšeme pomocí klíčového slova if, za kterým následuje v závorce logický výraz. Pokud je výraz pravdivý, vykoná se následující příkaz. Pokud ne, následující příkaz vykonán nebude a program pokračuje až pod ním.

Zkusme si to:

if (15 > 5)
    echo('Pravda');
echo('<br />Program zde pokračuje dál.');

Výstup programu nyní bude:

Your page
localhost

Operátory

V podmínce jsme použili operátor > (větší). Ve výrazech můžeme dále používat tyto relační operátory:

Operátor C-like zápis
Rovnost ==
Je ostře větší >
Je ostře menší <
Je větší nebo rovno >=
Je menší nebo rovno <=
Nerovnost !=
Obecná negace !

Rovnost zapisujeme dvěma == proto, aby se to nepletlo s běžným přiřazením do proměnné, které se dělá jen jedním =. Pokud chceme nějaký výraz znegovat, napíšeme ho do závorky a před něj vykřičník. Když budeme chtít vykonat více než jen jeden příkaz, musíme příkazy vložit do bloku ze složených závorek. Součástí výrazu samozřejmě mohou být i proměnné.

Udělejme si další příklad:

$a = 10;
$b = 0;
if ($b != 0)
{
    $vysledek = $a / $b;
    echo('Podíl: ' . $vysledek);
}
if ($b == 0)
    echo('Nulou nelze dělit!');

Skript výše spočítá a vypíše podíl dvou proměnných. Pokud je druhá proměnná nulová, vypíše chybu, jelikož nulou se samozřejmě dělit nedá. Pokud by proměnné pocházely od uživatele a my bychom je podmínkou neošetřili, mohl by nám takový uživatel aplikaci i rozbít. S ošetřením uživatelských vstupů úzce souvisí bezpečnost webových aplikací a během seriálu uvidíte, jak moc je to důležité.

Else

Podmínku jsme výše napsali vlastně dvakrát, jednou normálně a jednou znegovanou. Kdyby byla složitější, mohli bychom v její negaci udělat chybu. Pokud chceme, aby se něco provedlo v případě, že podmínka platí a něco jiného v případě, že podmínka neplatí, použijeme klíčové slovo else. Do větve else program zaběhne v případě, že podmínka neplatí.

$a = 10;
$b = 0;
if ($b != 0)
{
    $vysledek = $a / $b;
    echo('Podíl: ' . $vysledek);
}
else
    echo('Nulou nelze dělit!');

Pokud by ve větvi else bylo více příkazů, opět by musely být obsaženy v bloku ze složených závorek.

Else se také využívá v případě, kdy potřebujeme v příkazu manipulovat s proměnnou z podmínky a nemůžeme se na ni tedy ptát potom znovu. Program si sám pamatuje, že se podmínka nesplnila a přejde do sekce else. Ukažme si to na příkladu: Mějme číslo $a, kde bude hodnota 0 nebo 1 a po nás se bude chtít, abychom hodnotu prohodili (pokud tam je 0, dáme tam 1, pokud 1, dáme tam 0). Naivně bychom mohli kód napsat takto:

$a = 0; // do $a si přiřadíme na začátku 0

if ($a == 0) // pokud je $a 0, dáme do něj jedničku
    $a = 1;
if ($a == 1) // pokud je $a 1, dáme do něj nulu
    $a = 0;

echo($a);

Nefunguje to, že? Pojďme si projet, co bude program dělat. Na začátku máme v $a nulu, první podmínka se jistě splní a dosadí do $a jedničku. No ale rázem se splní i ta druhá. Co s tím? Když podmínky otočíme, budeme mít ten samý problém s jedničkou. Jak z toho ven? Ano, použijeme else.

$a = 0; // do $a si přiřadíme na začátku 0

if ($a == 0) // pokud je $a 0, dáme do něj jedničku
    $a = 1;
else // pokud je $a 1, dáme do něj nulu
    $a = 0;

echo($a);

Nyní vše funguje tak, jak má. K podmínkám je ještě nějaká teorie, kterou si dopovíme příště. Nyní pomocí nabytých znalostí rozšiřme naši kalkulačku.

Rozšíření kalkulačky

Začněme HTML formulářem, do kterého přidáme volbu pro zvolení početní operace. Přidáme do něj tag select, kterým zvolíme jakou početní operaci chceme vykonat. Pro úplnost si uveďme celý HTML soubor:

<!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 operaci.</p>

        <form method="POST" action="vypocet.php">
            <input name="cislo1" type="text" /><br />
            <input name="cislo2" type="text" /><br />
            Operace:
            <select name="operace">
                <option value="scitani">Sčítání</option>
                <option value="odcitani">Odčítání</option>
                <option value="nasobeni">Násobení</option>
                <option value="deleni">Dělení</option>
            </select><br />
            <input type="submit" value="Vypočítej" />
        </form>

    </body>
</html>

Výsledek vypadá takto:

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

Až se formulář odešle, budeme mít v $_POST['operace'] hodnotu podle toho, jakou možnost uživatel vybral.

Přejděme do obslužného skriptu, kterým byl dříve soucet.php. Jelikož již název neodpovídá tomu, co skript dělá, přejmenoval jsem ho na vypocet.php. Dovnitř dodejme větvení a ochranu před dělením nulou.

Nejprve si pro přehlednost na začátku skriptu načtěme vstupy z POSTu do proměnných. Nemusíme tak stále opisovat $_POST a kód bude přehlednější.

$a = $_POST['cislo1'];
$b = $_POST['cislo2'];
$operace = $_POST['operace'];

Dále vložíme větvění na výpočet podle operace. Jelikož je zbytečné, aby se v ověřování obsahu proměnné operace pokračovalo i v případě, že se nějaká operace provedla, použijeme sekvenci if ... else if ...

if ($operace == 'scitani')
    $vysledek = $a + $b;
else if ($operace == 'odcitani')
    $vysledek = $a - $b;
else if ($operace == 'nasobeni')
    $vysledek = $a * $b;
else if ($operace == 'deleni')
{
    if ($b != 0)
        $vysledek = $a / $b;
    else
        $vysledek = 'Chyba';
}
echo("Výsledek: $vysledek");

Kód by měl být jasný. Někdy se můžete setkat s tím, že se else if spojí do jednoho slova (elseif). Pokud je operace např. sčítání, další else se již nevyhodnotí, protože podmínka platila a přejde se rovnou k vypsání výsledku. Je tedy vždy vykonáno jen tolik podmínek, kolik je potřeba.

Výsledek máte jako vždy přibalený v archivu níže a já se na vás těším v příští lekci, Podmínky v PHP podruhé - přetypování, skládání a switch, kdy podmínky dobereme.


 

Stáhnout

Staženo 1006x (1.01 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?
37 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.
Předchozí článek
Asociativní pole v PHP a obsluha formulářů
Všechny články v sekci
Základní konstrukce jazyka PHP
Miniatura
Následující článek
Cvičení k 6. lekci PHP
Aktivity (9)

 

 

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

Avatar
Ernest Kuki
Člen
Avatar
Ernest Kuki:20.12.2017 14:26

Diky za tyhle kurzy. Konecne mam zase pocit, že se učím. =)

 
Odpovědět 20.12.2017 14:26
Avatar
Michaela Radimská:3.5.2018 22:13

Proč mne Netbeans (8.2) pořád péruje, že k podmínkám patří složené závorky? Týká se jednořádkových příkazů,které fungují i bez závorek. Doslova píše "if-else statements MUST use braces", případně mi je po udělení souhlasu ochotně doplní. Mám něco přenastavit? Žlutá obrazovka (spousta žlutých vlnovek) je trochu matoucí, snadno pak můžu opomenout nějaké podstatné varování, a zase bez složených závorek mi kód připadá přehlednější.

 
Odpovědět 3.5.2018 22:13
Avatar
Odpovědět  +1 3.5.2018 22:55
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 Dominik Gavrecký
Michaela Radimská:7.5.2018 12:49

Pročetla jsem, vyzkoušela varianty, díky :-)

 
Odpovědět 7.5.2018 12:49
Avatar
Stanislav Dittert:17. ledna 19:28

poctive sem si kod psal sam ale porad mi to hazelo chybu, pak sem zjistil ze sem pridal nechtene znak $ k funkci echo :-( po odstraneni jde v pohode.

 
Odpovědět 17. ledna 19:28
Avatar
Niesomtu Hraskova:15. února 20:36

Pridávam sa k poznámke Michaeli Radimské a pridavam este toto:
Myslim si ze celý prvý úsek aj so spustitelným kodom je napisaný velmi zmatecne plus taktiez teda poukazujem na nespravny, neuplny php kod ktory tam je.
Po prve: Text vysvetluje podmienku if kde sa konkretne pise o tom ze ak zadana podmienka je pravda(true) ma sa vykonat prvy riadok a ak neplati teda je false ma sa prvy riadokpreskocit a vypisat sa ma az nasledujuci riadok A za tymto nasleduje ukazka kodu ktory tym ze je nespravne napisany teda neuplny..tak sa nevypisuje prvy riadok ako by sa mal kedze 15 > 5 (true), ale vypisu sa oba riadky?? Ak sa da treba tuto chybu napravitpretoze pre cloveka ktory sa uci uplne zaklady a ma v tom chaos by si mohol aj ublizit pri takomto zadani ktore povazuje za alfu a omegu chapania logiky daneho jazyka. inak je kurz super..este jedna chyba bola pri vypracovavani cviceni ale ta mi vyhovovala takze pomlcim :))

 
Odpovědět 15. února 20:36
Avatar
Odpovídá na Niesomtu Hraskova
Niesomtu Hraskova:16. února 0:18

ne prvy usek vsetko je zle uuplne zle..vazne to prerob alebo vymaz tuto celu lekciu

 
Odpovědět 16. února 0:18
Avatar
lafleur.aa
Člen
Avatar
lafleur.aa:1. dubna 10:53

Nejprve bych rád poděkoval za skvěle napsaný seriál, ale měl bych jeden dotaz. Jak sečíst více řádků s formuláři a výsledek vypsat také do furmuláře?
Např. když mám tabulku a v ní formuláře (cislo1, cislo2, vysledek) s tím, že value cislo1 a cislo2 se načítá z databáze. Počet řádků je pak dynamický podle počtu záznamů v DB. Jde mi o to, jak v každém řádku docílit výpočtu

$row['cislo1'] + $row['cislo2']

do příslušného formuláře 'vysledek' v každém řádku. Chápu, že bych to mohl počítat přes SQL dotaz v DB, ale jak by to vypadalo za použití PHP? Děkuji za rady.

 
Odpovědět 1. dubna 10:53
Avatar
Jaroslav Smrž
Redaktor
Avatar
Odpovídá na lafleur.aa
Jaroslav Smrž:1. dubna 11:51

Použil bych foreach. Např.

foreach ($db->query($sql) as $row) {
 $vysledek = $row['cislo1'] + $row['cislo2'];
<tr>
       <td><input type="number" class="form-control" name="cislo1" value="<?php echo $row['cislo1']; ?>" readonly></td>
       <td><input type="number" class="form-control" name="cislo2" value="<?php echo $row['cislo2']; ?>" readonly></td>
       <td><input type="number" class="form-control" name="vysledek" value="<?php echo $vysledek; ?>"></td>
</tr>
Odpovědět  +1 1. dubna 11:51
I have no idea what it is doing but I´m scared to delete it... xD
Avatar
Martin Kubíček:13. dubna 13:32

Ahoj, jsem nejake zaklady PHP uz znam z drivejska, presto jsem si radeji mistni tutorialy dal uplne od zacatku, abych si to osvezil, chci se zeptat, jestli tento kod je aspon trosku v poradku, ci zda-li jsou tam nejake hrubky, pripadne jake,udelal jsem to pomoci switch... diky moc

<?php

$a = $_POST['cislo1'];
$b = $_POST['cislo2'];
$ukon = $_POST['ukon'];

if ($b == 0) {
    echo "Nelze delit nulou !!";
}
else

    switch ($ukon) {
        case '+' :
            echo("Vysledek je " . ($a + $b));
            $vysledek = true;
            break;
        case '-' :
            echo("Vysledek je " . ($a - $b));
            $vysledek = true;
            break;
        case '*' :
            echo("Vysledek je " . ($a * $b));
            $vysledek = true;
            break;
        case '/' :
            echo("Vysledek je " . ($a / $b));
            $vysledek = true;
            break;
        default :
            echo("Zadej cisla");


    }


?>

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Kalkulačka</title>
</head>
<body>
<p>Kalkulacka</p>


<form method="POST" action="kalkulacka.php">
    <label>Cislo 1</label><br />
    <input name="cislo1" type="text" /><br />
    <td>Operace</td>
    <td><select name="ukon">
            <option value="+">+</option>
            <option value="-">-</option>
            <option value="*">*</option>
            <option value="/">/</option>
        </select></td><br />
    <label>Cislo 2</label><br />
    <input name="cislo2" type="text" /><br />
    <input type="submit" value="Vypocitej" />
</form>

</body>
</html>
 
Odpovědět 13. dubna 13:32
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 81. Zobrazit vše