<?php
$db = getDB();
// Récupérer tous les projets
$stmt = $db->query("SELECT * FROM projets ORDER BY created_at DESC");
$projets = $stmt->fetchAll();
// Récupérer un projet par ID (requête préparée)
$id = 3;
$stmt = $db->prepare("SELECT * FROM projets WHERE id = :id");
$stmt->execute([":id" => $id]);
$projet = $stmt->fetch();
?>
<!-- Afficher dans le HTML -->
<?php foreach ($projets as $p) : ?>
<div class="carte">
<h3><?= htmlspecialchars($p["titre"]) ?></h3>
<p><?= htmlspecialchars($p["description"]) ?></p>
</div>
<?php endforeach; ?>
Les requêtes préparées (avec :parametre) protègent contre les injections SQL. Toujours les utiliser avec des données utilisateur.
Ne jamais faire confiance aux données utilisateur. Valide et nettoie toujours côté serveur.
Requêtes préparées obligatoires dès qu'une variable utilisateur entre dans une requête SQL.
htmlspecialchars() pour tout ce qu'on affiche dans le HTML.
Ne jamais afficher les erreurs en production. En dev : error_reporting(E_ALL);. En prod : logs seulement.
Mots de passe : jamais en clair. Utiliser password_hash() et password_verify().
HTTPS : toujours en production. Sur Plesk, c'est gratuit avec Let's Encrypt.
P
Projet
Projet — Formulaire de contact avec BDD
Ce que tu vas construire
Un formulaire de contact complet : l'utilisateur remplit le formulaire, les données sont sauvegardées en base, et tu peux les voir dans une page d'administration.
Tables à créer
CREATE TABLE contacts (
id INT AUTO_INCREMENT PRIMARY KEY,
nom VARCHAR(100) NOT NULL,
email VARCHAR(200) NOT NULL,
message TEXT NOT NULL,
lu TINYINT(1) DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Pages à créer
contact.php — formulaire avec validation PHP
admin-messages.php — liste des messages reçus (protégée par mot de passe)
Ce qu'on évalue
Requêtes préparées utilisées
Validation serveur complète
htmlspecialchars() partout
Affichage propre des messages côté admin
Tu as terminé les leçons de cette séquence ?
Quiz — Séquence 7
Vérifie ta compréhension avant de passer à la suite. Réponds à toutes les questions, puis valide.