diff --git a/README.md b/README.md index 78871df..985e973 100644 --- a/README.md +++ b/README.md @@ -1 +1,46 @@ -Mini-Projet de Développement Web - CMS Simplifié +# Mini-Projet : CMS Simplifié (PHP-SQL) + +Ce projet est un système de gestion de contenu (CMS) simple réalisé en PHP pur et sql. Il utilise l'extension PDO pour des requêtes sécurisées vers une base de données MySQL. + +L'application est divisée en deux parties : +1. Une **Zone Publique** pour consulter les articles. +2. Une **Zone Administration** protégée par mot de passe, qui permet la gestion complète (CRUD) des articles. + +## 🚀 Procédure d'installation + +Pour installer et lancer ce projet en local, vous aurez besoin d'un environnement serveur (MAMP, XAMPP, WAMP, Docker, etc.) supportant PHP et MySQL. + +1. **Code Source** + * Clonez ou téléchargez ce dépôt et placez le dossier `my_sql_projet` dans le répertoire web de votre serveur (ex: `htdocs/`). + +2. **Base de Données** + * Ouvrez votre outil de gestion de base de données (comme phpMyAdmin). + * Créez une nouvelle base de données. Le nom attendu est `my_sql_projet`. + * Sélectionnez cette base de données et importez le fichier `sql/tables.sql`. Ce script créera les tables `articles` et `utilisateur`, et insérera l'administrateur par défaut. + +3. **Configuration de la Connexion** + * Dans le dossier `php/`, trouvez le fichier `pdo.example.php`. + * **Copiez-le** et **renommez** la copie en `pdo.php`. + * Ouvrez `pdo.php` et modifiez la variable `$pass` pour y mettre votre propre mot de passe de base de données (ex: `"root"` pour MAMP). + +4. **Lancement** + * C'est terminé ! Vous pouvez maintenant accéder au site public via `http://localhost/my_sql_projet/` et à la page de connexion admin via `http://localhost/my_sql_projet/login.php`. + +## 🔑 Identifiants de Connexion + +Un compte administrateur est créé par défaut par le script `tables.sql` pour vous permettre de tester la zone d'administration. + +* **Login :** `admin` +* **Mot de passe :** `admin123` (ou celui que vous avez généré) + +## 🏛️ Architecture du Projet + +* **Langage :** PHP pur (orienté script, sans framework). +* **Base de Données :** MySQL. +* **Connexion :** L'extension **PDO** est utilisée pour toutes les interactions avec la base de données. +* **Sécurité :** + * **Mots de passe :** Hachage systématique avec `password_hash()` et vérification avec `password_verify()`, comme exigé. + * **Injections SQL :** Prévention totale grâce à l'utilisation exclusive de **requêtes préparées** (avec `prepare()` et `execute()`). + * **Failles XSS :** Protection lors de l'affichage des données avec `htmlspecialchars()`. + * **Zone Admin :** Toutes les pages d'administration (`dashboard.php`, `creer_article.php`, etc.) sont protégées et vérifient l'existence d'une `$_SESSION` active, redirigeant vers `login.php` si l'utilisateur n'est pas authentifié. +* **Gestion des Erreurs :** La page `article.php` gère les ID invalides ou inexistants en affichant un message d'erreur, comme demandé. \ No newline at end of file diff --git a/article.php b/article.php index b7935b8..c451aec 100644 --- a/article.php +++ b/article.php @@ -33,10 +33,6 @@ if ($article === false) {

- -

- Publié le : -

prepare($sql); + $stmt->execute([$titre, $contenu]); + + header('Location: dashboard.php'); + exit; + + } else { + $erreur_message = "Veuillez remplir le titre et le contenu."; + } +} +?> + + + + + Ajouter un article - Admin + + + +
+

Ajouter un nouvel article

+

+ Connecté en tant que + | Retour au Tableau de Bord + | Se déconnecter +

+
+ +
+ +
+ + +
+

+
+ + +
+
+
+ +
+
+
+
+ +
+
+
+ +
+
+ +
+ + + \ No newline at end of file diff --git a/dashboard.php b/dashboard.php index ef5ae08..58c4951 100644 --- a/dashboard.php +++ b/dashboard.php @@ -6,9 +6,13 @@ if (!isset($_SESSION['user_id'])) { exit; } -$user_login = $_SESSION['user_login']; - +require_once 'php/pdo.php'; +$sql = "SELECT * FROM articles ORDER BY date_creation DESC"; +$stmt = $pdo->prepare($sql); +$stmt->execute(); +$articles = $stmt->fetchAll(PDO::FETCH_ASSOC); ?> + @@ -19,21 +23,46 @@ $user_login = $_SESSION['user_login'];

Tableau de Bord

-

Bienvenue, ! (ID: )

- +

+ Connecté en tant que + | Se déconnecter +


Gestion des articles

-

C'est ici que vous pourrez bientôt gérer vos articles.

+ Ajouter un nouvel article - +
+ +

Vos articles publiés

+ + + + + + + + + + + + + + + + + + + + +
IDTitreDate de créationActions
+ Modifier + | + Supprimer +
diff --git a/index.php b/index.php index dcea76c..ed6fa11 100644 --- a/index.php +++ b/index.php @@ -14,7 +14,7 @@ $stmt->execute();

Mini projet

-

Bienvenue . Voici les derniers articles :

+

Bienvenue voici les derniers articles :


@@ -24,6 +24,10 @@ $stmt->execute();

+ +

+ Publié le : +

prepare($sql); + $stmt->execute([$nouveau_titre, $nouveau_contenu, $id_article]); + + header('Location: dashboard.php'); + exit; + + } else { + $erreur_message = "Veuillez remplir le titre et le contenu."; + } +} + +try { + $sql_select = "SELECT * FROM articles WHERE id = ?"; + $stmt_select = $pdo->prepare($sql_select); + $stmt_select->execute([$id_article]); + $article = $stmt_select->fetch(PDO::FETCH_ASSOC); + + if ($article === false) { + die("Erreur : Cet article n'existe pas."); + } +} catch (PDOException $e) { + die("Erreur : " . $e->getMessage()); +} +?> + + + + + Modifier l'article - Admin + + + +

+

Modifier l'article

+

+ ← Retour au Tableau de Bord + | Se déconnecter +

+
+ +
+ +
+ + +
+

+
+ + +
+
+
+ +
+
+
+
+ +
+
+
+ +
+
+ +
+ + + \ No newline at end of file diff --git a/php/pdo.example.php b/php/pdo.example.php new file mode 100644 index 0000000..14c6022 --- /dev/null +++ b/php/pdo.example.php @@ -0,0 +1,14 @@ +setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); +} catch (PDOException $e) { + print "Erreur de connexion à la BDD : " . $e->getMessage(); + die(); +} +?> \ No newline at end of file diff --git a/supp.php b/supp.php new file mode 100644 index 0000000..d0715ed --- /dev/null +++ b/supp.php @@ -0,0 +1,80 @@ +prepare($sql); + $stmt->execute([$id_article]); + + header('Location: dashboard.php'); + exit; + } +} + +try { + $sql_select = "SELECT titre FROM articles WHERE id = ?"; + $stmt_select = $pdo->prepare($sql_select); + $stmt_select->execute([$id_article]); + $article = $stmt_select->fetch(PDO::FETCH_ASSOC); + + if ($article === false) { + die("Erreur : Cet article n'existe pas."); + } +} catch (PDOException $e) { + die("Erreur : " . $e->getMessage()); +} +?> + + + + + Supprimer l'article - Admin + + + +
+

Confirmer la suppression

+

+ ← Annuler et Retourner au Tableau de Bord +

+
+ +
+ +
+ +

Voulez-vous vraiment supprimer l'article suivant ?

+

+

Cette action est irréversible.

+ +
+ + +
+ +
+ + +
+ + + \ No newline at end of file