Compare commits

..

13 Commits

Author SHA1 Message Date
5a805e646b 106% 2025-11-03 04:09:46 +01:00
ea5bc8f668 106% 2025-11-03 04:07:58 +01:00
76aedeb57c 105% 2025-11-03 04:05:34 +01:00
f402fc0192 104% 2025-11-03 04:04:36 +01:00
656b7b9945 103% 2025-11-03 03:59:32 +01:00
58f6d730ae 102% 2025-11-03 03:21:13 +01:00
d24bc9d52f 101% 2025-11-01 18:44:35 +01:00
8ce52971a9 100% 2025-11-01 18:24:35 +01:00
62cf15ab8b 70% 2025-10-29 16:54:38 +01:00
7181ead64e article 2025-10-27 20:40:46 +01:00
4fc2516bbc html 2025-10-25 17:21:24 +02:00
b95935da80 Merge branch 'main' of https://gitea.lasallesaintdenis.com/enzo.lopez-toscano/TP-php-SQL 2025-10-25 16:19:17 +02:00
0324f4f9df amelioration 2025-10-25 16:18:01 +02:00
15 changed files with 599 additions and 37 deletions

2
.gitignore vendored
View File

@@ -1,4 +1,4 @@
.pdo.php
php/pdo.php
.DS_Store

View File

@@ -1 +1,60 @@
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.
0. **Serveur**
* Si vous n'avez pas de serveur pour accueillir le projet vous pouvez installer MAMP ici **[mamp.info](https://www.mamp.info)**
* Téléchargez la version gratuite (l'icône de l'éléphant gris, pas MAMP PRO).
2. **Installer MAMP :**
* Ouvrez le fichier `.pkg` que vous avez téléchargé et suivez les instructions.
3. **Démarrer le serveur :**
* Allez dans votre dossier `Applications/MAMP/`.
* Ouvrez l'application **MAMP.app** (l'éléphant gris).
* Cliquez sur le bouton **"Start"**.
4. **Trouver le dossier `htdocs` :**
* Le serveur MAMP ne peut lire que les fichiers qui sont dans son dossier web.
* Ce dossier se trouve ici : `Applications/MAMP/htdocs/`
* C'est dans **ce** dossier `htdocs` que vous devrez mettre le dossier du projet `my_sql_projet`.
5. **Accéder à la Base de Données (phpMyAdmin) :**
* Sur la fenêtre de MAMP, cliquez sur **"WebStart"**.
* Sur la page qui s'ouvre, allez dans **"Tools" -> "phpMyAdmin"**.
6. **Le Mot de Passe MAMP :**
* MAMP utilise par défaut le mot de passe **`"root"`** pour son utilisateur de base de données `"root"`. Vous en aurez besoin à l'étape 3 de l'installation.
## 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é)

45
article.php Normal file
View File

@@ -0,0 +1,45 @@
<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
if ( !isset($_GET['id']) || !ctype_digit($_GET['id']) ) {
die("Erreur 404 : L'article demandé est introuvable.");
}
$id_article = $_GET['id'];
require_once 'php/pdo.php';
$sql = "SELECT * FROM articles WHERE id = ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([$id_article]);
$article = $stmt->fetch(PDO::FETCH_ASSOC);
if ($article === false) {
die("Erreur 404 : L'article demandé est introuvable.");
}
?>
<!DOCTYPE html>
<html lang="fr" dir="ltr">
<head>
<meta charset="UTF-8">
<title><?php print htmlspecialchars($article['titre']); ?></title>
</head>
<body>
<a href="index.php">← Retour à l'accueil</a>
<hr>
<article>
<h1><?php print htmlspecialchars($article['titre']); ?></h1>
<div>
<?php
print nl2br(htmlspecialchars($article['contenu']));
?>
</div>
</article>
</body>
</html>

76
creation_article.php Normal file
View File

@@ -0,0 +1,76 @@
<?php
session_start();
if (!isset($_SESSION['user_id'])) {
header('Location: login.php');
exit;
}
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (!empty($_POST['titre']) && !empty($_POST['contenu'])) {
$titre = $_POST['titre'];
$contenu = $_POST['contenu'];
require_once 'php/pdo.php';
$sql = "INSERT INTO articles (titre, contenu, date_creation) VALUES (?, ?, NOW())";
$stmt = $pdo->prepare($sql);
$stmt->execute([$titre, $contenu]);
header('Location: dashboard.php');
exit;
} else {
$erreur_message = "Veuillez remplir le titre et le contenu.";
}
}
?>
<!DOCTYPE html>
<html lang="fr" dir="ltr">
<head>
<meta charset="UTF-8">
<title>Ajouter un article - Admin</title>
</head>
<body>
<header>
<h1>Ajouter un nouvel article</h1>
<p>
Connecté en tant que <?php print htmlspecialchars($_SESSION['user_login']); ?>
| <a href="dashboard.php">Retour au Tableau de Bord</a>
| <a href="logout.php">Se déconnecter</a>
</p>
</header>
<hr>
<main>
<?php if (isset($erreur_message)) : ?>
<div>
<p><?php print $erreur_message; ?></p>
</div>
<?php endif; ?>
<form action="creation_article.php" method="POST">
<div>
<label for="titre">Titre de l'article :</label><br>
<input type="text" id="titre" name="titre">
</div>
<br>
<div>
<label for="contenu">Contenu :</label><br>
<textarea id="contenu" name="contenu" rows="15" cols="80"></textarea>
</div>
<br>
<div>
<button type="submit">Publier l'article</button>
</div>
</form>
</main>
</body>
</html>

69
dashboard.php Normal file
View File

@@ -0,0 +1,69 @@
<?php
session_start();
if (!isset($_SESSION['user_id'])) {
header('Location: login.php');
exit;
}
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);
?>
<!DOCTYPE html>
<html lang="fr" dir="ltr">
<head>
<meta charset="UTF-8">
<title>Tableau de Bord - Admin</title>
</head>
<body>
<header>
<h1>Tableau de Bord</h1>
<p>
Connecté en tant que <?php print htmlspecialchars($_SESSION['user_login']); ?>
| <a href="logout.php">Se déconnecter</a>
</p>
</header>
<hr>
<main>
<h2>Gestion des articles</h2>
<a href="creation_article.php">Ajouter un nouvel article</a>
<hr>
<h3>Vos articles publiés</h3>
<table border="1">
<thead>
<tr>
<th>ID</th>
<th>Titre</th>
<th>Date de création</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
<?php foreach ($articles as $article) : ?>
<tr>
<td><?php echo $article['id']; ?></td>
<td><?php echo htmlspecialchars($article['titre']); ?></td>
<td><?php echo $article['date_creation']; ?></td>
<td>
<a href="modif.php?id=<?php echo $article['id']; ?>">Modifier</a>
|
<a href="supp.php?id=<?php echo $article['id']; ?>">Supprimer</a>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</main>
</body>
</html>

47
index.php Normal file
View File

@@ -0,0 +1,47 @@
<?php
require_once 'php/pdo.php';
$sql = "SELECT * FROM articles ORDER BY date_creation DESC";
$stmt = $pdo->prepare($sql);
$stmt->execute();
?>
<!DOCTYPE html>
<html lang="fr" dir="ltr">
<head>
<meta charset="UTF-8"> <title>Mon Blog</title>
</head>
<body>
<h1>Mini projet</h1>
<p>Bienvenue voici les derniers articles :</p>
<hr>
<?php
while ($article = $stmt->fetch(PDO::FETCH_ASSOC)) :
?>
<article>
<h2><?php print htmlspecialchars($article['titre']); ?></h2>
<p>
<em>Publié le : <?php print $article['date_creation']; ?></em>
</p>
<p>
<?php
print htmlspecialchars(substr($article['contenu'], 0, 200));
?>...
</p>
<a href="article.php?id=<?php print $article['id']; ?>">Lire la suite</a>
</article>
<hr>
<?php
endwhile;
?>
</body>
</html>

71
login.php Normal file
View File

@@ -0,0 +1,71 @@
<?php
session_start();
if (isset($_SESSION['user_id'])) {
header('Location: dashboard.php');
exit;
}
require_once 'php/pdo.php';
$erreur_message = "";
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (empty($_POST['login']) || empty($_POST['password'])) {
$erreur_message = "Veuillez remplir le login et le mot de passe.";
} else {
$login_saisi = $_POST['login'];
$password_saisi = $_POST['password'];
$sql = "SELECT * FROM utilisateur WHERE login = ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([$login_saisi]);
$utilisateur = $stmt->fetch(PDO::FETCH_ASSOC);
if ($utilisateur && password_verify($password_saisi, $utilisateur['password'])) {
$_SESSION['user_id'] = $utilisateur['id'];
$_SESSION['user_login'] = $utilisateur['login'];
header('Location: dashboard.php');
exit;
} else {
$erreur_message = "Login ou mot de passe incorrect.";
}
}
}
?>
<!DOCTYPE html>
<html lang="fr" dir="ltr">
<head>
<meta charset="UTF-8">
<title>Connexion - Admin</title>
</head>
<body>
<h1>Zone Admin</h1>
<?php
if (!empty($erreur_message)) :
?>
<?php print $erreur_message; ?>
<?php endif; ?>
<form action="login.php" method="POST">
<div>
<label for="login">Login :</label>
<input type="text" id="login" name="login">
</div>
<div>
<label for="password">Mot de passe :</label>
<input type="password" id="password" name="password">
</div>
<div>
<button type="submit">Se connecter</button>
</div>
</form>
</body>
</html>

8
logout.php Normal file
View File

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

94
modif.php Normal file
View File

@@ -0,0 +1,94 @@
<?php
session_start();
if (!isset($_SESSION['user_id'])) {
header('Location: login.php');
exit;
}
require_once 'php/pdo.php';
if ( !isset($_GET['id']) || !ctype_digit($_GET['id']) ) {
die("Erreur : ID invalide.");
}
$id_article = $_GET['id'];
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (!empty($_POST['titre']) && !empty($_POST['contenu'])) {
$nouveau_titre = $_POST['titre'];
$nouveau_contenu = $_POST['contenu'];
$sql = "UPDATE articles SET titre = ?, contenu = ? WHERE id = ?";
$stmt = $pdo->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());
}
?>
<!DOCTYPE html>
<html lang="fr" dir="ltr">
<head>
<meta charset="UTF-8">
<title>Modifier l'article - Admin</title>
</head>
<body>
<header>
<h1>Modifier l'article</h1>
<p>
<a href="dashboard.php">← Retour au Tableau de Bord</a>
| <a href="logout.php">Se déconnecter</a>
</p>
</header>
<hr>
<main>
<?php if (isset($erreur_message)) : ?>
<div>
<p><?php print $erreur_message; ?></p>
</div>
<?php endif; ?>
<form action="modif.php?id=<?php print $article['id']; ?>" method="POST">
<div>
<label for="titre">Titre de l'article :</label><br>
<input type="text" id="titre" name="titre"
value="<?php print htmlspecialchars($article['titre']); ?>">
</div>
<br>
<div>
<label for="contenu">Contenu :</label><br>
<textarea id="contenu" name="contenu" rows="15" cols="80"><?php print htmlspecialchars($article['contenu']); ?></textarea>
</div>
<br>
<div>
<button type="submit">Mettre à jour l'article</button>
</div>
</form>
</main>
</body>
</html>

View File

@@ -1,26 +0,0 @@
<?php
$serveur = "localhost";
$dbname = "my_sql_projet";
$user = "root";
$pass = "";
$login = "test";
$password_clair = "Ciel2025$";
$password_hash = password_hash($password_clair, PASSWORD_DEFAULT);
try {
$pdo = new PDO("mysql:host=$serveur;dbname=$dbname", $user, $pass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "INSERT INTO utilisateur (login, password) VALUES (?, ?)";
$stmt = $pdo->prepare($sql);
$stmt->execute([$login, $password_hash]);
print "Utilisateur '$login' créé avec succès !";
} catch (PDOException $e) {
print "Erreur d'insertion : " . $e->getMessage();
}
?>

24
php/pass_hash.php Normal file
View File

@@ -0,0 +1,24 @@
<?php
require_once 'pdo.php';
$login = "utilisateur";
$password_clair = "Ciel2025$";
$password_hash = password_hash($password_clair, PASSWORD_DEFAULT);
try {
$sql = "INSERT INTO utilisateur (login, password) VALUES (?, ?)";
$stmt = $pdo->prepare($sql);
$stmt->execute([$login, $password_hash]);
print "$login créé avec succès !";
} catch (PDOException $e) {
if ($e->errorInfo[1] == 1062) {
print "Nom dutilisateur déjà utilisé. Merci de changer.";
} else {
print "Erreur d'insertion : " . $e->getMessage();
}
}

View File

@@ -1,16 +1,10 @@
<?php
$serveur = "localhost";
$dbname = "my_sql_projet";
$user = "root";
$pass = "";
require_once 'pdo.php';
$login_saisi = "test";
$password_saisi = "Ciel2025$";
try {
$pdo = new PDO("mysql:host=$serveur;dbname=$dbname", $user, $pass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "SELECT * FROM utilisateur WHERE login = ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([$login_saisi]);
@@ -19,7 +13,11 @@ try {
if ($utilisateur && password_verify($password_saisi, $utilisateur['password'])) {
print "Connexion réussie ! Bienvenue, " . $utilisateur['login'];
session_start();
$_SESSION['user_id'] = $utilisateur['id'];
$_SESSION['user_login'] = $utilisateur['login'];
print "Bienvenue, " . htmlspecialchars($utilisateur['login']);
} else {
print "Login ou mot de passe incorrect.";

14
php/pdo.example.php Normal file
View File

@@ -0,0 +1,14 @@
<?php
$serveur = "localhost";
$dbname = "my_sql_projet";
$user = "root";
$pass = "vous devez mettre votre mdp ici";
try {
$pdo = new PDO("mysql:host=$serveur;dbname=$dbname", $user, $pass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
print "Erreur de connexion à la BDD : " . $e->getMessage();
die();
}
?>

View File

@@ -10,3 +10,6 @@ CREATE TABLE utilisateur (
login VARCHAR(50) UNIQUE,
password VARCHAR(255)
);
INSERT INTO utilisateur (login, password)
VALUES ('admin', '$2y$10$6x.tcoBWiyaFYlS6zB4E3OQppSP6agShnCA4eX0OPYD.7acI7/4wu');

80
supp.php Normal file
View File

@@ -0,0 +1,80 @@
<?php
session_start();
if (!isset($_SESSION['user_id'])) {
header('Location: login.php');
exit;
}
require_once 'php/pdo.php';
if ( !isset($_GET['id']) || !ctype_digit($_GET['id']) ) {
die("Erreur : ID invalide.");
}
$id_article = $_GET['id'];
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (isset($_POST['id']) && $_POST['id'] == $id_article) {
$sql = "DELETE FROM articles WHERE id = ?";
$stmt = $pdo->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());
}
?>
<!DOCTYPE html>
<html lang="fr" dir="ltr">
<head>
<meta charset="UTF-8">
<title>Supprimer l'article - Admin</title>
</head>
<body>
<header>
<h1>Confirmer la suppression</h1>
<p>
<a href="dashboard.php">← Annuler et Retourner au Tableau de Bord</a>
</p>
</header>
<hr>
<main>
<p>Voulez-vous vraiment supprimer l'article suivant ?</p>
<h2><?php print htmlspecialchars($article['titre']); ?></h2>
<p>Cette action est irréversible.</p>
<form action="supp.php?id=<?php print $id_article; ?>" method="POST">
<input type="hidden" name="id" value="<?php print $id_article; ?>">
<button type="submit">
OUI
</button>
</form>
<br>
<button type="submit">
<a href="dashboard.php">NON</a>
</button>
</main>
</body>
</html>