Instalace již proběhla. Pokud chceš instalaci opakovat, smaž soubor auth/install.lock. Pozor – tím přijdeš o všechna data!
');
}
// ------------------------------------------------------------
// ZPRACOVÁNÍ FORMULÁŘE (pokud byl odeslán)
// ------------------------------------------------------------
$chyba = '';
$uspech = false;
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// Načtení hodnot z formuláře
$email = trim($_POST['email'] ?? '');
$heslo = $_POST['heslo'] ?? '';
$heslo2 = $_POST['heslo2'] ?? '';
// Základní validace emailu
if (empty($email)) {
$chyba = 'Email nesmí být prázdný.';
} elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$chyba = 'Email není platná emailová adresa.';
}
// Validace hesla
if (empty($chyba) && empty($heslo)) {
$chyba = 'Heslo nesmí být prázdné.';
} elseif (empty($chyba) && mb_strlen($heslo) < HESLO_MIN_DELKA) {
$chyba = 'Heslo musí mít alespoň ' . HESLO_MIN_DELKA . ' znaků.';
} elseif (empty($chyba) && $heslo !== $heslo2) {
$chyba = 'Hesla se neshodují.';
}
// Pokud není chyba, spustíme instalaci
if (empty($chyba)) {
try {
// ------------------------------------------------
// VYTVOŘENÍ TABULEK
// ------------------------------------------------
// Tabulka uživatelů přihlašovacího systému
// utf8mb4 = plná podpora Unicode (diakritika, emoji)
$pdo->exec("
CREATE TABLE IF NOT EXISTS `" . DB_TABULKA_UZIVATELE . "` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`email` VARCHAR(255) NOT NULL,
`heslo` VARCHAR(255) NOT NULL,
`admin` TINYINT(1) NOT NULL DEFAULT 0,
`vytvoreno` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
");
// Tabulka remember me tokenů
// selector = veřejný identifikátor pro vyhledání záznamu v DB
// token_hash = bcrypt hash tajného tokenu (samotný token je jen v cookie)
$pdo->exec("
CREATE TABLE IF NOT EXISTS `" . DB_TABULKA_TOKENY . "` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`uzivatel_id` INT UNSIGNED NOT NULL,
`selector` VARCHAR(32) NOT NULL,
`token_hash` VARCHAR(255) NOT NULL,
`expiruje` DATETIME NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `selector` (`selector`),
FOREIGN KEY (`uzivatel_id`) REFERENCES `" . DB_TABULKA_UZIVATELE . "` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
");
// Tabulka brute force záznamů
// Ukládají se neúspěšné pokusy o přihlášení
$pdo->exec("
CREATE TABLE IF NOT EXISTS `" . DB_TABULKA_BRUTE . "` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`ip_adresa` VARCHAR(45) NOT NULL,
`email` VARCHAR(255) NOT NULL,
`cas` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `ip_adresa` (`ip_adresa`),
KEY `email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
");
// Tabulka tokenů pro obnovu hesla
// Token je platný jen omezenou dobu (viz config.php)
$pdo->exec("
CREATE TABLE IF NOT EXISTS `" . DB_TABULKA_RESET . "` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`uzivatel_id` INT UNSIGNED NOT NULL,
`token_hash` VARCHAR(255) NOT NULL,
`expiruje` DATETIME NOT NULL,
PRIMARY KEY (`id`),
FOREIGN KEY (`uzivatel_id`) REFERENCES `" . DB_TABULKA_UZIVATELE . "` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
");
// Tabulka uživatelů konkrétní služby (pokud je nastavena)
// Tato tabulka slouží pro data specifická pro tvůj projekt
// (jméno, nastavení, kontaktní údaje apod.)
if (DB_TABULKA_SLUZBA !== '') {
$pdo->exec("
CREATE TABLE IF NOT EXISTS `" . DB_TABULKA_SLUZBA . "` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`uzivatel_id` INT UNSIGNED NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uzivatel_id` (`uzivatel_id`),
FOREIGN KEY (`uzivatel_id`) REFERENCES `" . DB_TABULKA_UZIVATELE . "` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
");
}
// ------------------------------------------------
// VYTVOŘENÍ PRVNÍHO ADMIN UŽIVATELE
// ------------------------------------------------
$heslo_hash = password_hash($heslo, PASSWORD_DEFAULT);
$stmt = $pdo->prepare("
INSERT INTO `" . DB_TABULKA_UZIVATELE . "`
(`email`, `heslo`, `admin`)
VALUES
(:email, :heslo, 1)
");
$stmt->execute([
':email' => $email,
':heslo' => $heslo_hash,
]);
$novy_uzivatel_id = $pdo->lastInsertId();
// Pokud existuje tabulka služby, vytvoříme prázdný řádek
if (DB_TABULKA_SLUZBA !== '') {
$stmt2 = $pdo->prepare("
INSERT INTO `" . DB_TABULKA_SLUZBA . "`
(`uzivatel_id`)
VALUES
(:uzivatel_id)
");
$stmt2->execute([':uzivatel_id' => $novy_uzivatel_id]);
}
// ------------------------------------------------
// VYTVOŘENÍ ZÁMKU – zabránění opakované instalaci
// ------------------------------------------------
file_put_contents($lock_soubor, 'Instalace proběhla: ' . date('Y-m-d H:i:s'));
$uspech = true;
} catch (PDOException $e) {
// Chybu zalogujeme, uživateli zobrazíme obecnou hlášku
error_log('Chyba při instalaci: ' . $e->getMessage());
$chyba = 'Při instalaci došlo k chybě databáze. Zkontroluj nastavení v config.php a PHP error log.';
} catch (Exception $e) {
error_log('Chyba při instalaci: ' . $e->getMessage());
$chyba = 'Při instalaci došlo k neočekávané chybě.';
}
}
}
// ------------------------------------------------------------
// HTML VÝSTUP
// ------------------------------------------------------------
// Poznámka: žádné stylování – vše je záměrně prosté,
// aby žádný prvek nebyl skrytý nebo překrytý.
// ------------------------------------------------------------
?>
Instalace –
Instalace systému přihlašování
Instalace proběhla úspěšně!
Tabulky byly vytvořeny a první administrátor byl založen.
Byl vytvořen soubor auth/install.lock – instalaci již nelze spustit znovu.
Přejít na přihlášení
Tento skript vytvoří potřebné tabulky v databázi a založí prvního administrátora.
Spusť ho pouze jednou. Po instalaci bude zablokován souborem install.lock.
Chyba: