setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->exec("CREATE DATABASE IF NOT EXISTS `$db_name` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci");
$pdo->exec("USE `$db_name`");
// Create tables
$sql = "
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
email VARCHAR(100) NOT NULL UNIQUE,
role ENUM('admin', 'moderator', 'editor', 'user') DEFAULT 'user',
avatar_url TEXT,
theme_preference ENUM('dark', 'light') DEFAULT 'dark',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS videos (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
description TEXT,
release_date DATE,
source_type ENUM('upload', 'link') NOT NULL,
video_url TEXT NOT NULL,
thumbnail_url TEXT,
uploader_id INT,
views INT DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (uploader_id) REFERENCES users(id) ON DELETE SET NULL
);
CREATE TABLE IF NOT EXISTS comments (
id INT AUTO_INCREMENT PRIMARY KEY,
video_id INT NOT NULL,
user_id INT NOT NULL,
comment_text TEXT NOT NULL,
is_reported BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (video_id) REFERENCES videos(id) ON DELETE CASCADE,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS reactions (
id INT AUTO_INCREMENT PRIMARY KEY,
comment_id INT NOT NULL,
user_id INT NOT NULL,
reaction_type ENUM('thumb', 'heart', 'pray', 'insight', 'clap') NOT NULL,
UNIQUE KEY unique_reaction (comment_id, user_id, reaction_type),
FOREIGN KEY (comment_id) REFERENCES comments(id) ON DELETE CASCADE,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS tags (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL UNIQUE
);
CREATE TABLE IF NOT EXISTS video_tags (
video_id INT NOT NULL,
tag_id INT NOT NULL,
PRIMARY KEY (video_id, tag_id),
FOREIGN KEY (video_id) REFERENCES videos(id) ON DELETE CASCADE,
FOREIGN KEY (tag_id) REFERENCES tags(id) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS bookmarks (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
video_id INT NOT NULL,
video_timestamp FLOAT DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
FOREIGN KEY (video_id) REFERENCES videos(id) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS logs (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NULL,
type VARCHAR(50),
message TEXT,
ip_address VARCHAR(45),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL
);
CREATE TABLE IF NOT EXISTS settings (
setting_key VARCHAR(50) PRIMARY KEY,
setting_value TEXT
);
";
$pdo->exec($sql);
// Default settings
$pdo->exec("INSERT IGNORE INTO settings (setting_key, setting_value) VALUES
('site_title', 'ChurchTube'),
('primary_color', '#7c4dff'),
('secondary_color', '#ff4081'),
('logo_url', ''),
('footer_text', '© 2024 ChurchTube. All rights reserved.')");
// Save config temporarily in session
session_start();
$_SESSION['db_config'] = [
'host' => $db_host,
'name' => $db_name,
'user' => $db_user,
'pass' => $db_pass
];
header('Location: install.php?step=3');
exit;
} catch (PDOException $e) {
$msg = $e->getMessage();
$hint = "";
if (strpos($msg, 'Access denied') !== false) {
$hint = "Hint: Check your username and password. On Ubuntu, 'root' often requires a password or 'sudo' access. Try creating a dedicated database user.";
} elseif (strpos($msg, 'Connection refused') !== false || strpos($msg, 'Can\'t connect') !== false) {
$hint = "Hint: MySQL might not be running. Try: sudo systemctl start mysql";
} elseif (strpos($msg, 'getaddrinfo failed') !== false) {
$hint = "Hint: The host '$db_host' could not be found. If MySQL is local, use 'localhost' or '127.0.0.1'.";
}
$error = "Database Connection Failed: " . $msg . "
" . $hint;
}
} elseif ($step === 3) {
// Admin Setup
session_start();
$db = $_SESSION['db_config'];
$admin_user = $_POST['admin_user'];
$admin_email = $_POST['admin_email'];
$admin_pass = password_hash($_POST['admin_pass'], PASSWORD_DEFAULT);
try {
$pdo = new PDO("mysql:host={$db['host']};dbname={$db['name']}", $db['user'], $db['pass']);
$stmt = $pdo->prepare("INSERT INTO users (username, email, password, role) VALUES (?, ?, ?, 'admin')");
$stmt->execute([$admin_user, $admin_email, $admin_pass]);
// Generate config file
$config_content = "";
if (!file_exists('includes')) mkdir('includes');
file_put_contents($config_file, $config_content);
session_destroy();
header('Location: install.php?step=4');
exit;
} catch (PDOException $e) {
$error = "Admin Creation Failed: " . $e->getMessage();
}
}
}
?>
This wizard will help you set up your sermon video platform in just a few minutes.
/etc/php/7.4/apache2/php.ini and set:
upload_max_filesize = 500M post_max_size = 500M