'Méthode non autorisée.']); exit; } requireCsrfToken(); $username = trim($_POST['username'] ?? ''); $password = $_POST['password'] ?? ''; if ($username === '' || mb_strlen($username) > 50) { http_response_code(400); echo json_encode(['error' => "Nom de pressier invalide (1 à 50 caractères)."]); exit; } if (mb_strlen($password) < 4) { http_response_code(400); echo json_encode(['error' => 'Le mot de passe doit faire au moins 4 caractères.']); exit; } try { // On vérifie que le nom n'est pas déjà pris $stmt = $dbh->prepare('SELECT id FROM lemon_players WHERE username = :username LIMIT 1'); $stmt->execute([':username' => $username]); if ($stmt->fetch()) { http_response_code(409); echo json_encode(['error' => 'Ce nom de pressier est déjà pris.']); exit; } $hash = password_hash($password, PASSWORD_DEFAULT); $stmt = $dbh->prepare('INSERT INTO lemon_players (username, password, created_at) VALUES (:username, :password, NOW())'); $stmt->execute([':username' => $username, ':password' => $hash]); $playerId = (int) $dbh->lastInsertId(); // Régénère l'ID de session à la création de compte (même logique que checkLogin.php // pour le portfolio : évite la fixation de session) session_regenerate_id(true); $_SESSION['lemon_player_id'] = $playerId; $_SESSION['lemon_username'] = $username; echo json_encode([ 'ok' => true, 'id' => $playerId, 'username' => $username, 'score' => 0, 'lifetime_score' => 0, 'prestige_level' => 0, 'prestige_bonus' => 0, 'game_state' => null, ]); } catch (PDOException $e) { http_response_code(500); echo json_encode(['error' => 'Erreur serveur.']); }