Comus Party 1.0.0
Application web de mini-jeux en ligne
Chargement...
Recherche...
Aucune correspondance
Controller.class.php
Aller à la documentation de ce fichier.
1<?php
9
11
16use Error;
17use Exception;
18use PDO;
19use Twig\Environment;
20use Twig\Error\LoaderError;
21use Twig\Error\RuntimeError;
22use Twig\Error\SyntaxError;
23use Twig\Loader\FilesystemLoader;
24
30{
35 private PDO $pdo;
36
41 private FilesystemLoader $loader;
42
47
48 private Environment $twig;
53 private ?array $get = null;
54
59 private ?array $post = null;
60
66 public function __construct(FilesystemLoader $loader, Environment $twig)
67 {
68 $this->pdo = Db::getInstance()->getConnection();
69 $this->loader = $loader;
70 $this->twig = $twig;
71
72 if (BACKUP_ENABLE && BACKUP_MODE === 'manual') {
73 $this->makeDatabaseBackup();
74 }
75
76 if (!empty($_GET)) {
77 $this->get = $_GET;
78 }
79
80 if (!empty($_POST)) {
81 $this->post = $_POST;
82 }
83 }
84
95 private function makeDatabaseBackup(): void
96 {
97 $minutesBetweenBackups = BACKUP_INTERVAL;
98 $isBackupNeeded = false;
99
100 if (file_exists(__DIR__ . '/../../backup')) {
101 $files = glob(__DIR__ . '/../../backup/db-backup_*.sql');
102 usort($files, function ($a, $b) {
103 return filemtime($a) < filemtime($b);
104 });
105
106 if (count($files) > 0) {
107 $lastBackup = $files[0];
108 $lastBackupTime = filemtime($lastBackup);
109 $currentTime = time();
110 $diff = $currentTime - $lastBackupTime;
111 $minutes = $diff / 60;
112
113 if ($minutes >= $minutesBetweenBackups) {
114 $isBackupNeeded = true;
115 }
116
117 # Suppression des anciennes sauvegardes
118 if (count($files) > BACKUP_RETENTION) {
119 for ($i = BACKUP_RETENTION; $i < count($files); $i++) {
120 unlink($files[$i]);
121 }
122 }
123 } else {
124 $isBackupNeeded = true;
125 }
126 } else {
127 $isBackupNeeded = true;
128 }
129
130 if (!$isBackupNeeded) {
131 return;
132 }
133
134 try {
135 $date = date('Y-m-d_H-i-s');
136 $backupFile = 'db-backup_' . $date . '.sql';
137
138 $stmt = $this->getPdo()->prepare('SHOW TABLES');
139 $stmt->execute();
140 $tables = $stmt->fetchAll(PDO::FETCH_COLUMN);
141
142
143 $sql = 'CREATE DATABASE IF NOT EXISTS `' . DB_NAME . '`' . ";\n\n"; // Création de la base de données
144 $sql .= 'USE `' . DB_NAME . "`;\n\n"; // Utilisation de la base de données pour la suite des opérations
145 $sql .= "SET foreign_key_checks = 0;\n\n"; // Désactivation des contraintes de clés étrangères
146
147 foreach ($tables as $table) {
148 $sql .= 'DROP TABLE IF EXISTS `' . $table . '`;';
149
150 $stmt = $this->getPdo()->prepare('SHOW CREATE TABLE `' . $table . '`');
151 $stmt->execute();
152 $sql .= "\n\n" . $stmt->fetchColumn(1) . ";\n\n";
153
154 $stmt = $this->getPdo()->prepare('SELECT COUNT(*) FROM `' . $table . '`');
155 $stmt->execute();
156 $count = $stmt->fetchColumn();
157 $numBatches = intval($count / BACKUP_FETCH_LIMIT) + 1;
158
159 for ($b = 1; $b <= $numBatches; $b++) {
160 $request = 'SELECT * FROM `' . $table . '` LIMIT ' . ($b * BACKUP_FETCH_LIMIT - BACKUP_FETCH_LIMIT) . ',' . BACKUP_FETCH_LIMIT;
161 $stmt = $this->getPdo()->prepare($request);
162 $stmt->execute();
163
164 $realBatchSize = $stmt->rowCount();
165 $numFields = $stmt->columnCount();
166
167 if ($realBatchSize !== 0) {
168 $sql .= 'INSERT INTO `' . $table . '` VALUES ';
169
170 for ($i = 0; $i < $numFields; $i++) {
171 $rowCount = 1;
172 while ($row = $stmt->fetch(PDO::FETCH_NUM)) {
173 $sql .= '(';
174 for ($j = 0; $j < $numFields; $j++) {
175 if (isset($row[$j])) {
176 $row[$j] = addslashes($row[$j]);
177 $row[$j] = str_replace("\n", "\\n", $row[$j]);
178 $row[$j] = str_replace("\r", "\\r", $row[$j]);
179 $row[$j] = str_replace("\f", "\\f", $row[$j]);
180 $row[$j] = str_replace("\t", "\\t", $row[$j]);
181 $row[$j] = str_replace("\v", "\\v", $row[$j]);
182 $row[$j] = str_replace("\a", "\\a", $row[$j]);
183 $row[$j] = str_replace("\b", "\\b", $row[$j]);
184 if ($row[$j] == 'true' or $row[$j] == 'false' or preg_match('/^-?[1-9][0-9]*$/', $row[$j]) or $row[$j] == 'NULL' or $row[$j] == 'null') {
185 $sql .= $row[$j];
186 } else {
187 $sql .= '\'' . $row[$j] . '\'';
188 }
189 } else {
190 $sql .= 'NULL';
191 }
192
193 if ($j < ($numFields - 1)) {
194 $sql .= ',';
195 }
196 }
197
198 if ($rowCount == $realBatchSize) {
199 $rowCount = 0;
200 $sql .= ");\n"; // Fermeture de l'instruction d'insertion
201 } else {
202 $sql .= "),\n"; // Fermeture de la ligne d'insertion
203 }
204
205 $rowCount++;
206 }
207 }
208 }
209 }
210 }
211
212 $sql .= "SET foreign_key_checks = 1;\n";
213
214 if (!is_dir(__DIR__ . '/../../backup')) {
215 mkdir(__DIR__ . '/../../backup');
216 }
217
218 file_put_contents(__DIR__ . '/../../backup/' . $backupFile, $sql);
219 } catch (Exception $e) {
220 if (!is_dir(__DIR__ . '/../../backup')) {
221 mkdir(__DIR__ . '/../../backup');
222 }
223
224 file_put_contents(__DIR__ . '/../../backup/error.txt', $e->getMessage());
225 }
226 }
227
232 public function getPdo(): PDO
233 {
234 return $this->pdo;
235 }
236
242 public function setPdo(PDO $pdo): void
243 {
244 $this->pdo = $pdo;
245 }
246
258 public function call(string $method, ?array $args = []): mixed
259 {
260 if (!method_exists($this, $method) || !is_callable([$this, $method])) {
261 throw new MethodNotFoundException('La méthode ' . $method . ' n\'existe pas dans le contrôleur ' . get_class($this));
262 }
263
264 try {
265 return $this->{$method}(...array_values($args));
266 } catch (Exception $e) {
267 switch ($e::class) {
268 case AuthenticationException::class:
269 MessageHandler::addExceptionParametersToSession($e);
270 header('Location: /login');
271 break;
272 default:
273 MessageHandler::displayFullScreenException($e);
274 break;
275 }
276 } catch (Error $e) {
277 MessageHandler::displayFullScreenError($e);
278 }
279
280 return null;
281 }
282
287 public function getLoader(): FilesystemLoader
288 {
289 return $this->loader;
290 }
291
297 public function setLoader(FilesystemLoader $loader): void
298 {
299 $this->loader = $loader;
300 }
301
306 public function getTwig(): Environment
307 {
308 return $this->twig;
309 }
310
316 public function setTwig(Environment $twig): void
317 {
318 $this->twig = $twig;
319 }
320
325 public function getGet(): ?array
326 {
327 return $this->get;
328 }
329
335 public function setGet(?array $get): void
336 {
337 $this->get = $get;
338 }
339
344 public function getPost(): ?array
345 {
346 return $this->post;
347 }
348
354 public function setPost(?array $post): void
355 {
356 $this->post = $post;
357 }
358}
Class Db.
Definition Db.php:21
Gestion de l'affichage des erreurs.
setPost(?array $post)
Modifie l'attribut POST, correspondant aux données passées en paramètre via la méthode POST.
getTwig()
Retourne l'attribut twig, correspondant à l'environnement de Twig.
getGet()
Retourne l'attribut GET, correspondant aux données passées en paramètre via la méthode GET.
getLoader()
Retourne l'attribut loader, correspondant au loader de Twig.
makeDatabaseBackup()
Crée une sauvegarde de la base de données.
__construct(FilesystemLoader $loader, Environment $twig)
Le constructeur de la classe Controller.
getPdo()
Retourne l'attribut PDO, correspondant à la connexion à la base de données.
setLoader(FilesystemLoader $loader)
Modifie l'attribut loader, correspondant au loader de Twig.
setPdo(PDO $pdo)
Modifie l'attribut PDO, correspondant à la connexion à la base de données.
getPost()
Retourne l'attribut POST, correspondant aux données passées en paramètre via la méthode POST.
setGet(?array $get)
Modifie l'attribut GET, correspondant aux données passées en paramètre via la méthode GET.
setTwig(Environment $twig)
Modifie l'attribut twig, correspondant à l'environnement de Twig.
call(string $method, ?array $args=[])
Appelle la méthode du Controller passée en paramètre.
const BACKUP_RETENTION
Nombre de sauvegardes à conserver.
Definition const.php:54
const BACKUP_ENABLE
Système de sauvegarde actif ou non.
Definition const.php:41
const DB_NAME
Nom de la base de données.
Definition db.php:34
const BACKUP_FETCH_LIMIT
Nombre de lignes à récupérer en une seule requête.
Definition const.php:59
const BACKUP_MODE
Mode de sauvegarde.
Definition const.php:49
const BACKUP_INTERVAL
Interval de sauvegarde automatique (en minutes)
Definition const.php:64