Vytvořte adresář registrace pro soubory webové aplikace. Dále nastavte oprávnění, aby v ní mohl pracovat běžný uživatel a měl do ní přístup webový server Apache. Pro další práci to bude snazší.
$ sudo /var/www/html/registrace
$ sudo chown user:www-data /var/www/html/registrace
Přihlášení do MariaDB (jako root):
$ sudo mariadb
Následují SQL příkazy. Vytvoříme uživatele admin (aby se nepoužíval root v PHP) a tabulku.
(1) Vytvoření databáze:
> CREATE DATABASE users;
(2) Vytvoření uživatele pro PHP a přidělení práv:
> CREATE USER 'admin'@'localhost' IDENTIFIED BY 'SilneHeslo';
> GRANT ALL PRIVILEGES ON users.* TO 'admin'@'localhost';
> FLUSH PRIVILEGES;
(3) Přepnutí do databáze:
> USE users;
(4) Vytvoření tabulky:
CREATE TABLE uzivatele (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL,
heslo VARCHAR(255) NOT NULL,
vytvoreno TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
overeno TINYINT(1) DEFAULT 0
);
(5) Do tabulky přidáme první dva záznamy. Data do polí id, vytvoreno a overeno nevkládáme, vytvoří se samy.
> INSERT INTO uzivatele (username, email, heslo) VALUES ("pepa123", "pepa@email.cz", "heslo123");
> INSERT INTO uzivatele (username, email, heslo) VALUES ("jan76", "nekdo@nekde.com", "passwd555");
(6) Kontrola (volitelné):
> DESCRIBE uzivatele;
> SELECT * FROM uzivatele;
> EXIT;
Tento soubor budeme vkládat ("includovat") do ostatních skriptů. Ukazuje princip DRY (Don't Repeat Yourself).
Soubor: /var/www/html/registrace/db.php
<?php
$server = "localhost";
$uzivatel = "admin";
$heslo = "SilneHeslo";
$databaze = "users";
// Vytvoření připojení (procedurální styl)
$conn = mysqli_connect($server, $uzivatel, $heslo, $databaze);
// Kontrola připojení
if (!$conn) {
die("Chyba připojení k databázi: " . mysqli_connect_error());
}
// Nastavení kódování (důležité pro češtinu)
mysqli_set_charset($conn, "utf8");
?>
Soubor: /var/www/html/registrace/vypis.php
<?php
require_once 'db.php';
// SQL dotaz pro získání dat
$sql = "SELECT username, email, vytvoreno, overeno FROM uzivatele ORDER BY vytvoreno DESC";
$result = mysqli_query($conn, $sql);
// Načtení všech řádků do asociativního pole (Array of Arrays)
$uzivatele = mysqli_fetch_all($result, MYSQLI_ASSOC);
?>
<!DOCTYPE html>
<html lang="cs">
<head>
<meta charset="UTF-8">
<title>Seznam uživatelů</title>
</head>
<body>
<h2>Seznam registrovaných uživatelů</h2>
<a href="registrace.php">Zpět na registraci</a>
<hr>
<ul>
<?php foreach ($uzivatele as $u): ?>
<li>
<strong>Jméno:</strong> <?php echo htmlspecialchars($u['username']); ?> <br>
<strong>E-mail:</strong> <?php echo htmlspecialchars($u['email']); ?> <br>
<strong>Registrováno:</strong> <?php echo $u['vytvoreno']; ?> <br>
<strong>Ověřeno:</strong>
<?php
if ($u['overeno'] == 1) {
echo "<span style='color:green'>ANO</span>";
} else {
echo "<span style='color:red'>NE</span>";
}
?>
</li>
<br> <?php endforeach; ?>
</ul>
<?php
// Pokud je databáze prázdná
if (empty($uzivatele)) {
echo "<p>Zatím žádní uživatelé.</p>";
}
?>
</body>
</html>
URL skriptu bude:
http://192.168.xxx.xxx/registrace/vypis.php
/var/www/html/registrace/vypis.php
Zde demonstrujeme zpracování formuláře, sanitizaci vstupů (obrana proti SQL Injection v nejjednodušší formě), hashování hesla a logiku "pokud existuje email -> chyba".
Soubor: /var/www/html/registrace.php
<?php
// Vložení připojení k DB
require_once 'db.php';
$zprava = "";
// Zpracování formuláře pouze pokud byl odeslán metodou POST
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// Ošetření vstupů proti SQL Injection (procedurální styl)
$username = mysqli_real_escape_string($conn, $_POST['username']);
$email = mysqli_real_escape_string($conn, $_POST['email']);
$heslo_vstup = $_POST['heslo'];
// 1. KROK: Ověření, zda email už neexistuje
$sql_check = "SELECT id FROM uzivatele WHERE email = '$email'";
$result_check = mysqli_query($conn, $sql_check);
if (mysqli_num_rows($result_check) > 0) {
$zprava = "Chyba: Uživatel s tímto e-mailem už existuje!";
} else {
// 2. KROK: Hashování hesla (bezpečnostní standard)
$heslo_hash = password_hash($heslo_vstup, PASSWORD_DEFAULT);
// 3. KROK: Vložení do databáze
// Hodnoty 'vytvoreno' a 'overeno' necháme na výchozích hodnotách z DB definice
$sql_insert = "INSERT INTO uzivatele (username, email, heslo)
VALUES ('$username', '$email', '$heslo_hash')";
if (mysqli_query($conn, $sql_insert)) {
$zprava = "Úspěch! Uživatel byl registrován.";
} else {
$zprava = "Chyba při zápisu: " . mysqli_error($conn);
}
}
}
?>
<!DOCTYPE html>
<html lang="cs">
<head>
<meta charset="UTF-8">
<title>Registrace</title>
</head>
<body>
<h2>Registrace nového uživatele</h2>
<?php if ($zprava): ?>
<p style="font-weight: bold; color: red;"><?php echo $zprava; ?></p>
<?php endif; ?>
<form method="post" action="">
<label>Uživatelské jméno:</label><br>
<input type="text" name="username" required><br><br>
<label>E-mail:</label><br>
<input type="email" name="email" required><br><br>
<label>Heslo:</label><br>
<input type="password" name="heslo" required><br><br>
<input type="submit" value="Registrovat se">
</form>
<br>
<a href="vypis.php">Přejít na výpis uživatelů</a>
</body>
</html>
URL skriptu bude:
http://192.168.xxx.xxx/registrace/registrace.php
/var/www/html/registrace/registrace.php
Přihlaste se do databáze a vypište si tabulku s daty. Jak vypadají?
Jednomu nebo více uživatelům změňte status na "ověřeno":
> UPDATE uzivatele SET overeno = 1 WHERE id = 2;
Pak je skriptem vypište. Funguje?
Vytvořte soubor index.html s odkazy na oba soubory se skripty. Jelikož neobsahuje PHP skripty, může mít příponu .html.
<!DOCTYPE html>
<html lang="cs">
<head>
<meta charset="UTF-8">
<title>Úvodní stránka</title>
</head>
<body>
</body>
</html>