20use Twig\Error\LoaderError;
21use Twig\Error\RuntimeError;
22use Twig\Error\SyntaxError;
23use Twig\Loader\FilesystemLoader;
53 private ?array
$get =
null;
68 $this->pdo = Db::getInstance()->getConnection();
98 $isBackupNeeded =
false;
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);
106 if (count($files) > 0) {
107 $lastBackup = $files[0];
108 $lastBackupTime = filemtime($lastBackup);
109 $currentTime = time();
110 $diff = $currentTime - $lastBackupTime;
111 $minutes = $diff / 60;
113 if ($minutes >= $minutesBetweenBackups) {
114 $isBackupNeeded =
true;
117 # Suppression des anciennes sauvegardes
124 $isBackupNeeded =
true;
127 $isBackupNeeded =
true;
130 if (!$isBackupNeeded) {
135 $date = date(
'Y-m-d_H-i-s');
136 $backupFile =
'db-backup_' . $date .
'.sql';
138 $stmt = $this->
getPdo()->prepare(
'SHOW TABLES');
140 $tables = $stmt->fetchAll(PDO::FETCH_COLUMN);
143 $sql =
'CREATE DATABASE IF NOT EXISTS `' .
DB_NAME .
'`' .
";\n\n";
144 $sql .=
'USE `' .
DB_NAME .
"`;\n\n";
145 $sql .=
"SET foreign_key_checks = 0;\n\n";
147 foreach ($tables as $table) {
148 $sql .=
'DROP TABLE IF EXISTS `' . $table .
'`;';
150 $stmt = $this->
getPdo()->prepare(
'SHOW CREATE TABLE `' . $table .
'`');
152 $sql .=
"\n\n" . $stmt->fetchColumn(1) .
";\n\n";
154 $stmt = $this->
getPdo()->prepare(
'SELECT COUNT(*) FROM `' . $table .
'`');
156 $count = $stmt->fetchColumn();
159 for ($b = 1; $b <= $numBatches; $b++) {
161 $stmt = $this->
getPdo()->prepare($request);
164 $realBatchSize = $stmt->rowCount();
165 $numFields = $stmt->columnCount();
167 if ($realBatchSize !== 0) {
168 $sql .=
'INSERT INTO `' . $table .
'` VALUES ';
170 for ($i = 0; $i < $numFields; $i++) {
172 while ($row = $stmt->fetch(PDO::FETCH_NUM)) {
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') {
187 $sql .=
'\'' . $row[$j] .
'\'';
193 if ($j < ($numFields - 1)) {
198 if ($rowCount == $realBatchSize) {
212 $sql .=
"SET foreign_key_checks = 1;\n";
214 if (!is_dir(__DIR__ .
'/../../backup')) {
215 mkdir(__DIR__ .
'/../../backup');
218 file_put_contents(__DIR__ .
'/../../backup/' . $backupFile, $sql);
219 }
catch (Exception $e) {
220 if (!is_dir(__DIR__ .
'/../../backup')) {
221 mkdir(__DIR__ .
'/../../backup');
224 file_put_contents(__DIR__ .
'/../../backup/error.txt', $e->getMessage());
258 public function call(
string $method, ?array $args = []): mixed
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));
265 return $this->{$method}(...array_values($args));
266 }
catch (Exception $e) {
268 case AuthenticationException::class:
269 MessageHandler::addExceptionParametersToSession($e);
270 header(
'Location: /login');
273 MessageHandler::displayFullScreenException($e);
277 MessageHandler::displayFullScreenError($e);
Classe AuthenticationException.
Classe MethodNotFoundException.
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.
const BACKUP_ENABLE
Système de sauvegarde actif ou non.
const DB_NAME
Nom de la base de données.
const BACKUP_FETCH_LIMIT
Nombre de lignes à récupérer en une seule requête.
const BACKUP_MODE
Mode de sauvegarde.
const BACKUP_INTERVAL
Interval de sauvegarde automatique (en minutes)