Sauvegarde de l'ajout de projet

This commit is contained in:
Esteban
2026-05-29 13:56:52 +02:00
parent 3c40745ecf
commit b994a8cfb9
7 changed files with 209 additions and 2 deletions
+11
View File
@@ -23,6 +23,17 @@ CREATE TABLE IF NOT EXISTS users (
UNIQUE INDEX idx_username (username) UNIQUE INDEX idx_username (username)
); );
-- Création de la table projects : (Généré par Beekeeper Studio)
CREATE TABLE IF NOT EXISTS projects (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
title VARCHAR(100) NOT NULL,
tags VARCHAR(255) NULL,
description TEXT NOT NULL,
image_url VARCHAR(255) NOT NULL, -- Stockage de l'image par URL (exemple : par CDN)
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
);
-- Compte de test -- Compte de test
INSERT INTO users (username, password, role) INSERT INTO users (username, password, role)
VALUES ('admin', 'admin', 'admin'); VALUES ('admin', 'admin', 'admin');
+52
View File
@@ -0,0 +1,52 @@
<?php
session_start();
require_once 'databaseConnection.php';
// Pour faire cette fonction l'utilisateur doit être administrateur
if (!isset($_SESSION['role']) || $_SESSION['role'] !== 'admin') {
header('Location: home.php');
exit;
}
// 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'] ?? '';
$tags = $_POST['tags'] ?? '';
$description = $_POST['description'] ?? '';
$image_url = $_POST['image_url'] ?? '';
// 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
$stmt = $dbh->prepare('INSERT INTO projects (title, tags, description, image_url) VALUES (:title, :tags, :description, :image_url)');
// On execute la requete préparée
$stmt->execute([
':title' => $title,
':tags' => $tags,
':description' => $description,
':image_url' => $image_url
]);
// Redirection vers projects.php ds que la requete est executée
header('Location: 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: projects.php');
exit;
}
?>
+1 -1
View File
@@ -6,7 +6,7 @@
session_start(); session_start();
// Ajout de connexion a la bdd // Ajout de connexion a la bdd
require_once('./../database/databaseConnection.php'); require_once('./databaseConnection.php');
// La requête doit être un POST sinon on l'a refuse // La requête doit être un POST sinon on l'a refuse
if ($_SERVER['REQUEST_METHOD'] !== 'POST') { if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
+7
View File
@@ -0,0 +1,7 @@
<?php
// Formulaire de contact avec WEBHOOK Discord
// On ajoute ici le header
require_once('./../elements/header.php');
+40 -1
View File
@@ -8,4 +8,43 @@ require_once('../elements/header.php');
// Dans le principe il me faudrait des cases avec des images carrousel du projet un titre et une description // Dans le principe il me faudrait des cases avec des images carrousel du projet un titre et une description
// Si l'utilisateur est admin, il pourra créer de nouveaux projets // On vérifie si l'utilisateur est admin avant d'afficher le formulaire
if (isset($_SESSION['role']) && $_SESSION['role'] === 'admin') { ?>
<!-- Message de confirmation que le projet à été créer -->
<?php if (isset($message)) { echo "<p style='color: white; text-align: center;'>$message</p>"; } ?>
<!-- Formulaire de création de projet -->
<div class="project-container">
<div class="project-card">
<div class="project-header">
<h2>Nouveau projet</h2>
</div>
<!-- en envoie les données à addProject.php -->
<form method="POST" action="">
<label>Titre *</label>
<input type="text" name="title" required>
<label>Tags (virgules)</label>
<input type="text" name="tags">
<label>Description *</label>
<textarea name="description" required></textarea>
<label>Lien de l'image *</label>
<!-- URL Pour un potentiel Lien image/CDN -->
<input type="url" name="image_url" placeholder="https://..." required>
<!-- Le bouton qui déclenche le PHP en haut de page -->
<input type="submit" name="submit_project" value="+ Ajouter le projet" class="btn-submit">
</form>
</div>
</div>
<?php }
?>
+98
View File
@@ -111,4 +111,102 @@ nav a {
.login-card input[type="submit"]:hover { .login-card input[type="submit"]:hover {
background-color: #5a52e0; background-color: #5a52e0;
}
/* ---- PAGE AJOUT PROJET ---- */
.project-container {
display: flex;
justify-content: center;
padding: 40px 20px;
}
.project-card {
background-color: #111116; /* Fond très sombre comme sur l'image */
border: 1px dashed #3a3a5e; /* Bordure pointillée */
border-radius: 12px;
padding: 30px;
width: 800px;
}
.project-header h2 {
margin-top: 0;
font-size: 20px;
display: flex;
align-items: center;
}
.badge-admin {
color: #6c63ff; /* Ton violet */
font-size: 14px;
margin-left: 10px;
font-weight: normal;
}
.form-row {
display: flex;
gap: 20px;
margin-bottom: 20px;
}
.half-width {
flex: 1;
}
.form-group {
margin-bottom: 20px;
}
.form-group label {
display: block;
color: #aaaaaa;
margin-bottom: 8px;
font-size: 14px;
}
/* Inputs reprenant ton style login */
.project-card input[type="text"],
.project-card input[type="url"],
.project-card textarea {
width: 100%;
background-color: #1a1a24;
border: 1px solid #2a2a3e;
border-radius: 6px;
color: white;
padding: 12px;
box-sizing: border-box;
}
.project-card textarea {
min-height: 100px;
resize: vertical;
}
/* Zone pour l'URL (qui remplace l'upload de fichier) */
.url-input-zone {
border: 1px dashed #3a3a5e;
border-radius: 6px;
padding: 40px 20px;
text-align: center;
background-color: #15151c;
}
.url-input-zone input {
width: 80%;
margin-top: 15px;
}
/* Bouton violet */
.btn-submit {
background-color: #6c63ff;
color: white;
border: none;
border-radius: 8px;
padding: 12px 24px;
font-size: 15px;
font-weight: bold;
cursor: pointer;
}
.btn-submit:hover {
background-color: #5a52e0;
} }