Tvorba webu VI.
Mgr. Michal Jakl
Prostor pro vyhodnocení úkolu z minula ☺
Obsah lekce
Praktické cvičení: Využití databází pro webové projekty
1. MySQL databáze – obecné informace
= My Structured Query Language je databázový systém relačního typu
1. MySQL databáze – struktura
1. MySQL databáze – základní dotazy
Výběr dat
Vložení dat
Aktualizace dat
Smazání dat
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
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í?
Praktické cvičení
Aktivace databáze na virtuálním serveru UJEP
Vytvoření tabulky v databázi
Jak mluvit s databází v 21. století?
$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'] ]);
$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']
]);
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());
}
?>
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'];
?>
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>";
}
?>
Tvorba jednoduchého záznamníku kontaktů
<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ář
<?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
Na doma
Využijte možností databází pro svůj semestrální projekt (příjem a výpis objednávek)
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