Získej svůj iPhone v nové soutěži! Získej svůj iPhone v nové soutěži!
Nová překladatelská soutěž ITnetwork.cz o telefon iPhone, sluchátka Beats a další věcné ceny za 4 hodiny práce.
Přidej si svou IT školu do profilu a najdi spolužáky zde na síti :)

6. díl - Podmínky v PHP

PHP Základní konstrukce Podmínky v PHP American English version English version

ONEbit hosting 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 840x (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?
28 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 (5)

 

 

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

Avatar
Štěpán Halíř:14. října 18:57

Ahoj,
máš tam chybku ve výpisu výsledku.
V souboru vypocet.php nahraď řádek

echo ('Výsledná hodnota je: ' $vysledek);

za

echo ('Výsledná hodnota je: ' . $vysledek);

Když uvádíš proměnnou vedle ukončených apostrofů, musíš ji oddělit od zbytku textu právě tou tečkou. Když se podíváš nahoru na řešení, jsou tam použity uvozovky, kde se to takto neodděluje, ale proměnnou píšeš přímo do nich. Když používáš apostrof, tak mysli na oddělení tečkou. Snad jsme to teda tentokrát vyřešili.
P.S.: Příště prosím citace kódů vkládej do tagu pro kód (druhý z levé strany mezi možnostmi úpravy textů). Lépe se v tom orientuje.

Měj se fajn a hodně štěstí s učením

Editováno 14. října 18:59
Odpovědět  +2 14. října 18:57
Per aspera ad astras
Avatar
EweN
Člen
Avatar
Odpovídá na Štěpán Halíř
EweN:15. října 20:34

Hrozne moc ti dekuju! Byl jsem uz zoufalej =D
Dostal jsem se az do faze kdy jsem tu prepisoval vsechno asi 100x a furt nic =D

 
Odpovědět 15. října 20:34
Avatar
Odpovídá na EweN
Štěpán Halíř:15. října 21:00

Není zač. Vidíš sám, v jakým detailu to celou dobu vězelo. Když tu chybku hledáš, tak hlavně v klidu a pečlivě. Nějaké inteligentní IDE by ti s tím mohlo pomáhat. Kdyby zase něco, neboj se napsat, věřím že ti i v budoucnu někdo pomůže, pokud bude vědět. :-)

Odpovědět 15. října 21:00
Per aspera ad astras
Avatar
Miroslav Mucha:31. října 13:03

Ahoj, zkusil jsem kalkulačku trochu upravit. Pro kontrolu vstupních údajů jsem použil funkci array_key_exis­ts(), používám jenom jeden formulář pro vstupní pole i kód,

<title>Kalkulač­ka</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=de­vice-width, initial-scale=1.0">

<h1>Kalkulačka</h1>
<p>Zadejte 2 čísla</p>

<!-- vytvoření vstupního formuláře pro zadání čísel -->
<form method="POST" action="">
<input type="text" name="cislo1" />

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

<input type="submit" name="soucet" value="+" />
<input type="submit" name="rozdil" value="-" />
<input type="submit" name="soucin" value="*"/>
<input type="submit" name="podil" value="/"/>
</form>

<?php
if(array_key_e­xists('cislo1', $_POST)) // kontrola, zda byl odeslán formulář
{
if // pokud je v jednom nebo v obou polích prázdná hodnota
{
echo "Musíš zadat obě hodnoty";
}
elseif || (!is_numeric($_POS­T['cislo2']))) // pokud je v jednom nebo v obou polích nenumerická hodnota
{
echo "V obou polích musí být číslo";
}
else
{
$cislo1 = $_POST['cislo1']; // přiřadí proměnné $cislo1 hodnotu z pole 1
$cislo2 = $_POST['cislo2']; // přiřadí proměnné $cislo2 hodnotu z pole 2
if(array_key_e­xists('soucet', $_POST)) // pokud je stisknuto tlačítko "plus"
{
$soucet = $cislo1 + $cislo2; // sečte hodnoty a vloží výsledek do proměnné $součet
echo "Výsledek: $cislo1 + $cislo2 = $soucet"; // výsledek vypíše do formuláře
}
if(array_key_e­xists('rozdil', $_POST)) // pokud je stisknuto tlačítko "mínus"
{
$rozdil = $cislo1 - $cislo2; // odečte hodnoty a vloží výsledek do proměnné $rozdíl
echo "Výsledek: $cislo1 - $cislo2 = $rozdil"; // výsledek vypíše do formuláře
}
if(array_key_e­xists('soucin', $_POST)) // pokud je stisknuto tlačítko "krát"
{
$soucin = $cislo1 * $cislo2; // vynásobí hodnoty a vloží výsledek do proměnné $součin
echo "Výsledek: $cislo1 * $cislo2 = ".round($soucin, 2); // výsledek vypíše do formuláře
}
if(array_key_e­xists('podil', $_POST)) // pokud je stisknuto tlačítko "děleno"
{
if($cislo2 == 0) // jestliže je dělitel nula
{
echo "Chyba! $cislo1 : $cislo2
";
echo "Nulou nelze dělit!";
}
else
{
$podil = $cislo1 / $cislo2; // vydělí hodnoty a vloží výsledek do proměnné $podíl
echo "Výsledek: $cislo1 : $cislo2 = ".round($podil, 2); // výsledek vypíše do formuláře
}

}
}
}

 
Odpovědět 31. října 13:03
Avatar
Odpovídá na Miroslav Mucha
Jakub Chuděj:31. října 13:25

Ahoj, kód prosímtě příště vkládej do tagu kódu (2 z leva vedle emotikon), jinak co přesně máš za problém s kalkulačkou? :)

Odpovědět 31. října 13:25
Kdo chce, hledá způsob, kdo nechce, hledá důvod.
Avatar
Miroslav Mucha:31. října 13:28

Díky za info, teď už to snad bude v pořádku. Problém žádný, jen trochu jiná varianta

<title>Kalkulačka</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">

<h1>Kalkulačka</h1>
<p>Zadejte 2 čísla</p>

<!-- vytvoření vstupního formuláře pro zadání čísel -->
<form method="POST" action="">
    <input type="text" name="cislo1" /><br />
    <input type="text" name="cislo2" /><br />
    <input type="submit" name="soucet" value="+" />
    <input type="submit" name="rozdil" value="-" />
    <input type="submit" name="soucin" value="*"/>
    <input type="submit" name="podil" value="/"/>
</form>

<?php
if(array_key_exists('cislo1', $_POST))  // kontrola, zda byl odeslán formulář
{
    if(($_POST['cislo1'] == "") || ($_POST['cislo2'] == ""))    // pokud je v jednom nebo v obou polích prázdná hodnota
    {
        echo "Musíš zadat obě hodnoty";
    }
    elseif((!is_numeric($_POST['cislo1'])) || (!is_numeric($_POST['cislo2'])))  // pokud je v jednom nebo v obou polích nenumerická hodnota
    {
        echo "V obou polích musí být číslo";
    }
    else
    {
        $cislo1 = $_POST['cislo1']; // přiřadí proměnné $cislo1 hodnotu z pole 1
        $cislo2 = $_POST['cislo2']; // přiřadí proměnné $cislo2 hodnotu z pole 2
        if(array_key_exists('soucet', $_POST))  // pokud je stisknuto tlačítko "plus"
        {
            $soucet =  $cislo1 + $cislo2;   // sečte hodnoty a vloží výsledek do proměnné $součet
            echo "Výsledek: $cislo1 + $cislo2 = $soucet"; // výsledek vypíše do formuláře
        }
        if(array_key_exists('rozdil', $_POST))  // pokud je stisknuto tlačítko "mínus"
        {
            $rozdil =  $cislo1 - $cislo2;   // odečte hodnoty a vloží výsledek do proměnné $rozdíl
            echo "Výsledek: $cislo1 - $cislo2 = $rozdil"; // výsledek vypíše do formuláře
        }
        if(array_key_exists('soucin', $_POST))  // pokud je stisknuto tlačítko "krát"
        {
            $soucin =  $cislo1 * $cislo2;   // vynásobí hodnoty a vloží výsledek do proměnné $součin
            echo "Výsledek: $cislo1 * $cislo2 = ".round($soucin, 2);  // výsledek vypíše do formuláře
        }
        if(array_key_exists('podil', $_POST))   // pokud je stisknuto tlačítko "děleno"
        {
            if($cislo2 == 0)    // jestliže je dělitel nula
            {
                echo "Chyba! $cislo1 : $cislo2 <br />";
                echo "Nulou nelze dělit!";
            }
            else
            {
                $podil =  $cislo1 / $cislo2;    // vydělí hodnoty a vloží vásledek do proměnné $podíl
                echo "Výsledek: $cislo1 : $cislo2 = ".round($podil, 2);   // výsledek vypíše do formuláře
            }

        }
    }
}
 
Odpovědět 31. října 13:28
Avatar
Odpovídá na Miroslav Mucha
Jakub Chuděj:31. října 13:28

Už to vidím, kód jsem si hodil na web, chybí ti tam za podmínkou IF podmínka, za které se to má vykonat, máš tam jen prázdné IF na řádku 24.

EDIT: Jojo, než jsem zareagoval, už jsi sem hodil novější variantu kódu. :)

Editováno 31. října 13:29
Odpovědět 31. října 13:28
Kdo chce, hledá způsob, kdo nechce, hledá důvod.
Avatar
Miroslav Mucha:31. října 13:45

Omlouvám se všem za svůj příspěvek, který jsem vložil ve 13:03. Je ořezaný a tudíž k ničemu. Níže pod ním už je kód kompletní.

 
Odpovědět 31. října 13:45
Avatar
Lukáš Vaněk:20. listopadu 20:57

Prosím nepochopil jsem doplnění kalkulačky kod jsem napsal stejně, potom jsem to pro jistotu zkopíroval ale stejně mi to napiše:
Notice: Undefined index: cislo1 in C:\xampp\htdoc­s\Kalkulacka2\vy­pocet.php on line 14

Notice: Undefined index: cislo2 in C:\xampp\htdoc­s\Kalkulacka2\vy­pocet.php on line 15

Notice: Undefined index: operace in C:\xampp\htdoc­s\Kalkulacka2\vy­pocet.php on line 16

Notice: Undefined variable: vysledek in C:\xampp\htdoc­s\Kalkulacka2\vy­pocet.php on line 31
Výsledek:

vůbec mi to nenabídne možnost něco zadat.

když jsem zkusil vložit pomocnou funkci isset()

if (isset($_POST["cislo1"]) && isset($_POST["cislo2"]) && isset($_POST["operace"]))
        {
        $a = $_POST['cislo1'];
        $b = $_POST['cislo2'];
        $operace = $_POST['operace'];

        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");
        ?>

tak mi to vyhodí : Výsledek: Chyba ale pořád nikde nemohu zadat hodnoty a volbu jakou chci operaci.
Děkuji předem za radu.

 
Odpovědět 20. listopadu 20:57
Avatar
Lukáš Vaněk:20. listopadu 22:41

už jsme to vyřešil .
Problém byl v tom že jsem soubor přejmenoval a i když jsem to přejmenoval na původní název nešlo to.

 
Odpovědět 20. listopadu 22:41
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 71. Zobrazit vše