exec($sql); $log[] = ['ok', $label]; } catch (PDOException $e) { if (in_array($e->errorInfo[1], [1060, 1061, 1050], true)) { $log[] = ['skip', $label . ' (already exists, skipped)']; } else { $errors[] = $label . ': ' . $e->getMessage(); $log[] = ['err', $label . ': ' . $e->getMessage()]; } } } // ── 1. sessions ────────────────────────────────────────────────────────────── inst_sql($pdo, 'Create sessions table', " CREATE TABLE IF NOT EXISTS sessions ( id INT AUTO_INCREMENT PRIMARY KEY, user_id INT NULL, is_public TINYINT(1) NOT NULL DEFAULT 1, slug VARCHAR(255) NULL, name VARCHAR(255) NOT NULL, occasion VARCHAR(50) NOT NULL, mystery_set VARCHAR(50) NOT NULL, novena_day TINYINT NULL, novena_group_id INT NULL, subject_name VARCHAR(255) NULL, subject_pronoun VARCHAR(10) NULL, subject_dates VARCHAR(150) NULL, photo_path VARCHAR(500) NULL, is_pinned TINYINT(1) NOT NULL DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ", $log, $errors); // ── 2. novena_groups ───────────────────────────────────────────────────────── inst_sql($pdo, 'Create novena_groups table', " CREATE TABLE IF NOT EXISTS novena_groups ( id INT AUTO_INCREMENT PRIMARY KEY, user_id INT NULL, is_public TINYINT(1) NOT NULL DEFAULT 1, slug VARCHAR(255) NULL, name VARCHAR(255) NOT NULL, mystery_set VARCHAR(50) NOT NULL DEFAULT 'sorrowful', subject_name VARCHAR(255) NULL, subject_pronoun VARCHAR(10) NULL, subject_dates VARCHAR(150) NULL, photo_path VARCHAR(500) NULL, is_pinned TINYINT(1) NOT NULL DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ", $log, $errors); // ── 3. users ───────────────────────────────────────────────────────────────── inst_sql($pdo, 'Create users table', " CREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, email VARCHAR(255) NOT NULL UNIQUE, password_hash VARCHAR(255) NOT NULL, display_name VARCHAR(100) NULL, role ENUM('superadmin','admin','superuser','user') NOT NULL DEFAULT 'user', rosary_limit INT NOT NULL DEFAULT 1, email_confirmed TINYINT(1) NOT NULL DEFAULT 0, confirm_token VARCHAR(64) NULL, reset_token VARCHAR(64) NULL, reset_expires DATETIME NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ", $log, $errors); // ── 4. site_settings ───────────────────────────────────────────────────────── inst_sql($pdo, 'Create site_settings table', " CREATE TABLE IF NOT EXISTS site_settings ( key_name VARCHAR(100) PRIMARY KEY, val TEXT NULL, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ", $log, $errors); // ── 5. Seed site_settings ──────────────────────────────────────────────────── $defaults = [ 'smtp_host' => '', 'smtp_port' => '587', 'smtp_user' => '', 'smtp_pass' => '', 'smtp_from' => '', 'smtp_from_name' => 'Rosary Presenter', 'site_name' => 'Rosary Presenter', 'site_url' => '', ]; $ins_setting = $pdo->prepare('INSERT IGNORE INTO site_settings (key_name, val) VALUES (?, ?)'); foreach ($defaults as $k => $v) { try { $ins_setting->execute([$k, $v]); $log[] = ['ok', "Seeded site_settings: {$k}"]; } catch (PDOException $e) { $errors[] = "site_settings {$k}: " . $e->getMessage(); } } // ── 6. Seed superadmin ─────────────────────────────────────────────────────── $hash = password_hash('supadmin', PASSWORD_BCRYPT); try { $pdo->prepare(" INSERT IGNORE INTO users (username, email, password_hash, display_name, role, rosary_limit, email_confirmed) VALUES ('supadmin', 'admin@example.com', ?, 'Super Admin', 'superadmin', -1, 1) ")->execute([$hash]); $log[] = ['ok', 'Seeded superadmin account (username: supadmin)']; } catch (PDOException $e) { $errors[] = 'Seed superadmin: ' . $e->getMessage(); } $overall_ok = empty($errors); ?>
install.php from your server immediately after reviewing this page.
Change the password immediately — go to
/admin/profile after logging in.
Also update the email from admin@example.com to your real address.
| Status | Step |
|---|---|
| = $status === 'ok' ? '✓ OK' : ($status === 'skip' ? '— SKIP' : '✗ ERROR') ?> | = htmlspecialchars($msg) ?> |
install.php from your server.