📘 Chapitre 5 – Requêtes préparées et paramètres liés
1. 🎯 Objectif pédagogique
Être capable d’utiliser des requêtes préparées avec paramètres liés pour sécuriser les opérations SQL (CRUD) et éviter les injections SQL.
2. 📚 Concepts abordés
- Avantages des requêtes préparées (sécurité et performance)
- Méthodes
prepare()
etbindParam()
/bindValue()
- Paramètres nommés (
:nom
) et paramètres anonymes (?
) - Exécution multiple d’une requête préparée
- Bonnes pratiques contre les failles d’injection SQL
3. 🧠 Explication théorique
Une requête préparée sépare la structure de la requête des données fournies par l’utilisateur. Exemple :
$stmt = $pdo->prepare("SELECT * FROM Utilisateur WHERE email = :email");
$stmt->execute(['email' => 'alice@test.com']);
Avantages :
- Empêche les injections SQL.
- Améliore la performance lorsque la même requête est exécutée plusieurs fois.
Différence bindParam vs bindValue :
bindParam()
lie une variable par référence (valeur modifiable avant exécution).bindValue()
lie directement une valeur.
4. 🛠 Tutoriel pratique
Résumé du travail : Sécuriser l’insertion et la recherche d’un utilisateur avec des requêtes préparées.
Arborescence projet :
projet_bdd/
├── connexion.php
└── utilisateur_secure.php
Étape 1 : Requête préparée avec paramètres nommés
<?php
require 'connexion.php';
$stmt = $pdo->prepare("INSERT INTO Utilisateur (nom, email) VALUES (:nom, :email)");
$stmt->execute([
'nom' => 'Alice',
'email' => 'alice@test.com'
]);
echo "Utilisateur ajouté.";
Étape 2 : Requête préparée avec bindParam
$nom = 'Bob';
$email = 'bob@test.com';
$stmt = $pdo->prepare("INSERT INTO Utilisateur (nom, email) VALUES (:nom, :email)");
$stmt->bindParam(':nom', $nom);
$stmt->bindParam(':email', $email);
$stmt->execute();
Étape 3 : Requête SELECT sécurisée
$stmt = $pdo->prepare("SELECT * FROM Utilisateur WHERE email = :email");
$stmt->execute(['email' => 'alice@test.com']);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
echo "Nom : " . $user['nom'];
Étape 4 : Paramètres anonymes
$stmt = $pdo->prepare("SELECT * FROM Utilisateur WHERE id = ?");
$stmt->execute([1]);
5. 🧾 Résumé et points-clés
- prepare() + execute() sépare la logique SQL des données.
- Les paramètres liés empêchent l’exécution de code SQL injecté.
bindParam()
etbindValue()
offrent un contrôle fin sur la liaison des données.- Les requêtes préparées sont indispensables pour sécuriser une application PHP/MySQL.