PHP – ďábelské podmínky a cykly

27. června 2000

V předchozím díle jsme se naučili zpracovávat údaje z formulářů a odeslat je pomocí funkce Mail na e-mail. Abychom našim skriptům dodali více inteligence a flexibility, v tomto díle si ukážeme, jak se v PHP používají podmínky a cykly. Podíváme se také na chybová hlášení a ladění skriptu.

Základní podmínkovou konstrukci jistě většina z vás zná z jiných jazyků. V PHP vypadá takto:

if (platí něco) udělej něco;
if ($a > 2) $a = 2; pokud je $a větší než 2, dej do $a hodnotu 2;

Zde je přehled operátorů, které můžeme v podmínce používat:

<, >, ==, != je menší, je větší, rovná se, nerovná se
<=, >= je menší nebo rovno, je větší nebo rovno
!, &&, || negace, logický součin (a zároveň), logický součet (nebo)


Důležité je si všimnout, že pro porovnávání se používají dva znaky = za sebou (pokud by byl použit pouze jeden, proběhlo by přiřazení a pokud by byla přiřazena nenulová hodnota, podmínka by byla vždy splněna). Aby bylo vše názornější, zde je několik příkladů složitějších podmínek:

if (($a == $b) && ($b == $c)) echo „Všechna čísla jsou stejná!“;
if (($a != $b) || ($b != $c)) echo „Některé číslo je jiné!“; // svislou čáru v operátoru nebo můžeme získat klávesovou kombinací Alt + 124
if (!($a <> 1)) echo „a je rovno 1!“; // <> je synonymum pro != (nerovná se), podmínka nám říká „pokud není pravda, že a se nerovná 1…“
if (!$pocet_chyb) echo „Výborně, bez chyby se to povede málokomu!“; // využíváme toho, že nula v PHP odpovídá nepravdě, podmínka je tedy splněna, pokud v proměnné $pocet_chyb je nulová hodnota

Pokud potřebujeme provést při splnění podmínky více příkazů a/nebo chceme něco provést naopak při nesplnění podmínky, syntaxe vypadá takto:

if (platí něco):
první příkaz; // tyto tři příkazy se provedou, pokud je splněná první podmínka
druhý příkaz;
třetí příkaz;
elseif (platí něco):
první příkaz; // tyto tři příkazy se provedou, pokud není splněná první, ale je splněná druhá podmínka
druhý příkaz;
třetí příkaz;
elseif (platí něco):
první příkaz; // tyto tři příkazy se provedou, pokud není splněná první ani druhá, ale je splněná třetí podmínka
druhý příkaz;
třetí příkaz;
else:
první příkaz; // tyto tři příkazy se provedou, pokud není splněná žádná ze tří podmnínek
druhý příkaz;
třetí příkaz;
endif;

K většině příkazů pro podmínky a cykly existuje alternativní zápis pomocí složených závorek. Pro if vypadá takto (v následujících dílech seriálu syntaxi se složenými závorkami nebudu používat):

if (platí něco)
{
příkazy;
}
elseif
{
příkazy;
}
else
{
příkazy;
}

Zde je malý příklad toho, jak může taková trochu složitější konstrukce vypadat:

if ($pocet_chyb == 0):
echo „Výborně! Žádná chyba je pěkný výsledek.“;
elseif ($pocet_chyb < 5):
echo „Ještě docela dobrý výsledek.“;
else:
echo „Žádný učený z nebe nespadl.“;
endif;

Pokud se má některá část skriptu provádět opakovaně, využijeme příkazy while nebo for:

$i = 1000;
while ($i > 0): // dokud je $i větší než nula, prováděj následující příkazy
echo „$i<br>“;
$i–;
endwhile; // tento cyklus sestupně vypíše čísla od 1000 do 1
for ($i = 1000; $i > 0; $i–): // totéž jako předchozí příklad
echo „$i<br>“; // protože je v těle cyklu jen jeden příkaz, šlo by napsat jen for ($i = 1000; $i > 0; $i–) echo „$i<br>“;
endfor;

Struktura while – endwhile pracuje následovně: vždy se otestuje podmínka ve while, a pokud platí, provedou se příkazy mezi while a endwhile, poté se vše opakuje, dokud není podmínka porušena. Je třeba si dávat pozor na nekonečné cykly, i když každý skript je po určitém časovém intervalu (zpravidla 30 sekund) serverem sám násilně ukončen.

Struktura for – endfor je poněkud složitější. Příkaz for má syntaxi for (příkaz1, podmínka, příkaz2). Nejprve se provede příkaz1 a tělo cyklu (vše mezi for a endfor). Poté se provede příkaz2 a vyhodnotí se výraz. Pokud je pravdivý, opět se provede tělo cyklu a poslední krok se opakuje. Cykly je do sebe možné i vnořovat. Následující příklad vnořených cyklů nám vypíše malou násobilku:

<html>
<head>
<meta http-equiv=“Content-Type“ content=“text/html; charset=windows-1250″>
<title>PHP – ukázka 3</title>
</head>
<body bgcolor=“#FFFFFF“ text=“#000000″>
<center><font face=“Arial CE, Arial“ size=“3″>
<?php
for ($i = 1; $i <= 10; $i++):
for ($j = $i; $j <= 10; $j++):
echo $i . “ * “ . $j . “ = “ . $i * $j . „<br>“;
endfor;
endfor;
?>
</font></center>
</body>
</html>

Ve vnějším cyklu se postupně mění proměnná $i od 1 do 10. Protože známe komutativní zákon, necháme druhý činitel (proměnnou $j) růst od hodnoty $i do 10. V těle cyklu je pouze jeden příkaz echo, který vypisuje hodnotu součinu.

Předchozí skript už není úplně triviální, takže se nám do něj klidně může vloudit chyba. Řekněme, že za příkazem echo vynecháme středník. Místo toho, abychom byli zasvěceni do tajů malé násobilky, skript se na nás bude zlobit a vypíše nějakou takovou chybovou hlášku:

Parse error: parse error, expecting `‘,“ or `‘;“ in /www/vhosts/novyden.cz/www/php/ukazka4b.php on line 15

PHP nám označí řádek, na kterém je chyba (v tomto případě řádek 15). Řádky se číslují odshora počínaje prvním. Na patnáctém řádku je první z příkazů endfor – středník sice chybí o řádek výše, ale teprve tento příkaz PHP zmate. Informace o čísle řádku s chybou je většinou jediná informace, kterou nám PHP poskytne, text chybového hlášení se většinou omezí na lakonické Parse error.

Je třeba si zapamatovat, že chyba může být klidně o několik řádků výše. S trochou trpělivosti ale většinou není problém syntaktické chyby odstranit, horší je to s chybami logickými (tj. když skript sice pracuje dobře, ale dělá něco jiného, než má). V tom případě nám nezbývá nic jiného, než celý náš výtvor prošpikovat příkazy echo, které nám budou vypisovat obsahy jednotlivých proměnných. Pak budeme odsouzeni k pečlivému zkoumání, kdeže se obsahy proměnných začínají odchylovat od našeho záměru.

Shrnutí anebo co si je třeba pamatovat

  • Jako podmínka se používá klasická konstrukce if – then – else známá z řady dalších jazyků.
  • Operátor přiřazení je =, operátor rovnosti je ==.
  • Pro opakované provádění příkazů využijeme cykly tvořené pomocí while a for.
  • Většina příkazů pro podmínky a cykly má alternativní syntaxi (zápis pomocí složených závorek), ta však většinou není příliš užitečná.
  • Pokud se chceme v našich výtvorech vyznat, měli bychom např. těla podmínek a cyklů odsazovat a používat dostatek poznámek.
  • U syntaktických chyb nám PHP ohlásí číslo řádku, se kterým není spokojeno. Mnohem horší jsou však chyby logické.

V příštím díle se naučíme ukládat data do souborů a ukážeme si, jak naprogramovat on-line test s real-time statistikami úspěšnosti dosavadních návštěvníků.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Štítky: Články

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *