Requêtes préparées avec PDO
Objectifs pédagogiques
- Comprendre l'intérêt des requêtes préparées.
- Prévenir les injections SQL avec
prepare()etbindParam()/bindValue(). - Exécuter une requête sécurisée.
Pourquoi utiliser des requêtes préparées ?
Les requêtes préparées permettent :
- de séparer la logique SQL des données dynamiques ;
- de prévenir les injections SQL ;
- de réutiliser une requête avec différents paramètres.
Exemple de base
php
<?php
$pdo = new PDO('mysql:host=localhost;dbname=todo', 'root', '');
// Requête avec un paramètre nommé
$stmt = $pdo->prepare('SELECT * FROM tasks WHERE category = :category');
$stmt->bindParam(':category', $category);
$category = 'travail';
$stmt->execute();
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);bindParam vs bindValue
bindParam()lie une variable (la valeur est évaluée à l'exécution).bindValue()lie une valeur immédiate.
php
$stmt->bindValue(':category', 'travail'); // immuableInsertion sécurisée
php
<?php
$pdo = new PDO('mysql:host=localhost;dbname=todo', 'root', '');
$stmt = $pdo->prepare('INSERT INTO tasks (label, category) VALUES (:label, :category)');
$stmt->bindParam(':label', $label);
$stmt->bindParam(':category', $category);
$label = 'Envoyer un mail';
$category = 'perso';
$stmt->execute();Requête avec paramètres anonymes
php
$stmt = $pdo->prepare('SELECT * FROM tasks WHERE id = ?');
$stmt->execute([1]);Résumé
| Méthode | Description |
|---|---|
prepare() | Prépare une requête SQL avec des marqueurs |
bindParam() | Lie une variable à un paramètre |
bindValue() | Lie une valeur immédiate à un paramètre |
execute() | Exécute la requête |
Bonnes pratiques
- Toujours utiliser des requêtes préparées pour les entrées utilisateurs.
- Ne jamais concaténer directement des variables dans une requête SQL.
- Préférer
bindValue()sauf si la valeur change entre la préparation et l'exécution.