diff options
author | polo <ordipolo@gmx.fr> | 2021-08-14 01:32:59 +0200 |
---|---|---|
committer | polo <ordipolo@gmx.fr> | 2021-08-14 01:32:59 +0200 |
commit | 07e0291bfad8ef3a8b37bf0d0ebf20df936e7b7f (patch) | |
tree | 81fa397b2482984554c2d559e8cca7e08dfec312 | |
parent | cd4cffac62363c132d5ce98680b0303dd9b4d4f9 (diff) | |
download | melaine-07e0291bfad8ef3a8b37bf0d0ebf20df936e7b7f.zip |
password
-rw-r--r-- | controller/admin.php | 48 | ||||
-rw-r--r-- | controller/ckeditor.php | 12 | ||||
-rw-r--r-- | controller/password.php | 16 | ||||
-rw-r--r-- | controller/visitor.php | 8 | ||||
-rw-r--r-- | data/password.txt | 1 | ||||
-rw-r--r-- | index.php | 11 | ||||
-rw-r--r-- | model/Classes.php | 8 | ||||
-rw-r--r-- | public/accueil.css | 12 | ||||
-rw-r--r-- | public/main.js | 13 | ||||
-rw-r--r-- | view/connexion.php | 27 | ||||
-rw-r--r-- | view/melaine.php | 4 | ||||
-rw-r--r-- | view/template.php | 6 |
12 files changed, 135 insertions, 31 deletions
diff --git a/controller/admin.php b/controller/admin.php index d738dc0..29ccd41 100644 --- a/controller/admin.php +++ b/controller/admin.php | |||
@@ -31,6 +31,7 @@ function melaineEdit($numArticle, $suppression) | |||
31 | { | 31 | { |
32 | $Articles->delete(); | 32 | $Articles->delete(); |
33 | header('Location: index.php?page=' . $page_actuelle); | 33 | header('Location: index.php?page=' . $page_actuelle); |
34 | exit(); | ||
34 | } | 35 | } |
35 | // modification | 36 | // modification |
36 | else | 37 | else |
@@ -46,22 +47,20 @@ function melaineEdit($numArticle, $suppression) | |||
46 | $Articles->reverseFilesArray(); | 47 | $Articles->reverseFilesArray(); |
47 | $articles = $Articles->getAll(); | 48 | $articles = $Articles->getAll(); |
48 | 49 | ||
50 | // sécurisation du contenu pré-existant inséré dans l'éditeur | ||
49 | if($numArticle >= 0 && !$suppression) | 51 | if($numArticle >= 0 && !$suppression) |
50 | { | 52 | { |
51 | // traitements PHP pour l'éditeur | ||
52 | require('controller/ckeditor.php'); | 53 | require('controller/ckeditor.php'); |
53 | // sécurisation du contenu pré-existant inséré dans l'éditeur | ||
54 | $texte = preparationCKeditor($numArticle, $texte); | 54 | $texte = preparationCKeditor($numArticle, $texte); |
55 | } | 55 | } |
56 | 56 | ||
57 | // NB: penser à ajouter au template la fonctionnalité "autosave" | 57 | // NB: penser à ajouter au template la fonctionnalité "autosave" |
58 | // https://ckeditor.com/docs/ckeditor5/latest/builds/guides/integration/saving-data.html | 58 | // https://ckeditor.com/docs/ckeditor5/latest/builds/guides/integration/saving-data.html |
59 | 59 | ||
60 | // création des morceaux en HTML avant assemblage | 60 | // morceaux en HTML à assembler |
61 | 61 | // variable $editeurHTML, contient $texte | |
62 | // variable $editeurHTML, on insère $texte dedans | ||
63 | require('view/template-formulaires.php'); | 62 | require('view/template-formulaires.php'); |
64 | // variables $css, $js, $header et $content | 63 | // variables $css, $js, $header et $content, |
65 | // $content contient $articles et $editeurHTML | 64 | // $content contient $articles et $editeurHTML |
66 | require('view/melaine.php'); | 65 | require('view/melaine.php'); |
67 | // fin de l'assemblage | 66 | // fin de l'assemblage |
@@ -82,25 +81,26 @@ function discoEdit($numArticle, $suppression) | |||
82 | // sécurisation du contenu pré-existant inséré dans l'éditeur | 81 | // sécurisation du contenu pré-existant inséré dans l'éditeur |
83 | $texte = preparationCKeditor($numArticle, $texte); | 82 | $texte = preparationCKeditor($numArticle, $texte); |
84 | 83 | ||
85 | // variable $editeurHTML, on insère $texte dedans | 84 | // morceaux en HTML à assembler |
85 | // variable $editeurHTML, contient $texte | ||
86 | require('view/template-formulaires.php'); | 86 | require('view/template-formulaires.php'); |
87 | // variables $css, $js, $header et $content | 87 | // variables $css, $js, $header et $content, |
88 | // $content contient ???? et $editeurHTML | 88 | // $content contient ???? et $editeurHTML |
89 | require('view/discographie.php'); | 89 | require('view/discographie.php'); |
90 | // fin de l'assemblage | 90 | // fin de l'assemblage |
91 | require('view/template.php'); | 91 | require('view/template.php'); |
92 | } | 92 | } |
93 | 93 | ||
94 | function changerMotDePasse($secret, $from) | 94 | function changerMotDePasse($secret) |
95 | { | 95 | { |
96 | // vérification supplémentaire | 96 | // vérification supplémentaire |
97 | if($_SESSION['admin'] !== 1) | 97 | if($_SESSION['admin'] !== 1) |
98 | { | 98 | { |
99 | $_SESSION['admin'] = 0; | 99 | $_SESSION['admin'] = 0; |
100 | header('Location: index.php?page=' . $_GET['from']); | 100 | header('Location: index.php?page=' . $_GET['from']); |
101 | exit(); | ||
101 | } | 102 | } |
102 | 103 | ||
103 | $title = "nouveau mot de passe"; | ||
104 | // Ajouter une sécurité par cpatcha avec un "input" supplémentaire | 104 | // Ajouter une sécurité par cpatcha avec un "input" supplémentaire |
105 | // Et créer une variable de session pour la réponse au CAPTCHA | 105 | // Et créer une variable de session pour la réponse au CAPTCHA |
106 | 106 | ||
@@ -112,7 +112,33 @@ function changerMotDePasse($secret, $from) | |||
112 | 112 | ||
113 | echo($header); | 113 | echo($header); |
114 | 114 | ||
115 | // traitements: vérification ancien mot de passe et choix du nouveau | 115 | // traitements: vérification ancien mot de passe et choix du nouveau |
116 | // bon mot de passe | ||
117 | if(isset ($_POST["ancienMotdepasse"]) AND $_POST["ancienMotdepasse"] == $secret) | ||
118 | { | ||
119 | // confirmation | ||
120 | echo($message); | ||
121 | //exit(); | ||
122 | |||
123 | /*header('Location: index.php?page=' . $_GET['from'] . '&message=nouveau_mdp'); | ||
124 | exit();*/ | ||
125 | } | ||
126 | |||
127 | // mauvais mot de passe | ||
128 | elseif(isset ($_POST["ancienMotdepasse"]) AND $_POST["ancienMotdepasse"] != $secret) | ||
129 | { | ||
130 | // défense aux attaques par force brute | ||
131 | // pas parfait, ne marche pas si l'attaquant multiplie les connexions au site | ||
132 | echo($erreurMDP); | ||
133 | sleep(1); | ||
134 | echo($formulaireNouveauMDP); | ||
135 | } | ||
136 | |||
137 | // première arrivée sur la page | ||
138 | else | ||
139 | { | ||
140 | echo($formulaireNouveauMDP); | ||
141 | } | ||
116 | 142 | ||
117 | echo($footer); | 143 | echo($footer); |
118 | } | 144 | } |
diff --git a/controller/ckeditor.php b/controller/ckeditor.php index 9262da0..d25e5ac 100644 --- a/controller/ckeditor.php +++ b/controller/ckeditor.php | |||
@@ -71,13 +71,21 @@ function submitCKeditor($nomFichier) | |||
71 | { | 71 | { |
72 | $titre = $_POST['titre']; | 72 | $titre = $_POST['titre']; |
73 | $annee = $_POST['annee']; | 73 | $annee = $_POST['annee']; |
74 | $pochette = $_POST['pochette']; | 74 | $pochette = $_POST['pochette']; // une image |
75 | 75 | ||
76 | // des formulaires simples | ||
76 | $titre = htmLawed($titre, $configHtmLawed, $specHtmLawed); | 77 | $titre = htmLawed($titre, $configHtmLawed, $specHtmLawed); |
77 | $titre = trim($titre); | 78 | $titre = trim($titre); |
78 | $contenu = htmLawed($contenu, $configHtmLawed, $specHtmLawed); | ||
79 | $annee = htmLawed($annee, $configHtmLawed, $specHtmLawed); | 79 | $annee = htmLawed($annee, $configHtmLawed, $specHtmLawed); |
80 | $annee = trim($annee); | 80 | $annee = trim($annee); |
81 | |||
82 | // pochette | ||
83 | // Album->imageUpload(); | ||
84 | // test formats jpg, jpeg, png, gif, tiff | ||
85 | // enregistrement du fichier | ||
86 | |||
87 | // du ckeditor | ||
88 | $contenu = htmLawed($contenu, $configHtmLawed, $specHtmLawed); | ||
81 | $contenu = trim($contenu); | 89 | $contenu = trim($contenu); |
82 | } | 90 | } |
83 | else // pages comme "melaine" | 91 | else // pages comme "melaine" |
diff --git a/controller/password.php b/controller/password.php new file mode 100644 index 0000000..987670f --- /dev/null +++ b/controller/password.php | |||
@@ -0,0 +1,16 @@ | |||
1 | <?php | ||
2 | // password.php | ||
3 | |||
4 | function hashNewPassword() | ||
5 | { | ||
6 | //$hash = password_hash($password, PASSWORD_DEFAULT); | ||
7 | |||
8 | // écrire dans un fichier | ||
9 | } | ||
10 | |||
11 | function testPassword() | ||
12 | { | ||
13 | // lire dans un fichier | ||
14 | |||
15 | //if(password_verify($password, $hash)) | ||
16 | } \ No newline at end of file | ||
diff --git a/controller/visitor.php b/controller/visitor.php index 16f9c40..539df1f 100644 --- a/controller/visitor.php +++ b/controller/visitor.php | |||
@@ -87,6 +87,7 @@ function connexion($secret) | |||
87 | if($_SESSION['admin'] == 1) | 87 | if($_SESSION['admin'] == 1) |
88 | { | 88 | { |
89 | header('Location: index.php?page=' . $_GET['from']); | 89 | header('Location: index.php?page=' . $_GET['from']); |
90 | exit(); | ||
90 | } | 91 | } |
91 | 92 | ||
92 | // Ajouter une sécurité par cpatcha avec un "input" supplémentaire | 93 | // Ajouter une sécurité par cpatcha avec un "input" supplémentaire |
@@ -105,14 +106,15 @@ function connexion($secret) | |||
105 | { | 106 | { |
106 | $_SESSION['admin'] = 1; | 107 | $_SESSION['admin'] = 1; |
107 | header('Location: index.php?page=' . $_GET['from']); | 108 | header('Location: index.php?page=' . $_GET['from']); |
108 | exit (); | 109 | exit(); |
109 | } | 110 | } |
110 | 111 | ||
111 | // mauvaise mot de passe | 112 | // mauvais mot de passe |
112 | elseif(isset ($_POST["motdepasse"]) AND $_POST["motdepasse"] != $secret) | 113 | elseif(isset ($_POST["motdepasse"]) AND $_POST["motdepasse"] != $secret) |
113 | { | 114 | { |
114 | // défense aux attaques par force brute | 115 | // défense aux attaques par force brute |
115 | // pas parfait, ne marche pas si l'attaquant multiplie les connexions au site | 116 | // pas parfait, ne marche pas si l'attaquant multiplie les connexions au site |
117 | echo($erreurMDP); | ||
116 | sleep(1); | 118 | sleep(1); |
117 | echo($formulaireConnexion); | 119 | echo($formulaireConnexion); |
118 | } | 120 | } |
@@ -124,4 +126,4 @@ function connexion($secret) | |||
124 | } | 126 | } |
125 | 127 | ||
126 | echo($footer); | 128 | echo($footer); |
127 | } \ No newline at end of file | 129 | } |
diff --git a/data/password.txt b/data/password.txt new file mode 100644 index 0000000..46afb44 --- /dev/null +++ b/data/password.txt | |||
@@ -0,0 +1 @@ | |||
julian \ No newline at end of file | |||
@@ -115,9 +115,13 @@ else | |||
115 | $_SESSION['admin'] = 0; | 115 | $_SESSION['admin'] = 0; |
116 | } | 116 | } |
117 | 117 | ||
118 | // mot de passe de connexion à protéger par le .htaccess !! | 118 | |
119 | // mot de passe de connexion à hacher! | ||
120 | // utiliser php pour ça, plus le .htaccess | ||
121 | require('controller/password.php'); | ||
119 | $secret = "julian"; | 122 | $secret = "julian"; |
120 | 123 | ||
124 | |||
121 | // page du site demandée | 125 | // page du site demandée |
122 | if(isset($_GET['page'])) | 126 | if(isset($_GET['page'])) |
123 | { | 127 | { |
@@ -208,12 +212,13 @@ if(isset($_GET['page'])) | |||
208 | } | 212 | } |
209 | } | 213 | } |
210 | 214 | ||
211 | // actions en mode admin recharger une des pages principales | 215 | |
216 | // actions en mode admin, recharger une des pages principales | ||
212 | elseif($_SESSION['admin'] == 1 && isset($_GET['action'])) | 217 | elseif($_SESSION['admin'] == 1 && isset($_GET['action'])) |
213 | { | 218 | { |
214 | if($_GET['action'] == 'nouveau_mdp') | 219 | if($_GET['action'] == 'nouveau_mdp') |
215 | { | 220 | { |
216 | changerMotDePasse($secret, $_GET['from']); | 221 | changerMotDePasse($secret); |
217 | } | 222 | } |
218 | // extraction du contenu du dossier data | 223 | // extraction du contenu du dossier data |
219 | else if($_GET['action'] == 'extraction') | 224 | else if($_GET['action'] == 'extraction') |
diff --git a/model/Classes.php b/model/Classes.php index a455213..1b2a463 100644 --- a/model/Classes.php +++ b/model/Classes.php | |||
@@ -160,7 +160,8 @@ class AlbumsManager extends ArticlesManager | |||
160 | 160 | ||
161 | // create | 161 | // create |
162 | //public function create($titre, $annee, $pochette) | 162 | //public function create($titre, $annee, $pochette) |
163 | public function create($content) | 163 | //public function create($content) |
164 | public function create($content, $titre, $annee, $pochette) | ||
164 | {} | 165 | {} |
165 | 166 | ||
166 | // read | 167 | // read |
@@ -168,8 +169,9 @@ class AlbumsManager extends ArticlesManager | |||
168 | {} | 169 | {} |
169 | 170 | ||
170 | // update | 171 | // update |
171 | //public function create($titre, $annee, $pochette) | 172 | //public function update($titre, $annee, $pochette) |
172 | public function update($content) | 173 | //public function update($content) |
174 | public function update($content, $titre, $annee, $pochette) | ||
173 | {} | 175 | {} |
174 | 176 | ||
175 | // delete | 177 | // delete |
diff --git a/public/accueil.css b/public/accueil.css index aba7196..2e4426a 100644 --- a/public/accueil.css +++ b/public/accueil.css | |||
@@ -79,6 +79,12 @@ img | |||
79 | margin-top: 5px; | 79 | margin-top: 5px; |
80 | } | 80 | } |
81 | 81 | ||
82 | form | ||
83 | { | ||
84 | padding-bottom: 14px; | ||
85 | border-bottom: 1px black solid; | ||
86 | } | ||
87 | |||
82 | #courriel | 88 | #courriel |
83 | { | 89 | { |
84 | padding-top: 30px; | 90 | padding-top: 30px; |
@@ -169,6 +175,12 @@ img | |||
169 | margin-top: 0px; | 175 | margin-top: 0px; |
170 | text-align: center; | 176 | text-align: center; |
171 | } | 177 | } |
178 | .avertissement | ||
179 | { | ||
180 | color: red; | ||
181 | font-size: 90%; | ||
182 | text-align: center; | ||
183 | } | ||
172 | 184 | ||
173 | .connexionFormulaire | 185 | .connexionFormulaire |
174 | { | 186 | { |
diff --git a/public/main.js b/public/main.js index 1c04dec..ec2b2f1 100644 --- a/public/main.js +++ b/public/main.js | |||
@@ -3,7 +3,8 @@ | |||
3 | function versMenu() | 3 | function versMenu() |
4 | { | 4 | { |
5 | // ergonomique | 5 | // ergonomique |
6 | window.setTimeout("location=('index.php?page=menu');", 10000); | 6 | //window.setTimeout("location=('index.php?page=menu');", 10000); |
7 | window.setTimeout(function(){location.href="index.php?page=menu"}, 3000); | ||
7 | } | 8 | } |
8 | 9 | ||
9 | function deconnexionAutomatique() | 10 | function deconnexionAutomatique() |
@@ -18,7 +19,7 @@ function deconnexionAutomatique() | |||
18 | // fonction appelée avec onClick dans un lien, | 19 | // fonction appelée avec onClick dans un lien, |
19 | // si on sélectionne pas "oui", on ne doit pas suivre le lien | 20 | // si on sélectionne pas "oui", on ne doit pas suivre le lien |
20 | // si javascript est désactivé, le lien fonctionne | 21 | // si javascript est désactivé, le lien fonctionne |
21 | function confirmerSuppression(page) | 22 | function confirmerSuppression() |
22 | { | 23 | { |
23 | // ne suivre le lien "href" que si on clique sur oui | 24 | // ne suivre le lien "href" que si on clique sur oui |
24 | var oui = confirm('Confirmer la suppression de cet article.'); | 25 | var oui = confirm('Confirmer la suppression de cet article.'); |
@@ -51,7 +52,7 @@ function copierAdresse() | |||
51 | document.body.appendChild(element); | 52 | document.body.appendChild(element); |
52 | var cible = document.getElementById('copyMe'); | 53 | var cible = document.getElementById('copyMe'); |
53 | 54 | ||
54 | // selection comme-ci on utilisait la souris | 55 | // selection comme on le ferait à la souris |
55 | cible.select(); | 56 | cible.select(); |
56 | // copie (= Ctrl + C) | 57 | // copie (= Ctrl + C) |
57 | document.execCommand("copy"); | 58 | document.execCommand("copy"); |
@@ -66,3 +67,9 @@ function copierAdresse() | |||
66 | // var cible = document.getElementById('nouvelArticle'); | 67 | // var cible = document.getElementById('nouvelArticle'); |
67 | // cible.setAttribute("style", "display: none;"); | 68 | // cible.setAttribute("style", "display: none;"); |
68 | // } | 69 | // } |
70 | |||
71 | function nouveauMotdepasse(page) | ||
72 | { | ||
73 | confirm('Le mot de passe a été modifié.'); | ||
74 | window.setTimeout(location=('index.php?page=' + page + '&message=nouveau_mdp'), 0); | ||
75 | } \ No newline at end of file | ||
diff --git a/view/connexion.php b/view/connexion.php index 2187ecf..1c3aceb 100644 --- a/view/connexion.php +++ b/view/connexion.php | |||
@@ -20,7 +20,14 @@ $formulaireConnexion = ob_get_clean(); | |||
20 | // vérification de l'ancien et choix du nouveau à taper deux fois dont une à l'aveugle | 20 | // vérification de l'ancien et choix du nouveau à taper deux fois dont une à l'aveugle |
21 | ob_start(); | 21 | ob_start(); |
22 | ?> | 22 | ?> |
23 | 23 | <form class="connexionFormulaire" method="post" action="index.php?from=<?= $_GET['from'] ?>&action=nouveau_mdp" > | |
24 | <label for="motdepasse" >Ancien mot de passe:</label> | ||
25 | <input type="password" name="ancienMotdepasse" autofocus required ><br /><br /> | ||
26 | <label for="motdepasse" >Nouveau mot de passe:</label> | ||
27 | <input type="password" name="nouveauMotdepasse" required > | ||
28 | <br /><br /> | ||
29 | <input type="submit" value="Valider" > | ||
30 | </form> | ||
24 | <?php | 31 | <?php |
25 | $formulaireNouveauMDP = ob_get_clean(); | 32 | $formulaireNouveauMDP = ob_get_clean(); |
26 | 33 | ||
@@ -38,6 +45,7 @@ ob_start(); | |||
38 | <link rel="icon" type="image/png" href="public/mouette-logo.png" > | 45 | <link rel="icon" type="image/png" href="public/mouette-logo.png" > |
39 | <link rel="stylesheet" type="text/css" href="public/normalize.css"> | 46 | <link rel="stylesheet" type="text/css" href="public/normalize.css"> |
40 | <link rel="stylesheet" type="text/css" href="public/accueil.css" /> | 47 | <link rel="stylesheet" type="text/css" href="public/accueil.css" /> |
48 | <script type="text/javascript" src="public/main.js" ></script> | ||
41 | <meta name="viewport" content="width=device-width, initial-scale=1.0" /> | 49 | <meta name="viewport" content="width=device-width, initial-scale=1.0" /> |
42 | </head> | 50 | </head> |
43 | 51 | ||
@@ -48,9 +56,26 @@ ob_start(); | |||
48 | <?php | 56 | <?php |
49 | $header = ob_get_clean(); | 57 | $header = ob_get_clean(); |
50 | 58 | ||
59 | |||
60 | // message d'erreur | ||
61 | $erreurMDP = '<p class="avertissement" >Mauvais mot de passe</p>'; | ||
62 | |||
63 | // confirmation modification mot de passe | ||
64 | ob_start(); | ||
65 | ?> | ||
66 | <script type="text/javascript" >nouveauMotdepasse('<?= $_GET["from"] ?>');</script> | ||
67 | <noscript> | ||
68 | <p class="avertissement" >Le mot de passe a été modifié<br /> | ||
69 | <a href="index.php" >Retour au site.</a><br/></p> | ||
70 | </noscript> | ||
71 | <?php | ||
72 | $message = ob_get_clean(); | ||
73 | |||
74 | |||
51 | // pied de page | 75 | // pied de page |
52 | ob_start(); | 76 | ob_start(); |
53 | ?> | 77 | ?> |
78 | <p class="avertissement" >Rappel de sécurité<br />Vous n'utilisez pas votre propre ordinateur ou téléphone: utilisez la navigation privée!</p> | ||
54 | <p class="connexionFooter" > | 79 | <p class="connexionFooter" > |
55 | <i>N'oubliez de cliquer sur "déconnexion" quand vous aurez fini.</i><br /> | 80 | <i>N'oubliez de cliquer sur "déconnexion" quand vous aurez fini.</i><br /> |
56 | <a href="index.php?page=<?= $_GET['from'] ?>" >Retour à la page précédente</a> | 81 | <a href="index.php?page=<?= $_GET['from'] ?>" >Retour à la page précédente</a> |
diff --git a/view/melaine.php b/view/melaine.php index 657c656..cdb24cc 100644 --- a/view/melaine.php +++ b/view/melaine.php | |||
@@ -90,7 +90,7 @@ foreach ($articles as $article) | |||
90 | // placer un article | 90 | // placer un article |
91 | else | 91 | else |
92 | { | 92 | { |
93 | // c'était pas compliqué | 93 | // et voila |
94 | echo($article . "\n"); | 94 | echo($article . "\n"); |
95 | 95 | ||
96 | // bouton | 96 | // bouton |
@@ -102,7 +102,7 @@ foreach ($articles as $article) | |||
102 | Modifier cet article | 102 | Modifier cet article |
103 | </a> | 103 | </a> |
104 | <!-- un espace --> | 104 | <!-- un espace --> |
105 | <a href="index.php?page=melaine&action=suppression&article=<?= $j ?>" onclick="confirmerSuppression('<?= $page_actuelle ?>')" > | 105 | <a href="index.php?page=melaine&action=suppression&article=<?= $j ?>" onclick="confirmerSuppression()" > |
106 | Supprimer cet article | 106 | Supprimer cet article |
107 | </a> | 107 | </a> |
108 | </p> | 108 | </p> |
diff --git a/view/template.php b/view/template.php index b7ea0fb..ded1d08 100644 --- a/view/template.php +++ b/view/template.php | |||
@@ -77,11 +77,11 @@ if($_SESSION['admin'] == 1) | |||
77 | <div> | 77 | <div> |
78 | <p><a href="index.php?from=<?= $page_actuelle ?>&action=nouveau_mdp" > | 78 | <p><a href="index.php?from=<?= $page_actuelle ?>&action=nouveau_mdp" > |
79 | Changer le mot de passe de connexion.</a></p> | 79 | Changer le mot de passe de connexion.</a></p> |
80 | <p><a href="index.php?from=<?= $page_actuelle ?>&action=sauvegarde" > | ||
81 | Sauvegarder les données de tout le site.</a></p> | ||
82 | <p><a href="index.php?from=<?= $page_actuelle ?>&action=restauration" >Restaurer les données avec une sauvegarde.</a></p> | ||
80 | <p><a href="melainePHP.zip" > | 83 | <p><a href="melainePHP.zip" > |
81 | Télécharger le code PHP pour migration.</a></p> | 84 | Télécharger le code PHP pour migration.</a></p> |
82 | <p><a href="index.php?from=<?= $page_actuelle ?>&action=extraction" > | ||
83 | Extraire les données de tout le site.</a></p> | ||
84 | <p><a href="index.php?from=<?= $page_actuelle ?>&action=insertion" >Restauration des données avec une sauvegarde.</a></p> | ||
85 | </div> | 85 | </div> |
86 | </div> | 86 | </div> |
87 | <?php | 87 | <?php |