📘 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() et bindParam() / 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() et bindValue() 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.