Show sourcecode
The following files exists in this folder. Click to view.
webbserverprogrammering/submissions/projekt-quiz/includes/
db_connect.php
footer.php
functions.php
header.php
session_config.php
db_connect.php
214 lines UTF-8 Windows (CRLF)
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
<?php
// Miljö-inställning
$local = true;
if ($local) {
// LOKAL UTVECKLING
$dbname = 'projekt_quiz';
$hostname = 'localhost';
$DB_USER = 'root';
$DB_PASSWORD = '';
$DEBUG = true; // Visa meddelanden lokalt
} else {
// PRODUKTION (skolserver)
$dbname = 'firnab23';
$hostname = 'localhost';
$DB_USER = 'firnab23';
$DB_PASSWORD = 'YK4R24uN';
$DEBUG = false; // Dölj meddelanden i produktion
}
$options = [
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'",
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false
];
// ANSLUT TILL DATABAS
try {
$pdo = new PDO("mysql:host=$hostname;dbname=$dbname;charset=utf8mb4", $DB_USER, $DB_PASSWORD, $options);
if ($DEBUG) {
echo 'Connected to database.<br />';
}
} catch (PDOException $e) {
if ($DEBUG) {
echo 'Connection failed: ' . $e->getMessage() . "<br />";
} else {
error_log('Database connection failed: ' . $e->getMessage());
die('Could not connect to database.');
}
}
// AUTO-CREATE TABLES (om de inte finns)
/**
* Funktion för att skapa tabell om den inte finns
*/
function createTableIfNotExists($pdo, $tableName, $createSQL, $debug = false) {
try {
// Kolla om tabellen finns
$pdo->query("DESCRIBE `$tableName`");
if ($debug) {
echo "Table '$tableName' exists.<br />";
}
} catch (PDOException $e) {
// Tabellen finns inte - skapa den
try {
$pdo->exec($createSQL);
if ($debug) {
echo "Created table '$tableName'.<br />";
}
} catch (PDOException $ex) {
error_log("Error creating table '$tableName': " . $ex->getMessage());
if ($debug) {
echo "Error creating table '$tableName': " . $ex->getMessage() . "<br />";
}
}
}
}
// TABELL 1: users
createTableIfNotExists($pdo, 'users', "
CREATE TABLE users (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
username VARCHAR(50) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
is_admin TINYINT(1) DEFAULT 0,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
last_login DATETIME NULL,
INDEX idx_username (username),
INDEX idx_admin (is_admin)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
", $DEBUG);
// TABELL 2: quizzes
createTableIfNotExists($pdo, 'quizzes', "
CREATE TABLE quizzes (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(200) NOT NULL,
description TEXT,
created_by INT UNSIGNED,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
is_active TINYINT(1) DEFAULT 1,
INDEX idx_active (is_active),
FOREIGN KEY (created_by) REFERENCES users(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
", $DEBUG);
// TABELL 3: questions
createTableIfNotExists($pdo, 'questions', "
CREATE TABLE questions (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
quiz_id INT UNSIGNED NOT NULL,
question_text TEXT NOT NULL,
question_order INT DEFAULT 0,
INDEX idx_quiz (quiz_id),
FOREIGN KEY (quiz_id) REFERENCES quizzes(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
", $DEBUG);
// TABELL 4: answers
createTableIfNotExists($pdo, 'answers', "
CREATE TABLE answers (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
question_id INT UNSIGNED NOT NULL,
answer_text VARCHAR(255) NOT NULL,
is_correct TINYINT(1) DEFAULT 0,
answer_order INT DEFAULT 0,
INDEX idx_question (question_id),
FOREIGN KEY (question_id) REFERENCES questions(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
", $DEBUG);
// TABELL 5: quiz_attempts
createTableIfNotExists($pdo, 'quiz_attempts', "
CREATE TABLE quiz_attempts (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
user_id INT UNSIGNED NOT NULL,
quiz_id INT UNSIGNED NOT NULL,
score INT NOT NULL,
total_questions INT NOT NULL,
completed_at DATETIME DEFAULT CURRENT_TIMESTAMP,
INDEX idx_user (user_id),
INDEX idx_quiz (quiz_id),
INDEX idx_completed (completed_at),
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
FOREIGN KEY (quiz_id) REFERENCES quizzes(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
", $DEBUG);
// TABELL 6: user_answers
createTableIfNotExists($pdo, 'user_answers', "
CREATE TABLE user_answers (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
attempt_id INT UNSIGNED NOT NULL,
question_id INT UNSIGNED NOT NULL,
answer_id INT UNSIGNED NOT NULL,
is_correct TINYINT(1),
INDEX idx_attempt (attempt_id),
FOREIGN KEY (attempt_id) REFERENCES quiz_attempts(id) ON DELETE CASCADE,
FOREIGN KEY (question_id) REFERENCES questions(id) ON DELETE CASCADE,
FOREIGN KEY (answer_id) REFERENCES answers(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
", $DEBUG);
// SKAPA FÖRSTA ADMIN (om users-tabellen är tom)
try {
$stmt = $pdo->query("SELECT COUNT(*) as count FROM users WHERE is_admin = 1");
$result = $stmt->fetch();
if ($result['count'] == 0) {
// Ingen admin finns - skapa en
$default_password = password_hash('admin123', PASSWORD_DEFAULT);
$stmt = $pdo->prepare("
INSERT INTO users (name, username, password, is_admin, created_at)
VALUES ('Administrator', 'admin', :password, 1, NOW())
");
$stmt->execute([':password' => $default_password]);
if ($DEBUG) {
echo "Created default admin user.<br />";
echo " Username: admin<br />";
echo " Password: admin123<br />";
echo " <strong>CHANGE THIS PASSWORD IMMEDIATELY!</strong><br />";
}
}
} catch (PDOException $e) {
error_log("Error checking/creating admin: " . $e->getMessage());
}
if ($DEBUG) {
echo '<hr>';
echo '<p><strong>Database setup complete!</strong></p>';
echo '<p>Remove or set $DEBUG = false before deploying to production.</p>';
}