Pouze tento týden sleva až 80 % na e-learning týkající se Javy. A zároveň využij akce až 30 % zdarma při nákupu e-learningu - Více informací.
Hledáme koordinátorku kurzů a programátora, 100% home office, 100% flexibilní. Prozkoumej aktuální pozice
discount week 30 - hiring

Lekce 6 - Podmínky v PHP

V předešlém cvičení, Řešené úlohy k 5. lekci PHP, jsme si procvičili nabyté zkušenosti z předchozích lekcí.

V dnešním PHP tutoriálu si rozšíříme kalkulačku 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 !
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

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. Součástí výrazu samozřejmě mohou být i proměnné. 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 {}.

 Složené závorky se píši pomocí klávesy pravý ALT a znaku B nebo N:

Složené závorky

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 POST 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 následujícím cvičení, Řešené úlohy k 6. 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 1211x (1.01 kB)
Aplikace je včetně zdrojových kódů v jazyce PHP

 

Předchozí článek
Řešené úlohy k 5. lekci PHP
Všechny články v sekci
Základní konstrukce jazyka PHP
Přeskočit článek
(nedoporučujeme)
Řešené úlohy k 6. lekci PHP
Článek pro vás napsal David Čápka
Avatar
Uživatelské hodnocení:
78 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 (77)

Avatar
Niesomtu Hraskova:16.2.2019 0:18

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

Odpovědět
16.2.2019 0:18
Hľadám si prácu, tak mi smelo napíš mail.
Avatar
lafleur.aa
Člen
Avatar
lafleur.aa:1.4.2019 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.4.2019 10:53
Avatar
Jaroslav Smrž
Redaktor
Avatar
Odpovídá na lafleur.aa
Jaroslav Smrž:1.4.2019 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.4.2019 11:51
/* Life runs on code */
Avatar
Martin Kubíček:13.4.2019 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.4.2019 13:32
Avatar
Iva.U
Člen
Avatar
Iva.U:23.1.2020 12:05

Skvělá lekce, moc dík.

 
Odpovědět
23.1.2020 12:05
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
František Červeňák:30.7.2020 20:35
<!DOCTYPE html>
<html lang="sk">
<head>
        <meta charset="UTF-8">
        <title>FUNKCIA - "KALKULAČKA"</title>
        <link rel="stylesheet" href="">
</head>
<body>
             <form action='' method='POST' accept-charset='utf-8'>
                <input type='number' name='a'> <input type='number' name='b'>
                <select name='operacia'>
                        <option value='sucet'>+</option>
                        <option value='rozdiel'>-</option>
                        <option value='sucin'>x</option>
                                <option value='podiel'>:</option>
                </select>
                <input type='submit' name='button' value='vypočítaj'>
             </form><br>
</body>
</html>
           <?php //kód na funkciu kalkulačky:
function kalkulacka(){
             $a='';
             $b='';
             $operacia='';
           if (isset($_POST['button']) AND isset($_POST['a']) AND
                 isset($_POST['b']) AND isset($_POST['operacia'])){

                      $a = $_POST['a'];
                      $b = $_POST['b'];
                      $operacia = $_POST['operacia'];

                  if ($a !="" AND $b !="" AND $operacia !="") {

                 switch ($operacia) {
                        case 'sucet':
                                echo $a + $b;
                                break;

                                case 'rozdiel':
                                echo $a - $b;
                                break;

                                case 'sucin':
                                echo  $a * $b;
                                break;

                                case 'podiel':
                                echo  $a / $b;
                                break;

                        default:
                                echo "error";
                                break;
                                                        }

                                                                  }

                  else{
                echo"Zadajte hodnoty do obidvoch políčok";
                           }


                                }
          else{
                echo"Zadajte hodnoty do políčok";
          }

}

//hotová funkcia, ktorá sa vždy automaticky spustí načítaním horeuvedeného scriptu :
kalkulacka();

?>
 
Odpovědět
30.7.2020 20:35
Avatar
František Červeňák:5.8.2020 0:19

ešte s ošetrením, ak by mal by mal byť deliteľ * 0* :

           <?php //kód na funkciu kalkulačky:
function kalkulacka(){
             $a='';
             $b='';
             $operacia='';
           if (isset($_POST['a']) AND
               isset($_POST['b']) AND
               isset($_POST['operacia'])){

                      $a = $_POST['a'];
                      $b = $_POST['b'];
                      $operacia = $_POST['operacia'];

                  if ($a !="" AND $b !="" AND $operacia !="") {

                 switch ($operacia) {
                            case 'sucet':
                                echo $a + $b;
                                break;

                                case 'rozdiel':
                                echo $a - $b;
                                break;

                                case 'sucin':
                                echo  $a * $b;
                                break;

                                case 'podiel':
                                if($b!=0){
                                echo  $a / $b;}
                                else {echo "error - delenie nulou nie je definované";}
                                break;

                                default:
                                echo "error";
                                break;
                                                        }

                                                                  }

                  else{
                echo"Zadajte hodnoty do obidvoch políčok";
                           }


                                }
          else{
                echo"Zadajte hodnoty do políčok";
          }

}

//hotová funkcia, ktorá sa vždy automaticky spustí načítaním horeuvedeného scriptu :
kalkulacka();

?>
 
Odpovědět
5.8.2020 0:19
Avatar
Pavel Kubalík:23.11.2020 15:07

Dobrý den
Tentokrát zavírám lekci o podmínkách s radostí.
Řešení následných příkladů mě bavilo a příklady byly dobré (nikoli lehké).
Dost jsem se poučil (i když téma podmínek pro mne již několik desetiletí není neznámé).
Líbí se mi jak úsporně se podmínky v PHP píší (a asi nejen v PHP).
Děkuji PK

 
Odpovědět
23.11.2020 15:07
Avatar
Jozef Lysík
Člen
Avatar
Jozef Lysík:19.4.2021 22:33

Druhý riadok v tomto prípade nepatrí podmienke, takže bez ohľadu či je podmienka splnená alebo nie sa druhý riadok vypíše vždy. Ja si blok kódu pre podmienku vždy dávam do {...} hoci keď je tam len jeden riadok tak zátvorky niesu povinné.

 
Odpovědět
19.4.2021 22:33
Avatar
Jaroslav Parma:28.5.2021 10:58

Ahoj všem,
kalkulačku v zadání v této lekci jsem trochu vylepšil o validaci (je to převzaté z další lekce, kde se vytváří kontaktní emailový formulář). Po krátkém trápení s 0 (když jsem zadal 0, tak mi to vyhodilo chybu, protože to vnímalo jako odeslání prázdného formuláře) se mi povedlo kalkulačku zprovoznit. Teprve se učím, tak bych se rád zeptal někoho zkušenějšího, jestli by se můj kód nedal napsat efektivněji.

<?php
        $operace = $_POST['operace'];
        if ($_POST)
            {
                if (isset($_POST['cislo1'], $_POST['cislo2']) && ($_POST['cislo1'] ||
                $_POST['cislo1'] == 0) && ($_POST['cislo2'] || $_POST['cislo2'] == 0))
                {   $a = $_POST['cislo1'];
                    $b = $_POST['cislo2'];
                    if ($operace == 'scitani')
                        {
                        $vysledek = $a + $b;
                        $hlaska = 'Výsledek je: ' . $vysledek;
                        }
                    else if ($operace == 'odcitani')
                        {
                            $vysledek = $a - $b;
                            $hlaska = 'Výsledek je: ' . $vysledek;
                        }
                    else if ($operace == 'nasobeni')
                        {
                            $vysledek =  $a * $b;
                            $hlaska = 'Výsledek je: ' . $vysledek;
                        }
                    else if ($operace = 'deleni')
                        {
                            if ($b == 0)
                                $hlaska = 'Chyba, nulou nelze dělit!';
                            else
                            {
                                $vysledek = $a / $b;
                                $hlaska = 'Výsledek je: ' . $vysledek;
                            }

                        }
                }
                else
                    $hlaska = 'Nezadal jsi všechna čísla.';
            }
        echo($hlaska . '<br />
        <a href="kalkulacka.html">Zpět</a>');
    ?>

\---

 
Odpovědět
28.5.2021 10:58
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 87. Zobrazit vše