Nouvelle version complète (remplacement total)

This commit is contained in:
2025-11-02 22:39:12 +01:00
commit 1a5e015663
14 changed files with 253 additions and 0 deletions

BIN
.DS_Store vendored Normal file

Binary file not shown.

12
README.md Normal file
View File

@@ -0,0 +1,12 @@
CMS Simplifié
Présentation
Ce mini-projet a été réalisé dans le cadre du module Développement Web (BTS CIEL 2ᵉ année).
Il s'agit d'un mini système de gestion de contenu** qui permet de gérer des articles de manière simple.
Le site est organisé en deux parties :
- Zone publique*: les visiteurs peuvent consulter les articles sans se connecter.
- Zone administration: un administrateur peut se connecter pour ajouter, modifier ou supprimer des articles.
Lobjectif principal est de pratiquer le développement web dynamique avec PHP pur et MySQL, en mettant en œuvre toutes les étapes du cycle CRUD (Create, Read, Update, Delete), la gestion des sessions et la sécurisation des données.

23
dump.sql Normal file
View File

@@ -0,0 +1,23 @@
CREATE DATABASE IF NOT EXISTS cms_simplifie CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
USE cms_simplifie;
CREATE TABLE IF NOT EXISTS utilisateur (
id INT AUTO_INCREMENT PRIMARY KEY,
login VARCHAR(50) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL
);
INSERT INTO utilisateur (login, password) VALUES
('admin', '$2y$10$kD5oX7ZbC0mC6h/0qTz7ue1v5HPxqj8k3y3m5ZtQ7lY9UeH8tFjQG');
CREATE TABLE IF NOT EXISTS articles (
id INT AUTO_INCREMENT PRIMARY KEY,
titre VARCHAR(255) NOT NULL,
contenu TEXT NOT NULL,
date_creation DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO articles (titre, contenu) VALUES
('Premier article', 'Ceci est le contenu du premier article de test.'),
('Deuxième article', 'Contenu du deuxième article pour tester le CMS.'),
('Troisième article', 'Encore un exemple darticle pour remplir la base.');

BIN
includes/.DS_Store vendored Normal file

Binary file not shown.

18
includes/db.php Normal file
View File

@@ -0,0 +1,18 @@
<?php
$host = 'localhost';
$db = 'cms_simplifie';
$user = 'root';
$pass = 'root';
$charset = 'utf8mb4';
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
];
try {
$pdo = new PDO($dsn, $user, $pass, $options);
} catch (\PDOException $e) {
die("Erreur de connexion : " . $e->getMessage());
}

6
includes/footer.php Normal file
View File

@@ -0,0 +1,6 @@
</main>
<footer>
<p>&copy; 2025 Mini CMS. Tous droits réservés.</p>
</footer>
</body>
</html>

17
includes/header.php Normal file
View File

@@ -0,0 +1,17 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>Mini CMS</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<header>
<h1>Mini CMS</h1>
<nav>
<a href="index.php">Accueil</a>
<a href="add.php">Ajouter un article</a>
<a href="login.php">Connexion</a>
</nav>
</header>
<main>

BIN
public/.DS_Store vendored Normal file

Binary file not shown.

34
public/add.php Normal file
View File

@@ -0,0 +1,34 @@
<?php
session_start();
require_once '../includes/db.php';
require_once '../includes/header.php';
if (!isset($_SESSION['user'])) {
header("Location: login.php");
exit;
}
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$titre = $_POST['titre'] ?? '';
$contenu = $_POST['contenu'] ?? '';
if ($titre && $contenu) {
$stmt = $pdo->prepare("INSERT INTO articles (titre, contenu, date_creation) VALUES (?, ?, NOW())");
$stmt->execute([$titre, $contenu]);
echo "<p>Article ajouté avec succès.</p>";
} else {
echo "<p style='color:red;'>Veuillez remplir tous les champs.</p>";
}
}
?>
<h2>Ajouter un article</h2>
<form method="post">
<label>Titre :</label><br>
<input type="text" name="titre" required><br><br>
<label>Contenu :</label><br>
<textarea name="contenu" rows="5" required></textarea><br><br>
<input type="submit" value="Ajouter">
</form>
<?php require_once '../includes/footer.php'; ?>

22
public/admin.php Normal file
View File

@@ -0,0 +1,22 @@
<?php
session_start();
require_once '../includes/db.php';
require_once '../includes/header.php';
if (!isset($_SESSION['user'])) {
header("Location: login.php");
exit;
}
?>
<h2>Tableau de bord</h2>
<p>Bienvenue, <?= htmlspecialchars($_SESSION['user']) ?> !</p>
<ul>
<li><a href="add.php">Ajouter un article</a></li>
<li><a href="edit.php">Modifier un article</a></li>
<li><a href="delete.php">Supprimer un article</a></li>
<li><a href="index.php">Voir les articles</a></li>
</ul>
<?php require_once '../includes/footer.php'; ?>

30
public/article.php Normal file
View File

@@ -0,0 +1,30 @@
<?php
require_once '../includes/db.php';
require_once '../includes/header.php';
$id = $_GET['id'] ?? null;
if (!$id || !is_numeric($id)) {
echo "<p>Article introuvable (404)</p>";
require_once '../includes/footer.php';
exit;
}
$stmt = $pdo->prepare("SELECT * FROM articles WHERE id = ?");
$stmt->execute([$id]);
$article = $stmt->fetch();
if (!$article) {
echo "<p>Article introuvable (404)</p>";
require_once '../includes/footer.php';
exit;
}
?>
<article>
<h2><?= htmlspecialchars($article['titre']) ?></h2>
<p><?= nl2br(htmlspecialchars($article['contenu'])) ?></p>
<small>Publié le <?= $article['date_creation'] ?></small>
</article>
<?php require_once '../includes/footer.php'; ?>

50
public/edit.php Normal file
View File

@@ -0,0 +1,50 @@
<?php
session_start();
require_once '../includes/db.php';
require_once '../includes/header.php';
if (!isset($_SESSION['user'])) {
header("Location: login.php");
exit;
}
$id = $_GET['id'] ?? null;
if (!$id || !is_numeric($id)) {
echo "<p>Article introuvable (404)</p>";
require_once '../includes/footer.php';
exit;
}
$stmt = $pdo->prepare("SELECT * FROM articles WHERE id = ?");
$stmt->execute([$id]);
$article = $stmt->fetch();
if (!$article) {
echo "<p>Article introuvable (404)</p>";
require_once '../includes/footer.php';
exit;
}
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$titre = $_POST['titre'] ?? '';
$contenu = $_POST['contenu'] ?? '';
if ($titre && $contenu) {
$stmt = $pdo->prepare("UPDATE articles SET titre=?, contenu=? WHERE id=?");
$stmt->execute([$titre, $contenu, $id]);
echo "<p>Article mis à jour avec succès.</p>";
} else {
echo "<p style='color:red;'>Veuillez remplir tous les champs.</p>";
}
}
?>
<h2>Modifier l'article</h2>
<form method="post">
<label>Titre :</label><br>
<input type="text" name="titre" value="<?= htmlspecialchars($article['titre']) ?>" required><br><br>
<label>Contenu :</label><br>
<textarea name="contenu" rows="5" required><?= htmlspecialchars($article['contenu']) ?></textarea><br><br>
<input type="submit" value="Modifier">
</form>
<?php require_once '../includes/footer.php'; ?>

34
public/login.php Normal file
View File

@@ -0,0 +1,34 @@
<?php
session_start();
require_once '../includes/db.php';
require_once '../includes/header.php';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$login = $_POST['login'] ?? '';
$password = $_POST['password'] ?? '';
$stmt = $pdo->prepare("SELECT * FROM utilisateur WHERE login = ?");
$stmt->execute([$login]);
$user = $stmt->fetch();
if ($user && password_verify($password, $user['password'])) {
$_SESSION['user'] = $user['login'];
header("Location: admin.php");
exit;
} else {
$error = "Identifiants incorrects";
}
}
?>
<h2>Connexion administrateur</h2>
<?php if (!empty($error)) echo "<p style='color:red;'>$error</p>"; ?>
<form method="post">
<label>Login :</label><br>
<input type="text" name="login" required><br><br>
<label>Mot de passe :</label><br>
<input type="password" name="password" required><br><br>
<input type="submit" value="Se connecter">
</form>
<?php require_once '../includes/footer.php'; ?>

7
public/logout.php Normal file
View File

@@ -0,0 +1,7 @@
<?php
session_start();
session_destroy();
header("Location: login.php");
exit;