setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); } catch(PDOException $e) { die("Database connection failed: " . $e->getMessage()); } // Common functions function sanitizeInput($data) { return htmlentities(strip_tags(trim($data)), ENT_QUOTES, 'UTF-8'); } function redirect($url) { header("Location: $url"); exit(); } function isLoggedIn() { return isset($_SESSION['user_id']); } function generateCSRFToken() { if (empty($_SESSION['csrf_token'])) { $_SESSION['csrf_token'] = bin2hex(random_bytes(32)); } return $_SESSION['csrf_token']; } function verifyCSRFToken($token) { return isset($_SESSION['csrf_token']) && hash_equals($_SESSION['csrf_token'], $token); } function hashPassword($password) { return password_hash($password . PEPPER, PASSWORD_BCRYPT); } function verifyPassword($password, $hash) { return password_verify($password . PEPPER, $hash); } function generateRandomString($length = 32) { return bin2hex(random_bytes($length)); } function sendEmail($to, $subject, $message) { $headers = "From: " . ADMIN_EMAIL . "\r\n"; $headers .= "Reply-To: " . ADMIN_EMAIL . "\r\n"; $headers .= "Content-Type: text/html; charset=UTF-8\r\n"; return mail($to, $subject, $message, $headers); } // Error handling set_error_handler(function($errno, $errstr, $errfile, $errline) { error_log("Error [$errno] $errstr in $errfile on line $errline"); if (defined('DEBUG') && DEBUG === true) { echo "