1 of 20

Tvorba webu VI.

Mgr. Michal Jakl

2 of 20

Prostor pro vyhodnocení úkolu z minula ☺

3 of 20

Obsah lekce

  1. MySQL databáze

​

​

​

​

​

​

Praktické cvičení: Využití databází pro webové projekty

4 of 20

1. MySQL databáze – obecné informace

= My Structured Query Language je databázový systém relačního typu

  • Jedná se o multiplatformí databázi, která komunikuje prostřednictvím jazyka SQL
  • Umí pracovat s různými daty (obrázky, texty apod.) a umožňuje vytvářet tabulky včetně editace a mazání jejich záznamů
  • Pro snadnou správu databáze můžete využít open source nástroj PhpMyAdmin, který umožňuje kompletní správu systému přes webové rozhraní.

5 of 20

1. MySQL databáze – struktura

6 of 20

1. MySQL databáze – základní dotazy

Výběr dat

Vložení dat

Aktualizace dat

Smazání dat

7 of 20

1. MySQL databáze – datové typy

Datový typ definuje v programování druh nebo význam hodnot, kterých smí nabývat proměnná (nebo konstanta). Je určen oborem hodnot a zároveň výpočetními operacemi, které lze s hodnotami tohoto typu provádět. Nemůže být určen pouze oborem hodnot, protože existují i datové typy lišící se pouze v operacích, které je s nimi možné provádět.

NULL = hodnota nenastavena

8 of 20

1,5. Databáze - bezpečnost

Dotaz v PHP

Vstup od uživatele

Dotaz do databáze

Výpis všech záznamů!!!

Nebo dokonce smazání celé tabulky!

Řešení?

  • Na straně aplikace = escapování znaků
  • Na straně databáze = oprávnění uživatelů

9 of 20

Praktické cvičení

  • Využití databází pro webové projekty

10 of 20

Aktivace databáze na virtuálním serveru UJEP

11 of 20

Vytvoření tabulky v databázi

12 of 20

Jak mluvit s databází v 21. století?

  1. Dnes používáme výhradně PDO (PHP Data Objects)
    1. Je to vestavěná třída v PHP, která umí mluvit s MySQL, PostgreSQL i SQLite úplně stejně
  2. Základní pravidlo: Už NIKDY neskládáme SQL dotazy lepením proměnných (žádné "... WHERE id = " . $id)
    • Místo toho používáme Prepared Statements (Připravené dotazy)
      1. Otazníky (Poziční parametry)
        1. Používají se jednoduché znaky ?.
        2. Výhoda: Rychle se to píše, ideální pro krátké dotazy (např. hledání podle jednoho ID).
        3. Nevýhoda: Záleží na přesném pořadí. Co je první v SQL, musí být první v poli v execute.

​

$stmt = $pdo->prepare("INSERT INTO tabulka (Jmeno, Prijmeni) VALUES (?, ?)");

// Musíš dodržet přesné pořadí: nejdřív jméno, pak příjmení

$stmt->execute([ $_GET['jmeno'], $_GET['prijmeni'] ]);

​

      • Dvojtečky (Pojmenované parametry)
        • Používají se názvy s dvojtečkou na začátku, např. :jmeno, :id.
        • Výhoda: Jsou "blbuvzdorné". Vůbec nezáleží na tom, v jakém pořadí je poskládáš do pole v execute(), protože databáze si je spáruje podle jména.
        • Nevýhoda: Je to trochu víc psaní.

​

$stmt = $pdo->prepare("INSERT INTO tabulka (Jmeno, Prijmeni) VALUES (:jmeno, :prijmeni)");

// Tady můžu pořadí klidně prohodit, databáze si klíč 'jmeno' najde sama:

$stmt->execute([

'prijmeni' => $_GET['prijmeni'],

'jmeno' => $_GET['jmeno']

]);

13 of 20

Otevření připojení (soubor db.php)

<?php

// 1. Nastavení přístupů

$host = '192.168.33.234';

$db = 'student';

$user = 'student';

$pass = 'student';

​

// 2. Samotné připojení

try {

$dsn = "pgsql:host=$host;port=5432;dbname=$db";

$pdo = new PDO($dsn, $user, $pass, [

PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,

PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,

PDO::ATTR_EMULATE_PREPARES => false,

]);

​

} catch (PDOException $e) {

die("Kruci, chyba databáze: " . $e->getMessage());

}

?>

14 of 20

Připravené dotazy (štít proti hackerům)

<?php

// Chceme najít uživatele podle ID, které přišlo z URL

$hledaneId = $_GET['id'];

​

// 1. Připravíme dotaz (místo hodnot dáme otazníky)

$stmt = $pdo->prepare('SELECT jmeno, email FROM uzivatele WHERE id = ?');

​

// 2. Spustíme dotaz a podstrčíme mu proměnné

$stmt->execute([$hledaneId]);

​

// 3. Vyzvedneme data

$uzivatel = $stmt->fetch();

echo $uzivatel['jmeno'];

?>

15 of 20

Více vstupů - více výstupů

<?php

// Chceme najít uživatele podle VÍCE parametrů (např. role a ročník)

$hledanaRole = $_GET['role'];

$hledanyRocnik = $_GET['rocnik'];

​

// 1. Připravíme dotaz (místo hodnot dáme více otazníků)

$stmt = $pdo->prepare('SELECT jmeno, email FROM uzivatele WHERE role = ? AND rocnik = ?');

​

// 2. Spustíme dotaz a podstrčíme mu proměnné (POZOR: musí být v přesném pořadí jako otazníky!)

$stmt->execute([$hledanaRole, $hledanyRocnik]);

​

// 3. Vyzvedneme VŠECHNA data (fetchAll vrátí pole všech nalezených řádků)

$uzivatele = $stmt->fetchAll();

​

// 4. Vypíšeme je pomocí cyklu foreach

foreach ($uzivatele as $uzivatel) {

echo $uzivatel['jmeno'] . " - " . $uzivatel['email'] . "<br>";

}

?>

16 of 20

Tvorba jednoduchého záznamníku kontaktů

17 of 20

<hr>

​

<h3>Přidat nový záznam</h3>

<form action="index.php" method="GET">

<label>

Jméno: <br>

<input type="text" name="jmeno" required>

</label>

<br><br>

<label>

Příjmení: <br>

<input type="text" name="prijmeni" required>

</label>

<br><br>

<label>

Telefon: <br>

<input type="text" name="cislo">

</label>

<br><br>

<button type="submit">Uložit do databáze</button>

</form>

​

<hr>

Základní HTML formulář

18 of 20

<?php

require_once 'db.php';

​

if (!empty($_GET['jmeno']) && !empty($_GET['prijmeni'])) {

$stmt = $pdo->prepare("INSERT INTO tabulka (Jmeno, Prijmeni, Telefon) VALUES (:jmeno, :prijmeni, :telefon)");

$stmt->execute([

'jmeno' => $_GET['jmeno'],

'prijmeni'=> $_GET['prijmeni'],

'telefon' => $_GET['cislo'] ?? ''

]);

header("Location: index.php");

exit;

}

​

elseif (isset($_GET['del']) && $_GET['del'] == "1" && !empty($_GET['id'])) {

$stmt = $pdo->prepare("DELETE FROM tabulka WHERE ID = :id");

$stmt->execute([

'id' => $_GET['id']

]);

header("Location: index.php");

exit;

}

​

echo "<h2>Výstup:</h2>";

$stmt = $pdo->query("SELECT * FROM tabulka ORDER BY Jmeno ASC");

$data = $stmt->fetchAll();

foreach ($data as $zaznam) {

$jmeno = htmlspecialchars($zaznam['Jmeno']);

$prijmeni= htmlspecialchars($zaznam['Prijmeni']);

$telefon = htmlspecialchars($zaznam['Telefon']);

// ID rovnou přetypujeme na číslo (int) pro jistotu

$id = (int)$zaznam['ID'];

echo $jmeno . " " . $prijmeni . " (" . $telefon . ") <a href='index.php?del=1&id=" . $id . "'>Smazat</a><br>";

}

?>

Otevření přístupu k databázi

Vložení nového záznamu

Smazání záznamu

Výpis všech záznamů z databáze

19 of 20

Na doma

Využijte možností databází pro svůj semestrální projekt (příjem a výpis objednávek)

20 of 20

mail@mjakl.cz

Tel. 608 544 839

Web: mjakl.cz

​

Děkuji za pozornost a těším se příště!��Prostor pro zpětnou vazbu