Nouvelle version complète (remplacement total)
This commit is contained in:
12
README.md
Normal file
12
README.md
Normal 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.
|
||||
|
||||
L’objectif 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
23
dump.sql
Normal 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 d’article pour remplir la base.');
|
||||
BIN
includes/.DS_Store
vendored
Normal file
BIN
includes/.DS_Store
vendored
Normal file
Binary file not shown.
18
includes/db.php
Normal file
18
includes/db.php
Normal 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
6
includes/footer.php
Normal file
@@ -0,0 +1,6 @@
|
||||
</main>
|
||||
<footer>
|
||||
<p>© 2025 Mini CMS. Tous droits réservés.</p>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
17
includes/header.php
Normal file
17
includes/header.php
Normal 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
BIN
public/.DS_Store
vendored
Normal file
Binary file not shown.
34
public/add.php
Normal file
34
public/add.php
Normal 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
22
public/admin.php
Normal 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
30
public/article.php
Normal 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
50
public/edit.php
Normal 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
34
public/login.php
Normal 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
7
public/logout.php
Normal file
@@ -0,0 +1,7 @@
|
||||
<?php
|
||||
session_start();
|
||||
session_destroy();
|
||||
header("Location: login.php");
|
||||
exit;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user