PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, ]; $dsn = "mysql:host=$host;dbname=$db;charset=$charset"; try { $pdo = new PDO($dsn, $user, $pass, $options); } catch (Exception $e) { die("DB Connection failed: " . $e->getMessage()); } // ======= DB TABLES SETUP ======= $pdo->exec(" CREATE TABLE IF NOT EXISTS users ( uid INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) UNIQUE, password VARCHAR(255), is_admin TINYINT(1) DEFAULT 0, badges VARCHAR(255) DEFAULT '', created_at DATETIME DEFAULT CURRENT_TIMESTAMP ); "); $pdo->exec(" CREATE TABLE IF NOT EXISTS predictions ( id INT AUTO_INCREMENT PRIMARY KEY, uid INT, prediction VARCHAR(10), actual VARCHAR(10), confidence INT, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (uid) REFERENCES users(uid) ON DELETE CASCADE ); "); $pdo->exec(" CREATE TABLE IF NOT EXISTS stats ( uid INT PRIMARY KEY, wins INT DEFAULT 0, losses INT DEFAULT 0, FOREIGN KEY (uid) REFERENCES users(uid) ON DELETE CASCADE ); "); // ======= UTIL FUNCTIONS ======= function is_logged_in() { return isset($_SESSION['uid']); } function is_admin() { return isset($_SESSION['is_admin']) && $_SESSION['is_admin'] == 1; } function redirect($url) { header("Location: $url"); exit; } function hash_password($pass) { return password_hash($pass, PASSWORD_DEFAULT); } function verify_password($pass, $hash) { return password_verify($pass, $hash); } // ======= AUTH HANDLER ======= if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action'])) { $action = $_POST['action']; if ($action === 'register') { $username = trim($_POST['username'] ?? ''); $password = $_POST['password'] ?? ''; if (!$username || !$password) { echo json_encode(['status' => 'error', 'msg' => 'Fill username and password']); exit; } $stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?"); $stmt->execute([$username]); if ($stmt->fetch()) { echo json_encode(['status' => 'error', 'msg' => 'Username taken']); exit; } $hash = hash_password($password); $stmt = $pdo->prepare("INSERT INTO users (username, password) VALUES (?, ?)"); $stmt->execute([$username, $hash]); echo json_encode(['status' => 'success', 'msg' => 'Registered!']); exit; } if ($action === 'login') { $username = trim($_POST['username'] ?? ''); $password = $_POST['password'] ?? ''; if (!$username || !$password) { echo json_encode(['status' => 'error', 'msg' => 'Fill username and password']); exit; } $stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?"); $stmt->execute([$username]); $user = $stmt->fetch(); if (!$user || !verify_password($password, $user['password'])) { echo json_encode(['status' => 'error', 'msg' => 'Wrong creds']); exit; } $_SESSION['uid'] = $user['uid']; $_SESSION['username'] = $user['username']; $_SESSION['is_admin'] = $user['is_admin']; echo json_encode(['status' => 'success', 'msg' => 'Logged in']); exit; } if ($action === 'logout') { session_destroy(); echo json_encode(['status' => 'success', 'msg' => 'Logged out']); exit; } // User must be logged in for below if (!is_logged_in()) { echo json_encode(['status' => 'error', 'msg' => 'Not logged in']); exit; } $uid = $_SESSION['uid']; // Save Prediction if ($action === 'save_prediction') { $prediction = $_POST['prediction'] ?? ''; $actual = $_POST['actual'] ?? ''; $confidence = (int)($_POST['confidence'] ?? 0); if (!$prediction || !$actual) { echo json_encode(['status' => 'error', 'msg' => 'Missing prediction or actual']); exit; } $stmt = $pdo->prepare("INSERT INTO predictions (uid, prediction, actual, confidence) VALUES (?, ?, ?, ?)"); $stmt->execute([$uid, $prediction, $actual, $confidence]); echo json_encode(['status' => 'success']); exit; } // Save Stats if ($action === 'save_stats') { $wins = (int)($_POST['wins'] ?? 0); $losses = (int)($_POST['losses'] ?? 0); $stmt = $pdo->prepare("REPLACE INTO stats (uid, wins, losses) VALUES (?, ?, ?)"); $stmt->execute([$uid, $wins, $losses]); echo json_encode(['status' => 'success']); exit; } // Get Leaderboard if ($action === 'get_leaderboard') { $stmt = $pdo->query("SELECT u.username, s.wins, s.losses FROM stats s JOIN users u ON s.uid = u.uid ORDER BY s.wins DESC LIMIT 10"); echo json_encode($stmt->fetchAll()); exit; } // Export user data if ($action === 'export_user') { $stmt1 = $pdo->prepare("SELECT * FROM stats WHERE uid = ?"); $stmt1->execute([$uid]); $stats = $stmt1->fetch(); $stmt2 = $pdo->prepare("SELECT * FROM predictions WHERE uid = ?"); $stmt2->execute([$uid]); $predictions = $stmt2->fetchAll(); echo json_encode(['stats' => $stats, 'predictions' => $predictions]); exit; } // Import user data if ($action === 'import_user') { $data = json_decode($_POST['data'], true); if (!$data || !isset($data['stats'], $data['predictions'])) { echo json_encode(['status' => 'error', 'msg' => 'Invalid data']); exit; } $stmt = $pdo->prepare("REPLACE INTO stats (uid, wins, losses) VALUES (?, ?, ?)"); $stmt->execute([$uid, $data['stats']['wins'], $data['stats']['losses']]); foreach ($data['predictions'] as $p) { $stmt = $pdo->prepare("INSERT INTO predictions (uid, prediction, actual, confidence, created_at) VALUES (?, ?, ?, ?, ?)"); $stmt->execute([$uid, $p['prediction'], $p['actual'], $p['confidence'], $p['created_at']]); } echo json_encode(['status' => 'success', 'msg' => 'Imported']); exit; } // Admin Only: Get user by username if ($action === 'admin_get_user' && is_admin()) { $searchUser = $_POST['search'] ?? ''; $stmt = $pdo->prepare("SELECT uid, username, badges FROM users WHERE username LIKE ?"); $stmt->execute(["%$searchUser%"]); $users = $stmt->fetchAll(); echo json_encode($users); exit; } // Admin Only: Delete user by uid if ($action === 'admin_delete_user' && is_admin()) { $delUid = (int)($_POST['uid'] ?? 0); if ($delUid) { $stmt = $pdo->prepare("DELETE FROM users WHERE uid = ?"); $stmt->execute([$delUid]); echo json_encode(['status' => 'success', 'msg' => 'User deleted']); exit; } echo json_encode(['status' => 'error', 'msg' => 'Invalid user']); exit; } } // ======= IF NOT LOGGED IN SHOW LOGIN/REGISTER ======= if (!is_logged_in()): ?>
Predicting...
Confidence: --%