Statické vs. dynamické stránky
- Statická stránka – obsah je pevně daný v HTML souboru, u všech uživatelů se zobrazí vždy stejně, dokud se soubor ručně neupraví
- Dynamická stránka – obsah se generuje “za běhu”, podle vstupu uživatele, dat v databázi, aktuálního data apod. – u různých uživatelů nebo v různém čase se může lišit
- Příklady dynamického obsahu: přihlášení uživatele, výpis článků z databáze, obsah nákupního košíku, výsledky vyhledávání
Klient a server
- Klient – zařízení uživatele a jeho webový prohlížeč, který zobrazuje výslednou stránku
- Server – počítač, na kterém běží webová aplikace a kde jsou uložena data (např. databáze)
- Server-side (serverové) skriptování – část kódu, která se nevykonává v prohlížeči uživatele, ale na serveru; výsledkem jejího běhu je hotová HTML stránka, kterou server pošle klientovi
- Typický průběh požadavku:
- Uživatel v prohlížeči zadá adresu nebo klikne na odkaz/odešle formulář
- Prohlížeč odešle požadavek (request) na server
- Server podle požadavku spustí příslušný skript – ten může pracovat s daty (např. číst/zapisovat do databáze nebo souboru)
- Skript vygeneruje výsledné HTML podle daných dat
- Server pošle odpověď (response) s vygenerovaným HTML zpět do prohlížeče, který ji zobrazí
- Rozdíl oproti klientskému skriptování (JavaScript v prohlížeči): serverový kód není uživateli vidět (nelze si ho zobrazit v prohlížeči jako zdrojový kód stránky), protože se vykoná ještě před odesláním odpovědi
- Běžně používané technologie pro serverové skriptování: PHP, ASP.NET, Node.js (JavaScript na straně serveru) a další – ŠVP nepředepisuje konkrétní jazyk, princip fungování je ale u všech obdobný
Vývojové prostředí
- Pro psaní a testování serverových skriptů se používá vhodné vývojové prostředí (editor/IDE s podporou zvyklého jazyka, zvýrazňováním syntaxe, nápovědou)
- Pro spuštění je potřeba webový server s podporou daného jazyka (např. lokální vývojové prostředí typu XAMPP/WAMP pro PHP) a případně databázový server
Datové typy
- Stejně jako v jiných programovacích jazycích se pracuje se základními datovými typy:
- celé číslo (integer) – např.
18 - desetinné číslo (float/double) – např.
3.14 - řetězec (string) – text, např.
"ahoj" - logická hodnota (boolean) –
true/false - pole (array) – seznam více hodnot pod jedním jménem
- celé číslo (integer) – např.
Větvení a cykly
- Podmínky – umožňují provést různý kód podle splnění dané podmínky
- Cykly (
for,while) – umožňují opakovat blok kódu, dokud platí daná podmínka nebo po daný počet opakování - Princip je shodný s jinými programovacími/skriptovacími jazyky (viz JavaScript) – liší se pouze konkrétní syntaxe zápisu
Pole a práce s textovým řetězcem
- Pole slouží k uložení více hodnot pod jednou proměnnou, k jednotlivým prvkům se přistupuje pomocí indexu (číslováno obvykle od 0)
- Nad textovým řetězcem lze provádět základní úpravy – zjištění délky, spojování (konkatenace), převod velikosti písmen, vyhledání nebo nahrazení části textu
Uživatelské rozhraní a formuláře
- Vstup od uživatele se na webu nejčastěji získává pomocí HTML formuláře s grafickými prvky – textová pole, zaškrtávací pole, přepínače, rozbalovací seznamy, tlačítko pro odeslání
- Formulář odešle svá data na server (metodou
GETneboPOST), kde je serverový skript zpracuje
Ukládání dat mimo operační paměť
- Proměnné v paměti existují jen po dobu běhu skriptu (jeden požadavek) – pro trvalé uchování dat mezi jednotlivými požadavky je nutné data ukládat mimo operační paměť
- Možnosti:
- Soubor na disku serveru (např. textový nebo CSV soubor)
- Databáze (např. MySQL) – nejběžnější řešení pro strukturovaná a rozsáhlejší data
- Session – dočasné úložiště dat vázané na konkrétního uživatele po dobu jeho návštěvy webu
- Cookies – malé soubory dat uložené v prohlížeči uživatele, které server může při dalších požadavcích číst
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.";
}
?>
- Formulář odešle vyplněné jméno metodou
POSTna server, kde skriptzpracuj.phphodnotu načte z pole$_POST, ověří ji a vygeneruje odpovídající HTML výstup, který se odešle zpět do prohlížeče
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.";
}
?>
- Session lze ukončit funkcí
session_destroy()(typicky u tlačítka “Odhlásit se”)
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íší:
- GET – data se připojí přímo do URL adresy za znak
?, např.vyhledat.php?dotaz=maturita. Vhodné pro data, která nejsou citlivá a mohou se objevit v adrese (např. vyhledávání, filtrování, stránkování) – výsledek lze uložit do záložek nebo poslat odkazem - POST – data se odesílají v těle požadavku, nejsou vidět v URL. Vhodné pro citlivá data (hesla) nebo větší množství dat (např. text celého formuláře)
<!-- 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
- Postup řešení problému při tvorbě dynamické stránky:
- Formulace problému a požadavků – co má stránka umět, jaká data zpracovávat, jaký má být výstup
- Návrh struktury stránky a potřebných dat (příp. návrh databáze)
- Implementace serverového skriptu, který data zpracuje a vygeneruje výsledné HTML
- Otestování funkčnosti (různé vstupy, chybové stavy) a nasazení na server