Webbserverprogrammering 1

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)
<?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>';
}