← IT

Dynamické stránky a serverové skriptování

Doplněný obsah — není z archivu podkladů, napsáno podle ŠVP. Vhodné ověřit u vyučujícího.

Statické vs. dynamické stránky

Klient a server

Vývojové prostředí

Datové typy

Větvení a cykly

Pole a práce s textovým řetězcem

Uživatelské rozhraní a formuláře

Ukládání dat mimo operační paměť

Ukázka – jednoduchý formulář zpracovaný v PHP

<!-- formular.html -->
<form action="zpracuj.php" method="post">
  <input type="text" name="jmeno" placeholder="Vaše jméno">
  <button type="submit">Odeslat</button>
</form>
<?php
// zpracuj.php - serverový skript, který zpracuje odeslaná data
$jmeno = $_POST["jmeno"];

if ($jmeno !== "") {
    echo "Ahoj, " . $jmeno . "!";
} else {
    echo "Nezadali jste žádné jméno.";
}
?>

Praktické příklady

Formulář s více poli a validací na serveru

Formulář může obsahovat víc polí najednou. Serverový skript by měl vždy zkontrolovat, jestli uživatel opravdu vyplnil to, co má, a jestli mají data správný formát – spoléhat se pouze na validaci v prohlížeči (JavaScript) nestačí, protože formulář lze odeslat i bez použití prohlížeče (např. přes jiný nástroj), a server tak musí ověřit data znovu.

<!-- kontakt.html -->
<form action="odeslat-kontakt.php" method="post">
  <input type="text" name="jmeno" placeholder="Vaše jméno">
  <input type="text" name="email" placeholder="Váš e-mail">
  <textarea name="zprava" placeholder="Vaše zpráva"></textarea>
  <button type="submit">Odeslat</button>
</form>
<?php
// odeslat-kontakt.php - zpracování kontaktního formuláře s validací

$jmeno = $_POST["jmeno"];
$email = $_POST["email"];
$zprava = $_POST["zprava"];

$chyby = []; // pole, do kterého se budou sbírat nalezené chyby

// kontrola, že jsou vyplněná všechna povinná pole
if (trim($jmeno) === "") {
    $chyby[] = "Vyplňte prosím jméno.";
}
if (trim($zprava) === "") {
    $chyby[] = "Vyplňte prosím zprávu.";
}

// kontrola formátu e-mailu pomocí vestavěné funkce filter_var()
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    $chyby[] = "Zadejte platný e-mail.";
}

if (count($chyby) > 0) {
    // pokud nastala aspoň jedna chyba, vypíšeme seznam chyb
    echo "<h2>Formulář obsahuje chyby:</h2><ul>";
    foreach ($chyby as $chyba) {
        echo "<li>" . $chyba . "</li>";
    }
    echo "</ul>";
} else {
    // data jsou v pořádku, dalo by se pokračovat např. uložením do databáze
    echo "<p>Děkujeme, " . $jmeno . ", vaše zpráva byla odeslána.</p>";
}
?>

Session – přihlášení uživatele

Session umožňuje uchovat data o konkrétním uživateli mezi jednotlivými požadavky (např. po dobu, kdy je přihlášený). Server uživateli při první návštěvě přidělí jedinečné ID session, které se ukládá v prohlížeči (obvykle formou cookie) a posílá s každým dalším požadavkem, díky čemuž server pozná, o kterého uživatele jde.

<!-- prihlaseni.html -->
<form action="prihlas.php" method="post">
  <input type="text" name="uzivatel" placeholder="Uživatelské jméno">
  <input type="password" name="heslo" placeholder="Heslo">
  <button type="submit">Přihlásit se</button>
</form>
<?php
// prihlas.php - ověření přihlašovacích údajů a spuštění session

session_start(); // musí být na začátku skriptu, ještě před jakýmkoli výstupem

$uzivatel = $_POST["uzivatel"];
$heslo = $_POST["heslo"];

// v reálné aplikaci by se heslo porovnávalo s (zahashovanou) hodnotou v databázi
if ($uzivatel === "admin" && $heslo === "tajneheslo") {
    // uložení informace o přihlášení do session - dostupné i na dalších stránkách
    $_SESSION["prihlasen"] = true;
    $_SESSION["jmeno"] = $uzivatel;
    echo "Přihlášení proběhlo úspěšně.";
} else {
    echo "Špatné uživatelské jméno nebo heslo.";
}
?>
<?php
// vitejte.php - stránka dostupná pouze přihlášeným uživatelům

session_start(); // session je nutné spustit na každé stránce, kde s ní chceme pracovat

if (isset($_SESSION["prihlasen"]) && $_SESSION["prihlasen"] === true) {
    echo "Vítejte, " . $_SESSION["jmeno"] . "!";
} else {
    echo "Musíte se nejprve přihlásit.";
}
?>

Připojení k databázi a práce s daty (MySQL)

Pro trvalé uložení většího množství strukturovaných dat (např. registrovaní uživatelé, objednávky, články) se používá databáze. Následující příklady používají rozšíření mysqli pro práci s databází MySQL.

<?php
// pripojeni.php - navázání spojení s databází, vkládá se na začátek dalších skriptů

$spojeni = mysqli_connect("localhost", "uzivatel_db", "heslo_db", "eshop");

if (!$spojeni) {
    die("Připojení k databázi se nezdařilo: " . mysqli_connect_error());
}
?>

Vložení dat z formuláře do databázové tabulky (INSERT):

<?php
// ulozit-kontakt.php - uloží vyplněný formulář do tabulky "zpravy"

require "pripojeni.php";

$jmeno = $_POST["jmeno"];
$email = $_POST["email"];
$zprava = $_POST["zprava"];

// hodnoty se do dotazu vkládají jako parametry (prepared statement),
// aby nemohlo dojít k tzv. SQL injection při zadání škodlivého vstupu
$dotaz = mysqli_prepare($spojeni, "INSERT INTO zpravy (jmeno, email, zprava) VALUES (?, ?, ?)");
mysqli_stmt_bind_param($dotaz, "sss", $jmeno, $email, $zprava);
mysqli_stmt_execute($dotaz);

echo "Zpráva byla uložena do databáze.";
?>

Výpis dat z tabulky (SELECT):

<?php
// vypis-zprav.php - vypíše všechny uložené zprávy z tabulky "zpravy"

require "pripojeni.php";

$vysledek = mysqli_query($spojeni, "SELECT jmeno, email, zprava FROM zpravy ORDER BY id DESC");

echo "<ul>";
while ($radek = mysqli_fetch_assoc($vysledek)) {
    // $radek je asociativní pole s klíči podle názvů sloupců
    echo "<li><strong>" . $radek["jmeno"] . "</strong> (" . $radek["email"] . "): " . $radek["zprava"] . "</li>";
}
echo "</ul>";
?>

Cookies

Cookie je malý kus dat, který server uloží do prohlížeče uživatele a který se pak automaticky posílá zpět serveru při každém dalším požadavku na stejný web. Na rozdíl od session zůstávají cookies uložené v prohlížeči i po zavření okna (podle nastavené doby platnosti) a lze je tedy použít i pro dlouhodobější zapamatování údajů (např. preferovaný jazyk).

<?php
// nastav-cookie.php - uloží do prohlížeče uživatele preferovaný jazyk

// jméno cookie, hodnota, čas expirace (aktuální čas + 30 dní v sekundách)
setcookie("jazyk", "cs", time() + 30 * 24 * 60 * 60);

echo "Jazyk byl nastaven.";
?>
<?php
// pouzij-cookie.php - přečte hodnotu uloženou v cookie při dalších návštěvách

if (isset($_COOKIE["jazyk"])) {
    echo "Vítejte zpět, váš jazyk je: " . $_COOKIE["jazyk"];
} else {
    echo "Jazyk zatím nebyl nastaven.";
}
?>

GET vs. POST

Formulář lze odeslat dvěma nejběžnějšími metodami, které se liší v tom, kam se odeslaná data zapíší:

<!-- vyhledavani.html - formulář odeslaný metodou GET -->
<form action="vysledky.php" method="get">
  <input type="text" name="dotaz" placeholder="Co hledáte?">
  <button type="submit">Hledat</button>
</form>
<?php
// vysledky.php - hodnota z GET formuláře se čte z pole $_GET
// URL po odeslání bude vypadat např. takto: vysledky.php?dotaz=maturita

$dotaz = $_GET["dotaz"];
echo "Hledáte: " . $dotaz;
?>

Tvorba vlastních dynamických stránek