PDO::ERRMODE_EXCEPTION] ); $root_pdo->exec("CREATE DATABASE IF NOT EXISTS `$db_name` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"); $root_pdo->exec("USE `$db_name`"); // Exécuter le schéma instruction par instruction foreach (array_filter(array_map('trim', explode(';', $schema))) as $stmt) { if ($stmt !== '') { try { $root_pdo->exec($stmt); } catch (\PDOException $e) { /* ignore DROP IF EXISTS warnings */ } } } return $db_name; } // ─── Traitement du formulaire ───────────────────────────────────────────────── if ($_SERVER['REQUEST_METHOD'] === 'POST') { if (!verify_csrf($_POST['csrf_token'] ?? null)) { $error = "Session invalide (CSRF). Rechargez la page."; } else { $action = $_POST['action'] ?? 'create'; $username = trim($_POST['username'] ?? ''); $display_name = trim($_POST['display_name'] ?? ''); $password = $_POST['password'] ?? ''; $password2 = $_POST['password2'] ?? ''; $family_name = trim($_POST['family_name'] ?? ''); $invite_code = trim($_POST['invite_code'] ?? ''); // Validations communes if (!$username || !$display_name || !$password) { $error = "Tous les champs sont obligatoires."; } elseif (strlen($password) < 6) { $error = "Le mot de passe doit faire au moins 6 caractères."; } elseif ($password !== $password2) { $error = "Les mots de passe ne correspondent pas."; } elseif (!preg_match('/^[\p{L}0-9_.-]{3,50}$/u', $username)) { $error = "Nom d'utilisateur invalide (3-50 car., lettres/chiffres/._-)"; } else { // Vérifier que l'username n'existe pas $chk = $meta_pdo->prepare("SELECT id FROM users WHERE username = ?"); $chk->execute([$username]); if ($chk->fetch()) { $error = "Ce nom d'utilisateur est déjà pris."; } } if (!$error) { $db_host = getenv('DB_HOST') ?: 'househub-db'; $db_user = getenv('DB_USER') ?: 'househub'; $db_pass = getenv('DB_PASS') ?: 'changeme'; $hash = password_hash($password, PASSWORD_BCRYPT); try { if ($action === 'join' && $invite_code) { // ── Rejoindre une famille existante ────────────────────────── $fam = $meta_pdo->prepare("SELECT * FROM families WHERE invite_code = ?"); $fam->execute([$invite_code]); $family = $fam->fetch(); if (!$family) { $error = "Code d'invitation invalide."; } else { $meta_pdo->prepare( "INSERT INTO users (username, password_hash, display_name, family_id) VALUES (?, ?, ?, ?)" )->execute([$username, $hash, $display_name, $family['id']]); $_SESSION['user'] = [ 'id' => (int)$meta_pdo->lastInsertId(), 'username' => $username, 'display_name' => $display_name, 'family_id' => (int)$family['id'], ]; $_SESSION['family_db'] = $family['db_name']; session_regenerate_id(true); header('Location: /index.php'); exit; } } else { // ── Créer une nouvelle famille ──────────────────────────────── if (!$family_name) { $error = "Le nom de la famille est obligatoire."; } else { $meta_pdo->beginTransaction(); // Créer la famille avec un invite_code unique $invite = bin2hex(random_bytes(8)); $meta_pdo->prepare( "INSERT INTO families (name, db_name, invite_code) VALUES (?, '', ?)" )->execute([$family_name, $invite]); $family_id = (int)$meta_pdo->lastInsertId(); // Créer la DB famille $db_name = createFamilyDb($meta_pdo, $db_host, $db_user, $db_pass, $family_id); // Mettre à jour db_name maintenant qu'on a l'ID $meta_pdo->prepare("UPDATE families SET db_name = ? WHERE id = ?") ->execute([$db_name, $family_id]); // Créer l'utilisateur $meta_pdo->prepare( "INSERT INTO users (username, password_hash, display_name, family_id) VALUES (?, ?, ?, ?)" )->execute([$username, $hash, $display_name, $family_id]); $user_id = (int)$meta_pdo->lastInsertId(); $meta_pdo->commit(); $_SESSION['user'] = [ 'id' => $user_id, 'username' => $username, 'display_name' => $display_name, 'family_id' => $family_id, ]; $_SESSION['family_db'] = $db_name; session_regenerate_id(true); header('Location: /index.php'); exit; } } } catch (\Exception $e) { if ($meta_pdo->inTransaction()) $meta_pdo->rollBack(); $error = "Erreur lors de la création : " . $e->getMessage(); } } } } $pageTitle = "Inscription — HouseHub"; $activePage = "register"; require __DIR__ . '/header.php'; ?>
Nouvel espace familial ou rejoindre un existant
Déjà un compte ? Se connecter