connection = new PDO( "mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . ";charset=utf8mb4", DB_USER, DB_PASS, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false ] ); } catch (PDOException $e) { error_log("Database connection failed: " . $e->getMessage()); die("Connection failed. Please try again later."); } } public function getConnection() { return $this->connection; } } // Utility functions function sanitize($data) { return htmlspecialchars(strip_tags(trim($data)), ENT_QUOTES, 'UTF-8'); } function generateSecureToken($length = 64) { return bin2hex(random_bytes($length / 2)); } function hashPassword($password) { return password_hash($password, PASSWORD_DEFAULT); } function verifyPassword($password, $hash) { return password_verify($password, $hash); } function validateEmail($email) { return filter_var($email, FILTER_VALIDATE_EMAIL) && preg_match('/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/', $email); } function validatePassword($password) { // At least 8 characters return strlen($password) >= 8; } function validateDateOfBirth($dob) { $date = DateTime::createFromFormat('Y-m-d', $dob); if (!$date) return false; // Check if user is at least 18 years old $today = new DateTime(); $age = $today->diff($date)->y; return $age >= 18; } function validatePostcode($postcode) { // Indian postal code validation (6 digits) return preg_match('/^[0-9]{6}$/', $postcode); } // JSON response helper function jsonResponse($success, $message, $data = null) { header('Content-Type: application/json'); echo json_encode([ 'success' => $success, 'message' => $message, 'data' => $data ]); exit; } // Error logging function function logError($message, $context = []) { $logMessage = date('Y-m-d H:i:s') . ' - ' . $message; if (!empty($context)) { $logMessage .= ' - Context: ' . json_encode($context); } error_log($logMessage . PHP_EOL, 3, 'errors.log'); } ?>