95 lines
4.0 KiB
PHP
95 lines
4.0 KiB
PHP
<?php
|
|
require_once(__DIR__ . '/../functions/security.php');
|
|
require_once '../functions/databaseConnection.php';
|
|
require_once('../functions/sendLogs.php');
|
|
require_once('../functions/pdfUpload.php');
|
|
|
|
// Pour faire cette fonction l'utilisateur doit être administrateur
|
|
if (!isset($_SESSION['role']) || $_SESSION['role'] !== 'admin') {
|
|
header('Location: ../pages/home.php');
|
|
exit;
|
|
}
|
|
|
|
// Vérification du jeton CSRF : bloque les requêtes forgées depuis un autre site
|
|
requireCsrfToken();
|
|
|
|
// Le fichier envoyé dépasse post_max_size : $_POST/$_FILES sont vides, on le détecte
|
|
// tout de suite pour éviter un échec silencieux
|
|
if (postDepasseLimite()) {
|
|
die(messageDepassementPost());
|
|
}
|
|
|
|
// La requête doit être un POST sinon on l'a refuse
|
|
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|
|
|
// Récupération des données dans la requete POST
|
|
$title = $_POST['title'] ?? '';
|
|
$status = trim($_POST['status'] ?? '');
|
|
$tags = $_POST['tags'] ?? '';
|
|
$description = $_POST['description'] ?? '';
|
|
$image_url = $_POST['imageurl'] ?? '';
|
|
$markdown = trim($_POST['markdown'] ?? '');
|
|
$link_url = trim($_POST['linkurl'] ?? '');
|
|
|
|
// Lecture et validation du PDF envoyé (optionnel)
|
|
$pdfResultat = lireUploadPdf('pdf');
|
|
if (is_string($pdfResultat)) {
|
|
// Le fichier envoyé n'est pas valide : on affiche l'erreur et on s'arrête
|
|
echo $pdfResultat;
|
|
exit;
|
|
}
|
|
$pdfData = is_array($pdfResultat) ? $pdfResultat['data'] : null;
|
|
$pdfFilename = is_array($pdfResultat) ? $pdfResultat['filename'] : null;
|
|
|
|
// On vérifie que les champs obligatoires ne sont pas vide
|
|
if (!empty($title) && !empty($description) && !empty($image_url)) {
|
|
try {
|
|
// On prépare la requête SQL pour insérer le nouveau projet
|
|
// Le PDF (pdf_data) n'est plus stocké ici : il vit dans project_pdfs (table
|
|
// associée, voir migration Juillet 2026 (6)), pour que les listes de projets
|
|
// n'aient jamais à charger son contenu binaire en mémoire
|
|
$stmt = $dbh->prepare('INSERT INTO projects (title, status, tags, description, image_url, markdown, link_url) VALUES (:title, :status, :tags, :description, :image_url, :markdown, :link_url)');
|
|
|
|
// On execute la requete préparée
|
|
$stmt->bindValue(':title', $title, PDO::PARAM_STR);
|
|
$stmt->bindValue(':status', $status, PDO::PARAM_STR);
|
|
$stmt->bindValue(':tags', $tags, PDO::PARAM_STR);
|
|
$stmt->bindValue(':description', $description, PDO::PARAM_STR);
|
|
$stmt->bindValue(':image_url', $image_url, PDO::PARAM_STR);
|
|
$stmt->bindValue(':markdown', $markdown, PDO::PARAM_STR);
|
|
$stmt->bindValue(':link_url', $link_url, PDO::PARAM_STR);
|
|
$stmt->execute();
|
|
|
|
// Si un PDF a été envoyé, on l'enregistre à part dans project_pdfs
|
|
if ($pdfData !== null) {
|
|
$nouvelId = (int) $dbh->lastInsertId();
|
|
$stmtPdf = $dbh->prepare('INSERT INTO project_pdfs (project_id, pdf_filename, pdf_data) VALUES (:project_id, :pdf_filename, :pdf_data)');
|
|
$stmtPdf->bindValue(':project_id', $nouvelId, PDO::PARAM_INT);
|
|
$stmtPdf->bindValue(':pdf_filename', $pdfFilename, PDO::PARAM_STR);
|
|
$stmtPdf->bindValue(':pdf_data', $pdfData, PDO::PARAM_LOB);
|
|
$stmtPdf->execute();
|
|
}
|
|
|
|
// Log Discord
|
|
sendLog("Ajout du projet : " . $title);
|
|
|
|
// Redirection vers projects.php ds que la requete est executée
|
|
header('Location: ../pages/projects.php');
|
|
exit;
|
|
|
|
} catch (PDOException $e) {
|
|
// En cas d'erreur :
|
|
echo "Erreur pendant l'ajout du projet: " . $e->getMessage();
|
|
exit;
|
|
}
|
|
} else {
|
|
echo "Veuillez remplir tous les champs obligatoires.";
|
|
exit;
|
|
}
|
|
} else {
|
|
// Si on y accède de façon peu légitime sans requête POST on refuse
|
|
header('Location: ../pages/projects.php');
|
|
exit;
|
|
}
|
|
?>
|