From 0ee622e0adafad3ee7a5afbcdcc519c7cca544d6 Mon Sep 17 00:00:00 2001 From: polo Date: Thu, 25 Jun 2026 23:17:35 +0200 Subject: restauration BDD console bin/restore_db.php --- bin/mysqldump.php | 2 +- bin/restore_db.php | 82 +++++++++++++++++++++++++++++++++++++++ src/controller/ViewController.php | 2 +- src/model/entities/Node.php | 6 +++ src/service/Backup.php | 2 +- 5 files changed, 91 insertions(+), 3 deletions(-) mode change 100644 => 100755 bin/mysqldump.php create mode 100755 bin/restore_db.php diff --git a/bin/mysqldump.php b/bin/mysqldump.php old mode 100644 new mode 100755 index b7ae3ef..7d8e960 --- a/bin/mysqldump.php +++ b/bin/mysqldump.php @@ -10,4 +10,4 @@ Config::load('../config/config.ini'); require '../src/model/doctrine-bootstrap.php'; $file_name = Backup::mySQLdump($entityManager, 'console'); // créer un nouveau backup -echo realpath($file_name) . "\n"; \ No newline at end of file +echo "Un backup a été créé:\n" . realpath($file_name) . "\n"; \ No newline at end of file diff --git a/bin/restore_db.php b/bin/restore_db.php new file mode 100755 index 0000000..baa1e67 --- /dev/null +++ b/bin/restore_db.php @@ -0,0 +1,82 @@ +#!/usr/bin/env php +getMessage() . "\n"; + die; + } + } + $file_name = pathinfo($argv[1])['basename']; + $file_data = '../' . file_get_contents($argv[1]); +} + +chdir(dirname(__FILE__)); // /chemin/absolu/bin/restore_db.php +require "../vendor/autoload.php"; +Config::load('../config/config.ini'); +require '../src/model/doctrine-bootstrap.php'; + +// backup sur le système de fichiers en paramètre +if($argc === 2){ + // enregistrer le fichier + if(!file_put_contents(Backup::$backup_dir . '/' . $file_name, $file_data)){ + try{ + throw new RuntimeException("Erreur, impossible d'enregistrer le fichier\n"); + } + catch(RuntimeException $e){ + echo $e->getMessage() . "\n"; + die; + } + } + + echo "Fichier SQL " . pathinfo($file_name)['basename'] . " enregistré dans var/backups/\n"; +} +// choix parmi les backups sur le serveur +elseif($argc === 1){ + // obtenir des fichiers + try{ + $backup_array = Backup::getBackupList(); + } + catch(RuntimeException $e){ + $backup_array = []; + echo $e->getMessage() . "\n"; + } + + $backup_files = []; + $j = 0; + for($i = count($backup_array) - 1; $i >= 0; $i--){ + echo ($j + 1) . '. ' . $backup_array[$i] . "\n"; + $backup_files[$j] = $backup_array[$i]; + $j++; + } + + // saisie utilisateur + $nb = (int)readline("Choisissez un fichier par son numéro : ") - 1; + + if($nb < 0 || $nb >= count($backup_files)){ + echo "Erreur, saisir un numéro dans le choix proposé.\n"; + die; + } + $file_name = $backup_files[$nb]; +} +else{ + echo "Erreur: trop de paramètres\n"; + die; +} + +try{ + Backup::restoreDatabase($entityManager, $file_name); +} +catch(RuntimeException $e){ + echo $e->getMessage() . "\n"; + die; +} +echo "La base de donnée a été restaurée avec le backup: " . $file_name . "\n"; +echo "En cas d'erreur, vous pouvez revenir en arrière en réalisant une nouvelle restauration avec le fichier:\n" . Config::$database . '_' . (new DateTime)->format('Y-m-d') . "_before-restore.sql\n"; diff --git a/src/controller/ViewController.php b/src/controller/ViewController.php index 1acb19a..43db6a6 100644 --- a/src/controller/ViewController.php +++ b/src/controller/ViewController.php @@ -10,7 +10,7 @@ use Symfony\Component\HttpFoundation\RedirectResponse; class ViewController { - static function getWebPage(EntityManager $entityManager, Request $request): RedirectResponse + static function getWebPage(EntityManager $entityManager, Request $request): Response { /* 1/ 1er contrôle des paramètres */ diff --git a/src/model/entities/Node.php b/src/model/entities/Node.php index c3e4ec3..fb2d867 100644 --- a/src/model/entities/Node.php +++ b/src/model/entities/Node.php @@ -98,6 +98,8 @@ class Node { $this->page = $page; }*/ + + // utiliser l'interface de NodeData et EmailForm public function getArticle(): Article { return $this->article; @@ -106,9 +108,13 @@ class Node { $this->article = $article; }*/ + // une interface serait cool! + // OU possible un "héritage doctrine", faire en sorte que Node soit la mère de NodeData, EmailForm, Article... + // une seulle instance est matérialisée par plusieurs tables en même temps public function getNodeData(): NodeData|EmailForm|null { + // limite du polymorphisme avec doctrine => impossible d'avoir une unique variable $node_data return $this->name_node === 'form' ? $this->email_form : $this->node_data; } public function getChildren(): array diff --git a/src/service/Backup.php b/src/service/Backup.php index e29ff64..60d1b23 100644 --- a/src/service/Backup.php +++ b/src/service/Backup.php @@ -176,7 +176,7 @@ class Backup } // sécurité cas pas normal if(empty($tables)){ - throw new Exception("Aucune table à supprimer"); + throw new RuntimeException("Aucune table à supprimer"); } $tmp = tempnam('../var', 'tmp_db_codes_'); // crée un fichier avec un nom aléatoire et des droits 600 (concurrence) -- cgit v1.2.3