['name', 'value'], 'skills' => ['id', 'title', 'icon', 'items', 'position', 'created_at'], 'projects' => ['id', 'title', 'status', 'tags', 'description', 'image_url', 'markdown', 'link_url', 'pdf_data', 'pdf_filename', 'created_at'], 'experiences' => ['id', 'title', 'status', 'xptype', 'tags', 'description', 'duration', 'image_url', 'markdown', 'link_url', 'pdf_data', 'pdf_filename', 'created_at'], 'schools' => ['id', 'title', 'status', 'tags', 'description', 'duration', 'image_url', 'markdown', 'link_url', 'pdf_data', 'pdf_filename', 'created_at'], 'users' => ['id', 'username', 'password', 'role', 'created_at', 'last_login'], ]; // Colonnes binaires : encodées en base64 par exportData.php, à redécoder ici $colonnesBinaires = [ 'projects' => ['pdf_data'], 'experiences' => ['pdf_data'], 'schools' => ['pdf_data'], ]; try { // Transaction : si une erreur survient, TOUT est annulé (la base reste intacte) $dbh->beginTransaction(); foreach ($tables as $table => $colonnesAutorisees) { // On ne touche qu'aux tables présentes dans le fichier if (!isset($donnees[$table]) || !is_array($donnees[$table])) { continue; } // Sécurité : on refuse de vider la table users si la sauvegarde n'en contient aucun // (sinon l'admin se retrouverait enfermé dehors sans aucun compte) if ($table === 'users' && count($donnees[$table]) === 0) { continue; } // On écrase les données existantes de la table $dbh->exec('DELETE FROM `' . $table . '`'); // Colonnes binaires (PDF) de cette table, à redécoder du base64 $binaires = $colonnesBinaires[$table] ?? []; // Puis on insère chaque ligne de la sauvegarde foreach ($donnees[$table] as $ligne) { if (!is_array($ligne)) { continue; } // On ne garde que les colonnes autorisées ET présentes dans la ligne $colonnes = array_values(array_intersect($colonnesAutorisees, array_keys($ligne))); if (empty($colonnes)) { continue; } $placeholders = array_map(function ($c) { return ':' . $c; }, $colonnes); $stmt = $dbh->prepare( 'INSERT INTO `' . $table . '` (`' . implode('`, `', $colonnes) . '`) VALUES (' . implode(', ', $placeholders) . ')' ); foreach ($colonnes as $colonne) { $valeur = $ligne[$colonne]; // Les colonnes binaires (pdf_data) sont ré-encodées en base64 par l'export : on les redécode if (in_array($colonne, $binaires, true) && $valeur !== null) { $stmt->bindValue(':' . $colonne, base64_decode($valeur), PDO::PARAM_LOB); } else { $stmt->bindValue(':' . $colonne, $valeur); } } $stmt->execute(); } } // Tout s'est bien passé : on valide définitivement $dbh->commit(); } catch (Exception $e) { // En cas d'erreur on annule tout : la base revient à son état d'avant l'import $dbh->rollBack(); die("Erreur pendant l'import, aucune donnée n'a été modifiée : " . $e->getMessage()); } // Log Discord sendLog("Import d'une sauvegarde JSON : données du site écrasées"); // On renvoie l'utilisateur sur admin.php (?import=1 déclenche la notification de succès) header('Location: ../pages/admin.php?import=1'); exit;