Skip to content

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() et bindParam() / 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'); // immuable

Insertion 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éthodeDescription
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.