6. díl - Podmínky v PHP

PHP Základní konstrukce Podmínky v PHP 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ém dílu seriálu tutoriálů se základy PHP jsme si ukázali jak fungují formuláře a vytvořili si jednoduchou kalkulačku. Ta uměla jen sčítat. Dnes 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 příště, kdy podmínky dobereme.


 

Stáhnout

Staženo 750x (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?
23 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 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 6. lekci PHP
Aktivity (4)

 

 

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

Avatar
vojtanosek
Člen
Avatar
vojtanosek:29.5.2015 16:22

Potřeboval bych poradit. Pořád mě to podtrhuje to celý řádek s dělením. Už nevím jak to opravit. Zkoušel jsem vše co jsem věděl :(. I když jsem to přehodil tak zase bylo podtržené třeba násobení pod tím podmínkou if. Zde je kód:

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

       if ($operace == 'násobení');
       $výsledek= $a * $b;

       else if ($operace == 'dělení')
           $výsledek=$a/$b;

           else if ($operace == 'sčítání')
               $výsledek=$a+$b;

           else if ($operace =='odčítání')
               $výsledek=$a-$b;
           {
            if ($b != 0);
           $výsledek= $a / $b;
           else
           $výsledek = "chyba";
           }
           echo ("Výsledek: $výsledek");
 
Odpovědět 29.5.2015 16:22
Avatar
vojtanosek
Člen
Avatar
vojtanosek:29.5.2015 16:26

Edit: Opraveno. Neviděl jsem chybu. Neměl jsem tam mít znak ;.

 
Odpovědět  +1 29.5.2015 16:26
Avatar
Lukáš Landa:20.8.2015 20:33

Ahoj programátoři, potřeboval bych pomoc. V podmínkách mám problém hned na začátku tím myslím

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

NetBeans IDE 8.0.2 nehlásí chybu jen se mi tam ukázalo tzv. žárovička s trojúhelníčkem s hláskou "If-Else Statements Must Use Braces" (chtělo to tyto závorky { } )

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

což opravu udělá i samo. Po této opravě už nehlásilo vůbec žádnou chybu ,ale pokud to dám vyzkoušet "Play" tak se mi na stránce neukáže jako v ukázce

Pravda
Program zde pokračuje dál.

ale namísto toho mi vyskočí

Warning: Unknown: failed to open stream: No such file or directory in Unknown on line 0

Fatal error: Unknown: Failed opening required 'C:/xampp/htdocs/Podmínky/podminky.php' (include_path='.;C:\xampp\php\PEAR') in Unknown on line 0

Samozřejmě jsem se koukal na komentáře i ostatních, ale řešení tam není.

Ještě podotknu že veškeré nastavení či instalaci jsem dělal dle pokynů z 2. dílu viz.: http://www.itnetwork.cz/…kalni-server

Do teď mi vše šlapalo jak mělo, ale s tímto si nevím rady doufám že mi někdo racionálně vysvětlí co s tím. Předem díky.

Odpovědět 20.8.2015 20:33
„Lepší je si to posrat podle svého, než podle toho, co ti radí ty druzí.“
Avatar
Lukáš Landa:20.8.2015 21:50

VYŘEŠENO

Problém byl v adrese, použil jsem diakritiku, já mam název souboru ve windows-1250 a NetBeans mi do adresy rvalo UTF-8 :-))

Odpovědět 20.8.2015 21:50
„Lepší je si to posrat podle svého, než podle toho, co ti radí ty druzí.“
Avatar
Michal Pácal [Mysak0CZ]:14.11.2015 11:47

lepší by bylo si výsledek dopředu nastavit a taky kód provést pouze pokud je něco odesláno

<?php
if($_POST)
{
        $vysledek='';
        /* Pro sčítání */
        if($_POST['operace']=='scitani')
                $vysledek = $_POST["cislo1"]+$_POST["cislo2"];

        /* Pro odčítání */
        else if($_POST['operace']=='odcitani')
                $vysledek = $_POST["cislo1"]-$_POST["cislo2"];

        /* Pro násobení */
        else if($_POST['operace']=='nasobeni')
                $vysledek = $_POST["cislo1"]*$_POST["cislo2"];

        /* Pro dělení */
        else if ($_POST['operace']=='deleni')
        {
                if($cislo2!=0)
                {
                        $vysledek = $_POST["cislo1"]/$_POST["cislo2"];
                }
                else
                {
                        echo("Nulou nelze dělit!");
                }
        }

        /* Chybná hodnota */
        else
                echo('Chybná operace');

        if($vysledek != '')
                echo("Výsledek:".$vysledek);
}
 
Odpovědět 14.11.2015 11:47
Avatar
pgarsky
Člen
Avatar
pgarsky:14.6.2016 18:25

Jak to, že ten vysledek = X není psán do složených závorek?

Odpovědět 14.6.2016 18:25
Pokud ti něco jde těžko, znamená to, že jdeš tou správnou cestou...
Avatar
Honza.G
Člen
Avatar
Honza.G:25.12.2016 13:47

Jen dotaz, nvm proč, ale když jsem předtím udělal ty formuláře a tak, nechtěl omi to fungovat psalo to error a nepředávalo se(aji když dáme do url ty hodnoty nefungovalo). Nevíte co s tím?

 
Odpovědět  -1 25.12.2016 13:47
Avatar
Pavel Šrytr
Člen
Avatar
Pavel Šrytr:9. března 17:13

Ahoj, chtěl bych se zeptat jestli v PHP existuje i switch (jako v C-like jazycích).

 
Odpovědět 9. března 17:13
Avatar
Matúš Petrofčík
Šéfredaktor
Avatar
Odpovídá na Pavel Šrytr
Matúš Petrofčík:9. března 17:23

Samozrejme :) http://php.net/…s.switch.php

<?php
if ($i == 0) {
    echo "i equals 0";
} elseif ($i == 1) {
    echo "i equals 1";
} elseif ($i == 2) {
    echo "i equals 2";
}

switch ($i) {
    case 0:
        echo "i equals 0";
        break;
    case 1:
        echo "i equals 1";
        break;
    case 2:
        echo "i equals 2";
        break;
}
?>
Odpovědět  +2 9. března 17:23
obsah kocky = r^2 ... a preto vlak drnká
Avatar
Pavel Šrytr
Člen
Avatar
Odpovídá na Matúš Petrofčík
Pavel Šrytr:10. března 15:28

Děkuji, stačilo se kouknout do další lekce :D

 
Odpovědět  +1 10. března 15:28
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 51. Zobrazit vše