Formuláře v PHP 9. První aplikace: Kvadratická rovnice

Vysvětlení příkladu

Ilustrativní foto

Nezapomeňte:

INFO

Nejlépe spolu se čtením této stránky nahlížejte do kódu, dívejte se, kde co je a dumejte, co kód dělá.

K tomu si otevřete index.php ze staženého kódu.

"Zadání" pro stránku (důležité pro UX/UI)

Stránka má za úkol "spočítat kvadratickou rovnici a říkat smysluplně uživateli, co spočítala".

INFO

Nejvíce kódu napíšeme, abychom přemýšleli jako návštěvník a vypořádali se s možnými chybami.

Popis PHP kódu (zpracování a výpis dat)

1. Kontrola / zpracování dat z formuláře + příprava textů k zobrazení:

Data kontroluje / připravuje tento kód:

// 1. Inicializace
$zpravy = new Zpravy;
$povinnaPolicka = [
  ['popisek' => "Koeficient A", 'jmeno' => "a"],
  ['popisek' => "Koeficient B", 'jmeno' => "b"],
  ['popisek' => "Koeficient C", 'jmeno' => "c"],
];
$formularVyplnenSpravne = FALSE;

$reseni = [];
$odpoved = "";

// 2. Zpracuj data
if (jeFormularOdeslan()) {
  $kontrola = zkontrolujPovinnaPolicka($povinnaPolicka);

  if ($kontrola !== TRUE) {
    // chyba vyplnění povinných políček
    $zpravy->pridejZpravy($kontrola);
  } else if ((int)zjistiHodnotuPolicka('a') === 0) {
    // chyba vyplnění koeficientu a (nesmí být 0)
    $zpravy->pridejZpravu("Koeficient A nesmí být 0!", "chyba");
  } else {
    // konečně vyplněno správně :)
    $formularVyplnenSpravne = TRUE;

    $a = zjistiHodnotuPolicka('a');
    $b = zjistiHodnotuPolicka('b');
    $c = zjistiHodnotuPolicka('c');

    $reseni = kvadratickaRovnice($a, $b, $c);
    if (count($reseni) === 0) $odpoved = "Rovnice nemá řešení.";
    if (count($reseni) === 1) $odpoved = "Rovnice má 1 řešení x=" . $reseni[0] . ".";
    if (count($reseni) === 2) $odpoved = "Rovnice má 2 řešení: x<sub>1</sub>=" . $reseni[0] . " a x<sub>2</sub>=" . $reseni[1] . ".";
  }
}
Změny

Oproti příkladu z Kapitoly 6, který jen kontroloval data, vlastně přibyly tyto řádky:

// 1. Nastavení zpráv a výstupů
$reseni = [];
$odpoved = "";

// 2. Zpracuj data

  } else if ((int)zjistiHodnotuPolicka('a') === 0) {
    // chyba vyplnění koeficientu a (nesmí být 0)
    $zpravy->pridejZpravu("Koeficient A nesmí být 0!", "chyba");
  } else {
    // konečně vyplněno správně :)

    $a = zjistiHodnotuPolicka('a');
    $b = zjistiHodnotuPolicka('b');
    $c = zjistiHodnotuPolicka('c');

    $reseni = kvadratickaRovnice($a, $b, $c);
    if (count($reseni) === 0) $odpoved = "Rovnice nemá řešení.";
    if (count($reseni) === 1) $odpoved = "Rovnice má 1 řešení x=" . $reseni[0] . ".";
    if (count($reseni) === 2) $odpoved = "Rovnice má 2 řešení: x<sub>1</sub>=" . $reseni[0] . " a x<sub>2</sub>=" . $reseni[1] . ".";
  }
}

Komentář ke kódu:

Popis 1

Kromě příkazu else if (na začátku 2. bloku kódu), který

  • ošetřuje nesprávné zadání koeficientu A

celý kód vlastně jen

  • připravuje proměnné (v 1. bloku) a
  • počítá výsledek a sestavuje odpověď $odpoved (2. blok).
FUNKCE

Vlastní výpočet probíhá na řádku $reseni = kvadratickaRovnice($a, $b, $c);.
Ze zjištěného $reseni pak sestavíme $odpoved - úplně stejně jako při testu z matematiky.

Výpočet tedy řeší funkce, kterou jsme si popsali o dvě stránky dříve a která je vyčleněná do knihovny.
Zbytek PHP kódu ve stránce vlastně "jen řeší ty opičárny okolo", jako ošetřování chyb a texty výsledků.

To je správná aplikace principu Oddělení zájmů. Tak bychom měli právně programovat.

FUNKCE

Podívejme se pro pořádek a úplnost i na kód funkce, která rovnici vypočítá.

Bude možná překvapivě ktátký. Funkci najdeme v ./knihovna/matematika.php.

function kvadratickaRovnice(float $a, float $b, float $c): array
{
  $x = [];

  $d = $b**2 - 4*$a*$c;

  if ($d == 0) $x[] = -$b / (2*$a) ;

  if ($d > 0) {
    $x[] = (-$b + sqrt($d)) / (2*$a) ;
    $x[] = (-$b - sqrt($d)) / (2*$a) ;
  }

  return $x;
}

2. Výpis dat z formuláře (HTML část stránky)

Obsah stránky (text mezi hlavičkou a patičkou) vypisuje tento kód:

<?php if ($formularVyplnenSpravne) : ?>

  <h2>Vypočítal jsem zadanou rovnici <?= $a ?>x<sup>2</sup> + <?= $b ?>x + <?= $c ?> = 0 takto:</h2>

  <p><?= $odpoved ?></p>
  <p><a href='./priklad.php'>&#10140; Chci zadat další rovnici</a></p>

<?php else : ?>

  <h2>Zadej koeficienty A, B, C kvadratické rovnice ax<sup>2</sup> + bx + c = 0:</h2>

  <?= $zpravy->zobraz() ?>


  <?= vypisFormularStart("Zadej koeficienty kvadratické rovnice:") ?>

  <?= vypisInput("Koeficient A", "a", "number") ?>
  <?= vypisInput("Koeficient B", "b", "number") ?>
  <?= vypisInput("Koeficient C", "c", "number") ?>

  <?= vypisFormularKonec("Odešli") ?>

<?php endif; ?>
Výpis / Použití proměnných

Všimněte si, že kód obsahuje jen HTML kód + PHP příkazy if a echo.

I takhle bychom měli správně programovat - oddělovat výpočty od výpisů. Kód se pak snáze upravuje.

Výpis / Použití proměnných

Všimněte si také, že kód má 2 části (rozdělené příkazem if - else):

  • obsah stránky, pokud byl formulář vyplněn správně - zobrazuje řešení
  • obsah stránky, pokud formulář nebyl vyplněn správně / ještě vůbec - zprávy a formulář
Výpis / Použití proměnných

A do třetice si všimněte trochu odlišné syntaxe příkazu if:

Při programování obvykle používáme zápis

if ($podminka) { 
  ... PHP kód
} else { 
  ... PHP kód
}

Pokud však neprogramujeme, ale především vypisujeme HTML, používá se často alternativní zápis

<?php if ($podminka) : ?> 
  ... HTML kód
<?php else : ?> 
  ... HTML kód
<?php endif ; ?>
Výpis / Použití proměnných

Tvůrci PHP nám touto alternativní syntaxí umožňují dále zpřehlednit / zjednodušit kód:

Pro nás doposud obvyklý kód

<?php echo "<p>Výsledek je " . $reseni . "</p>" ; ?>

umožňuje nahradit o něco kratším / přehlednějším kódem

<p>Výsledek je <?= $reseni ?></p>
Poznámky

Nebudu vás nutit tuto syntaxi používat.
I když ti, co by do budoucna např. mohli potkat programování na VŠ, by ji používat měli.

Budu ale chtít, abyste o ní věděli a rozuměli jí, když ji uvidíte v kódu.

Poznámky

V "profi frameworcích" se pak používají tzv. šablonovací systémy, které navíc řeší i bezpečnost.

  Předchozí stránkaNásledující stránka