', $errors); header('Location: login.php'); exit; } try { $db = Database::getInstance(); // Génération du login : prenom.nom (minuscules, sans accents) $login = generateLogin($prenom, $nom); // Vérifier si le login existe déjà $checkQuery = "SELECT id_utilisateur FROM utilisateurs WHERE login = ?"; $existing = $db->fetchOne($checkQuery, [$login]); if ($existing) { // Login déjà pris, ajouter un suffixe numérique $counter = 1; $baseLogin = $login; do { $login = $baseLogin . $counter; $existing = $db->fetchOne($checkQuery, [$login]); $counter++; } while ($existing && $counter < 100); if ($existing) { throw new Exception("Impossible de générer un login unique."); } } // Hashage du mot de passe $passwordHash = password_hash($password, PASSWORD_DEFAULT); // Insertion de l'utilisateur (élève libre) $insertQuery = "INSERT INTO utilisateurs (login, mot_de_passe, nom, prenom, id_type, id_classe, actif) VALUES (?, ?, ?, ?, 3, (SELECT id_classe FROM classes WHERE type_classe='soutien' LIMIT 1), 1)"; $userId = $db->insert($insertQuery, [ $login, $passwordHash, ucfirst(strtolower($nom)), ucfirst(strtolower($prenom)) ]); // Récupération des infos complètes pour la session $userQuery = "SELECT u.*, t.libelle as type_libelle FROM utilisateurs u INNER JOIN types_utilisateurs t ON u.id_type = t.id_type WHERE u.id_utilisateur = ?"; $utilisateur = $db->fetchOne($userQuery, [$userId]); if (!$utilisateur) { throw new Exception("Erreur lors de la création du compte."); } // Connexion automatique après inscription SessionManager::login($utilisateur); // Message de succès $_SESSION['success'] = "Inscription réussie ! Bienvenue " . $utilisateur['prenom'] . " (login: " . $login . ")"; // Redirection vers dashboard élève header('Location: eleve/dashboard.php'); exit; } catch (Exception $e) { error_log("Erreur inscription libre : " . $e->getMessage()); $_SESSION['error'] = "Erreur lors de l'inscription : " . $e->getMessage(); header('Location: login.php'); exit; } } // ========================================== // CONNEXION CLASSIQUE // ========================================== else { // Récupération des données du formulaire $login = trim($_POST['login'] ?? ''); $password = trim($_POST['password'] ?? ''); // Validation basique if (empty($login) || empty($password)) { $_SESSION['error'] = "Veuillez remplir tous les champs."; header('Location: login.php'); exit; } try { $db = Database::getInstance(); // Recherche de l'utilisateur avec ses informations complètes $query = "SELECT u.*, t.libelle as type_libelle, c.nom_classe, c.niveau FROM utilisateurs u INNER JOIN types_utilisateurs t ON u.id_type = t.id_type LEFT JOIN classes c ON u.id_classe = c.id_classe WHERE u.login = ? AND u.actif = 1"; $utilisateur = $db->fetchOne($query, [$login]); // Vérifier si l'utilisateur existe if (!$utilisateur) { $_SESSION['error'] = "Identifiant ou mot de passe incorrect."; header('Location: login.php'); exit; } // Vérifier le mot de passe if (!password_verify($password, $utilisateur['mot_de_passe'])) { $_SESSION['error'] = "Identifiant ou mot de passe incorrect."; header('Location: login.php'); exit; } // Créer la session SessionManager::login($utilisateur); // Redirection selon le type d'utilisateur if ($utilisateur['id_type'] == 1) { // Enseignant header('Location: enseignant/dashboard.php'); } else { // Élève (classe ou libre) header('Location: eleve/dashboard.php'); } exit; } catch (Exception $e) { error_log("Erreur connexion : " . $e->getMessage()); $_SESSION['error'] = "Erreur lors de la connexion. Veuillez réessayer."; header('Location: login.php'); exit; } } /** * Générer un login à partir du prénom et nom * Format : prenom.nom (minuscules, sans accents) */ function generateLogin($prenom, $nom) { // Conversion en minuscules $prenom = strtolower($prenom); $nom = strtolower($nom); // Suppression des accents $prenom = removeAccents($prenom); $nom = removeAccents($nom); // Suppression des caractères spéciaux (garder seulement lettres et chiffres) $prenom = preg_replace('/[^a-z0-9]/', '', $prenom); $nom = preg_replace('/[^a-z0-9]/', '', $nom); return $prenom . '.' . $nom; } /** * Supprimer les accents d'une chaîne */ function removeAccents($string) { $accents = [ 'à' => 'a', 'á' => 'a', 'â' => 'a', 'ã' => 'a', 'ä' => 'a', 'è' => 'e', 'é' => 'e', 'ê' => 'e', 'ë' => 'e', 'ì' => 'i', 'í' => 'i', 'î' => 'i', 'ï' => 'i', 'ò' => 'o', 'ó' => 'o', 'ô' => 'o', 'õ' => 'o', 'ö' => 'o', 'ù' => 'u', 'ú' => 'u', 'û' => 'u', 'ü' => 'u', 'ý' => 'y', 'ÿ' => 'y', 'ñ' => 'n', 'ç' => 'c' ]; return strtr($string, $accents); }