Instalace již proběhla.

Pokud chceš instalaci opakovat, smaž soubor auth/install.lock. Pozor – tím přijdeš o všechna data!

'); } // ------------------------------------------------------------ // SQL PŘÍKAZY PRO VYTVOŘENÍ TABULEK // ------------------------------------------------------------ // Definujeme je jako pole – použijeme je jak pro automatické // spuštění, tak pro zobrazení uživateli k ručnímu zadání. $sql_tabulky = [ 'auth_users' => "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", 'auth_remember_tokens' => "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", 'auth_brute_force' => "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", 'auth_password_resets' => "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 služby je volitelná if (DB_TABULKA_SLUZBA !== '') { $sql_tabulky['sluzba'] = "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"; } // ------------------------------------------------------------ // POMOCNÁ FUNKCE: Ověření existence tabulek // ------------------------------------------------------------ // Zkontroluje, zda všechny potřebné tabulky existují v DB. // Vrací pole chybějících tabulek (prázdné = vše OK). function zkontroluj_tabulky(PDO $pdo): array { // Zjistíme, které tabulky existují v aktuální databázi $stmt = $pdo->query("SHOW TABLES"); $existuje = $stmt->fetchAll(PDO::FETCH_COLUMN); $potrebne = [ DB_TABULKA_UZIVATELE, DB_TABULKA_TOKENY, DB_TABULKA_BRUTE, DB_TABULKA_RESET, ]; if (DB_TABULKA_SLUZBA !== '') { $potrebne[] = DB_TABULKA_SLUZBA; } // Vrátíme seznam tabulek, které chybí return array_diff($potrebne, $existuje); } // ------------------------------------------------------------ // URČENÍ AKTUÁLNÍHO KROKU // ------------------------------------------------------------ $krok = 1; // výchozí krok $chyba = ''; $zprava = ''; // Krok se přenáší přes skryté pole ve formuláři $krok_z_post = (int) ($_POST['krok'] ?? 0); // ------------------------------------------------------------ // ZPRACOVÁNÍ AKCÍ // ------------------------------------------------------------ // == KROK 1: Pokus o automatické vytvoření tabulek ============ if ($krok_z_post === 0 || $krok_z_post === 1) { $auto_ok = true; foreach ($sql_tabulky as $nazev => $sql) { try { $pdo->exec($sql); } catch (PDOException $e) { // Automatické vytvoření selhalo – uživatel nemá práva $auto_ok = false; break; } } if ($auto_ok) { // Tabulky byly vytvořeny automaticky – přeskočíme na krok 4 $krok = 4; } else { // Nemáme práva – přejdeme na krok 2 (ruční SQL) $krok = 2; } } // == KROK 3: Ověření tabulek po ručním zadání SQL ============= elseif ($krok_z_post === 3) { $chybejici = zkontroluj_tabulky($pdo); if (empty($chybejici)) { // Všechny tabulky existují – přejdeme na krok 4 $krok = 4; } else { // Stále chybí tabulky – zůstaneme na kroku 2/3 $krok = 3; $chyba = 'Následující tabulky stále chybí: ' . implode(', ', $chybejici) . '. Zkontroluj, zda jsi SQL správně zadal do phpMyAdmin.'; } } // == KROK 4: Vytvoření prvního admina ========================= elseif ($krok_z_post === 4) { $email = trim($_POST['email'] ?? ''); $heslo = $_POST['heslo'] ?? ''; $heslo2 = $_POST['heslo2'] ?? ''; // Validace if (empty($email)) { $chyba = 'Email nesmí být prázdný.'; } elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) { $chyba = 'Email není platná emailová adresa.'; } elseif (empty($heslo)) { $chyba = 'Heslo nesmí být prázdné.'; } elseif (mb_strlen($heslo) < HESLO_MIN_DELKA) { $chyba = 'Heslo musí mít alespoň ' . HESLO_MIN_DELKA . ' znaků.'; } elseif ($heslo !== $heslo2) { $chyba = 'Hesla se neshodují.'; } if (empty($chyba)) { try { $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_id = $pdo->lastInsertId(); if (DB_TABULKA_SLUZBA !== '') { $stmt2 = $pdo->prepare(" INSERT INTO `" . DB_TABULKA_SLUZBA . "` (`uzivatel_id`) VALUES (:uzivatel_id) "); $stmt2->execute([':uzivatel_id' => $novy_id]); } // Vytvoříme zámek – instalace je hotová file_put_contents($lock_soubor, 'Instalace proběhla: ' . date('Y-m-d H:i:s')); $krok = 5; // krok 5 = úspěšné dokončení } catch (PDOException $e) { error_log('Chyba při instalaci (admin): ' . $e->getMessage()); $chyba = 'Při vytváření admina došlo k chybě databáze. Zkontroluj PHP error log.'; $krok = 4; } } else { // Validace selhala – zůstaneme na kroku 4 $krok = 4; } } // ------------------------------------------------------------ // SESTAVENÍ SQL TEXTU PRO ZOBRAZENÍ UŽIVATELI (krok 2) // ------------------------------------------------------------ $sql_pro_zobrazeni = implode(";\n\n", $sql_tabulky) . ';'; // ------------------------------------------------------------ // HTML VÝSTUP // ------------------------------------------------------------ ?> Instalace – <?php echo htmlspecialchars(PROJEKT_NAZEV); ?>

Instalace systému přihlašování

Chyba:

Nepodařilo se automaticky vytvořit tabulky v databázi – pravděpodobně nemá databázový uživatel dostatečná oprávnění (CREATE TABLE).

Postup:

  1. Zkopíruj SQL níže.
  2. Otevři phpMyAdmin a vyber svou databázi ().
  3. Klikni na záložku SQL, vlož SQL a spusť ho.
  4. Vrať se sem a klikni na tlačítko níže.

Tabulky ještě nejsou v pořádku. Zkontroluj phpMyAdmin a zkus to znovu.

Tabulky jsou připraveny. Nyní vytvoř prvního administrátora.




Síla hesla: zadej heslo


(čekám na dostatečně silné heslo)

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í