Projekt "Registrace uživatelů"


1. Adresář pro webovou aplikaci

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

2. Terminál: Příprava databáze

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;

3. PHP: Připojení k databázi

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");
?>

4. PHP: Čtení a výpis

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

5. PHP: Registrace a zápis

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

6. MariaDB: Kontrola zapsaných dat

Přihlaste se do databáze a vypište si tabulku s daty. Jak vypadají?

7. MariaDB: Úprava záznamů

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?

8. Úvodní stránka webu

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>